310 lines
12 KiB
PHP
310 lines
12 KiB
PHP
<?php
|
|
namespace app\controller\api;
|
|
|
|
use app\model\CouponMain;
|
|
use app\model\Member;
|
|
use app\model\Slide;
|
|
use app\model\Business;
|
|
use app\repository\AccountRepository;
|
|
use app\repository\BusinessRepository;
|
|
use app\repository\CouponRepository;
|
|
use app\repository\OperationRepository;
|
|
use think\Collection;
|
|
use think\Exception;
|
|
use think\exception\ValidateException;
|
|
use think\response\Json;
|
|
|
|
/**
|
|
* 消费者端:游客、普通用户
|
|
*
|
|
* Class Consumer
|
|
* @package app\controller\api
|
|
*/
|
|
class Consumer extends Base
|
|
{
|
|
protected $noNeedLogin = [
|
|
'home',
|
|
'bannerList',
|
|
];
|
|
|
|
/**
|
|
* 获取附近商家发布的优惠卷
|
|
* @return Json
|
|
*/
|
|
public function home()
|
|
{
|
|
$params = [
|
|
'businessType' => $this->request->param('businessType/d', 0), // 商家类型
|
|
'couponType' => $this->request->param('couponType/d', 0), // 优惠卷类型
|
|
'businessCode' => $this->request->param('businessCode/s'), // 商家code
|
|
'businessCircleId' => $this->request->param('businessCircle/d',0), // 商圈id
|
|
'dis' => $this->request->param('dis/d', -1), // 距离,单位为km
|
|
'lng' => $this->request->param('lng/f', 0), // 经度 104.752890
|
|
'lat' => $this->request->param('lat/f', 0), // 纬度 31.465040
|
|
'keyword' => $this->request->param('key/s', ''), // 关键词查询
|
|
'page' => $this->request->param('page/d', 1),
|
|
'size' => $this->request->param('size/d', 10),
|
|
];
|
|
|
|
|
|
try {
|
|
$repo = CouponRepository::getInstance();
|
|
$nowDate = date('Y-m-d H:i:s');
|
|
|
|
|
|
$lngRange = [];
|
|
$latRange = [];
|
|
$whereMap = [];
|
|
$sortOrder = ['square'=> 'asc', 'id'=>'desc'];
|
|
|
|
$whereMap[] = ['status', '=', CouponMain::status_on];
|
|
$whereMap[] = ['on_shelf', '=', CouponMain::on_shelf_on];
|
|
//$whereMap[] = ['start_time', '< TIME', $nowDate];
|
|
$whereMap[] = ['end_time', '> TIME', $nowDate];
|
|
$whereMap[] = ['using_count', '>', 0];
|
|
|
|
if (!empty($params['keyword'])) {
|
|
$whereMap[] = ['name|business_name', 'like', "%".$params['keyword']."%"];
|
|
}
|
|
if ($params['businessType'] > 0) {
|
|
$whereMap[] = ['business_type', '=', $params['businessType']];
|
|
}
|
|
if ($params['couponType'] > 0) {
|
|
$whereMap[] = ['type', '=', $params['couponType']];
|
|
}
|
|
if (!empty($params['businessCode'])) {
|
|
$whereMap[] = ['business_code', '=', $params['businessCode']];
|
|
}
|
|
if (($params['businessCircleId']) > 0 ) {
|
|
$whereMap[] = ['business_circle_id', '=', $params['businessCircleId']];
|
|
}
|
|
|
|
if ($params['dis'] > 0) {
|
|
$pointList = getEarthSquareRangePoint($params['lat'],$params['lng'], $params['dis']);
|
|
$latRange[] = ['lat', 'BETWEEN', [$pointList['lat_min'], $pointList['lat_max']]];
|
|
if (abs($pointList['cur_lng'] - $pointList['lng_min']) != $pointList['dis_lng'] && $pointList['lng_min'] < 0) {
|
|
$lngRange[] = ['lng', 'BETWEEN' , [-180, $pointList['lng_min']]];
|
|
$lngRange[] = ['lng', 'BETWEEN' , [($pointList['cur_lng'] - $pointList['dis_lng']), 180]];
|
|
} else {
|
|
$lngRange[] = ['lng', 'BETWEEN' , [$pointList['lng_min'], $pointList['lng_max']]];
|
|
}
|
|
}
|
|
|
|
|
|
|
|
$res = $repo->findCouponMainList($whereMap,[], $params['page'], $params['size'], function ($q) use($lngRange, $latRange, $params) {
|
|
return $q->with(["business"=>function($q){
|
|
return $q->field("business_subtitle,code");
|
|
}])->when(!empty($lngRange) && !empty($latRange), function($query) use($lngRange, $latRange){
|
|
$query->where(function ($queryB) use($lngRange) {
|
|
$queryB->whereOr($lngRange);
|
|
})->where($latRange);
|
|
})
|
|
->field("*, abs( (IFNULL(lat,0) - {$params['lat']}) * (IFNULL(lng,0) - {$params['lng']}) ) as square");
|
|
}, $sortOrder);
|
|
|
|
$accountRepo= AccountRepository::getInstance();
|
|
|
|
$accountId = $this->request->user['user_id'] ?? 0;
|
|
$flowArray = [];
|
|
if ($accountId) {
|
|
$account = $accountRepo->findById($accountId, [], function ($q) {
|
|
return $q->with(['business', 'parent']);
|
|
});
|
|
if (!empty($account)) {
|
|
$flowArray = $accountRepo->getBusinessFlowCodeArray($account->user_code);
|
|
}
|
|
}
|
|
$time = time();
|
|
$res['list']->each(function ($item) use ($params, $flowArray, $time) {
|
|
unset($item->square);
|
|
$distance = (get_distance($params["lat"], $params["lng"], $item["lat"],$item["lng"]));
|
|
if ($distance >= 1000) {
|
|
$item->distance_text = round($distance / 1000, 2) . "km";
|
|
} else {
|
|
$item->distance_text = $distance . "m";
|
|
}
|
|
|
|
//是否收藏了该签到券的商家
|
|
$item->isFlow = in_array($item->business_code,$flowArray);
|
|
|
|
$item->couponId = $item->id;
|
|
$item->businessCode = $item->business_code;
|
|
$item->businessName = $item->business_name;
|
|
$item->cover = $this->request->domain().$item->image_url;
|
|
$item->couponName = $item->name;
|
|
|
|
//到期状态 到期前7天!!!!!!!!没做完
|
|
$weekTime = 7 * 86400;
|
|
$endTime = strtotime($item->end_time);
|
|
if (($endTime - $time) < $weekTime) {
|
|
$ExpirationTime = ($endTime - $time) / 86400;
|
|
$item->expirationTimeStr = "还有" . ceil($ExpirationTime) . "到期";
|
|
} else {
|
|
$item->expirationTimeStr = '';
|
|
}
|
|
});
|
|
|
|
return $this->json(0, 'success', $res);
|
|
} catch (\Exception $e) {
|
|
return $this->json(0, 'success', [
|
|
"total" => 0,
|
|
"current" => $params['page'],
|
|
"size" => $params['size'],
|
|
"list" => new Collection()
|
|
]);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* banner列表
|
|
* */
|
|
public function bannerList()
|
|
{
|
|
$repo = OperationRepository::getInstance();
|
|
$whereMap = [];
|
|
$orders = ['sort'=>'asc'];
|
|
$page = input("page/d",1);
|
|
$size = input("size/d",1000);
|
|
$whereMap[] = ['position', '=', Slide::homePosition];
|
|
$list = $repo->slideList($whereMap, ["id","title","src as image","url","url_type as type"], $page, $size, function ($q){
|
|
return $q->withAttr("image",function ($value){
|
|
return $this->request->domain() . $value;
|
|
});
|
|
}, $orders);
|
|
return $this->json(1,"ok",$list["list"]);
|
|
}
|
|
|
|
/**
|
|
* 广告列表
|
|
* */
|
|
public function advertisement()
|
|
{
|
|
$repo = OperationRepository::getInstance();
|
|
$orders = ['sort'=>'asc'];
|
|
$page = input("page/d",1);
|
|
$size = input("size/d",1000);
|
|
$couponId = input("coupon_id/d",0);
|
|
|
|
$coupon = CouponRepository::getInstance()->findById($couponId, [], function ($q) {
|
|
return $q->with([
|
|
"business" => function ($q) {
|
|
$q->field("code,id,business_name,business_subtitle,is_assign,agency_code");
|
|
}
|
|
]);
|
|
});
|
|
|
|
//如果优惠券所属商家指派了渠道商
|
|
if(
|
|
!empty($coupon)
|
|
&&
|
|
isset($coupon->business)
|
|
&&
|
|
!empty($coupon->business)
|
|
){
|
|
if($coupon->business->is_assign
|
|
&&
|
|
!empty($coupon->business->agency_code)
|
|
){
|
|
|
|
$agency = Member::findOne([["business_code","=",$coupon->business->agency_code]]);
|
|
|
|
if(!empty($agency)){
|
|
$awhereMap = [];
|
|
$awhereMap[] = ['position', '=', Slide::advertisement];
|
|
$awhereMap[] = ['agency_id', '=', $agency["id"]];
|
|
$list = $repo->slideList($awhereMap, ["id","title","src as image","url","url_type as type"], $page, $size, function ($q){
|
|
return $q->withAttr("image",function ($value){
|
|
return $this->request->domain() . $value;
|
|
});
|
|
}, $orders);
|
|
|
|
if(!empty($list["list"]->toArray())){
|
|
return $this->json(1,"ok",$list["list"]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$whereMap = [];
|
|
$whereMap[] = ['position', '=', Slide::advertisement];
|
|
$list = $repo->slideList($whereMap, ["id","title","src as image","url","url_type as type"], $page, $size, function ($q){
|
|
return $q->withAttr("image",function ($value){
|
|
return $this->request->domain() . $value;
|
|
});
|
|
}, $orders);
|
|
return $this->json(1,"ok",$list["list"]);
|
|
}
|
|
|
|
|
|
/**
|
|
* 关注/取消关注一个商家
|
|
* */
|
|
public function flowBusiness()
|
|
{
|
|
$accountId = $this->request->user['user_id'] ?? 0;
|
|
$accountRepo = AccountRepository::getInstance();
|
|
try {
|
|
$account = $accountRepo->findById($accountId, [], function ($q) {
|
|
return $q->with(['business', 'parent']);
|
|
});
|
|
if (empty($account)) {
|
|
throw new ValidateException('用户无效!');
|
|
}
|
|
|
|
$businessCode = input("businessCode/s");
|
|
$business = BusinessRepository::getInstance()->findOneByWhere(["code"=>$businessCode]);
|
|
if(empty($business)){
|
|
throw new ValidateException('商家无效!');
|
|
}
|
|
$businessFlow = $accountRepo->hasBusinessFlow($account->user_code,$businessCode);
|
|
|
|
//如果关注了 就删除
|
|
if($businessFlow){
|
|
$businessFlow->delete();
|
|
}else{
|
|
//没有关注就添加
|
|
$accountRepo->createBusinessFlow($account->user_code,$businessCode,$business->business_name);
|
|
}
|
|
return $this->json();
|
|
|
|
} catch (ValidateException $e) {
|
|
return $this->json(4001, $e->getError());
|
|
} catch (Exception $e) {
|
|
return $this->json(5001, '服务器繁忙!');
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 关注商家的列表
|
|
* */
|
|
public function getFlowBusiness()
|
|
{
|
|
$accountId = $this->request->user['user_id'] ?? 0;
|
|
$page = $this->request->param('page/d', 1);
|
|
$size = $this->request->param('size/d', 10);
|
|
$keyword = input("keyWord/s");
|
|
$accountRepo = AccountRepository::getInstance();
|
|
try {
|
|
$account = $accountRepo->findById($accountId, [], function ($q) {
|
|
return $q->with(['business', 'parent']);
|
|
});
|
|
if (empty($account)) {
|
|
throw new ValidateException('用户无效!');
|
|
}
|
|
$data = AccountRepository::getInstance()->getBusinessFlowList($account->user_code,$page,$size,$keyword);
|
|
$data["list"]->each(function ($item){
|
|
$item->businessCover = $this->request->domain() . $item->background;
|
|
});
|
|
return $this->json(0,"success",$data);
|
|
}catch (ValidateException $e) {
|
|
return $this->json(4001, $e->getError());
|
|
} catch (Exception $e) {
|
|
echo $e->getMessage();
|
|
return $this->json(5001, '服务器繁忙!获取用户个人信息失败');
|
|
}
|
|
|
|
}
|
|
} |