love_php/app/Http/Controllers/Server/Admin/ShopController.php
2026-04-02 09:20:51 +08:00

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('服务器休息中,请稍后再试');
}
}
}