78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?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];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |