Express.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. namespace addons\shopro\library\express;
  3. use think\exception\HttpResponseException;
  4. use app\admin\model\shopro\order\Express as ExpressModel;
  5. class Express
  6. {
  7. /**
  8. * 快递驱动
  9. */
  10. protected $driver = null;
  11. public function __construct($driver = '')
  12. {
  13. $this->driver = $driver ? $driver : sheep_config('shop.dispatch.driver');
  14. }
  15. /**
  16. * 提供器
  17. *
  18. * @param string $type
  19. * @return Base
  20. */
  21. public function provider($driver = null)
  22. {
  23. $driver = $driver ?: $this->getDefaultDriver();
  24. $class = "\\addons\\shopro\\library\\express\\provider\\" . \think\helper\Str::studly($driver);
  25. if (class_exists($class)) {
  26. return new $class($this);
  27. }
  28. error_stop('物流平台类型不支持');
  29. }
  30. /**
  31. * 更新订单的所有包裹
  32. *
  33. * @param mixed $orderExpress
  34. * @return void
  35. */
  36. public function updateOrderExpress($orderExpress = 0)
  37. {
  38. try {
  39. if ($this->driver == 'thinkapi') {
  40. // thinkapi 才需要查询
  41. if (is_numeric($orderExpress)) {
  42. $orderExpresses = ExpressModel::where('order_id', $orderExpress)->select();
  43. }
  44. foreach ($orderExpresses as $key => $orderExpress) {
  45. $this->updateExpress($orderExpress);
  46. }
  47. }
  48. } catch (HttpResponseException $e) {
  49. $data = $e->getResponse()->getData();
  50. $message = $data ? ($data['msg'] ?? '') : $e->getMessage();
  51. format_log_error($e, 'updateOrderExpress.HttpResponseException', $message);
  52. } catch(\Exception $e) {
  53. format_log_error($e, 'updateOrderExpress.HttpResponseException', '获取物流信息错误');
  54. }
  55. }
  56. /**
  57. * 更新单个包裹
  58. *
  59. * @param \think\Model $orderExpress
  60. * @return void
  61. */
  62. public function updateExpress($orderExpress)
  63. {
  64. if ($this->driver == 'thinkapi' && $orderExpress->status != 'signfor') {
  65. // thinkapi 并且是未签收的包裹才更新
  66. $key = 'express:' . $orderExpress->id . ':code:' . $orderExpress->express_no; // 包裹 id 拼上 运单号
  67. if (cache('?'.$key)) {
  68. return true;
  69. }
  70. // 查询物流信息,并且更新 express_log
  71. $this->provider()->search([
  72. 'order_id' => $orderExpress['order_id'],
  73. 'express_code' => $orderExpress['express_code'],
  74. 'express_no' => $orderExpress['express_no']
  75. ], $orderExpress);
  76. // 缓存 300 秒
  77. cache($key, time(), 300);
  78. }
  79. return true;
  80. }
  81. /**
  82. * 默认快递物流驱动
  83. *
  84. * @return void
  85. */
  86. public function getDefaultDriver()
  87. {
  88. return $this->driver;
  89. }
  90. public function __call($funcname, $arguments)
  91. {
  92. return $this->provider()->{$funcname}(...$arguments);
  93. }
  94. }