| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- <?php
- /**
- * Created by PhpStorm.
- * User: shenyang
- * Date: 2019/1/23
- * Time: 10:03 AM
- */
- namespace app\frontend\modules\order;
- use app\common\exceptions\AppException;
- use Illuminate\Support\Collection;
- trait PriceNodeTrait
- {
- /**
- * @var Collection
- */
- public $priceCache;
- /**
- * @var Collection
- */
- private $priceNodes;
- /**
- * @return Collection
- */
- public function getPriceNodes()
- {
- if (!isset($this->priceNodes)) {
- $this->priceNodes = $this->_getPriceNodes();
- }
- return $this->priceNodes;
- }
- /**
- * 获取某个节点之后的价格
- * @param $key
- * @return mixed
- * @throws AppException
- */
- public function getPriceAfter($key)
- {
- if (!isset($this->priceCache[$key])) {
- // 找到对应的节点
- $priceNode = $this->getPriceNodes()->first(function (PriceNode $priceNode) use ($key) {
- return $priceNode->getKey() == $key;
- });
- if (!$priceNode) {
- throw new AppException("不存在的价格节点{$key}");
- }
- $this->priceCache[$key] = $priceNode->getPrice();
- }
- return $this->priceCache[$key];
- }
- public function getCurrentPrice()
- {
- if(!is_array($this->priceCache)){
- return $this->getPriceNodes()->first()->getPrice();
- }
- return array_last($this->priceCache);
- }
- /**
- * 获取某个节点之前的价格
- * @param $key
- * @return mixed
- * @throws AppException
- */
- public function getPriceBefore($key)
- {
- $nodeKey = '';
- $hasKey = false;
- foreach ($this->getPriceNodes() as $priceNode) {
- if ($priceNode->getKey() == $key) {
- $hasKey = true;
- break;
- }
- $nodeKey = $priceNode->getKey();
- }
- if(!$hasKey){
- throw new \Exception("没有key为{$key}的节点");
- }
- if (empty($nodeKey)) {
- throw new \Exception("没有{$key}更先计算的节点了");
- }
- return $this->getPriceAfter($nodeKey);
- }
- public function getPriceBeforeWeight($key)
- {
- $weight = 0;
- foreach ($this->getPriceNodes() as $priceNode) {
- //todo 主要是第一个抵扣会忽悠当前节点前一个节点的金额,所以这里返回当前节点排序
- //todo 使用大于判断会忽略与当前节点同一种排序数值的金额
- $weight = $priceNode->getWeight();
- if ($priceNode->getKey() == $key) {
- break;
- }
- // $weight = $priceNode->getWeight();
- }
- $nodeKey = $this->getPriceNodes()->filter(function ($priceNode) use ($weight) {
- return $priceNode->getWeight() < $weight;
- })->last()->getKey();
- if (empty($nodeKey)) {
- throw new \Exception("没有比{$weight}权重更小节点了");
- }
- return $this->getPriceAfter($nodeKey);
- }
- /**
- * 验证某个节点是否已存在
- * @param $key
- * @return bool true 存在 false 不存在
- */
- public function verifyPriceNodes($key)
- {
- // 找到对应的节点
- $priceNode = $this->getPriceNodes()->first(function (PriceNode $priceNode) use ($key) {
- return $priceNode->getKey() == $key;
- });
- if (!$priceNode) {
- return false;
- }
- return true;
- }
- }
|