SpecService.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <?php
  2. namespace addons\TinyShop\services\product;
  3. use Yii;
  4. use yii\helpers\Json;
  5. use common\enums\StatusEnum;
  6. use common\helpers\ArrayHelper;
  7. use addons\TinyShop\common\models\product\Product;
  8. use addons\TinyShop\common\models\product\Spec;
  9. use addons\TinyShop\common\enums\SpecTypeEnum;
  10. /**
  11. * Class SpecService
  12. * @package addons\TinyShop\services\product
  13. */
  14. class SpecService
  15. {
  16. /**
  17. * @param Product $product
  18. * @param $data
  19. */
  20. public function create(Product $product, $data)
  21. {
  22. Spec::deleteAll(['product_id' => $product->id]);
  23. if (empty($data)) {
  24. return false;
  25. }
  26. !is_array($data) && $data = Json::decode($data);
  27. $rows = [];
  28. $field = [];
  29. $values = [];
  30. foreach ($data as $datum) {
  31. $row = [
  32. 'product_id' => $product->id,
  33. 'merchant_id' => $product->merchant_id,
  34. 'common_spec_id' => $datum['id'],
  35. 'title' => $datum['title'],
  36. 'sort' => $datum['sort'] ?? 999,
  37. 'type' => $datum['type'] ?? SpecTypeEnum::TEXT,
  38. 'status' => StatusEnum::ENABLED,
  39. 'created_at' => time(),
  40. 'updated_at' => time(),
  41. ];
  42. $values = ArrayHelper::merge($values, $datum['value']);
  43. $rows[] = $row;
  44. empty($field) && $field = array_keys($row);
  45. }
  46. !empty($rows) && Yii::$app->db->createCommand()->batchInsert(Spec::tableName(), $field, $rows)->execute();
  47. // 写入规格值
  48. Yii::$app->tinyShopService->productSpecValue->create($product, $values);
  49. }
  50. /**
  51. * @param $product_id
  52. * @param $data
  53. * @throws \yii\db\Exception
  54. */
  55. public function createByCopy($product_id, $data)
  56. {
  57. $rows = $field = [];
  58. foreach ($data as $datum) {
  59. $rows[] = [
  60. 'merchant_id' => $datum['merchant_id'],
  61. 'product_id' => $product_id,
  62. 'common_spec_id' => $datum['common_spec_id'],
  63. 'title' => $datum['title'],
  64. 'sort' => $datum['sort'],
  65. 'type' => $datum['type'],
  66. 'status' => $datum['status'],
  67. 'created_at' => time(),
  68. 'updated_at' => time(),
  69. ];
  70. empty($field) && $field = array_keys($rows[0]);
  71. }
  72. !empty($rows) && Yii::$app->db->createCommand()->batchInsert(Spec::tableName(), $field, $rows)->execute();
  73. }
  74. /**
  75. * @param $product_id
  76. * @return array|\yii\db\ActiveRecord[]
  77. */
  78. public function getJsData($product_id)
  79. {
  80. $data = $this->findByProductId($product_id);
  81. $values = Yii::$app->tinyShopService->productSpecValue->findByProductId($product_id);
  82. $pitchOnData = [];
  83. foreach ($data as &$datum) {
  84. $datum['id'] = $datum['common_spec_id'];
  85. $datum['pitch_on_count'] = 0;
  86. unset($datum['common_spec_id']);
  87. $datum['value'] = [];
  88. foreach ($values as &$value) {
  89. $value['id'] = $value['common_spec_value_id'] ?? 0;
  90. $value['spec_id'] = $value['common_spec_id'] ?? 0;
  91. if ($datum['id'] == $value['spec_id']) {
  92. unset($value['common_spec_value_id'], $value['common_spec_id']);
  93. $datum['value'][] = $value;
  94. // 判断选中
  95. if ($value['pitch_on'] == StatusEnum::ENABLED) {
  96. $pitchOnData[] = [
  97. 'id' => $value['id'],
  98. 'title' => $value['title'],
  99. 'parentId' => $value['spec_id'],
  100. 'parentTitle' => $datum['title'],
  101. ];
  102. $datum['pitch_on_count'] += 1;
  103. }
  104. }
  105. }
  106. }
  107. return [$data, $pitchOnData];
  108. }
  109. /**
  110. * 获取规格列表
  111. *
  112. * @param $product_id
  113. * @return array|\yii\db\ActiveRecord[]
  114. */
  115. public function getPitchOnByProductId($product_id)
  116. {
  117. $models = Spec::find()
  118. ->where(['product_id' => $product_id])
  119. ->select(['id', 'common_spec_id', 'title', 'type'])
  120. ->with(['valueBySpec' => function($query) use ($product_id) {
  121. return $query->andWhere([
  122. 'product_id' => $product_id,
  123. 'pitch_on' => StatusEnum::ENABLED
  124. ])->select(['id', 'common_spec_id', 'common_spec_value_id', 'title', 'data', 'status']);
  125. }])
  126. ->orderBy('sort asc')
  127. ->asArray()
  128. ->all();
  129. $data = [];
  130. foreach ($models as $model) {
  131. if (!empty($model['valueBySpec'])) {
  132. $data[] = [
  133. 'id' => $model['id'],
  134. 'common_spec_id' => $model['common_spec_id'],
  135. 'title' => $model['title'],
  136. 'type' => $model['type'],
  137. 'value' => $model['valueBySpec']
  138. ];
  139. }
  140. }
  141. return $data;
  142. }
  143. /**
  144. * @param $product_id
  145. * @return array|\yii\db\ActiveRecord[]
  146. */
  147. public function findByProductId($product_id)
  148. {
  149. return Spec::find()
  150. ->where(['status' => StatusEnum::ENABLED])
  151. ->andWhere(['product_id' => $product_id])
  152. ->asArray()
  153. ->all();
  154. }
  155. }
粤ICP备19079148号