Orders.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php namespace App\Http\Controllers\Api\Score;
  2. use App\Models\CustomAddr;
  3. use App\Models\Score\Product;
  4. use App\Http\Controllers\Api\Api;
  5. use App\Models\Score\Orders as Model;
  6. use App\Models\Score\OrdersAddr as OrdersAddr;
  7. use App\Http\Requests\Api\Score\Orders as Request;
  8. use Illuminate\Support\Facades\DB;
  9. use App\Models\CustomScore;
  10. /**
  11. * 订单接口
  12. *
  13. * @author 刘相欣
  14. *
  15. * */
  16. class Orders extends Api{
  17. /**
  18. * 创建订单 /api/score_order/create
  19. *
  20. * @param string $car_info 需要下单的产品ID
  21. * @param string $buyer_number 需要下单的数量
  22. *
  23. * */
  24. public function create(Request $request,Model $Model,CustomAddr $CustomAddr,Product $Product,OrdersAddr $OrdersAddr,CustomScore $CustomScore){
  25. // 接口验签
  26. // $this->verify_sign();
  27. // 验证参数
  28. $request->scene('create')->validate();
  29. // 检查登录
  30. $uid = $this->checkLogin();
  31. // 接收参数
  32. $productId = request('product_id',0);
  33. $buyNum = request('buy_num',0);
  34. $addrId = request('addr_id',0);
  35. $buyType = 3;
  36. $payType = 1;
  37. // 获取地址
  38. $addr = $CustomAddr->getOne($addrId);
  39. // 如果不存在数据
  40. if( !$addr ) return json_send(['code'=>'error','msg'=>'地址有误,请核对','data'=>['error'=>'没有找到对应的地址']]);
  41. // 重组数据
  42. $addr = ['contact_name'=>$addr['contact_name'],'contact_shop'=>$addr['contact_shop'],'contact_phone'=>$addr['contact_phone'],'contact_province'=>$addr['contact_province'],'contact_city'=>$addr['contact_city'],'contact_area'=>$addr['contact_area'],'contact_addr'=>$addr['contact_addr']];
  43. // 解码
  44. $productList = $Product->getOne($productId);
  45. // 如果产品不存在
  46. if( !$productList ) return json_send(['code'=>'error','msg'=>'产品不存在或已下架','data'=>['error'=>'产品ID不存在'.$productId]]);
  47. // 如果产品库存不足主产品
  48. if( $productList['stock'] < $buyNum ) return json_send(['code'=>'error','msg'=>'产品库存不足','data'=>['error'=>'产品库存不足']]);
  49. // 获取积分信息
  50. $balance = $CustomScore->getBalanceByUid($uid);
  51. // 如果剩余积分不足
  52. if( $balance < $buyNum * $productList['score'] ) return json_send(['code'=>'error','msg'=>'积分不足','data'=>['error'=>'积分不足']]);
  53. // 总共积分
  54. $order['score_total'] = $buyNum * $productList['score'];
  55. $order['product_id'] = $productId;
  56. $order['buy_num'] = $buyNum;
  57. $order['custom_uid'] = $uid;
  58. $order['status'] = 1;
  59. // 组合数据,写入订单表,子表
  60. DB::beginTransaction();
  61. // 写入数据
  62. try {
  63. // 扣减库存
  64. $result = $Product->edit($productId,['stock'=>DB::raw('stock+-'.$buyNum)]);
  65. // 如果扣减失败
  66. if( !$result ) {
  67. // 回退数据
  68. DB::rollBack();
  69. // 提示信息
  70. return json_send(['code'=>'error','msg'=>'兑换失败','data'=>['error'=>'产品库存扣减失败']]);
  71. }
  72. // 创建总订单
  73. $orderId = $Model->add($order);
  74. // 如果扣减失败
  75. if( !$orderId ) {
  76. // 回退数据
  77. DB::rollBack();
  78. // 提示信息
  79. return json_send(['code'=>'error','msg'=>'兑换失败','data'=>['error'=>'订单创建失败']]);
  80. }
  81. // 积分扣减
  82. $result = $CustomScore->trade($uid,$orderId,($order['score_total']*-1),$buyType,$payType);
  83. // 地址写入失败
  84. if( isset($result['error']) ) {
  85. // 回退数据
  86. DB::rollBack();
  87. // 提示信息
  88. return json_send(['code'=>'error','msg'=>'兑换失败','data'=>['error'=>result['error']]]);
  89. }
  90. // 订单ID
  91. $addr['order_id'] = $orderId;
  92. // 写入订单地址表
  93. $result = $OrdersAddr->add($addr);
  94. // 地址写入失败
  95. if( !$result ) {
  96. // 回退数据
  97. DB::rollBack();
  98. // 提示信息
  99. return json_send(['code'=>'error','msg'=>'兑换失败','data'=>['error'=>'地址写入失败']]);
  100. }
  101. // 提交数据
  102. DB::commit();
  103. // 返回结果
  104. return json_send(['code'=>'success','msg'=>'兑换成功','data'=>['id'=>$orderId]]);
  105. } catch (\Throwable $th) {
  106. // 回退数据
  107. DB::rollBack();
  108. // 判断结果,如果库存扣减失败的话
  109. if( stripos($th->getMessage(),'UNSIGNED') ) return json_send(['code'=>'error','msg'=>'兑换失败','data'=>['error'=>'产品库存扣减失败']]);
  110. // 下单失败提示
  111. return json_send(['code'=>'error','msg'=>'兑换失败','data'=>['error'=>$th->getMessage()]]);
  112. }
  113. }
  114. /**
  115. * 获取列表 /api/score_order/get_list
  116. *
  117. * @param string $name 产品名称
  118. * @param int $page 页码,默认1
  119. * @param int $limit 每页条数,默认10条
  120. *
  121. * */
  122. public function get_list(Request $request,Model $Model){
  123. // 接口验签
  124. // $this->verify_sign();
  125. // 验证参数
  126. $request->scene('get_list')->validate();
  127. // 检查登录
  128. $uid = $this->checkLogin();
  129. // 接收参数
  130. $status = request('status',0);
  131. $limit = request('limit',10);
  132. // 显示
  133. $map = [['score_orders.custom_uid','=',$uid]];
  134. // 查询状态
  135. if( $status ) $map[] = ['score_orders.status','=',$status];
  136. // 查询
  137. $Paginator = $Model->query()->join('score_product','score_orders.product_id','=','score_product.id')->where($map)->orderByDesc('score_orders.id')->paginate($limit,['score_orders.id','score_orders.product_id','score_orders.score_total','score_orders.buy_num','score_orders.status','score_orders.insert_time','score_product.name as product_name','score_product.thumb as product_thumb','score_product.spec as product_spec']);
  138. // 循环处理数据
  139. foreach ($Paginator as $key => $value) {
  140. // 产品图路径
  141. $value['state'] = $Model->getState($value['status'],'state');
  142. // 产品图路径
  143. $value['product_thumb'] = path_compat($value['product_thumb']);
  144. // 重组
  145. $Paginator[$key] = $value;
  146. }
  147. // 获取数据
  148. $data['total'] = $Paginator->total();
  149. $data['current_page'] = $Paginator->currentPage();
  150. $data['per_page'] = $Paginator->perPage();
  151. $data['last_page'] = $Paginator->lastPage();
  152. $data['data'] = $Paginator->items();
  153. // 返回结果
  154. return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
  155. }
  156. }