MiniprogramController.php 7.8 KB

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