From dfba786129bad717aaaa182c18404123646e35d4 Mon Sep 17 00:00:00 2001
From: whitechiina <1293616053@qq.com>
Date: Tue, 8 Sep 2026 09:25:01 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
api/assets.js | 55 +++-
config/service.js | 1 +
pages/assets/bmt-exchange.vue | 263 +++++++++++++++---
pages/assets/bmt-flash.vue | 2 +-
pages/index/index.vue | 10 +-
unpackage/dist/build/.DS_Store | Bin 6148 -> 6148 bytes
unpackage/dist/build/web/index.html | 2 +-
.../{index.19c00be4.js => index.47f364de.js} | 2 +-
...ges-assets-bmtr~pages~f90d3c1d.0f4a29e3.js | 1 -
...ges-assets-bmtr~pages~f90d3c1d.2f9d773a.js | 1 +
.../js/pages-assets-bmt-exchange.4a1a8a20.js | 1 -
.../js/pages-assets-bmt-exchange.5503fa74.js | 1 +
.../js/pages-assets-bmt-flash.ac195563.js | 1 -
.../js/pages-assets-bmt-flash.bab4878d.js | 1 +
.../static/js/pages-assets-wallet.af6a62e4.js | 1 -
.../static/js/pages-assets-wallet.c99664d1.js | 1 +
.../js/pages-assets-withdraw.07e0dc04.js | 1 +
.../js/pages-assets-withdraw.e41ce0e3.js | 1 -
.../static/js/pages-index-index.09366f09.js | 1 +
.../static/js/pages-index-index.335f7cba.js | 1 -
20 files changed, 288 insertions(+), 59 deletions(-)
rename unpackage/dist/build/web/static/js/{index.19c00be4.js => index.47f364de.js} (98%)
delete mode 100644 unpackage/dist/build/web/static/js/pages-assets-balance-center~pages-assets-bmt-exchange~pages-assets-bmt-flash~pages-assets-bmtr~pages~f90d3c1d.0f4a29e3.js
create mode 100644 unpackage/dist/build/web/static/js/pages-assets-balance-center~pages-assets-bmt-exchange~pages-assets-bmt-flash~pages-assets-bmtr~pages~f90d3c1d.2f9d773a.js
delete mode 100644 unpackage/dist/build/web/static/js/pages-assets-bmt-exchange.4a1a8a20.js
create mode 100644 unpackage/dist/build/web/static/js/pages-assets-bmt-exchange.5503fa74.js
delete mode 100644 unpackage/dist/build/web/static/js/pages-assets-bmt-flash.ac195563.js
create mode 100644 unpackage/dist/build/web/static/js/pages-assets-bmt-flash.bab4878d.js
delete mode 100644 unpackage/dist/build/web/static/js/pages-assets-wallet.af6a62e4.js
create mode 100644 unpackage/dist/build/web/static/js/pages-assets-wallet.c99664d1.js
create mode 100644 unpackage/dist/build/web/static/js/pages-assets-withdraw.07e0dc04.js
delete mode 100644 unpackage/dist/build/web/static/js/pages-assets-withdraw.e41ce0e3.js
create mode 100644 unpackage/dist/build/web/static/js/pages-index-index.09366f09.js
delete mode 100644 unpackage/dist/build/web/static/js/pages-index-index.335f7cba.js
diff --git a/api/assets.js b/api/assets.js
index c909ac8..0310e9c 100644
--- a/api/assets.js
+++ b/api/assets.js
@@ -2078,6 +2078,28 @@ async function fetchBmtRedeemConfigData(requestOptions) {
);
}
+function normalizeBmtRedeemConfig(data) {
+ return {
+ point: toNumber(data && data.point),
+ cPower: toNumber(data && data.c_power),
+ bmtr: toNumber(data && data.bmtr),
+ redeemNum: toNumber(data && data.redeem_num),
+ };
+}
+
+async function fetchBmtRedeemPowerRateNewData(requestOptions) {
+ return fetchPayload(
+ createRequestOptions(
+ {
+ url: serviceConfig.ENDPOINTS.bmtRedeemPowerRateNew,
+ method: "GET",
+ },
+ requestOptions,
+ ),
+ "方案1配置加载失败",
+ );
+}
+
async function fetchPowerExchangeMuitData(requestOptions) {
return fetchPayload(
createRequestOptions(
@@ -2909,21 +2931,25 @@ export async function fetchBmtExchangeDetail(requestOptions) {
fetchHomeBalanceData(requestOptions),
fetchBmtRedeemConfigData(requestOptions),
fetchUserData(requestOptions),
+ fetchBmtRedeemPowerRateNewData(requestOptions).catch(function () {
+ return null;
+ }),
]);
const ticker = getHomeTickerCache();
const balances = normalizeBalances(result[0]);
- const exchangeConfig = {
- point: toNumber(result[1] && result[1].point),
- cPower: toNumber(result[1] && result[1].c_power),
- bmtr: toNumber(result[1] && result[1].bmtr),
- redeemNum: toNumber(result[1] && result[1].redeem_num),
+ const exchangeConfig = normalizeBmtRedeemConfig(result[1]);
+ const schemeOneConfig = {
+ power: toNumber(result[3] && result[3].power),
+ bmtr: toNumber(result[3] && result[3].bmtr),
};
const bmtr = pickFirstValue(result[2], ["bmtr"]);
return {
ticker: ticker,
exchangeConfig: exchangeConfig,
+ schemeOneConfig: schemeOneConfig,
+ schemeOneConfigLoaded: Boolean(result[3]),
balances: {
points: balances.points,
power: balances.power,
@@ -2933,16 +2959,32 @@ export async function fetchBmtExchangeDetail(requestOptions) {
coupon: balances.coupon,
},
tips: [
- `预估BMT数=输入可用积分数 ÷ ${exchangeConfig.point} × ${exchangeConfig.redeemNum}BMT个数。`,
+ `预估BMT数=(输入可用积分数 ÷ ${exchangeConfig.point},保留4位小数) × ${exchangeConfig.redeemNum},结果保留2位小数。`,
`兑换会同步消耗算力、BMTR、${exchangeConfig.point}点可用积分,需同步消耗${exchangeConfig.cPower}点算力和${exchangeConfig.bmtr}个BMTR`,
`仅支持100的正整数倍,不足100的可用积分无法发起兑换`,
`凌晨00:00至02:00为积分维护时段,期间暂停兑换服务,请避开该时间段操作。`,
+ `平台可根据实际情况,对合成规则和系数进行调整。`,
],
};
}
+export async function fetchBmtRedeemConfig(requestOptions) {
+ const data = await fetchBmtRedeemConfigData(requestOptions);
+ return normalizeBmtRedeemConfig(data);
+}
+
+export async function fetchBmtRedeemPowerRateNew(requestOptions) {
+ const data = await fetchBmtRedeemPowerRateNewData(requestOptions);
+
+ return {
+ power: toNumber(data && data.power),
+ bmtr: toNumber(data && data.bmtr),
+ };
+}
+
export async function submitAssetBmtExchange(payload, requestOptions) {
const amount = toNumber(payload && payload.amount);
+ const type = Number(payload && payload.type) === 0 ? 0 : 1;
if (!amount) {
throw createError("请输入积分数量");
@@ -2955,6 +2997,7 @@ export async function submitAssetBmtExchange(payload, requestOptions) {
method: "POST",
data: {
number: String(amount),
+ type: type,
},
},
requestOptions,
diff --git a/config/service.js b/config/service.js
index 5044d3a..a1be9c8 100644
--- a/config/service.js
+++ b/config/service.js
@@ -21,6 +21,7 @@ const serviceConfig = {
bmtrExchangePercent: "/api/hn/redeem/getBmtrPercent",
powerExchangeMuit: "/api/hn/redeem/getMuit",
bmtRedeemConfig: "/api/hn/redeem/getConfigSet",
+ bmtRedeemPowerRateNew: "/api/hn/redeem/getRedeemPowerRateNew",
bmtExchangeSubmit: "/api/hn/redeem/redeem_bmt",
getUser: "/api/mxj/api/get_user",
transferFee: "/api/hn/transfer/getProp",
diff --git a/pages/assets/bmt-exchange.vue b/pages/assets/bmt-exchange.vue
index 9ff0f32..ae2d8bf 100644
--- a/pages/assets/bmt-exchange.vue
+++ b/pages/assets/bmt-exchange.vue
@@ -89,6 +89,23 @@
BMT兑换
+
+
+ {{ loadingRedeemType === 0 ? "加载中..." : "方案1" }}
+
+
+ {{ loadingRedeemType === 1 ? "加载中..." : "方案2" }}
+
+
+
0
+ : this.configPointNumber > 0 && this.redeemNumNumber > 0;
+ },
+ estimateBmt() {
+ if (!this.pointsValue || !this.canCalculateBmt) {
+ return "0";
+ }
+
+ return this.formatAmount(this.calculateBmt(this.pointsValue), 2);
+ },
+ powerCostNumber() {
+ if (!this.pointsValue || !this.activePowerCostPerPoint) {
+ return 0;
+ }
+
+ return this.pointsValue * this.activePowerCostPerPoint;
+ },
+ powerCost() {
+ return this.formatTruncatedAmount(this.powerCostNumber, 2);
+ },
+ bmtrCostNumber() {
+ if (!this.pointsValue || !this.activeBmtrCostPerPoint) {
+ return 0;
+ }
+
+ return this.pointsValue * this.activeBmtrCostPerPoint;
},
bmtrCost() {
- return this.formatAmount(this.bmtrCostNumber, 4);
+ return this.formatTruncatedAmount(this.bmtrCostNumber, 2);
},
allEstimateBmt() {
const points = Number(this.detail.balances.points || 0);
- const price = this.priceNumber;
- if (!price) {
+ if (!this.canCalculateBmt) {
return "0.00";
}
- const truncatedBmt = Math.floor((points / price) * 100) / 100;
+ let exchangeablePoints = points;
+ const power = Number(this.detail.balances.power || 0);
+ const bmtr = Number(this.detail.balances.bmtr || 0);
+
+ if (this.activePowerCostPerPoint > 0) {
+ exchangeablePoints = Math.min(
+ exchangeablePoints,
+ power / this.activePowerCostPerPoint,
+ );
+ }
+
+ if (this.activeBmtrCostPerPoint > 0) {
+ exchangeablePoints = Math.min(
+ exchangeablePoints,
+ bmtr / this.activeBmtrCostPerPoint,
+ );
+ }
+
+ const truncatedBmt =
+ Math.floor(this.calculateBmt(Math.max(0, exchangeablePoints)) * 100) /
+ 100;
return this.formatAmount(truncatedBmt, 2);
},
priceNumber() {
@@ -299,26 +371,55 @@ export default {
return this.detail.balances.points;
},
displayBmtr() {
- return this.formatAmount(this.detail.balances.bmtr, 4);
+ return this.formatAmount(this.detail.balances.bmtr, 2);
},
displayPrice() {
return this.priceNumber ? this.priceNumber : "0.00";
},
normalizedTips() {
- if (this.detail.tips && this.detail.tips.length) {
- return this.detail.tips;
- }
+ const tips =
+ this.detail.tips && this.detail.tips.length
+ ? this.detail.tips.slice()
+ : [
+ `预估BMT数=输入可用积分数÷${this.configPointNumber}×${this.redeemNumNumber}。`,
+ "",
+ `只能兑换${REDEEM_POINT_STEP}的整数倍,小于${REDEEM_POINT_STEP}积分不可兑换;`,
+ "凌晨0点-凌晨1点积分系统维护不可兑换;",
+ ];
- return [
- "BMT=积分-BMT实时价格;",
- `消耗算力=输入可用积分数÷${this.configPointNumber}×${this.configPowerNumber};`,
- `消耗BMTR=输入可用积分数÷${this.configPointNumber}×${this.configBmtrNumber};`,
- `只能兑换${this.redeemNumNumber}的整数倍,小于${this.redeemNumNumber}积分不可兑换;`,
- "凌晨0点-凌晨1点积分系统维护不可兑换;",
- ];
+ tips[1] =
+ this.redeemType === 0
+ ? `方案1消耗算力=输入可用积分数×${this.schemeOnePowerNumber},消耗BMTR=输入可用积分数×${this.schemeOneBmtrNumber};`
+ : `方案2消耗算力=输入可用积分数÷${this.configPointNumber}×${this.configPowerNumber},消耗BMTR=输入可用积分数÷${this.configPointNumber}×${this.configBmtrNumber};`;
+ tips[0] =
+ this.redeemType === 0
+ ? "方案1预估BMT数=输入可用积分数÷BMT实时价格。"
+ : `方案2预估BMT数=(输入可用积分数÷${this.configPointNumber},保留4位小数)×${this.redeemNumNumber},结果保留2位小数。`;
+
+ return tips;
},
},
methods: {
+ calculateBmt(points) {
+ const pointAmount = Number(points || 0);
+
+ if (!pointAmount) {
+ return 0;
+ }
+
+ if (this.redeemType === 0) {
+ return this.priceNumber ? pointAmount / this.priceNumber : 0;
+ }
+
+ if (!this.configPointNumber || !this.redeemNumNumber) {
+ return 0;
+ }
+
+ const convertedPoints = Number(
+ (pointAmount / this.configPointNumber).toFixed(4),
+ );
+ return convertedPoints * this.redeemNumNumber;
+ },
pageIcon(type) {
const iconMap = {
power: "https://imgs.agrimedia.cn/bm-bmt/s.png",
@@ -349,6 +450,18 @@ export default {
.toString()
.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
},
+ formatTruncatedAmount(value, digits) {
+ const number = Number(value || 0);
+ const precision = Number(digits || 0);
+
+ if (!Number.isFinite(number)) {
+ return precision > 0 ? Number(0).toFixed(precision) : "0";
+ }
+
+ const factor = Math.pow(10, precision);
+ const truncated = Math.floor(Math.max(0, number) * factor) / factor;
+ return this.formatAmount(truncated, precision);
+ },
async loadPage(showLoading) {
try {
this.detail = await fetchBmtExchangeDetail(
@@ -359,6 +472,9 @@ export default {
}
: null,
);
+ this.schemeOneConfigLoaded = Boolean(
+ this.detail.schemeOneConfigLoaded,
+ );
} catch (error) {
uni.showToast({
title: error.message || "页面加载失败",
@@ -366,6 +482,40 @@ export default {
});
}
},
+ async selectRedeemType(type) {
+ const nextType = Number(type) === 0 ? 0 : 1;
+
+ if (nextType === this.redeemType || this.loadingRedeemType !== null) {
+ return;
+ }
+
+ this.loadingRedeemType = nextType;
+ try {
+ const configResult = await Promise.all([
+ fetchBmtRedeemConfig({
+ showLoading: true,
+ loadingText: "刷新兑换配置",
+ }),
+ fetchBmtRedeemPowerRateNew({
+ showLoading: true,
+ loadingText: "刷新兑换配置",
+ }),
+ ]);
+
+ this.detail.exchangeConfig = configResult[0];
+ this.detail.schemeOneConfig = configResult[1];
+ this.schemeOneConfigLoaded = true;
+
+ this.redeemType = nextType;
+ } catch (error) {
+ uni.showToast({
+ title: error.message || "兑换方案配置加载失败",
+ icon: "none",
+ });
+ } finally {
+ this.loadingRedeemType = null;
+ }
+ },
openConfirm() {
if (this.submitting || this.confirmVisible) {
return;
@@ -394,17 +544,17 @@ export default {
return;
}
- if (this.redeemNumNumber && this.pointsValue < this.redeemNumNumber) {
+ if (this.pointsValue < REDEEM_POINT_STEP) {
uni.showToast({
- title: `小于${this.redeemNumNumber}积分不可兑换`,
+ title: `小于${REDEEM_POINT_STEP}积分不可兑换`,
icon: "none",
});
return;
}
- if (this.redeemNumNumber && this.pointsValue % this.redeemNumNumber !== 0) {
+ if (this.pointsValue % REDEEM_POINT_STEP !== 0) {
uni.showToast({
- title: `只能兑换${this.redeemNumNumber}的整数倍`,
+ title: `只能兑换${REDEEM_POINT_STEP}的整数倍`,
icon: "none",
});
return;
@@ -418,7 +568,7 @@ export default {
return;
}
- if (Number(this.powerCost) > Number(this.detail.balances.power || 0)) {
+ if (this.powerCostNumber > Number(this.detail.balances.power || 0)) {
uni.showToast({
title: "可用算力不足",
icon: "none",
@@ -439,6 +589,7 @@ export default {
try {
await submitAssetBmtExchange({
amount: this.pointsValue,
+ type: this.redeemType,
}, {
showLoading: true,
loadingText: "兑换中",
@@ -641,6 +792,32 @@ export default {
color: #ffffff;
}
+.scheme-tabs {
+ display: flex;
+ margin-top: 20rpx;
+ padding: 6rpx;
+ border-radius: 10rpx;
+ background: #191e32;
+}
+
+.scheme-tab {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex: 1;
+ min-width: 0;
+ height: 64rpx;
+ border-radius: 8rpx;
+ font-size: 26rpx;
+ color: rgba(177, 187, 214, 0.76);
+}
+
+.scheme-tab--active {
+ background: #20b6f5;
+ font-weight: 700;
+ color: #ffffff;
+}
+
.form-input {
display: flex;
align-items: center;
diff --git a/pages/assets/bmt-flash.vue b/pages/assets/bmt-flash.vue
index 5582a5c..3dbb0c9 100644
--- a/pages/assets/bmt-flash.vue
+++ b/pages/assets/bmt-flash.vue
@@ -341,7 +341,7 @@ export default {
return this.formatAmount(this.detail.balances.coupon, 2);
},
displayBmtr() {
- return this.formatAmount(this.detail.balances.bmtr, 4);
+ return this.formatAmount(this.detail.balances.bmtr, 2);
},
displayPrice() {
return this.priceNumber ? this.priceNumber : "0.00";
diff --git a/pages/index/index.vue b/pages/index/index.vue
index 07d105c..0c77cb5 100644
--- a/pages/index/index.vue
+++ b/pages/index/index.vue
@@ -89,7 +89,11 @@
{{ item.title }}
- {{ formatAssetValue(item.value) }}
+ {{
+ item.key === "bmtr"
+ ? formatBmtrValue(item.value)
+ : formatAssetValue(item.value)
+ }}
@@ -163,6 +167,10 @@ export default {
formatAssetValue(value) {
return truncateToTwo(value);
},
+ formatBmtrValue(value) {
+ const number = Number(value || 0);
+ return Number.isFinite(number) ? number.toFixed(2) : "0.00";
+ },
async loadPage(options = {}) {
if (this.isFetchingHome) {
return;
diff --git a/unpackage/dist/build/.DS_Store b/unpackage/dist/build/.DS_Store
index 6750c1110bc2b8ce7b9be6940ca744ecd66bb440..4b953574b69f2ece362702bd21cdda380c1e116b 100644
GIT binary patch
delta 43
zcmZoMXffE}&ce8BvIk2chg5a7uA!N+;pF`+3XDCIAF#+X_HJTjW!}ur@s}R}DX|SR
delta 68
zcmZoMXffE}&ce83vIk2cn?!ZBk%i^tgDeV)T?}Br$Oxesc%d|m>fX%6%F4W%mE%7@
E0OMB+aR2}S
diff --git a/unpackage/dist/build/web/index.html b/unpackage/dist/build/web/index.html
index b368617..37a80c2 100644
--- a/unpackage/dist/build/web/index.html
+++ b/unpackage/dist/build/web/index.html
@@ -1,2 +1,2 @@
白马交易所
\ No newline at end of file
+ document.write('')