123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722 |
- <?php
- /*
- * @Description: 用户套餐表
- * @Version: *
- * @Autor: lexuan
- * @Date: 2024-11-26 09:24:11
- * @LastEditors: lexuan
- * @LastEditTime: 2024-11-26 09:24:11
- */
- namespace App\DataApiNew\Helper;
- use App\DataApiNew\Models\AgentPackage;
- use App\Models\Pages;
- use App\Models\SpoutExport;
- use App\Models\SpoutImport;
- use App\DataApiNew\Models\AdminUsers;
- use App\DataApiNew\Models\Packages;
- use App\DataApiNew\Models\SystemSetting;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- use Vinkla\Hashids\Facades\Hashids;
- class AgentPackageHelper
- {
- private $is_shop = 0; // 是否是小店查询
- private $is_shopping = 0; // 是否是小程序直播购物车
- public $is_platform_api = 0; // 是否是平台api
- // 查询条件
- public function whens($query, $request)
- {
- return $query
- ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id));
- }
- // 查询列表
- public function select(Request $request)
- {
- $page = new Pages($request, AgentPackage::query());
- $page->before(function ($query) use ($request) {
- $query->select(AgentPackage::$selectFields);
- return $this->whens($query, $request);
- });
- $result = $page->paginate();
- return $result;
- }
- // 导出
- public function export(Request $request)
- {
- $query = AgentPackage::select(AgentPackage::$selectFields);
- $query = $this->whens($query, $request);
- $query->orderBy('created_at', 'desc');
- $header = [
- '合伙人id' => 'agent_id',
- '套餐id' => 'package_id',
- '套餐佣金' => 'DEFAULT',
- '上架状态 0:下架 1:上架' => 'is_upload',
- '状态' => 'status',
- '创建时间' => 'created_at',
- '修改时间' => 'updated_at',
- '可见用户' => 'visible_to_users',
- '不可见用户' => 'invisible_to_users',
- '分成类型 1:比例 2:金额' => 'yj_type',
- '分成比例' => 'yj_p',
- '分销员id' => 'fxuser_id',
- '权重' => 'weight',
- '用户id' => 'user_id',
- ];
- $getEnValue = $this->getEnValue();
- $excel = new SpoutExport($header);
- $excel->setData($query->get());
- $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
- return $result ? success($result['url']) : error();
- }
- // 导入
- public function import(Request $request)
- {
- $header = [
- '合伙人id' => 'agent_id',
- '套餐id' => 'package_id',
- '套餐佣金' => 'DEFAULT',
- '上架状态 0:下架 1:上架' => 'is_upload',
- '状态' => 'status',
- '创建时间' => 'created_at',
- '修改时间' => 'updated_at',
- '可见用户' => 'visible_to_users',
- '不可见用户' => 'invisible_to_users',
- '分成类型 1:比例 2:金额' => 'yj_type',
- '分成比例' => 'yj_p',
- '分销员id' => 'fxuser_id',
- '权重' => 'weight',
- '用户id' => 'user_id',
- ];
- $getEnValue = $this->getEnValue();
- $SpoutImport = new SpoutImport($header);
- $dataList = $SpoutImport->setRequest($request)->getExcelData();
- return $dataList;
- }
- // 获取枚举值
- public function getEnValue()
- {
- $data = [
- 'operator_id' => SystemSetting::$operator,
- 'is_upload' => Packages::$isUpload,
- 'rebate_type' => Packages::$rebateType,
- 'is_live' => Packages::$isLive,
- 'select_status' => Packages::$selectStatus,
- ];
- return $data;
- }
- // 查询一条
- public function find(Request $request)
- {
- $request->validate([
- 'id' => 'required|integer',
- ]);
- $result = AgentPackage::where(['id' => $request->id])->select(AgentPackage::$selectFields)->first();
- return success($result);
- }
- // 添加
- public function insert(Request $request)
- {
- $request->validate([
- 'name' => 'required',
- ]);
- $result = AgentPackage::create($request->all());
- if ($result) {
- return success();
- } else {
- return error();
- }
- }
- // 修改
- public function update(Request $request)
- {
- $request->validate([
- 'id' => 'required|integer',
- ]);
- $result = AgentPackage::where(['id' => $request->id])->update($request->all());
- if ($result) {
- return success();
- } else {
- return error();
- }
- }
- // 删除
- public function delete(Request $request)
- {
- $request->validate([
- 'ids' => 'required',
- ]);
- $id_str = $request->ids;
- $arr = explode(",", $id_str);
- // 查询是否存在子数据
- // $count = Shop::whereIn('tm_id',$arr)->count();
- // if($count > 0){
- // return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
- // }
- $result = AgentPackage::whereIn('id', $arr)->delete();
- if ($result) {
- return success();
- } else {
- return error();
- }
- }
- /**
- * 产品中心
- *
- * @param Request $request
- * @param array $selectFields 展示的字段
- * @param array $hiddenFields 隐藏的字段
- */
- public function productCenter(Request $request, $selectFields = [], $hiddenFields = [])
- {
- // 获取用户id
- if ($request->filled('user_id')) {
- $user_id = Hashids::decode($request->user_id);
- if (empty($user_id)) {
- return error("无效信息");
- }
- $user_id = $user_id[0];
- } else {
- $user_id = auth()->id();
- }
- // 获取字段
- if (empty($selectFields)) {
- $selectFields = Packages::$selectFields;
- }
- if (AdminUsers::isAdmin($user_id) && ($this->is_shopping == 0 && $this->is_shop == 0)) {
- // admin 查看原始套餐
- return (new PackagesHelper())->select($request, $selectFields);
- } else {
- $page = new Pages($request, Packages::query());
- // 字段添加前缀
- foreach ($selectFields as &$value) {
- $value = 'packages.' . $value;
- }
- $page->before(function ($query) use ($request, $selectFields, $user_id) {
- // admin 上架的产品
- $query->select($selectFields)->where('packages.is_upload', 1)
- // 关联查询上下架状态
- ->leftJoin('agent_package', function ($join) use ($user_id) {
- $join->on('packages.id', '=', 'agent_package.package_id')
- ->where('agent_package.user_id', '=', $user_id);
- })
- // 查询条件
- ->when($request->filled('id'), fn ($q) => $q->where('packages.id', $request->id))
- ->when($request->has('is_live'), fn ($q) => $q->where('packages.is_live', $request->is_live))
- ->when($request->has('rebate_type'), fn ($q) => $q->where('packages.rebate_type', $request->rebate_type))
- ->when($request->has('is_shopping') && $request->is_shopping == 0, fn ($q) => $q->where(function ($query) {
- $query->where('agent_package.is_shopping', 0)->orWhereNull('agent_package.is_shopping');
- }))
- ->when($request->has('is_shopping') && $request->is_shopping == 1, fn ($q) => $q->where('agent_package.is_shopping', 1))
- ->when($request->has('is_upload') && $request->is_upload == 0, fn ($q) => $q->where('agent_package.is_upload', 0))
- ->when($request->has('is_upload') && $request->is_upload == 1, fn ($q) => $q->where(function ($query) {
- $query->where('agent_package.is_upload', null)->orWhere('agent_package.is_upload', 1);
- }))
- ->when($request->filled('name'), fn ($q) => $q->where('packages.name', 'like', "%$request->name%"))
- ->when($request->filled('operator_id'), fn ($q) => $q->where('packages.operator_id', $request->operator_id))
- // 判断是否是下架产品,并动态设置 is_upload
- ->addSelect([
- DB::raw('CASE
- WHEN agent_package.is_upload = 0 THEN 0
- ELSE packages.is_upload
- END AS is_upload')
- ])
- ->orderByRaw("IFNULL(agent_package.is_upload, 1) DESC")
- ->orderByRaw('CASE WHEN agent_package.weight IS NULL OR agent_package.weight = 0 THEN packages.weight ELSE agent_package.weight END DESC')
- ->orderBy(DB::raw('CAST(packages.yj AS UNSIGNED)'), 'desc')
- ->orderBy('packages.created_at', 'desc');;
- return $query;
- });
- if ($this->is_shop == 1) {
- // 小店
- $hiddenFields = ['yj','id'];
- $page->after(function ($data) use ($hiddenFields) {
- $data->each(function ($item) {
- $item->package_key = Hashids::encode($item->id);
- });
- // 隐藏字段
- $data->makeHidden($hiddenFields);
- });
- } elseif ($this->is_shopping == 1) {
- // 购物车
- $hiddenFields = ['yj'];
- $page->after(function ($data) use ($hiddenFields) {
- // 隐藏字段
- $data->makeHidden($hiddenFields);
- });
- } elseif ($this->is_platform_api == 1) {
- // 平台api
- $page->after(function ($data) use ($user_id, $hiddenFields) {
- $data = $this->setYjShow($user_id, $data);
- // 隐藏字段
- $data->makeHidden($hiddenFields);
- // 替换字段名称
- $data->each(function ($item) {
- if (!empty($item->id)) {
- $item->package_key = Hashids::encode($item->id);
- }
- if (!empty($item->yj)) {
- $item->commission = $item->yj;
- unset($item->yj);
- }
- if (!empty($item->yjzc)) {
- $item->commission_rate = $item->yjzc;
- unset($item->yjzc);
- }
- });
- });
- } else {
- // 产品中心
- $page->after(function ($data) use ($user_id, $hiddenFields) {
- $data = $this->setYjShow($user_id, $data);
- // 隐藏字段
- $data->makeHidden($hiddenFields);
- });
- }
- $packageList = $page->paginate();
- return $packageList;
- }
- }
- // 产品中心导出
- public function productCenterExport(Request $request)
- {
- sys_log($request, '产品中心导出', '号卡产品中心');
- $request->merge(['page_not' => 1]);
- $selectFields = [
- 'id',
- 'name', // 名称
- 'mini_text', // 简介
- 'operator_id', // 运营商
- 'yj',
- 'yjzc', // 佣金政策
- 'weight', // 权重
- 'is_upload', // 是否上架
- 'created_at',
- 'out_package_id', // 外部产品编码
- 'belonging_place', // 归属地
- 'data_quota', // 流量额度
- 'call_duration', // 通话时长
- 'first_recharge_amount', // 首充金额
- 'attention', // 注意事项
- 'rebate_type', // 返佣类型 1:次月返 2:秒返
- 'select_status', // 是否选号
- 'is_live', // 是否允许直播 0:不允许 1:允许
- 'commission_terms', // 结佣条件
- ];
- $dataList = $this->productCenter($request, $selectFields);
- $header = [
- '名称' => 'name',
- '简介' => 'mini_text',
- '佣金' => 'yj',
- '运营商' => 'operator_id',
- '佣金政策' => 'yjzc',
- '是否上架' => 'is_upload',
- '外部产品编码' => 'out_package_id',
- '归属地' => 'belonging_place',
- '流量额度' => 'data_quota',
- '通话时长' => 'call_duration',
- '首充金额' => 'first_recharge_amount',
- '注意事项' => 'attention',
- '返佣类型' => 'rebate_type',
- '是否选号' => 'select_status',
- '是否允许直播' => 'is_live',
- '创建时间' => 'created_at',
- '结佣条件' => 'commission_terms',
- ];
- $getEnValue = $this->getEnValue();
- $dataList = json_decode($dataList->getContent(),true);
- $excel = new SpoutExport($header);
- $excel->setData($dataList['data']);
- $result = $excel->setEnum($getEnValue)->setProcessStyle(30)->spoutToExcel('产品中心导出数据');
- return $result;
- }
- // 获取产品详情
- public function productDetail(Request $request)
- {
- $request->validate([
- 'id' => 'required|integer',
- ]);
- $user_id = auth()->id();
- if (AdminUsers::isAdmin($user_id)) {
- $package = Packages::with(['package_member_level_royalty'])->select(Packages::$selectFields)->where('id', $request->id)->first();
- return success($package);
- }
- $package = Packages::select(Packages::$selectFields)->where('id', $request->id)->first();
- if (empty($package)) {
- return error('产品不存在');
- }
- $package = $this->setYjShow($user_id, $package, false);
- return success($package);
- }
- // 产品上下架
- public function packageUpload(Request $request)
- {
- $request->validate([
- 'ids' => 'required|string',
- 'is_upload' => 'required|integer|in:0,1',
- ]);
- sys_log($request, '产品上下架', '号卡产品中心');
- $ids = explode(',', $request->ids);
- $user_id = auth()->id();
- if (AdminUsers::isAdmin($user_id)) {
- Packages::whereIn('id', $ids)->update(['is_upload' => $request->is_upload]);
- } else {
- foreach ($ids as $id) {
- $agentPackage = AgentPackage::where('user_id', $user_id)->where('package_id', $id)->first();
- if ($agentPackage) {
- $agentPackage->update(['is_upload' => $request->is_upload]);
- } else {
- AgentPackage::create(['user_id' => $user_id, 'package_id' => $id, 'is_upload' => $request->is_upload]);
- }
- }
- }
- return success();
- }
- /**
- * 佣金展示计算
- *
- * @param $user_id 用户id
- * @param $packageList 产品列表
- * @param $is_list 是否是列表
- */
- public function setYjShow($user_id, $packageList, $is_list = true)
- {
- // 获取父用户的佣金信息
- $parentList = AdminUsers::getParents($user_id);
- $parentYjType = AdminUsers::with(['agent_package'])
- ->select(['id', 'yj_type', 'yj_a', 'yj_p'])
- ->whereIn('id', $parentList)
- ->orderBy('agent_level', 'ASC')
- ->get()
- ->keyBy('id'); // 重置索引为用户id
- if ($is_list) {
- // 遍历产品列表
- foreach ($packageList as &$package) {
- $package = $this->computation($parentYjType, $package);
- }
- return $packageList;
- } else {
- return $this->computation($parentYjType, $packageList);
- }
- }
- // 计算佣金
- private function computation($parentYjType, $package)
- {
- $yj = (string)$package->yj; // 原始佣金
- $package_id = $package->id;
- // 遍历所有上级用户
- foreach ($parentYjType as $user) {
- $yj_type = $user->yj_type; // 佣金类型
- $yj_p = (string)$user->yj_p; // 百分比
- $yj_a = (string)$user->yj_a; // 固定金额
- $agent_package = $user->agent_package->keyBy('package_id'); // 提前获取代理包裹数据并按package_id索引
- // 根据代理包裹设置佣金类型
- if (isset($agent_package[$package_id]) && $agent_package[$package_id]['yj_type'] != 0) {
- $package_info = $agent_package[$package_id];
- $yj_type = $package_info['yj_type']; // 佣金类型
- $yj_p = (string)$package_info['yj_p']; // 百分比
- $yj_a = (string)$package_info['yj_a']; // 固定金额
- }
- // 根据佣金类型进行计算
- if ($yj_type == 1) { // 百分比计算
- $yj_p = bcdiv($yj_p, 100, 2); // 百分比转化为小数
- $yj = bcsub($yj, bcmul($yj, $yj_p, 2), 2); // 计算佣金
- } elseif ($yj_type == 2) { // 固定金额计算
- $yj = bcsub($yj, $yj_a, 2); // 计算佣金
- }
- // 如果佣金小于0,则设置为0
- if (bccomp($yj, '0', 2) < 0) {
- $yj = '0'; // 设置为 0
- break;
- }
- }
- // 更新包裹佣金
- $package->yj = $yj;
- return $package;
- }
- // 获取用户小店套餐
- public function getShopPackage(Request $request)
- {
- $request->validate([
- 'user_key' => 'required', // 用户id加密
- ]);
- $user_id = $request->user_key;
- $request->merge([
- 'is_upload' => 1,
- 'user_id' => $user_id,
- ]);
- $this->is_shop = 1; // 小店不计算展示佣金
- return $this->productCenter($request, Packages::$selectFieldsByShop);
- }
- // 设置权重
- public function setWeight(Request $request)
- {
- $request->validate([
- 'package_id' => 'required|integer',
- 'weight' => 'required|integer',
- ]);
- sys_log($request, '设置权重', '号卡产品中心');
- $user_id = auth()->id();
- if (AdminUsers::isAdmin($user_id)) {
- $result = Packages::where('id', $request->package_id)->update(['weight' => $request->weight]);
- } else {
- $agent_package = AgentPackage::where('user_id', $user_id)->where('package_id', $request->package_id)->first();
- if ($agent_package) {
- $result = $agent_package->update(['weight' => $request->weight]);
- } else {
- $result = AgentPackage::create(['user_id' => $user_id, 'package_id' => $request->package_id, 'weight' => $request->weight, 'is_upload' => 1]);
- }
- }
- if ($result) {
- return success();
- } else {
- return error();
- }
- }
- // 设置是否允许直播(admin)
- public function setLive(Request $request)
- {
- $request->validate([
- 'package_id' => 'required|integer',
- 'is_live' => 'required|in:0,1', // 是否允许直播
- ]);
- sys_log($request, '设置是否允许直播', '号卡产品中心');
- $user_id = auth()->id();
- if (AdminUsers::isAdmin($user_id)) {
- $result = Packages::where('id', $request->package_id)->update(['is_live' => $request->is_live]);
- } else {
- return error();
- }
- if ($result) {
- return success();
- } else {
- return error();
- }
- }
- // 获取套餐信息
- public function getPackageInfo(Request $request)
- {
- $request->validate([
- 'package_key' => 'required', // 套餐id加密
- 'user_key' => 'required', // 用户id加密
- ]);
- $package_id = Hashids::decode($request->package_key);
- if (empty($package_id)) {
- return error("无效操作");
- }
- $user_id = Hashids::decode($request->user_key);
- if (empty($user_id)) {
- return error("无效操作");
- }
- $package_id = $package_id[0];
- $user_id = $user_id[0];
- $package = Packages::select([
- 'id',
- 'name',
- 'mini_text',
- 'image',
- 'details',
- 'is_upload',
- ])
- ->where('id', $package_id)->first();
- if (!$package || $package->is_upload == 0) {
- return error("套餐已下架");
- }
- $agent_package = AgentPackage::select([
- 'id',
- 'is_upload',
- ])
- ->where('user_id', $user_id)->where('package_id', $package_id)->first();
- if ($agent_package && $agent_package->is_upload == 0) {
- return error("套餐已下架");
- }
- return ['code' => 1, 'msg' => "success", 'data' => $package];
- }
- // 批量设置单品抽成
- public function setUserProductYj(Request $request)
- {
- $request->validate([
- 'user_ids' => 'required|string', // 用户id
- 'package_id' => 'required|integer', // 套餐id
- 'yj_type' => 'required|integer|in:1,2', // 佣金类型
- 'yj_p' => 'integer', // 百分比
- 'yj_a' => 'numeric', // 金额
- ]);
- sys_log($request, '批量设置单品抽成', '号卡产品中心');
- $package = Packages::where('id', $request->package_id)->exists();
- if (!$package) {
- return error("套餐不存在");
- }
- $user_ids = explode(',', $request->user_ids);
- foreach ($user_ids as $user_id) {
- $agent_package = AgentPackage::where('user_id', $user_id)->where('package_id', $request->package_id)->first();
- if ($agent_package) {
- $updateData = [
- 'yj_type' => $request->yj_type,
- 'yj_p' => $request->input('yj_p', $agent_package->yj_p),
- 'yj_a' => $request->input('yj_a', $agent_package->yj_a),
- ];
- $agent_package->update($updateData);
- } else {
- AgentPackage::create([
- 'user_id' => $user_id,
- 'package_id' => $request->package_id,
- 'yj_type' => $request->yj_type,
- 'yj_p' => $request->yj_p ?? 0,
- 'yj_a' => $request->yj_a ?? 0,
- 'is_upload' => 1
- ]);
- }
- }
- return success();
- }
- // 设置小程序直播购物车
- public function setShopping(Request $request)
- {
- $request->validate([
- 'package_id' => 'required|integer',
- 'is_shopping' => 'required|in:0,1', // 是否允许直播
- ]);
- sys_log($request, '设置小程序直播购物车', '号卡产品中心');
- $package = Packages::select([
- 'id',
- 'is_live',
- 'is_upload',
- ])->where('id', $request->package_id)->first();
- if (!$package || $package->is_upload == 0) {
- return error("套餐已下架");
- }
- if ($package->is_live == 0) {
- return error("该套餐未开启直播");
- }
- $user_id = $request->user()->id;
- $agent_package = AgentPackage::where('package_id', $request->package_id)->first();
- if ($agent_package->is_upload == 0) {
- return error("该套餐已下架");
- }
- if ($agent_package) {
- $agent_package->update(['is_shopping' => $request->is_shopping]);
- } else {
- AgentPackage::create([
- 'user_id' => $user_id,
- 'package_id' => $request->package_id,
- 'is_shopping' => $request->is_shopping,
- 'is_upload' => 1
- ]);
- }
- return success();
- }
- // 获取小程序直播购物车产品
- public function getShopping(Request $request)
- {
- $this->is_shopping = 1;
- $params = [
- 'is_upload' => 1,
- 'is_live' => 1,
- ];
- if ($request->has('is_shopping')) {
- $params['is_shopping'] = $request->input('is_shopping');
- }
- if ($request->has('id')) {
- $params['id'] = $request->input('id');
- }
- $result = $this->productCenter(new Request($params), Packages::$selectFieldsByShop);
- return $result;
- }
- }
|