AgentPackageKdHelper.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. <?php
  2. /*
  3. * @Description: 用户套餐表
  4. * @Version: *
  5. * @Autor: lexuan
  6. * @Date: 2024-11-26 09:24:11
  7. * @LastEditors: lexuan
  8. * @LastEditTime: 2024-11-26 09:24:11
  9. */
  10. namespace App\DataApiNew\Helper;
  11. use App\DataApiNew\Models\AgentPackageKd as AgentPackage;
  12. use App\Models\Pages;
  13. use App\Models\SpoutExport;
  14. use App\Models\SpoutImport;
  15. use App\DataApiNew\Models\AdminUsers;
  16. use App\DataApiNew\Models\PackagesKd as Packages;
  17. use App\DataApiNew\Models\SystemSetting;
  18. use Illuminate\Http\Request;
  19. use Illuminate\Support\Facades\DB;
  20. use Vinkla\Hashids\Facades\Hashids;
  21. class AgentPackageKdHelper
  22. {
  23. private $is_shop = 0; // 是否是小店查询
  24. public $is_platform_api = 0; // 是否是平台api
  25. // 查询条件
  26. public function whens($query, $request)
  27. {
  28. return $query
  29. ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id));
  30. }
  31. // 查询列表
  32. public function select(Request $request)
  33. {
  34. $page = new Pages($request, AgentPackage::query());
  35. $page->before(function ($query) use ($request) {
  36. $query->select(AgentPackage::$selectFields);
  37. return $this->whens($query, $request);
  38. });
  39. $result = $page->paginate();
  40. return $result;
  41. }
  42. // 导出
  43. public function export(Request $request)
  44. {
  45. $query = AgentPackage::select(AgentPackage::$selectFields);
  46. $query = $this->whens($query, $request);
  47. $query->orderBy('created_at', 'desc');
  48. $header = [
  49. '合伙人id' => 'agent_id',
  50. '套餐id' => 'package_id',
  51. '上架状态 0:下架 1:上架' => 'is_upload',
  52. '状态' => 'status',
  53. '创建时间' => 'created_at',
  54. '修改时间' => 'updated_at',
  55. '可见用户' => 'visible_to_users',
  56. '不可见用户' => 'invisible_to_users',
  57. '分成类型 1:比例 2:金额' => 'yj_type',
  58. '分成比例' => 'yj_p',
  59. '分销员id' => 'fxuser_id',
  60. '权重' => 'weight',
  61. '用户id' => 'user_id',
  62. ];
  63. $getEnValue = $this->getEnValue();
  64. $excel = new SpoutExport($header);
  65. $excel->setData($query->get());
  66. $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
  67. return $result ? success($result['url']) : error();
  68. }
  69. // 导入
  70. public function import(Request $request)
  71. {
  72. $header = [
  73. '合伙人id' => 'agent_id',
  74. '套餐id' => 'package_id',
  75. '上架状态 0:下架 1:上架' => 'is_upload',
  76. '状态' => 'status',
  77. '创建时间' => 'created_at',
  78. '修改时间' => 'updated_at',
  79. '可见用户' => 'visible_to_users',
  80. '不可见用户' => 'invisible_to_users',
  81. '分成类型 1:比例 2:金额' => 'yj_type',
  82. '分成比例' => 'yj_p',
  83. '分销员id' => 'fxuser_id',
  84. '权重' => 'weight',
  85. '用户id' => 'user_id',
  86. ];
  87. $getEnValue = $this->getEnValue();
  88. $SpoutImport = new SpoutImport($header);
  89. $dataList = $SpoutImport->setRequest($request)->getExcelData();
  90. return $dataList;
  91. }
  92. // 获取枚举值
  93. public function getEnValue()
  94. {
  95. $data = [
  96. 'operator_id' => SystemSetting::$operator,
  97. 'is_upload' => Packages::$isUpload,
  98. 'rebate_type' => Packages::$rebateType,
  99. 'is_live' => Packages::$isLive,
  100. 'select_status' => Packages::$selectStatus,
  101. ];
  102. return $data;
  103. }
  104. // 查询一条
  105. public function find(Request $request)
  106. {
  107. $request->validate([
  108. 'id' => 'required|integer',
  109. ]);
  110. $result = AgentPackage::where(['id' => $request->id])->select(AgentPackage::$selectFields)->first();
  111. return success($result);
  112. }
  113. // 添加
  114. public function insert(Request $request)
  115. {
  116. $request->validate([
  117. 'name' => 'required',
  118. ]);
  119. $result = AgentPackage::create($request->all());
  120. if ($result) {
  121. return success();
  122. } else {
  123. return error();
  124. }
  125. }
  126. // 修改
  127. public function update(Request $request)
  128. {
  129. $request->validate([
  130. 'id' => 'required|integer',
  131. ]);
  132. $result = AgentPackage::where(['id' => $request->id])->update($request->all());
  133. if ($result) {
  134. return success();
  135. } else {
  136. return error();
  137. }
  138. }
  139. // 删除
  140. public function delete(Request $request)
  141. {
  142. $request->validate([
  143. 'ids' => 'required',
  144. ]);
  145. $id_str = $request->ids;
  146. $arr = explode(",", $id_str);
  147. // 查询是否存在子数据
  148. // $count = Shop::whereIn('tm_id',$arr)->count();
  149. // if($count > 0){
  150. // return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
  151. // }
  152. $result = AgentPackage::whereIn('id', $arr)->delete();
  153. if ($result) {
  154. return success();
  155. } else {
  156. return error();
  157. }
  158. }
  159. /**
  160. * 产品中心
  161. *
  162. * @param Request $request
  163. * @param array $selectFields 展示的字段
  164. * @param array $hiddenFields 隐藏的字段
  165. */
  166. public function productCenter(Request $request, $selectFields = [], $hiddenFields = [])
  167. {
  168. // 获取用户id
  169. if ($request->filled('user_id')) {
  170. $user_id = Hashids::decode($request->user_id);
  171. if (empty($user_id)) {
  172. return error("无效信息");
  173. }
  174. $user_id = $user_id[0];
  175. } else {
  176. $user_id = auth()->id();
  177. }
  178. // 获取字段
  179. if(empty($selectFields)){
  180. $selectFields = Packages::$selectFields;
  181. }
  182. if (AdminUsers::isAdmin($user_id) && ($this->is_shop == 0)) {
  183. return (new PackagesKdHelper())->select($request, $selectFields);
  184. } else {
  185. $page = new Pages($request, Packages::query());
  186. // 字段添加前缀
  187. foreach ($selectFields as &$value) {
  188. $value = 'packages_kd.' . $value;
  189. }
  190. $page->before(function ($query) use ($request, $selectFields, $user_id) {
  191. // admin 上架的产品
  192. $query->select($selectFields)->where('packages_kd.is_upload', 1)
  193. // 关联查询上下架状态
  194. ->leftJoin('agent_package_kd', function ($join) use ($user_id) {
  195. $join->on('packages_kd.id', '=', 'agent_package_kd.package_id')
  196. ->where('agent_package_kd.user_id', '=', $user_id);
  197. })
  198. // 查询条件
  199. ->when($request->filled('id'), fn ($q) => $q->where('packages_kd.id', $request->id))
  200. ->when($request->filled('operator_id'), fn ($q) => $q->where('packages_kd.operator_id', $request->operator_id))
  201. ->when($request->filled('rebate_type'), fn ($q) => $q->where('packages_kd.rebate_type', $request->rebate_type))
  202. ->when($request->filled('is_upload') && $request->is_upload == 0, fn ($q) => $q->where('agent_package_kd.is_upload', 0))
  203. ->when($request->filled('is_upload') && $request->is_upload == 1, fn ($q) => $q->where(function ($query) {
  204. $query->where('agent_package_kd.is_upload', null)->orWhere('agent_package_kd.is_upload', 1);
  205. }))
  206. // 判断是否是下架产品,并动态设置 is_upload
  207. ->addSelect([
  208. DB::raw('CASE
  209. WHEN agent_package_kd.is_upload = 0 THEN 0
  210. ELSE packages_kd.is_upload
  211. END AS is_upload')
  212. ])
  213. ->orderByRaw("IFNULL(agent_package_kd.is_upload, 1) DESC")
  214. ->orderByRaw('CASE WHEN agent_package_kd.weight IS NULL OR agent_package_kd.weight = 0 THEN packages_kd.weight ELSE agent_package_kd.weight END DESC')
  215. ->orderBy(DB::raw('CAST(packages_kd.yj AS UNSIGNED)'), 'desc')
  216. ->orderBy('packages_kd.created_at', 'desc');;
  217. return $query;
  218. });
  219. if ($this->is_shop == 1) {
  220. // 小店
  221. $hiddenFields = ['yj','id'];
  222. $page->after(function ($data) use ($hiddenFields) {
  223. $data->each(function ($item) {
  224. $item->package_key = Hashids::encode($item->id);
  225. });
  226. // 隐藏字段
  227. $data->makeHidden($hiddenFields);
  228. });
  229. } elseif ($this->is_platform_api == 1) {
  230. // 平台api
  231. $page->after(function ($data) use ($user_id, $hiddenFields) {
  232. $data = $this->setYjShow($user_id, $data);
  233. // 隐藏字段
  234. $data->makeHidden($hiddenFields);
  235. // 替换字段名称
  236. $data->each(function ($item) {
  237. if (!empty($item->yj)) {
  238. $item->commission = $item->yj;
  239. unset($item->yj);
  240. }
  241. if (!empty($item->yjzc)) {
  242. $item->commission_rate = $item->yjzc;
  243. unset($item->yjzc);
  244. }
  245. });
  246. });
  247. } else {
  248. // 产品中心
  249. $page->after(function ($data) use ($user_id, $hiddenFields) {
  250. $data = $this->setYjShow($user_id, $data);
  251. // 隐藏字段
  252. $data->makeHidden($hiddenFields);
  253. });
  254. }
  255. $packageList = $page->paginate();
  256. return $packageList;
  257. }
  258. }
  259. // 产品中心导出
  260. public function productCenterExport(Request $request)
  261. {
  262. $request->merge(['page_not' => 1]);
  263. $selectFields = [
  264. 'id',
  265. 'name', // 名称
  266. 'mini_text', // 简介
  267. 'operator_id', // 运营商
  268. 'yj',
  269. 'yjzc', // 佣金政策
  270. 'weight', // 权重
  271. 'is_upload', // 是否上架
  272. 'created_at',
  273. 'out_package_id', // 外部产品编码
  274. 'belonging_place', // 归属地
  275. 'data_quota', // 流量额度
  276. 'call_duration', // 通话时长
  277. 'first_recharge_amount', // 首充金额
  278. 'attention', // 注意事项
  279. 'rebate_type', // 返佣类型 1:次月返 2:秒返
  280. 'select_status', // 是否选号
  281. 'is_live', // 是否允许直播 0:不允许 1:允许
  282. 'commission_terms', // 结佣条件
  283. ];
  284. $dataList = $this->productCenter($request, $selectFields);
  285. $header = [
  286. '名称' => 'name',
  287. '简介' => 'mini_text',
  288. '佣金' => 'yj',
  289. '运营商' => 'operator_id',
  290. '佣金政策' => 'yjzc',
  291. '是否上架' => 'is_upload',
  292. '外部产品编码' => 'out_package_id',
  293. '归属地' => 'belonging_place',
  294. '流量额度' => 'data_quota',
  295. '通话时长' => 'call_duration',
  296. '首充金额' => 'first_recharge_amount',
  297. '注意事项' => 'attention',
  298. '返佣类型' => 'rebate_type',
  299. '是否选号' => 'select_status',
  300. '是否允许直播' => 'is_live',
  301. '创建时间' => 'created_at',
  302. '结佣条件' => 'commission_terms',
  303. ];
  304. $getEnValue = $this->getEnValue();
  305. $dataList = json_decode($dataList->getContent(),true);
  306. $excel = new SpoutExport($header);
  307. $excel->setData($dataList['data']);
  308. $result = $excel->setEnum($getEnValue)->setProcessStyle(30)->spoutToExcel('产品中心导出数据');
  309. return $result;
  310. }
  311. // 获取产品详情
  312. public function productDetail(Request $request)
  313. {
  314. $request->validate([
  315. 'id' => 'required|integer',
  316. ]);
  317. $user_id = auth()->id();
  318. $package = Packages::select(Packages::$selectFields)->where('id', $request->id)->first();
  319. if (empty($package)) {
  320. return ['code' => 0, 'msg' => "产品不存在"];
  321. }
  322. if (AdminUsers::isAdmin($user_id)) {
  323. return ['code' => 1, 'msg' => "success", 'data' => $package];
  324. }
  325. $package = $this->setYjShow($user_id, $package, false);
  326. return ['code' => 1, 'msg' => "success", 'data' => $package];
  327. }
  328. // 产品上下架
  329. public function packageUpload(Request $request)
  330. {
  331. $request->validate([
  332. 'ids' => 'required|string',
  333. 'is_upload' => 'required|integer|in:0,1',
  334. ]);
  335. $ids = explode(',', $request->ids);
  336. $user_id = auth()->id();
  337. if (AdminUsers::isAdmin($user_id)) {
  338. Packages::whereIn('id', $ids)->update(['is_upload' => $request->is_upload]);
  339. } else {
  340. foreach ($ids as $id) {
  341. $agentPackage = AgentPackage::where('user_id', $user_id)->where('package_id', $id)->first();
  342. if ($agentPackage) {
  343. $agentPackage->update(['is_upload' => $request->is_upload]);
  344. } else {
  345. AgentPackage::create(['user_id' => $user_id, 'package_id' => $id, 'is_upload' => $request->is_upload]);
  346. }
  347. }
  348. }
  349. return success();
  350. }
  351. /**
  352. * 佣金展示计算
  353. *
  354. * @param $user_id 用户id
  355. * @param $packageList 产品列表
  356. * @param $is_list 是否是列表
  357. */
  358. public function setYjShow($user_id, $packageList, $is_list = true)
  359. {
  360. // 获取父用户的佣金信息
  361. $parentList = AdminUsers::getParents($user_id);
  362. $parentYjType = AdminUsers::with(['agent_package'])
  363. ->select(['id', 'yj_type', 'yj_a', 'yj_p'])
  364. ->whereIn('id', $parentList)
  365. ->orderBy('agent_level', 'ASC')
  366. ->get()
  367. ->keyBy('id'); // 重置索引为用户id
  368. if ($is_list) {
  369. // 遍历产品列表
  370. foreach ($packageList as &$package) {
  371. $package = $this->computation($parentYjType, $package);
  372. }
  373. return $packageList;
  374. } else {
  375. return $this->computation($parentYjType, $packageList);
  376. }
  377. }
  378. // 计算佣金
  379. private function computation($parentYjType, $package)
  380. {
  381. $yj = (string)$package->yj; // 原始佣金
  382. $package_id = $package->id;
  383. // 遍历所有上级用户
  384. foreach ($parentYjType as $user) {
  385. $yj_type = $user->yj_type; // 佣金类型
  386. $yj_p = (string)$user->yj_p; // 百分比
  387. $yj_a = (string)$user->yj_a; // 固定金额
  388. $agent_package = $user->agent_package->keyBy('package_id'); // 提前获取代理包裹数据并按package_id索引
  389. // 根据代理包裹设置佣金类型
  390. if (isset($agent_package[$package_id]) && $agent_package[$package_id]['yj_type'] != 0) {
  391. $package_info = $agent_package[$package_id];
  392. $yj_type = $package_info['yj_type']; // 佣金类型
  393. $yj_p = (string)$package_info['yj_p']; // 百分比
  394. $yj_a = (string)$package_info['yj_a']; // 固定金额
  395. }
  396. // 根据佣金类型进行计算
  397. if ($yj_type == 1) { // 百分比计算
  398. $yj_p = bcdiv($yj_p, 100, 2); // 百分比转化为小数
  399. $yj = bcsub($yj, bcmul($yj, $yj_p, 2), 2); // 计算佣金
  400. } elseif ($yj_type == 2) { // 固定金额计算
  401. $yj = bcsub($yj, $yj_a, 2); // 计算佣金
  402. }
  403. // 如果佣金小于0,则设置为0
  404. if (bccomp($yj, '0', 2) < 0) {
  405. $yj = '0'; // 设置为 0
  406. break;
  407. }
  408. }
  409. // 更新包裹佣金
  410. $package->yj = $yj;
  411. return $package;
  412. }
  413. // 获取用户小店套餐
  414. public function getShopPackage(Request $request)
  415. {
  416. $request->validate([
  417. 'user_key' => 'required', // 用户id加密
  418. ]);
  419. $user_id = $request->user_key;
  420. $request->merge([
  421. 'is_upload' => 1,
  422. 'user_id' => $user_id,
  423. ]);
  424. $this->is_shop = 1; // 小店不计算展示佣金
  425. return $this->productCenter($request,Packages::$selectFieldsByShop);
  426. }
  427. // 设置权重
  428. public function setWeight(Request $request)
  429. {
  430. $request->validate([
  431. 'package_id' => 'required|integer',
  432. 'weight' => 'required|integer',
  433. ]);
  434. $user_id = auth()->id();
  435. if (AdminUsers::isAdmin($user_id)) {
  436. $result = Packages::where('id', $request->package_id)->update(['weight' => $request->weight]);
  437. } else {
  438. $agent_package = AgentPackage::where('user_id', $user_id)->where('package_id', $request->package_id)->first();
  439. if ($agent_package) {
  440. $result = $agent_package->update(['weight' => $request->weight]);
  441. } else {
  442. $result = AgentPackage::create(['user_id' => $user_id, 'package_id' => $request->package_id, 'weight' => $request->weight, 'is_upload' => 1]);
  443. }
  444. }
  445. if ($result) {
  446. return success();
  447. } else {
  448. return error();
  449. }
  450. }
  451. // 获取套餐信息
  452. public function getPackageInfo(Request $request)
  453. {
  454. $request->validate([
  455. 'package_key' => 'required', // 套餐id加密
  456. 'user_key' => 'required', // 用户id加密
  457. ]);
  458. $package_id = Hashids::decode($request->package_key);
  459. if (empty($package_id)) {
  460. return error("无效操作");
  461. }
  462. $user_id = Hashids::decode($request->user_key);
  463. if (empty($user_id)) {
  464. return error("无效操作");
  465. }
  466. $package_id = $package_id[0];
  467. $user_id = $user_id[0];
  468. $package = Packages::select([
  469. 'id',
  470. 'name',
  471. 'mini_text',
  472. 'image',
  473. 'details',
  474. 'is_upload',
  475. ])
  476. ->where('id', $package_id)->first();
  477. if (!$package || $package->is_upload == 0) {
  478. return error("套餐已下架");
  479. }
  480. $agent_package = AgentPackage::select([
  481. 'id',
  482. 'is_upload',
  483. ])
  484. ->where('user_id', $user_id)->where('package_id', $package_id)->first();
  485. if ($agent_package && $agent_package->is_upload == 0) {
  486. return error("套餐已下架");
  487. }
  488. return ['code' => 1, 'msg' => "success", 'data' => $package];
  489. }
  490. // 批量设置单品抽成
  491. public function setUserProductYj(Request $request)
  492. {
  493. $request->validate([
  494. 'user_ids' => 'required|string', // 用户id
  495. 'package_id' => 'required|integer', // 套餐id
  496. 'yj_type' => 'required|integer|in:1,2', // 佣金类型
  497. 'yj_p' => 'integer', // 百分比
  498. 'yj_a' => 'numeric', // 金额
  499. ]);
  500. $package = Packages::where('id', $request->package_id)->exists();
  501. if (!$package) {
  502. return error("套餐不存在");
  503. }
  504. $user_ids = explode(',', $request->user_ids);
  505. foreach ($user_ids as $user_id) {
  506. $agent_package = AgentPackage::where('user_id', $user_id)->where('package_id', $request->package_id)->first();
  507. if ($agent_package) {
  508. $updateData = [
  509. 'yj_type' => $request->yj_type,
  510. 'yj_p' => $request->input('yj_p', $agent_package->yj_p),
  511. 'yj_a' => $request->input('yj_a', $agent_package->yj_a),
  512. ];
  513. $agent_package->update($updateData);
  514. } else {
  515. AgentPackage::create([
  516. 'user_id' => $user_id,
  517. 'package_id' => $request->package_id,
  518. 'yj_type' => $request->yj_type,
  519. 'yj_p' => $request->yj_p ?? 0,
  520. 'yj_a' => $request->yj_a ?? 0,
  521. 'is_upload' => 1
  522. ]);
  523. }
  524. }
  525. return success();
  526. }
  527. }