AdvertiserController.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <?php
  2. namespace Modules\Channel\Http\Controllers;
  3. use Catch\Base\CatchController;
  4. use Illuminate\Foundation\Validation\ValidatesRequests;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\DB;
  7. use Modules\Channel\Exceptions\ChannelBusinessException;
  8. use Modules\Common\Errors\Errors;
  9. use Modules\User\Models\User;
  10. class AdvertiserController extends CatchController
  11. {
  12. use ValidatesRequests;
  13. public function __construct(
  14. protected readonly User $user
  15. ) {
  16. }
  17. /**
  18. * 添加投手
  19. * @param Request $request
  20. * @return int
  21. * @throws \Illuminate\Validation\ValidationException
  22. */
  23. public function addAdvertiser(Request $request) {
  24. $this->validate($request, [
  25. 'email' => 'required|email',
  26. 'username' => 'required',
  27. 'password' => 'required',
  28. 'repassword' => 'required|same:password',
  29. 'status' => 'required|in:1,2',
  30. 'remark' => 'string|max:140',
  31. 'miniProgramIds' => 'required|array|min:1',
  32. 'miniProgramIds.*' => 'required|integer'
  33. ]);
  34. $this->user->emailUnique($request->input('email'));
  35. $request['roles'] = [(DB::table('roles')->where('identify', 'optimizer')->value('id') ?? 0)];
  36. $this->user->storeBy($request->all());
  37. $this->user->pid = $this->getLoginUserId();
  38. $this->user->save();
  39. $insertData = [];
  40. $now = date('Y-m-d H:i:s');
  41. foreach ($request->input('miniProgramIds') as $miniProgramId) {
  42. $insertData[] = [
  43. 'uid' => $this->user->id,
  44. 'miniprogram_id' => $miniProgramId,
  45. 'created_at' => $now,
  46. 'updated_at' => $now,
  47. ];
  48. }
  49. DB::table('user_has_miniprograms')
  50. ->insert($insertData);
  51. return 1;
  52. }
  53. /**
  54. * 投手账号列表
  55. * @param Request $request
  56. * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
  57. * @throws \Illuminate\Validation\ValidationException
  58. */
  59. public function listAdvertiser(Request $request) {
  60. $this->validate($request, [
  61. 'email' => 'string|email',
  62. 'username' => 'string',
  63. 'miniProgramId' => 'integer',
  64. ]);
  65. $miniProgramId = $request->input('miniProgramId');
  66. $email = $request->input('email');
  67. $username = $request->input('username');
  68. $res = DB::table('users')
  69. ->join('user_has_miniprograms', 'users.id', 'user_has_miniprograms.uid')
  70. ->where([
  71. 'user_has_miniprograms.is_enabled' => 1,
  72. 'users.deleted_at' => 0,
  73. 'users.pid' => $this->getLoginUserId()
  74. ])->when($email, function ($query, $email) {
  75. return $query->where('users.email', $email);
  76. })->when($miniProgramId, function ($query, $miniProgramId){
  77. return $query->where('user_has_miniprograms.miniprogram_id', $miniProgramId);
  78. })->when($username, function ($query, $username){
  79. return $query->where('users.username', 'like', '%'.$username.'%');
  80. })
  81. ->select(
  82. 'users.id', 'users.username', 'users.email', 'users.status', 'users.remark',
  83. DB::raw("from_unixtime(users.created_at) as created_at"),
  84. DB::raw("group_concat(distinct user_has_miniprograms.miniprogram_id separator ',') as miniProgramIds"),
  85. DB::raw("NULL as miniPrograms")
  86. )->groupBy('users.id')
  87. ->orderBy('users.id','desc')
  88. ->paginate($request->input('per_page', 15));
  89. $miniProgramIds = collect();
  90. collect($res->items())->pluck('miniProgramIds')->each(function ($item) use (&$miniProgramIds) {
  91. $miniProgramIds = $miniProgramIds->merge(explode(',', $item));
  92. });
  93. $logos = config('common.common.logos');
  94. if($miniProgramIds->count()) {
  95. $miniPrograms = DB::table('miniprogram')->whereIn('id', $miniProgramIds->unique())
  96. ->select('id', 'name', 'type')
  97. ->get()->keyBy('id');
  98. foreach ($res as $item) {
  99. $item->miniPrograms = [];
  100. foreach (explode(',', $item->miniProgramIds) as $miniProgramId) {
  101. $miniProgram = $miniPrograms->get($miniProgramId);
  102. $miniProgram->type_logo = $logos[$miniProgram->type] ?? '';
  103. $item->miniPrograms[] = $miniProgram;
  104. }
  105. }
  106. }
  107. return $res;
  108. }
  109. /**
  110. * 更新账号
  111. * @param Request $request
  112. * @return int
  113. * @throws \Illuminate\Validation\ValidationException
  114. */
  115. public function updateAdvertiser(Request $request) {
  116. $this->validate($request, [
  117. 'id' => 'required',
  118. 'username' => 'required',
  119. 'miniProgramIds' => 'required|array|min:1',
  120. 'miniProgramIds.*' => 'required|integer',
  121. 'status' => 'required|in:1,2',
  122. 'remark' => 'string|max:140',
  123. ]);
  124. $uid = $request->input('id');
  125. $user = DB::table('users')
  126. ->where([
  127. 'deleted_at' => 0,
  128. 'id' => $uid
  129. ])->select('id','email', 'username', 'status', 'remark')
  130. ->first();
  131. if(!$user) {
  132. ChannelBusinessException::throwError(Errors::USER_NOT_FOUND);
  133. }
  134. $this->user->updateBy($uid, $request->only(['remark', 'status', 'username']));
  135. $now = date('Y-m-d H:i:s');
  136. DB::table('user_has_miniprograms')
  137. ->where([
  138. 'uid' => $uid,
  139. 'is_enabled' => 1
  140. ])->update([
  141. 'is_enabled' => 0,
  142. 'updated_at' => $now,
  143. ]);
  144. $insertData = [];
  145. foreach ($request->input('miniProgramIds') as $miniProgramId) {
  146. $insertData[] = [
  147. 'uid' => $uid,
  148. 'miniprogram_id' => $miniProgramId,
  149. 'created_at' => $now,
  150. 'updated_at' => $now,
  151. ];
  152. }
  153. DB::table('user_has_miniprograms')
  154. ->insert($insertData);
  155. return 1;
  156. }
  157. /**
  158. * 获取投手信息
  159. * @param Request $request
  160. * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Query\Builder|object|null
  161. * @throws \Illuminate\Validation\ValidationException
  162. */
  163. public function getAdvertiser(Request $request) {
  164. $this->validate($request, [
  165. 'id' => 'required'
  166. ]);
  167. $user = DB::table('users')
  168. ->where([
  169. 'deleted_at' => 0,
  170. 'id' => $request->input('id')
  171. ])->select('id','email', 'username', 'status', 'remark')
  172. ->first();
  173. if(!$user) {
  174. ChannelBusinessException::throwError(Errors::USER_NOT_FOUND);
  175. }
  176. $miniProgramIds = DB::table('user_has_miniprograms')
  177. ->where([
  178. 'is_enabled' => 1,
  179. 'uid' => $user->id,
  180. ])->select('miniprogram_id')
  181. ->get()->pluck('miniprogram_id')->toArray();
  182. $user->miniProgramIds = $miniProgramIds;
  183. $logos = config('common.common.logos');
  184. $user->miniPrograms = DB::table('miniprogram')->whereIn('id', array_unique($miniProgramIds))
  185. ->select('id', 'name', 'type')->get()->map(function ($item) use ($logos){
  186. return [
  187. 'id' => $item->id,
  188. 'name' => $item->name,
  189. 'type' => $item->type,
  190. 'type_logo' => $logos[$item->type] ?? ''
  191. ];
  192. });
  193. return $user;
  194. }
  195. }