Goods.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <?php
  2. namespace app\controller\admin\alibaba;
  3. use app\services\ThirdParty\AlibabaAgent\ProductService;
  4. /**
  5. * 1688分销严选 - 商品管理
  6. *
  7. * API文档:
  8. * 商品列表: https://open.1688.com/api/apidocdetail.htm?id=com.alibaba.fenxiao%3Ajxhy.product.getPageList-1
  9. * 商品详情: https://open.1688.com/api/apidocdetail.htm?id=com.alibaba.fenxiao%3Aalibaba.pifatuan.product.detail.list-2
  10. */
  11. class Goods
  12. {
  13. /**
  14. * 获取1688分销商品分页列表
  15. *
  16. * @param ProductService $productService
  17. * @return \think\Response
  18. *
  19. * @api {GET} /admin/alibaba/goods/lst 获取商品列表
  20. * @apiParam {string} [access_token] 1688 access_token(不传则使用配置中的默认token)
  21. * @apiParam {int} [page=1] 页码
  22. * @apiParam {int} [limit=20] 每页条数(最大50)
  23. * @apiParam {string} [keyword] 关键词搜索
  24. * @apiParam {int} [categoryId] 类目ID
  25. * @apiParam {number} [minPrice] 最低价格
  26. * @apiParam {number} [maxPrice] 最高价格
  27. * @apiParam {string} [sort] 排序方式
  28. */
  29. public function lst(ProductService $productService)
  30. {
  31. $request = app('request');
  32. $page = (int)$request->param('page', 1);
  33. $limit = (int)$request->param('limit', 20);
  34. $keyword = $request->param('keyword', '');
  35. $categoryId = $request->param('categoryId', '');
  36. $minPrice = $request->param('minPrice', '');
  37. $maxPrice = $request->param('maxPrice', '');
  38. $sort = $request->param('sort', '');
  39. $params = [
  40. 'page' => max(1, $page),
  41. 'limit' => min(max(1, $limit), 50),
  42. ];
  43. if (!empty($keyword)) {
  44. $params['keyword'] = $keyword;
  45. }
  46. if (!empty($categoryId)) {
  47. $params['categoryId'] = (int)$categoryId;
  48. }
  49. if ($minPrice !== '' && $minPrice > 0) {
  50. $params['minPrice'] = (float)$minPrice;
  51. }
  52. if ($maxPrice !== '' && $maxPrice > 0) {
  53. $params['maxPrice'] = (float)$maxPrice;
  54. }
  55. if (!empty($sort)) {
  56. $params['sort'] = $sort;
  57. }
  58. $result = $productService->searchProducts($params);
  59. if ($result === false) {
  60. return app('json')->fail('获取1688商品列表失败,请查看日志');
  61. }
  62. return app('json')->success($result);
  63. }
  64. /**
  65. * 获取1688分销商品详情
  66. *
  67. * @param ProductService $productService
  68. * @return mixed
  69. *
  70. * @api {GET} /admin/alibaba/goods/detail 获取商品详情
  71. * @apiParam {string} [access_token] 1688 access_token(不传则使用配置中的默认token)
  72. * @apiParam {int} productId 1688商品ID(必填)
  73. */
  74. public function detail(ProductService $productService)
  75. {
  76. $request = app('request');
  77. $productId = $request->param('productId', '');
  78. if (empty($productId)) {
  79. return app('json')->fail('参数错误:productId不能为空');
  80. }
  81. $result = $productService->getProductDetail($productId);
  82. if ($result === false) {
  83. return app('json')->fail('获取1688商品详情失败,请查看日志');
  84. }
  85. return app('json')->success($result);
  86. }
  87. /**
  88. * 批量导入1688商品到 alibaba_import_goods 表
  89. *
  90. * 业务场景:从1688商品列表中选择多个商品,一键入库
  91. * 商品详情以JSON格式完整存储到 alibaba_import_goods 表
  92. *
  93. * @param ProductService $productService
  94. * @return mixed
  95. *
  96. * @api {POST} /admin/alibaba/goods/import 批量入库
  97. * @apiParam {string} productIds 1688商品ID(必填),多个用逗号分隔,如:787533862434 或 787533862434,787533862435
  98. */
  99. public function import(ProductService $productService)
  100. {
  101. $request = app('request');
  102. $raw = $request->param('productIds', '');
  103. // 参数校验
  104. if (empty($raw)) {
  105. return app('json')->fail('参数错误:productIds不能为空');
  106. }
  107. // 解析productIds:支持 "787533862434" 或 "787533862434,787533862435"
  108. $productIds = explode(',', str_replace(' ', '', $raw));
  109. $productIds = array_unique(array_filter($productIds, function ($v) {
  110. return $v !== '' && $v !== null;
  111. }));
  112. if (empty($productIds)) {
  113. return app('json')->fail('参数错误:productIds格式不正确');
  114. }
  115. // 执行批量入库
  116. $result = $productService->batchImport($productIds, 0);
  117. $successCount = count($result['success']);
  118. $failCount = count($result['fail']);
  119. if ($successCount > 0) {
  120. return app('json')->success([
  121. 'success' => $result['success'],
  122. 'fail' => $result['fail'],
  123. 'success_count' => $successCount,
  124. 'fail_count' => $failCount,
  125. 'message' => "成功入库 {$successCount} 个商品" . ($failCount > 0 ? ",{$failCount} 个失败" : ''),
  126. ]);
  127. }
  128. return app('json')->fail('入库失败:' . implode('; ', array_values($result['fail'])));
  129. }
  130. /**
  131. * 获取1688商品类目列表
  132. *
  133. * API: com.alibaba.product:alibaba.category.get-1
  134. * 文档: https://open.1688.com/api/apidocdetail.htm?id=com.alibaba.product%3Aalibaba.category.get-1
  135. *
  136. * @param ProductService $productService
  137. * @return mixed
  138. *
  139. * @api {GET} /admin/alibaba/goods/category 获取商品类目
  140. * @apiParam {string} [access_token] 1688 access_token(不传则使用配置中的默认token)
  141. * @apiParam {int} [categoryId=0] 类目ID,顶级类目传0
  142. */
  143. public function category(ProductService $productService)
  144. {
  145. $request = app('request');
  146. $categoryId = (int)$request->param('categoryId', 0);
  147. $result = $productService->getCategories($categoryId);
  148. if ($result === false) {
  149. return app('json')->fail('获取1688商品类目失败,请查看日志!');
  150. }
  151. return app('json')->success($result);
  152. }
  153. }