Order.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. <?php
  2. namespace app\api\controller;
  3. use app\admin\model\Address;
  4. use app\api\model\Express;
  5. use app\admin\model\general\Load;
  6. use app\admin\model\Word;
  7. use app\api\model\ShopUser;
  8. use app\api\model\StoreEvaluate;
  9. use app\api\model\StoreOrder;
  10. use app\api\model\StoreProduct;
  11. use app\common\controller\Api;
  12. use app\api\model\Member;
  13. class Order extends Api
  14. {
  15. //无需登录的接口
  16. protected $noNeedLogin = ['order_notify_url','express_list'];//都需要登录
  17. /**
  18. * 提交订单
  19. *
  20. * @ApiTitle (提交订单)
  21. * @ApiSummary (提交订单)
  22. * @ApiMethod (POST)
  23. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  24. * @ApiRoute (/api/order/order_add)
  25. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  26. * @ApiParams (name="store_id", type="int", required=true, description="商品id")//
  27. * @ApiParams (name="address_id", type="int", required=true, description="address_id 地址id")//address_id
  28. */
  29. public function order_add(){
  30. $store_id = $this->request->post('store_id');
  31. $user_id = $this->request->post('user_id');
  32. $address_id = $this->request->post('address_id');
  33. $freight_price=$this->request->post('freight_price');//运费
  34. $total_num=$this->request->post('total_num');//商品数量
  35. $total_price=$this->request->post('total_price');//商品总价
  36. $attribute_top_id=$this->request->post('attribute_top_id');//订单类型 14车辆15商品
  37. $mark=$this->request->post('mark');//备注
  38. if (empty($store_id)){
  39. $this->result('系统错误,刷新重试');
  40. }
  41. $where['id']=$store_id;
  42. $where['is_del']=array('eq',0);
  43. $where['is_show']=array('eq',1);
  44. $get_store=StoreProduct::where($where)->field('id,suser_id,store_name')->find();
  45. if (empty($get_store)){
  46. $this->result('此产品已经下架');
  47. }
  48. $get_address=Address::where('id',$address_id)->find();
  49. $insert['address_name']=$get_address['name'];//姓名
  50. $insert['address_phone']=$get_address['mobile'];//电话
  51. $insert['address_address']=$get_address['province']. ' '.$get_address['city'].' '.$get_address['city'].' '.$get_address['address'];//详细地址
  52. $insert['order_id']='YH'.date('YmdHis').$user_id.rand('1000','9999');
  53. $insert['mid']=$user_id;
  54. $insert['suser_id']=$get_store['suser_id'];//商户id
  55. $insert['store_product_id']=$store_id;
  56. $insert['cate_id']=$attribute_top_id;
  57. $insert['address_id']=$address_id;
  58. $insert['freight_price']=$freight_price;
  59. $insert['total_num']=$total_num;
  60. $insert['total_price']=$total_price;
  61. $insert['pay_price']=$freight_price+$total_price;
  62. $insert['mark']=$mark;//备注
  63. $insert['add_time']=time();//下单时间
  64. $insert['status']=0;//订单状态,待付款
  65. // dump($insert);exit;
  66. if(StoreOrder::insert($insert)){
  67. //添加数据
  68. $bid = StoreOrder::getLastInsID(); //成功后跳转界面
  69. $out_trade_no =$insert['order_id'];
  70. $body = $get_store['store_name'];
  71. $notify_url = 'http://test.yhcars.hdlkeji.com/api/order/order_notify_url';//======
  72. $total_fee = floatval($insert['pay_price']);
  73. $get_user=Member::where('mid',$user_id)->field('mid,openid')->find();
  74. $weixinpay = new WxPay();
  75. $return=$weixinpay->getPrePayOrder($body, $out_trade_no, $total_fee, $notify_url,$get_user['openid']);
  76. if (!empty($return['prepay_id'])){
  77. $arr['prepay_id']=$return['prepay_id'];
  78. $update_status=StoreOrder::where('order_id',$out_trade_no)->update(['prepay_id'=>$return['prepay_id']]);
  79. $this->result('下单成功',['prepay_id'=>$arr['prepay_id'],'order_id'=>$bid],1);
  80. }else{
  81. StoreOrder::where('order_id',$out_trade_no)->delete();
  82. $this->result('下单失败,请重新提交',$return);
  83. }
  84. }else{
  85. $this->result('下单失败,请重新提交');
  86. }
  87. }
  88. /**
  89. * 订单列表
  90. *
  91. * @ApiTitle (订单列表)
  92. * @ApiSummary (订单列表)
  93. * @ApiMethod (POST)
  94. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  95. * @ApiRoute (/api/order/order_list)
  96. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  97. * @ApiParams (name="status", type="int", required=true, description="all 全部")订单状态(-1 : 申请退款 -2 : 退货成功 0:待付款,1:待发货(已付款);2:待收货(已发货);3:已收货(确认收货,待评价);4:已评价;-1:已退款)
  98. */
  99. public function order_list(){
  100. $user_id = $this->request->post('user_id');
  101. $status = $this->request->post('status');
  102. if (empty($status)){
  103. $status='0';
  104. }
  105. if ($status=='all'){//待付款
  106. }else{
  107. if ($status=='-1'){
  108. $where['status']=['in',['-1','-2','-3','-4','-5']];
  109. }else{
  110. $where['status']=$status;
  111. }
  112. }
  113. $where['mid']=$user_id;
  114. $where['is_del']=0;
  115. $where['is_system_del']=0;
  116. $get_order=StoreOrder::where($where)
  117. ->with(['shopuser','product'])
  118. ->order('id','desc')
  119. ->field('id,order_id,total_price,total_num,freight_price,mid,suser_id,store_product_id,prepay_id,status,cate_id')
  120. ->select();
  121. $this->result('success',$get_order,1);
  122. }
  123. /**
  124. * 订单详情
  125. *
  126. * @ApiTitle (订单详情)
  127. * @ApiSummary (订单详情)
  128. * @ApiMethod (POST)
  129. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  130. * @ApiRoute (/api/order/order_info)
  131. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  132. * @ApiParams (name="order_id", type="int", required=true, description="订单编号 id"
  133. */
  134. public function order_info(){
  135. $user_id = $this->request->post('user_id');
  136. $id = $this->request->post('order_id');
  137. $where['mid']=$user_id;
  138. $where['id']=$id;
  139. $where['is_del']=0;
  140. $where['is_system_del']=0;
  141. $get_order=StoreOrder::where($where)
  142. ->with(['shopuser','product','express','refundexpress'])
  143. //->field('id,order_id,total_price,total_num,freight_price,mid,suser_id,store_product_id,prepay_id,type')
  144. ->find();
  145. if (empty($get_order)){
  146. $this->result('此订单已删除');
  147. }
  148. $this->result('success',$get_order,1);
  149. }
  150. /**
  151. * 订单申请退款
  152. *
  153. * @ApiTitle (订单申请退款)
  154. * @ApiSummary (订单申请退款)
  155. * @ApiMethod (POST)
  156. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  157. * @ApiRoute (/api/order/order_refund)
  158. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  159. * @ApiParams (name="order_id", type="int", required=true, description="订单编号 id")
  160. * @ApiParams (name="refund_type", type="int", required=true, description=" 0退货退款 1仅退款")
  161. * @ApiParams (name="refund_reason_wap_img", type="int", required=true, description=",拼接的退款图片")
  162. */
  163. public function order_refund(){
  164. $user_id = $this->request->post('user_id');
  165. $id = $this->request->post('order_id');
  166. $refund_type=$this->request->post('refund_type');//退款类型
  167. $refund_reason_wap_img=$this->request->post('refund_reason_wap_img');// 退款图片
  168. $refund_reason_wap_explain=$this->request->post('refund_reason_wap_explain');//refund_reason_wap_explain 退款说明
  169. $refund_reason_wap=$this->request->post('refund_reason_wap');//退款原因
  170. $refund_price=$this->request->post('refund_price');//退款金额
  171. if (empty($refund_type)){
  172. $refund_type=0;
  173. }
  174. $where['mid']=$user_id;
  175. $where['id']=$id;
  176. $where['is_del']=0;
  177. $where['is_system_del']=0;
  178. $where['cate_id']=15;
  179. //订单状态(-1 : 申请退款 -2 : 退货成功,-3退款失败 0:待付款,1:待发货(已付款);2:待收货(已发货);3:已收货(确认收货);4:已评价;)
  180. $where['status']=['in',['1','2','-3']];
  181. $get_order=StoreOrder::where($where)
  182. ->field('id,total_price')
  183. ->find();
  184. if (empty($get_order)){
  185. $this->result('此订单不能进行退款操作');
  186. }
  187. if ($refund_price>$get_order['total_price']){
  188. $this->result('退款金额超出订单总额');
  189. }
  190. $update['status']='-1';
  191. $update['refund_status']='1';
  192. $update['refund_type']=$refund_type;
  193. $update['refund_reason_wap_img']=$refund_reason_wap_img;
  194. $update['refund_reason_wap_explain']=$refund_reason_wap_explain;
  195. $update['refund_reason_time']=time();
  196. $update['refund_reason_wap']=$refund_reason_wap;
  197. $update['refund_price']=$refund_price;
  198. $update_status=StoreOrder::where('id',$id)->update($update);
  199. $this->result('success',$get_order,1);
  200. }
  201. /**
  202. * 取消退款
  203. * @ApiTitle (取消退款)
  204. * @ApiSummary (取消退款)
  205. * @ApiMethod (POST)
  206. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  207. * @ApiRoute (/api/order/refund_cancel)
  208. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  209. * @ApiParams (name="order_id", type="int", required=true, description="订单编号 id")
  210. */
  211. public function refund_cancel(){
  212. $user_id = $this->request->post('user_id');
  213. $id = $this->request->post('order_id');
  214. $where['mid']=$user_id;
  215. $where['id']=$id;
  216. $where['is_del']=0;
  217. $where['is_system_del']=0;
  218. $where['status']=['in',['-1','-2','-3']];
  219. $get_order=StoreOrder::where($where)
  220. ->field('id,status,delivery_id')
  221. ->find();
  222. if (empty($get_order)){
  223. $this->result('此退款不能取消');
  224. }
  225. if (!empty($get_order['delivery_id'])){
  226. $status='2';
  227. }else{
  228. $status='1';
  229. }
  230. $update_status=StoreOrder::where('id',$id)->update(['status'=>$status,'refund_status'=>'0']);
  231. $this->result('success',$get_order,1);
  232. }
  233. /**
  234. * 快递公司
  235. *
  236. * @ApiTitle (快递公司)
  237. * @ApiSummary (快递公司)
  238. * @ApiMethod (POST)
  239. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  240. * @ApiRoute (/api/order/express_list)
  241. */
  242. public function express_list(){
  243. $get_express=Express::where('is_show',1)->select();
  244. $this->result('success',$get_express,1);
  245. }
  246. /**
  247. * 退货填写快递
  248. *
  249. * @ApiTitle (退货填写快递)
  250. * @ApiSummary (退货填写快递)
  251. * @ApiMethod (POST)
  252. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  253. * @ApiRoute (/api/order/add_express)
  254. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  255. * @ApiParams (name="order_id", type="int", required=true, description="订单编号 id")
  256. */
  257. public function add_express(){
  258. $user_id = $this->request->post('user_id');
  259. $id = $this->request->post('order_id');
  260. $refund_delivery_name=$this->request->post('refund_delivery_name');
  261. $refund_delivery_id=$this->request->post('refund_delivery_id');
  262. $where['mid']=$user_id;
  263. $where['id']=$id;
  264. $where['is_del']=0;
  265. $where['is_system_del']=0;
  266. $where['cate_id']=15;
  267. //订单状态(-1 : 申请退款 -2 : 退货成功,-3退款失败 0:待付款,1:待发货(已付款);2:待收货(已发货);3:已收货(确认收货);4:已评价;)
  268. $where['status']=['in',['-2','-4']];
  269. $get_order=StoreOrder::where($where)
  270. ->field('id,total_price')
  271. ->find();
  272. if (empty($get_order)){
  273. $this->result('此订单不能填写退款物流');
  274. }
  275. $update_status=StoreOrder::where('id',$id)->update(['status'=>'-4','refund_status'=>4,'refund_delivery_name'=>$refund_delivery_name,'refund_delivery_id'=>$refund_delivery_id]);
  276. $this->result('success',$update_status,1);
  277. }
  278. /**
  279. * 订单删除
  280. * @ApiTitle (订单删除)
  281. * @ApiSummary (订单删除)
  282. * @ApiMethod (POST)
  283. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  284. * @ApiRoute (/api/order/order_del)
  285. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  286. * @ApiParams (name="order_id", type="int", required=true, description="订单编号 id")
  287. */
  288. public function order_del(){
  289. $user_id = $this->request->post('user_id');
  290. $id = $this->request->post('order_id');
  291. $where['mid']=$user_id;
  292. $where['id']=$id;
  293. $where['is_del']=0;
  294. $where['is_system_del']=0;
  295. $where['status']=['in',['-2','0','3','4','9']];
  296. $get_order=StoreOrder::where($where)
  297. ->field('id')
  298. ->find();
  299. if (empty($get_order)){
  300. $this->result('此订单不能进行删除操作');
  301. }
  302. $update_status=StoreOrder::where('id',$id)->update(['is_del'=>1]);
  303. $this->result('success',$get_order,1);
  304. }
  305. /**
  306. * 订单取消
  307. * @ApiTitle (订单取消)
  308. * @ApiSummary (订单取消)
  309. * @ApiMethod (POST)
  310. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  311. * @ApiRoute (/api/order/order_cancel)
  312. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  313. * @ApiParams (name="order_id", type="int", required=true, description="订单编号 id")
  314. */
  315. public function order_cancel(){
  316. $user_id = $this->request->post('user_id');
  317. $id = $this->request->post('order_id');
  318. $where['mid']=$user_id;
  319. $where['id']=$id;
  320. $where['is_del']=0;
  321. $where['is_system_del']=0;
  322. $where['status']=['in',['0']];
  323. $get_order=StoreOrder::where($where)
  324. ->field('id')
  325. ->find();
  326. if (empty($get_order)){
  327. $this->result('此订单不能取消');
  328. }
  329. $update_status=StoreOrder::where('id',$id)->update(['status'=>9]);
  330. $this->result('success',$get_order,1);
  331. }
  332. /**
  333. * 订单确认收货
  334. * @ApiTitle (订单确认收货)
  335. * @ApiSummary (订单确认收货)
  336. * @ApiMethod (POST)
  337. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  338. * @ApiRoute (/api/order/order_take)
  339. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  340. * @ApiParams (name="order_id", type="int", required=true, description="订单编号 id")
  341. */
  342. public function order_take(){
  343. $user_id = $this->request->post('user_id');
  344. $id = $this->request->post('order_id');
  345. $where['mid']=$user_id;
  346. $where['id']=$id;
  347. $where['is_del']=0;
  348. $where['is_system_del']=0;
  349. $where['status']=['in',['2']];
  350. $get_order=StoreOrder::where($where)
  351. ->field('id,suser_id,pay_price')
  352. ->select();
  353. if (empty($get_order)){
  354. $this->result('此订单不能收货');
  355. }
  356. ShopUser::where('id',$get_order['suser_id'])->setInc('order_num');
  357. ShopUser::where('id',$get_order['suser_id'])->setInc('order_price',$get_order['pay_price']);
  358. ShopUser::where('id',$get_order['suser_id'])->setInc('balance',$get_order['pay_price']);
  359. $update_status=StoreOrder::where('id',$id)->update(['status'=>3]);
  360. $this->result('success',$get_order,1);
  361. }
  362. /**
  363. * 订单评论
  364. *
  365. * @ApiTitle (订单评论)
  366. * @ApiSummary (订单评论)
  367. * @ApiMethod (POST)
  368. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  369. * @ApiRoute (/api/order/order_evaluate)
  370. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  371. * @ApiParams (name="suser_id", type="int", required=true, description="商家id")
  372. * @ApiParams (name="store_id", type="int", required=true, description="商品id")
  373. */
  374. public function order_evaluate(){
  375. $post=$this->request->post();
  376. $insert['mid']=$post['user_id'];
  377. $insert['order_id']=$post['order_id'];
  378. $get_order=StoreOrder::where('id',$post['order_id'])->where('status',3)->field('id,suser_id,store_product_id')->find();
  379. if (empty($get_order)){
  380. $this->result('该订单暂时不能评价');
  381. }
  382. $insert['content']=$post['content'];
  383. $insert['images']=$post['images'];
  384. $insert['xj']=$post['xj'];
  385. if (!empty($insert['content'])){
  386. $word_model=new Word();
  387. $list=$word_model->get_worde();
  388. $say_record= $this->sensitive($list,$insert['content']);
  389. if (strpos($say_record,'**') !== false){
  390. $this->result('您的发布包含敏感词,请重新整理');
  391. }
  392. }
  393. $insert['suser_id']=$get_order['suser_id'];
  394. $insert['store_id']=$get_order['store_product_id'];
  395. $insert['updatetime']=$insert['createtime']=time();
  396. if(StoreEvaluate::insert($insert)){ //添加数据
  397. $bid = StoreEvaluate::getLastInsID(); //成功后跳转界面
  398. $update_status=StoreOrder::where('id',$post['order_id'])->update(['status'=>4]);
  399. $this->result('SUCCESS', $bid, 1);
  400. }else{
  401. $this->result('评价失败,稍后重试');
  402. }
  403. }
  404. /**
  405. * 车贷
  406. *
  407. * @ApiTitle (车贷)
  408. * @ApiSummary (车贷)
  409. * @ApiMethod (POST)
  410. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  411. * @ApiRoute (/api/order/order_loan_time)
  412. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  413. */
  414. public function order_loan_time(){
  415. $loan=Load::find();
  416. $loan['time']=[];
  417. $array['6个月']='6';
  418. $array['1年']='12';
  419. $array['2年']='24';
  420. $array['3年']='36';
  421. $array['4年']='48';
  422. $array['5年']='60';
  423. $array['6年']='72';
  424. $array['8年']='96';
  425. $array['10年']='120';
  426. $loan['time']=$array;
  427. $this->result('success',$loan,1);
  428. }
  429. /**
  430. * 退款原因
  431. *
  432. * @ApiTitle (退款原因)
  433. * @ApiSummary (退款原因)
  434. * @ApiMethod (POST)
  435. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  436. * @ApiRoute (/api/order/return_reason)
  437. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  438. */
  439. public function return_reason(){
  440. $array=['多拍','不想要','未发货','地址错了','其他'];
  441. $this->result('success',$array,1);
  442. }
  443. /**
  444. * 车贷计算
  445. *
  446. * @ApiTitle (车贷计算)
  447. * @ApiSummary (车贷计算)
  448. * @ApiMethod (POST)
  449. * @ApiHeaders (name="user-token", type="string", required=true, description="请求的Token")
  450. * @ApiRoute (/api/order/order_loan)
  451. * @ApiParams (name="user_id", type="int", required=true, description="用户user_id")
  452. * @ApiParams (name="time", type="int", required=true, description="时间 月数"
  453. * @ApiParams (name="money", type="int", required=true, description="时间"
  454. */
  455. public function order_loan(){
  456. $user_id = $this->request->post('user_id');
  457. $time = $this->request->post('time');
  458. $money = $this->request->post('money');
  459. if (empty($time)){
  460. $type=12;
  461. }
  462. $dkm = $time; //贷款月数,20年就是240个月
  463. $dkTotal = $money; //贷款总额
  464. // 车价乘以0.3是首付 剩下的金额乘以1.1796除以36 是每个月月供
  465. $loan=Load::find();
  466. $array['shoufu']=$money*$loan['down_payments'];
  467. $array['yuegong']=(($money-$array['shoufu'])*$loan['interest_rate'])/$time;
  468. $this->result('success',$array,1);
  469. }
  470. // 回调顶顶顶顶
  471. public function order_notify_url()
  472. {
  473. $testxml = file_get_contents("php://input");
  474. $jsonxml = json_encode(simplexml_load_string($testxml, 'SimpleXMLElement', LIBXML_NOCDATA));
  475. $result = json_decode($jsonxml, true);//转成数组,
  476. if ($result) {
  477. //如果成功返回了
  478. $out_trade_no = $result['out_trade_no'];
  479. if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
  480. $get_order=StoreOrder::where(['order_id'=>$out_trade_no])->field('cate_id,store_product_id,id,order_id')->find();
  481. try {
  482. if ($get_order['cate_id']==14){
  483. $status=3;//车辆的订单直接完成
  484. }else{
  485. $status=1;
  486. }
  487. StoreOrder::where('order_id',$out_trade_no)->update(['status'=>$status,'pay_time'=>time()]);
  488. StoreProduct::where(['id'=>$get_order['store_product_id']])->setInc('sales'); // 原数值加一
  489. StoreProduct::where(['id'=>$get_order['store_product_id']])->setDec('stock'); // 原数值减一\
  490. StoreOrder::commit();
  491. StoreProduct::commit();
  492. echo '<xml>
  493. <return_code><![CDATA[SUCCESS]]></return_code>
  494. <return_msg><![CDATA[OK]]></return_msg>
  495. </xml>';
  496. exit();
  497. } catch (\Exception $e) {
  498. dump($e->getMessage());
  499. // 回滚事务
  500. StoreOrder::rollback();
  501. StoreProduct::rollback();
  502. }
  503. }
  504. }else{
  505. echo 'error';
  506. }
  507. }
  508. }