select(); } /** * 根据订单物流单号查询配送记录 * @param string $orderCoding 订单编号 * @param string $com 快递公司编号,一律小写 * @param string $nu 快递单号 * @return array|Model|null * @throws DataNotFoundException * @throws DbException * @throws ModelNotFoundException */ public function findExpressLogByNu(string $orderCoding, string $com, string $nu) { $whereMap = ['coding' => $orderCoding, 'nu' => $nu, 'com' => $com]; return OrderExpress::where($whereMap)->find(); } /** * 写入订单物流配送记录 * * @param string $orderCoding 订单编号 * @param string $com 快递公司编号,一律小写 * @param string $nu 快递单号 * @param array $data 快递100查询返回的数据 * @throws RepositoryException */ public function setExpressLog(string $orderCoding, string $com, string $nu, array $data) { try { if (empty($data)) { throw new RepositoryException('快递配送明细查询失败'); } $state = 0; $content = ''; if (isset($data['result']) && $data['result'] === false) { throw new RepositoryException($data['message'] ?? '快递配送明细查询失败'); } else { $state = $data['state'] ?? 0; $content = json_encode($data['data'] ?? [], JSON_UNESCAPED_UNICODE); } $expr = $this->findExpressLogByNu($orderCoding, $com, $nu); if (empty($expr)) { OrderExpress::create([ 'coding' => $orderCoding, 'nu' => $nu, 'com' => $com, 'state' => $state, 'content' => $content, 'created_at' => date('Y-m-d H:i:s'), ]); } else { OrderExpress::updateById($expr['id'], [ 'state' => $state, 'content' => $content, 'updated_at' => date('Y-m-d H:i:s'), ]); } } catch (\Exception $e) { OrderRepository::log('订单快递配送记录写入失败', $e, 'error', 'order'); throw new RepositoryException('订单快递配送记录写入失败'); } catch (RepositoryException $e) { throw $e; } } /** * 查询订单快递配送记录,并写入 * * @param string $orderCoding * @param string $com * @param string $nu * @return array */ public function handleOrderExpressLog(string $orderCoding, string $com, string $nu): array { $com = strtolower($com); $list = []; $list['com'] = $com; $list['nu'] = $nu; try { $expressInfo = Kd100::query($com, $nu, true); if ($expressInfo) { $this->setExpressLog($orderCoding, $com, $nu, $expressInfo); if (isset($expressInfo['result']) && $expressInfo['result'] === false) { $list['status'] = $expressInfo['returnCode']; $list['state'] = 0; $list['state_desc'] = $expressInfo['message']; $list['data'] = []; } else { $list['status'] = 200; $list['state'] = $expressInfo['state']; $list['state_desc'] = Kd100::state()[$expressInfo['state']] ?? ''; $list['data'] = $expressInfo['data'] ?? []; } } unset($expressInfo); } catch (RepositoryException | \Exception $e) { } return $list; } }