bugviktor90/delivery-calculator

该软件包最新版本(v1.0.0)没有提供许可证信息。

配送计算器

v1.0.0 2021-02-23 09:24 UTC

This package is not auto-updated.

Last update: 2024-10-03 01:20:42 UTC


README

任务

需要设计一个在线商店的配送计算模块。该模块应提供两种方式获取配送信息:

  • 使用一个特定的配送服务
  • 使用所有可用的配送服务

原始数据

在设定任务时,计划与两个外部配送服务进行集成。

服务A

配送服务API接收以下参数作为输入:

  • 寄件人地址
  • 收件人地址
  • 元素列表(对于每个元素:重量,长x宽x高)

返回:

  • 配送成本
  • 从今天开始的天数

服务B

配送服务API接收以下参数作为输入:

  • 寄件人地址
  • 收件人地址
  • 元素列表(对于每个元素:重量,长x宽x高,数量)

返回:

  • 成本系数。与服务A不同,服务B有一个基础配送成本,例如150卢布,最终配送价格为基础成本乘以系数。
  • 配送日期

结果

测试任务的结果应该是类和接口的结构,从中可以清楚地了解以下内容:

  • 如何从客户端代码中使用模块
  • 模块中的每个元素对应什么任务
  • 模块的元素如何相互关联

安装

composer require bugviktor90/delivery-calculator

使用现成的模块

创建请求

$request = new Request(
    'г. Москва, ул. 1905 года, 1',              //адрес отправителя
    'г. Новосибирск, ул. Ленина, 1',            //адрес получателя
    [
        new RequestItem(100, 200, 300, 5.5, 5), //позиция 1. Ширина 100мм, Длина 200мм, Высота 300мм, Вес 5.5кг, 5 штук
        new RequestItem(1000, 500, 400, 20)     //позиция 2. Ширина 1000мм, Длина 500мм, Высота 400мм, Вес 20кг, 1 штука
    ]
);

设置计算器

选项1

//создаем калькулятор
$deliveryCalculator = new Calculator();
//добавляем нужные провайдеры по мере необходимости
$deliveryCalculator->addProvider(new AProvider());
//провайдер может принимать нужные настройки
$deliveryCalculator->addProvider(new BProvider(['url' => 'http://someurl.com/api']));

选项2

//создаем провайдер A
$aProvider = new AProvider([
    'url' => 'http://someurl.com/api', 
    'accessKey' => 'someAccessKey', 
    'clientId' => 'someClientId'
]);

//создаем провайдер B
$bProvider = new BProvider(['url' => 'http://anotherurl/api/delivery']);
//создаем калькулятор и сразу устанавливаем нужные провайдеры
$deliveryCalculator = new Calculator([$aProvider, $bProvider]);

//решили добавить еще один провайдер
$localProvider = new LocalProvider(['volumeRate' => 3000, 'weightRate' => 10]);
$deliveryCalculator->addProvider($localProvider);

//и удалить ненужный
$deliveryCalculator->removeProvider($bProvider);

获取结果

//получить результат для всех установленных провайдеров
$result = $deliveryCalculator->calculateAll($request);

//получить результат для конкретного провайдера
$result = $deliveryCalculator->calculate($request, $aProvider);

处理结果

工作结果是DeliveryCalculator\Result\Result类的对象。

//пример возвращаемого объекта, при работе с двумя провайдерами
DeliveryCalculator\Result\Result Object
(
    [items:protected] => Array
        (
            [DeliveryCalculator\Providers\AProvider] => DeliveryCalculator\Result\ResultItem Object
                (
                    [cost:protected] => 850
                    [date:protected] => DateTime Object
                        (
                            [date] => 2021-03-05 08:23:56.283472
                            [timezone_type] => 3
                            [timezone] => UTC
                        )

                )

            [DeliveryCalculator\Providers\BProvider] => DeliveryCalculator\Result\ResultItem Object
                (
                    [cost:protected] => 1400
                    [date:protected] => DateTime Object
                        (
                            [date] => 2021-03-10 00:00:00.000000
                            [timezone_type] => 3
                            [timezone] => UTC
                        )

                )
        )
)

//получение минимальной стоимости доставки
$result->getMinCost();

//получение минимальной даты доставки
$result->getMinDate();

主要实体

  • DeliveryCalculator\Calculator - 配送计算器
  • DeliveryCalculator\Request\Request - 配送计算请求
  • DeliveryCalculator\Request\Item - 配送计算请求中的项目
  • DeliveryCalculator\Providers\Provider - 配送服务提供商
  • DeliveryCalculator\Providers\Converters\Converter - 转换器,将来自提供商的数据转换为可用的格式
  • DeliveryCalculator\Result\Result - 配送计算结果
  • DeliveryCalculator\Result\ResultItem - 特定提供商的配送计算结果