90 lines
2.8 KiB
PHP
90 lines
2.8 KiB
PHP
<?php
|
||
|
||
namespace app\api\service\coupon;
|
||
|
||
use app\common\library\helper;
|
||
|
||
class GoodsDeduct
|
||
{
|
||
private $actualReducedMoney;
|
||
|
||
public function setGoodsCouponMoney($goodsList, $reducedMoney)
|
||
{
|
||
// 统计订单商品总金额,(单位分)
|
||
$orderTotalPrice = 0;
|
||
foreach ($goodsList as &$goods) {
|
||
$goods['total_price'] *= 100;
|
||
$orderTotalPrice += $goods['total_price'];
|
||
}
|
||
// 计算实际抵扣金额
|
||
$this->setActualReducedMoney($reducedMoney, $orderTotalPrice);
|
||
// 实际抵扣金额为0,
|
||
if ($this->actualReducedMoney > 0) {
|
||
// 计算商品的价格权重
|
||
$goodsList = $this->getGoodsListWeight($goodsList, $orderTotalPrice);
|
||
// 计算商品优惠券抵扣金额
|
||
$this->setGoodsListCouponMoney($goodsList);
|
||
// 总抵扣金额
|
||
$totalCouponMoney = helper::getArrayColumnSum($goodsList, 'coupon_money');
|
||
$this->setGoodsListCouponMoneyFill($goodsList, $totalCouponMoney);
|
||
$this->setGoodsListCouponMoneyDiff($goodsList, $totalCouponMoney);
|
||
}
|
||
return $goodsList;
|
||
}
|
||
|
||
public function getActualReducedMoney()
|
||
{
|
||
return $this->actualReducedMoney;
|
||
}
|
||
|
||
private function setActualReducedMoney($reducedMoney, $orderTotalPrice)
|
||
{
|
||
$reducedMoney *= 100;
|
||
$this->actualReducedMoney = ($reducedMoney >= $orderTotalPrice) ? $orderTotalPrice - 1 : $reducedMoney;
|
||
}
|
||
|
||
private function arraySortByWeight($goodsList)
|
||
{
|
||
return array_sort($goodsList, 'weight', true);
|
||
}
|
||
|
||
private function getGoodsListWeight($goodsList, $orderTotalPrice)
|
||
{
|
||
foreach ($goodsList as &$goods) {
|
||
$goods['weight'] = $goods['total_price'] / $orderTotalPrice;
|
||
}
|
||
return $this->arraySortByWeight($goodsList);
|
||
}
|
||
|
||
private function setGoodsListCouponMoney(&$goodsList)
|
||
{
|
||
foreach ($goodsList as &$goods) {
|
||
$goods['coupon_money'] = bcmul($this->actualReducedMoney, $goods['weight']);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
private function setGoodsListCouponMoneyFill(&$goodsList, $totalCouponMoney)
|
||
{
|
||
if ($totalCouponMoney === 0) {
|
||
$temReducedMoney = $this->actualReducedMoney;
|
||
foreach ($goodsList as &$goods) {
|
||
if ($temReducedMoney === 0) break;
|
||
$goods['coupon_money'] = 1;
|
||
$temReducedMoney--;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
private function setGoodsListCouponMoneyDiff(&$goodsList, $totalCouponMoney)
|
||
{
|
||
$tempDiff = $this->actualReducedMoney - $totalCouponMoney;
|
||
foreach ($goodsList as &$goods) {
|
||
if ($tempDiff < 1) break;
|
||
$goods['coupon_money']++ && $tempDiff--;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
} |