getCustomGoodsKey($channelId); if ($redis->exists($rKey)) { $strGoodsList = $redis->get($rKey); $goodsList = json_decode($strGoodsList, true); return $goodsList; } else { $goodsList = $this->getChannelGoodsListFromDB($channelId); Redis::instance()->set($rKey, json_encode($goodsList)); return $goodsList; } } /** * 从数据库获取渠道商自定义商品列表 * @param $channelId * @return array|false|\PDOStatement|string|\think\Collection */ private function getChannelGoodsListFromDB($channelId) { $customGoodsList = $this->getGoodsChannelRelModel()->join(['goods' => 'g'], 'g.id = goods_channel_rel.goods_id') ->field([ 'g.id', 'category_id', 'title', 'money', 'first_description', 'second_description', 'kandian', 'free_kandian', 'icon', 'show_type', 'group_ids', 'g.type', 'goods_channel_rel.business_line', 'goods_channel_rel.default', ]) ->where(['goods_channel_rel.admin_id' => $channelId]) ->order('goods_channel_rel.position_index') ->select(); foreach ($customGoodsList as $item) { $item['show_type_text'] = PayConstants::$goodsShowTypeList[$item['show_type']]; } return $customGoodsList; } /** * 获取自定义商品列表 * @param $channelId int 渠道商id,超管id为0 * @return array|false|mixed|\PDOStatement|string|\think\Collection */ public function getCustomGoodsList($channelId, $isVip = false) { if (!empty($channelId)) { $isTest = AdminService::instance()->checkIsTestChannel(null, $channelId); $redis = Redis::instance(); $goodsList = $this->getChannelGoodsList($channelId, $isVip); if (!$isTest) {//当前渠道商不是测试渠道商,需要剔除测试商品 if ($redis->exists(self::TEST_CATEGORY_ID_KEY)) { $testCategoryId = $redis->get(self::TEST_CATEGORY_ID_KEY); } else { $testCategoryIds = $this->getGoodsModel()->getGoodsCategoryIds([PayConstants::GOODS_CATEGORY_TEST]); $testCategoryId = current($testCategoryIds); $redis->set(self::TEST_CATEGORY_ID_KEY, $testCategoryId); } foreach ($goodsList as $key => $item) { $tempCategoryIds = explode(',', $item['category_id']); if (in_array($testCategoryId, $tempCategoryIds)) { unset($goodsList[$key]); } } } return $goodsList; } else { return $this->getDefaultGoodsList(); } } /** * 获取活动商品的分类id * @return bool|mixed|string */ public function getActivityGoodsCategoryId() { $redis = Redis::instance(); if ($redis->exists(self::ACTIVITY_CATEGORY_ID_KEY)) { $categoryId = $redis->get(self::ACTIVITY_CATEGORY_ID_KEY); } else { $testCategoryIds = $this->getGoodsModel()->getGoodsCategoryIds([PayConstants::GOODS_CATEGORY_ACTIVITY]); $categoryId = current($testCategoryIds); $redis->set(self::ACTIVITY_CATEGORY_ID_KEY, $categoryId); } return $categoryId; } /** * 获取自定义商品的redis-key * @param $channelId * @return string */ private function getCustomGoodsKey($channelId) { return self::CUSTOM_GOODS_KEY . $channelId; } /** * 获取渠道商自定义商品列表 * @param $channelId * @return array|false|mixed|\PDOStatement|string|\think\Collection */ public function getChannelGoodsList($channelId,$isVip = false) { $adminConfig = AdminService::instance()->getAdminConfigModel()->getAdminInfoAll($channelId); $redis = Redis::instance(); $rKey = $this->getCustomGoodsKey($channelId); if (($adminConfig && $adminConfig['custom_goods'] == 1) || $isVip) { if ($redis->exists($rKey)) { $strGoodsList = $redis->get($rKey); $goodsList = json_decode($strGoodsList, true); return $goodsList; } else { $goodsList = $this->getChannelGoodsListFromDB($channelId); if (empty($goodsList)) { $goodsList = $this->getDefaultGoodsList(); } Redis::instance()->set($rKey, json_encode($goodsList)); return $goodsList; } } else { $goodsList = $this->getDefaultGoodsList(); return $goodsList; } } /** * 保存自定义商品信息 * @param $goodsIds * @param $channelId * @throws Exception */ public function saveChannelGoodsList($goodsIds, $channelId, $businessLine = '0', $default = false, $groupIds='') { if (!is_array($goodsIds)) { throw new Exception('goodsIds必须为数组'); } if (empty($goodsIds)) { throw new Exception('至少选择一个商品'); } if (!$default) { $default = $goodsIds[0]; } $goodsList = $this->getGoodsModel()->whereIn('id', $goodsIds)->select(); $showTypeList = []; foreach ($goodsList as $item) { $showTypeList[$item['show_type']][] = $item['id']; } if (empty($showTypeList[PayConstants::GOODS_SHOW_TYPE_ALL])) { if (empty($showTypeList[PayConstants::GOODS_SHOW_TYPE_RECHARGED])) { throw new Exception('必须配置一个已充值用户的商品'); } elseif (empty($showTypeList[PayConstants::GOODS_SHOW_TYPE_UN_RECHARGED])) { throw new Exception('必须配置一个未充值用户的商品'); } } $relList = []; try { $goodsOrderList = []; foreach ($goodsIds as $key => $goodId) { $relList[] = [ 'admin_id' => $channelId, 'goods_id' => $goodId, 'group_ids' => $groupIds, 'position_index' => $key + 1, 'createtime' => time(), 'business_line' => $businessLine, 'default' => (int)($goodId == $default) ]; foreach ($goodsList as $item) { if ($item['id'] == $goodId) { $goodsOrderList[] = $item; break; } } } $goodsChannelRel = $this->getGoodsChannelRelModel(); $goodsChannelRel->where('admin_id', $channelId)->where('business_line', $businessLine)->delete(); $goodsChannelRel->insertAll($relList); $goodsChannelRelHistory = model('GoodsChannelRelHistory'); $goodsChannelRelHistory->insert([ 'admin_id' => $channelId, 'goods_ids' => implode(',', $goodsIds), 'createtime' => time(), ]); $rKey = $this->getCustomGoodsKey($channelId); $rKeyApp = CacheConstants::getGoodsListAppKey($businessLine); Redis::instance()->del($rKey); Redis::instance()->del($rKeyApp); } catch (Exception $e) { LogService::error($e->getMessage()); throw $e; } } /** * 删除渠道商自定义商品列表 * @param $channelId * @throws Exception */ public function delChannelGoodsList($channelId) { $rKey = $this->getCustomGoodsKey($channelId); try { $goodsChannelRel = $this->getGoodsChannelRelModel(); $goodsChannelRel->where('admin_id', $channelId)->delete(); $goodsChannelRelHistory = model('GoodsChannelRelHistory'); $goodsChannelRelHistory->insert([ 'admin_id' => $channelId, 'goods_ids' => '', 'createtime' => time(), ]); Redis::instance()->del($rKey); } catch (Exception $e) { LogService::error($e->getMessage()); throw $e; } } /** * 选择商品页面,获取商品列表 * @param $channelId * @param $selectedIds * @param $where * @param $offset * @param $limit * @param $goodsCategory * @return array */ public function getSelectGoodsList($channelId, $selectedIds, $where, $offset, $limit, $goodsCategory, $goodsTypes, $maps = []) { // if (empty($goodsCategory)) { // $goodsCategory = [PayConstants::GOODS_CATEGORY_RECHARGE]; // } $listFetchObj = $this->getSelectGoodsObj($channelId, $selectedIds, $where, $offset, $limit, $goodsCategory, $goodsTypes, $maps); $list = $listFetchObj->select(); $countFetchObj = $this->getSelectGoodsObj($channelId, $selectedIds, $where, $offset, $limit, $goodsCategory, $goodsTypes, $maps); $total = $countFetchObj->count(); return [$list, $total]; } /** * 构造查询自定义商品的model对象 * @param $channelId 渠道商id * @param $selectedIds 已选商品id * @param $where * @param $offset * @param $limit * @param $goodsCategory * @return \app\common\model\Goods */ private function getSelectGoodsObj($channelId, $selectedIds, $where, $offset, $limit, $goodsCategory, $goodsTypes, $maps = []) { $goodsModel = $this->getGoodsModel(); $isTest = AdminService::instance()->checkIsTestChannel(0, $channelId); $goodsCategory = (array)$goodsCategory; $obj = $goodsModel->where($where) ->where($maps) ->whereIn('type', $goodsTypes) ->limit($offset, $limit); if ($isTest) { $goodsCategory[] = PayConstants::GOODS_CATEGORY_TEST; } if ($categoryIds = $goodsModel->getGoodsCategoryIds($goodsCategory)) { $categoryMap = []; foreach ($categoryIds as $categoryId) { array_push($categoryMap, "find_in_set({$categoryId},category_id)"); } } //分类不为空时 if (!empty($categoryMap)) { if (count($categoryMap) > 1) { $obj->where("(" . implode(' or ', $categoryMap) . ")"); } else { $obj->where(current($categoryMap)); } } if (!empty($selectedIds)) { $obj->whereNotIn('id', $selectedIds); } return $obj; } /** * 删除配置此商品的渠道商自定义商品 * @param $goodsId */ public function delCustomGoodsId($goodsId) { $ids = $this->removeCacheCustomGoods($goodsId); if (!empty($ids)) { $this->getGoodsChannelRelModel()->whereIn('id', $ids)->delete(); } } /** * 删除配置此商品的自定义商品缓存 * @param $goodsId * @return array */ public function removeCacheCustomGoods($goodsId) { $key = CacheConstants::getGoodsInfoKey($goodsId); Redis::instance()->del($key); $goodsChannelRelList = $this->getGoodsChannelRelModel()->where('goods_id', $goodsId)->field([ 'id', 'admin_id' ])->select(); $ids = []; $keys = []; foreach ($goodsChannelRelList as $item) { $ids[] = $item['id']; $keys[] = $this->getCustomGoodsKey($item['admin_id']); } $delCustomGoodsRedisIndex = Redis::splitKeysByRule($keys); foreach ($delCustomGoodsRedisIndex as $k => $v) { $redis = Redis::getRedisConnect($k); $redis->del(...$v); } return $ids; } /** * 获取前台用户使用的商品列表 * @param $channelId 渠道商id * @param $isPay 用户是否支付过订单。0未充值 1已充值 * @return array|false|mixed|\PDOStatement|string|\think\Collection */ public function getCustomGoodsForFront($channelId, $isPay, $isNew, $businessLine = PayConstants::BUSINESS_WECHAT) { $goodsList = $this->getCustomGoodsList($channelId); $goodsResultList = []; foreach ($goodsList as $item) { if ($item['business_line'] != $businessLine) { continue; } if (intval($isPay) == 0) {//未充值用户 if (in_array($item['show_type'], [PayConstants::GOODS_SHOW_TYPE_UN_RECHARGED, PayConstants::GOODS_SHOW_TYPE_ALL])) { $goodsResultList[] = $item; } } else {//已充值用户 if (in_array($item['show_type'], [PayConstants::GOODS_SHOW_TYPE_RECHARGED, PayConstants::GOODS_SHOW_TYPE_ALL])) { $goodsResultList[] = $item; } } if ($isNew && $item['show_type'] == PayConstants::GOODS_SHOW_TYPE_NEW) { $goodsResultList[] = $item; } else if(!$isNew && $item['show_type'] == PayConstants::GOODS_SHOW_TYPE_OLD){ $goodsResultList[] = $item; } } return $goodsResultList; } public function checkGoodsTypeValid($showType, UserObject $user) { if (Config::get('site.goods_type_new_user') == GoodsConstants::GOODS_TYPE_NEW_DAY) { $isNew = date('Ymd', $user->createtime) == date('Ymd'); } else { $isNew = time() - $user->createtime < 86400; } $return = true; switch ($showType) { case PayConstants::GOODS_SHOW_TYPE_RECHARGED: $return = $user->is_pay; break; case PayConstants::GOODS_SHOW_TYPE_UN_RECHARGED: $return = !$user->is_pay; break; case PayConstants::GOODS_SHOW_TYPE_NEW: $return = $isNew; break; case PayConstants::GOODS_SHOW_TYPE_OLD: $return = !$isNew; break; } return $this->setData($return)->getReturn(); } }