EnableDeductionService.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Name: 芸众商城系统
  5. * Author: 广州市芸众信息科技有限公司
  6. * Profile: 广州市芸众信息科技有限公司位于国际商贸中心的广州,专注于移动电子商务生态系统打造,拥有芸众社交电商系统、区块链数字资产管理系统、供应链管理系统、电子合同等产品/服务。官网 :www.yunzmall.com www.yunzshop.com
  7. * Date: 2022/3/1
  8. * Time: 14:51
  9. */
  10. namespace app\frontend\modules\deduction;
  11. use app\frontend\models\Member;
  12. use app\frontend\models\MemberCoin;
  13. use app\common\exceptions\AppException;
  14. use app\common\modules\orderGoods\models\PreOrderGoods;
  15. use app\framework\Database\Eloquent\Collection;
  16. use app\frontend\models\order\PreOrderDeduction;
  17. use app\frontend\models\order\PreOrderDiscount;
  18. use app\frontend\modules\deduction\models\Deduction;
  19. use app\frontend\modules\order\models\PreOrder;
  20. class EnableDeductionService
  21. {
  22. protected $deductions;
  23. protected $instances = [];
  24. protected static $instance = null;
  25. private function __construct(){}
  26. /**
  27. * 单例缓存
  28. * @return null|self
  29. */
  30. public static function getInstance()
  31. {
  32. if (!isset(self::$instance)) {
  33. self::$instance = new self();
  34. }
  35. return self::$instance;
  36. }
  37. /**
  38. * 开启的抵扣项
  39. * @return Collection
  40. */
  41. public function getEnableDeductions(PreOrder $preOrder)
  42. {
  43. //blank not deduction
  44. if ($preOrder->isDeductionDisable()) {
  45. trace_log()->deduction('订单关闭的抵扣类型','');
  46. return collect();
  47. }
  48. $deductions = $this->getDeductions($preOrder);
  49. $sort = array_flip($preOrder->getParams('deduction_ids'));
  50. $deductions = $deductions->sortBy(function ($deduction) use ($sort) {
  51. return array_get($sort, $deduction->code, 999);
  52. });
  53. return $deductions;
  54. }
  55. protected function getDeductions(PreOrder $preOrder)
  56. {
  57. if (!isset($this->deductions)) {
  58. /**
  59. * 商城开启的抵扣
  60. * @var Collection $deductions
  61. */
  62. $deductions = Deduction::getEnable();
  63. trace_log()->deduction('开启的抵扣类型', $deductions->pluck('code')->toJson());
  64. if ($deductions->isEmpty()) {
  65. return collect();
  66. }
  67. // 过滤调无效的
  68. $deductions = $deductions->filter(function (Deduction $deduction) use ($preOrder) {
  69. /**
  70. * @var MemberCoin $memberCoin
  71. */
  72. $memberCoin = $deduction->memberCoin($preOrder->belongsToMember);
  73. if ($memberCoin) {
  74. $this->setMemberCoin($deduction->getCode(), $memberCoin);
  75. }
  76. /**
  77. * @var Deduction $deduction
  78. */
  79. return $deduction->valid() && $memberCoin && $memberCoin->useLimit();
  80. });
  81. $this->deductions = $deductions;
  82. }
  83. return $this->deductions;
  84. }
  85. protected function setMemberCoin($code, $class)
  86. {
  87. if (!$this->instances[$code]) {
  88. $this->instances[$code] = $class;
  89. }
  90. }
  91. //缓存抵扣用户模型
  92. //解决分单每个订单都独立获取用户抵扣值模型问题
  93. public function getMemberCoin($code)
  94. {
  95. if ($this->instances[$code]) {
  96. return $this->instances[$code];
  97. }
  98. trace_log()->deduction('抵扣不存在:'.$code,"");
  99. //这里以防万一没有缓存,重新获取
  100. return app('CoinManager')->make('MemberCoinManager')->make($code, [Member::current()]);
  101. }
  102. }