User.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <?php
  2. namespace app\controller\v2;
  3. use app\extra\basic\Base;
  4. use app\extra\service\blue\UserLogService;
  5. use app\extra\tools\CodeExtend;
  6. use app\extra\weMini\Crypt;
  7. use app\extra\weMini\UserInfo;
  8. use app\middleware\WxMiddleware;
  9. use app\model\blue\BlueExpert;
  10. use app\model\blue\BlueExpertGroup;
  11. use app\model\blue\BlueExpertPlatform;
  12. use app\model\blue\BlueIncomeDay;
  13. use app\model\blue\BlueIncomeMon;
  14. use app\model\blue\BlueIncomeTotal;
  15. use app\model\blue\BlueTaskRevenue;
  16. use app\model\blue\BlueTaskUser;
  17. use app\model\blue\BlueUserOpen;
  18. use DI\Attribute\Inject;
  19. use LinFly\Annotation\Route\Controller;
  20. use LinFly\Annotation\Route\Middleware;
  21. use LinFly\Annotation\Route\Route;
  22. use Shopwwi\WebmanAuth\Facade\Auth as AuthMode;
  23. use support\Request;
  24. use support\Response;
  25. #[Controller(prefix: "/wx_v2/user"),Middleware(WxMiddleware::class)]
  26. class User extends Base
  27. {
  28. protected array $noNeedLogin = ["loginMobile","loginQuick"];
  29. #[Inject]
  30. protected BlueUserOpen $model;
  31. /**
  32. * wx.login快速验证是否注册
  33. * @param Request $request
  34. * @return Response
  35. */
  36. #[Route(path: "quick",methods: "post")]
  37. public function loginQuick(Request $request): Response
  38. {
  39. try {
  40. $param = $this->_valid([
  41. "code.require" => trans("empty.require"),
  42. "pid.default" => 0
  43. ],$request->method());
  44. if (!is_array($param)) return error($param);
  45. $userinfo = (new Crypt([
  46. "appid" => sConf("wechat.mini_appid"),
  47. "appsecret" => sConf("wechat.mini_secret")
  48. ]))->session($param['code']);
  49. if (!isset($userinfo['openid'])) return error("获取数据失败");
  50. $map = ['openid' => $userinfo['openid']];
  51. $userOpen = $this->model->where($map)->findOrEmpty();
  52. if ($userOpen->isEmpty()) return error("new");
  53. $userAuth = get_object_vars(AuthMode::guard("member")->login($userOpen->toArray()));
  54. return success("ok",['token' => $userAuth]);
  55. } catch (\Throwable $throwable) {
  56. return error($throwable->getMessage());
  57. }
  58. }
  59. /**
  60. * 新用户登录-自动完成注册
  61. * @param Request $request
  62. * @return Response
  63. */
  64. #[Route(path: "login",methods: "post")]
  65. public function loginMobile(Request $request): Response
  66. {
  67. try {
  68. $param = $this->_valid([
  69. "code.require" => trans("empty.require"),
  70. "login.require" => trans("empty.require"),
  71. "pid.default" => 0
  72. ],$request->method());
  73. if (!is_array($param)) return error($param);
  74. $userinfo = (new Crypt([
  75. "appid" => sConf("wechat.mini_appid"),
  76. "appsecret" => sConf("wechat.mini_secret")
  77. ]))->session($param['login']);
  78. if (!isset($userinfo['openid'])) return error("获取数据失败");
  79. $mobile = (new UserInfo([
  80. "appid" => sConf("wechat.mini_appid"),
  81. "appsecret" => sConf("wechat.mini_secret")
  82. ]))->getPhoneNumber($param['code']);
  83. if ($mobile['errcode'] <> 0) return error($mobile['errmsg']);
  84. $map = ['openid' => $userinfo['openid'],'mobile' => $mobile['phone_info']['purePhoneNumber']];
  85. $userOpen = $this->model->where($map)->findOrEmpty();
  86. if ($userOpen->isEmpty()) {
  87. $userOpen->insertGetId([
  88. 'openid' => $userinfo['openid'],
  89. 'parent' => $param['pid'],
  90. 'uuid' => CodeExtend::uniqidNumber(),
  91. 'mobile' => $mobile['phone_info']['purePhoneNumber'],
  92. "create_ip" => $request->getRealIp(),
  93. "nickname" => "微信用户",
  94. "headimg" => "https://blue-data.oss-cn-guangzhou.aliyuncs.com/logo.png"
  95. ]);
  96. $userOpen = $this->model->where($map)->findOrEmpty();
  97. }
  98. $userAuth = get_object_vars(AuthMode::guard("member")->login($userOpen->toArray()));
  99. return success("ok",['token' => $userAuth]);
  100. } catch (\Throwable $throwable) {
  101. return error($throwable->getMessage());
  102. }
  103. }
  104. /**
  105. * 个人中心数据
  106. * @param Request $request
  107. * @return Response
  108. */
  109. #[Route(path: "data",methods: "get")]
  110. public function getUserData(Request $request): Response
  111. {
  112. try {
  113. $data = $this->model->where("openid",$request->user['openid'])->field("uuid,nickname,headimg,openid")->with(['star' => function($query) {
  114. $query->field("openid,group_id,level_exp")->with(['level' => function($query) {
  115. $query->field("id,level,name,exp");
  116. }]);
  117. }])->append(['level','sign','group',"tags"])->withAttr([
  118. "tags" => function ($query,$resp) {
  119. $fans = (new BlueExpertPlatform)->where("openid",$resp['openid'])->sum("follower_count");
  120. $income = (new BlueTaskRevenue)->where("openid",$resp['openid'])->sum("indicator_agg_data_20022");
  121. return [
  122. [
  123. "name" => "完成任务",
  124. "value" => (new BlueTaskUser)->where("openid",$resp['openid'])->where("status",'in',[1,3])->count(),
  125. ],
  126. [
  127. "name" => "收益(元)",
  128. "value" => formatMoneyKw($income/1000)
  129. ],
  130. [
  131. "name" => "粉丝",
  132. "value" => formatMoneyKw($fans),
  133. ],
  134. [
  135. "name" => "总消耗",
  136. "value" => "0.00",
  137. ]
  138. ];
  139. },
  140. "sign" => function($query,$resp) {
  141. if ($resp['star']) return 1;
  142. return 0;
  143. },
  144. "group" => function($query,$resp) {
  145. $group = (new BlueExpertGroup)->where("openid",$resp['openid'])->findOrEmpty();
  146. if ($group->isEmpty()) return 0;
  147. if ($group['status'] == 1) return 1;
  148. return 0;
  149. },
  150. "level" => function($query,$resp) {
  151. if ($resp['star']) {
  152. return [
  153. "level_exp" => $resp['star']['level_exp'],
  154. "level_num" => $resp['star']['level']['level']??'0',
  155. "level_name" => $resp['star']['level']['name']??'0',
  156. "need_exp" => $resp['star']['level']['exp']??'0',
  157. ];
  158. } else {
  159. return [];
  160. }
  161. }
  162. ])->findOrEmpty();
  163. if ($data->isEmpty()) return errorTrans("error.data");
  164. $return = $data->toArray();
  165. unset($return['star'],$return['openid']);
  166. return success("ok",$return);
  167. } catch (\Throwable $throwable) {
  168. return error($throwable->getMessage());
  169. }
  170. }
  171. /**
  172. * 收益总览
  173. * @param Request $request
  174. * @return Response
  175. */
  176. #[Route(path: "income/total",methods: "get")]
  177. public function getIncomeData(Request $request): Response
  178. {
  179. try {
  180. $param = $this->_valid([
  181. "day.default" => 7
  182. ],$request->method());
  183. if (!is_array($param)) return error($param);
  184. // 累计已结算收益
  185. $total = (new BlueIncomeTotal)->where("openid",$request->user['openid'])->sum("money");
  186. // 今日收益
  187. $day = (new BlueIncomeDay)->where("openid",$request->user['openid'])->sum("money");
  188. // 本月收益
  189. $mon = (new BlueIncomeMon)->where("openid",$request->user['openid'])->sum("money");
  190. // 钱包余额
  191. $balance = (new BlueExpert)->where("openid",$request->user['openid'])->value("balance");
  192. if ($balance > 0) $balance = format_money($balance/100);
  193. // 待结算
  194. $echart = [];
  195. $fields = ['ROUND(sum(money)/100,2)' => 'total','substr(create_at,1,10)' => 'mday'];
  196. $orderNum = (new BlueIncomeDay)->field($fields)->where("openid",$request->user['openid'])->whereTime('create_at', '-'.$param['day'].' days')->group('mday')->select()->column(null, 'mday');
  197. for ($i = $param['day']; $i >= 0; $i--) {
  198. $date = date('Y-m-d', strtotime("-{$i}days"));
  199. $echart[] = [
  200. 'day' => date('m-d', strtotime("-{$i}days")),
  201. 'money' => ($orderNum[$date] ?? [])['total'] ?? 0,
  202. ];
  203. }
  204. return successTrans("success.data",compact("echart","total","balance","day","mon"));
  205. } catch (\Throwable $throwable) {
  206. return error($throwable->getMessage());
  207. }
  208. }
  209. /**
  210. * 收益记录
  211. * @param Request $request
  212. * @return Response
  213. */
  214. #[Route(path: "income/log",methods: "get")]
  215. public function getIncomeLogs(Request $request): Response
  216. {
  217. try {
  218. $param = $this->_valid([
  219. "page.default" => 1,
  220. "size.default" => 10,
  221. ],$request->method());
  222. if (!is_array($param)) return error($param);
  223. $param['pageSize'] = $param['size'];
  224. $param['openid'] = $request->user['openid'];
  225. $list = (new UserLogService)->getList($param,"type,money,remark,icon,create_at");
  226. return successTrans("success.data",pageFormat($list));
  227. } catch (\Throwable $throwable) {
  228. return error($throwable->getMessage());
  229. }
  230. }
  231. }