徐总多门店
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

151 lines
4.6 KiB

<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace crmeb\services\erp\storage\jushuitan;
use app\services\product\product\StoreProductServices;
use app\services\product\sku\StoreProductAttrValueServices;
use crmeb\exceptions\AdminException;
use crmeb\services\erp\AccessToken;
use crmeb\services\erp\storage\Jushuitan;
class Stock
{
/**
* token句柄
* @var AccessToken
*/
protected $accessToken;
/*** @var Jushuitan */
protected $jushuitan;
/**
* @param AccessToken $accessToken
* @param Jushuitan $jushuitan
*/
public function __construct(AccessToken $accessToken, Jushuitan $jushuitan)
{
$this->accessToken = $accessToken;
$this->jushuitan = $jushuitan;
}
/**
* 同步商品库存
* @param array $ids
* @return void
* @throws \Exception
*/
public function syncStock(string $ids = '')
{
/** @var StoreProductServices $storeProductServices */
$storeProductServices = app()->make(StoreProductServices::class);
/** @var StoreProductAttrValueServices $storeProductAttrValueServices */
$storeProductAttrValueServices = app()->make(StoreProductAttrValueServices::class);
//查询ids下的所有规格对应的sku
$ids = array_unique(array_map('intval', explode(',', $ids)));
$list = $storeProductAttrValueServices->getSkuArray(['product_id' => $ids, 'type' => 0], 'code', 'id');
$values = array_filter(array_values($list));
if (empty($values)) {
throw new AdminException('没有符合同步库存的商品');
}
$skuData = $skuMap = [];
$basic = 20; // 单次查询数量最多20
$num = count($values);
$rate = ceil($num / $basic);
for ($i = 0; $i < $rate; $i++) {
$code = array_slice($values, $i * $basic, $basic);
$skuMap = $skuMap + $this->getSkuStockByCode($code);
}
// 拼装规格数据
if (!empty($skuMap)) {
foreach ($skuMap as $key => $item) {
if ($id = array_search($key, $list)) {
$skuData[] = ['id' => $id, 'stock' => $item, 'sum_stock' => $item];
}
}
}
// 同步库存 TODO:待添加至队列
$storeProductServices->transaction(function () use ($ids, $skuData, $skuMap, $storeProductAttrValueServices, $storeProductServices) {
// 同步规格库存
$storeProductAttrValueServices->saveAll($skuData);
// 同步商品库存
$productData = $storeProductAttrValueServices->getProductStockByValues($ids);
$storeProductServices->saveAll($productData);
//同步门店库存
foreach ($skuMap as $item) {
}
});
return true;
}
/**
* 库存查询
* @param array $data
* @return array
* @throws \Exception
*/
public function inventoryQuery(string $codeStr): array
{
$url = $this->accessToken->getApiUrl("/open/inventory/query");
//业务参数
$biz = [];
$biz["sku_ids"] = $codeStr;
//拼装请求参数
$params = $this->getParams($biz);
//请求平台接口
$request = $this->postRequest($url, $params);
return $request["data"];
}
/**
* 获取erp库存
* @param array $code
* @return array
* @throws \Exception
*/
public function getSkuStockByCode(array $code = []): array
{
$skuMap = [];
$codeStr = implode(',', $code);
$result = $this->inventoryQuery($codeStr);
if (!empty($result['inventorys'])) {
foreach ($result['inventorys'] as $inventory) {
$skuMap[$inventory['sku_id']] = $inventory['qty'];
}
}
return $skuMap;
}
/**
* @param $name
* @param $arguments
* @return mixed
*/
public function __call($name, $arguments)
{
return call_user_func_array([$this->jushuitan, $name], $arguments);
}
}