2023-05-11 13:10:18 +08:00

292 lines
9.0 KiB
PHP

<?php
namespace Extend\Prescription;
use App\Constants\HttpEnumCode;
use App\Exception\BusinessException;
use App\Utils\Log;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Hyperf\Di\Annotation\Inject;
use Hyperf\Redis\Redis;
use Hyperf\Utils\ApplicationContext;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;
class Prescription
{
#[Inject]
protected ContainerInterface $container;
#[Inject]
protected Client $client;
#[Inject]
protected Redis $redis;
protected string $api_url;
protected string $client_id;
protected string $client_secret;
protected string $pharmacy_code;
protected array $header;
public string $version = "v1";
public function __construct(){
// 请求地址
$this->api_url = config('prescription_platform.api_url');
$this->client_id = config('prescription_platform.client_id');
$this->client_secret = config('prescription_platform.client_secret');
$this->pharmacy_code = config('prescription_platform.pharmacy_code');
$this->container = ApplicationContext::getContainer();
$this->client = $this->container->get(Client::class);
}
/**
* 获取token接口
* @return string token数据
*/
protected function getToken(): string
{
$option = [
"json" => array(
"clientId" => $this->client_id,
"clientSecret" => $this->client_secret,
)
];
try {
$response = $this->httpRequest($this->api_url . $this->version . '/user_thrid/token', $option);
if (empty($response['data'])){
// 返回值为空
if (!empty($response['message'])){
throw new BusinessException($response['message']);
}
throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR));
}
if (empty($response['data']['result'])){
// 返回值为空
throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR));
}
if (empty($response['data']['result']['token'])){
// 返回值为空
throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR));
}
} catch (GuzzleException $e) {
throw new BusinessException($e->getMessage());
}
$this->header = [
"Authorization" => "Bearer " . $response['data']['result']['token']
];
$this->redis->set("prescription_token",$response['data']['result']['token'],60 * 60 * 1.5);
return $response['data']['result']['token'];
}
/**
* 获取药品
* @param int $page
* @param int $pageSize
* @return mixed
*/
public function getProd(int $page = 1,int $pageSize = 10): mixed
{
$option = [
"json" => array(
"page" => $page,
"pageSize" => $pageSize,
),
];
try {
$response = $this->httpRequest($this->api_url . $this->version . '/drug/syncDrugCatalogue', $option);
if (empty($response['data'])){
// 返回值为空
if (!empty($response['message'])){
throw new BusinessException($response['message']);
}
throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR));
}
if (empty($response['data']['result'])){
// 返回值为空
throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR));
}
return $response['data']['result'];
} catch (GuzzleException $e) {
throw new BusinessException($e->getMessage());
}
}
/**
* 获取商品库存
* @param string $product_platform_code 处方平台商品编码(此处使用第三方药店商品编码!)
* @return array
*/
public function getProdStock(string $product_platform_code): array
{
$option = [
"json" => array(
"pharmacyCode" => $this->pharmacy_code,
"drugCode" => $product_platform_code,
),
];
try {
$response = $this->httpRequest($this->api_url . $this->version . '/pharmacy/pharmacyInventory', $option);
if (empty($response['data'])){
// 返回值为空
if (!empty($response['message'])){
throw new BusinessException($response['message']);
}
throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR));
}
return $response['data'];
} catch (GuzzleException $e) {
throw new BusinessException($e->getMessage());
}
}
/**
* 获取运费
* @return array
*/
public function getLogisticsFee(): array
{
$option = [
"json" => array(
"pharmacyCode" => $this->pharmacy_code,
),
];
try {
$response = $this->httpRequest($this->api_url . $this->version . '/pharmacy/transportationExpenses', $option);
if (empty($response['data'])){
// 返回值为空
if (!empty($response['message'])){
throw new BusinessException($response['message']);
}
throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR));
}
return $response['data'];
} catch (GuzzleException $e) {
throw new BusinessException($e->getMessage());
}
}
/**
* 上报处方
* @param array $arg
* @return array
*/
public function reportPrescription(array $arg): array
{
$option = [
"json" => $arg
];
try {
$response = $this->httpRequest($this->api_url . $this->version . '/preOrder/receivePreOrder', $option);
if (empty($response)){
// 返回值错误为空
throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR));
}
return $response;
} catch (GuzzleException $e) {
throw new BusinessException($e->getMessage());
}
}
/**
* 获取处方订单
* @param string $order_product_no 商品订单号
* @param string $prescription_code 处方单号
* @return array
*/
public function getPrescription(string $order_product_no,string $prescription_code): array
{
$option = [
"json" => [
"terminalCode" => "ZD-10003",
"orderNo" => $order_product_no,
"prescriptionNo" => $prescription_code,
]
];
try {
$response = $this->httpRequest($this->api_url . $this->version . '/prescription/searchPresStatus', $option);
if (empty($response)){
// 返回值错误为空
throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR));
}
if (empty($response['data'])){
// 返回值为空
throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR));
}
if (empty($response['data']['result'])){
// 返回值为空
throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR));
}
return $response['data']['result'];
} catch (GuzzleException $e) {
throw new BusinessException($e->getMessage());
}
}
/**
* 请求封装
* @param string $path
* @param array $option
* @return array
* @throws GuzzleException
*/
protected function httpRequest(string $path,array $arg = []): array
{
if ($path != $this->api_url . "v1/user_thrid/token"){
$this->redis = $this->container->get(Redis::class);
$access_token = $this->redis->get("prescription_token");
if (empty($access_token)){
$access_token = $this->getToken();
}
}
if (!empty($access_token)){
$option = [
"headers" => [
"Authorization" => "Bearer " . $access_token
]
];
}
if (!empty($option)){
$arg = array_merge($arg,$option);
}
$response = $this->client->post($path, $arg);
if ($response->getStatusCode() != '200'){
// 请求失败
throw new BusinessException($response->getBody()->getContents());
}
$body = json_decode($response->getBody(),true);
if (empty($body)){
// 返回值为空
throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR));
}
return $body;
}
}