StoreAdminAttrForm.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\models\v1\store;
  8. use app\jobs\SyncMdGoodsJob;
  9. use app\models\Attr;
  10. use app\models\AttrGroup;
  11. use app\models\Goods;
  12. use app\models\GoodsBook;
  13. use app\models\GoodsCat;
  14. use app\models\GoodsPic;
  15. use yii\base\Model;
  16. use yii\helpers\Json;
  17. class StoreAdminAttrForm extends Model
  18. {
  19. public function goodsAttrBook($goods_info){
  20. $t = \Yii::$app->db->beginTransaction();
  21. try {
  22. // 预约
  23. if ($goods_info['product_type'] == Goods::GOODS_TYPE_DATE) {
  24. // if (empty($goods_info['date_book'])) {
  25. // $t->rollBack();
  26. // throw new \Exception('请检查预约日期相关配置是否正确');
  27. // }
  28. //
  29. // foreach ($goods_info['date_book'] as $k => $v) {
  30. // if (intval($v['num']) < 0 || $v['price'] <= 0) {
  31. // $t->rollBack();
  32. // throw new \Exception('请检查预约日期的价格和库存参数是否填写正确');
  33. // }
  34. // }
  35. // $goods_book = GoodsBook::findOne(['goods_id' => $goods_info['id']]);
  36. // if (!$goods_book) {
  37. // $goods_book = new GoodsBook();
  38. // }
  39. // $goods_book->goods_id = $goods_info['id'];
  40. // $goods_book->date_book = Json::encode($goods_info['date_book']);
  41. // $goods_book->save();
  42. }
  43. if ($goods_info['product_type'] == Goods::GOODS_TYPE_TIME) {
  44. if (empty($goods_info['service_book']) || !is_array($goods_info['service_book']) || empty($goods_info['service_book']['data'])) {
  45. $t->rollBack();
  46. throw new \Exception('请检查服务商品预定参数');
  47. }
  48. if (count($goods_info['service_book']['data']) != $goods_info['service_book']['date']) {
  49. $t->rollBack();
  50. throw new \Exception('请检查是否少填写时间段和价格参数');
  51. }
  52. $time_arr = [];
  53. foreach ($goods_info['service_book']['data'] as $val) {
  54. if (empty($val['time'])) {
  55. $t->rollBack();
  56. throw new \Exception('请检查是否少填写时间段');
  57. }
  58. foreach ($val['time'] as $v) {
  59. if (empty($v['start_time']) || empty($v['end_time'])) {
  60. $t->rollBack();
  61. throw new \Exception('请检查是否少填写时间段');
  62. }
  63. if (empty($v['times']) || !is_array($v['times'])) {
  64. $t->rollBack();
  65. throw new \Exception('请检查时间段下是否未选择详细时间');
  66. }
  67. foreach ($v['times'] as $m) {
  68. if (empty($m['time']) || empty($m['price'] || empty($m['num']))) {
  69. $t->rollBack();
  70. throw new \Exception('请检查是否少填写时间点, 价格以及库存');
  71. }
  72. }
  73. $time_arr[] = [
  74. 'start_time' => $v['start_time'],
  75. 'end_time' => $v['end_time'],
  76. ];
  77. }
  78. }
  79. $goods_book = GoodsBook::findOne(['goods_id' => $goods_info['id']]);
  80. if (!$goods_book) {
  81. $goods_book = new GoodsBook();
  82. $goods_book->goods_id = $goods_info['id'];
  83. }
  84. $goods_book->service_book = Json::encode($goods_info['service_book']);
  85. $goods_book->save();
  86. }
  87. // 设置规格
  88. try {
  89. $result = $this->setAttr($goods_info);
  90. if ($result['code']) {
  91. throw new \Exception($result['msg']);
  92. }
  93. } catch(\Exception $e){
  94. return [
  95. 'code' => 1,
  96. 'msg' => $e->getMessage()
  97. ];
  98. }
  99. // if ($goods_info['cat_id'] && count($goods_info['cat_id'])) {
  100. // if ($goods_info['id'] > 0) {
  101. // GoodsCat::deleteAll(['goods_id' => $goods_info['id']]);
  102. // }
  103. // $goodsCatForm = new GoodsCat();
  104. // foreach ($goods_info['cat_id'] as $cat_id) {
  105. // $goodsCat = clone $goodsCatForm;
  106. // $goodsCat->goods_id = $goods_info['id'];
  107. // $goodsCat->cat_id = $cat_id;
  108. // $goodsCat->store_id = $goods_info['store_id'];
  109. // if (!$goodsCat->save()) {
  110. // throw new \Exception('保存失败');
  111. // }
  112. // }
  113. // }
  114. // if ($goods_info['goods_pic_list']) {
  115. // if ($goods_info['id'] > 0) {
  116. // GoodsPic::deleteAll(['goods_id' => $goods_info['id']]);
  117. // }
  118. // $goodsPicForm = new GoodsPic();
  119. // foreach ($goods_info['goods_pic_list'] as $pic) {
  120. // $goodsPic = clone $goodsPicForm;
  121. // $goodsPic->goods_id = $goods_info['id'];
  122. // $goodsPic->pic_url = $pic['pic_url'];
  123. // if (!$goodsPic->save()) {
  124. // throw new \Exception('保存失败');
  125. // }
  126. // }
  127. // }
  128. queue_push(new SyncMdGoodsJob(['goods_ids' => [$goods_info['id']]]), 0, 1);
  129. $t->commit();
  130. return [
  131. 'code' => 0,
  132. 'msg' => "操作成功"
  133. ];
  134. } catch (\Exception $e){
  135. $t->rollBack();
  136. return [
  137. 'code' => 0,
  138. 'msg' => $e->getMessage()
  139. ];
  140. }
  141. }
  142. //设置规格
  143. private function setAttr($goods_info)
  144. {
  145. try {
  146. $goods = Goods::findOne($goods_info['id']);
  147. if ($goods_info['product_type'] == Goods::GOODS_TYPE_DATE || $goods_info['product_type'] == Goods::GOODS_TYPE_TIME) {
  148. $defaultAttr = '[{"attr_list":[{"attr_id":1,"attr_name":"默认"}],"num":0,"price":0,"no":"","pic":"","share_commission_first":"","share_commission_second":"","share_commission_third":""}]';
  149. $goods->attr = $defaultAttr;
  150. $goods->save();
  151. return;
  152. }
  153. if (!$goods_info['use_attr']) {
  154. list($default_attr, $default_attr_group) = $this->getDefaultAttr();
  155. if (empty($goods_info['attr'])) {
  156. $goods_info['attr'] = [
  157. [
  158. 'attr_list' => [
  159. [
  160. 'attr_group_name' => $default_attr_group->attr_group_name,
  161. 'attr_id' => $default_attr->id,
  162. 'attr_name' => $default_attr->attr_name,
  163. ],
  164. ],
  165. 'num' => intval($goods_info['goods_num']) ?: 0,
  166. 'price' => $goods_info['price'],
  167. 'integral_price' => $goods_info['integral_price'],
  168. 'cost_price' => $goods->cost_price,
  169. 'no' => $goods_info['goods_no'],
  170. 'sku_id' => '',
  171. 'original_price' => $goods->original_price,
  172. ],
  173. ];
  174. } else {
  175. $attr_list = [
  176. [
  177. 'attr_group_name' => $default_attr_group->attr_group_name,
  178. 'attr_id' => $default_attr->id,
  179. 'attr_name' => $default_attr->attr_name,
  180. ],
  181. ];
  182. $goods_info['attr'][0]['attr_list'] = $attr_list;
  183. $goods_info['attr'][0]['num'] = intval($goods_info['goods_num']) ?: 0;
  184. $goods_info['attr'][0]['price'] = intval($goods_info['price']) ?: 0;
  185. $goods_info['attr'][0]['no'] = $goods_info['goods_no'];
  186. $goods_info['attr'][0]['integral_price'] = intval($goods_info['integral_price']) ?: 0;
  187. $goods_info['attr'][0]['cost_price'] = doubleval($goods_info['integral_price']) ?: 0;
  188. $goods_info['attr'][0]['original_price'] = doubleval($goods->original_price) ?: 0;
  189. }
  190. }
  191. if (empty($goods_info['attr']) || !is_array($goods_info['attr'])) {
  192. return [
  193. 'code' => 0,
  194. 'msg' => "没有规格"
  195. ];
  196. }
  197. $new_attr = [];
  198. foreach ($goods_info['attr'] as $i => $item) {
  199. $new_attr_item = [
  200. 'attr_list' => [],
  201. 'num' => intval($item['num']),
  202. 'price' => doubleval($item['price']),
  203. 'no' => $item['no'] ? $item['no'] : '',
  204. 'pic' => $item['pic'] ? $item['pic'] : '',
  205. 'cost_price' => sprintf('%.2f', $item['cost_price'] ?? $item['price']),
  206. 'share_commission_first' => $item['share_commission_first'] ?: '',
  207. 'share_commission_second' => $item['share_commission_second'] ?: '',
  208. 'share_commission_third' => $item['share_commission_third'] ?: '',
  209. ];
  210. foreach ($item as $k => $v) {
  211. if (strpos($k,'member') !== false) {
  212. $new_attr_item[$k] = $v;
  213. }
  214. }
  215. foreach ($item['attr_list'] as $a) {
  216. $attr_group_model = AttrGroup::findOne(['store_id' => get_store_id(), 'attr_group_name' => $a['attr_group_name'], 'is_delete' => 0]);
  217. if (!$attr_group_model) {
  218. $attr_group_model = new AttrGroup();
  219. $attr_group_model->attr_group_name = $a['attr_group_name'];
  220. $attr_group_model->store_id = get_store_id();
  221. $attr_group_model->is_delete = 0;
  222. $attr_group_model->save();
  223. }
  224. $attr_model = Attr::findOne(['attr_group_id' => $attr_group_model->id, 'attr_name' => $a['attr_name'], 'is_delete' => 0]);
  225. if (!$attr_model) {
  226. $attr_model = new Attr();
  227. $attr_model->attr_name = $a['attr_name'];
  228. $attr_model->attr_group_id = $attr_group_model->id;
  229. $attr_model->is_delete = 0;
  230. $attr_model->save();
  231. }
  232. \Yii::error((array)$attr_model,"今天是个好日子");
  233. $new_attr_item['attr_list'][] = [
  234. 'attr_id' => $attr_model->id,
  235. 'attr_name' => $attr_model->attr_name,
  236. ];
  237. }
  238. $new_attr_id = array_column($new_attr_item['attr_list'], 'attr_id');
  239. sort($new_attr_id);
  240. $goods_attr = json_decode($goods->attr, true);
  241. if ($goods_attr) {
  242. foreach ($goods_attr as $goods_attr_item) {
  243. $goods_attr_item_attr_id = array_column($goods_attr_item['attr_list'], 'attr_id');
  244. sort($goods_attr_item_attr_id);
  245. if (!array_diff($goods_attr_item_attr_id, $new_attr_id)) {
  246. $new_attr_item['cost_price'] = $goods_attr_item['cost_price'];
  247. }
  248. }
  249. }
  250. $new_attr[] = $new_attr_item;
  251. }
  252. $goods->attr = Json::encode($new_attr);
  253. if (!$goods->save()) {
  254. throw new \Exception(json_encode($goods->errors));
  255. }
  256. return [
  257. 'code' => 0,
  258. 'msg' => '操作成功'
  259. ];
  260. } catch (\Exception $e) {
  261. return [
  262. 'code' => 1,
  263. 'msg' => $e->getMessage()
  264. ];
  265. }
  266. }
  267. //设置默认规格
  268. public function getDefaultAttr()
  269. {
  270. $default_attr_name = '默认';
  271. $default_attr_group_name = '规格';
  272. $attr = Attr::findOne([
  273. 'attr_name' => $default_attr_name,
  274. 'is_delete' => 0,
  275. 'is_default' => 1,
  276. ]);
  277. $attr_group = null;
  278. if (!$attr) {
  279. $attr_group = AttrGroup::findOne([
  280. 'attr_group_name' => $default_attr_group_name,
  281. 'is_delete' => 0,
  282. ]);
  283. if (!$attr_group) {
  284. $attr_group = new AttrGroup();
  285. $attr_group->store_id = get_store_id();
  286. $attr_group->attr_group_name = $default_attr_group_name;
  287. $attr_group->is_delete = 0;
  288. $attr_group->save(false);
  289. }
  290. $attr = new Attr();
  291. $attr->attr_group_id = $attr_group->id;
  292. $attr->attr_name = $default_attr_name;
  293. $attr->is_delete = 0;
  294. $attr->is_default = 1;
  295. $attr->save(false);
  296. } else {
  297. $attr_group = AttrGroup::findOne($attr->attr_group_id);
  298. }
  299. return [$attr, $attr_group];
  300. }
  301. }