diff --git a/admin.php b/admin.php
index 7eeaa0a..24c72ac 100644
--- a/admin.php
+++ b/admin.php
@@ -408,7 +408,7 @@ async function loadShop(el) {
@@ -465,7 +465,7 @@ async function saveCartConfig() {
if (bp <= 0 || bp > 1) { toast('塞背包折扣系数应在 0.01 ~ 1.00 之间', 'err'); return; }
if (sh < 1 || sh > 3) { toast('潜影盒加价系数应在 1.00 ~ 3.00 之间', 'err'); return; }
if (isNaN(pm) || pm < 0 || pm > 999) { toast('打包费应在 0 ~ 999 之间', 'err'); return; }
- if (gd < 0 || gd > 9.99) { toast('环保单减免应在 0 ~ 9.99 之间', 'err'); return; }
+ if (gd < 0 || gd > 10) { toast('环保单折扣(折数)应在 0 ~ 10 之间', 'err'); return; }
const r = await postApi('save_shop_config', { cart_backpack_rate: bp, cart_shulker_rate: sh, packmoney: pm, green_discount: gd });
toast(r.message || (r.success ? '已保存' : '保存失败'), r.success ? 'ok' : 'err');
if (r.success) updateCartCfgHint();
diff --git a/api/admin.php b/api/admin.php
index 2db2abe..0aa1194 100644
--- a/api/admin.php
+++ b/api/admin.php
@@ -329,11 +329,11 @@ function adminSaveShopConfig() {
$saved['packmoney'] = $pm;
}
- // 环保单减免百分比(0=不减免;命令 setgreen 10 亦为不减免)
+ // 环保单折扣率(折数):10=不打折,9.9=9.9折;命令 setgreen 10 亦为不打折
$gd = getParam('green_discount');
if ($gd !== null) {
$gd = (float)$gd;
- if ($gd < 0 || $gd > 9.99) error('环保单减免需介于 0 ~ 9.99 之间');
+ if ($gd < 0 || $gd > 10) error('环保单折扣(折数)需介于 0 ~ 10 之间');
$upsert->bindValue(':k', 'green_discount', SQLITE3_TEXT);
$upsert->bindValue(':v', number_format($gd, 2, '.', ''), SQLITE3_TEXT);
$upsert->execute();
diff --git a/api/shop.php b/api/shop.php
index 4737d5f..45b4f81 100644
--- a/api/shop.php
+++ b/api/shop.php
@@ -294,7 +294,7 @@ function cartConfig() {
'backpack_rate' => (float)($cfg['cart_backpack_rate'] ?? '0.98'),
'shulker_rate' => (float)($cfg['cart_shulker_rate'] ?? '1.00'),
'packmoney' => (float)($cfg['packmoney'] ?? '5'),
- 'green_discount' => (float)($cfg['green_discount'] ?? '2')
+ 'green_discount' => (float)($cfg['green_discount'] ?? '10')
]);
}
@@ -390,8 +390,8 @@ function shopBuyCart($token) {
$modeName = '塞背包(环保单)';
$colorFee = 0;
$colorName = '';
- // 环保单减免:不打包/塞背包时按配置比例减免(与游戏内"不打包"一致)
- $ecoPct = (float)($cfg['green_discount'] ?? '2');
+ // 环保单折扣率(折数):10=不打折,9.9=9.9折(支付99%),与游戏内"不打包"一致
+ $ecoPct = (float)($cfg['green_discount'] ?? '10');
}
$db = getDB();
@@ -418,9 +418,10 @@ function shopBuyCart($token) {
}
unset($p);
- // 先按费率计算,再叠加环保单减免(不打包/塞背包),最后加颜色打包费
+ // 先按费率计算,再叠加环保单折扣(不打包/塞背包,折扣率为折数),最后加颜色打包费
+ // green_discount 语义:10=不打折,9.9=9.9折(×0.99),9.8=9.8折(×0.98)
$baseAfterRate = (int)round($subtotal * $rate);
- if ($ecoPct > 0) $baseAfterRate = (int)round($baseAfterRate * (100 - $ecoPct) / 100);
+ if ($ecoPct > 0) $baseAfterRate = (int)round($baseAfterRate * $ecoPct / 10);
$totalPrice = $baseAfterRate + $colorFee;
$saved = $subtotal - $totalPrice; // 折扣省下的(潜影盒加价+颜色费时为负)
diff --git a/api/sync.php b/api/sync.php
index fb9fdb7..70e26f3 100644
--- a/api/sync.php
+++ b/api/sync.php
@@ -2819,7 +2819,7 @@ function getShopConfigSync() {
};
success([
'packmoney' => (float)$read('packmoney', '5'),
- 'green_discount' => (float)$read('green_discount', '2')
+ 'green_discount' => (float)$read('green_discount', '10')
]);
}
@@ -2839,7 +2839,7 @@ function setShopConfigSync() {
if ($v < 0 || $v > 999) error('打包费需介于 0 ~ 999');
} else {
$v = (float)$value;
- if ($v < 0 || $v > 9.99) error('环保单减免需介于 0 ~ 9.99');
+ if ($v < 0 || $v > 10) error('环保单折扣(折数)需介于 0 ~ 10');
}
$db = getDB();
diff --git a/cashier.php b/cashier.php
index b3017cc..39204fa 100644
--- a/cashier.php
+++ b/cashier.php
@@ -13,13 +13,13 @@ function cashierGetConfig() {
$db = getDB();
$stmt = $db->prepare("SELECT cfg_key, cfg_value FROM shop_config WHERE cfg_key IN ('packmoney','green_discount','cart_backpack_rate','cart_shulker_rate')");
$result = $stmt->execute();
- $map = ['packmoney' => 5, 'green_discount' => 2, 'cart_backpack_rate' => '0.98', 'cart_shulker_rate' => '1.00']; // 默认值
+ $map = ['packmoney' => 5, 'green_discount' => 10, 'cart_backpack_rate' => '0.98', 'cart_shulker_rate' => '1.00']; // 默认值
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$map[$row['cfg_key']] = $row['cfg_value'];
}
return $map;
} catch (Exception $e) {
- return ['packmoney' => 5, 'green_discount' => 2, 'cart_backpack_rate' => '0.98', 'cart_shulker_rate' => '1.00'];
+ return ['packmoney' => 5, 'green_discount' => 10, 'cart_backpack_rate' => '0.98', 'cart_shulker_rate' => '1.00'];
}
}
$cfg = cashierGetConfig();
@@ -581,14 +581,16 @@ async function recalc() {
});
const rate = RATES[settlement];
let afterRate = Math.round(subtotal * rate);
- // ★ 环保单减免:用 ?? 代替 ||,避免 green_discount=0 被当 falsy 回退
- const ecoPctVal = STATE.green_discount ?? 0;
+ // ★ 环保单折扣(折数):green_discount=10 不打折,9.9=9.9折(支付99%);用 ?? 避免=0 被当 falsy
+ const ecoPctVal = STATE.green_discount ?? 0; // 折数(如 9.9)
let ecoPct = 0;
let ecoAmt = 0;
if (settlement === 'backpack') ecoPct = ecoPctVal;
if (ecoPct > 0) {
- ecoAmt = afterRate - Math.round(afterRate * (100 - ecoPct) / 100);
- afterRate -= ecoAmt;
+ // 折扣率语义:折后 = 原价 × 折数/10(9.9折→×0.99)
+ const ecoDiscounted = Math.round(afterRate * ecoPct / 10);
+ ecoAmt = afterRate - ecoDiscounted;
+ afterRate = ecoDiscounted;
}
let colorFee = 0;
const sc = document.getElementById('shulkerColor').value;
@@ -608,7 +610,7 @@ async function recalc() {
document.getElementById('summary').innerHTML = `
商品小计${subtotal} 债券
${settlement==='shulker'?'潜影盒费率':'背包费率'} (${rate*100}%)${colorFee?('+'+colorFee):''}
- ${ecoPct>0?`
环保单减免 ${ecoPct}%-${ecoAmt} 债券
`:''}
+ ${ecoPct>0?`
环保单 ${ecoPct}折-${ecoAmt} 债券
`:''}
应收原价${total} 债券
手动折扣 ${discount}%-${discAmt} 债券
${payMode === 'cash' ? '
💵 现金收款模式仅记账,不扣债券
' : ''}