| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- <?php
- namespace common\components\delivery\services;
- use common\components\delivery\services\adapter\{ ShansongAdapter, HuolalaAdapter, FengniaoAdapter}; // MeituanAdapter, DadaAdapter, SFAdapter, UUAdapter,
- use common\components\delivery\models\{DeliveryOrder, DeliveryAccount};
- use Yii;
- /**
- * 聚合调度逻辑(平台选择/优先级)
- * Class DispatchService
- * @package App\Services
- */
- class DispatchService
- {
- protected $adapters;
- public function __construct()
- {
- $this->adapters = [
- //'meituan' => new MeituanAdapter(),
- //'dada' => new DadaAdapter(),
- //'sf' => new SFAdapter(),
- //'uu' => new UUAdapter(),
- 'shansong' => new ShansongAdapter(),
- //'huolala' => new HuolalaAdapter(),
- //'fengniao' => new FengniaoAdapter(),
- ];
- }
- /**
- * 发单调度
- */
- public function createOrder($mainId, $orderData)
- {
- $merchantAccount = DeliveryAccount::where('mainId', $mainId)
- ->where('is_active', 1)
- ->first();
- // 优先使用商户自配
- if ($merchantAccount) {
- $adapter = $this->adapters[$merchantAccount->platform];
- return $adapter->createOrder($merchantAccount, $orderData);
- }
- // 否则使用平台优惠价策略调度
- $platform = $this->getBestPlatform($orderData);
- $adapter = $this->adapters[$platform];
- return $adapter->createOrder($orderData);
- }
- protected function getBestPlatform($orderData)
- {
- // 简化策略:根据距离、重量、历史价格动态选择
- $candidates = ['shansong']; //'meituan', 'dada', 'sf', 'uu'
- return $candidates[array_rand($candidates)];
- }
- public function getBestPlatformByPrice($orderData)
- {
- $results = [];
- $accessToken = '';
- foreach ($this->adapters as $name => $adapter) {
- try {
- $quote = $adapter->getPrice($orderData, $accessToken);
- if ($quote) {
- $results[] = $quote;
- }
- } catch (\Exception $e) {
- Yii::warning("报价失败: {$name} - {$e->getMessage()}");
- }
- }
- if (empty($results)) {
- return ['error' => '全部平台报价失败'];
- }
- // 排序,选择最低价
- usort($results, function($a, $b) {
- return $a['price'] <=> $b['price'];
- });
- // 返回所有报价供前端展示
- return [
- 'quotes' => $results,
- 'best' => $results[0],
- ];
- }
- }
|