GoodsService.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. namespace App\Modules\Admin\Services;
  3. use App\Base\BaseService;
  4. use App\Exceptions\ClientException;
  5. use App\Models\Goods\Goods;
  6. use App\Models\Goods\GoodsCategoryMap;
  7. use App\Models\Goods\GoodsSku;
  8. use App\Models\Goods\Spec;
  9. use App\Models\Goods\SpecAttr;
  10. use Illuminate\Database\Eloquent\Builder;
  11. use Illuminate\Support\Arr;
  12. use Illuminate\Support\Facades\DB;
  13. class GoodsService extends BaseService
  14. {
  15. public function paginate($params)
  16. {
  17. $p = Goods::query()->when($params['status'], function (Builder $query) use ($params) {
  18. return $query->where("status", $params['status']);
  19. })->when($params['name'], function (Builder $query) use ($params) {
  20. return $query->where("name", "like", "%{$params['name']}%");
  21. })->orderByDesc("id")->paginate($params['page_size']);
  22. return [
  23. "total" => $p->total(),
  24. "page_total" => $p->lastPage(),
  25. "list" => array_map(function (Goods $model) {
  26. return [
  27. "id" => $model->id,
  28. "name" => $model->name,
  29. "thumb" => Arr::first($model->image_list),
  30. "weight" => $model->weight,
  31. "status" => $model->status,
  32. "created_at" => $model->created_at->format("Y-m-d H:i:s"),
  33. ];
  34. }, $p->items()),
  35. ];
  36. }
  37. public function store($params)
  38. {
  39. if ($id = Arr::get($params, "id", 0)) {
  40. $goods = Goods::findOrFail($id);
  41. } else {
  42. $goods = new Goods();
  43. }
  44. $specIdArr = Arr::get($params, "spec", []);
  45. $notCustomSpecS = Spec::whereIn("id", $specIdArr)->where("is_custom", 0)->get();
  46. if ($notCustomSpecS->isEmpty()) {
  47. throw new ClientException("必须要存在一个非自定义的规格");
  48. }
  49. DB::transaction(function () use ($params, $goods, $specIdArr) {
  50. $goods->image_list = Arr::get($params, "image_list", []);
  51. $goods->spec = $specIdArr;
  52. $goods->name = Arr::get($params, "name", []);
  53. $goods->weight = Arr::get($params, "weight", 0);
  54. $goods->desc_html = Arr::get($params, "desc_html", "");
  55. $goods->spec_attr_html = Arr::get($params, "spec_attr_html", "");
  56. $goods->faq_html = Arr::get($params, "faq_html", "");
  57. $goods->save();
  58. $categoryArr = Arr::get($params, "category", []);
  59. GoodsCategoryMap::where("goods_id", $goods->id)->whereNotIn("category_id", Arr::pluck($categoryArr, "id"))->delete();
  60. foreach ($categoryArr as $c) {
  61. /**
  62. * [
  63. * "id" => 1
  64. * "is_public" => 1
  65. * ]
  66. */
  67. GoodsCategoryMap::updateOrCreate([
  68. "goods_id" => $goods->id,
  69. "category_id" => $c['id'],
  70. 'is_public' => $c['is_public'],
  71. ]);
  72. }
  73. $skuArr = Arr::get($params, "sku", []);
  74. $doNotDelIdArr = [];
  75. foreach ($skuArr as $c) {
  76. /**
  77. * [
  78. * "id" => 0
  79. * "sn" => "规格型号"
  80. * "url_3d" => null
  81. * "spec_attr" => array:2 [
  82. * 0 => array:2 [
  83. * "id" => 1
  84. * "name" => "属性一"
  85. * ]
  86. * 1 => array:2 [
  87. * "id" => 2
  88. * "name" => "属性二"
  89. * ]
  90. * ]
  91. * "is_use" => 1
  92. * ]
  93. */
  94. if ($id = Arr::get($c, "id")) {
  95. $sku = GoodsSku::where("goods_id", $goods->id)->where("id", $id)->first();
  96. } else {
  97. $sku = new GoodsSku();
  98. $sku->goods_id = $goods->id;
  99. }
  100. $sku->sn = Arr::get($c, "sn", "");
  101. if (empty($sku->sn)) {
  102. $sku->is_use = 0;
  103. }
  104. $sku->url_3d = Arr::get($c, "url_3d", "");
  105. $sku->spec_attr_list = Arr::get($c, "spec_attr", []);
  106. $sku->save();
  107. $doNotDelIdArr[] = $sku->id;
  108. }
  109. GoodsSku::where("goods_id", $goods->id)->whereNotIn("id", $doNotDelIdArr)->delete();
  110. });
  111. }
  112. public function info($params)
  113. {
  114. $id = $params['id'];
  115. $model = Goods::findOrFail($id);
  116. $return = [
  117. "id" => $model->id,
  118. "image_list" => $model->image_list,
  119. "category" => $model->map->map(function (GoodsCategoryMap $map) {
  120. return [
  121. "id" => $map->category->id,
  122. "is_public" => $map->is_public,
  123. ];
  124. }),
  125. "spec" => $model->spec,
  126. "sku" => $model->sku->map(function (GoodsSku $sku) {
  127. return [
  128. "id" => $sku->id,
  129. "sn" => $sku->sn,
  130. "url_3d" => $sku->url_3d,
  131. "is_use" => $sku->is_use,
  132. "spec_attr" => array_map(function ($specAttrId) {
  133. return [
  134. "id" => $specAttrId,
  135. "name" => SpecAttr::where("id", $specAttrId)->value("name"),
  136. ];
  137. }, $sku->spec_attr_list),
  138. ];
  139. }),
  140. "weight" => $model->weight,
  141. "desc_html" => $model->desc_html,
  142. "spec_attr_html" => $model->spec_attr_html,
  143. "faq_html" => $model->faq_html,
  144. ];
  145. return $return;
  146. }
  147. }