Taxi.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. <?php
  2. namespace app\api\controller\v1;
  3. use app\api\controller\ApiController;
  4. use app\api\service\SmsCode;
  5. use app\common\validate\IDMustBePositiveInt;
  6. use EasyWeChat\Factory;
  7. use think\facade\Cache;
  8. class Taxi extends ApiController
  9. {
  10. /**
  11. * 获取车辆
  12. *
  13. * @url GET /taxi/nearby?page=1
  14. * @author 许祖兴 < zuxing.xu@lettered.cn>
  15. * @date 2020/7/3 16:29
  16. *
  17. * @return \think\response\Json
  18. * @throws \think\db\exception\DataNotFoundException
  19. * @throws \think\db\exception\ModelNotFoundException
  20. * @throws \think\exception\DbException
  21. */
  22. public function getNearby()
  23. {
  24. $param = $this->request->param();
  25. $param['category_id'] = $this->request->param('category_id', 0);
  26. $limit = 10;
  27. $map['status'] = 1;
  28. if ($param['category_id']) {
  29. $map['category_id'] = $param['category_id'];
  30. }
  31. //
  32. $taxi = model('common/Taxi')->with(['user'])
  33. ->where($map)
  34. ->select();
  35. return $this->ApiJson(0,'获取成功', $taxi);
  36. }
  37. /**
  38. * 用车信息
  39. *
  40. * @url GET /taxi/:id
  41. * @author 许祖兴 < zuxing.xu@lettered.cn>
  42. * @date 2020/7/1 10:37
  43. *
  44. * @param int $id 用车ID
  45. * @return \think\response\Json
  46. * @throws \Lettered\Support\Exceptions\EvidentException
  47. * @throws \think\db\exception\DataNotFoundException
  48. * @throws \think\db\exception\ModelNotFoundException
  49. * @throws \think\exception\DbException
  50. */
  51. public function getTaxiByID($id)
  52. {
  53. (new IDMustBePositiveInt())->valid();
  54. $taxi = model('common/Taxi')->with(['user'])->hidden(['user.id_card'])
  55. ->find($id);
  56. if (!$taxi){
  57. return $this->ApiJson(-1, '不存在用车编号');
  58. }
  59. return $this->ApiJson(0, '获取用车信息成功', $taxi);
  60. }
  61. /**
  62. * 用车
  63. */
  64. public function callTaxi()
  65. {
  66. $params = $this->request->param();
  67. // 参数校验
  68. $valid = $this->validate($params, [
  69. 'taxi_id|关联车辆' => 'require',
  70. 'mobile|联系方式' => 'require',
  71. 'count|乘车人数' => 'require',
  72. 'depart|起始位置' => 'require',
  73. 'arrive|送达位置' => 'require',
  74. 'km|公里数' => 'require',
  75. 'price|价格' => 'require',
  76. ]);
  77. // 错误返回
  78. if(true !== $valid){
  79. return $this->ApiJson(-1, $valid);
  80. };
  81. $user = $this->auth->user();
  82. // 统计订单
  83. $count = model('common/TaxiOrder')->where('status','>=','2')->where(['is_free' => '1','user_id' => $user['id']])->count('id');
  84. // 创建订单
  85. $params['order_no'] = get_order_no();
  86. $params['user_id'] = $user['id'];
  87. $order = model('common/TaxiOrder')::create($params,true);
  88. //
  89. if ($order){
  90. // 创建对应支付记录
  91. $trade_no = get_order_no();
  92. $logID = model('common/OrderPaylog')->storeBy([
  93. 'out_trade_no' => $trade_no,
  94. 'total_price' => $params['price'],
  95. 'order_idx' => $order['id'],
  96. 'ascription' => 'motor' // 归属订单
  97. ]);
  98. // 免单优惠 20201201 添加条件 仅限xx 公里以下 不包含 xx 公里
  99. if ($count < sys_config('taxi_order_free_num','store') && $params['km'] < sys_config('taxi_order_free_km','store')){
  100. model('common/OrderPaylog')->updateBy($logID,[
  101. 'pay_price' => $params['price'],
  102. 'is_pay' => 1
  103. ]);
  104. model('common/TaxiOrder')->updateBy($order['id'], [
  105. 'is_free' => 1, // 免单
  106. 'status' => 2
  107. ]);
  108. // 后台推送
  109. // push_socket_data('motor',[
  110. // 'id' => $order['id'],
  111. // 'msg' => '有新的(免费)摩的订单等待处理哟,点击前往!'
  112. // ]);
  113. return $this->ApiJson(0,"本单免费,等待师傅接驾", [
  114. 'type' => 'free',
  115. 'success' => "ok!"
  116. ]);
  117. }
  118. // 返回支付单号
  119. return $this->ApiJson(0,'订单提交成功', [
  120. 'type' => 'wx',
  121. 'success' => "ok!",
  122. 'trade_no' => $trade_no
  123. ]);
  124. }
  125. return $this->ApiJson(-1,'发生异常,请骚后重试...');
  126. }
  127. /**
  128. * 用车,新的地图下单方式
  129. */
  130. public function newCallTaxi()
  131. {
  132. $datas = $this->request->param();
  133. // 参数校验
  134. $valid = $this->validate($datas, [
  135. 'mobile|联系方式' => 'require',
  136. 'count|乘车人数' => 'require',
  137. 'depart|起始位置' => 'require',
  138. 'arrive|送达位置' => 'require',
  139. 'km|公里数' => 'require',
  140. 'price|价格' => 'require',
  141. ]);
  142. // 错误返回
  143. if(true !== $valid){
  144. return $this->ApiJson(-1, $valid);
  145. };
  146. $user = $this->auth->user();
  147. // 统计订单
  148. $count = model('common/TaxiOrder')->where('status','>=','2')->where(['is_free' => '1','user_id' => $user['id']])->count('id');
  149. // 创建订单
  150. $params = [
  151. 'user_id'=> $user['id'],
  152. 'order_no'=> get_order_no(),
  153. 'price'=> isset($datas['price'])? $datas['price'] : 0.00,
  154. 'count'=> isset($datas['count'])? $datas['count'] : 0,
  155. 'mobile'=> isset($datas['mobile'])? $datas['mobile'] : '',
  156. 'depart'=> isset($datas['depart'])? $datas['depart'] : '',
  157. 'arrive'=> isset($datas['arrive'])? $datas['arrive'] : '',
  158. 'km'=> isset($datas['km'])? $datas['km'] : '',
  159. ];
  160. // 验证是否有未支付订单,有则直接更新订单为新订单
  161. $hasOrderId = model('common/TaxiOrder')->where(['user_id'=> $user['id'],'status'=> 1])->order('created_at','desc')->value('id');
  162. if($hasOrderId){
  163. model('common/TaxiOrder')->where(['id'=> $hasOrderId])->update($params);
  164. $order = model('common/TaxiOrder')->where(['id'=> $hasOrderId])->findOrFail();
  165. }else{
  166. $order = model('common/TaxiOrder')::create($params,true);
  167. }
  168. // 订单信息验证处理
  169. if ($order && $order['id']){
  170. // 创建对应支付记录
  171. $trade_no = get_order_no();
  172. $logID = model('common/OrderPaylog')->storeBy([
  173. 'out_trade_no' => $trade_no,
  174. 'total_price' => $params['price'],
  175. 'order_idx' => $order['id'],
  176. 'ascription' => 'motor' // 归属订单
  177. ]);
  178. // 免单优惠 20201201 添加条件 仅限xx 公里以下 不包含 xx 公里
  179. if ($count < sys_config('taxi_order_free_num','store') && $params['km'] < sys_config('taxi_order_free_km','store')){
  180. model('common/OrderPaylog')->updateBy($logID,[
  181. 'pay_price' => $params['price'],
  182. 'is_pay' => 1
  183. ]);
  184. model('common/TaxiOrder')->updateBy($order['id'], [
  185. 'is_free' => 1, // 免单
  186. 'status' => 2
  187. ]);
  188. // 后台推送
  189. // push_socket_data('motor',[
  190. // 'id' => $order['id'],
  191. // 'msg' => '有新的(免费)摩的订单等待处理哟,点击前往!'
  192. // ]);
  193. return $this->ApiJson(0,"本单免费,等待师傅接驾", [
  194. 'type' => 'free',
  195. 'success' => "ok!"
  196. ]);
  197. }
  198. // 返回支付单号
  199. return $this->ApiJson(0,'订单提交成功', [
  200. 'type' => 'wx',
  201. 'success' => "ok!",
  202. 'trade_no' => $trade_no
  203. ]);
  204. }
  205. return $this->ApiJson(-1,'发生异常,请骚后重试...');
  206. }
  207. /**
  208. * 订单详情
  209. *
  210. * @author 许祖兴 < zuxing.xu@lettered.cn>
  211. * @date 2020/7/6 11:09
  212. *
  213. * @return \think\response\Json
  214. * @throws \Lettered\Support\Exceptions\FailedException
  215. * @throws \think\db\exception\DataNotFoundException
  216. * @throws \think\db\exception\ModelNotFoundException
  217. * @throws \think\exception\DbException
  218. */
  219. public function taxiOrder()
  220. {
  221. $param = $this->request->param();
  222. // 数据校验
  223. $valid = $this->validate($param, [
  224. 'order_no' => 'require',
  225. ]);
  226. // 错误
  227. if (true !== $valid) {
  228. return $this->ApiJson(-1, $valid);
  229. }
  230. var_dump($param);
  231. $info = model('common/TaxiOrder')
  232. // ->with(['paylog','user'])
  233. ->where(['user_id' => $this->auth->user()['id'], 'order_no'=> $param['order_no']])
  234. ->findOrFail();
  235. return $this->ApiJson(0,'获取成功', $info);
  236. }
  237. /**
  238. * 订单
  239. *
  240. * @author 许祖兴 < zuxing.xu@lettered.cn>
  241. * @date 2020/7/6 11:09
  242. *
  243. * @return \think\response\Json
  244. * @throws \Lettered\Support\Exceptions\FailedException
  245. * @throws \think\db\exception\DataNotFoundException
  246. * @throws \think\db\exception\ModelNotFoundException
  247. * @throws \think\exception\DbException
  248. */
  249. public function order()
  250. {
  251. $param = $this->request->param();
  252. $limit = 10;
  253. // 数据校验
  254. $valid = $this->validate($param, [
  255. 'page' => 'require',
  256. ]);
  257. // 错误
  258. if (true !== $valid) {
  259. return $this->ApiJson(-1, $valid);
  260. }
  261. $orders = model('common/TaxiOrder')
  262. ->with(['paylog'])
  263. ->where(['user_id' => $this->auth->user()['id']])
  264. ->limit((($param['page'] - 1) * $limit) . "," . $limit)
  265. ->order(['id' => 'desc'])
  266. ->select();
  267. return $this->ApiJson(0,'获取成功', $orders);
  268. }
  269. /**
  270. * @desc 取消订单
  271. * @return \think\response\Json
  272. * @throws \think\db\exception\DataNotFoundException
  273. * @throws \think\db\exception\ModelNotFoundException
  274. * @throws \think\exception\DbException
  275. * @author weichuanbao<654745815@qq.com>
  276. * @date 2021/12/2 0002
  277. */
  278. public function cancelOrder()
  279. {
  280. $param = $this->request->param();
  281. // 数据校验
  282. $valid = $this->validate($param, [
  283. 'id' => 'require|number',
  284. ]);
  285. // 错误
  286. if (true !== $valid) {
  287. return $this->ApiJson(-1, $valid);
  288. }
  289. $row = model('common/TaxiOrder')->with(['paylog'])
  290. ->field('id,status,created_at')
  291. ->whereNotIn('status', [0,5])
  292. ->find($param['id']);
  293. $user = $this->auth->user();
  294. if ($row) {
  295. if (time() - $row['created_at'] < (60 * 10)) {
  296. // return $this->ApiJson(-1, '10分钟内无法取消订单');
  297. }
  298. if ($row['status'] == 2 || $row['status'] == 3) {
  299. $config = Cache::get('system_config');
  300. $total_price = $row->paylog['total_price'];
  301. // 如果平台已指派司机,则扣除部分金额
  302. if ($row['status'] == 3) {
  303. $total_price = $total_price * (1 - $config['store']['store_cancel_order']/100);
  304. }
  305. if ($row->paylog['pay_type'] == 'balance') {
  306. model('common/Users')->changeBalance(
  307. $user['id'],
  308. $total_price,
  309. "取消成功,取消金额【" . $total_price . "】",
  310. true
  311. );
  312. } else if ($row->paylog['pay_type'] == 'property') {
  313. model('common/Users')->changeProperty(
  314. $user['id'],
  315. $total_price,
  316. "取消成功,取消资产【{$total_price}】",
  317. true
  318. );
  319. } else if ($row->paylog['pay_type'] == 'wechat') {
  320. // 加载配置
  321. $wechat = sys_config('', 'wechat');
  322. $config = [
  323. // 前面的appid什么的也得保留哦
  324. 'app_id' => $wechat['mini_appid'],
  325. 'mch_id' => $wechat['pay_mch_id'],
  326. 'key' => $wechat['pay_secret_key'],
  327. // 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
  328. 'cert_path' => $wechat['cert_path'], // XXX: 绝对路径!!!!
  329. 'key_path' => $wechat['key_path'], // XXX: 绝对路径!!!!
  330. // 'notify_url' => 'https://api.gxrrj.cn/api/v1/wechat/notify',
  331. // 'notify_url' => 'http://rrj.gxnwsoft.com/api/v1/wechat/refundNotify',
  332. // 'sandbox' => true
  333. ];
  334. // 创建应用实例
  335. $app = Factory::payment($config);
  336. // Example:
  337. $result = $app->refund->byOutTradeNumber($row->paylog['out_trade_no'], get_order_no(), $row->paylog['total_price'] * 100, $total_price * 100, [
  338. // 可在此处传入其他参数,详细参数见微信支付文档
  339. 'refund_desc' => '用户申请退款',
  340. ]);
  341. app()->log(json_encode($result));
  342. if ($result['return_code'] == 'SUCCESS') {
  343. if ($result['result_code'] != 'SUCCESS') {
  344. $this->ApiJson(-1, '失败');
  345. }
  346. }
  347. else {
  348. $this->ApiJson(-1, '成功');
  349. }
  350. }
  351. }
  352. // 后台推送
  353. push_socket_data('motor',[
  354. 'id' => $row['id'],
  355. 'msg' => '有用户取消订单,点击前往!'
  356. ]);
  357. $row->status = 5;
  358. $row->save();
  359. return $this->ApiJson(0, '取消成功', $row);
  360. }
  361. return $this->ApiJson(-1, '取消失败');
  362. }
  363. }