From 1b725587e821cdae1809d1a0a846931e9af587ce Mon Sep 17 00:00:00 2001 From: Billy <641833868@qq.com> Date: Fri, 24 Oct 2025 10:19:01 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=AF=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/model/shopro/goods/Goods.php | 94 ++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/application/admin/model/shopro/goods/Goods.php b/application/admin/model/shopro/goods/Goods.php index 601334a..7fe1aef 100644 --- a/application/admin/model/shopro/goods/Goods.php +++ b/application/admin/model/shopro/goods/Goods.php @@ -35,7 +35,10 @@ class Goods extends Common protected $append = [ 'status_text', 'type_text', - 'dispatch_type_text' + 'dispatch_type_text', + 'score_discount_percent', + 'max_use_score', + 'score_exchange_rate' ]; @@ -526,6 +529,95 @@ class Goods extends Common return $this->hasMany(ScoreSkuPrice::class, 'goods_id')->removeOption('soft_delete')->whereNotNull('deletetime'); // 只查被删除的记录,这里使用 onlyTrashed 报错 } + /** + * 获取积分抵扣百分比 + * + * @param mixed $value + * @param array $data + * @return int + */ + public function getScoreDiscountPercentAttr($value, $data) + { + // TODO: 后续应该从系统配置中读取,目前硬编码为90% + return 90; + } + + /** + * 获取积分兑换率(多少积分=1元) + * + * @param mixed $value + * @param array $data + * @return int + */ + public function getScoreExchangeRateAttr($value, $data) + { + // TODO: 后续应该从系统配置中读取,目前硬编码为700分=1元 + return 700; + } + + /** + * 获取最高可使用积分 + * 计算公式:商品实际销售价 * 积分抵扣百分比 * 积分兑换率 + * 例如:¥159.00 * 90% * 700 = 100,170积分 + * + * 注意: + * 1. 积分向下取整(不四舍五入,避免超出实际可用) + * 2. 建行最低积分门槛:700积分 = 1元 + * 3. 价格低于1元的商品返回0(不支持积分抵扣) + * + * @param mixed $value + * @param array $data + * @return int + */ + public function getMaxUseScoreAttr($value, $data) + { + // 建行最低积分门槛:700积分 = 1元(TODO: 应该从配置读取) + $minScoreThreshold = 700; + + // 获取商品实际销售价格(可能是活动价或原价) + $price = 0; + + // 方法1:尝试通过 price 获取器获取(会自动处理活动价) + // 注意:getPriceAttr 返回的是数组,格式为 [min_price] 或 [min_price, max_price] + try { + $priceAttr = $this->price; // 触发 getPriceAttr 获取器 + if (is_array($priceAttr) && count($priceAttr) > 0) { + // 取最低价作为积分计算基准(用户一般按最低价下单) + $price = floatval($priceAttr[0]); + } + } catch (\Exception $e) { + // 获取器执行失败,使用原始价格 + } + + // 方法2:如果方法1失败,回退到原始价格 + if ($price == 0 && isset($data['price'])) { + $price = floatval($data['price']); + } + + // 如果价格为0或负数,返回0积分 + if ($price <= 0) { + return 0; + } + + // 计算最高可使用积分 + // 公式:价格 * 抵扣百分比(90%) * 兑换率(700分/元) + $discountPercent = $this->score_discount_percent / 100; // 90% = 0.9 + $exchangeRate = $this->score_exchange_rate; // 700 + + $maxScore = $price * $discountPercent * $exchangeRate; + + // 向下取整(floor),避免四舍五入导致超出实际可用积分 + // 例如:6.9积分 -> 6积分(不是7积分) + $maxScore = (int)floor($maxScore); + + // 如果低于最低门槛,返回0(不支持积分抵扣) + if ($maxScore < $minScoreThreshold) { + return 0; + } + + return $maxScore; + } + // -- commission code start -- public function commissionGoods() {