Commit 7bf1df7f authored by 王源's avatar 王源 🎧

Merge branch 'develop' into test

parents 1c46cdf0 94d2b42d
......@@ -22,4 +22,19 @@ interface MessageServiceInterface
* @return bool
*/
public function send(array $receiveUserId, $application, $templateId = 0, $sendUserId = 0, $replace = [], $content = ''): bool;
/**
* description:发送邮件
* author: fuyunnan
* @param array $userList ['111@qq.com','222@qq.com']
* @param string $subject 邮件标题
* @param string $body 邮件内容
* @return bool
* @throws
* Date: 2020/9/10
*/
public function sendMail($userList, $subject, $body): bool;
}
......@@ -25,22 +25,22 @@ interface StoreServiceInterface
* author: fuyunnan
* @param array $data 需要入库的数组 格式 入库添加
* *
data[master][warehousing_date]:2020-01-08 入库时间
data[master][creator_id]:12 创建人id
data[master][warehouse_id]:2 仓库id
data[master][type_id]:1 入库单类型
data[master][source_no]:no_121333 来源单号 (选填)
data[master][stock_up_status]:1二次质检状态 (选填)
data[master][remark]:备注 (选填)
data[master][status]:2 状态 (选填 不填默认1)
* data[master][warehousing_date]:2020-01-08 入库时间
* data[master][creator_id]:12 创建人id
* data[master][warehouse_id]:2 仓库id
* data[master][type_id]:1 入库单类型
* data[master][source_no]:no_121333 来源单号 (选填)
* data[master][stock_up_status]:1二次质检状态 (选填)
* data[master][remark]:备注 (选填)
* data[master][status]:2 状态 (选填 不填默认1)
*
* 产品二维数组
data[goods][0][product_id]:16 产品id
data[goods][0][should_cnt]:133 应入数量
data[goods][0][real_cnt]:10 实入数量
data[goods][1][product_id]:18
data[goods][1][should_cnt]:10
data[goods][1][real_cnt]:15
* data[goods][0][product_id]:16 产品id
* data[goods][0][should_cnt]:133 应入数量
* data[goods][0][real_cnt]:10 实入数量
* data[goods][1][product_id]:18
* data[goods][1][should_cnt]:10
* data[goods][1][real_cnt]:15
*
* 或者参考yapi http://api.huaperfect.com/project/38/interface/api/1617
*
......@@ -51,30 +51,28 @@ interface StoreServiceInterface
public function createWarehousing(array $data): array;
/**
* description:批量创建出库单
* author: fuyunnan
* [
'main' => [
    'creator_id' => 1,
    'warehouse_id' => 1,
    'type' => 5,
],
'products' => [
[
    'source_no' => 1,
    'product_id' => 1,
    'real_cnt' => 1
],
[
    'source_no' => 1,
    'product_id' => 1,
    'real_cnt' => 1
]
]
]
* 'main' => [
*     'creator_id' => 1,
*     'warehouse_id' => 1,
*     'type' => 5,
* ],
* 'products' => [
* [
*     'source_no' => 1,
*     'product_id' => 1,
*     'real_cnt' => 1
* ],
* [
*     'source_no' => 1,
*     'product_id' => 1,
*     'real_cnt' => 1
* ]
* ]
* ]
*
* @param array $attributes 提交的数组 或参考yapi http://api.huaperfect.com/project/38/interface/api/6968
* @return array
......@@ -173,6 +171,17 @@ interface StoreServiceInterface
* @throws
* Date: 2020/7/31
*/
public function checkStock($ids):array;
public function checkStock($ids): array;
/**
* description:出库单 恢复库存 出库单定为已取消
* author: fuyunnan
* @param string $sourceNo 来源单号
* @return int
* @throws
* Date: 2020/9/7
*/
public function restoreStock($sourceNo): int;
}
\ No newline at end of file
......@@ -14,8 +14,6 @@ use Meibuyu\Micro\Shopify\lib\Collect;
use Meibuyu\Micro\Shopify\lib\Collection;
use Meibuyu\Micro\Shopify\lib\CustomCollection;
use Meibuyu\Micro\Shopify\lib\Metafield;
use Meibuyu\Micro\Shopify\lib\Product;
use Meibuyu\Micro\Shopify\lib\ProductVariant;
use Meibuyu\Micro\Shopify\lib\SmartCollection;
use Meibuyu\Micro\Shopify\lib\Webhook;
......@@ -29,16 +27,12 @@ use Meibuyu\Micro\Shopify\lib\Webhook;
* @property-read CustomCollection $CustomCollection
* @property-read SmartCollection $SmartCollection
* @property-read Metafield $Metafield
* @property-read Product $Product
* @property-read ProductVariant $ProductVariant
*
* @method Webhook Webhook(integer $id = null)
* @method Collection Collection(integer $id = null)
* @method CustomCollection CustomCollection(integer $id = null)
* @method SmartCollection SmartCollection(integer $id = null)
* @method Metafield Metafield(integer $id = null)
* @method Product Product(integer $id = null)
* @method ProductVariant ProductVariant(integer $id = null)
*
*/
class ShopifyApp
......@@ -51,8 +45,6 @@ class ShopifyApp
'CustomCollection',
'SmartCollection',
'Metafield',
'Product',
'ProductVariant',
];
protected $childResources = array(
......
......@@ -153,95 +153,6 @@ abstract class AbstractShopify
return $resourceUrl . ($customAction ? "/$customAction" : '') . '.json' . (!empty($urlParams) ? '?' . http_build_query($urlParams) : '');
}
// /**
// * @param array $urlParams
// * @param null $url
// * @param null $dataKey
// * @return mixed
// * @throws Exception
// */
// public function get($urlParams = [], $url = null, $dataKey = null)
// {
// if (!$url) $url = $this->generateUrl($urlParams);
// $response = HttpRequestJson::get($url, $this->httpHeaders);
// if (!$dataKey) $dataKey = $this->id ? $this->resourceKey : $this->pluralizeKey;
// return $this->processResponse($response, $dataKey);
// }
//
// /**
// * 根据id获取一条数据
// * @param $id
// * @param array $urlParams
// * @return mixed
// * @throws Exception
// */
// public function show($id, $urlParams = [])
// {
// $url = $this->generateUrl($urlParams, $id);
// $response = HttpRequestJson::get($url, $this->httpHeaders);
// return $this->processResponse($response, $this->resourceKey);
// }
//
// /**
// * 获取数量
// * @param array $urlParams
// * @return mixed
// * @throws Exception
// */
// public function count($urlParams = [])
// {
// if (!$this->countEnabled) {
// throw new Exception("当前类{$this->getResourceName()}不支持count()方法");
// }
// $url = $this->generateUrl($urlParams, null, 'count');
// return $this->get([], $url, 'count');
// }
//
// /**
// * @param $dataArray
// * @param null $url
// * @param bool $wrapData
// * @return mixed
// * @throws Exception
// */
// public function post($dataArray, $url = null, $wrapData = true)
// {
// if (!$url) $url = $this->generateUrl();
// if ($wrapData && !empty($dataArray)) $dataArray = $this->wrapData($dataArray);
// $response = HttpRequestJson::post($url, $dataArray, $this->httpHeaders);
// return $this->processResponse($response, $this->resourceKey);
// }
//
// /**
// * @param int|string $id
// * @param $dataArray
// * @param null $url
// * @param bool $wrapData
// * @return mixed
// * @throws Exception
// */
// public function put($id, $dataArray, $url = null, $wrapData = true)
// {
// if (!$url) $url = $this->generateUrl([], $id);
// if ($wrapData && !empty($dataArray)) $dataArray = $this->wrapData($dataArray);
// $response = HttpRequestJson::put($url, $dataArray, $this->httpHeaders);
// return $this->processResponse($response, $this->resourceKey);
// }
//
// /**
// * @param int|string $id
// * @param array $urlParams
// * @param null $url
// * @return mixed
// * @throws Exception
// */
// public function delete($id = null, $urlParams = [], $url = null)
// {
// if (!$url) $url = $this->generateUrl($urlParams, $id);
// $response = HttpRequestJson::delete($url, $this->httpHeaders);
// return $this->processResponse($response);
// }
/**
* @param array $urlParams
* @param null $url
......@@ -285,6 +196,21 @@ abstract class AbstractShopify
return $this->processResponse($response, $this->resourceKey);
}
/**
* 获取数量
* @param array $urlParams
* @return mixed
* @throws Exception
*/
public function count($urlParams = [])
{
if (!$this->countEnabled) {
throw new Exception("当前类{$this->getResourceName()}不支持count()方法");
}
$url = $this->generateUrl($urlParams, null, 'count');
return $this->get([], $url, 'count');
}
/**
* @param $dataArray
* @param null $url
......@@ -356,36 +282,14 @@ abstract class AbstractShopify
* @return mixed
* @throws Exception
*/
// public function processResponse($response, $dataKey = null)
// {
// $httpCode = $response->getStatusCode();
// $content = $response->getBody()->getContents();
// $content = json_decode($content, true);
//
// if (isset($content['errors'])) {
// throw new Exception($this->castString($content['errors']), $httpCode);
// }
// if ($dataKey && isset($content[$dataKey])) {
// return $content[$dataKey];
// } else {
// return $content;
// }
// }
/**
* 处理响应
* @param array $response
* @param null $dataKey
* @return mixed
* @throws Exception
*/
public function processResponse($response, $dataKey = null)
{
[$code, $header, $body] = $response;
$content = json_decode($body, true);
$httpCode = $response->getStatusCode();
$content = $response->getBody()->getContents();
$content = json_decode($content, true);
if (isset($content['errors'])) {
throw new Exception($this->castString($content['errors']), $code);
throw new Exception($this->castString($content['errors']), $httpCode);
}
if ($dataKey && isset($content[$dataKey])) {
return $content[$dataKey];
......
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/9/2
* Time: 16:50
*/
namespace Meibuyu\Micro\Shopify\lib;
/**
* Class Product
* @package Meibuyu\Micro\Shopify\lib
*
* @property-read ProductImage $Image
* @property-read ProductVariant $Variant
* @property-read Metafield $Metafield
*
* @method ProductImage Image(integer $id = null)
* @method ProductVariant Variant(integer $id = null)
* @method Metafield Metafield(integer $id = null)
*/
class Product extends AbstractShopify
{
protected $resourceKey = 'product';
protected $childResource = [
'ProductImage' => 'Image',
'ProductVariant' => 'Variant',
'Metafield',
];
}
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/9/2
* Time: 16:50
*/
namespace Meibuyu\Micro\Shopify\lib;
class ProductImage extends AbstractShopify
{
protected $resourceKey = 'image';
}
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/9/2
* Time: 16:50
*/
namespace Meibuyu\Micro\Shopify\lib;
/**
* Class ProductVariant
* @package Meibuyu\Micro\Shopify\lib
*
* @property-read Metafield $Metafield
*
* @method Metafield Metafield(integer $id = null)
*/
class ProductVariant extends AbstractShopify
{
protected $resourceKey = 'variant';
protected $childResource = [
'Metafield',
];
}
<?php
namespace Meibuyu\Micro\Tools;
use Exception;
class CurlRequest
{
protected static function init($url, $httpHeaders = [])
{
// Create Curl resource
$ch = curl_init();
// Set URL
curl_setopt($ch, CURLOPT_URL, $url);
//Return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'PHPClassic/PHPShopify');
$headers = [];
foreach ($httpHeaders as $key => $value) {
$headers[] = "$key: $value";
}
//Set HTTP Headers
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
return $ch;
}
public static function get($url, $httpHeaders = [])
{
$ch = self::init($url, $httpHeaders);
return self::processRequest($ch);
}
public static function post($url, $data, $httpHeaders = [])
{
$ch = self::init($url, $httpHeaders);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
return self::processRequest($ch);
}
public static function put($url, $data, $httpHeaders = [])
{
$ch = self::init($url, $httpHeaders);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
return self::processRequest($ch);
}
public static function delete($url, $httpHeaders = [])
{
$ch = self::init($url, $httpHeaders);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
return self::processRequest($ch);
}
protected static function processRequest($ch)
{
# Check for 429 leaky bucket error
while (1) {
$output = curl_exec($ch);
$response = new CurlResponse($output);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode != 429) {
break;
}
$limitHeader = explode('/', $response->getHeader('X-Shopify-Shop-Api-Call-Limit'), 2);
if (isset($limitHeader[1]) && $limitHeader[0] < $limitHeader[1]) {
throw new Exception($response->getBody());
}
usleep(500000);
}
if (curl_errno($ch)) {
throw new Exception(curl_errno($ch) . ' : ' . curl_error($ch));
}
// close curl resource to free up system resources
curl_close($ch);
$httpHeader = $response->getHeaders();
return [$httpCode, $httpHeader, $response->getBody()];
}
}
<?php
namespace Meibuyu\Micro\Tools;
class CurlResponse
{
/** @var array */
private $headers = [];
/** @var string */
private $body;
public function __construct($response)
{
$this->parse($response);
}
/**
* @param string $response
*/
private function parse($response)
{
$response = \explode("\r\n\r\n", $response);
if (\count($response) > 1) {
// We want the last two parts
$response = \array_slice($response, -2, 2);
list($headers, $body) = $response;
foreach (\explode("\r\n", $headers) as $header) {
$pair = \explode(': ', $header, 2);
if (isset($pair[1])) {
$headerKey = strtolower($pair[0]);
$this->headers[$headerKey] = $pair[1];
}
}
} else {
$body = $response[0];
}
$this->body = $body;
}
/**
* @return array
*/
public function getHeaders()
{
return $this->headers;
}
/**
* @param string $key
*
* @return string
*/
public function getHeader($key)
{
return isset($this->headers[$key]) ? $this->headers[$key] : null;
}
/**
* @return string
*/
public function getBody()
{
return $this->body;
}
public function __toString()
{
$body = $this->getBody();
$body = $body ?: '';
return $body;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment