MiniprogramController.php 9.9 KB

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