| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829 |
- <?php
- namespace common\models\diy;
- use addons\Community\common\models\CommunityGoods;
- use addons\Community\common\models\CommunityGoodsSetting;
- use addons\Course\common\models\AddonsCourse;
- use addons\Store\common\enums\CouponEnum;
- use addons\Store\common\models\Store;
- use addons\Store\common\models\StoreGoods;
- use addons\Store\common\models\StoreGoodsCate;
- use addons\Store\common\models\StoreGoodsCateRelate;
- use addons\Store\common\models\StoreCoupon;
- use common\enums\OrderStatusEnum;
- use common\enums\StatusEnum;
- use common\helpers\StringHelper;
- use common\models\goods\Goods;
- use common\models\goods\GoodsCate;
- use common\models\goods\GoodsCateRelate;
- use common\models\order\Order;
- use addons\OperatingNote\common\models\AddonsOperatingNoteContent;
- use addons\Store\common\models\StoreGoodsExtra;
- use common\enums\AddonsEnum;
- use common\models\goods\GoodsExtra;
- use common\models\goods\template\GoodsDecorationTemplate;
- use common\models\user\User;
- use common\models\user\UserLevel;
- use common\globals\GlobalInvoke;
- use Yii;
- use yii\db\Exception;
- use yii\helpers\Json;
- use common\enums\DiyEnum;
- use common\helpers\ArrayHelper;
- use common\logic\common\GoodsLogic;
- use common\models\mall\MallAddons;
- class DiyComponentsData extends \common\models\base\BaseActiveRecord
- {
- /**
- * 获取组件对应的数据
- * @Author: lun
- * @DateTime: 2021/11/2 0002 19:20
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $mallId
- * @param $userId
- * @param $list
- * @return array
- */
- public static function getCompentsData($mallId, $list, $userId = 0)
- {
- $data = [];
- $time = time();
- $user = User::find()->where(['mall_id' => $mallId, 'id' => $userId])->select('id, mall_id, level')->limit(1)->one();
- if (!empty($user)) {
- //基础会员等级折扣
- $user_level = UserLevel::findOne(['mall_id' => $mallId, 'level' => $user['level'], 'status' => StatusEnum::ENABLED]);
- }
- foreach ($list as $item) {
- switch ($item['identify']) {
- case 'order_broadcast': // 订单播报-获取最新的三十条数据
- if (empty($item['params']['is_virtual'])) {
- $before_day = strtotime(date("Y-m-d", strtotime("-3 day")));
- $broadcast_params = ['where' => [['=', 'mall_id', $mallId], ['=', 'pay_status', OrderStatusEnum::PAY], ['>=', 'pay_time', $before_day]], 'with' => 'base_user', 'select' => 'id,user_id,pay_time,created_at', 'order' => 'id desc', 'limit' => $item['limit'] ?? 20];
- $orders = Order::lists($broadcast_params, true);
- foreach ($orders as $order) {
- $nickname = $order['base_user']['nickname'];
- $username = (mb_strlen($nickname) > 4) ? mb_substr($nickname, 0, 4) . '...' : $nickname;
- $data[$item['site']][] = [
- 'avatar' => $order['base_user']['avatar_url'],
- 'time' => $time - $order['pay_time'],
- 'username' => $username,
- 'mobile' => substr_replace($order['base_user']['mobile'], '****', 3, 4),
- 'created_at' => $order['created_at'],
- ];
- }
- } else {
- $data[$item['site']] = self::virtualOrderBroadcast($item['limit']);
- }
- break;
- case 'goods_cate': // 商品分类
- // todo 千人千面功能后续再开发
- $goods_cate_ids = GoodsCate::getAllCate($mallId, [$item['id']]);
- $goods_ids = GoodsCateRelate::find()->select('goods_id')->andWhere(['in', 'cate_id' ,$goods_cate_ids])->column();
- $goods_where[] = ['=', 'mall_id', $mallId];
- $goods_where[] = ['in', 'id', $goods_ids];
- $goods_where[] = ['=', 'status', StatusEnum::ENABLED];
- $goods_where[] = ['=', 'is_on_sale', StatusEnum::ENABLED];
- $goods_select = 'id,mch_id,goods_name,subtitle,price,original_price,cover_pic,virtual_sales,sales_num,goods_type,goods_source';
- $goods_params = array('where' => $goods_where, 'select' => $goods_select, 'order' => 'sort asc,id desc,created_at desc', 'page' => $item['page'] ?? 1, 'limit' => $item['limit'] ?? 20);
- $goods = Goods::lists($goods_params, true);
- foreach ($goods as &$good) {
- $good['sales_num'] += $good['virtual_sales'];
- unset($good['virtual_sales']);
- if (!empty($good['goods_source'])) {
- $t_class = "\\addons\\{$good['goods_source']}\\common\\service\\ShoppingCartService";
- if (is_callable([$t_class, "getCanAddToCart"])) {
- $good = $t_class::getCanAddToCart($good, $mallId);
- }
- }
- }
- unset($good);
- $data[$item['site']] = self::getMemberPrice($mallId, $goods, 1, $userId);
- $data = GlobalInvoke::exec(GlobalInvoke::GOODS_LIST_EXTRA,$mallId,['mall_id'=>$mallId,'user_id'=>$userId,'type'=>'goods_cate','goods_list'=>$data]) ?: $data;
- $data_temp = $data;
- $result = [];
- if(isset($data_temp['goods_list'])) {
- foreach ($data_temp['goods_list'] as $v) {
- $result[] = $v;
- }
- $data = $result;
- }
- break;
- case 'store_goods_cate': // 商品分类
- $goods_cate_ids = StoreGoodsCate::getAllCate($mallId, null, [$item['id']]);
- $goods_ids = StoreGoodsCateRelate::find()->select('goods_id')->andWhere(['in', 'cate_id' ,$goods_cate_ids])->column();
- $goods_where[] = ['=', 'mall_id', $mallId];
- $goods_where[] = ['in', 'id', $goods_ids];
- $goods_where[] = ['=', 'status', StatusEnum::ENABLED];
- $goods_where[] = ['=', 'is_on_sale', StatusEnum::ENABLED];
- $goods_select = 'id,goods_name,subtitle,price,original_price,cover_pic,virtual_sales,sales_num,goods_type,goods_source';
- $goods_params = array('where' => $goods_where, 'select' => $goods_select, 'order' => 'sort asc,id desc,created_at desc', 'page' => $item['page'] ?? 1, 'limit' => $item['limit'] ?? 20);
- $goods = StoreGoods::lists($goods_params, true);
- foreach ($goods as &$good) {
- $good['sales_num'] += $good['virtual_sales'];
- unset($good['virtual_sales']);
- if (!empty($good['goods_source'])) {
- $t_class = "\\addons\\{$good['goods_source']}\\common\\service\\ShoppingCartService";
- if (is_callable([$t_class, "getCanAddToCart"])) {
- $good = $t_class::getCanAddToCart($good, $mallId);
- }
- }
- }
- unset($good);
- $data[$item['site']] = self::getStoreMemberPrice($mallId, $goods, 1, $userId);
- $data = GlobalInvoke::exec(GlobalInvoke::GOODS_LIST_EXTRA,$mallId,['mall_id'=>$mallId,'user_id'=>$userId,'type'=>'goods_cate','goods_list'=>$data]) ?: $data;
- $data_temp = $data;
- $result = [];
- if(isset($data_temp['goods_list'])) {
- foreach ($data_temp['goods_list'] as $v) {
- $result[] = $v;
- }
- $data = $result;
- }
- break;
- case 'goods_cate_page':
- // todo 千人千面功能后续再开发
- $goods_cate_ids = GoodsCate::getAllCate($mallId, [$item['id']]);
- $goods_ids = GoodsCateRelate::find()->select('goods_id')->andWhere(['in', 'cate_id' ,$goods_cate_ids])->column();
- $goods_where[] = ['=', 'mall_id', $mallId];
- $goods_where[] = ['in', 'id', $goods_ids];
- $goods_where[] = ['=', 'status', StatusEnum::ENABLED];
- $goods_where[] = ['=', 'is_on_sale', StatusEnum::ENABLED];
- $goods_select = 'id,mch_id,goods_name,subtitle,price,original_price,cover_pic,virtual_sales,sales_num,goods_type,goods_source';
- $goods_params = array('where' => $goods_where, 'select' => $goods_select, 'order' => 'sort asc,id desc,created_at desc', 'page' => $item['page'] ?? 1, 'limit' => $item['limit'] > 0 ? $item['limit'] :20);
- $goods_list = Goods::listPage($goods_params, false);
- $goods = $goods_list['list'];
- if (!empty($goods)) {
- foreach ($goods as &$good) {
- $good['sales_num'] += $good['virtual_sales'];
- unset($good['virtual_sales']);
- if (!empty($good['goods_source'])) {
- $t_class = "\\addons\\{$good['goods_source']}\\common\\service\\ShoppingCartService";
- if (is_callable([$t_class, "getCanAddToCart"])) {
- $good = $t_class::getCanAddToCart($good, $mallId);
- }
- }
- }
- unset($good);
- }
- $data[$item['site']] = self::getMemberPrice($mallId, $goods, 1, $userId);
- $data = GlobalInvoke::exec(GlobalInvoke::GOODS_LIST_EXTRA,$mallId,['mall_id'=>$mallId,'user_id'=>$userId,'type'=>'goods_cate','goods_list'=>$data]) ?: $data;
- $data_temp = $data;
- $goods_list['list'] = $data[0];
- $result = [];
- if(isset($data_temp['goods_list'])) {
- // foreach ($data_temp['goods_list'] as $v) {
- // $result[] = $v;
- // }
- // $goods_list['list'] = $result;
- $goods_list['list'] = call_user_func_array('array_merge', $data_temp['goods_list']);
- }
- $data = $goods_list;
- break;
- case 'store_goods_cate_page':
- // todo 千人千面功能后续再开发
- $goods_cate_ids = StoreGoodsCate::getAllCate($mallId, null, [$item['id']]);
- $goods_ids = StoreGoodsCateRelate::find()->select('goods_id')->andWhere(['in', 'cate_id' ,$goods_cate_ids])->column();
- $goods_where[] = ['=', 'mall_id', $mallId];
- $goods_where[] = ['in', 'id', $goods_ids];
- $goods_where[] = ['=', 'status', StatusEnum::ENABLED];
- $goods_where[] = ['=', 'is_on_sale', StatusEnum::ENABLED];
- $goods_select = 'id,goods_name,subtitle,price,original_price,cover_pic,virtual_sales,sales_num,goods_type,goods_source';
- $goods_params = array('where' => $goods_where, 'select' => $goods_select, 'order' => 'sort asc,id desc,created_at desc', 'page' => $item['page'] ?? 1, 'limit' => $item['limit'] > 0 ? $item['limit'] :20);
- $goods_list = StoreGoods::listPage($goods_params, false);
- $goods = $goods_list['list'];
- if (!empty($goods)) {
- foreach ($goods as &$good) {
- $good['sales_num'] += $good['virtual_sales'];
- unset($good['virtual_sales']);
- if (!empty($good['goods_source'])) {
- $t_class = "\\addons\\{$good['goods_source']}\\common\\service\\ShoppingCartService";
- if (is_callable([$t_class, "getCanAddToCart"])) {
- $good = $t_class::getCanAddToCart($good, $mallId);
- }
- }
- }
- unset($good);
- }
- $data[$item['site']] = self::getStoreMemberPrice($mallId, $goods, 1, $userId);
- $data = GlobalInvoke::exec(GlobalInvoke::GOODS_LIST_EXTRA,$mallId,['mall_id'=>$mallId,'user_id'=>$userId,'type'=>'goods_cate','goods_list'=>$data]) ?: $data;
- $data_temp = $data;
- $goods_list['list'] = $data[0];
- $result = [];
- if(isset($data_temp['goods_list'])) {
- foreach ($data_temp['goods_list'] as $v) {
- $result[] = $v;
- }
- $goods_list['list'] = $result;
- }
- $data = $goods_list;
- break;
- case 'goods': // 商品
- $goods_params = ['where' => [['=', 'mall_id', $mallId], ['in', 'id', Json::decode($item['id'], true)], ['=', 'status', StatusEnum::ENABLED], ['=', 'is_on_sale', StatusEnum::ENABLED]], 'select' => 'id,goods_name,subtitle,price,original_price,cover_pic,(sales_num+virtual_sales) as sales_num,is_attr, goods_type,goods_source', 'index' => 'id'];
- if ($item['limit']) {
- $goods_params['page'] = $item['page'] ?? 1;
- $page_data = Goods::listPage($goods_params, false, true);
- $data = $page_data['list'];
- } else {
- $data = Goods::lists($goods_params, true);
- }
- if(isset($item['addonsFields'])){
- $data = Goods::getAddonsGoodsSetting($mallId, $item['addonsFields'], $data, 'list');
- }
- if($user_level && !empty($user_level['member_price_is_show'])){
- foreach($data as &$good){
- $good['member_price_is_show'] = 0;
- $good['member_price_info'] = [];
- // $item['price'] = GoodsLogic::getMemberPriceList($mallId,$item,$user,true);
- $good['member_price'] = GoodsLogic::getMemberPriceList($mallId,$good,$user,true);
- }
- unset($good);
- }else{
- $data = self::getMemberPrice($mallId, $data, 0, $userId);
- }
- $data = GlobalInvoke::exec(GlobalInvoke::GOODS_LIST_EXTRA,$mallId,['mall_id'=>$mallId,'user_id'=>$userId,'type'=>'goods','goods_list'=>$data]) ?: $data;
- $data_temp = $data;
- $result = [];
- if(isset($data_temp['goods_list'])){
- foreach ($data_temp['goods_list'] as $v){
- if (!empty($v['goods_source'])) {
- $t_class = "\\addons\\{$v['goods_source']}\\common\\service\\ShoppingCartService";
- if (is_callable([$t_class, "getCanAddToCart"])) {
- $v = $t_class::getCanAddToCart($v, $mallId);
- }
- }
- $result[$v['id']] = $v;
- }
- $data = $result;
- } else {
- foreach ($data as &$good) {
- unset($good['virtual_sales']);
- if (!empty($good['goods_source'])) {
- $t_class = "\\addons\\{$good['goods_source']}\\common\\service\\ShoppingCartService";
- if (is_callable([$t_class, "getCanAddToCart"])) {
- $good = $t_class::getCanAddToCart($good, $mallId);
- }
- }
- }
- }
- if (!empty($item['page']) && !empty($item['limit'])) {
- $page_data['list'] = array_values($data);
- $data = $page_data;
- }
- break;
- case 'course': // 课程
- $course_params = ['where' => [['=', 'mall_id', $mallId], ['=', 'status', StatusEnum::ENABLED]], 'select' => 'id,mall_id,cat_id as cate_id,name,cat_id,sell_type,price,line_off_price,sales,logo,is_open_vm,vm_likes,vm_shares,vm_views,likes,shares,views,comments,status,created_at,introduce', 'index' => 'id'];
- $data = AddonsCourse::lists($course_params, true);
- break;
- case 'operating_note': // 运营笔记
- $params = ['where' => [['=', 'mall_id', $mallId], ['in', 'id', Json::decode($item['id'], true)], ['=', 'status', StatusEnum::ENABLED]], 'select' => 'title,cover_img,views_num,likes_num,created_at,content_href,note_type,id,virtual_likes_num,virtual_views_num', 'order' => 'id desc'];
- $data = AddonsOperatingNoteContent::lists($params, true);
- break;
- case 'goods_strategy':
- $params = ['strategy' => $item['strategy'], 'displayNumber' => $item['displayNumber']];
- $data = GoodsDecorationTemplate::getGoodsListByStrategy($mallId, $params);
- break;
- case 'store_cate_recommend': // 商品分类
- // $where = [
- // 'mall_id' => $mallId,
- // 'status' => StatusEnum::ENABLED,
- // 'is_recommend' => 1,
- // 'is_on_sale' => StatusEnum::ENABLED,
- // ];
- $goods_ids = [];
- if (empty($item['cate_id']) && empty($item['id'])) { //没有分类id则返回空
- return ['list' => [], 'count' => 0, 'page' => 1, 'limit' => $data['limit']];
- }
- if (!empty($item['id']) && empty($item['cate_id'])) {
- // 判断是否是全部分类
- $item['cate_id'] = StoreGoodsCate::getStoreGoodsAllCate($mallId, $item['id']);
- }
- //根据所有一级分类,获取所有分类
- $goods_cate_ids = StoreGoodsCate::getAllCate($mallId, null, $item['cate_id']);
- $goods_ids = StoreGoodsCateRelate::find()->select('goods_id')->andWhere(['in', 'cate_id' ,$goods_cate_ids])->column();
- //获取对应分类的商品id
- if (!empty($goods_ids)) {
- $item['id'] = $goods_ids;
- } else { //无数据则返回空
- return ['list' => [], 'count' => 0, 'page' => 1, 'limit' => $data['limit']];
- }
- $item['is_recommend'] = 1;
- // if (!empty($item['id'])) { //单选分类
- // $where = [['c_id' => $item['id']]];
-
- // }
- // unset($item['id']);
- // if (!empty($item['keyword'])) {
- // $where['keyword'] = trim($item['keyword']);
- // }
- // $params = [
- // 'where' => $where,
- // 'select' => 'id,store_id,goods_name,price,original_price,cover_pic,(virtual_sales+sales_num) as sales_num, show_style,goods_type',
- // 'order' => 'sort asc',
- // 'limit' => $item['limit'] ?? 10,
- // 'page' => $item['page'] ?? 10,
- // ];
- // $goods = StoreGoods::listPage($params, false);
-
- $goods = self::storeGoodsSqlCombination($mallId, $item);
- if (!empty($goods['list'])) {
- $goods['list'] = self::getStoreMemberPrice($mallId, $goods['list'], 1, $userId);
- // $goods = array_column($goods, null, 'id');
- foreach ($goods['list'] as &$val) {
- $val['discount'] = bcsub($val['original_price'], $val['price'], 2);
- if ($val['discount'] < 0) $val['discount'] = 0;
- }
- }
- $data = $goods;
- break;
- case 'store-commodity-cate'://o2o门店商品组--选择分类
- $goods_ids = [];
-
- if (empty($item['cate_id'])) { //没有分类id则返回空
- return ['list' => [], 'count' => 0, 'page' => 1, 'limit' => $data['limit']];
- }
- unset($item['id']);
- //根据所有一级分类,获取所有分类
- $goods_cate_ids = StoreGoodsCate::getAllCate($mallId, null, $item['cate_id']);
- $goods_ids = StoreGoodsCateRelate::find()->select('goods_id')->andWhere(['in', 'cate_id' ,$goods_cate_ids])->column();
- //获取对应分类的商品id
- if (!empty($goods_ids)) {
- $item['id'] = $goods_ids;
- } else { //无数据则返回空
- return ['list' => [], 'count' => 0, 'page' => 1, 'limit' => $data['limit']];
- }
-
- //获取商品数据
- $goods = self::storeGoodsSqlCombination($mallId, $item);
- if (!empty($goods['list'])) {
- $goods['list'] = self::getStoreMemberPrice($mallId, $goods['list'], 1, $userId);
- // $goods = array_column($goods, null, 'id');
- foreach ($goods['list'] as &$val) {
- $val['discount'] = bcsub($val['original_price'], $val['price'], 2);
- if ($val['discount'] < 0) $val['discount'] = 0;
- }
- }
- $data = $goods;
- break;
- case 'best-sellers': // 商品
- $goods_ids = Json::decode($item['id'], true);
- $goods_params = [
- 'alias' => 'sg',
- 'where' => [
- ['sg.mall_id' => $mallId],
- ['sg.is_recommend' => 1],
- ['sg.id' => $goods_ids],
- ['sg.status' => StatusEnum::ENABLED],
- ['sg.is_on_sale' => StatusEnum::ENABLED]
- ],
- 'select' => 'sg.id,sg.store_id,sg.goods_name,sg.subtitle,sg.price,sg.original_price,sg.cover_pic,(sg.sales_num+sg.virtual_sales) as sales_num,sg.show_style,sg.goods_type',
- ];
- // $item['is_recommend'] = 1;
- // $list = self::storeGoodsSqlCombination($mallId, $item);
- // $data = $list['list'];
- $data = StoreGoods::lists($goods_params, true);
- $data = array_column($data, null, 'id');
- foreach ($data as &$val) {
- $val['discount'] = bcsub($val['original_price'], $val['price'], 2);
- if ($val['discount'] < 0) $val['discount'] = 0;
- }
- if($user_level && !empty($user_level['member_price_is_show'])){
- foreach($data as &$item){
- $item['member_price_is_show'] = 0;
- $item['member_price_info'] = [];
- $item['price'] = GoodsLogic::getMemberPriceList($mallId,$item,$user,true);
- $item['member_price'] = $item['price'];
- }
- unset($item);
- }else{
- $data = self::getMemberPrice($mallId, $data, 0, $userId);
- }
- break;
- case 'store-goods': // o2o商品组
- // $goods_params = [
- // 'where' => [
- // ['=', 'mall_id', $mallId],
- // ['in', 'id', Json::decode($item['id'], true)],
- // ['=', 'status', StatusEnum::ENABLED],
- // ['=', 'is_on_sale', StatusEnum::ENABLED]
- // ],
- // 'select' => 'id,goods_name,subtitle,price,original_price,cover_pic,(sales_num+virtual_sales) as sales_num,is_attr, goods_type,goods_source',
- // 'index' => 'id'
- // ];
- if (empty($item['id'])) {
- return [];
- }
- $list = self::storeGoodsSqlCombination($mallId, $item);
- $data = $list['list'];
- // $data = StoreGoods::lists($goods_params, true);
- // print_r($data);exit;
- // $data = array_column($data, null, 'id');
- foreach ($data as &$val) {
- $val['discount'] = bcsub($val['original_price'], $val['price'], 2);
- if ($val['discount'] < 0) $val['discount'] = 0;
- }
- if($user_level && !empty($user_level['member_price_is_show'])){
- foreach($data as &$good){
- $good['member_price_is_show'] = 0;
- $good['member_price_info'] = [];
- // $good['price'] = \addons\Store\common\logic\goods\GoodsLogic::getMemberPriceList($mallId,$good,$user,true);
- $good['member_price'] = \addons\Store\common\logic\goods\GoodsLogic::getMemberPriceList($mallId,$good,$user,true);
- }
- unset($good);
- }else{
- $data = self::getStoreMemberPrice($mallId, $data, 1, $userId);
- }
- // 使用前端传输的ID排序重组
- if (empty($item['sort_type'])) {
- $tmp = [];
- foreach (Json::decode($item['id']) ?? [] as $id) {
- $tmp[$id] = ArrayHelper::find($data, function ($i) use ($id) {
- return $i['id'] == $id;
- });
- }
- $data = $tmp;
- }
- // 这里注释的代码先不删
- // $count = count($data);
- // $keys = range($count, 1);
- // $data = array_combine($keys, $data);
- break;
- case 'location_goods':
- $data = CommunityGoods::getComponentData($item, $mallId);
- if($user_level && !empty($user_level['member_price_is_show'])){
- foreach($data as &$item){
- $item['member_price_is_show'] = 0;
- $item['member_price_info'] = [];
- $item['price'] = GoodsLogic::getMemberPriceList($mallId,$item,$user,true);
- $item['member_price'] = $item['price'];
- }
- unset($item);
- }else{
- $data = self::getMemberPrice($mallId, $data, 0, $userId);
- }
- $type = $item['type'] ?? 'goods';
- if($type == 'goods_cate'){
- $initData = array_values($data);
- $data = [];
- $data[] = $initData;
- }
- break;
- case 'reserve_location_goods':
- $data = Goods::getComponentData($item, $mallId);
- if($user_level && !empty($user_level['member_price_is_show'])){
- foreach($data as &$item){
- $item['member_price_is_show'] = 0;
- $item['member_price_info'] = [];
- $item['price'] = GoodsLogic::getMemberPriceList($mallId,$item,$user,true);
- $item['member_price'] = $item['price'];
- }
- unset($item);
- }else{
- $data = self::getMemberPrice($mallId, $data, 0, $userId);
- }
- $type = $item['type'] ?? 'goods';
- if($type == 'goods_cate'){
- $initData = array_values($data);
- $data = [];
- $data[] = $initData;
- }
- break;
- case 'store_coupons':
- //o2o优惠券
- $store_coupon_ids = $item['id'];
- $data = StoreCoupon::lists([
- 'where' => [
- ['id' => $store_coupon_ids],
- ['mall_id' => $mallId],
- ['status' => StatusEnum::ENABLED],
- ['coupon_status' => CouponEnum::STATUS_RECEIVING]
- ],
- 'select' => 'id,name,type',
- 'index' => 'id'
- ], true);
- break;
- case 'score_game_secondary_card':
- if (!MallAddons::isInstall($mallId, AddonsEnum::ADDONS_SCORE_GAME)) {
- return ['list' => [], 'count' => 0, 'page' => 1, 'limit' => $data['limit']];
- }
- $item['is_sell'] = 1;
- $card_list = (new \addons\ScoreGame\common\service\SecondaryCardService(['mall_id' => $mallId]))->getCardList($item);
- $data = $card_list;
- break;
- default:
- break;
- }
- }
- // 仅返回非空数据
- return array_filter($data, function ($item) {
- return !empty($item);
- });
- }
- public static function getMemberPrice($mallId, $data, $from = 0, $user_id = 0)
- {
- $goods_id = $from == 0 ? array_keys($data) : array_column($data, 'id');
- $extra_params = ['where' => [['in', 'goods_id', $goods_id]], 'select' => 'is_show_price, member_price_setting, is_member_price,goods_id', 'index' => 'goods_id'];
- $goods_extra = GoodsExtra::lists($extra_params, true);
- $level = 0;
- if ($user_id) {
- $user = User::find()->where(['mall_id' => $mallId, 'id' => $user_id])->select('id, mall_id, level')->limit(1)->one();
- $level = (!$user || $user->level == 0) ? $level : $user->level;
- }
- $level_where = ['mall_id' => $mallId, 'status' => StatusEnum::ENABLED];
- if ($level > 0) $level_where['level'] = $level;
- $user_level = UserLevel::find()->where($level_where)->select('discount, level, mall_id, status')->orderBy('level ASC')->limit(1)->one();
- if (!empty($goods_extra)) {
- // is_member_price: 是否参与会员价[0不参与会员折扣独立设置, 1参与会员折扣独立设置, 2不参与会员折扣]
- foreach ($goods_extra as &$v) {
- switch ($v['is_member_price']) {
- case 0:
- $v['member_price_setting'] = [$user_level ? $user_level->discount : 0];
- break;
- case 1:
- $v['member_price_setting'] = json_decode($v['member_price_setting'], true) ?? [];
- break;
- default:
- $v['member_price_setting'] = [0];
- break;
- }
- }
- unset($v);
- }
- foreach ($data as &$value) {
- $value['member_price_is_show'] = 0;
- $value['member_price_info'] = [];
- if (!isset($goods_extra[$value['id']])) {
- $value['member_price'] = 0;
- continue;
- }
- $is_member_price = $goods_extra[$value['id']]['is_member_price'] ?? 0;
- if ($is_member_price == 0) {
- $value['member_price'] = bcmul($value['price'], $goods_extra[$value['id']]['member_price_setting'][0] / 10, 2);
- continue;
- }
- $member_price = 0;
- if ($is_member_price == 1) {
- $member_price_arr = $goods_extra[$value['id']]['member_price_setting'];
- $level_where = ['mall_id' => $mallId, 'status' => StatusEnum::ENABLED];
- $lowest_level = UserLevel::find()->where($level_where)->select('discount, level, mall_id, status')->orderBy('level ASC')->limit(1)->one();
- if (!empty($value['is_attr'])) {
- if (count($member_price_arr) > 1) {
- $temp_level = $user_level ? $user_level->level : 0;
- // 有等级显示该等级的价格,否则显示第一个等级的
- $member_arr = $member_price_arr['level' . ($temp_level == 0 ? $lowest_level->level : $temp_level)];
- if (!empty($member_arr)) {
- // 增加排序 默认取最低的会员价
- asort($member_arr);
- $member_arr = array_values($member_arr);
- $member_price = $member_arr[0] ?? 0;
- }
- }
- }else{
- if (count($member_price_arr) > 1) {
- $key_first = array_key_first($member_price_arr);
- if (strpos($key_first, 'level') !== false) {// 判断是单规格还是多规格设置
- // 多规格商品处理
- $member_prices = $level > 0 ? $member_price_arr['level'.$level] : $member_price_arr['level'.$lowest_level->level];
- $member_price = is_array($member_prices) ? current($member_prices) : 0;// 多规格默认获取第一个
- } else {
- // 单规格商品处理
- $member_price = $level > 0 ? $member_price_arr[$level] : $member_price_arr[$lowest_level->level];
- }
- } else {
- $key_first = array_key_first($member_price_arr);// 获取第一个key
- if (count($member_price_arr) == 1) $member_price = $member_price_arr[$key_first];
- if (count($member_price_arr) < 1) $member_price = 0;
- }
- }
- $value['member_price'] = $member_price;
- continue;
- }
- if ($is_member_price == 2) {
- $value['member_price'] = $value['price'];
- continue;
- }
- }
- unset($value);
- return $data;
- }
- public static function getStoreMemberPrice($mallId, $data, $from = 0, $user_id = 0)
- {
- $goods_id = $from == 0 ? array_keys($data) : array_column($data, 'id');
- $extra_params = ['where' => [['in', 'goods_id', $goods_id]], 'select' => 'member_price_setting, is_member_price,goods_id', 'index' => 'goods_id'];
- $goods_extra = StoreGoodsExtra::lists($extra_params, true);
- $level = 0;
- if ($user_id) {
- $user = User::find()->where(['mall_id' => $mallId, 'id' => $user_id])->select('id, mall_id, level')->limit(1)->one();
- $level = (!$user || $user->level == 0) ? $level : $user->level;
- }
- $level_where = ['mall_id' => $mallId, 'status' => StatusEnum::ENABLED];
- if ($level > 0) $level_where['level'] = $level;
- $user_level = UserLevel::find()->where($level_where)->select('discount, level, mall_id, status')->orderBy('level ASC')->limit(1)->one();
- if (!empty($goods_extra)) {
- // is_member_price: 是否参与会员价[0不参与会员折扣独立设置, 1参与会员折扣独立设置, 2不参与会员折扣]
- foreach ($goods_extra as &$v) {
- switch ($v['is_member_price']) {
- case 0:
- $v['member_price_setting'] = [$user_level ? $user_level->discount : 0];
- break;
- case 1:
- $v['member_price_setting'] = json_decode($v['member_price_setting'], true) ?? [];
- break;
- default:
- $v['member_price_setting'] = [0];
- break;
- }
- }
- unset($v);
- }
- foreach ($data as &$value) {
- $value['member_price_is_show'] = 0;
- $value['member_price_info'] = [];
- if (!isset($goods_extra[$value['id']])) {
- $value['member_price'] = 0;
- continue;
- }
- $is_member_price = $goods_extra[$value['id']]['is_member_price'] ?? 0;
- if ($is_member_price == 0) {
- $value['member_price'] = bcmul($value['price'], $goods_extra[$value['id']]['member_price_setting'][0] / 10, 2);
- continue;
- }
- $member_price = 0;
- if ($is_member_price == 1) {
- $member_price_arr = $goods_extra[$value['id']]['member_price_setting'];
- $level_where = ['mall_id' => $mallId, 'status' => StatusEnum::ENABLED];
- $lowest_level = UserLevel::find()->where($level_where)->select('discount, level, mall_id, status')->orderBy('level ASC')->limit(1)->one();
- if (!empty($value['is_attr'])) {
- if (count($member_price_arr) > 1) {
- $temp_level = $user_level ? $user_level->level : 0;
- // 有等级显示该等级的价格,否则显示第一个等级的
- $member_arr = $member_price_arr['level' . ($temp_level == 0 ? $lowest_level->level : $temp_level)];
- if (!empty($member_arr)) {
- // 增加排序 默认取最低的会员价
- asort($member_arr);
- $member_arr = array_values($member_arr);
- $member_price = $member_arr[0] ?? 0;
- }
- }
- }else{
- if (count($member_price_arr) > 1) {
- $key_first = array_key_first($member_price_arr);
- if (strpos($key_first, 'level') !== false) {// 判断是单规格还是多规格设置
- // 多规格商品处理
- $member_prices = $level > 0 ? $member_price_arr['level'.$level] : $member_price_arr['level'.$lowest_level->level];
- $member_price = is_array($member_prices) ? current($member_prices) : 0;// 多规格默认获取第一个
- } else {
- // 单规格商品处理
- $member_price = $level > 0 ? $member_price_arr[$level] : $member_price_arr[$lowest_level->level];
- }
- } else {
- $key_first = array_key_first($member_price_arr);// 获取第一个key
- if (count($member_price_arr) == 1) $member_price = $member_price_arr[$key_first];
- if (count($member_price_arr) < 1) $member_price = 0;
- }
- }
- $value['member_price'] = $member_price;
- continue;
- }
- if ($is_member_price == 2) {
- $value['member_price'] = $value['price'];
- continue;
- }
- }
- unset($value);
- return $data;
- }
- /**
- * 虚拟订单播报数据
- * @Author: lun
- * @DateTime: 2021/11/29 0029 17:04
- * @Copyright: copyright (c) 2021 广东七件事集团
- */
- private static function virtualOrderBroadcast($limit = 50)
- {
- $mobile_prefix = ['130', '150', '133', '173', '177', '135', '138', '139', '180', '159'];
- $data = [];
- $time = time();
- for ($i = 0; $i < $limit; $i++) {
- $data[] = [
- 'avatar' => Yii::$app->request->hostInfo . '/resources/img/def-virtual-avatar/' . rand(1, 500) . '.png',
- 'time' => rand(1, 900),
- 'username' => StringHelper::randName(),
- 'mobile' => $mobile_prefix[rand(0, 9)] . '****' . rand(1000, 9999),
- 'create_at' => $time - rand(1, 900) * 60,
- ];
- }
- return $data;
- }
- //获取o2o门店商品数据--sql语句拼接
- public static function storeGoodsSqlCombination($mallId, $data)
- {
- $status = StatusEnum::ENABLED;
- try {
- $where = "(sg.`mall_id` = {$mallId}) AND (sg.`status` = {$status}) AND (sg.`is_on_sale` = {$status}) AND (sg.`check_status` = {$status})";
- $page = $data['page'] ? $data['page'] : 1;
- if (!empty($data['is_recommend'])) $where .= " AND (sg.`is_recommend` = {$data['is_recommend']})";
- if (!empty($data['id'])) { //拼接商品id
- if (is_string($data['id'])) $data['id'] = json_decode($data['id'],true);
- if (is_array($data['id']) && count($data['id']) >= 1) {
- $ids = implode(',', $data['id']);
- $where .= " AND sg.`id` in ({$ids})";
- } else {
- throw new \Exception('商品id非数组');
- }
- }
- if (!empty($data['keyword'])) {
- $where .= " AND (sg.`goods_name` like '%" .$data['keyword']. "%')";
- }
- if (isset($data['store_ids']) && is_array($data['store_ids'])) {
- if (!empty($data['store_ids'])) {
- $store_ids_str = implode(',', $data['store_ids']);
- $where .= " AND sg.store_id in ({$store_ids_str})";
- } else {
- throw new \Exception('无店铺id');
- }
- }
- $select = "DISTINCT sg.id,sg.store_id,sg.goods_name,sg.subtitle,sg.price,sg.original_price,sg.cover_pic,(sg.sales_num+sg.virtual_sales) as sales_num,sg.is_attr,sg.show_style,sg.goods_type,sg.goods_source,st.latitude,st.longitude,sc.num as comment_num";
- $orderBy = '';
- //根据经纬数据获取商铺距离
- if (!empty($data['longitude']) && !empty($data['latitude'])) {
- $select .= ",round(
- 2 * 6378.137 * ASIN(
- SQRT(
- POW(
- SIN(
- PI() * ({$data['longitude']} - st.longitude) / 360
- ),
- 2
- ) + COS(PI() * {$data['latitude']} / 180) * COS(st.latitude * PI() / 180) * POW(
- SIN(
- PI() * ({$data['latitude']} - st.latitude) / 360
- ),
- 2
- )
- )
- )
- ,1) AS distance";
- $orderBy = 'distance asc';
- }
- //拼接排序语句
- if (!empty($data['sort'])) {
- switch ($data['sort']) {
- case 'price':
- $data['sort_type'] = $data['sort_type']?$data['sort_type']:'asc';
- $orderBy = "sg.". $data['sort']. ' '. $data['sort_type'];
- break;
- case 'sales_num':
- $data['sort_type'] = $data['sort_type']?$data['sort_type']:'desc';
- $orderBy = $data['sort']. ' '. $data['sort_type'];
- break;
- case 'distance':
- $data['sort_type'] = $data['sort_type']?$data['sort_type']:'asc';
- $orderBy = $data['sort']. ' '. $data['sort_type'];
- break;
- case 'comment_num':
- $data['sort_type'] = $data['sort_type']?$data['sort_type']:'desc';
- $orderBy = $data['sort']. ' '. $data['sort_type'];
- break;
- }
- }
- $orderBy .= ",sg.sort desc,sg.id desc";
- $orderBy = ltrim($orderBy, ',');
- $sql = "SELECT ".$select. " FROM `qimall_addons_store_goods` as sg";
- $sql .= " LEFT JOIN `qimall_addons_store` as st on sg.store_id = st.id";
- $sql .= " LEFT JOIN `qimall_order_comments_extra` as sc on sg.store_id = sc.store_id AND sg.id = sc.goods_id";
- $sql .= " WHERE " . $where;
- $sql .= " ORDER BY ". $orderBy;
- $count = \Yii::$app->db->createCommand($sql)->execute();
- $sql .= " LIMIT " . ($page - 1) * $data['limit'] . ",{$data['limit']}";
- $list = \Yii::$app->db->createCommand($sql)->queryAll();
- return ['list' => $list, 'count' => $count, 'page' => $page, 'limit' => $data['limit']];
- } catch (\Exception $e) {
- // print_r($e->getMessage());exit;
- return ['list' => [], 'count' => 0, 'page' => $page, 'limit' => $data['limit']];
- }
-
- }
- }
|