| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- <?php
- /**
- * 重庆赤晓店信息科技有限公司
- * https://www.chixiaodian.com
- * Copyright (c) 2023 赤店商城 All rights reserved.
- */
- /*
- * @Author: your name
- * @Date: 2021-03-02 09:50:20
- * @LastEditTime: 2021-05-12 10:48:03
- * @LastEditors: Please set LastEditors
- * @Description: In User Settings Edit
- * @FilePath: \admin_php\modules\client\models\v1\GoodsAttrInfoForm.php
- */
- namespace app\modules\client\models\v1;
- use app\models\ActivityNewUser;
- use app\models\ActivityNewUserGoods;
- use app\models\Cart;
- use app\models\Goods;
- use app\models\GoodsFullMinus;
- use app\models\MdGoods;
- use app\models\MdGroupActivities;
- use app\models\MdGroupActivitiesGoods;
- use app\models\PtActivity;
- use app\models\PtActivityGoods;
- use app\models\SeckillActivity;
- use app\models\SeckillActivityGoods;
- use app\models\SupplierSetting;
- use app\modules\client\models\v1\common\CommonGoods;
- use yii\base\Model;
- class GoodsAttrInfoForm extends Model
- {
- public $goods_id;
- public $attr_list;
- public $type;
- public $number;
- public $is_pt;
- public $is_seckill;
- public $miaosha_goods;
- public function rules()
- {
- return [
- [['goods_id', 'attr_list','number'], 'required'],
- [['type'], 'default', 'value' => 's'],
- [['is_pt', 'is_seckill'], 'safe']
- ];
- }
- public function search()
- {
- if (!$this->validate()) {
- return ['code' => 1, 'msg' => $this->getErrorSummary(false)[0]];
- }
- $attrList = json_decode($this->attr_list, true);
- if(!$attrList || !is_array($attrList)){
- $attrList = explode(',', $this->attr_list);
- }
- $this->attr_list = $attrList;
- $goods = Goods::findOne($this->goods_id);
- if (!$goods) {
- return [
- 'code' => 0,
- 'msg' => '商品不存在'
- ];
- }
- // $res = $goods->getAttrInfo($this->attr_list);
- foreach ($this->attr_list as $index => $value) {
- if ($value < 0) {
- unset($this->attr_list[$index]);
- }
- }
- $this->attr_list = array_values($this->attr_list);
- $GoodsFullMinus = GoodsFullMinus::find()
- ->select('*')
- ->where(['store_id' => get_store_id(),'goods_id' => $goods->id])
- ->orderBy('full_minus_num ASC')->asArray()->all();
- // 门店逻辑
- $attr = $goods->attr;
- $price = $goods->price;
- if (get_md_id()) {
- $md_goods = MdGoods::findOne(['goods_id' => $goods->id, 'md_id' => get_md_id()]);
- if ($md_goods) {
- $attr = $md_goods->attr;
- $price = $md_goods->price;
- }
- }
- //新人专享活动
- $activityAt = ActivityNewUser::activityAt($goods->store_id);
- 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);
- $ext_price = 0;
- //计算购物车当前数量与下单数量是否大于额定数量,若小于额定数量则将价格改为新人专享价格 START
- $price_open = false;
- $buy_limit = $activityAt->buy_limit;
- $attr = json_decode($attr, true);
- if ($buy_limit && $buy_limit > 0) {
- $open = false;
- //部分享受优惠
- $goodsNum = intval(Goods::getBuyNum(get_user(), $goods->id));
- if ($goodsNum < $buy_limit) {
- $open = true;
- }
- //获取购物车中的数量
- $cart = Cart::findOne([
- 'type'=>Cart::TYPE_DEFAULT,
- 'store_id' => $goods->store_id,
- 'goods_id' => $goods->id,
- 'user_id' => get_user_id(),
- 'is_delete' => 0
- ]);
- $cart_num = 0;
- if ($cart) {
- $cart_num = $cart->num ?: 0;
- }
- $total_num = $cart_num + $goodsNum;
- if ($open && $total_num < $buy_limit) {
- $price_open = true;
- }
- if ($price_open) {
- $open = false;
- foreach($ext_attrs as $ext_attr){
- $ext_attr_id = array_column($ext_attr['attr_list'], 'attr_id');
- foreach($attr as &$attr_item){
- $attr_id = array_column($attr_item['attr_list'], 'attr_id');
- sort($ext_attr_id);
- sort($attr_id);
- if($attr_id == $ext_attr_id){
- $attr_item['price'] = $ext_attr['price'];
- }
- sort($this->attr_list);
- if (empty(array_diff($attr_id, $this->attr_list))) {
- $open = true;
- $ext_price = $attr_item['price'];
- }
- }
- }
- if ($open) {
- $is_level = false;
- $GoodsFullMinus = [];
- }
- $price = $ext_price ?: $price;
- }
- }
- $attr = json_encode($attr, JSON_UNESCAPED_UNICODE);
- }
- //END
- }
- $seckill_activity_goods = [];
- if ($this->is_seckill) {
- //秒杀活动
- $seckill_activity_goods = SeckillActivityGoods::find()->alias('sag')->where(['sag.goods_id' => $goods->id])
- ->leftJoin(['sa' => SeckillActivity::tableName()], 'sag.activity_id = sa.id')
- ->andWhere(['AND', ['sa.is_delete' => 0], ['>', 'sa.end_time', time()], ['sag.is_delete' => 0]])
- ->select('sa.id, sa.self_limit_num, sa.order_limit_num, sa.start_time, sa.end_time, sag.attr, sag.seckill_num, sag.seckill_price, sag.use_attr, sag.sale_num, sag.virtual_sales')->asArray()->all();
- }
- $seckill_activity_arr = [];
- if (!empty($seckill_activity_goods)) {
- $last_names = array_column($seckill_activity_goods,'start_time');
- array_multisort($last_names, SORT_ASC, $seckill_activity_goods);
- foreach ($seckill_activity_goods as $activity_good) {
- $activity_good['progress'] = sprintf('%.2f', (($activity_good['sale_num'] + $activity_good['virtual_sales']) / ($activity_good['seckill_num'] + $activity_good['virtual_sales'])) * 100);
- $activity_good['price'] = $goods->price;
- if ($activity_good['start_time'] < time()) { //活动进行中 前端展示距离结束
- $activity_good['status'] = 1;
- $seckill_activity_arr = $activity_good;
- goto seckill_activity_arr;
- }
- if ($activity_good['start_time'] >= time()) {//活动进行中 前端展示距离开始
- $activity_good['status'] = 2;
- $seckill_activity_arr = $activity_good;
- goto seckill_activity_arr;
- }
- }
- seckill_activity_arr:
- }
- if (!empty($seckill_activity_arr)) {
- $seckill_activity_arr['attr'] = json_decode($seckill_activity_arr['attr'], true);
- $GoodsFullMinus = [];
- $goods->is_level = 0;
- // if ((int)$goods->use_attr === 1 && !empty($seckill_activity_arr['attr'])) {
- $open = false;
- foreach ($seckill_activity_arr['attr'] as $sag_attr) {
- $sag_attr_id = array_column($sag_attr['attr_list'], 'attr_id');
- $new_attr[] = $sag_attr;
- //与购物车添加的规格id数组比较
- if (empty(array_diff($sag_attr_id, $this->attr_list))) {
- $open = true;
- }
- }
- if ($open) {
- foreach ($seckill_activity_arr['attr'] as &$sag_attr) {
- $num = $sag_attr['seckill_num'];
- $sag_attr['price'] = $sag_attr['seckill_price'];
- $sag_attr['num'] = $num > 0 ? $num : 0;
- }
- $attr = json_encode($seckill_activity_arr['attr']);
- }
- $price = $seckill_activity_arr['attr'][0]['seckill_price'];
- // } else {
- // $price = $seckill_activity_arr['attr'][0]['seckill_price'];
- // }
- }
- $is_level = $goods->is_level;
- //拼团活动
- if ((int)$this->is_pt) {
- $pt_activity_goods = PtActivityGoods::find()->alias('pag')->where(['pag.goods_id' => $goods->id])
- ->leftJoin(['pa' => PtActivity::tableName()], 'pag.activity_id = pa.id')
- ->andWhere(['AND', ['pa.is_delete' => 0], ['>', 'pa.end_time', time()], ['<', 'start_time', time()], ['pag.is_delete' => 0]])
- ->select('pa.id, pa.party_size, pa.party_type, pa.party_goods_count, pa.join_num, pa.start_time, pa.end_time, pag.attr, pag.pt_price, pag.use_attr, pag.sale_num, pag.virtual_sales')->asArray()->one();
- if (!empty($pt_activity_goods)) {
- $pt_activity_goods['attr'] = json_decode($pt_activity_goods['attr'], true);
- $open = false;
- foreach ($pt_activity_goods['attr'] as &$pt_attr) {
- $pt_attr_id = array_column($pt_attr['attr_list'], 'attr_id');
- sort($pt_attr_id);
- sort($this->attr_list);
- //与购物车添加的规格id数组比较
- // array_splice($this->attr_list, 0, 1);
- if (empty(array_diff($pt_attr_id, $this->attr_list))) {
- $open = true;
- $pt_attr['price'] = $pt_attr['pt_price'];
- }
- }
- if ($open) {
- $attr = json_encode($pt_activity_goods['attr']);
- }
- $price = $pt_activity_goods['attr'][0]['pt_price'];
- }
- $is_level = false;
- }
- $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'];
- }
- $goodsData = [
- 'attr' => $attr,
- 'price' => $price,
- 'is_level' => $is_level,
- 'mch_id' => $goods->mch_id,
- 'full_minus' => $GoodsFullMinus,
- 'unit' => $goods->unit,
- 'use_attr' => $goods->use_attr,
- ];
- $res = CommonGoods::currentGoodsAttr($goodsData, (array) $this->attr_list, [], $this->number);
- $user = get_user();
- if($user && $goods['stbz_goods_id']){
- // $res['num'] % 2 && $res['num'] = 0;
- $addressData = \app\models\Address::find()->where([
- 'user_id' => get_saas_user_id(),
- 'is_default' => 1,
- 'is_delete' => 0,
- ])->limit(1)->one();
- if($addressData){
- $params = [];
- $params['address'] = [
- "area"=>$addressData['district'],//区
- "city"=>$addressData['city'],//市
- "consignee"=>$addressData['name'],//收件人
- "description"=>$addressData['detail'],//详细地址
- "phone"=>$addressData['mobile'],//联系电话
- "province"=>$addressData['province'],//省
- "street"=>'',//街道
- "freight"=>1 * 100,//运费 单位分
- ];
- $spu = [
- 'number' => 1,
- 'sku' => $res['no'],
- ];
- $params['spu'] = $spu;
- // debug_log('胜天半子可售检测' . json_encode($spu));
- $checkData = \stbz_client()->getApiResponse('get', '/v2/order/availableCheck', $params);
- // var_dump($params, $checkData);die;
- $checkData = \json_decode($checkData, true);
- $res['availableCheck'] = $checkData;
- // debug_log('胜天半子可售检测' . json_encode($checkData));
- if ($checkData['code'] == 1) {
- if($checkData['data']['code'] == 1){
- if($checkData['data']['data']['ban']){
- $res['num'] = 0;
- }
- }
- }
- }
- }
- return [
- 'code' => 0,
- 'data' => $res
- ];
- }
- }
|