2023-08-10 06:59:52 +00:00
< ? php
namespace app\api\logic ;
use app\common\basics\Logic ;
use app\common\enum\CommunityArticleEnum ;
use app\common\enum\FootprintEnum ;
use app\common\enum\ShopEnum ;
use app\common\model\community\CommunityArticle ;
use app\common\model\content\Article ;
use app\common\model\goods\Goods ;
use app\common\enum\GoodsEnum ;
use app\common\model\shop\Shop ;
use app\common\model\goods\GoodsCategory ;
use app\common\server\ConfigServer ;
use app\common\server\UrlServer ;
use app\api\logic\SeckillGoodsLogic ;
use think\facade\Db ;
use app\common\model\activity_area\ActivityArea ;
use think\facade\Event ;
class IndexLogic extends Logic
{
public static function index ( $user_id , $terminal )
{
// 记录访问足迹
event ( 'Footprint' , [
'type' => FootprintEnum :: ENTER_MALL ,
'user_id' => $user_id
]);
// 记录统计信息(用户访问量)
Event :: listen ( 'UserStat' , 'app\common\listener\UserStat' );
event ( 'UserStat' );
// 商城头条
$headlines = self :: getHeadlines ();
// 热销榜单
$hots = self :: getHots ();
// 新品推荐
$news = self :: getNews ();
// 推荐店铺列表
$shopLists = self :: getShopList ();
// 精选推荐店铺
$shopRecommend = self :: getShopRecommend ();
// 秒杀商品
2023-10-23 07:29:34 +00:00
// $seckillTimes = SeckillGoodsLogic::seckillTime();
// $seckillGoods = [];
// foreach($seckillTimes as $item) {
// $item['goods'] = SeckillGoodsLogic::getSeckillGoodsTwo($item['id'],$terminal);
// $seckillGoods[] = $item;
// }
2023-08-10 06:59:52 +00:00
//活动专区
$activity_area = ActivityArea :: field ( 'id,name,synopsis as title,image' ) -> where ([ 'del' => 0 , 'status' => 1 ]) -> select ();
foreach ( $activity_area as & $area_item ){
$area_item [ 'image' ] = UrlServer :: getFileUrl ( $area_item [ 'image' ]);
}
// 种草社区文章
2023-10-23 07:29:34 +00:00
// $communityArticle = self::getCommunityArticle();
2023-08-10 06:59:52 +00:00
return [
'headlines' => $headlines ,
'hots' => $hots ,
'news' => $news ,
'activity_area' => $activity_area ,
'shop_lists' => $shopLists ,
'shop_recommend' => $shopRecommend ,
2023-10-23 07:29:34 +00:00
// 'seckill_goods' => $seckillGoods,
// 'community_article' => $communityArticle
2023-08-10 06:59:52 +00:00
];
}
/**
* 获取商城头条
*/
public static function getHeadlines ()
{
$headlines = Article :: field ( 'id,title' )
-> where ([
'del' => 0 ,
'is_show' => 1 ,
'is_notice' => 1 , // 是否为商城公告
])
-> order ([
'create_time' => 'desc' ,
'id' => 'desc'
])
-> limit ( 3 )
-> select ()
-> toArray ();
return $headlines ;
}
/**
* 获取热销榜单
*/
public static function getHots ()
{
2023-10-23 07:29:34 +00:00
$hots = session ( 'home_hosts' );
if ( ! empty ( $hots )) {
// 有缓存且未过期
if ( ! empty ( $hots [ 'expire' ]) && $hots [ 'expire' ] > time ()) {
return $hots [ 'list' ];
}
}
2023-08-10 06:59:52 +00:00
// 销售中商品:未删除/审核通过/已上架
$onSaleWhere = [
'del' => GoodsEnum :: DEL_NORMAL , // 未删除
'status' => GoodsEnum :: STATUS_SHELVES , // 上架中
'audit_status' => GoodsEnum :: AUDIT_STATUS_OK , // 审核通过
];
$order = [
'sales_total' => 'desc' , // 实际销量+虚拟销量倒序
'sales_actual' => 'desc' , // 实际销量倒序
'sort_weight' => 'asc' , // 商品权重
'id' => 'desc'
];
2023-10-23 07:29:34 +00:00
$hots = [];
$hots [ 'list' ] = Goods :: field ( 'id,name,image,min_price,market_price,sales_actual,create_time,sales_virtual,(sales_actual + sales_virtual) as sales_total' )
2023-08-10 06:59:52 +00:00
-> where ( $onSaleWhere )
-> order ( $order )
-> limit ( 9 )
-> select ()
-> toArray ();
2023-10-23 07:29:34 +00:00
$hots [ 'expire' ] = time () + 600 ; //10分钟过期
session ( 'home_hosts' , $hots );
2023-08-10 06:59:52 +00:00
return $hots ;
}
/**
* 获取新品推荐
*/
public static function getNews ()
{
2023-10-23 07:29:34 +00:00
$news = session ( 'home_news' );
if ( ! empty ( $news )) {
// 有缓存且未过期
if ( ! empty ( $news [ 'expire' ]) && $news [ 'expire' ] > time ()) {
return $news [ 'list' ];
}
}
2023-08-10 06:59:52 +00:00
// 销售中商品:未删除/审核通过/已上架
$onSaleWhere = [
'del' => GoodsEnum :: DEL_NORMAL , // 未删除
'status' => GoodsEnum :: STATUS_SHELVES , // 上架中
'audit_status' => GoodsEnum :: AUDIT_STATUS_OK , // 审核通过
];
$order = [
'create_time' => 'desc' , // 创建时间
'sales_actual' => 'desc' , // 实际销量
'sort_weight' => 'asc' , // 商品权重
'id' => 'desc'
];
2023-10-23 07:29:34 +00:00
$news = [];
$news [ 'list' ] = Goods :: field ( 'id,name,image,min_price,market_price,sales_actual,create_time,sales_virtual,(sales_actual + sales_virtual) as sales_total' )
2023-08-10 06:59:52 +00:00
-> where ( $onSaleWhere )
-> order ( $order )
-> limit ( 3 )
-> select ()
-> toArray ();
2023-10-23 07:29:34 +00:00
$news [ 'expire' ] = time () + 600 ; //10分钟过期
session ( 'home_news' , $news );
2023-08-10 06:59:52 +00:00
return $news ;
}
/**
* 获取推荐店铺列表
*/
public static function getShopList ()
{
$where = [
[ 'del' , '=' , 0 ],
[ 'is_recommend' , '=' , 1 ],
[ 'is_freeze' , '=' , 0 ],
[ 'is_run' , '=' , 1 ],
];
$order = [
'weight' => 'asc' ,
'id' => 'desc'
];
$shopLists = Db :: name ( 'shop' )
-> field ( 'id,name,logo,background,expire_time,cover,banner,visited_num' )
-> where ( $where )
-> order ( $order )
-> select ()
-> toArray ();
// 计算在线销售商品
$goodsWhere = [
'del' => GoodsEnum :: DEL_NORMAL , // 未删除
'status' => GoodsEnum :: STATUS_SHELVES , // 上架中
'audit_status' => GoodsEnum :: AUDIT_STATUS_OK , // 审核通过
];
foreach ( $shopLists as $key => & $shop ) {
$shop [ 'expire' ] = $shop [ 'expire_time' ];
$shop [ 'expire_time' ] = self :: getExpire ( $shop [ 'expire_time' ]);
if ( ! empty ( $shop [ 'expire' ]) && $shop [ 'expire' ] <= time ()) {
// 去除到期店铺
unset ( $shopLists [ $key ]);
continue ;
}
$goodsWhere [ 'shop_id' ] = $shop [ 'id' ];
$shop [ 'on_sales_count' ] = Goods :: where ( $goodsWhere ) -> count ();
// logo及背景图
$shop [ 'logo' ] = $shop [ 'logo' ] ? UrlServer :: getFileUrl ( $shop [ 'logo' ]) : UrlServer :: getFileUrl ( ShopEnum :: DEFAULT_LOGO );
$shop [ 'background' ] = $shop [ 'background' ] ? UrlServer :: getFileUrl ( $shop [ 'background' ]) : UrlServer :: getFileUrl ( ShopEnum :: DEFAULT_BG );
$shop [ 'cover' ] = $shop [ 'cover' ] ? UrlServer :: getFileUrl ( $shop [ 'cover' ]) : UrlServer :: getFileUrl ( ShopEnum :: DEFAULT_COVER );
$shop [ 'banner' ] = $shop [ 'banner' ] ? UrlServer :: getFileUrl ( $shop [ 'banner' ]) : '' ;
}
return array_values ( $shopLists );
}
public static function getExpire ( $value )
{
return $value === 0 ? '无期限' : date ( 'Y-m-d H:i:s' , $value );
}
/**
* 精选推荐店铺
*/
public static function getShopRecommend ()
{
$where = [
[ 'del' , '=' , 0 ],
[ 'is_recommend' , '=' , 1 ],
[ 'is_freeze' , '=' , 0 ],
[ 'is_run' , '=' , 1 ],
];
$order = [
'weight' => 'asc' ,
'id' => 'desc'
];
$shopLists = Db :: name ( 'shop' )
-> field ( 'id,name,logo,background,expire_time,cover,banner,visited_num' )
-> where ( $where )
-> order ( $order )
-> select ()
-> toArray ();
// 去除过期店铺
foreach ( $shopLists as $key => $shop ) {
$shop [ 'expire' ] = $shop [ 'expire_time' ];
$shop [ 'expire_time' ] = self :: getExpire ( $shop [ 'expire_time' ]);
if ( ! empty ( $shop [ 'expire' ]) && $shop [ 'expire' ] <= time ()) {
// 去除到期店铺
unset ( $shopLists [ $key ]);
continue ;
}
}
// 取最前面的3家
$shopLists = array_slice ( $shopLists , 0 , 3 );
// 店铺信息
foreach ( $shopLists as & $shop ) {
// 店铺推荐商品
$goodsWhere = [
[ 'del' , '=' , GoodsEnum :: DEL_NORMAL ], // 未删除
[ 'status' , '=' , GoodsEnum :: STATUS_SHELVES ], // 上架中
[ 'audit_status' , '=' , GoodsEnum :: AUDIT_STATUS_OK ], // 审核通过
[ 'is_recommend' , '=' , 1 ], // 推荐商品
[ 'shop_id' , '=' , $shop [ 'id' ]]
];
$shop [ 'goods_list' ] = Goods :: field ( 'id,image,name,min_price,market_price' )
-> where ( $goodsWhere )
-> order ([
'sort_weight' => 'asc' ,
'id' => 'desc'
])
-> limit ( 9 )
-> select ()
-> toArray ();
// logo及背景图
$shop [ 'logo' ] = $shop [ 'logo' ] ? UrlServer :: getFileUrl ( $shop [ 'logo' ]) : UrlServer :: getFileUrl ( ShopEnum :: DEFAULT_LOGO );
$shop [ 'background' ] = $shop [ 'background' ] ? UrlServer :: getFileUrl ( $shop [ 'background' ]) : UrlServer :: getFileUrl ( ShopEnum :: DEFAULT_BG );
$shop [ 'cover' ] = $shop [ 'cover' ] ? UrlServer :: getFileUrl ( $shop [ 'cover' ]) : UrlServer :: getFileUrl ( ShopEnum :: DEFAULT_COVER );
$shop [ 'banner' ] = $shop [ 'banner' ] ? UrlServer :: getFileUrl ( $shop [ 'banner' ]) : '' ;
}
return $shopLists ;
}
public static function indexCategory ( $platform_category_id )
{
// 二级分类
$levelTwo = self :: levelTwo ( $platform_category_id );
// 品类热销
$categoryHots = self :: categoryHots ( $platform_category_id );
// 品类推荐
$categoryRecommend = self :: categoryRecommend ( $platform_category_id );
return [
'level_two' => $levelTwo ,
'category_hots' => $categoryHots ,
'category_recommend' => $categoryRecommend
];
}
public static function levelTwo ( $platform_category_id )
{
$where = [
'del' => 0 ,
'is_show' => 1 ,
'pid' => $platform_category_id
];
$order = [
'sort' => 'asc' ,
'id' => 'desc'
];
$levelTwo = GoodsCategory :: field ( 'id,name,image' )
-> where ( $where )
-> order ( $order )
-> select ()
-> toArray ();
return $levelTwo ;
}
public static function categoryHots ( $platform_category_id )
{
// 销售中商品:未删除/审核通过/已上架
$where = [
[ 'del' , '=' , GoodsEnum :: DEL_NORMAL ], // 未删除
[ 'status' , '=' , GoodsEnum :: STATUS_SHELVES ], // 上架中
[ 'audit_status' , '=' , GoodsEnum :: AUDIT_STATUS_OK ], // 审核通过
[ 'first_cate_id|second_cate_id|third_cate_id' , '=' , $platform_category_id ], // 分类id
];
$order = [
'sales_actual' => 'desc' , // 实际销量倒序
'id' => 'desc'
];
$lists = Goods :: field ( 'id,name,image,min_price,market_price,sales_actual,(sales_actual + sales_virtual) as sales_total' )
-> where ( $where )
-> order ( $order )
-> limit ( 9 )
-> select ()
-> toArray ();
return $lists ;
}
public static function categoryRecommend ( $platform_category_id )
{
// 销售中商品:未删除/审核通过/已上架
$where = [
[ 'del' , '=' , GoodsEnum :: DEL_NORMAL ], // 未删除
[ 'status' , '=' , GoodsEnum :: STATUS_SHELVES ], // 上架中
[ 'audit_status' , '=' , GoodsEnum :: AUDIT_STATUS_OK ], // 审核通过
[ 'first_cate_id|second_cate_id|third_cate_id' , '=' , $platform_category_id ], // 分类id
[ 'is_recommend' , '=' , 1 ] // 推荐商品
];
$order = [
'sales_actual' => 'desc' , // 实际销量倒序
'id' => 'desc'
];
$lists = Goods :: field ( 'id,name,image,min_price,market_price,sales_actual,(sales_actual + sales_virtual) as sales_total' )
-> where ( $where )
-> order ( $order )
-> limit ( 3 )
-> select ()
-> toArray ();
return $lists ;
}
public static function config ()
{
$navigation = Db :: name ( 'dev_navigation' )
-> field ( 'name,selected_icon,un_selected_icon' )
-> where ( 'del' , 0 )
-> order ( 'id' , 'desc' )
-> withAttr ( 'selected_icon' , function ( $value , $data ){
return UrlServer :: getFileUrl ( $value );
})
-> withAttr ( 'un_selected_icon' , function ( $value , $data ){
return UrlServer :: getFileUrl ( $value );
})
-> select ();
$share_h5 = ConfigServer :: get ( 'share' , 'h5' , [
'h5_share_title' => '' ,
'h5_share_intro' => '' ,
'h5_share_image' => ''
]);
if ( $share_h5 [ 'h5_share_image' ]){
$share_h5 [ 'h5_share_image' ] = UrlServer :: getFileUrl ( $share_h5 [ 'h5_share_image' ]);
}
$share_mnp = ConfigServer :: get ( 'share' , 'mnp' , [
'mnp_share_title' => '' ,
'mnp_share_image' => ''
]);
if ( empty ( $share_mnp [ 'mnp_share_image' ])) {
$share_mnp [ 'mnp_share_image' ] = '' ;
} else {
$share_mnp [ 'mnp_share_image' ] = UrlServer :: getFileUrl ( $share_mnp [ 'mnp_share_image' ]);
}
//首页顶部背景图
$index_top_bg = ConfigServer :: get ( 'decoration_index' , 'background_image' , '' );
if ( ! empty ( $index_top_bg )) {
$index_top_bg = UrlServer :: getFileUrl ( $index_top_bg );
}
//个人中心背景图
$center_top_bg = ConfigServer :: get ( 'decoration_center' , 'background_image' , '' );
if ( ! empty ( $center_top_bg )) {
$center_top_bg = UrlServer :: getFileUrl ( $center_top_bg );
}
$config = [
'shop_hide_goods' => ConfigServer :: get ( 'decoration' , 'shop_hide_goods' , 0 ), //商品详细是否显示店铺
'shop_street_hide' => ConfigServer :: get ( 'decoration' , 'shop_street_hide' , 0 ), //是否显示店铺街
'register_setting' => ConfigServer :: get ( 'register' , 'captcha' , 0 ), //注册设置-是否开启短信验证注册
'app_wechat_login' => ConfigServer :: get ( 'app' , 'wechat_login' , 0 ), //APP是否允许微信授权登录
'shop_login_logo' => UrlServer :: getFileUrl ( ConfigServer :: get ( 'website' , 'client_login_logo' )), //移动端商城logo
'pc_login_logo' => UrlServer :: getFileUrl ( ConfigServer :: get ( 'website' , 'pc_client_login_logo' )), //pc登录封面
'web_favicon' => UrlServer :: getFileUrl ( ConfigServer :: get ( 'website' , 'web_favicon' )), //浏览器标签图标
'name' => ConfigServer :: get ( 'website' , 'name' ), //商城名称
'copyright_info' => ConfigServer :: get ( 'copyright' , 'company_name' ), //版权信息
'icp_number' => ConfigServer :: get ( 'copyright' , 'number' ), //ICP备案号
'icp_link' => ConfigServer :: get ( 'copyright' , 'link' ), //备案号链接
'app_agreement' => ConfigServer :: get ( 'app' , 'agreement' , 0 ), //app弹出协议
'ios_download' => ConfigServer :: get ( 'app' , 'line_ios' , '' ), //ios_app下载链接
'android_download' => ConfigServer :: get ( 'app' , 'line_android' , '' ), //安卓下载链接
'download_doc' => ConfigServer :: get ( 'app' , 'download_doc' , '' ), //app下载文案
'cate_style' => ConfigServer :: get ( 'decoration' , 'layout_no' , 1 ), //分类页面风格
'index_setting' => [ // 首页设置
// 热销榜单
'host_show' => ConfigServer :: get ( 'decoration_index' , 'host_show' , 1 ),
// 新品推荐
'new_show' => ConfigServer :: get ( 'decoration_index' , 'new_show' , 1 ),
// 推荐店铺
'shop_show' => ConfigServer :: get ( 'decoration_index' , 'shop_show' , 1 ),
// 种草推荐
'community_show' => ConfigServer :: get ( 'decoration_index' , 'community_show' , 1 ),
// 顶部背景图
'top_bg_image' => $index_top_bg
],
'center_setting' => [ // 个人中心设置
// 顶部背景图
'top_bg_image' => $center_top_bg
],
'navigation_setting' => [ // 底部导航设置
// 未选中文字颜色
'ust_color' => ConfigServer :: get ( 'decoration' , 'navigation_setting_ust_color' , '#000000' ),
// 选中文字颜色
'st_color' => ConfigServer :: get ( 'decoration' , 'navigation_setting_st_color' , '#000000' ),
],
// 分享设置
'share' => array_merge ( $share_h5 , $share_mnp ),
// 首页底部导航菜单
'navigation_menu' => $navigation ,
// 域名
'base_domain' => UrlServer :: getFileUrl (),
// 微信访问H5时,是否自动授权登录,默认关闭-0
'wechat_h5' => ConfigServer :: get ( 'login' , 'wechat_h5' , 0 ),
// 客服请求域名
'ws_domain' => env ( 'project.ws_domain' , 'ws:127.0.0.1' )
];
return $config ;
}
/**
* @ notes 版权资质
* @ return array | int | mixed | string | null
* @ author ljj
* @ date 2022 / 2 / 22 10 : 16 上午
*/
public static function copyright ( $shop_id )
{
$other_qualifications = [];
if ( ! $shop_id ) {
$business_license = ConfigServer :: get ( 'copyright' , 'business_license' );
$other_qualifications = ConfigServer :: get ( 'copyright' , 'other_qualifications' ,[]);
if ( ! empty ( $business_license )) {
array_unshift ( $other_qualifications , $business_license );
}
if ( ! empty ( $other_qualifications )) {
foreach ( $other_qualifications as & $val ) {
$val = UrlServer :: getFileUrl ( $val );
}
}
} else {
$result = Shop :: where ( 'id' , $shop_id ) -> json ([ 'other_qualifications' ], true ) -> field ( 'business_license,other_qualifications' ) -> findOrEmpty () -> toArray ();
$business_license = $result [ 'business_license' ] ? UrlServer :: getFileUrl ( $result [ 'business_license' ]) : '' ;
if ( ! empty ( $result [ 'other_qualifications' ])) {
foreach ( $result [ 'other_qualifications' ] as & $val ) {
$other_qualifications [] = UrlServer :: getFileUrl ( $val );
}
}
if ( ! empty ( $business_license )) {
array_unshift ( $other_qualifications , $business_license );
}
}
return $other_qualifications ;
}
2023-10-23 07:29:34 +00:00
2023-08-10 06:59:52 +00:00
/**
* @ notes 首页社区文章
* @ return array
* @ throws \think\db\exception\DataNotFoundException
* @ throws \think\db\exception\DbException
* @ throws \think\db\exception\ModelNotFoundException
* @ author 段誉
* @ date 2022 / 5 / 5 9 : 38
*/
public static function getCommunityArticle ()
{
$lists = ( new CommunityArticle ())
-> with ([ 'user' => function ( $query ) {
$query -> field ([ 'id' , 'nickname' , 'avatar' ]);
}])
-> field ([ 'id' , 'content' , 'image' , 'user_id' ])
-> where ([ 'del' => 0 , 'status' => CommunityArticleEnum :: STATUS_SUCCESS ])
-> order ([ 'like' => 'desc' , 'id' => 'desc' ])
-> limit ( 10 )
-> select ()
-> bindAttr ( 'user' , [ 'nickname' , 'avatar' ])
-> hidden ([ 'user' ])
-> toArray ();
foreach ( $lists as $key => $item ) {
$lists [ $key ][ 'avatar' ] = UrlServer :: getFileUrl ( $item [ 'avatar' ]);
}
return $lists ;
}
}