This commit is contained in:
Billy 2025-10-24 10:19:01 +08:00
parent f917f62010
commit 1b725587e8

View File

@ -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()
{