AdvertiserController.php 8.6 KB

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