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];
 | |
|     }
 | |
| } |