mirror of
https://gitee.com/liuxioabin/fengketrade.git
synced 2026-04-17 21:03:17 +08:00
积分
This commit is contained in:
parent
f917f62010
commit
1b725587e8
@ -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()
|
||||
{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user