CartListForm.php 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\alliance\models;
  8. use app\models\ActivityNewUser;
  9. use app\models\ActivityNewUserGoods;
  10. use app\models\Attr;
  11. use app\models\AttrGroup;
  12. use app\models\Cart;
  13. use app\models\SaasUser;
  14. use app\models\Store;
  15. use app\models\BusinessCart;
  16. //use app\modules\client\models\v1\common\CommonGoods;
  17. use app\models\User;
  18. use app\modules\alliance\models\CommonGoods;
  19. use app\models\Goods;
  20. use app\models\Mch;
  21. use app\models\MdGoods;
  22. use yii\base\Model;
  23. use yii\data\Pagination;
  24. use app\models\Coupon;
  25. class CartListForm extends Model
  26. {
  27. public $store_id;
  28. public $saas_id;
  29. public $page;
  30. public $limit;
  31. public $list;
  32. public $mch_list;
  33. public function rules()
  34. {
  35. return [
  36. [['page', 'limit'], 'integer'],
  37. [['page',], 'default', 'value' => 1],
  38. [['limit',], 'default', 'value' => 1000],
  39. ];
  40. }
  41. public function search()
  42. {
  43. $query = BusinessCart::find()->where(['saas_id' => $this->saas_id, 'is_delete' => 0]);
  44. if($this->store_id > 0){
  45. $query->andWhere(['store_id' => $this->store_id]);
  46. }
  47. $count = $query->count();
  48. $pagination = new Pagination(['totalCount' => $count, 'page' => $this->page - 1, 'pageSize' => 10000,]);
  49. /* @var Cart[] $list */
  50. $list = $query->orderBy('store_id DESC')->limit($pagination->limit)->offset($pagination->offset)->all();
  51. $new_list = [];
  52. $mch_list = [];//入驻商的商品
  53. $goods_id_list = []; // 平台购物车商品ids
  54. foreach ($list as $item) {
  55. $goods = Goods::findOne([
  56. 'id' => $item->goods_id,
  57. 'is_delete' => 0,
  58. 'status' => 1,
  59. ]);
  60. if (!$goods) {
  61. continue;
  62. }
  63. $goods_id_list[] = $item->goods_id;
  64. $attr_list = Attr::find()->alias('a')
  65. ->select('ag.attr_group_name,a.attr_name,')
  66. ->leftJoin(['ag' => AttrGroup::tableName()], 'a.attr_group_id=ag.id')
  67. ->where(['a.id' => json_decode($item->attr, true)])
  68. ->asArray()->all();
  69. // 门店逻辑
  70. $attr = $goods->attr;
  71. $price = $goods->price;
  72. $status = $goods->status;
  73. $goodsData = [
  74. 'attr' => $attr,
  75. 'price' => $price,
  76. 'is_level' => $goods->is_level,
  77. 'use_attr' => $goods->use_attr,
  78. ];
  79. $goods_attr_info = CommonGoods::currentGoodsAttr($goodsData, (array) json_decode($item->attr, true));
  80. $attr_num = intval(empty($goods_attr_info['num']) ? 0 : $goods_attr_info['num']);
  81. $goods_pic = isset($goods_attr_info['pic']) && !empty($goods_attr_info['pic']) ? $goods->getGoodsPic(0)->pic_url : $goods->cover_pic;
  82. $storeInfo = Store::find()->where(['id'=>$item->store_id,'is_delete'=>0])->asArray()->one();
  83. $price = $goods_attr_info['level_price'];
  84. //新人专享活动
  85. $activityAt = ActivityNewUser::activityAt($goods->store_id);
  86. $open = false;
  87. if ($activityAt) {
  88. $goods_ext = ActivityNewUserGoods::findOne(['activity_id' => $activityAt->id, 'goods_id' => $goods->id, 'is_delete' => 0]);
  89. if ($goods_ext) {
  90. $ext_attrs = json_decode($goods_ext->attr, true);
  91. $attr_list_ = json_decode($item->attr, true);
  92. foreach($ext_attrs as $ext_attr){
  93. $ext_attr_id = array_column($ext_attr['attr_list'], 'attr_id');
  94. sort($ext_attr_id);
  95. sort($attr_list_);
  96. //与购物车添加的规格id数组比较
  97. // array_splice($this->attr_list, 0, 1);
  98. if (empty(array_diff($ext_attr_id, $attr_list_))) {
  99. $ext_price = $ext_attr['price'];
  100. $open = true;
  101. }
  102. }
  103. $buy_limit = $activityAt->buy_limit;
  104. if ($open) {
  105. if ($buy_limit && $buy_limit > 0) {
  106. //部分享受优惠
  107. $saas_user = SaasUser::findOne(get_saas_user_id());
  108. if ($saas_user) {
  109. $user = User::findOne(['binding' => $saas_user->mobile, 'store_id' => $goods->store_id, 'is_delete' => 0]);
  110. if ($user) {
  111. $goodsNum = intval(Goods::getBuyNum($user, $goods->id));
  112. $diff_num = $buy_limit - $goodsNum; // 1 只有$diff_num件享受新人价格
  113. if ($diff_num > 0) {
  114. $buy_num = $item->num - $diff_num;//1 - 5
  115. if ($buy_num > 0) {
  116. $price = ($diff_num * $ext_price) + ($buy_num * $price);
  117. } else {
  118. $price = $item->num * $ext_price;
  119. }
  120. }
  121. } else {
  122. $open = false;
  123. }
  124. }
  125. }else{
  126. //全部享受优惠
  127. $price = $ext_price * $item->num;
  128. }
  129. // $price = sprintf('%.2f', $price / $item->num);
  130. }
  131. }
  132. }
  133. if (!$open) {
  134. $price = ($price * $item->num) ?: doubleval(empty($goods_attr_info['price']) ? $goods->price : $goods_attr_info['price']) * $item->num;
  135. }
  136. $new_item = (object)[
  137. 'cart_id' => $item->id,
  138. 'store_id'=> $item->store_id,
  139. 'store_name' => (isset($storeInfo['name'])) ? $storeInfo['name'] : '',
  140. 'store_logo' => (isset($storeInfo['logo'])) ? $storeInfo['logo'] : '',
  141. 'store_business_model' => (isset($storeInfo['business_model'])) ? $storeInfo['business_model'] : '',
  142. 'goods_id' => $goods->id,
  143. 'goods_name' => $goods->name,
  144. 'goods_pic' => $goods_pic,
  145. 'num' => $item->num,
  146. 'attr_list' => $attr_list,
  147. 'price' => (float)$price,
  148. 'unitPrice' => doubleval($goods_attr_info['price']),
  149. 'max_num' => $attr_num,
  150. 'disabled' => ($item->num > $attr_num) ? true : false,
  151. 'status' => $status
  152. ];
  153. if ($goods->mch_id != 0) {
  154. if (!is_array($mch_list['mch_id_' . $goods->mch_id])) {
  155. $mch_list['mch_id_' . $goods->mch_id] = [];
  156. }
  157. $new_item->mch_id = $goods->mch_id;
  158. $mch_list['mch_id_' . $goods->mch_id][] = $new_item;
  159. } else {
  160. $new_list[] = $new_item;
  161. }
  162. }
  163. $new_mch_list = [];
  164. foreach ($mch_list as $i => $item) {
  165. $mch = Mch::findOne([
  166. 'id' => $item[0]->mch_id,
  167. 'is_delete' => 0,
  168. 'is_open' => 1,
  169. 'is_lock' => 0,
  170. ]);
  171. if ($mch) {
  172. $new_mch_list[] = [
  173. 'id' => $mch->id,
  174. 'name' => $mch->name,
  175. 'list' => $item,
  176. ];
  177. }
  178. }
  179. // 获取平台可用优惠券
  180. $coupon_list = Coupon::getAllianceList(0, 0, $goods_id_list);
  181. // foreach ($new_mch_list as &$value) {
  182. // $mch_goods_id_list = [];
  183. // foreach ($value['list'] as $v) {
  184. // $mch_goods_id_list[] = $v->goods_id;
  185. // }
  186. // $value['coupon_list'] = Coupon::getList($value['id'], 0, 0, $mch_goods_id_list);
  187. // }
  188. return [
  189. 'code' => 0,
  190. 'msg' => 'success',
  191. 'data' => [
  192. 'row_count' => $count,
  193. 'page_count' => $pagination->pageCount,
  194. 'list' => $new_list,
  195. 'mch_list' => $new_mch_list,
  196. 'coupon_list' => $coupon_list['list'],
  197. ],
  198. ];
  199. }
  200. public function save()
  201. {
  202. if ($this->list) {
  203. $cart_list = json_decode($this->list, true);
  204. foreach ($cart_list as $v) {
  205. $form = BusinessCart::find()->where(['store_id' => $this->store_id, 'is_delete' => 0])->where('id=:id', [':id' => $v['cart_id']])->one();
  206. $form->num = $v['num'];
  207. $form->save();
  208. }
  209. };
  210. if ($this->mch_list) {
  211. $mch_list = json_decode($this->mch_list, true);
  212. if (is_array($mch_list)) {
  213. foreach ($mch_list as $i => $mch) {
  214. if (is_array($mch['list'])) {
  215. foreach ($mch['list'] as $j => $item) {
  216. $cart = BusinessCart::findOne([
  217. 'id' => $item['cart_id'],
  218. 'saas_id' => $this->saas_id,
  219. ]);
  220. if (!$cart) {
  221. continue;
  222. }
  223. $cart->num = intval($item['num']);
  224. $cart->save();
  225. }
  226. }
  227. }
  228. }
  229. }
  230. return [
  231. 'code' => 0,
  232. 'msg' => 'success',
  233. ];
  234. }
  235. }