| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- <?php
- namespace addons\Mch\api\modules\v1\controllers;
- use addons\Coupon\common\enums\AddonsCouponEnum;
- use addons\Coupon\common\models\AddonsCoupon;
- use addons\Coupon\common\models\AddonsCouponMemberRelate;
- use addons\Coupon\common\models\AddonsCouponUserRelate;
- use addons\Mch\common\models\Mch;
- use common\enums\OrderCommentEnum;
- use common\enums\StatusEnum;
- use common\logic\common\GoodsLogic;
- use common\models\cart\Cart;
- use common\models\common\Region;
- use common\models\diy\DiyComponentsData;
- use common\models\goods\Goods;
- use common\models\goods\GoodsCateRelate;
- use api\controllers\OnAuthController;
- use common\models\mall\MallAddons;
- use common\models\order\OrderComments;
- use common\models\user\User;
- use common\models\user\UserLevel;
- use common\models\user\UserPartitionRelationship;
- use yii\db\Expression;
- /**
- * 默认控制器
- *
- * Class DefaultController
- * @package addons\Store\api\modules\v1\controllers
- */
- class GoodsController extends OnAuthController
- {
- public $modelClass = '';
- /**
- * 不用进行登录验证的方法
- *
- * 例如: ['index', 'update', 'create', 'view', 'delete']
- * 默认全部需要验证
- *
- * @var array
- */
- protected $authOptional = ['index', 'detail', 'cate-goods-list', 'list', 'recommend', 'comments-list','coupon-list'];
- /**
- * 分类商品列表
- * @return mixed|void
- */
- public function actionCateGoodsList()
- {
- $params = \Yii::$app->request->get();
- $res = \Yii::$app->services->validate->validate($params, [
- [['mch_id'], 'required'],
- [['cate_id'], 'safe'],
- [['goods_name'], 'string'],
- ]);
- if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
- $mch_id = $params['mch_id'];
- $where[] = ['mch_id' => $mch_id, 'mall_id' => $this->mall_id, 'check_status' => 1, 'is_on_sale' => 1, 'status' => StatusEnum::ENABLED];
- if (!empty($params['cate_id'])) {
- $goods_cate_relate_list = GoodsCateRelate::findAll(['cate_id' => $params['cate_id']]);
- $goods_id_arr = array_column($goods_cate_relate_list, 'goods_id');
- $where[] = ['id' => $goods_id_arr];
- }
- if (!empty(trim($params['goods_name']))) $where[] = ['like', 'goods_name', trim($params['goods_name'])];
- $params['where'] = $where;
- $params['select'] = 'id,goods_name,cover_pic,price,(sales_num+virtual_sales) as sales_num,original_price,status,stock,attr_groups,attr_groups_format';
- $params['order'] = 'sort asc';
- $params['with'] = ['attr' => function ($query) {
- $query->select('id,goods_id,name,price,sign_id,stock,pic_url,original_price');
- }, 'extra'];
- $goods_list = Goods::listPage($params);
- $list = Cart::getCartList($this->user_id);
- $goods_num_arr = [];
- foreach ($list as $v) {
- $row = json_decode($v, true);
- if (isset($goods_num_arr[$row['goods_id']])) {
- $goods_num_arr[$row['goods_id']] += $row['num'];
- } else {
- $goods_num_arr[$row['goods_id']] = $row['num'];
- }
- }
- if (!empty($goods_list['list'])) {
- foreach ($goods_list['list'] as &$item) {
- $item['member_buy_limit_setting'] = empty($item['extra']['member_buy_limit_setting']) ? '' : json_decode($item['extra']['member_buy_limit_setting'], true);
- unset($item['extra']);
- $item['num'] = !empty($goods_num_arr[$item['id']]) ? $goods_num_arr[$item['id']] : 0;
- $item['status'] = empty($item['stock']) ? 0 : 1;
- }
- $goods_list['list'] = DiyComponentsData::getMemberPrice($this->mall_id, $goods_list['list'], 1, $this->user_id??0);
- $user_level = UserLevel::findOne(['mall_id' => $this->mall_id, 'level' => $this->user['level'], 'status' => StatusEnum::ENABLED]);
- foreach ($goods_list['list'] as &$item){
- //额外会员设置
- if($user_level && !empty($user_level['member_price_is_show'])){
- $item['member_price_is_show'] = $user_level['member_price_is_show'];
- }
- }
- }
- return $this->success('操作成功', $goods_list);
- }
- public function actionDetail()
- {
- $goods_id = \Yii::$app->request->get('goods_id', 0);
- $mch_id = \Yii::$app->request->get('mch_id', 0);
- $mall_id = $this->mall_id;
- $addonsFields = \Yii::$app->request->get('addonsFields', '');
- try {
- $select = 'id,is_on_sale,goods_name,price,original_price,unit,attr_groups_format,attr_groups,area_limit,is_attr,is_show_stock,video_url,stock,video_cover_pic,cover_pic,bannar_pic,sales_num,virtual_sales,is_show_sales,detail,services,status,goods_source';
- $user_id = $this->user_id ?? 0;
- $params['mall_id'] = $mall_id;
- $params['where'] = [['id' => $goods_id], ['mall_id' => $mall_id], ['mch_id' => $mch_id], ['check_status' => 1], ['is_on_sale' => 1], ['status' => StatusEnum::ENABLED]];
- $params['is_array'] = true;
- $params['with'] = [
- 'attr' => function ($query) {
- $query->orderBy('price asc')->select('id,goods_id,goods_no,name,original_price,pic_url,price,sign_id,sort,status,version,weight,stock');
- }, 'extra'
- ];
- $params['order'] = false;
- $params['select'] = $select;
- $params['goods_id'] = $goods_id;
- $goods = GoodsLogic::GetDetail($this->mall_id, $params, $this->user);
- if (empty($goods)) throw new \Exception("商品不存在");
- foreach ($goods['attr'] as $k => &$item) {
- if ($k == 0) {
- $goods['attr_id'] = $item['id'];
- $goods['price'] = $item['price'];
- $goods['original_price'] = $item['original_price'];
- break;
- }
- }
- if (!empty($goods['is_attr'])) $goods['stock'] = array_sum(array_column($goods['attr'], 'stock'));//多规格,按规格库存累计
- if (!empty($user)) {
- //基础会员等级折扣
- $user_level = UserLevel::findOne(['mall_id' => $mall_id, 'level' => $user['level'], 'status' => StatusEnum::ENABLED]);
- if (isset($user_level)) {
- $discount = $user_level['discount'] ?? 0;
- $goods['price_type'] = '会员优惠';
- $is_member_price = $goods['extra']['is_member_price'] ?? 2;
- $goods['is_member_price'] = $is_member_price;
- if ($is_member_price != 2) {
- if (!empty($goods['extra']['is_member_price']) && !empty($goods['extra']['member_price_setting'])) {
- $member_price_setting = Json::decode($goods['extra']['member_price_setting'], true);
- }
- $goods['price'] = bcdiv($goods['price'] * $discount, 10, 2);
- if (empty($goods['is_attr'])) {
- if (isset($member_price_setting[$user['level']])) {
- $goods['price'] = $member_price_setting[$user['level']];
- foreach ($goods['attr'] as &$item) {
- $item['price'] = $goods['price'];
- }
- }
- } else {
- $attr_price_arr = [];
- foreach ($goods['attr'] as $k => &$item) {
- $item['price'] = bcdiv($item['price'] * $discount, 10, 2); //全局等级会员价
- if (isset($member_price_setting['level' . $user['level']][$item['sign_id']])) {
- //商品独立设置的会员价
- $item['price'] = $member_price_setting['level' . $user['level']][$item['sign_id']];
- }
- $attr_price_arr[$item['price']] = ['id' => $item['id'], 'price' => $item['price'], 'original_price' => $item['original_price']];
- }
- ksort($attr_price_arr);
- $attr_arr = array_shift($attr_price_arr);
- $goods['attr_id'] = $attr_arr['id'] ?? 0;
- $goods['price'] = $attr_arr['price'] ?? 0;
- $goods['original_price'] = $attr_arr['original_price'] ?? 0;
- }
- }
- }
- }
- $mch = Mch::getOne([['id' => $mch_id], ['status' => StatusEnum::ENABLED]], true, [], false,
- 'id,store_name,logo_img,province_id,city_id,district_id,address,customer_service');
- $region = Region::lists(['where' => [['id' => [$mch['province_id'], $mch['city_id'], $mch['district_id']]]], 'index' => 'id', 'id,name']);
- $mch['province'] = $region[$mch['province_id']]['name'] ?? '';
- $mch['city'] = $region[$mch['city_id']]['name'] ?? '';
- $mch['district'] = $region[$mch['district_id']]['name'] ?? '';
- $mch['customer_service'] = !empty($mch['customer_service']) ? json_decode($mch['customer_service'], true) : ['web_service_url' => ''];
- unset($mch['province_id']);
- unset($mch['city_id']);
- unset($mch['district_id']);
- $goods['member_buy_limit_setting'] = json_decode($goods['extra']['member_buy_limit_setting'], true);
- unset($goods['extra']);
- if ($addonsFields) {
- if($this->platform == User::PLATFORM_MP_WX){
- is_string($addonsFields) && $addonsFields = json_decode($addonsFields, true);
- }else{
- $addonsFields = is_string($addonsFields) ? explode(',', $addonsFields) : $addonsFields;
- }
- $goods = Goods::getAddonsGoodsSetting($this->mall_id, $addonsFields, $goods, 'detail');
- }
- $goods['is_bind_popups'] = UserPartitionRelationship::getIsNeedPopups($this->mall_id, $this->user_id ?? 0);
- return $this->success('获取成功', ['goods' => $goods, 'mch' => $mch]);
- } catch (\Exception $e) {
- return $this->error($e->getMessage());
- }
- }
- /**
- * 商品评价列表
- * @return mixed|void
- */
- public function actionCommentsList()
- {
- $params = \Yii::$app->request->get();
- $res = \Yii::$app->services->validate->validate($params, [
- [['mch_id'], 'required', 'message' => 'mch_id必传'],
- [['limit', 'page', 'type', 'goods_id'], 'safe']
- ]);
- if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
- $data['comments'] = [];
- $data['good_rate'] = 0;//满意度
- $where = ['mall_id' => $this->mall_id, 'mch_id' => $params['mch_id'], 'status' => StatusEnum::ENABLED,];
- if (!empty($params['goods_id'])) $where['goods_id'] = $params['goods_id'];
- $total = OrderComments::find()->where($where)->count();
- $data['comment_count'][0] = ['name' => OrderCommentEnum::OC_ALL, 'count' => $total ?? 0];
- $good_num = OrderComments::find()->where($where)->andWhere(['in', 'score', OrderCommentEnum::OC_PRAISE_SCORES])->count();
- $data['comment_count'][1] = ['name' => OrderCommentEnum::OC_PRAISE, 'count' => $good_num ?? 0];
- $count = OrderComments::find()->where($where)->andWhere(['in', 'score', OrderCommentEnum::OC_MIDDLE_SCORES])->count();
- $data['comment_count'][2] = ['name' => OrderCommentEnum::OC_MIDDLE, 'count' => $count ?? 0];
- $count = OrderComments::find()->where($where)->andWhere(['in', 'score', OrderCommentEnum::OC_NEGATIVE_SCORES])->count();
- $data['comment_count'][3] = ['name' => OrderCommentEnum::OC_NEGATIVE, 'count' => $count ?? 0];
- $count = OrderComments::find()->where($where)->andWhere(['<>', 'pic_url', '[]'])->count();
- $data['comment_count'][4] = ['name' => '有图', 'count' => $count ?? 0];
- $where = [];
- $where[] = ['mall_id' => $this->mall_id];
- $where[] = ['status' => StatusEnum::ENABLED];
- if (!empty($params['goods_id'])) $where[] = ['goods_id' => $params['goods_id']];
- $where[] = ['mch_id' => $params['mch_id']];
- if (!empty($params['type'])) {
- switch ($params['type']) {
- case OrderCommentEnum::TYPE1://差评
- $where[] = ['in', 'score', OrderCommentEnum::OC_NEGATIVE_SCORES];
- break;
- case OrderCommentEnum::TYPE2://中评
- $where[] = ['in', 'score', OrderCommentEnum::OC_MIDDLE_SCORES];
- break;
- case OrderCommentEnum::TYPE4://好评
- $where[] = ['in', 'score', OrderCommentEnum::OC_PRAISE_SCORES];
- break;
- case OrderCommentEnum::TYPE5://有图
- $where[] = ['<>', 'pic_url', '[]'];
- break;
- }
- }
- $params['where'] = $where;
- $params['select'] = '*';
- $params['order'] = 'is_top desc,id desc';
- $order_comments_list = OrderComments::listPage($params);
- if (!empty($order_comments_list['list'])) {
- $user_id_arr = array_column($order_comments_list['list'], 'user_id');
- $user_list = User::findAll(['id' => $user_id_arr]);
- $user_arr = [];
- foreach ($user_list as $v) {
- $user_arr[$v['id']] = ['nickname' => $v['nickname'], 'avatar_url' => $v['avatar_url'], 'level' => $v['level']];
- }
- foreach ($order_comments_list['list'] as &$v) {
- $v['pic_url'] = !empty($v['pic_url']) ? json_decode($v['pic_url'], true) : [];
- $comment['nickname'] = $comment['avatar_url'] = '';
- if (isset($user_arr[$v['user_id']])) {
- $user = $user_arr[$v['user_id']];
- $v['nickname'] = $user['nickname'];
- $v['avatar_url'] = $user['avatar_url'];
- $v['level'] = $user['level'];
- }
- }
- $data['comments'] = $order_comments_list;
- }
- return $this->success('操作成功', $data);
- }
- public function actionCouponList()
- {
- if (\Yii::$app->request->isGet) {
- $params = \Yii::$app->request->get();
- $res = \Yii::$app->services->validate->validate($params, [
- [['goods_id','mch_id'], 'required'],
- ]);
- if (!MallAddons::isInstall($this->mall_id, 'Coupon')) {
- return $this->success('操作成功', []);
- }
- $mch_id = $params['mch_id'];
- if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
- $where[] = ['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'is_public_receive' => 1, 'coupon_status' => AddonsCouponEnum::STATUS_RECEIVING, 'store_id' => ''];
- $where[] = ['>', 'total_count', 0];
- $where[] = ['appoint_type' => 5];
- $where[] = new Expression("FIND_IN_SET({$mch_id},mch_id)");
- $params['where'] = $where;
- $params['select'] = 'id,mch_id,type,begin_at,end_at,min_price,sub_price,discount,discount_limit,coupon_status,name,is_receive_limit,receive_count,is_member,total_count';
- $params['order'] = 'created_at desc';
- $list = AddonsCoupon::listPage($params);
- if (!empty($list['list'])) {
- $coupon_ids = array_column($list['list'], 'id');
- if (!empty($this->user_id)) {
- $coupon_user_relate_list = AddonsCouponUserRelate::lists([
- 'where' =>
- [
- ['coupon_id' => $coupon_ids],
- ['user_id' => $this->user_id],
- ['status' => StatusEnum::ENABLED],
- ['or', ['is_giving' => 0], ['is_giving' => 1, 'giving_status' => AddonsCouponEnum::GIVING_STATUS1]],
- ],
- 'select' => 'count(id) as counts,coupon_id',
- 'group' => 'coupon_id',
- 'index' => 'coupon_id'
- ]);
- }
- foreach ($list['list'] as &$item) {
- $item['is_receive'] = 0;
- $item['counts'] = 0;
- if (!empty($coupon_user_relate_list[$item['id']])) {
- $item['counts'] = $coupon_user_relate_list[$item['id']]['counts'];
- if (1 == $item['is_member']) {
- // 限制会员等级领取
- $member_levels = AddonsCouponMemberRelate::find()
- ->select('member_level')
- ->where(['mall_id' => $this->mall_id, 'coupon_id' => $item['id']])
- ->asArray()
- ->column();
- if (!in_array($this->user->level, $member_levels)) $item['is_receive'] = 1;
- }
- if (1 == $item['is_receive_limit'] && $item['counts'] >= $item['receive_count']) $item['is_receive'] = 1;
- }
- // 剩余可领取数量
- if (1 == $item['is_receive_limit']) {
- $item['remainder_count'] = $item['receive_count'] - $item['counts'];
- } else {
- $item['remainder_count'] = $item['total_count'];
- }
- }
- }
- $list['coupon_status_map'] = AddonsCouponEnum::getCouponStatusMap();
- return $this->success('操作成功', $list);
- }
- }
- }
|