| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- <?php
- /**
- * 重庆赤晓店信息科技有限公司
- * https://www.chixiaodian.com
- * Copyright (c) 2023 赤店商城 All rights reserved.
- */
- namespace app\modules\client\models\v1;
- use app\models\ActivityNewUser;
- use app\models\ActivityNewUserGoods;
- use app\models\Attr;
- use app\models\AttrGroup;
- use app\models\Cart;
- use app\models\DeliveryRules;
- use app\models\Md;
- use app\models\MdGroupActivities;
- use app\models\MdGroupActivitiesGoods;
- use app\models\Option;
- use app\models\SeckillActivity;
- use app\models\SeckillActivityGoods;
- use app\modules\client\models\v1\common\CommonGoods;
- use app\models\Goods;
- use app\models\Mch;
- use app\models\MdGoods;
- use yii\base\Model;
- use yii\data\Pagination;
- use app\models\Coupon;
- use app\models\Level;
- use app\modules\client\models\v1\order\OrderForm;
- use yii\helpers\VarDumper;
- class CartListForm extends Model
- {
- public $store_id;
- public $user_id;
- public $page;
- public $limit;
- public $list;
- public $cart_id_list;
- public $mch_list;
- public function rules()
- {
- return [
- [['page', 'limit'], 'integer'],
- [['page',], 'default', 'value' => 1],
- [['limit',], 'default', 'value' => 1000],
- ];
- }
- public function search($params = [])
- {
- $query = Cart::find()->where(['store_id' => $this->store_id, 'user_id' => $this->user_id, 'is_delete' => 0, 'type' => (int)$params['type']]);
- if (get_md_id() > 0) {
- $md_id = get_md_id();
- } else {
- $md_id = [-1, 0];
- }
- $query->andWhere(['md_id' => $md_id]);
- if (!empty($this->cart_id_list)) {
- $query->andWhere(['in', 'id', $this->cart_id_list]);
- }
- $count = $query->count();
- $pagination = new Pagination(['totalCount' => $count, 'page' => $this->page - 1, 'pageSize' => 10000,]);
- /* @var Cart[] $list */
- $list = $query->orderBy('goods_id DESC')->limit($pagination->limit)->offset($pagination->offset)->all();
- $new_list = [];
- $mch_list = [];//入驻商的商品
- $goods_id_list = []; // 平台购物车商品ids
- $mch_data = [];
- $platform_profit_strategy = Option::get('platform_profit_strategy', 0, 'store')['value'];
- $platform_profit_strategy = json_decode($platform_profit_strategy, true);
- foreach ($list as $item) {
- $goods = Goods::findOne([
- 'id' => $item->goods_id,
- 'is_delete' => 0,
- 'status' => 1,
- ]);
- if (!$goods) {
- continue;
- }
- //加价保护start
- if (!empty($platform_profit_strategy) && $goods->cloud_goods_id > 0) {
- if (intval($platform_profit_strategy['is_risk_control'])) {
- //开启风控
- $id = \Yii::$app->cache->get('risk_control_model_id_' . $item->goods_id);
- if ($id && !\Yii::$app->queue->isDone($id)) {//\Yii::$app->queue->status($id)
- \Yii::$app->queue->remove($id);
- }
- $id =\queue_push(new \app\jobs\RiskControlModelJob(['goods_id' => $item->goods_id]));
- \Yii::$app->cache->set('risk_control_model_id_' . $item->goods_id, $id);
- }
- }
- //加价保护END
- $goods_id_list[] = $item->goods_id;
- $attr_list = Attr::find()->alias('a')
- ->select('ag.attr_group_name,a.attr_name,')
- ->leftJoin(['ag' => AttrGroup::tableName()], 'a.attr_group_id=ag.id')
- ->where(['a.id' => json_decode($item->attr, true)])
- ->asArray()->all();
- // 门店逻辑
- $attr = $goods->attr;
- $price = $goods->price;
- $status = $goods->status;
- // 独立运营门店不参与活动 团购活动需要写在判断门店之前
- $activityModel = MdGroupActivitiesGoods::find()->alias('mgag')->leftJoin(['mga'=>MdGroupActivities::tableName()],'mga.id=mgag.activities_id')->where(['goods_id'=>$goods->id,'mgag.is_delete'=>0])->andWhere(['>=','mga.end_time',time()])->andWhere(['mga.is_delete'=>0])->asArray()->select('mgag.*,mga.start_time,mga.end_time')->one();
- if($activityModel){
- $attr = $activityModel['attr'];
- $price = $activityModel['price'];
- }
- if (get_md_id()) {
- $md = Md::findOne(get_md_id());
- if ($md->is_single) {
- $md_goods = MdGoods::findOne(['goods_id' => $goods->id, 'md_id' => get_md_id()]);
- if ($md_goods) {
- $attr = $md_goods->attr;
- $price = $md_goods->price;
- $status = $md_goods->status;
- }
- }
- }
- $goodsData = [
- 'attr' => $attr,
- 'price' => $price,
- 'is_level' => $goods->is_level,
- 'use_attr' => $goods->use_attr,
- ];
- $goods_attr_info = CommonGoods::currentGoodsAttr($goodsData, (array) json_decode($item->attr, true));
- $attr_num = intval(empty($goods_attr_info['num']) ? 0 : $goods_attr_info['num']);
- $goods_pic = isset($goods_attr_info['pic']) && !empty($goods_attr_info['pic']) ? $goods_attr_info['pic'] : $goods->cover_pic;
- //秒杀逻辑
- //通过商品查找进行中的活动
- // $seckill_activity_goods = SeckillActivityGoods::find()->alias('sag')->where(['sag.goods_id' => $item->goods_id])
- // ->leftJoin(['sg' => SeckillActivity::tableName()], 'sg.id = sag.activity_id')
- // ->andWhere(['AND', ['>', 'sg.end_time', time()], ['<', 'sg.start_time', time()], ['sg.is_delete' => 0, 'sag.is_delete' => 0, 'sg.store_id' => get_store_id()]])
- // ->select('sg.id, sg.end_time, sag.attr, sag.use_attr, sg.self_limit_num, sag.seckill_num, sag.seckill_price, sag.sale_num')->asArray()->one();
- // $price = 0;
- // if (!empty($seckill_activity_goods)) {
- //
- //// $seckill_activity_goods['end_time'] = date("m月d日 H:s", $seckill_activity_goods['end_time']);
- // //如果商品使用规格 且 已经查找到活动
- //// if ((int)$goods->use_attr === 1 && !empty($seckill_activity_goods['attr'])) {
- // //解码
- // $seckill_activity_goods['attr'] = $sag_attrs = json_decode($seckill_activity_goods['attr'], true);
- //
- // //获取设置的商品秒杀规格id数组与购物车添加的规格id数组比较
- // $sag_attrs = array_column($sag_attrs, 'attr_list');
- // //假设没有对应的规格信息
- // $open = false;
- // foreach ($sag_attrs as $index => $sag_attr) {
- //
- // $sag_attr_id = array_column($sag_attr, 'attr_id');
- // //与购物车添加的规格id数组比较
- // if (empty(array_diff($sag_attr_id, json_decode($item->attr, true)))) {
- // $price = $seckill_activity_goods['attr'][$index]['seckill_price'];
- // $open = true;
- // }
- // }
- // //没有对应的规格信息,则前端不传递秒杀信息
- // if (!$open) {
- // $seckill_activity_goods = [];
- // }
- //// } else {
- //// $price = $seckill_activity_goods['seckill_price'];
- //// }
- // }
- //配送时间逻辑
- $delivery_rules = DeliveryRules::find()->where(['id' => $goods->delivery_rules_id, 'is_delete' => 0, 'status' => 1, 'store_id' => get_store_id()])->select('type, times, days, name')->asArray()->one();
- if ($delivery_rules) {
- $days = "下单" . $delivery_rules['days'] . "天后";
- $delivery_rules['times'] =
- (int)$delivery_rules['type'] === 1 ? $days : date("m月d日 H:i:s", $delivery_rules['times']);
- $delivery_rules['type'] .= '';
- }
- $price = $goods_attr_info['level_price'];
- //新人专享活动
- $activityAt = ActivityNewUser::activityAt($goods->store_id);
- $open = false;
- if ($activityAt) {
- $goods_ext = ActivityNewUserGoods::findOne(['activity_id' => $activityAt->id, 'goods_id' => $goods->id, 'is_delete' => 0]);
- if ($goods_ext) {
- $ext_attrs = json_decode($goods_ext->attr, true);
- $attr_list_ = json_decode($item->attr, true);
- foreach($ext_attrs as $ext_attr){
- $ext_attr_id = array_column($ext_attr['attr_list'], 'attr_id');
- sort($ext_attr_id);
- sort($attr_list_);
- //与购物车添加的规格id数组比较
- // array_splice($this->attr_list, 0, 1);
- if (empty(array_diff($ext_attr_id, $attr_list_))) {
- $ext_price = $ext_attr['price'];
- $open = true;
- }
- }
- $buy_limit = $activityAt->buy_limit;
- if ($open) {
- if ($buy_limit && $buy_limit > 0) {
- //部分享受优惠
- $goodsNum = intval(Goods::getBuyNum(get_user(), $goods->id));
- $diff_num = $buy_limit - $goodsNum; // 1 只有$diff_num件享受新人价格
- if ($diff_num > 0) {
- $buy_num = $item->num - $diff_num;//1 - 5
- if ($buy_num > 0) {
- $price = ($diff_num * $ext_price) + ($buy_num * $price);
- } else {
- $price = $item->num * $ext_price;
- }
- }
- }else{
- //全部享受优惠
- $price = $ext_price * $item->num;
- }
- // $price = sprintf('%.2f', $price / $item->num);
- }
- }
- }
- if (!$open) {
- $price = ($price * $item->num) ?: doubleval(empty($goods_attr_info['price']) ? $goods->price : $goods_attr_info['price']) * $item->num;
- }
- $attrData = json_decode($goods['attr'], true);
- $firstAttrItem = reset($attrData);
- $member1 = 0;
- if (get_user()->level < 0) {
- if (!empty($firstAttrItem['member1'])) {
- $member1 = $firstAttrItem['member1'];
- } else {
- $findLevel = Level::find()
- ->where(['status' => 1, 'is_delete' => 0, 'store_id' => $this->store_id,])
- ->andWhere(['>', 'id', get_user()->level])
- ->one();
- $unitPrice = $goods->price;
- $quantity = $item->num;
- $totalPrice = $unitPrice * $quantity;
- if (!empty($findLevel)) {
- $discount = $findLevel->discount / 10;
- $member1 = $totalPrice * $discount;
- }
- }
- }
- $new_item = (object)[
- 'cart_id' => $item->id,
- 'goods' => $goods,
- 'goods_id' => $goods->id,
- 'goods_name' => $goods->name,
- 'goods_pic' => $goods_pic,
- 'num' => $item->num,
- 'attr_list' => $attr_list,
- 'original_price' => doubleval($goods->original_price * $item->num),
- 'price' => floor_num($price, 2),
- '$goods_attr_info' => $goods_attr_info,
- 'unitPrice' => $price ?: doubleval($goods_attr_info['price']),
- 'max_num' => $attr_num,
- 'disabled' => ($item->num > $attr_num) ? true : false,
- 'status' => $status,
- 'seckill_activity_goods' => null, //$seckill_activity_goods ?: null, //秒杀逻辑,商品不可加购物车
- 'delivery_rules' => $delivery_rules ?: null,
- 'cost_price' => $goods->cost_price,
- 'user_id' => get_user_id(),
- // 'mch_id' => $md_id,
- 'rate' => $goods->rate,
- 'rate_type' => $goods->rate_type,
- 'balance' => $goods->balance,
- 'single_price' => $goods->price,
- 'weight' => $goods->weight,
- 'integral_price' => $goods->integral_price,
- 'freight' => $goods->freight,
- 'full_cut' => $goods->full_cut,
- 'goods_cat_id' => $goods->cat_id,
- 'id' => $goods->id,
- 'verify_card_id' => [],
- 'type' => $goods->type,
- 'delivery_type' => $goods->delivery_type,
- 'pieces' => $goods->pieces,
- 'forehead' => $goods->forehead,
- 'level_price' => $member1 ?? 0,
- 'user_is_level' => get_user()->level > 0 ? true : false,
- 'level_price_arr' => $firstAttrItem,
- 'original_price' => $firstAttrItem['original_price'],
- 'product_type' => $goods->product_type,
- ];
- if ($goods->mch_id != 0) {
- if (!is_array($mch_list['mch_id_' . $goods->mch_id])) {
- $mch_list['mch_id_' . $goods->mch_id] = [];
- }
- $new_item->mch_id = $goods->mch_id;
- $mch_list['mch_id_' . $goods->mch_id][] = $new_item;
- } else {
- $new_list[] = $new_item;
- }
- }
- $new_mch_list = [];
- foreach ($mch_list as $i => $item) {
- $mch = Mch::findOne([
- 'id' => $item[0]->mch_id,
- 'is_delete' => 0,
- 'is_open' => 1,
- 'is_lock' => 0,
- ]);
- if ($mch) {
- $new_mch_list[] = [
- 'id' => $mch->id,
- 'name' => $mch->name,
- 'list' => $item,
- ];
- }
- }
- // 获取平台可用优惠券
- $coupon_list = Coupon::getList(0, 0, 0, $goods_id_list);
- foreach ($new_mch_list as &$value) {
- $mch_goods_id_list = [];
- foreach ($value['list'] as $v) {
- $mch_goods_id_list[] = $v->goods_id;
- }
- $value['coupon_list'] = Coupon::getList($value['id'], 0, 0, $mch_goods_id_list);
- }
- $mch_data = [
- 'mch_id' => get_mch_id(),
- 'goods_list' => $new_list,
- 'name' => '平台自营',
- 'send_type' => ['express', 'shop'],
- 'is_shop' => null,
- 'shop_list' => [],
- 'plugin_type' => 0,
- 'total_price' => array_sum(array_column($new_list, 'price')),
- 'level_price' => array_sum(array_column($new_list, 'level_price')),
- 'level_price_arr' => [
- 'member1' => array_sum(array_column($new_list, 'level_price')),
- 'member2' => array_sum(array_column($new_list, 'next_level_price')),
- 'member6' => array_sum(array_column($new_list, 'next_level_price')),
- ],
- 'payment_type' => 0,
- 'diy_send_type' => [
- ['key' => 'express', 'name' => '快递配送'],
- ['key' => 'shop', 'name' => '自提配送'],
- ['key' => 'delivery', 'name' => '同城配送'],
- ],
- 'next_level_price' => '',
- 'next_level' => null,
- 'integral' => ['forehead' => 0, 'forehead_integral' => 0],
- 'coupon_list' => $new_mch_list['coupon_list'],
- ];
- $shipping_fee = new OrderForm();
- $calculations_shipping = $shipping_fee->getExpressPrice($mch_data);
- return [
- 'code' => 0,
- 'msg' => 'success',
- 'data' => [
- 'row_count' => $count,
- 'page_count' => $pagination->pageCount,
- 'list' => $new_list,
- 'mch_list' => $new_mch_list,
- 'coupon_list' => $coupon_list,
- 'shipping_fee' => $calculations_shipping,
- ],
- ];
- }
-
- public function save($params = [])
- {
- $type = (int)$params['type'];
- if ($this->list) {
- $cart_list = json_decode($this->list, true);
- foreach ($cart_list as $v) {
- $form = Cart::find()->where(['type'=>$type,'store_id' => $this->store_id, 'is_delete' => 0])->andWhere('id=:id', [':id' => $v['cart_id']])->one();
- $form->num = $v['num'];
- $form->save();
- }
- };
- if ($this->mch_list) {
- $mch_list = json_decode($this->mch_list, true);
- if (is_array($mch_list)) {
- foreach ($mch_list as $i => $mch) {
- if (is_array($mch['list'])) {
- foreach ($mch['list'] as $j => $item) {
- $cart = Cart::findOne([
- 'type'=>$type,
- 'id' => $item['cart_id'],
- 'user_id' => $this->user_id,
- ]);
- if (!$cart) {
- continue;
- }
- $cart->num = intval($item['num']);
- $cart->save();
- }
- }
- }
- }
- }
- return [
- 'code' => 0,
- 'msg' => 'success',
- ];
- }
- }
|