78 lines
2.0 KiB
PHP
Executable File
78 lines
2.0 KiB
PHP
Executable File
<?php
|
|
|
|
namespace app\service\order;
|
|
|
|
use app\exception\ServiceException;
|
|
use app\service\Math;
|
|
use think\facade\Config as CConfig;
|
|
|
|
class Compute
|
|
{
|
|
/**
|
|
* 分销配置
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function configSales(): array
|
|
{
|
|
CConfig::load('extra/sales', 'sales');
|
|
return config('sales') ?? [];
|
|
}
|
|
|
|
/**
|
|
* 查询积分抵扣金额
|
|
*
|
|
* @param int $score
|
|
* @return float
|
|
* @throws \app\exception\ServiceException
|
|
*/
|
|
public static function score2price(int $score): float
|
|
{
|
|
list($rateScore, $ratePrice) = self::checkScoreDeduct();
|
|
|
|
return (Math::mul($score, Math::div($ratePrice, $rateScore)));
|
|
}
|
|
|
|
/**
|
|
* 查询金额需要多少积分
|
|
*
|
|
* @param float $price
|
|
* @return int 积分必须为正整数,因此向上取整
|
|
* @throws \app\exception\ServiceException
|
|
*/
|
|
public static function price2score(float $price): int
|
|
{
|
|
list($rateScore, $ratePrice) = self::checkScoreDeduct();
|
|
$score = (Math::mul($price, Math::div($rateScore, $ratePrice)));
|
|
|
|
return ceil($score);
|
|
}
|
|
|
|
/**
|
|
* 返回积分抵扣配置值
|
|
*
|
|
* @return int[]
|
|
* @throws \app\exception\ServiceException
|
|
*/
|
|
public static function checkScoreDeduct(): array
|
|
{
|
|
$config = self::configSales();
|
|
$rate = $config['score_deduct_price'] ?? '10:1';//默认是积分:金额 10:1
|
|
$rateArr = explode(':', $rate);
|
|
if (count($rateArr) !== 2) {
|
|
throw new ServiceException('积分兑换比例配置错误');
|
|
}
|
|
|
|
$rateScore = (int) $rateArr[0];
|
|
$ratePrice = (int) $rateArr[1];
|
|
if ($rateScore <= 0 || $ratePrice <= 0) {
|
|
throw new ServiceException('积分兑换比例配置值必须大于零');
|
|
}
|
|
|
|
if (!is_int($rateScore) || $rateScore <= 0) {
|
|
throw new ServiceException('积分兑换比例配置中积分必须是正整数');
|
|
}
|
|
|
|
return [$rateScore, $ratePrice];
|
|
}
|
|
} |