Order.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  1. <?php
  2. namespace app\api\controller;
  3. use think\Db;
  4. use EasyWeChat\Factory;
  5. /**
  6. * @title 会员订单管理
  7. * @controller Order
  8. * @group base
  9. */
  10. class Order extends Base
  11. {
  12. public function initialize()
  13. {
  14. // parent::check_login();
  15. }
  16. /**
  17. * @title 生成订单(立即购买 [商城 && 积分商城])
  18. * @desc 生成订单(立即购买 [商城 && 积分商城])
  19. * @author qc
  20. * @url /api/Order/createOrderByImmediately
  21. * @method POST
  22. * @header name:Authorization require:1 desc:Token
  23. * @param name:goods_id type:int require:1 default:-- desc:商品id
  24. * @param name:goods_no type:int require:1 default:-- desc:商品货号
  25. * @param name:price_total type:float require:1 default:-- desc:支付金额(优惠后的商品金额+运费)
  26. * @param name:num type:int require:1 default:1 desc:商品数量
  27. * @param name:price_goods type:float require:0 default:0 desc:商品总金额(没优惠的)
  28. * @param name:price_express type:float require:0 default:0 desc:运费
  29. * @param name:add_id type:int require:1 default:0 desc:收货地址id
  30. * @param name:remark type:string require:0 default:0 desc:订单备注
  31. * @param name:source type:int require:0 default:0 desc:商城的为0(默认),积分商城的值为1
  32. * @param name:integral type:int require:0 default:0 desc:使用多少积分,source为1时必传
  33. * @param name:int_cash type:float require:0 default:0 desc:积分抵扣多少钱,source为1时必传
  34. * @param name:cl_id type:int require:0 default:0 desc:会员优惠券id,使用优惠券必传
  35. * @param name:coupon_cash type:float require:0 default:0 desc:会员优惠券抵扣金额
  36. * @return name:order_id type:int require:0 default:0 desc:成功时返回订单id
  37. */
  38. public function createOrderByImmediately()
  39. {
  40. $goods_id = input("post.goods_id");
  41. $goods_no = input("post.goods_no");
  42. $price_total = input("post.price_total",0);
  43. $price_goods = input("post.price_goods",0);
  44. $price_express = input("post.price_express",0);
  45. $num = input("post.num",1);
  46. $add_id = input("post.add_id",0);
  47. $source = input("post.source",0);
  48. $integral = input("post.integral",0);
  49. $int_cash = input("post.int_cash",0);
  50. $cl_id = input("post.cl_id",0);
  51. $coupon_cash = input("post.coupon_cash",0);
  52. $remark = input("post.remark",'');
  53. //商品验证start
  54. $goods_info = Db::table('store_goods')->field('id,spec,stock,is_integral')
  55. ->where(['id'=>$goods_id,'status'=>1,'is_deleted'=>0])
  56. ->find();
  57. if(empty($goods_info)) $this->error('商品已下架');
  58. $spec_info = [];
  59. $goods_spec = json_decode($goods_info['spec'],true);
  60. foreach ($goods_spec as &$c){
  61. if($c['goods_no'] == $goods_no) {
  62. $spec_info =$c;
  63. $c['store_num'] -=$num;
  64. break;
  65. }
  66. }
  67. if(!isset($spec_info['integral'])) $spec_info['integral'] = 0;
  68. if($spec_info['store_num'] < $num || $goods_info['stock'] < $num) $this->error('商品库存不足');
  69. // 券验证
  70. if($cl_id) {
  71. $cl_info = Db::table('user_coupon_list')
  72. ->where(['user_id'=>$this->uid,'id'=>$cl_id,'status'=>1])
  73. ->find();
  74. if(empty($cl_info)) $this->error('优惠券不存在');
  75. if($cl_info['past_at'] < date('Y-m-d H:i:s')) $this->error('优惠券已过期');
  76. if($cl_info['low_amount'] > bcsub($price_total,$price_express,2) ) $this->error('订单金额不够,再看看吧');
  77. if($cl_info['amount'] != $coupon_cash ) $this->error('优惠金额错误');
  78. }
  79. // 积分验证
  80. $user = Db::table('store_member')->find($this->uid);
  81. if($integral && $user['integral'] < $integral) $this->error('积分余额不足');
  82. $pro_info[]=[
  83. 'goods_id' =>$goods_id,
  84. 'goods_no' =>$goods_no,
  85. 'num' => $num,
  86. 'integral' =>$spec_info['integral'] * $num,
  87. 'int_cash' =>$int_cash,
  88. 'spec_img' =>$spec_info['spec_img'],
  89. 'sell_money'=>$spec_info['sell_money'],
  90. 'spec_exp' =>$spec_info['spec_exp'],
  91. 'spec_key' =>$spec_info['spec_key'],
  92. ];
  93. $order_int =[
  94. 'uid'=>$this->uid,
  95. 'order_no' => get_order_sn(),
  96. 'price_total' => $price_total,
  97. 'price_goods' => $price_goods,
  98. 'price_express' => $price_express,
  99. 'create_at' => date("Y-m-d H:i:s"),
  100. 'address_id' =>$add_id,
  101. 'source' =>$source,
  102. 'integral' =>$integral,
  103. 'int_cash' =>$int_cash,
  104. 'cl_id' =>$cl_id,
  105. 'coupon_cash' =>$coupon_cash,
  106. 'remark' =>$remark,
  107. 'goods_num' =>$num,
  108. 'pro_info' =>json_encode($pro_info)
  109. ];
  110. Db::startTrans();
  111. $msg= '';$com=true;
  112. try{
  113. // 生成订单
  114. Db::table('store_order')->insert($order_int);
  115. $order_id = Db::getLastInsID();
  116. //扣减库存
  117. update_goods_stock($goods_id,$goods_no,$num);
  118. //扣减积分
  119. if($integral){
  120. update_user_integral($this->uid,$integral * -1,5,'积分抵扣',$order_id);
  121. }
  122. // 扣除券
  123. if($cl_id) {
  124. Db::table('user_coupon_list')->where(['id'=>$cl_id])->update(['status'=>2,'used_time'=>date('Y-m-d H:i:s')]);
  125. }
  126. Db::commit();
  127. }catch (\Exception $e){
  128. Db::rollback();
  129. $com=false;
  130. $msg = $e->getMessage();
  131. }
  132. if($com){
  133. $this->success('ok',['order_id'=>$order_id]);
  134. }else{
  135. $this->error($msg);
  136. }
  137. }
  138. /**
  139. * @title 取消订单
  140. * @desc 取消订单
  141. * @author qc
  142. * @url /api/Order/cancelOrder
  143. * @method POST
  144. * @header name:Authorization require:1 desc:Token
  145. * @param name:id type:int require:1 default:-- desc:订单id
  146. * @param name:cancel_desc type:string require:1 default:-- desc:取消描述
  147. */
  148. public function cancelOrder()
  149. {
  150. $order_id = input('post.id');
  151. $desc = input('post.desc');
  152. $order_detail = Db::table('store_order')->where(['id'=>$order_id])->find();
  153. if(empty($order_detail)) $this->error('订单不存在');
  154. if($order_detail['pay_state'] != 0) $this->error('订单已支付');
  155. if($order_detail['cancel_state'] != 0) $this->error('订单已取消,不能重复取消');
  156. Db::startTrans();
  157. try {
  158. // 积分退回
  159. if($order_detail['integral'] > 0) {
  160. update_user_integral($order_detail['uid'],$order_detail['integral'],8,'订单取消退回',$order_id);
  161. }
  162. // 优惠券回档
  163. if($order_detail['cl_id'] > 0) {
  164. $user_coupon = Db::table('user_coupon_list')->find($order_detail['cl_id']);// 会员优惠券记录
  165. $coupon_set = Db::table('store_coupon_config')->find($user_coupon['coupon_id']);//优惠券设置
  166. if($coupon_set['status'] != 1 || $coupon_set['is_deleted'] == 1){
  167. $coupon_status = 4;
  168. }else{
  169. $coupon_status = $user_coupon['past_at'] > date("Y-m-d H:i:s") ? 1:3;
  170. }
  171. Db::table('user_coupon_list')->where(['id'=>$order_detail['cl_id']])->update(['status'=>$coupon_status]);
  172. }
  173. // 商品库存恢复
  174. $pro_info = json_decode($order_detail['pro_info'],true);
  175. foreach ($pro_info as $pv) {
  176. update_goods_stock($pv['goods_id'],$pv['goods_no'],$pv['num']*-1);
  177. }
  178. // 取消订单
  179. Db::table('store_order')
  180. ->where(['id'=>$order_id])
  181. ->update(['cancel_state'=>1,'cancel_at'=>date('Y-m-d H:i:s'),'cancel_desc'=>$desc,'status'=>9]);
  182. Db::commit();
  183. }catch (\Exception $e){
  184. Db::rollback();
  185. }
  186. $this->success('取消成功');
  187. }
  188. /**
  189. * @title 生成订单(购物车)
  190. * @desc 生成订单(购物车)
  191. * @author qc
  192. * @url /api/Order/createOrderByTrolley
  193. * @method POST
  194. * @header name:Authorization require:1 desc:Token
  195. * @param name:ids type:string : default:1 desc:购物车记录id串(逗号分开)
  196. * @param name:price_total type:float require:1 default:-- desc:支付金额(优惠后的商品金额+运费)
  197. * @param name:price_goods type:float require:0 default:0 desc:商品总金额(没优惠的)
  198. * @param name:price_express type:float require:0 default:0 desc:运费
  199. * @param name:add_id type:int require:1 default:0 desc:收货地址id
  200. * @param name:remark type:string require:0 default:0 desc:订单备注
  201. * @param name:source type:int require:0 default:0 desc:商城的为0(默认),积分商城的值为1
  202. * @param name:integral type:int require:0 default:0 desc:使用多少积分,source为1时必传
  203. * @param name:int_cash type:float require:0 default:0 desc:积分抵扣多少钱,source为1时必传
  204. * @param name:cl_id type:int require:0 default:0 desc:会员优惠券id,使用优惠券必传
  205. * @param name:coupon_cash type:float require:0 default:0 desc:会员优惠券抵扣金额
  206. * @return name:order_id type:int require:0 default:0 desc:成功时返回订单id
  207. */
  208. public function createOrderByTrolley()
  209. {
  210. $ids = input("post.ids");
  211. $price_total = input("post.price_total",0);
  212. $price_goods = input("post.price_goods",0);
  213. $price_express = input("post.price_express",0);
  214. $add_id = input("post.add_id",0);
  215. $source = input("post.source",0);
  216. $integral = input("post.integral",0);
  217. $int_cash = input("post.int_cash",0);
  218. $cl_id = input("post.cl_id",0);
  219. $coupon_cash = input("post.coupon_cash",0);
  220. $remark = input("post.remark",'');
  221. if(!$ids || !$price_total) $this->error('请选择要结算的商品');
  222. $trolley_arr = Db::table('shopping_trolley')
  223. ->where(['user_id'=>$this->uid,'id'=>explode(',',$ids)])
  224. ->select();
  225. $pro_info = [];$total_num = 0;$check_goods = true;
  226. // 验证商品是否下架 && 获取订单商品详情
  227. foreach ($trolley_arr as $tv) {
  228. $goods_info = Db::table('store_goods')->field('id,spec,name')
  229. ->where(['id'=>$tv['goods_id'],'is_deleted'=>0,'status'=>1])
  230. ->find();
  231. if(empty($goods_info)){
  232. $check_goods =false;
  233. break;
  234. }
  235. foreach (json_decode($goods_info['spec'],true) as $sv)
  236. {
  237. if($sv['goods_no'] == $tv['goods_no']) {
  238. $pro_info[]=[
  239. 'goods_id' =>$tv['goods_id'],
  240. 'goods_no' =>$tv['goods_no'],
  241. 'num' =>$tv['num'],
  242. 'integral' => isset($sv['integral']) ? $sv['integral'] * $tv['num'] : 0,
  243. 'int_cash' =>'--',
  244. 'spec_img' =>$sv['spec_img'],
  245. 'sell_money'=>$sv['sell_money'],
  246. 'spec_exp' =>$sv['spec_exp'],
  247. 'spec_key' =>$sv['spec_key'],
  248. ];
  249. $total_num +=$tv['num'];
  250. }
  251. }
  252. }
  253. if(!$check_goods) $this->error('所选商品已下架');
  254. // 券验证
  255. if($cl_id) {
  256. $cl_info = Db::table('user_coupon_list')
  257. ->where(['user_id'=>$this->uid,'id'=>$cl_id,'status'=>1])
  258. ->find();
  259. if(empty($cl_info)) $this->error('优惠券不存在');
  260. if($cl_info['past_at'] < date('Y-m-d H:i:s')) $this->error('优惠券已过期');
  261. if($cl_info['low_amount'] > bcsub($price_total,$price_express,2) ) $this->error('订单金额不够,再看看吧');
  262. if($cl_info['amount'] != $coupon_cash ) $this->error('优惠金额错误');
  263. }
  264. // 积分验证
  265. $user = Db::table('store_member')->find($this->uid);
  266. if($integral && $user['integral'] < $integral) $this->error('积分余额不足');
  267. $order_int =[
  268. 'uid'=>$this->uid,
  269. 'order_no' => get_order_sn(),
  270. 'price_total' => $price_total,
  271. 'price_goods' => $price_goods,
  272. 'price_express' => $price_express,
  273. 'create_at' => date("Y-m-d H:i:s"),
  274. 'address_id' =>$add_id,
  275. 'source' =>$source,
  276. 'integral' =>$integral,
  277. 'int_cash' =>$int_cash,
  278. 'cl_id' =>$cl_id,
  279. 'coupon_cash' =>$coupon_cash,
  280. 'remark' =>$remark,
  281. 'goods_num' =>$total_num,
  282. 'pro_info' =>json_encode($pro_info)
  283. ];
  284. Db::startTrans();
  285. $msg= '';$com=true;
  286. try{
  287. // 生成订单
  288. Db::table('store_order')->insert($order_int);
  289. $order_id = Db::getLastInsID();
  290. // 删除购物车记录
  291. Db::table('shopping_trolley')->where(['id'=>explode(',',$ids)])->delete();
  292. //扣减积分
  293. if($integral){
  294. Db::table('store_member')->where(['id'=>$this->uid])->setDec('integral',$integral);
  295. //积分扣减记录
  296. $integral_info=[
  297. 'user_id'=> $this->uid,
  298. 'create_at'=> date("Y-m-d H:i:s"),
  299. 'integral'=> $integral * -1,
  300. 'before'=> $user['integral'],
  301. 'after'=> $user['integral'] - $integral,
  302. 'desc'=> '积分抵现',
  303. 'rel_id'=> $order_id,
  304. ];
  305. Db::table('integral_info')->insert($integral_info);
  306. }
  307. // 扣除券
  308. if($cl_id) {
  309. Db::table('user_coupon_list')->where(['id'=>$cl_id])->update(['status'=>2,'used_time'=>date('Y-m-d H:i:s')]);
  310. }
  311. Db::commit();
  312. }catch (\Exception $e){
  313. Db::rollback();
  314. $com=false;
  315. $msg = $e->getMessage();
  316. }
  317. if($com){
  318. $this->success('ok',['order_id'=>$order_id]);
  319. }else{
  320. $this->error($msg);
  321. }
  322. }
  323. /**
  324. * @title 获取订单详情
  325. * @desc 获取订单详情
  326. * @author qc
  327. * @url /api/Order/getOrderDetail
  328. * @method GET
  329. * @header name:Authorization require:1 desc:Token
  330. * @param name:id type:int require:1 default:-- desc:订单id
  331. * @return name:order_no type:string default:-- desc:订单号
  332. * @return name:status type:int default:-- desc:支付状态:0待支付,1已支付,2待发货,3待收货,4已收货,5已完成,9取消
  333. * @return name:price_total type:float default:-- desc:订单金额(需要支付金额【包含运费,扣除所有优惠】)
  334. * @return name:price_goods type:float default:-- desc:商品金额
  335. * @return name:price_express type:float default:-- desc:运费
  336. * @return name:pay_state type:int default:-- desc:支付状态(0未支付,1已支付)
  337. * @return name:order_no type:string default:-- desc:订单号
  338. * @return name:pay_no type:string default:-- desc:支付单号
  339. * @return name:create_at type:string default:-- desc:订单创建时间
  340. * @return name:pay_at type:string default:-- desc:支付时间
  341. * @return name:cancel_at type:string default:-- desc:取消时间(status=9)
  342. * @return name:cancel_desc type:string default:-- desc:取消描述(status=9)
  343. * @return name:refund_type type:int default:-- desc:订单申请退款、退换货状态0未申请,1部分申请,2全部申请
  344. * @return name:source type:int default:0 desc:订单来源:0商城,1积分商城
  345. * @return name:integral type:int default:0 desc:使用多少积分
  346. * @return name:int_cash type:int default:0 desc:积分抵扣多少金额
  347. * @return name:cl_id type:int default:0 desc:使用优惠券的id
  348. * @return name:coupon_cash type:float default:0 desc:券抵扣金额
  349. */
  350. public function getOrderDetail()
  351. {
  352. $order_id = input('id',0);
  353. $detail = Db::table('store_order')->find($order_id);
  354. $this->success('获取成功',$detail);
  355. }
  356. /**
  357. * @title 去支付
  358. * @desc 去支付
  359. * @author qc
  360. * @url /api/Order/payOrder
  361. * @method POST
  362. * @header name:Authorization require:1 desc:Token
  363. * @param name:o_id type:int require:1 default:-- desc:订单id
  364. * @param name:is_remind type:int require:1 default:0 desc:订单是否提醒,0不提醒,1提醒
  365. */
  366. public function payOrder()
  367. {
  368. $o_id = input('post.o_id');
  369. $user_info = Db::table('store_member')->where('id',$this->uid)->find();
  370. if(!$user_info['phone'] || !$user_info['openid']) $this->error('请先完善用户信息');
  371. $order_info = Db::table('store_order')->where(['uid'=>$this->uid,'id'=>$o_id])->find();
  372. if(empty($order_info)) $this->error('订单不存在');
  373. if($order_info['status'] != 0) $this->error('订单已支付');
  374. if($order_info['cancel_state'] != 0) $this->error('订单已取消');
  375. if($order_info['price_total'] <= 0 ) $this->error('订单金额错误');
  376. Db::startTrans();
  377. $config = false;$msg= '';
  378. try{
  379. $notify_url = $this->request->root(true) . '/api/Pay/payNotify';
  380. $pay_no = get_order_sn();
  381. Db::table('store_order')->where(['uid'=>$this->uid,'id'=>$o_id])->update(['pay_no'=>$pay_no]);
  382. $config = Pay::wxPay('订单支付',$pay_no,$order_info['price_total'],$notify_url,'JSAPI',$user_info['openid']);
  383. if($config){
  384. Db::commit();
  385. }else{
  386. Db::rollback();
  387. }
  388. }catch (\Exception $e){
  389. Db::rollback();
  390. $msg = $e->getMessage();
  391. }
  392. if($config){
  393. $this->success('ok',['jump'=>1,'config'=>$config]);
  394. }else{
  395. $this->error($msg);
  396. }
  397. }
  398. /**
  399. * @title 获取订单列表
  400. * @desc 获取订单列表
  401. * @author qc
  402. * @url /api/Order/getMyOrderList
  403. * @method GET
  404. * @header name:Authorization require:1 desc:Token
  405. * @param name:page type:int : default:1 desc:页数
  406. * @param name:page_num type:int : default:20 desc:每页数
  407. * @param name:status type:int : default:-1 desc:订单状态(-1全部, 0待支付,1已支付,2待发货,3待收货,4已收货,5已完成,9取消)
  408. * @return name:order_no type:string default:-- desc:订单号
  409. * @return name:pay_state type:int default:-- desc:支付状态(0未支付,1已支付)
  410. * @return name:price_total type:float default:-- desc:订单金额
  411. * @return name:pro_info type:float default:-- desc:订单详情
  412. * @return name:pay_at type:string default:-- desc:支付时间
  413. * @return name:create_at type:string default:-- desc:订单创建时间
  414. * @return name:remark type:string default:-- desc:备注
  415. * @return name:cancel_at type:string default:-- desc:取消时间(status=9)
  416. * @return name:cancel_desc type:string default:-- desc:取消描述(status=9)
  417. * @return name:refund_type type:int default:-- desc:订单申请退款、退换货状态0未申请,1申请
  418. * @return name:source type:int default:0 desc:订单来源:0商城,1积分商城
  419. * @return name:integral type:int default:0 desc:使用多少积分
  420. * @return name:int_cash type:int default:0 desc:积分抵扣多少金额
  421. * @return name:cl_id type:int default:0 desc:使用优惠券的id
  422. * @return name:coupon_cash type:float default:0 desc:券抵扣金额
  423. */
  424. public function getMyOrderList()
  425. {
  426. $status = input('status',-1);
  427. $where=[];
  428. if($status > -1) $where['o.status'] = $status;
  429. $where['o.uid'] = $this->uid;
  430. $where['o.is_deleted'] = 0;
  431. $list = Db::table('store_order o')
  432. ->field('o.id,o.order_no,o.pay_state,o.create_at,pay_at,pro_info,o.price_total,o.remark')
  433. ->where($where)
  434. ->order('o.id desc')
  435. ->limit($this->off_set,$this->page_num)
  436. ->select();
  437. $this->success('获取成功',$list);
  438. }
  439. /**
  440. * @title 删除订单
  441. * @desc 删除订单
  442. * @author qc
  443. * @url /api/Order/delOrder
  444. * @method POST
  445. * @header name:Authorization require:1 desc:Token
  446. * @param name:id type:int : default:1 desc:订单id
  447. */
  448. public function delOrder()
  449. {
  450. $order_id = input('post.id');
  451. $order_info = Db::table('store_order')
  452. ->where(['uid'=>$this->uid,'is_deleted'=>0,'id'=>$order_id])
  453. ->find();
  454. if(empty($order_info)) $this->error('订单不存在');
  455. Db::table('store_order')->where(['id'=>$order_id])->update(['is_deleted'=>1]);
  456. $this->success('删除成功');
  457. }
  458. /**
  459. * @title 获取平台退款原因
  460. * @desc 获取平台退款原因
  461. * @author qc
  462. * @url /api/Order/getRefundCause
  463. * @method GET
  464. * @header name:Authorization require:1 desc:Token
  465. * @return name:id type:int default:-- desc:记录id
  466. * @return name:title type:string default:-- desc:退款原因描述
  467. */
  468. public function getRefundCause(){
  469. $list = get_refund_cause();
  470. $this->success('ok',['list'=>$list]);
  471. }
  472. /**
  473. * @title 提交订单退款
  474. * @desc 提交订单退款
  475. * @author qc
  476. * @url /api/Order/refundOrder
  477. * @method POST
  478. * @header name:Authorization require:1 desc:Token
  479. * @param name:order_id type:int : default:1 desc:订单id
  480. * @param name:cause_id type:int : default:1 desc:退款原因id
  481. * @param name:apply_type type:int : default:1 desc:申请类型 1退款,2退货退款
  482. * @param name:apply_money type:float : default:1 desc:申请退回金额
  483. * @param name:re_desc type:string : default:-- desc:描述
  484. * @param name:re_images type:string : default:-- desc:退款图片最多三张(多张用逗号隔开)
  485. * @return name:re_id type:int require:0 default:0 desc:成功时返回退款记录id
  486. */
  487. public function refundOrder()
  488. {
  489. $order_id = input('post.order_id');
  490. $cause_id = input('post.cause_id');
  491. $apply_type = input('post.apply_type',1);
  492. $apply_money = input('post.apply_money');
  493. $re_desc = input('post.re_desc');
  494. $re_images = input('post.re_images');
  495. $ck_refund = Db::table('order_refund')
  496. ->where(['order_id'=>$order_id,'ck_status'=>0])
  497. ->value('id');
  498. if($ck_refund) $this->error('审核中,请勿重新申请');
  499. $ref_data = [
  500. 'uid' => $this->uid,
  501. 'order_id' => $order_id,
  502. 'apply_type' => $apply_type,
  503. 'apply_money' => $apply_money,
  504. 'create_at' => date("Y-m-d H:i:s"),
  505. 'cause_id' => $cause_id,
  506. 're_desc' => $re_desc,
  507. 're_images' => $re_images,
  508. ];
  509. Db::table('order_refund')->insert($ref_data);
  510. $re_id = Db::getLastInsID();
  511. // 更新订单表退款申请状态
  512. Db::table('store_order')->where('id',$order_id)->update(['refund_state'=>1]);
  513. $this->success('ok',['re_id'=>$re_id]);
  514. }
  515. /**
  516. * @title 获取提交订单退款详情
  517. * @desc 获取提交订单退款详情
  518. * @author qc
  519. * @url /api/Order/getRefundInfo
  520. * @method GET
  521. * @header name:Authorization require:1 desc:Token
  522. * @param name:id type:int : default:1 desc:退款记录id
  523. * @return name:cause_id type:int : default:1 desc:退款原因id
  524. * @return name:apply_type type:int : default:1 desc:申请类型 1退款,2退货退款
  525. * @return name:apply_money type:float : default:1 desc:申请退回金额
  526. * @return name:create_at type:string : default:1 desc:申请时间
  527. * @return name:re_desc type:string : default:-- desc:描述
  528. * @return name:re_images type:string : default:-- desc:退款图片
  529. * @return name:pro_info type:string : default:-- desc:申请订单的商品详情
  530. * @return name:goods_num type:string : default:-- desc:购买的商品数量
  531. * @return name:ck_status type:int default:0 desc:审核状态(0待审核 ,1 审核通过 , 2 审核不通过),
  532. * @return name:refund_money type:float default:0 desc:审核退款金额,
  533. * @return name:refund_state type:int default:0 desc:同意退款后的退款状态(0未退款,1待退款,2已退款,3退款失败)
  534. * @return name:refund_desc type:int default:0 desc:退款描述
  535. * @return name:wl_no type:string default:0 desc:退货物流单号 ( apply_type = 2)
  536. * @return name:wl_company type:string default:0 desc:退货物流公司( apply_type = 2)
  537. */
  538. public function getRefundInfo()
  539. {
  540. $id = input('post.id');
  541. $detail = Db::table('order_refund')
  542. ->field('r.*,o.pro_info,o.goods_num')
  543. ->alias('r')
  544. ->join('store_order o','r.order_id = o.id','LEFT')
  545. ->where(['r.order_id'=>$id])
  546. ->find();
  547. $re_cause = get_refund_cause();
  548. $detail['refund_desc'] = array_column($re_cause,null,'id')[$detail['cause_id']]['title'];
  549. $this->success('ok',['refund_detail'=>$detail]);
  550. }
  551. /**
  552. * @title 完善退货物流信息
  553. * @desc 完善退货物流信息
  554. * @author qc
  555. * @url /api/Order/completeLogistics
  556. * @method POST
  557. * @header name:Authorization require:1 desc:Token
  558. * @param name:id type:int default:1 desc:退款记录id
  559. * @param name:wl_no type:string default:-- desc:物流单号
  560. * @param name:wl_company type:string default:1 desc:物流公司
  561. */
  562. public function completeLogistics()
  563. {
  564. $id = input('post.id');
  565. $wl_no = input('post.wl_no');
  566. $wl_company = input('post.wl_company');
  567. $info = $detail = Db::table('order_refund')->find($id);
  568. if($info['apply_type'] == 1) $this->error('申请类型不符合,无需物流信息');
  569. // 更新物流信息
  570. Db::table('order_refund')->where(['id'=>$id])->update(['wl_no'=>$wl_no,'wl_company'=>$wl_company]);
  571. $this->success('ok');
  572. }
  573. /**
  574. * @title 修改订单退款(退货)申请信息
  575. * @desc 修改订单退款(退货)申请信息
  576. * @author qc
  577. * @url /api/Order/modifyRefundInfo
  578. * @method POST
  579. * @header name:Authorization require:1 desc:Token
  580. * @param name:id type:int default:1 desc:需要修改的退款申请id
  581. * @param name:cause_id type:int default:1 desc:退款原因id
  582. * @param name:apply_type type:int default:1 desc:申请类型 1退款,2退货退款
  583. * @param name:apply_money type:float default:1 desc:申请退回金额
  584. * @param name:re_desc type:string default:-- desc:描述
  585. * @param name:re_images type:string default:-- desc:退款图片最多三张(多张用逗号隔开)
  586. * @param name:wl_no type:string default:-- desc:物流单号
  587. * @param name:wl_company type:string default:1 desc:物流公司
  588. */
  589. public function modifyRefundInfo()
  590. {
  591. $id = input('post.id');
  592. $detail = Db::table('order_refund')->find($id);
  593. if($detail['ck_status'] != 0) $this->error('已审核无法修改,请重新提交');
  594. $up_data = [];
  595. if(input('post.cause_id')) $up_data['cause_id'] = input('post.cause_id');
  596. if(input('post.apply_type')) $up_data['apply_type'] = input('post.apply_type');
  597. if(input('post.apply_money')) $up_data['apply_money'] = input('post.apply_money');
  598. if(input('post.re_desc')) $up_data['re_desc'] = input('post.re_desc');
  599. if(input('post.re_images')) $up_data['re_images'] = input('post.re_images');
  600. if(input('post.wl_no')) $up_data['wl_no'] = input('post.wl_no');
  601. if(input('post.wl_company')) $up_data['wl_company'] = input('post.wl_company');
  602. if(!empty($up_data)) {
  603. Db::table('order_refund')->where(['id'=>$id])->update($up_data);
  604. }
  605. $this->success('修改成功');
  606. }
  607. /**
  608. * @title 取消申请退款(退货)
  609. * @desc 取消申请退款(退货)
  610. * @author qc
  611. * @url /api/Order/cancelRefund
  612. * @method POST
  613. * @header name:Authorization require:1 desc:Token
  614. * @param name:order_id type:int : default:1 desc:订单id
  615. */
  616. public function cancelRefund(){
  617. $order_id = input('post.order_id');
  618. $re_info = Db::table('order_refund')->where(['uid'=>$this->uid,'order_id'=>$order_id,'ck_status'=>0])->count();
  619. if(!$re_info) $this->error('退款记录不存在');
  620. // 删除记录
  621. Db::table('order_refund')->where(['order_id'=>$order_id,'ck_status'=>0])->delete();
  622. $ck = Db::table('order_refund')->where(['order_id'=>$order_id])->find();
  623. $stat = empty($ck) ? 0 : 2 ;
  624. Db::table('store_order')->where(['id'=>$order_id])->update(['refund_state'=>$stat]);
  625. }
  626. /**
  627. * @title 获取提交订单退款列表 ???
  628. * @desc 获取提交订单退款列表 ???
  629. */
  630. public function getRefundList()
  631. {
  632. }
  633. }