GoodsService.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. namespace App\Modules\Admin\Services;
  3. use App\Base\BaseService;
  4. use App\Models\Goods\Goods;
  5. use App\Models\Goods\GoodsCategoryMap;
  6. use App\Models\Goods\GoodsCustom;
  7. use App\Models\Goods\GoodsSearch;
  8. use App\Models\Goods\GoodsSku;
  9. use App\Models\Goods\GoodsSpecMap;
  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. })->when($params['category_id'], function (Builder $query) use ($params) {
  22. $gidArr = GoodsCategoryMap::whereCategoryId($params['category_id'])->groupBy("goods_id")->get(['goods_id'])->toArray();
  23. $query->whereIn("id", $gidArr);
  24. })->paginate($params['page_size']);
  25. return [
  26. "total" => $p->total(),
  27. "page_total" => $p->lastPage(),
  28. "list" => array_map(function (Goods $model) {
  29. return [
  30. "id" => $model->id,
  31. "name" => $model->name,
  32. "en_name" => $model->en_name,
  33. "thumb" => Arr::first($model->image_list),
  34. "weight" => $model->weight,
  35. "status" => $model->status,
  36. "created_at" => $model->created_at->format("Y-m-d H:i:s"),
  37. ];
  38. }, $p->items()),
  39. ];
  40. }
  41. public function store($params)
  42. {
  43. if ($id = Arr::get($params, "id", 0)) {
  44. $goods = Goods::findOrFail($id);
  45. } else {
  46. $goods = new Goods();
  47. }
  48. $specIdArr = array_values(Arr::sort(Arr::get($params, "spec", [])));
  49. $goods = DB::transaction(function () use ($params, $goods, $specIdArr) {
  50. $goods->image_list = Arr::get($params, "image_list", []);
  51. $goods->sn = $params['sn'] ?? "";
  52. $goods->url_3d = $params['url_3d'] ?? "";
  53. $goods->spec = $specIdArr;
  54. $goods->name = Arr::get($params, "name", []);
  55. $goods->en_name = Arr::get($params, "en_name", []);
  56. $goods->weight = Arr::get($params, "weight", 0);
  57. $goods->desc_html = Arr::get($params, "desc_html", "");
  58. $goods->en_desc_html = Arr::get($params, "en_desc_html", "");
  59. $goods->spec_attr_html = Arr::get($params, "spec_attr_html", "");
  60. $goods->en_spec_attr_html = Arr::get($params, "en_spec_attr_html", "");
  61. $goods->en_faq_html = Arr::get($params, "en_faq_html", "");
  62. $goods->faq_html = Arr::get($params, "faq_html", "");
  63. $custom = Arr::get($params, "custom", []);
  64. foreach ($custom as $k => $v) {
  65. $custom[$k]['en_title'] = GoodsCustom::where("id", $v['id'])->value("en_title");
  66. }
  67. $goods->custom = $custom;
  68. $goods->save();
  69. $categoryArr = Arr::get($params, "category", []);
  70. GoodsCategoryMap::where("goods_id", $goods->id)->whereNotIn("category_id", Arr::pluck($categoryArr, "id"))->delete();
  71. foreach ($categoryArr as $c) {
  72. /**
  73. * [
  74. * "id" => 1
  75. * "is_public" => 1
  76. * ]
  77. */
  78. GoodsCategoryMap::updateOrCreate([
  79. "goods_id" => $goods->id,
  80. "category_id" => $c['id'],
  81. ], [
  82. "goods_id" => $goods->id,
  83. "category_id" => $c['id'],
  84. 'is_public' => $c['is_public'],
  85. ]);
  86. }
  87. $specMap = Arr::get($params, "spec_map", []);
  88. $doNotDelIdArr = [];
  89. foreach ($specMap as $c) {
  90. $model = GoodsSpecMap::where("goods_id", $goods->id)->where("spec_id", $c['spec_id'])->first();
  91. if (is_null($model)) {
  92. $model = new GoodsSpecMap();
  93. $model->goods_id = $goods->id;
  94. $model->spec_id = $c['spec_id'];
  95. }
  96. $model->value = $c['value'];
  97. $model->save();
  98. $doNotDelIdArr[] = $model->id;
  99. }
  100. GoodsSpecMap::where("goods_id", $goods->id)->whereNotIn("id", $doNotDelIdArr)->delete();
  101. $this->createIndex($goods);
  102. return $goods;
  103. });
  104. }
  105. public function createIndex(Goods $goods)
  106. {
  107. GoodsSearch::updateOrCreate([
  108. "goods_id" => $goods->id,
  109. ], [
  110. "goods_id" => $goods->id,
  111. "content" => $goods->name . $goods->en_name . implode("", array_map(function ($item) {
  112. return implode("", Arr::pluck($item, "attr.value"));
  113. }, $goods->custom)) . strip_tags($goods->desc_html) . $goods->specMap->map(function (GoodsSpecMap $m) {
  114. return $m->value;
  115. })->implode(""),
  116. ]);
  117. }
  118. public function info($params)
  119. {
  120. $id = $params['id'];
  121. $model = Goods::findOrFail($id);
  122. $return = [
  123. "id" => $model->id,
  124. "name" => $model->name,
  125. "en_name" => $model->en_name,
  126. "image_list" => $model->image_list,
  127. "category" => $model->map->map(function (GoodsCategoryMap $map) {
  128. return [
  129. "id" => $map->category->id,
  130. "is_public" => $map->is_public,
  131. "name" => $map->category->name,
  132. "en_name" => $map->category->en_name,
  133. ];
  134. }),
  135. "spec" => $model->spec,
  136. "weight" => $model->weight,
  137. "desc_html" => $model->desc_html,
  138. "en_desc_html" => $model->en_desc_html,
  139. "spec_attr_html" => $model->spec_attr_html,
  140. "en_spec_attr_html" => $model->en_spec_attr_html,
  141. "faq_html" => $model->faq_html,
  142. "en_faq_html" => $model->en_faq_html,
  143. "sn" => $model->sn,
  144. "url_3d" => $model->url_3d,
  145. "spec_map" => $model->specMap->map(function (GoodsSpecMap $map) {
  146. return [
  147. "id" => $map->id,
  148. "spec_id" => $map->spec_id,
  149. "value" => $map->value,
  150. "name" => $map->spec->name,
  151. "en_name" => $map->spec->en_name,
  152. ];
  153. }),
  154. "custom" => $model->custom,
  155. ];
  156. return $return;
  157. }
  158. }