Состояние рефакторинга с использованием коллекции? - PullRequest
0 голосов
/ 19 сентября 2018

Есть ли способ рефакторинга calculateState() метода, чтобы он выглядел немного чище и, возможно, с использованием коллекции Laravel?

Он рассчитывает состояние результата для отправленного количества, количество возврата для отсутствия на складе и количество возврата для возврата.

Должно уменьшиться $this->dispatchedQty, если было возвращено ("Code": "Return")

Ввод Json:

$json = '{
      "HistoryState": [
       {
          "Name": "Dispatched",
          "Num": 3
       },
       {
          "Name": "Refunding",
          "Num": 1,
          "Code": "NotInStock"
       },
       {
          "Name": "Refunding",
          "Num": 1,
          "Code": "Return"
       } 
      ]
 }';

$statusItem = new App\Services\State($json);

Ожидаемый вывод:

2Отправлено

1 Возврат отсутствует на складе

1 Возвращено

class State
{
    protected $state;

    protected $dispatchedQty = 0;
    protected $refundNotInStockQty = 0;
    protected $refundReturnQty = 0;

    public function __construct($json)
    {
        $object = json_decode($json);
        $this->state = $object->HistoryState;
        $this->calculateState();
    }

    protected function calculateState()
    {
        foreach($this->state as $state) {
            if ($state->Name == "Dispatched") {
                $this->dispatchedQty+=  $state->Num;
            }

            if ($state->Name == "Refunding") {
                if ($state->Code == "NotInStock") {
                    $this->refundNotInStockQty += $state->Num;
                } else {
                    $this->refundReturnQty += $state->Num;
                    $this->dispatchedQty -=  $state->Num;
                }
            }
        }

        dd($this->dispatchedQty, $this->refundNotInStockQty, $this->refundReturnQty );
    }
}

1 Ответ

0 голосов
/ 19 сентября 2018

Во-первых, вы можете работать с коллекцией Laravel, которая является довольно мощной и действительно полезной.

Вы можете конвертировать коллекцию из объекта типа json.

Давайте начнем шаг за шагом. Шаг 1: Давайте сначала поработаем с конструктором.

public function __construct($json)
{
    $object = json_decode($json);
    //Convert it to collection
    $this->state = collect($object->HistoryState);
    $this->calculateState();
}

Шаг 2: Далее Перефразируйте ваш метод Calculate.

protected function calculateState()
{
    $stateGroupByName = $this->state->groupBy(["Name", "Code"]);
    dd(
        $stateGroupByName["Dispatched"]->first()->sum('Num'), //Total DispatchedQty
        $stateGroupByName["Refunding"]["Return"]->sum('Num'), //Total ReturnedQty
        $stateGroupByName["Refunding"]["NotInStock"]->sum('Num'), //Total Not instock
    );
}

Вот и все,Настройте ваш код согласно вашему требованию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...