@pisell/pisellos 0.0.569 → 0.10.2
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/core/index.js +10 -6
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -3
- package/dist/model/strategy/adapter/promotion/index.js +9 -0
- package/dist/model/strategy/adapter/walletPass/evaluator.js +7 -5
- package/dist/model/strategy/adapter/walletPass/example.js +26 -3
- package/dist/model/strategy/adapter/walletPass/index.js +5 -5
- package/dist/model/strategy/adapter/walletPass/type.d.ts +0 -3
- package/dist/model/strategy/adapter/walletPass/utils.d.ts +0 -26
- package/dist/model/strategy/adapter/walletPass/utils.js +17 -92
- package/dist/model/strategy/strategy-example.js +19 -5
- package/dist/modules/BaseModule.d.ts +1 -1
- package/dist/modules/BaseModule.js +8 -10
- package/dist/modules/Cart/index.js +3 -0
- package/dist/modules/Cart/utils/cartProduct.js +1 -0
- package/dist/modules/Cart/utils/cartResource.js +0 -2
- package/dist/modules/Cart/utils/changePrice.js +9 -16
- package/dist/modules/Date/index.js +5 -1
- package/dist/modules/Discount/index.d.ts +0 -1
- package/dist/modules/Discount/index.js +7 -22
- package/dist/modules/Discount/types.d.ts +0 -1
- package/dist/modules/OpenData/index.js +2 -0
- package/dist/modules/Order/index.js +70 -40
- package/dist/modules/Payment/index.js +162 -97
- package/dist/modules/Payment/types.d.ts +4 -8
- package/dist/modules/Payment/walletpass.d.ts +0 -2
- package/dist/modules/Payment/walletpass.js +5 -4
- package/dist/modules/ProductList/index.d.ts +1 -1
- package/dist/modules/ProductList/index.js +3 -12
- package/dist/modules/ProductList/types.d.ts +0 -1
- package/dist/modules/Rules/index.js +126 -427
- package/dist/modules/SalesSummary/utils.js +1 -2
- package/dist/modules/Schedule/getDateIsInSchedule.js +0 -5
- package/dist/modules/Schedule/index.js +1 -0
- package/dist/modules/Schedule/utils.js +1 -0
- package/dist/modules/Step/index.js +1 -0
- package/dist/modules/Summary/utils.js +22 -43
- package/dist/plugins/request.js +4 -1
- package/dist/plugins/window.js +6 -2
- package/dist/server/index.js +129 -97
- package/dist/server/modules/menu/index.js +41 -32
- package/dist/server/modules/order/index.js +4 -2
- package/dist/server/modules/products/index.js +42 -24
- package/dist/server/modules/quotation/index.js +38 -29
- package/dist/server/modules/resource/index.js +4 -3
- package/dist/server/modules/schedule/index.js +35 -27
- package/dist/server/utils/product.js +1 -0
- package/dist/solution/BaseSales/index.js +41 -38
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingByStep/index.js +60 -11
- package/dist/solution/BookingByStep/utils/capacity.js +11 -1
- package/dist/solution/BookingByStep/utils/resources.js +3 -1
- package/dist/solution/BookingByStep/utils/timeslots.js +43 -2
- package/dist/solution/BookingTicket/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.js +2 -0
- package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +7 -6
- package/dist/solution/BookingTicket/utils/scan/handleScan.js +31 -25
- package/dist/solution/BookingTicket/utils/scan/index.js +10 -6
- package/dist/solution/BuyTickets/index.js +12 -9
- package/dist/solution/Checkout/index.js +252 -177
- package/dist/solution/Checkout/utils/index.js +16 -4
- package/dist/solution/RegisterAndLogin/index.js +76 -30
- package/dist/solution/ScanOrder/index.js +60 -50
- package/dist/solution/ShopDiscount/index.js +14 -15
- package/dist/solution/ShopDiscount/types.d.ts +4 -5
- package/dist/solution/ShopDiscount/utils.d.ts +0 -9
- package/dist/solution/ShopDiscount/utils.js +0 -9
- package/dist/solution/VenueBooking/index.d.ts +3 -31
- package/dist/solution/VenueBooking/index.js +496 -651
- package/dist/solution/VenueBooking/types.d.ts +1 -3
- package/dist/solution/VenueBooking/types.js +0 -1
- package/dist/solution/VenueBooking/utils/dateSummary.d.ts +2 -2
- package/dist/solution/VenueBooking/utils/dateSummary.js +25 -12
- package/dist/solution/VenueBooking/utils/timeSlot.d.ts +0 -2
- package/dist/solution/VenueBooking/utils/timeSlot.js +4 -9
- package/dist/types/index.d.ts +1 -1
- package/dist/utils/task.js +18 -15
- package/dist/utils/watch.js +1 -0
- package/lib/apis/picoding.js +0 -2
- package/lib/core/index.js +132 -130
- package/lib/effects/index.js +57 -46
- package/lib/index.d.ts +0 -1
- package/lib/index.js +50 -92
- package/lib/model/index.js +21 -14
- package/lib/model/strategy/adapter/dataVariant/adapter.js +50 -38
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +236 -162
- package/lib/model/strategy/adapter/dataVariant/examples.js +237 -229
- package/lib/model/strategy/adapter/dataVariant/index.js +34 -39
- package/lib/model/strategy/adapter/dataVariant/type.js +28 -57
- package/lib/model/strategy/adapter/index.js +64 -100
- package/lib/model/strategy/adapter/itemRule/adapter.js +144 -156
- package/lib/model/strategy/adapter/itemRule/evaluator.js +48 -36
- package/lib/model/strategy/adapter/itemRule/examples.js +225 -295
- package/lib/model/strategy/adapter/itemRule/index.js +57 -83
- package/lib/model/strategy/adapter/itemRule/type.js +36 -97
- package/lib/model/strategy/adapter/promotion/adapter.js +63 -84
- package/lib/model/strategy/adapter/promotion/evaluator.js +231 -381
- package/lib/model/strategy/adapter/promotion/examples.js +159 -139
- package/lib/model/strategy/adapter/promotion/index.js +49 -1
- package/lib/model/strategy/adapter/promotion/type.js +35 -199
- package/lib/model/strategy/adapter/type.js +16 -4
- package/lib/model/strategy/adapter/walletPass/evaluator.js +152 -180
- package/lib/model/strategy/adapter/walletPass/example.js +190 -217
- package/lib/model/strategy/adapter/walletPass/index.js +51 -75
- package/lib/model/strategy/adapter/walletPass/locales.js +58 -36
- package/lib/model/strategy/adapter/walletPass/type.d.ts +0 -3
- package/lib/model/strategy/adapter/walletPass/type.js +16 -4
- package/lib/model/strategy/adapter/walletPass/utils.d.ts +0 -26
- package/lib/model/strategy/adapter/walletPass/utils.js +383 -678
- package/lib/model/strategy/engine.js +168 -270
- package/lib/model/strategy/index.js +34 -49
- package/lib/model/strategy/strategy-example.js +239 -243
- package/lib/model/strategy/type.js +40 -100
- package/lib/modules/Account/index.js +53 -39
- package/lib/modules/Account/types.js +33 -20
- package/lib/modules/AccountList/index.js +154 -116
- package/lib/modules/AccountList/types.js +31 -30
- package/lib/modules/AccountList/utils.js +30 -18
- package/lib/modules/BaseModule.d.ts +1 -1
- package/lib/modules/BaseModule.js +46 -25
- package/lib/modules/BookingContext/index.js +136 -158
- package/lib/modules/BookingContext/types.js +32 -46
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +143 -131
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +82 -75
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +150 -170
- package/lib/modules/BookingContext/utils/flexible.js +55 -38
- package/lib/modules/BookingContext/utils/formatResourceList.js +34 -19
- package/lib/modules/BookingContext/utils/index.js +41 -124
- package/lib/modules/BookingContext/utils/noResource.js +70 -58
- package/lib/modules/BookingContext/utils/orderLineDisplay.js +41 -14
- package/lib/modules/BookingContext/utils/productExtend.js +155 -202
- package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
- package/lib/modules/BookingContext/utils/resourceSelection.js +41 -19
- package/lib/modules/BookingContext/utils/resources.js +167 -209
- package/lib/modules/BookingContext/utils/serviceTimes.js +116 -115
- package/lib/modules/BookingContext/utils/timeSlices.js +80 -70
- package/lib/modules/Cart/index.js +124 -170
- package/lib/modules/Cart/types.js +51 -46
- package/lib/modules/Cart/utils/cartAccount.js +39 -40
- package/lib/modules/Cart/utils/cartDate.js +61 -56
- package/lib/modules/Cart/utils/cartDiscount.js +33 -28
- package/lib/modules/Cart/utils/cartNote.js +32 -27
- package/lib/modules/Cart/utils/cartProduct.js +251 -321
- package/lib/modules/Cart/utils/cartRelationForms.js +35 -29
- package/lib/modules/Cart/utils/cartResource.js +78 -72
- package/lib/modules/Cart/utils/changePrice.js +50 -28
- package/lib/modules/Cart/utils/index.js +48 -106
- package/lib/modules/Customer/constants.js +34 -13
- package/lib/modules/Customer/index.js +169 -232
- package/lib/modules/Customer/types.js +35 -38
- package/lib/modules/Date/index.js +115 -116
- package/lib/modules/Date/types.js +28 -16
- package/lib/modules/Date/utils.js +123 -174
- package/lib/modules/Discount/index.d.ts +0 -1
- package/lib/modules/Discount/index.js +128 -130
- package/lib/modules/Discount/types.d.ts +0 -1
- package/lib/modules/Discount/types.js +31 -9
- package/lib/modules/Guests/index.js +56 -30
- package/lib/modules/Guests/types.js +33 -23
- package/lib/modules/Holder/index.js +189 -209
- package/lib/modules/Holder/types.js +16 -4
- package/lib/modules/Holder/utils.js +49 -20
- package/lib/modules/OpenData/index.js +76 -69
- package/lib/modules/OpenData/types.js +16 -4
- package/lib/modules/OpenData/utils.js +78 -44
- package/lib/modules/Order/index.js +1909 -1572
- package/lib/modules/Order/types.js +35 -78
- package/lib/modules/Order/utils/bundleDiscountHydration.js +74 -41
- package/lib/modules/Order/utils/manualProductDiscount.js +123 -124
- package/lib/modules/Order/utils/orderCollectionIdentity.js +210 -148
- package/lib/modules/Order/utils.js +634 -799
- package/lib/modules/Payment/cash.js +33 -20
- package/lib/modules/Payment/cashRecommendationAlgorithm.js +76 -145
- package/lib/modules/Payment/eftpos.js +30 -16
- package/lib/modules/Payment/index.js +378 -518
- package/lib/modules/Payment/mx51.js +0 -1
- package/lib/modules/Payment/types.d.ts +4 -8
- package/lib/modules/Payment/types.js +107 -216
- package/lib/modules/Payment/utils.js +48 -51
- package/lib/modules/Payment/walletpass.d.ts +0 -2
- package/lib/modules/Payment/walletpass.js +211 -226
- package/lib/modules/Product/index.js +46 -51
- package/lib/modules/Product/types.js +16 -4
- package/lib/modules/Product/utils.js +33 -32
- package/lib/modules/ProductList/index.d.ts +1 -1
- package/lib/modules/ProductList/index.js +117 -117
- package/lib/modules/ProductList/types.d.ts +0 -1
- package/lib/modules/ProductList/types.js +31 -9
- package/lib/modules/Quotation/index.js +100 -66
- package/lib/modules/Quotation/types.js +16 -4
- package/lib/modules/Resource/index.js +59 -27
- package/lib/modules/Resource/types.js +32 -22
- package/lib/modules/Resource/utils.js +38 -30
- package/lib/modules/ResourcePlanner/index.js +61 -60
- package/lib/modules/ResourcePlanner/planner.js +384 -346
- package/lib/modules/ResourcePlanner/types.js +16 -4
- package/lib/modules/Rules/index.js +903 -1475
- package/lib/modules/Rules/types.js +40 -17
- package/lib/modules/SalesSummary/index.js +90 -85
- package/lib/modules/SalesSummary/types.js +16 -4
- package/lib/modules/SalesSummary/utils.js +427 -351
- package/lib/modules/ScanOrderLogger/index.js +79 -59
- package/lib/modules/ScanOrderLogger/providers/feishu.js +78 -54
- package/lib/modules/ScanOrderLogger/providers/grafana.js +36 -13
- package/lib/modules/ScanOrderLogger/types.js +16 -4
- package/lib/modules/Schedule/getDateIsInSchedule.js +163 -339
- package/lib/modules/Schedule/index.js +114 -100
- package/lib/modules/Schedule/type.js +16 -4
- package/lib/modules/Schedule/types.js +16 -4
- package/lib/modules/Schedule/utils.js +291 -433
- package/lib/modules/Step/index.js +52 -40
- package/lib/modules/Step/tyeps.js +16 -4
- package/lib/modules/Summary/index.js +71 -66
- package/lib/modules/Summary/types.js +16 -4
- package/lib/modules/Summary/utils.js +418 -791
- package/lib/modules/SurchargeList/index.js +60 -46
- package/lib/modules/SurchargeList/types.js +16 -4
- package/lib/modules/index.js +63 -245
- package/lib/plugins/app.js +16 -4
- package/lib/plugins/index.js +25 -36
- package/lib/plugins/request.js +126 -137
- package/lib/plugins/shopStore.js +16 -4
- package/lib/plugins/user.js +16 -4
- package/lib/plugins/window.js +179 -171
- package/lib/server/index.js +2337 -2675
- package/lib/server/modules/floor-plan/index.js +123 -102
- package/lib/server/modules/floor-plan/types.js +30 -15
- package/lib/server/modules/index.js +68 -106
- package/lib/server/modules/menu/index.js +122 -146
- package/lib/server/modules/menu/types.js +31 -18
- package/lib/server/modules/order/index.js +642 -567
- package/lib/server/modules/order/types.js +32 -117
- package/lib/server/modules/order/utils/filterBookings.js +194 -219
- package/lib/server/modules/order/utils/filterOrders.js +92 -118
- package/lib/server/modules/payment/index.js +83 -59
- package/lib/server/modules/payment/types.js +16 -4
- package/lib/server/modules/products/index.js +459 -575
- package/lib/server/modules/products/types.js +34 -44
- package/lib/server/modules/quotation/index.js +172 -137
- package/lib/server/modules/quotation/types.js +31 -21
- package/lib/server/modules/resource/index.js +184 -213
- package/lib/server/modules/resource/types.js +33 -42
- package/lib/server/modules/schedule/index.js +123 -135
- package/lib/server/modules/schedule/types.js +21 -14
- package/lib/server/modules/schedule/utils.js +163 -334
- package/lib/server/types.js +16 -4
- package/lib/server/utils/index.js +23 -25
- package/lib/server/utils/product.js +139 -196
- package/lib/server/utils/schedule.js +41 -34
- package/lib/server/utils/small-ticket.js +456 -478
- package/lib/server/utils/time.js +49 -40
- package/lib/solution/BaseSales/index.js +1016 -850
- package/lib/solution/BaseSales/types.js +37 -41
- package/lib/solution/BaseSales/utils/cartPromotion.js +460 -611
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +105 -85
- package/lib/solution/BaseSales/utils/quotationPrice.js +114 -56
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +143 -102
- package/lib/solution/BaseSales/utils.js +140 -155
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingByStep/index.js +1340 -1530
- package/lib/solution/BookingByStep/types.js +99 -40
- package/lib/solution/BookingByStep/utils/capacity.js +160 -192
- package/lib/solution/BookingByStep/utils/products.js +52 -42
- package/lib/solution/BookingByStep/utils/resources.js +330 -527
- package/lib/solution/BookingByStep/utils/stock.js +44 -65
- package/lib/solution/BookingByStep/utils/timeslots.js +131 -129
- package/lib/solution/BookingTicket/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.js +459 -543
- package/lib/solution/BookingTicket/types.js +77 -99
- package/lib/solution/BookingTicket/utils/addProductDecision.js +184 -219
- package/lib/solution/BookingTicket/utils/addTimeAvailability.js +89 -58
- package/lib/solution/BookingTicket/utils/bookingStatus.js +78 -107
- package/lib/solution/BookingTicket/utils/cartView.js +94 -110
- package/lib/solution/BookingTicket/utils/exampleData.js +0 -185
- package/lib/solution/BookingTicket/utils/orderCustomer.js +41 -18
- package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +86 -219
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +93 -144
- package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +91 -79
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +41 -54
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +81 -84
- package/lib/solution/BookingTicket/utils/scan/index.js +104 -98
- package/lib/solution/BookingTicket/utils/scan/scanCache.js +43 -90
- package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +64 -52
- package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +58 -56
- package/lib/solution/BuyTickets/index.js +70 -67
- package/lib/solution/BuyTickets/types.js +38 -22
- package/lib/solution/Checkout/index.js +1158 -1451
- package/lib/solution/Checkout/types.js +61 -91
- package/lib/solution/Checkout/utils/index.js +156 -228
- package/lib/solution/PlaceOrder/index.js +0 -55
- package/lib/solution/RegisterAndLogin/config.js +460 -493
- package/lib/solution/RegisterAndLogin/index.js +630 -633
- package/lib/solution/RegisterAndLogin/types.js +76 -189
- package/lib/solution/RegisterAndLogin/utils.js +125 -183
- package/lib/solution/Sales/index.js +320 -317
- package/lib/solution/Sales/types.js +33 -27
- package/lib/solution/ScanOrder/index.js +862 -831
- package/lib/solution/ScanOrder/types.js +34 -33
- package/lib/solution/ScanOrder/utils.js +371 -406
- package/lib/solution/ShopDiscount/index.js +233 -235
- package/lib/solution/ShopDiscount/types.d.ts +4 -5
- package/lib/solution/ShopDiscount/types.js +37 -15
- package/lib/solution/ShopDiscount/utils.d.ts +0 -9
- package/lib/solution/ShopDiscount/utils.js +172 -309
- package/lib/solution/UnifiedBookingSales/index.js +405 -379
- package/lib/solution/UnifiedBookingSales/types.js +31 -12
- package/lib/solution/VenueBooking/index.d.ts +3 -31
- package/lib/solution/VenueBooking/index.js +916 -967
- package/lib/solution/VenueBooking/types.d.ts +1 -3
- package/lib/solution/VenueBooking/types.js +39 -20
- package/lib/solution/VenueBooking/utils/dateSummary.d.ts +2 -2
- package/lib/solution/VenueBooking/utils/dateSummary.js +62 -25
- package/lib/solution/VenueBooking/utils/resource.js +54 -31
- package/lib/solution/VenueBooking/utils/slotMerge.js +107 -94
- package/lib/solution/VenueBooking/utils/timeSlot.d.ts +0 -2
- package/lib/solution/VenueBooking/utils/timeSlot.js +133 -138
- package/lib/solution/VenueBooking/utils.js +67 -130
- package/lib/solution/index.js +41 -124
- package/lib/store/createStore.js +29 -32
- package/lib/types/index.d.ts +1 -1
- package/lib/types/index.js +16 -4
- package/lib/utils/task.js +36 -36
- package/lib/utils/watch.js +47 -81
- package/package.json +2 -4
- package/dist/solution/VenueBooking/utils/smartPricing.d.ts +0 -70
- package/dist/solution/VenueBooking/utils/smartPricing.js +0 -233
- package/lib/solution/VenueBooking/utils/smartPricing.d.ts +0 -70
- package/lib/solution/VenueBooking/utils/smartPricing.js +0 -192
|
@@ -1,21 +1,36 @@
|
|
|
1
|
-
|
|
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);
|
|
2
18
|
|
|
3
|
-
|
|
4
|
-
|
|
19
|
+
// src/modules/Payment/cash.ts
|
|
20
|
+
var cash_exports = {};
|
|
21
|
+
__export(cash_exports, {
|
|
22
|
+
CashPaymentImpl: () => CashPaymentImpl
|
|
5
23
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
* 现金支付实现
|
|
10
|
-
*/
|
|
11
|
-
class CashPaymentImpl {
|
|
24
|
+
module.exports = __toCommonJS(cash_exports);
|
|
25
|
+
var import_cashRecommendationAlgorithm = require("./cashRecommendationAlgorithm");
|
|
26
|
+
var CashPaymentImpl = class {
|
|
12
27
|
constructor(paymentModule) {
|
|
13
28
|
this.paymentModule = paymentModule;
|
|
14
29
|
}
|
|
15
30
|
async processCashPayment(amount, orderUuid) {
|
|
16
31
|
const cashMethod = await this.paymentModule.getCashPaymentMethod();
|
|
17
32
|
if (!cashMethod) {
|
|
18
|
-
throw new Error(
|
|
33
|
+
throw new Error("现金支付方式未找到");
|
|
19
34
|
}
|
|
20
35
|
const paymentItem = {
|
|
21
36
|
amount: amount.toString(),
|
|
@@ -23,15 +38,13 @@ class CashPaymentImpl {
|
|
|
23
38
|
custom_payment_id: cashMethod.id,
|
|
24
39
|
name: cashMethod.name,
|
|
25
40
|
type: cashMethod.type,
|
|
26
|
-
voucher_id:
|
|
41
|
+
voucher_id: ""
|
|
27
42
|
};
|
|
28
43
|
await this.paymentModule.addPaymentItemAsync(orderUuid, paymentItem);
|
|
29
44
|
}
|
|
30
45
|
async getCashBalance() {
|
|
31
|
-
// 现金余额逻辑可以根据实际业务需求实现
|
|
32
46
|
return 0;
|
|
33
47
|
}
|
|
34
|
-
|
|
35
48
|
/**
|
|
36
49
|
* 获取推荐支付金额
|
|
37
50
|
* 基于目标金额和货币类型,返回最优支付金额建议
|
|
@@ -40,12 +53,12 @@ class CashPaymentImpl {
|
|
|
40
53
|
* @returns 推荐支付金额数组
|
|
41
54
|
*/
|
|
42
55
|
getRecommendedAmount(money, currency) {
|
|
43
|
-
// 获取对应货币的面额配置
|
|
44
56
|
const upperCurrency = currency.toUpperCase();
|
|
45
|
-
const denominations =
|
|
46
|
-
|
|
47
|
-
// 直接调用算法,所有验证和容错处理都在算法内部
|
|
48
|
-
return (0, _cashRecommendationAlgorithm.recommendOptimalPayments)(money, denominations);
|
|
57
|
+
const denominations = import_cashRecommendationAlgorithm.CURRENCY_DENOMINATIONS[upperCurrency] || import_cashRecommendationAlgorithm.CURRENCY_DENOMINATIONS["DEFAULT"];
|
|
58
|
+
return (0, import_cashRecommendationAlgorithm.recommendOptimalPayments)(money, denominations);
|
|
49
59
|
}
|
|
50
|
-
}
|
|
51
|
-
|
|
60
|
+
};
|
|
61
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
62
|
+
0 && (module.exports = {
|
|
63
|
+
CashPaymentImpl
|
|
64
|
+
});
|
|
@@ -1,105 +1,83 @@
|
|
|
1
|
-
|
|
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);
|
|
2
18
|
|
|
3
|
-
|
|
4
|
-
|
|
19
|
+
// src/modules/Payment/cashRecommendationAlgorithm.ts
|
|
20
|
+
var cashRecommendationAlgorithm_exports = {};
|
|
21
|
+
__export(cashRecommendationAlgorithm_exports, {
|
|
22
|
+
CURRENCY_DENOMINATIONS: () => CURRENCY_DENOMINATIONS,
|
|
23
|
+
recommendOptimalPayments: () => recommendOptimalPayments
|
|
5
24
|
});
|
|
6
|
-
exports
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* 现金支付推荐算法
|
|
10
|
-
*
|
|
11
|
-
* 核心原理:
|
|
12
|
-
* 1. 每个推荐金额都应该是独立的最优组合
|
|
13
|
-
* 2. 不推荐在已有最优解基础上添加额外面额的组合
|
|
14
|
-
* 3. 优先推荐使用不同数量币种的组合
|
|
15
|
-
* 4. 根据组合判断去重,避免扩展组合
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* 常见国家货币面额配置
|
|
20
|
-
*/
|
|
21
|
-
const CURRENCY_DENOMINATIONS = exports.CURRENCY_DENOMINATIONS = {
|
|
25
|
+
module.exports = __toCommonJS(cashRecommendationAlgorithm_exports);
|
|
26
|
+
var CURRENCY_DENOMINATIONS = {
|
|
22
27
|
// 美元
|
|
23
|
-
|
|
28
|
+
"USD": [100, 50, 20, 10, 5, 1, 0.5, 0.25, 0.1, 0.05, 0.01],
|
|
24
29
|
// 人民币
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
"CNY": [100, 50, 20, 10, 5, 1, 0.5, 0.1, 0.05, 0.01],
|
|
31
|
+
"RMB": [100, 50, 20, 10, 5, 1, 0.5, 0.1, 0.05, 0.01],
|
|
27
32
|
// 欧元
|
|
28
|
-
|
|
33
|
+
"EUR": [500, 200, 100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01],
|
|
29
34
|
// 日元
|
|
30
|
-
|
|
35
|
+
"JPY": [1e4, 5e3, 2e3, 1e3, 500, 100, 50, 10, 5, 1],
|
|
31
36
|
// 英镑
|
|
32
|
-
|
|
37
|
+
"GBP": [50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01],
|
|
33
38
|
// 澳元
|
|
34
|
-
|
|
39
|
+
"AUD": [100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1],
|
|
35
40
|
// 加元
|
|
36
|
-
|
|
41
|
+
"CAD": [100, 50, 20, 10, 5, 2, 1, 0.25, 0.1, 0.05],
|
|
37
42
|
// 港元
|
|
38
|
-
|
|
43
|
+
"HKD": [1e3, 500, 100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1],
|
|
39
44
|
// 新台币
|
|
40
|
-
|
|
45
|
+
"TWD": [2e3, 1e3, 500, 200, 100, 50, 10, 5, 1],
|
|
41
46
|
// 韩元
|
|
42
|
-
|
|
47
|
+
"KRW": [5e4, 1e4, 5e3, 1e3, 500, 100, 50, 10, 5, 1],
|
|
43
48
|
// 新加坡元
|
|
44
|
-
|
|
49
|
+
"SGD": [1e4, 1e3, 100, 50, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.01],
|
|
45
50
|
// 瑞士法郎
|
|
46
|
-
|
|
51
|
+
"CHF": [1e3, 200, 100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05],
|
|
47
52
|
// 默认通用面额(如果币种不在列表中)
|
|
48
|
-
|
|
53
|
+
"DEFAULT": [100, 50, 20, 10, 5, 1, 0.5, 0.25, 0.1, 0.05, 0.01]
|
|
49
54
|
};
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* 支付组合类型定义
|
|
53
|
-
*/
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* 最优支付金额推荐算法
|
|
57
|
-
* 推荐通过不同数量面额组合刚好足够支付的最小金额
|
|
58
|
-
*
|
|
59
|
-
* @param targetAmount 目标金额
|
|
60
|
-
* @param denominations 币种面值数组
|
|
61
|
-
* @returns 推荐支付金额数组
|
|
62
|
-
*/
|
|
63
55
|
function recommendOptimalPayments(targetAmount, denominations) {
|
|
64
|
-
// 参数验证
|
|
65
56
|
if (targetAmount <= 0 || !isFinite(targetAmount) || isNaN(targetAmount)) {
|
|
66
57
|
return [];
|
|
67
58
|
}
|
|
68
59
|
if (!denominations || !Array.isArray(denominations) || denominations.length === 0) {
|
|
69
60
|
return [Math.ceil(targetAmount)];
|
|
70
61
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const maxReasonableDenom = targetAmount * 5; // 适度限制搜索空间
|
|
74
|
-
const validDenoms = denominations.filter(denom => denom > 0 && isFinite(denom) && !isNaN(denom) && denom <= maxReasonableDenom).slice(0, 8); // 限制面额数量以提高性能
|
|
75
|
-
|
|
62
|
+
const maxReasonableDenom = targetAmount * 5;
|
|
63
|
+
const validDenoms = denominations.filter((denom) => denom > 0 && isFinite(denom) && !isNaN(denom) && denom <= maxReasonableDenom).slice(0, 8);
|
|
76
64
|
if (validDenoms.length === 0) {
|
|
77
|
-
// 如果没有合适的面额,返回最接近的整数金额
|
|
78
65
|
return [Math.ceil(targetAmount)];
|
|
79
66
|
}
|
|
80
67
|
try {
|
|
81
|
-
|
|
82
|
-
const precision = 100; // 假设最小单位是0.01
|
|
68
|
+
const precision = 100;
|
|
83
69
|
const target = Math.round(targetAmount * precision);
|
|
84
|
-
const denoms = validDenoms.map(d => Math.round(d * precision)).sort((a, b) => b - a);
|
|
85
|
-
|
|
86
|
-
// 存储不同的支付组合方案
|
|
70
|
+
const denoms = validDenoms.map((d) => Math.round(d * precision)).sort((a, b) => b - a);
|
|
87
71
|
const paymentOptions = [];
|
|
88
|
-
|
|
89
|
-
// 首先尝试找到精确匹配的组合
|
|
90
72
|
const exactCombination = findExactCombination(target, denoms, precision);
|
|
91
73
|
if (exactCombination) {
|
|
92
74
|
paymentOptions.push(exactCombination);
|
|
93
75
|
}
|
|
94
|
-
|
|
95
|
-
// 为了提高效率,我们将按币种数量来生成组合
|
|
96
|
-
// 1币种组合:只用一种面额
|
|
97
76
|
for (let i = 0; i < Math.min(denoms.length, 6); i++) {
|
|
98
77
|
const denom = denoms[i];
|
|
99
78
|
const count = Math.ceil(target / denom);
|
|
100
79
|
const sum = count * denom;
|
|
101
80
|
if (sum >= target && count <= 12) {
|
|
102
|
-
// 限制硬币数量以提高性能
|
|
103
81
|
paymentOptions.push({
|
|
104
82
|
combination: Array(count).fill(denom / precision),
|
|
105
83
|
sum: sum / precision,
|
|
@@ -108,23 +86,22 @@ function recommendOptimalPayments(targetAmount, denominations) {
|
|
|
108
86
|
});
|
|
109
87
|
}
|
|
110
88
|
}
|
|
111
|
-
|
|
112
|
-
// 2币种组合:使用两种面额(大幅限制搜索范围以提高性能)
|
|
113
89
|
for (let i = 0; i < Math.min(denoms.length - 1, 5); i++) {
|
|
114
90
|
for (let j = i + 1; j < Math.min(denoms.length, 6); j++) {
|
|
115
91
|
const denom1 = denoms[i];
|
|
116
92
|
const denom2 = denoms[j];
|
|
117
|
-
|
|
118
|
-
// 大幅限制搜索范围,基于目标金额动态调整
|
|
119
93
|
const maxCount1 = Math.min(Math.ceil(target / denom1) + 1, 8);
|
|
120
94
|
const maxCount2 = Math.min(Math.ceil(target / denom2) + 1, 10);
|
|
121
95
|
for (let count1 = 1; count1 <= maxCount1; count1++) {
|
|
122
96
|
for (let count2 = 1; count2 <= maxCount2; count2++) {
|
|
123
97
|
const sum = count1 * denom1 + count2 * denom2;
|
|
124
98
|
if (sum >= target) {
|
|
125
|
-
const combination = [
|
|
99
|
+
const combination = [
|
|
100
|
+
...Array(count1).fill(denom1 / precision),
|
|
101
|
+
...Array(count2).fill(denom2 / precision)
|
|
102
|
+
];
|
|
126
103
|
paymentOptions.push({
|
|
127
|
-
combination
|
|
104
|
+
combination,
|
|
128
105
|
sum: sum / precision,
|
|
129
106
|
coinCount: count1 + count2,
|
|
130
107
|
denomTypes: 2
|
|
@@ -134,16 +111,12 @@ function recommendOptimalPayments(targetAmount, denominations) {
|
|
|
134
111
|
}
|
|
135
112
|
}
|
|
136
113
|
}
|
|
137
|
-
|
|
138
|
-
// 3币种组合:使用三种面额(大幅限制搜索以提高效率)
|
|
139
114
|
for (let i = 0; i < Math.min(denoms.length - 2, 3); i++) {
|
|
140
115
|
for (let j = i + 1; j < Math.min(denoms.length - 1, 4); j++) {
|
|
141
116
|
for (let k = j + 1; k < Math.min(denoms.length, 5); k++) {
|
|
142
117
|
const denom1 = denoms[i];
|
|
143
118
|
const denom2 = denoms[j];
|
|
144
119
|
const denom3 = denoms[k];
|
|
145
|
-
|
|
146
|
-
// 大幅限制搜索范围
|
|
147
120
|
const maxCount1 = Math.min(Math.ceil(target / denom1) + 1, 5);
|
|
148
121
|
const maxCount2 = Math.min(Math.ceil(target / denom2) + 1, 6);
|
|
149
122
|
const maxCount3 = Math.min(Math.ceil(target / denom3) + 1, 8);
|
|
@@ -152,9 +125,13 @@ function recommendOptimalPayments(targetAmount, denominations) {
|
|
|
152
125
|
for (let count3 = 1; count3 <= maxCount3; count3++) {
|
|
153
126
|
const sum = count1 * denom1 + count2 * denom2 + count3 * denom3;
|
|
154
127
|
if (sum >= target) {
|
|
155
|
-
const combination = [
|
|
128
|
+
const combination = [
|
|
129
|
+
...Array(count1).fill(denom1 / precision),
|
|
130
|
+
...Array(count2).fill(denom2 / precision),
|
|
131
|
+
...Array(count3).fill(denom3 / precision)
|
|
132
|
+
];
|
|
156
133
|
paymentOptions.push({
|
|
157
|
-
combination
|
|
134
|
+
combination,
|
|
158
135
|
sum: sum / precision,
|
|
159
136
|
coinCount: count1 + count2 + count3,
|
|
160
137
|
denomTypes: 3
|
|
@@ -166,8 +143,6 @@ function recommendOptimalPayments(targetAmount, denominations) {
|
|
|
166
143
|
}
|
|
167
144
|
}
|
|
168
145
|
}
|
|
169
|
-
|
|
170
|
-
// 4币种组合:使用四种面额(极度限制搜索以提高性能)
|
|
171
146
|
for (let i = 0; i < Math.min(denoms.length - 3, 2); i++) {
|
|
172
147
|
for (let j = i + 1; j < Math.min(denoms.length - 2, 3); j++) {
|
|
173
148
|
for (let k = j + 1; k < Math.min(denoms.length - 1, 4); k++) {
|
|
@@ -176,8 +151,6 @@ function recommendOptimalPayments(targetAmount, denominations) {
|
|
|
176
151
|
const denom2 = denoms[j];
|
|
177
152
|
const denom3 = denoms[k];
|
|
178
153
|
const denom4 = denoms[l];
|
|
179
|
-
|
|
180
|
-
// 极度限制搜索范围
|
|
181
154
|
const maxCount1 = Math.min(Math.ceil(target / denom1) + 1, 3);
|
|
182
155
|
const maxCount2 = Math.min(Math.ceil(target / denom2) + 1, 4);
|
|
183
156
|
const maxCount3 = Math.min(Math.ceil(target / denom3) + 1, 5);
|
|
@@ -188,9 +161,14 @@ function recommendOptimalPayments(targetAmount, denominations) {
|
|
|
188
161
|
for (let count4 = 1; count4 <= maxCount4; count4++) {
|
|
189
162
|
const sum = count1 * denom1 + count2 * denom2 + count3 * denom3 + count4 * denom4;
|
|
190
163
|
if (sum >= target) {
|
|
191
|
-
const combination = [
|
|
164
|
+
const combination = [
|
|
165
|
+
...Array(count1).fill(denom1 / precision),
|
|
166
|
+
...Array(count2).fill(denom2 / precision),
|
|
167
|
+
...Array(count3).fill(denom3 / precision),
|
|
168
|
+
...Array(count4).fill(denom4 / precision)
|
|
169
|
+
];
|
|
192
170
|
paymentOptions.push({
|
|
193
|
-
combination
|
|
171
|
+
combination,
|
|
194
172
|
sum: sum / precision,
|
|
195
173
|
coinCount: count1 + count2 + count3 + count4,
|
|
196
174
|
denomTypes: 4
|
|
@@ -204,25 +182,17 @@ function recommendOptimalPayments(targetAmount, denominations) {
|
|
|
204
182
|
}
|
|
205
183
|
}
|
|
206
184
|
}
|
|
207
|
-
|
|
208
|
-
// 如果没有找到任何组合,提供默认建议
|
|
209
185
|
if (paymentOptions.length === 0) {
|
|
210
|
-
|
|
211
|
-
const minValidDenom = validDenoms.find(denom => denom >= targetAmount);
|
|
186
|
+
const minValidDenom = validDenoms.find((denom) => denom >= targetAmount);
|
|
212
187
|
if (minValidDenom) {
|
|
213
188
|
return [minValidDenom];
|
|
214
189
|
} else {
|
|
215
|
-
// 使用最大面额的组合
|
|
216
190
|
const maxDenom = Math.max(...validDenoms);
|
|
217
191
|
const count = Math.ceil(targetAmount / maxDenom);
|
|
218
192
|
return [count * maxDenom];
|
|
219
193
|
}
|
|
220
194
|
}
|
|
221
|
-
|
|
222
|
-
// 移除重复和扩展组合
|
|
223
195
|
const uniqueCombinations = removeDuplicateAndExtendedCombinations(paymentOptions, targetAmount);
|
|
224
|
-
|
|
225
|
-
// 按币种类型数量排序,然后按总硬币数量排序,最后按金额排序
|
|
226
196
|
uniqueCombinations.sort((a, b) => {
|
|
227
197
|
if (a.denomTypes !== b.denomTypes) {
|
|
228
198
|
return a.denomTypes - b.denomTypes;
|
|
@@ -232,12 +202,10 @@ function recommendOptimalPayments(targetAmount, denominations) {
|
|
|
232
202
|
}
|
|
233
203
|
return a.sum - b.sum;
|
|
234
204
|
});
|
|
235
|
-
|
|
236
|
-
// 按金额去重并返回推荐的支付金额
|
|
237
|
-
const uniqueAmounts = new Set();
|
|
205
|
+
const uniqueAmounts = /* @__PURE__ */ new Set();
|
|
238
206
|
const finalResults = [];
|
|
239
207
|
for (const item of uniqueCombinations) {
|
|
240
|
-
const roundedAmount = Math.round(item.sum * 100) / 100;
|
|
208
|
+
const roundedAmount = Math.round(item.sum * 100) / 100;
|
|
241
209
|
if (!uniqueAmounts.has(roundedAmount) && finalResults.length < 10) {
|
|
242
210
|
uniqueAmounts.add(roundedAmount);
|
|
243
211
|
finalResults.push(roundedAmount);
|
|
@@ -245,19 +213,12 @@ function recommendOptimalPayments(targetAmount, denominations) {
|
|
|
245
213
|
}
|
|
246
214
|
return finalResults.sort((a, b) => a - b);
|
|
247
215
|
} catch (error) {
|
|
248
|
-
|
|
249
|
-
console.warn('推荐支付金额计算出错:', error);
|
|
250
|
-
// 返回最接近的整数金额作为兜底
|
|
216
|
+
console.warn("推荐支付金额计算出错:", error);
|
|
251
217
|
const safeAmount = Math.ceil(targetAmount);
|
|
252
218
|
return [targetAmount, safeAmount];
|
|
253
219
|
}
|
|
254
220
|
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* 尝试找到精确匹配目标金额的组合
|
|
258
|
-
*/
|
|
259
221
|
function findExactCombination(target, denoms, precision) {
|
|
260
|
-
// 简单的深度优先搜索,限制搜索深度
|
|
261
222
|
function dfs(remaining, denomIndex, currentCombination) {
|
|
262
223
|
if (remaining === 0) {
|
|
263
224
|
return currentCombination;
|
|
@@ -266,8 +227,6 @@ function findExactCombination(target, denoms, precision) {
|
|
|
266
227
|
return null;
|
|
267
228
|
}
|
|
268
229
|
const denom = denoms[denomIndex];
|
|
269
|
-
|
|
270
|
-
// 尝试使用当前面额 0 到 maxCount 次
|
|
271
230
|
const maxCount = Math.min(Math.floor(remaining / denom), 8);
|
|
272
231
|
for (let count = maxCount; count >= 0; count--) {
|
|
273
232
|
const newCombination = [...currentCombination, ...Array(count).fill(denom)];
|
|
@@ -282,23 +241,16 @@ function findExactCombination(target, denoms, precision) {
|
|
|
282
241
|
if (exactMatch && exactMatch.length > 0) {
|
|
283
242
|
const denomTypes = new Set(exactMatch).size;
|
|
284
243
|
return {
|
|
285
|
-
combination: exactMatch.map(d => d / precision),
|
|
244
|
+
combination: exactMatch.map((d) => d / precision),
|
|
286
245
|
sum: target / precision,
|
|
287
246
|
coinCount: exactMatch.length,
|
|
288
|
-
denomTypes
|
|
247
|
+
denomTypes
|
|
289
248
|
};
|
|
290
249
|
}
|
|
291
250
|
return null;
|
|
292
251
|
}
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* 移除重复和扩展组合
|
|
296
|
-
* 核心原理:如果组合A包含组合B的所有硬币,并且还有额外硬币,则A是B的扩展,应该被移除
|
|
297
|
-
*/
|
|
298
252
|
function removeDuplicateAndExtendedCombinations(combinations, targetAmount) {
|
|
299
253
|
const result = [];
|
|
300
|
-
|
|
301
|
-
// 按币种类型数量、硬币数量、金额排序,确保较简单的组合在前面
|
|
302
254
|
combinations.sort((a, b) => {
|
|
303
255
|
if (a.denomTypes !== b.denomTypes) {
|
|
304
256
|
return a.denomTypes - b.denomTypes;
|
|
@@ -311,27 +263,18 @@ function removeDuplicateAndExtendedCombinations(combinations, targetAmount) {
|
|
|
311
263
|
for (let i = 0; i < combinations.length; i++) {
|
|
312
264
|
const current = combinations[i];
|
|
313
265
|
let shouldSkip = false;
|
|
314
|
-
|
|
315
|
-
// 检查当前组合是否与已添加的组合重复或者是扩展
|
|
316
266
|
for (let j = 0; j < result.length; j++) {
|
|
317
267
|
const existing = result[j];
|
|
318
|
-
|
|
319
|
-
// 如果完全相同,跳过
|
|
320
268
|
if (isSameCombination(current.combination, existing.combination)) {
|
|
321
269
|
shouldSkip = true;
|
|
322
270
|
break;
|
|
323
271
|
}
|
|
324
|
-
|
|
325
|
-
// 如果当前组合是已存在组合的扩展,跳过
|
|
326
272
|
if (isExtensionOf(current.combination, existing.combination)) {
|
|
327
273
|
shouldSkip = true;
|
|
328
274
|
break;
|
|
329
275
|
}
|
|
330
276
|
}
|
|
331
|
-
|
|
332
|
-
// 检查是否有其他组合是当前组合的扩展,如果有,移除那些扩展
|
|
333
277
|
if (!shouldSkip) {
|
|
334
|
-
// 移除所有当前组合的扩展
|
|
335
278
|
for (let j = result.length - 1; j >= 0; j--) {
|
|
336
279
|
if (isExtensionOf(result[j].combination, current.combination)) {
|
|
337
280
|
result.splice(j, 1);
|
|
@@ -342,34 +285,23 @@ function removeDuplicateAndExtendedCombinations(combinations, targetAmount) {
|
|
|
342
285
|
}
|
|
343
286
|
return result;
|
|
344
287
|
}
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* 检查组合A是否是组合B的扩展(即A包含B的所有硬币,并且还有额外的硬币)
|
|
348
|
-
*/
|
|
349
288
|
function isExtensionOf(combinationA, combinationB) {
|
|
350
|
-
// 如果A的硬币数量少于等于B,A不可能是B的扩展
|
|
351
289
|
if (combinationA.length <= combinationB.length) {
|
|
352
290
|
return false;
|
|
353
291
|
}
|
|
354
|
-
|
|
355
|
-
// 统计每个面额的数量
|
|
356
292
|
const countA = {};
|
|
357
293
|
const countB = {};
|
|
358
|
-
combinationA.forEach(coin => {
|
|
294
|
+
combinationA.forEach((coin) => {
|
|
359
295
|
countA[coin] = (countA[coin] || 0) + 1;
|
|
360
296
|
});
|
|
361
|
-
combinationB.forEach(coin => {
|
|
297
|
+
combinationB.forEach((coin) => {
|
|
362
298
|
countB[coin] = (countB[coin] || 0) + 1;
|
|
363
299
|
});
|
|
364
|
-
|
|
365
|
-
// 检查B的所有面额在A中是否都有足够的数量
|
|
366
300
|
for (const coin in countB) {
|
|
367
301
|
if (!countA[coin] || countA[coin] < countB[coin]) {
|
|
368
302
|
return false;
|
|
369
303
|
}
|
|
370
304
|
}
|
|
371
|
-
|
|
372
|
-
// 检查A是否有B没有的额外硬币
|
|
373
305
|
let hasExtra = false;
|
|
374
306
|
for (const coin in countA) {
|
|
375
307
|
if (countA[coin] > (countB[coin] || 0)) {
|
|
@@ -379,24 +311,18 @@ function isExtensionOf(combinationA, combinationB) {
|
|
|
379
311
|
}
|
|
380
312
|
return hasExtra;
|
|
381
313
|
}
|
|
382
|
-
|
|
383
|
-
/**
|
|
384
|
-
* 检查两个组合是否本质相同(相同的面额组合)
|
|
385
|
-
*/
|
|
386
314
|
function isSameCombination(combinationA, combinationB) {
|
|
387
315
|
if (combinationA.length !== combinationB.length) {
|
|
388
316
|
return false;
|
|
389
317
|
}
|
|
390
318
|
const countA = {};
|
|
391
319
|
const countB = {};
|
|
392
|
-
combinationA.forEach(coin => {
|
|
320
|
+
combinationA.forEach((coin) => {
|
|
393
321
|
countA[coin] = (countA[coin] || 0) + 1;
|
|
394
322
|
});
|
|
395
|
-
combinationB.forEach(coin => {
|
|
323
|
+
combinationB.forEach((coin) => {
|
|
396
324
|
countB[coin] = (countB[coin] || 0) + 1;
|
|
397
325
|
});
|
|
398
|
-
|
|
399
|
-
// 检查两个组合是否有相同的面额和数量
|
|
400
326
|
for (const coin in countA) {
|
|
401
327
|
if (countA[coin] !== (countB[coin] || 0)) {
|
|
402
328
|
return false;
|
|
@@ -408,4 +334,9 @@ function isSameCombination(combinationA, combinationB) {
|
|
|
408
334
|
}
|
|
409
335
|
}
|
|
410
336
|
return true;
|
|
411
|
-
}
|
|
337
|
+
}
|
|
338
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
339
|
+
0 && (module.exports = {
|
|
340
|
+
CURRENCY_DENOMINATIONS,
|
|
341
|
+
recommendOptimalPayments
|
|
342
|
+
});
|
|
@@ -1,37 +1,51 @@
|
|
|
1
|
-
|
|
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);
|
|
2
18
|
|
|
3
|
-
|
|
4
|
-
|
|
19
|
+
// src/modules/Payment/eftpos.ts
|
|
20
|
+
var eftpos_exports = {};
|
|
21
|
+
__export(eftpos_exports, {
|
|
22
|
+
EftposPaymentImpl: () => EftposPaymentImpl
|
|
5
23
|
});
|
|
6
|
-
exports
|
|
7
|
-
|
|
8
|
-
* Eftpos支付实现
|
|
9
|
-
*/
|
|
10
|
-
class EftposPaymentImpl {
|
|
24
|
+
module.exports = __toCommonJS(eftpos_exports);
|
|
25
|
+
var EftposPaymentImpl = class {
|
|
11
26
|
constructor(paymentModule) {
|
|
12
27
|
this.paymentModule = paymentModule;
|
|
13
28
|
}
|
|
14
29
|
async processEftposPayment(amount, orderUuid) {
|
|
15
30
|
const eftposMethod = await this.paymentModule.getEftposPaymentMethod();
|
|
16
31
|
if (!eftposMethod) {
|
|
17
|
-
throw new Error(
|
|
32
|
+
throw new Error("Eftpos支付方式未找到");
|
|
18
33
|
}
|
|
19
|
-
|
|
20
|
-
// 这里应该调用实际的Eftpos组件
|
|
21
|
-
// 假设Eftpos支付成功,创建支付项
|
|
22
34
|
const paymentItem = {
|
|
23
35
|
amount: amount.toString(),
|
|
24
36
|
code: eftposMethod.code,
|
|
25
37
|
custom_payment_id: eftposMethod.id,
|
|
26
38
|
name: eftposMethod.name,
|
|
27
39
|
type: eftposMethod.type,
|
|
28
|
-
voucher_id:
|
|
40
|
+
voucher_id: ""
|
|
29
41
|
};
|
|
30
42
|
await this.paymentModule.addPaymentItemAsync(orderUuid, paymentItem);
|
|
31
43
|
}
|
|
32
44
|
async checkDeviceStatus() {
|
|
33
|
-
// 检查Eftpos设备状态的逻辑
|
|
34
45
|
return true;
|
|
35
46
|
}
|
|
36
|
-
}
|
|
37
|
-
|
|
47
|
+
};
|
|
48
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
49
|
+
0 && (module.exports = {
|
|
50
|
+
EftposPaymentImpl
|
|
51
|
+
});
|