CommonController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\Api\v1;
  4. use App\Controller\AbstractController;
  5. use App\Master\Enum\RedisKeyEnum;
  6. use App\Master\Framework\Library\Google\Maps;
  7. use App\Master\Framework\Library\Tencent\TencentIm;
  8. use App\Model\Arts\AgreementModel;
  9. use App\Model\Arts\CarSeatModel;
  10. use App\Model\Arts\MessageModel;
  11. use App\Model\Arts\MobileAreaCodeModel;
  12. use App\Model\Arts\QuestionAnswerModel;
  13. use App\Model\Arts\QuestionReasonModel;
  14. use App\Model\Arts\RaiseAmountModel;
  15. use App\Model\Arts\UserMoneyLogModel;
  16. use App\Model\Arts\VersionAppModel;
  17. use App\Request\Api\v1\Common\AgreementRequest;
  18. use App\Request\Api\v1\Common\DirectionsRequest;
  19. use App\Request\Api\v1\Common\GeocodeRequest;
  20. use App\Request\Api\v1\Common\MessageRequest;
  21. use App\Request\Api\v1\Common\PlaceAutoSearchRequest;
  22. use App\Request\Api\v1\Common\PlaceDetailsRequest;
  23. use App\Request\Api\v1\Common\PlaceSearchRequest;
  24. use App\Request\Api\v1\Common\VersionRequest;
  25. use App\Request\Api\v1\User\MoneyLogRequest;
  26. use App\Utils\AppResult;
  27. use App\Utils\Control\AuthUser;
  28. use App\Utils\LogUtil;
  29. use App\Utils\RedisUtil;
  30. use Hyperf\DbConnection\Db;
  31. /**
  32. * 公共管理
  33. * CommonController
  34. */
  35. class CommonController extends AbstractController
  36. {
  37. // 日志模块名称
  38. const LOG_MODULE = 'v1/CommonController';
  39. public function config()
  40. {
  41. return AppResult::success('success', [
  42. 'is_open_tailwind' => (int)site('is_open_tailwind'),
  43. 'is_open_userapp' => (int)site('is_open_userapp'),
  44. ]);
  45. }
  46. /**
  47. * 手机号国际区号
  48. * @return string
  49. */
  50. public function mobile_area_code()
  51. {
  52. $model = new MobileAreaCodeModel();
  53. $model->select = ['id', 'area_code', 'area'];
  54. $list = $model->getList(
  55. orderBy: ['weigh' => 'desc', 'id' => 'desc']
  56. );
  57. return AppResult::success('success', $list);
  58. }
  59. /**
  60. * 客服中心
  61. * @return string
  62. */
  63. public function customer_service()
  64. {
  65. // 问答
  66. $model = new QuestionAnswerModel();
  67. $model->select = ['id', 'question', 'answer'];
  68. $list = $model->getList(
  69. params : ['type' => 1],
  70. orderBy: ['weigh' => 'desc', 'id' => 'desc']
  71. );
  72. // 客服二维码
  73. return AppResult::success('success', [
  74. 'service_qr_code' => cdn_url(site('service_qr_code')),
  75. 'service_telephone' => site('service_telephone'),
  76. 'question_answer' => $list,
  77. ]);
  78. }
  79. // 生活服务页面
  80. public function life_service()
  81. {
  82. $life_banner = site('life_banner');
  83. foreach ($life_banner as &$item){
  84. $item = cdn_url($item);
  85. }
  86. // 客服二维码
  87. return AppResult::success('success', [
  88. 'life_banner' => $life_banner,
  89. 'life_wechat' => cdn_url(site('life_wechat')),
  90. 'service_qr_code' => cdn_url(site('service_qr_code'))
  91. ]);
  92. }
  93. // 下载页面二维码
  94. public function down_qr_code()
  95. {
  96. // 客服二维码
  97. return AppResult::success('success', [
  98. 'down_user_app' => cdn_url(site('down_user_app')),
  99. 'down_driver_app' => cdn_url(site('down_driver_app')),
  100. 'down_bg_img' => cdn_url(site('down_bg_img'))
  101. ]);
  102. }
  103. /**
  104. * 人数和行行李数
  105. * @return string
  106. */
  107. public function people_luggage()
  108. {
  109. // 最大人数和最大行李数
  110. $model = new CarSeatModel();
  111. $info = $model->query()->select([
  112. Db::raw('max(people_num) as people_num'),
  113. Db::raw('max(luggage_num) as luggage_num'),
  114. ])->first();
  115. $people_num = $info['people_num'] ?? 1;// 最大人数
  116. $luggage_num = $info['luggage_num'] ?? 0;// 最大行李数
  117. $list['people'] = [];
  118. for ($i = 1; $i <= $people_num; $i++) {
  119. $list['people'][] = [
  120. 'label' => "{$i}人",
  121. 'value' => $i
  122. ];
  123. }
  124. $list['luggage'] = [];
  125. for ($i = 0; $i <= $luggage_num; $i++) {
  126. $list['luggage'][] = [
  127. 'label' => "{$i}托运行李",
  128. 'value' => $i
  129. ];
  130. }
  131. return AppResult::success('success', $list);
  132. }
  133. /**
  134. * 加价金额
  135. * @return string
  136. */
  137. public function raise_amount()
  138. {
  139. // 最大人数和最大行李数
  140. $model = new RaiseAmountModel();
  141. $model->setSelect(['id', 'price']);
  142. $list = $model->getList(orderBy: ['weight' => 'desc', 'id' => 'desc']);
  143. return AppResult::success('success', $list);
  144. }
  145. /**
  146. * 谷歌地址搜索
  147. * @param PlaceSearchRequest $request
  148. * @return string
  149. */
  150. public function place_search(PlaceSearchRequest $request)
  151. {
  152. $params = $request->validated();
  153. $googleMap = new Maps();
  154. if (!$googleMap->place_search($params['input'])) {
  155. return AppResult::error($googleMap->getMessage());
  156. }
  157. return AppResult::success('获取成功', $googleMap->getData());
  158. }
  159. /**
  160. * 谷歌地址搜索(自动补全)
  161. * @param PlaceAutoSearchRequest $request
  162. * @return string
  163. */
  164. public function place_auto_search(PlaceAutoSearchRequest $request)
  165. {
  166. $params = $request->validated();
  167. $googleMap = new Maps();
  168. if (!$googleMap->place_auto_search($params['input'],$params['latitude'] ?? '',$params['longitude'] ?? '',$params['sessionToken'] ?? '')) {
  169. return AppResult::error($googleMap->getMessage());
  170. }
  171. return AppResult::success('获取成功', $googleMap->getData());
  172. }
  173. /**
  174. * 谷歌地址详情
  175. * @param PlaceDetailsRequest $request
  176. * @return string
  177. */
  178. public function place_details(PlaceDetailsRequest $request)
  179. {
  180. $params = $request->validated();
  181. $googleMap = new Maps();
  182. if (!$googleMap->place_details($params['place_id'])) {
  183. return AppResult::error($googleMap->getMessage());
  184. }
  185. return AppResult::success('获取成功', $googleMap->getData());
  186. }
  187. /**
  188. * 谷歌逆地理编码
  189. * @param GeocodeRequest $request
  190. * @return string
  191. */
  192. public function geocode(GeocodeRequest $request)
  193. {
  194. $params = $request->validated();
  195. $googleMap = new Maps();
  196. if (!$googleMap->geocode($params['latlng'])) {
  197. return AppResult::error($googleMap->getMessage());
  198. }
  199. return AppResult::success('获取成功', $googleMap->getData());
  200. }
  201. /**
  202. * 谷歌路线规划
  203. * @param DirectionsRequest $request
  204. * @return string
  205. */
  206. public function directions(DirectionsRequest $request)
  207. {
  208. $params = $request->validated();
  209. $googleMap = new Maps();
  210. if (!$googleMap->directions($params['destination'], $params['origin'], $params['waypoints'] ?? '')) {
  211. return AppResult::error($googleMap->getMessage());
  212. }
  213. return AppResult::success('获取成功', $googleMap->getData());
  214. }
  215. // 系统消息数量
  216. public function message_num()
  217. {
  218. $user = AuthUser::getInstance()->get();
  219. $model = new MessageModel();
  220. $message = $model->getDetail(
  221. params : ['user_id' => $user['id']],
  222. orderBy: ['create_time' => 'desc']
  223. );
  224. if ($driver_chat_id = RedisUtil::getInstance(RedisKeyEnum::USER_DRIVER_CHAT_DEL,"user_{$user['id']}")->get()){
  225. RedisUtil::getInstance(RedisKeyEnum::USER_DRIVER_CHAT_DEL,"user_{$user['id']}")->del();
  226. $tencent = new TencentIm();
  227. $tencent->delete_chat("user_{$user['id']}",$driver_chat_id);
  228. }
  229. LogUtil::warning('系统错误', self::LOG_MODULE, __FUNCTION__, [
  230. 'message_num' => MessageModel::getNumByUserId($user['id']),
  231. 'name' => $message['name'] ?? '暂无新的消息',
  232. 'create_time' => !empty($message['create_time']) ? unix_time(strtotime($message['create_time'])) : '',
  233. 'driver_chat_id' => $driver_chat_id ?: '',
  234. ]);
  235. return AppResult::success(result: [
  236. 'message_num' => MessageModel::getNumByUserId($user['id']),
  237. 'name' => $message['name'] ?? '暂无新的消息',
  238. 'create_time' => !empty($message['create_time']) ? unix_time(strtotime($message['create_time'])) : '',
  239. 'driver_chat_id' => $driver_chat_id ?: '',
  240. ]);
  241. }
  242. /**
  243. * 系统消息列表
  244. * @param MessageRequest $request
  245. * @return \Psr\Http\Message\MessageInterface|\Psr\Http\Message\ResponseInterface
  246. * @throws \Psr\Container\ContainerExceptionInterface
  247. * @throws \Psr\Container\NotFoundExceptionInterface
  248. */
  249. public function message(MessageRequest $request)
  250. {
  251. $params = $request->validated();
  252. $user = AuthUser::getInstance()->get();
  253. $model = new MessageModel();
  254. $list = $model->setSelect(['id', 'user_id', 'name', 'type', 'content', 'create_time'])->getList(
  255. params : array_merge($params, ['user_id' => $user['id']]),
  256. orderBy: ['create_time' => 'desc'],
  257. with : ['reads'],
  258. );
  259. foreach ($list as $key => $val) {
  260. $list[$key]['is_read'] = 0;
  261. if (!empty($val['reads'])) {
  262. $list[$key]['is_read'] = 1;
  263. }
  264. unset($list[$key]['reads']);
  265. }
  266. MessageModel::read($user['id']);
  267. return AppResult::success(result: $list);
  268. }
  269. // 获取腾讯 userSig
  270. public function get_user_sig()
  271. {
  272. $user = AuthUser::getInstance()->get();
  273. return AppResult::success(result: [
  274. 'userSig' => (new TencentIm())->userSig("user_{$user['id']}")
  275. ]);
  276. }
  277. /**
  278. * 协议信息
  279. * @param AgreementRequest $request
  280. * @return \Psr\Http\Message\MessageInterface|\Psr\Http\Message\ResponseInterface
  281. * @throws \Psr\Container\ContainerExceptionInterface
  282. * @throws \Psr\Container\NotFoundExceptionInterface
  283. */
  284. public function agreement(AgreementRequest $request)
  285. {
  286. $params = $request->validated();
  287. $agreement = (new AgreementModel())->getDetail($params);
  288. return AppResult::success(result: [
  289. 'name' => $agreement['name'] ?? '',
  290. 'content' => $agreement['content'] ?? '',
  291. ]);
  292. }
  293. public function reason()
  294. {
  295. // 问答
  296. $model = new QuestionReasonModel();
  297. $model->select = ['reason'];
  298. $list = $model->getList(
  299. orderBy: ['weigh' => 'desc', 'id' => 'desc']
  300. );
  301. // 客服二维码
  302. return AppResult::success('success', $list);
  303. }
  304. // 升级app
  305. public function version(VersionRequest $request)
  306. {
  307. $params = $request->validated();
  308. $version = (new VersionAppModel())->getDetail(array_merge(['platform' => 1],$params));
  309. $version['is_force'] = (bool)$version['is_force'];
  310. return AppResult::success(result: $version);
  311. }
  312. }