| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- <?php
- /**
- * Created by PhpStorm.
- * User: Administrator
- * Date: 2020/8/20
- * Time: 16:55
- */
- namespace app\frontend\modules\order\taxFee;
- use app\common\modules\shop\ShopConfig;
- use Illuminate\Support\Collection;
- use app\frontend\models\order\PreOrderTaxFee;
- use app\frontend\modules\order\models\PreOrder;
- use app\frontend\modules\orderGoods\models\PreOrderGoods;
- class OrderTaxFeeManager
- {
- public $orderTaxFee;
- /**
- * @var PreOrder
- */
- protected $order;
- protected $taxFee;
- /**
- * OrderFee constructor.
- * @param PreOrder $order
- */
- public function __construct(PreOrder $order)
- {
- $this->order = $order;
- // 订单含税费集合
- $order->setRelation('orderTaxFees', new Collection());
- }
- public function getOrderTaxFees()
- {
- if (!isset($this->orderTaxFee)) {
- $orderTaxFees = $this->getEnableTaxFee()->map(function (BaseOrderTaxFee $taxFee) {
- $orderServiceFee = new PreOrderTaxFee();
- $orderServiceFee->init($taxFee, $this->order);
- return $orderServiceFee;
- });
- $this->orderTaxFee = $orderTaxFees;
- }
- return $this->orderTaxFee;
- }
- public function getEnableTaxFee()
- {
- if (!isset($this->taxFee)) {
- $this->taxFee = collect();
- $configs = ShopConfig::current()->get('shop-foundation.order-tax-fee');
- foreach ($configs as $configItem) {
- $class = call_user_func($configItem['class'], $this->order);
- if ($class->enable()) {
- $this->taxFee->put($configItem['key'], $class);
- }
- }
- }
- return $this->taxFee;
- }
- public function getAmount()
- {
- $this->addGoodsTaxFee();
- return $this->getOrderTaxFees()->sum(function (PreOrderTaxFee $orderTaxFee) {
- if ($orderTaxFee->getTaxFee()->isChecked()) {
- // 每一种含税费(可能是负数的优惠,也可能是正数的加钱,一切看配置)
- return $orderTaxFee->getTaxFee()->getAmount();
- }
- return 0;
- });
- }
- private function addGoodsTaxFee()
- {
- // 将所有订单商品的优惠
- $orderGoodsTaxFees = $this->order->orderGoods->reduce(function (Collection $result, PreOrderGoods $aOrderGoods) {
- return $result->merge($aOrderGoods->getOrderGoodsTaxFees());
- }, collect());
- $preOrderTaxFee = collect([]);
- // 按每个种类的优惠分组 求金额的和
- $orderGoodsTaxFees->each(function ($orderGoodsTaxFee) use ($preOrderTaxFee) {
- // 新类型添加
- if ($this->order->orderTaxFees->where('fee_code', $orderGoodsTaxFee->fee_code)->isEmpty()) {
- if ($preOrderTaxFee->where('discount_code', $orderGoodsTaxFee->fee_code)->isEmpty()) {
- $preTaxFee = new PreOrderTaxFee([
- 'fee_code' => $orderGoodsTaxFee->fee_code,
- 'amount' => $orderGoodsTaxFee->amount,
- 'name' => $orderGoodsTaxFee->name,
- ]);
- $preOrderTaxFee->push($preTaxFee);
- return;
- }
- // 已存在的类型累加
- $preOrderTaxFee->where('fee_code', $orderGoodsTaxFee->fee_code)->first()->amount += $orderGoodsTaxFee->amount;
- }
- });
- $preOrderTaxFee->each(function (PreOrderTaxFee $orderTaxFee) {
- $orderTaxFee->setOrder($this->order);
- });
- }
- /**
- * @param $code
- * @return BaseOrderTaxFee
- */
- public function getAmountByCode($code)
- {
- return $this->getEnableTaxFee()[$code];
- }
- }
|