Stock.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace crmeb\services\erp\storage\jushuitan;
  12. use app\services\product\product\StoreProductServices;
  13. use app\services\product\sku\StoreProductAttrValueServices;
  14. use crmeb\exceptions\AdminException;
  15. use crmeb\services\erp\AccessToken;
  16. use crmeb\services\erp\storage\Jushuitan;
  17. class Stock
  18. {
  19. /**
  20. * token句柄
  21. * @var AccessToken
  22. */
  23. protected $accessToken;
  24. /*** @var Jushuitan */
  25. protected $jushuitan;
  26. /**
  27. * @param AccessToken $accessToken
  28. * @param Jushuitan $jushuitan
  29. */
  30. public function __construct(AccessToken $accessToken, Jushuitan $jushuitan)
  31. {
  32. $this->accessToken = $accessToken;
  33. $this->jushuitan = $jushuitan;
  34. }
  35. /**
  36. * 同步商品库存
  37. * @param array $ids
  38. * @return void
  39. * @throws \Exception
  40. */
  41. public function syncStock(string $ids = '')
  42. {
  43. /** @var StoreProductServices $storeProductServices */
  44. $storeProductServices = app()->make(StoreProductServices::class);
  45. /** @var StoreProductAttrValueServices $storeProductAttrValueServices */
  46. $storeProductAttrValueServices = app()->make(StoreProductAttrValueServices::class);
  47. //查询ids下的所有规格对应的sku
  48. $ids = array_unique(array_map('intval', explode(',', $ids)));
  49. $list = $storeProductAttrValueServices->getSkuArray(['product_id' => $ids, 'type' => 0], 'code', 'id');
  50. $values = array_filter(array_values($list));
  51. if (empty($values)) {
  52. throw new AdminException('没有符合同步库存的商品');
  53. }
  54. $skuData = $skuMap = [];
  55. $basic = 20; // 单次查询数量最多20
  56. $num = count($values);
  57. $rate = ceil($num / $basic);
  58. for ($i = 0; $i < $rate; $i++) {
  59. $code = array_slice($values, $i * $basic, $basic);
  60. $skuMap = $skuMap + $this->getSkuStockByCode($code);
  61. }
  62. // 拼装规格数据
  63. if (!empty($skuMap)) {
  64. foreach ($skuMap as $key => $item) {
  65. if ($id = array_search($key, $list)) {
  66. $skuData[] = ['id' => $id, 'stock' => $item, 'sum_stock' => $item];
  67. }
  68. }
  69. }
  70. // 同步库存 TODO:待添加至队列
  71. $storeProductServices->transaction(function () use ($ids, $skuData, $skuMap, $storeProductAttrValueServices, $storeProductServices) {
  72. // 同步规格库存
  73. $storeProductAttrValueServices->saveAll($skuData);
  74. // 同步商品库存
  75. $productData = $storeProductAttrValueServices->getProductStockByValues($ids);
  76. $storeProductServices->saveAll($productData);
  77. //同步门店库存
  78. foreach ($skuMap as $item) {
  79. }
  80. });
  81. return true;
  82. }
  83. /**
  84. * 库存查询
  85. * @param array $data
  86. * @return array
  87. * @throws \Exception
  88. */
  89. public function inventoryQuery(string $codeStr): array
  90. {
  91. $url = $this->accessToken->getApiUrl("/open/inventory/query");
  92. //业务参数
  93. $biz = [];
  94. $biz["sku_ids"] = $codeStr;
  95. //拼装请求参数
  96. $params = $this->getParams($biz);
  97. //请求平台接口
  98. $request = $this->postRequest($url, $params);
  99. return $request["data"];
  100. }
  101. /**
  102. * 获取erp库存
  103. * @param array $code
  104. * @return array
  105. * @throws \Exception
  106. */
  107. public function getSkuStockByCode(array $code = []): array
  108. {
  109. $skuMap = [];
  110. $codeStr = implode(',', $code);
  111. $result = $this->inventoryQuery($codeStr);
  112. if (!empty($result['inventorys'])) {
  113. foreach ($result['inventorys'] as $inventory) {
  114. $skuMap[$inventory['sku_id']] = $inventory['qty'];
  115. }
  116. }
  117. return $skuMap;
  118. }
  119. /**
  120. * @param $name
  121. * @param $arguments
  122. * @return mixed
  123. */
  124. public function __call($name, $arguments)
  125. {
  126. return call_user_func_array([$this->jushuitan, $name], $arguments);
  127. }
  128. }