451 lines
20 KiB
PHP
451 lines
20 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Server\Admin;
|
|
|
|
use App\Models\Server\MEarningRule;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\MerchantShop;
|
|
use App\Models\Server\MEarning;
|
|
use App\Models\Server\MerchantAccount;
|
|
use App\Models\Server\MerchantUser;
|
|
use App\Models\Server\TouristOrder;
|
|
use App\Models\ShopRecive;
|
|
use App\Models\User;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\Redis;
|
|
|
|
class ShopController extends Controller
|
|
{
|
|
//商城模块
|
|
/**
|
|
* 添加商品
|
|
* @param Request $request
|
|
* @return JsonResponse|string
|
|
*/
|
|
public function addShop(Request $request){
|
|
try {
|
|
$await_checkoutTextArray = [];
|
|
$serve_tab = $request->serve_tab;
|
|
$title = $request->title;
|
|
if (empty($title)) return $this->failure('请输入商品名');
|
|
$sub_title = $request->sub_title;
|
|
if (empty($sub_title)) return $this->failure('商品简介不能为空');
|
|
$icon = $request->icon;
|
|
$pay_type = $request->pay_type ?? 'wechat';
|
|
$price = $request->price;
|
|
if (!is_numeric($price) || $price < 0) return $this->failure('请输入正确的价格');
|
|
$sku = $request->sku;
|
|
$banners = $request->banners;
|
|
// if(empty($banners)) return $this->failure('请上传至少一张商品轮播图');
|
|
$describe = $request->describe;
|
|
if (empty($describe)) return $this->failure('请输入商品详细描述');
|
|
$is_show = $request->is_show ?? 0;
|
|
|
|
$await_checkoutTextArray[] = $title;
|
|
$await_checkoutTextArray[] = $sub_title;
|
|
// $await_checkoutTextArray[] = $describe;
|
|
|
|
//敏感词汇过滤
|
|
$result = \CommonUtilsService::checkoutTextArrayV3($await_checkoutTextArray);
|
|
if ($result['code'] == 1) {
|
|
return $this->failure($result['cause']);
|
|
}
|
|
//内容安全-图片
|
|
$result = \CommonUtilsService::imageContentCecurity([$request->icon]);
|
|
if ($result && isset($result['result']) && $result['result']) {
|
|
return $this->failure('图片' . $result['result'] . ',请换一张照片');
|
|
}
|
|
$openid = MerchantAccount::where('id', $request->account_id)->value('openid');
|
|
$shop = new MerchantShop();
|
|
$shop->merchant_id = $request->account_id;
|
|
$shop->title = $title;
|
|
$shop->sub_title = $sub_title;
|
|
$shop->icon = $icon;
|
|
$shop->pay_type = $pay_type;
|
|
$shop->price = $price;
|
|
$shop->sku = json_encode($sku);
|
|
// $shop->banners = json_encode($banners);
|
|
if (!empty($request->banners)) $shop->banners = json_encode($banners);
|
|
$shop->describe = $describe;
|
|
$shop->is_show = $is_show;
|
|
$shop->save();
|
|
$jump_url = urlencode(env('APP_URL') . '/pu/#/mallDetail/' . $shop->id);
|
|
$url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id=' . $request->account_id . '&serve_tab=' . $serve_tab . '&url=' . $jump_url . '&from_openid=' . $openid;
|
|
// $share_qrcode = $this->getPreviewQrcode($url);
|
|
// $share_qrcode = Redis::get('ShopDetail_S '.$shop->id);
|
|
// if(!$share_qrcode){
|
|
$share_qrcode = $this->getPreviewQrcode($url);
|
|
// Redis::setex('ShopDetail_S '.$shop->id,60*60*24*30,$share_qrcode);
|
|
// $share_qrcode = Redis::get('ShopDetail_S '.$shop->id);
|
|
// }
|
|
$shop->share_qrcode = $share_qrcode;
|
|
$shop->save();
|
|
$rule = MEarningRule::where('m_id', $request->account_id)
|
|
->where('name', 'shop')
|
|
->where('type_id', 0)
|
|
->first();
|
|
if ($request->has('ratio') && $request->ratio >= 0) {
|
|
if ($request->ratio > 1.0) {
|
|
return $this->failure('利润分成比例不能大于100%');
|
|
}
|
|
$MEarningRule = new MEarningRule();
|
|
$MEarningRule->m_id = $request->account_id;
|
|
$MEarningRule->forzen_time = $rule?$rule->forzen_time : 1;
|
|
$MEarningRule->name = 'shop';
|
|
$MEarningRule->ratio = $request->ratio;
|
|
$MEarningRule->type_id = $shop->id;
|
|
$MEarningRule->first_sharer = $rule?$rule->first_sharer:0.3;
|
|
$MEarningRule->last_sharer = $rule?$rule->last_sharer:0.5;
|
|
$MEarningRule->other_sharer = $rule?$rule->other_sharer:0.2;
|
|
$MEarningRule->save();
|
|
}
|
|
//保存后删除草稿箱缓存
|
|
if (Cache::has('drafts_shop_merchant_id_' . $request->account_id)) Cache::forget('drafts_shop_merchant_id_' . $request->account_id);
|
|
return $this->success('ok', ['id' => $shop->id]);
|
|
} catch (\Exception $e) {
|
|
$this->getError($e);
|
|
return $this->failure('服务器休息中,请稍后再试');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 商户商品列表
|
|
* *
|
|
* @param Request $request
|
|
* @return JsonResponse|string
|
|
*/
|
|
public function platShops(Request $request){
|
|
try {
|
|
$keyword = $request->keyword;
|
|
$is_show = $request->is_show ?? 2;
|
|
$merchant_id = $request->account_id;
|
|
$shops = MerchantShop::where('merchant_id', $merchant_id);
|
|
if ($is_show != 2) {
|
|
$shops = $shops->where('is_show', $is_show);
|
|
}
|
|
if ($keyword) {
|
|
$shops = $shops->where('title', 'like', '%' . $keyword . '%');
|
|
}
|
|
$shops = $shops->orderBy('is_show', 'desc')->orderBy('is_top', 'desc')->orderBy('top_time', 'desc')
|
|
->orderBy('id', 'desc')->paginate();
|
|
foreach ($shops as $shop) {
|
|
$member_count = TouristOrder::where('type', 'shop')->where('type_id', $shop->id)->where('pay_status', '<>', 0)->count();
|
|
$shop->member_count = $member_count;
|
|
$pv = Redis::zscore('shop', $shop->id);
|
|
$shop->pv = $pv ?: 0;
|
|
}
|
|
return $this->success('ok', $shops);
|
|
} catch (\Exception $e) {
|
|
$this->getError($e);
|
|
return $this->failure('服务器休息中,请稍后再试');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 编辑商品
|
|
* @param Request $request
|
|
* @param $id
|
|
* @return JsonResponse|string
|
|
*/
|
|
public function updateShop(Request $request,$id){
|
|
try {
|
|
$shop = MerchantShop::find($id);
|
|
$await_checkoutTextArray = [];
|
|
// if(!is_numeric($request->price) || $request->price < 0) return $this->failure('请输入正确的价格');
|
|
if ($request->title && $request->title != $shop->title) {
|
|
$shop->title = $request->title;
|
|
$await_checkoutTextArray[] = $request->title;
|
|
}
|
|
if ($request->has('sub_title')) {
|
|
$shop->sub_title = $request->sub_title;
|
|
}
|
|
if ($request->icon && $request->icon != $shop->icon) {
|
|
$shop->icon = $request->icon;
|
|
}
|
|
if ($request->pay_type && $request->pay_type != $shop->pay_type) {
|
|
$shop->pay_type = $request->pay_type;
|
|
if ($request->pay_type == 'free') {
|
|
$shop->sku = null;
|
|
$shop->price = 0.00;
|
|
}
|
|
|
|
}
|
|
if ($request->price && $request->price != $shop->price) {
|
|
$shop->price = $request->price;
|
|
}
|
|
// $shop->price = $request->price??0;
|
|
if ($request->has('sku') && json_encode($request->sku) != $shop->sku) {
|
|
$shop->sku = json_encode($request->sku);
|
|
}
|
|
if ($request->banners && json_encode($request->banners) != $shop->banners) {
|
|
$shop->banners = json_encode($request->banners);
|
|
}
|
|
if ($request->describe && $request->describe != $shop->describe) {
|
|
$shop->describe = $request->describe;
|
|
// $await_checkoutTextArray[] = $request->describe;
|
|
}
|
|
//敏感词汇过滤
|
|
$result = \CommonUtilsService::checkoutTextArrayV3($await_checkoutTextArray);
|
|
if ($result['code'] == 1) {
|
|
return $this->failure($result['cause']);
|
|
}
|
|
//内容安全-图片
|
|
$result = \CommonUtilsService::imageContentCecurity([$request->icon]);
|
|
if ($result && isset($result['result']) && $result['result']) {
|
|
return $this->failure('图片' . $result['result'] . ',请换一张照片');
|
|
}
|
|
if ($request->has('is_show')) {
|
|
$shop->is_show = $request->is_show;
|
|
}
|
|
if ($request->has('is_top')) {
|
|
$shop->is_top = $request->is_top;
|
|
$shop->top_time = $request->is_top ? date('Y-m-d H:i:s') : null;
|
|
}
|
|
if ($request->has('ratio') && $request->ratio >= 0.0) {
|
|
if ($request->ratio > 1.0) {
|
|
return $this->failure('利润分成不可以大于1');
|
|
}
|
|
$MEarningRule = MEarningRule::where('m_id', $request->account_id)->where('type_id', $id)
|
|
->where('name', 'shop')
|
|
->first();
|
|
$rule = MEarningRule::where('m_id', $request->account_id)
|
|
->where('name', 'shop')
|
|
->where('type_id', 0)
|
|
->first();
|
|
if ($MEarningRule === null) {
|
|
$MEarningRule = new MEarningRule();
|
|
$MEarningRule->forzen_time = $rule?$rule->forzen_time : 1;
|
|
$MEarningRule->m_id = $request->account_id;
|
|
$MEarningRule->name = 'shop';
|
|
$MEarningRule->ratio = $request->ratio;
|
|
$MEarningRule->type_id = $id;
|
|
$MEarningRule->first_sharer = $rule?$rule->first_sharer:0.3;
|
|
$MEarningRule->last_sharer = $rule?$rule->last_sharer:0.5;
|
|
$MEarningRule->other_sharer = $rule?$rule->other_sharer:0.2;
|
|
$MEarningRule->save();
|
|
} elseif ($MEarningRule['ratio'] != $request->ratio) {
|
|
$MEarningRule->forzen_time = $rule?$rule->forzen_time : 1;
|
|
$MEarningRule->ratio = $request->ratio;
|
|
$MEarningRule->first_sharer = $rule?$rule->first_sharer:0.3;
|
|
$MEarningRule->last_sharer = $rule?$rule->last_sharer:0.5;
|
|
$MEarningRule->other_sharer = $rule?$rule->other_sharer:0.2;
|
|
$MEarningRule->save();
|
|
}
|
|
}
|
|
$shop->save();
|
|
return $this->success('ok');
|
|
} catch (\Exception $e) {
|
|
$this->getError($e);
|
|
return $this->failure('服务器休息中,请稍后再试');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 商品详情
|
|
* @param Request $request
|
|
* @param $id
|
|
* @return JsonResponse|string
|
|
*/
|
|
public function shopDetail(Request $request,$id){
|
|
try {
|
|
$serve_tab = $request->serve_tab;
|
|
$shop = MerchantShop::find($id);
|
|
if ($shop->merchant_id != $request->account_id) {
|
|
return $this->failure('商品不属于当前商家');
|
|
}
|
|
$shop['ratio'] = MEarningRule::where('m_id', $request->account_id)
|
|
->where('name', 'shop')->where('type_id', $id)
|
|
->value('ratio');
|
|
if ($shop['ratio'] === null) {
|
|
$shop['ratio'] = MEarningRule::where('m_id', $request->account_id)
|
|
->where('name', 'shop')->where('type_id', 0)
|
|
->value('ratio');
|
|
}
|
|
$shop['ratio'] = number_format($shop['ratio'], 2);
|
|
if ($shop->banners) $shop->banners = json_decode($shop->banners, true) ?? [];
|
|
if ($shop->sku) $shop->sku = json_decode($shop->sku, true) ?? [];
|
|
$jump_url = urlencode(env('APP_URL') . '/pu/#/mallDetail/' . $shop->id);
|
|
$url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id=' . $request->account_id . '&serve_tab=' . $serve_tab . '&serve_tab=' . $serve_tab . '&anchor_openid=' . '&url=' . $jump_url;
|
|
$shop->share_url = $url;
|
|
Redis::zincrby('shop', 1, $id);
|
|
return $this->success('ok', $shop);
|
|
} catch (\Exception $e) {
|
|
$this->getError($e);
|
|
return $this->failure('服务器休息中,请稍后再试');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除商品
|
|
* @param $id
|
|
* @return JsonResponse|string
|
|
*/
|
|
public function removeShop($id){
|
|
try {
|
|
MerchantShop::where('id', $id)->delete();
|
|
return $this->success('ok');
|
|
} catch (\Exception $e) {
|
|
$this->getError($e);
|
|
return $this->failure('服务器休息中,请稍后再试');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 填写物流信息
|
|
* @param Request $request
|
|
* @param $id
|
|
* @return JsonResponse|string
|
|
*/
|
|
public function remarkOrder(Request $request,$id){
|
|
$order = TouristOrder::where('id',$id)->first();
|
|
try {
|
|
$express = $request->express;
|
|
$express_trade_no = $request->express_trade_no;
|
|
if (empty($express) || empty($express_trade_no)) return $this->failure('请按要求填写物流信息');
|
|
if ($order->pay_status == 0) return $this->failure('该订单尚未支付,无法填写');
|
|
$recive = ShopRecive::where('order_id', $order->id)->first();
|
|
if (!$recive) return $this->failure('订单信息有误');
|
|
$recive->express = $express;
|
|
$recive->express_trade_no = $express_trade_no;
|
|
$recive->order_status = 1;
|
|
$recive->save();
|
|
return $this->success('ok');
|
|
} catch (\Exception $e) {
|
|
$this->getError($e);
|
|
return $this->failure('服务器休息中,请稍后再试');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 修改订单跟进状态
|
|
* @param Request $request
|
|
* @param $id
|
|
* @return JsonResponse|string
|
|
*/
|
|
public function updateOrderStatus(Request $request,$id){
|
|
try {
|
|
$order = TouristOrder::find($id);
|
|
$recive = ShopRecive::where('order_id', $id)->first();
|
|
$time = date('Y-m-d H:i:s');
|
|
if (!$order) return $this->failure('订单不存在,请重新确认');
|
|
$desc = $request->desc;
|
|
// if (empty($desc)) return $this->failure('请输入详细的跟进信息');
|
|
$order_status = $request->order_status;
|
|
if ($order_status == 3) {
|
|
$record = array(
|
|
array('chat_way' => '', 'chat_content' => '', 'chat_result' => '将订单标记为【问题订单】', 'time' => $time)
|
|
);
|
|
} else {
|
|
if (empty($order->remark)) {
|
|
$record = array(
|
|
array('chat_way' => $desc[0], 'chat_content' => $desc[1], 'chat_result' => $desc[2], 'time' => $time)
|
|
);
|
|
} else {
|
|
$record = json_decode($order->remark, true);
|
|
$array = ['chat_way' => $desc[0], 'chat_content' => $desc[1], 'chat_result' => $desc[2], 'time' => $time];
|
|
array_push($record, $array);
|
|
}
|
|
}
|
|
if ($request->order_status)
|
|
$recive->order_status = $order_status;
|
|
|
|
$order->remark = json_encode($record);
|
|
$order->save();
|
|
$recive->save();
|
|
return $this->success('ok', $order);
|
|
} catch (\Exception $e) {
|
|
$this->getError($e);
|
|
return $this->failure('服务器休息中,请稍后再试');
|
|
}
|
|
}
|
|
|
|
public function paidShopMember(Request $request,$id){
|
|
try {
|
|
$keyword = $request->keyword;
|
|
$merchant_id = $request->account_id;
|
|
$shop = MerchantShop::find($id);
|
|
$orders = TouristOrder::with('merUser')->where('merchant_id', $merchant_id)->whereIn('pay_status', [1, 4])->where('type', 'shop')->where('type_id', $id);
|
|
if ($keyword) {
|
|
$keyword = trim($keyword);
|
|
$orders = $orders->where(function ($sql) use ($keyword) {
|
|
$sql->where('name', 'like', '%' . $keyword . '%')
|
|
->orWhere('mobile', 'like', '%' . $keyword . '%');
|
|
});
|
|
}
|
|
$orders = $orders->orderBy('id', 'desc')->paginate();
|
|
foreach ($orders as $key => $order) {
|
|
if ($order->mobile == '匿名用户' || $order->mobile == '未获取') {
|
|
$order->mobile = null;
|
|
}
|
|
if ($order['merUser'] != null && $order['merUser']['pic'] == null) {
|
|
$order['merUser']['pic'] = User::DefaultAvatar;
|
|
}
|
|
if ($order['merUser'] != null && $order['merUser']['nickname'] == null) {
|
|
$order['merUser']['nickname'] = '未获取';
|
|
}
|
|
$user = MerchantUser::where('id', $order->account_id)->first();
|
|
$order->pay_user_name = $user->nickname ?? '匿名用户';
|
|
$order->pay_mobile = $user->mobile ?? '未获取';
|
|
$order->pay_avatar = $user->pic ?? User::DefaultAvatar;
|
|
}
|
|
return $this->success('ok', $orders);
|
|
} catch (\Exception $e) {
|
|
$this->getError($e);
|
|
return $this->failure('服务器休息中,请稍后再试');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 移动端商城详情
|
|
* @param Request $request
|
|
* @param $shop_id
|
|
* @return JsonResponse|string
|
|
*/
|
|
public function phoneShopDetail(Request $request,$shop_id){
|
|
try {
|
|
$shop = MerchantShop::withTrashed()->where('id', $shop_id)->first();
|
|
$shop->banners = json_decode($shop->banners, true) ?? [];
|
|
$shop->sku = json_decode($shop->sku, true) ?? [];
|
|
$shop->pic = $shop->icon;
|
|
unset($shop->icon);
|
|
$shop->pv = Redis::zscore('shop', $shop_id) ?? 0;//访问人数
|
|
$shop->share_qr_code = $shop->share_qrcode;
|
|
unset($shop->share_qrcode);
|
|
//消费人数
|
|
$shop->consume_user_count = TouristOrder::where('type', 'shop')->where('type_id', $shop_id)->whereIn('pay_status', [1, 4])->groupBy('open_id')->get()->count();
|
|
//订单数
|
|
$shop->consume_order_count = TouristOrder::where('type', 'shop')->where('type_id', $shop_id)->whereIn('pay_status', [1, 4])->count();
|
|
//收入(元)
|
|
$shop->income_amount = TouristOrder::where('type', 'shop')->where('type_id', $shop_id)->whereIn('pay_status', [1, 4])->sum('price');
|
|
//商家分成金额
|
|
$order_ids = TouristOrder::where('type', 'shop')->where('type_id', $shop_id)->whereIn('pay_status', [1, 4])->pluck('id')->toArray();
|
|
$shop->merchant_income_value = MEarning::whereIn('m_order_id', $order_ids)->where('m_user_id', 0)->sum('value');
|
|
//分成人头像
|
|
$avatar = [];
|
|
$orders = TouristOrder::where('type', 'shop')->where('type_id', $shop_id)->whereIn('pay_status', [1, 4])->orderBy('id', 'desc')->limit(3)->get();
|
|
foreach ($orders as $key => $order) {
|
|
$avatar[$key] = MerchantUser::where('id', $order->account_id)->value('pic') ?? User::DefaultAvatar;
|
|
if (empty($avatar[$key])) $avatar[$key] = User::DefaultAvatar;
|
|
}
|
|
$shop->avatar = $avatar;
|
|
//下架或删除状态 0下架 1正常上架 2已删除
|
|
$publish_state = 0;
|
|
if ($shop->deleted_at) {
|
|
$publish_state = 2;
|
|
} elseif ($shop->is_show == 1) {
|
|
$publish_state = 1;
|
|
} else {
|
|
$publish_state = 0;
|
|
}
|
|
$shop->publish_state = $publish_state;
|
|
return $this->success('ok', $shop);
|
|
} catch (\Exception $e) {
|
|
$this->getError($e);
|
|
return $this->failure('服务器休息中,请稍后再试');
|
|
}
|
|
}
|
|
|
|
}
|