MiniprogramController.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <?php
  2. namespace Modules\Manage\Http\Controllers;
  3. use Illuminate\Routing\Controller;
  4. use Catch\Base\CatchController;
  5. use Illuminate\Http\Request;
  6. use Modules\Manage\Enmus\MiniprogramType;
  7. use Modules\Manage\Http\Requests\MiniprogramRequest;
  8. use Modules\Manage\Http\Requests\MiniprogramUpdateRequest;
  9. use Modules\Manage\Models\Miniprogram;
  10. use Modules\Channel\Models\UserHasMiniprograms;
  11. use Illuminate\Support\Facades\DB;
  12. use Modules\User\Http\Controllers\UserTrait;
  13. use Modules\Common\Errors\Errors;
  14. use Modules\Channel\Exceptions\ChannelBusinessException;
  15. use Modules\Channel\Services\User\UserService;
  16. class MiniprogramController extends CatchController
  17. {
  18. use UserTrait;
  19. public function __construct(protected readonly Miniprogram $miniprogram,protected readonly UserHasMiniprograms $userHasMiniprograms)
  20. {
  21. }
  22. const COMPANY_ROLE = 'company';
  23. const ADMINISTRATOR_ROLE = 'administrator';
  24. const OPTIMIZER_ROLE = 'optimizer';
  25. /**
  26. * 小程序列表
  27. * @param Request $request
  28. * @return void
  29. */
  30. public function index(Request $request)
  31. {
  32. $uid = $this->getLoginUser()->id;
  33. $name = $request->get('name');
  34. $play_name = $request->get('play_name');
  35. $company = $request->get('company');
  36. $type = $request->get('type');
  37. $page_size = $request->input('limit', 15);
  38. $where = [];
  39. if($name){
  40. $where[] = ['name','like','%'.$name.'%'];
  41. }
  42. if($play_name){
  43. $where[] = ['play_name','like','%'.$play_name.'%'];
  44. }
  45. if($company){
  46. $where[] = ['company','like','%'.$company.'%'];
  47. }
  48. if($type){
  49. $where[] = ['type','=',$type];
  50. }
  51. if(UserService::userHasRole($uid,'administrator')){
  52. $result = $this->miniprogram->where($where)->orderBy('id','desc')->paginate($page_size);
  53. }else{
  54. $result = $this->userHasMiniprograms->join('miniprogram','miniprogram.id','=','user_has_miniprograms.miniprogram_id')
  55. ->where('user_has_miniprograms.is_enabled',1)
  56. ->where('uid',$uid)
  57. ->where($where)
  58. ->select('miniprogram.*')
  59. ->paginate($page_size);
  60. }
  61. foreach($result as $item){
  62. $item->type_name = MiniprogramType::from($item->type)->name();
  63. $item->status_name = $item->status == 1 ?'启用':'禁用';
  64. }
  65. return $result;
  66. }
  67. /**
  68. * 添加小程序
  69. *
  70. * @param MiniprogramRequest $request
  71. * @return void
  72. */
  73. public function store(MiniprogramRequest $request)
  74. {
  75. $validate_result = $request->validated();
  76. $validate_result['remark'] = $request->post('remark','') ?? '';
  77. return $this->miniprogram->create($validate_result)->toArray();
  78. }
  79. /**
  80. * 小程序详情
  81. *
  82. * @param [type] $id
  83. * @return void
  84. */
  85. public function show($id)
  86. {
  87. return $this->miniprogram->find($id)->toArray();
  88. }
  89. /**
  90. * 更新小程序
  91. *
  92. * @param [type] $id
  93. * @param MiniprogramUpdateRequest $request
  94. * @return void
  95. */
  96. public function update($id, MiniprogramUpdateRequest $request)
  97. {
  98. $validate_result = $request->validated();
  99. if($request->post('remark','')){
  100. $validate_result['remark'] = $request->post('remark','');
  101. }
  102. $this->miniprogram->where('id',$id)->update($validate_result);
  103. return [];
  104. }
  105. /**
  106. * 小程序类型列表
  107. *
  108. * @return array [ ['name'=>'微信小程序','id'=>1],[],[] ]
  109. */
  110. public function typeList(){
  111. $type_list = MiniprogramType::cases();
  112. $data = array_map( fn($item)=>['name'=>$item->name(),'value'=>$item->value()],$type_list );
  113. return $data;
  114. }
  115. /**
  116. * 获取所有公司
  117. *
  118. * @return void
  119. */
  120. public function companyList(){
  121. return $this->miniprogram->select(DB::raw('distinct company'))->get()->pluck('company');
  122. }
  123. /**
  124. * 绑定小程序和投放公司的关系 或者投放公司把小程序分配给优化师
  125. * @param [type] $miniprogram_id
  126. * @param Request $request uid=2,3,4,5 actison=on|off on:分配,off取消分配
  127. * @return array
  128. *
  129. */
  130. public function allocationStore($miniprogram_id,Request $request)
  131. {
  132. $uid = $this->getLoginUser()->id;
  133. if(!UserService::userHasRoles($uid,[self::COMPANY_ROLE,self::ADMINISTRATOR_ROLE])){
  134. ChannelBusinessException::throwError(Errors::PARAM_EMPTY);
  135. }
  136. $uids = $request->post('uids');
  137. $action = $request->post('action');
  138. if(empty($miniprogram_id) || empty($uids) || empty($action) || !in_array($action,['on','off'])){
  139. ChannelBusinessException::throwError(Errors::PARAM_EMPTY);
  140. }
  141. $miniprogram_info = $this->miniprogram->find($miniprogram_id);
  142. if(!$miniprogram_info || $miniprogram_info->status == 0){
  143. ChannelBusinessException::throwError(Errors::MINIPROGRAM_STATUS_ERROR);
  144. }
  145. return collect(explode(',',$uids))->filter(function (int $value, int $key) use($miniprogram_id,$action){
  146. $user_access = UserService::userHasRoles($value,[self::COMPANY_ROLE,self::OPTIMIZER_ROLE]);
  147. //只能分配给投手公司或者优化师
  148. if($user_access){
  149. $result = $this->userHasMiniprograms->where('uid',$value)->where('miniprogram_id',$miniprogram_id)->first();
  150. if($action == 'off'){
  151. if($result){
  152. $result->is_enabled = 0;
  153. $result->save();
  154. }
  155. return true;
  156. }
  157. if($result){
  158. if($result->is_enabled == 0){
  159. $result->is_enabled = 1;
  160. $result->save();
  161. }
  162. return true;
  163. }
  164. $this->userHasMiniprograms->create([
  165. 'uid'=>$value,'miniprogram_id'=>$miniprogram_id,'is_enabled'=>1
  166. ]);
  167. return true;
  168. }
  169. return false;
  170. });
  171. }
  172. /**
  173. * 获取投手公司和小程序的绑定关系,用于前端数据回显
  174. * @param [type] $miniprogram_id
  175. * @return []
  176. * response = [
  177. * 'on'=>[ ['id'=>1,'username'=>'公司1','user_has_miniprogram'=>1],[] ],
  178. * 'off'=>[['id'=>1,'username'=>'公司1','user_has_miniprogram'=>0],[]],
  179. * 'all'=>[
  180. * ['id'=>1,'username'=>'公司1','user_has_miniprogram'=>1],
  181. * ['id'=>2,'username'=>'公司1','user_has_miniprogram'=>0]
  182. * ]
  183. * ]
  184. *
  185. */
  186. public function getAllocationInfo($miniprogram_id){
  187. $uid = $this->getLoginUser()->id;
  188. if(UserService::userHasRole($uid,self::ADMINISTRATOR_ROLE)){
  189. $all_company_account = UserService::listByRole(self::COMPANY_ROLE,['users.username','users.id']);
  190. }else{
  191. $all_company_account = UserService::getOptimizers($uid,['users.username','users.id']);
  192. }
  193. $result = $all_company_account->map(function ($item,$key) use($miniprogram_id) {
  194. $info = $this->userHasMiniprograms->where('uid',$item->id)->where('miniprogram_id',$miniprogram_id)->where('is_enabled',1)->count();
  195. if($info){
  196. $item->user_has_miniprogram = 1;
  197. $item->user_has_miniprogram_flag = 'on';
  198. }else{
  199. $item->user_has_miniprogram = 0;
  200. $item->user_has_miniprogram_flag = 'off';
  201. }
  202. return $item;
  203. });
  204. $group = $result->groupBy('user_has_miniprogram_flag')->toArray();
  205. if(!isset($group['on'])){
  206. $group['on'] = [];
  207. }
  208. if(!isset($group['off'])){
  209. $group['off'] = [];
  210. }
  211. $group['all'] = $result->toArray();
  212. return $group;
  213. }
  214. }