292 lines
9.0 KiB
PHP
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;
|
|
}
|
|
} |