Orders.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php namespace App\Http\Controllers\Api\WeiZan;
  2. use App\Http\Controllers\Api\Api;
  3. use App\Http\Requests\Api\WeiZan\Orders as Request;
  4. use App\Models\Custom;
  5. use App\Models\CustomAddr;
  6. use App\Models\FilesManager;
  7. use App\Models\Orders as Model;
  8. use App\Models\OrdersAddr;
  9. use App\Models\OrdersProduct;
  10. use Illuminate\Support\Facades\DB;
  11. /**
  12. * 微赞订单
  13. *
  14. * @author 刘相欣
  15. *
  16. * */
  17. class Orders extends Api{
  18. /**
  19. * 订单导入 /api/weizan_orders/import
  20. *
  21. * @param string $car_info 需要下单的产品ID
  22. * @param string $buyer_number 需要下单的数量
  23. *
  24. * */
  25. public function import( Request $request,Model $Model,Custom $Custom,OrdersAddr $OrdersAddr,OrdersProduct $OrdersProduct,CustomAddr $CustomAddr){
  26. // 接口验签
  27. //$this->verify_sign();
  28. // 验证参数
  29. $request->scene('import')->validate();
  30. // 获取参数
  31. $order['weizan_orderid'] = request('id',0);
  32. $order['pay_total'] = request('pay_amount',0);
  33. $order['price_total'] = request('order_amount',0);
  34. $order['insert_time'] = request('create_time','');
  35. $order['update_time'] = request('modify_time','');
  36. $order['status'] = request('status','');
  37. $order['status'] = $Model->getWeibanStatus($order['status']);
  38. $order['coupon_total'] = $order['pay_total'] - $order['price_total'];
  39. $order['insert_time'] = strtotime($order['insert_time']);
  40. $order['update_time'] = strtotime($order['update_time']);
  41. $order['insert_time'] = $order['insert_time'] < 0 ? time() : $order['insert_time'];
  42. $order['update_time'] = $order['update_time'] < 0 ? time() : $order['update_time'];
  43. // 用户信息
  44. $phone = request('user_phone',0);
  45. $userName = request('user_name',0);
  46. // $userId = request('user_id',0);
  47. // 收货地址
  48. $addr = request('address','');
  49. $addr = explode(' ',$addr);
  50. $contact['contact_name'] = trim(request('contact_name',''));
  51. $contact['contact_phone'] = trim(request('contact_phone',''));
  52. $contact['contact_province'] = empty($addr[0]) ? '' : trim($addr[0]);
  53. $contact['contact_city'] = empty($addr[1]) ? '' : trim($addr[1]);
  54. $contact['contact_area'] = empty($addr[2]) ? '' : trim($addr[2]);
  55. $contact['contact_addr'] = empty($addr[3]) ? '' : trim($addr[3]);
  56. // 子订单数据
  57. $orderItems = request('order_items','[]');
  58. // 数据解析
  59. $orderItems = json_decode($orderItems,true);
  60. // 如果客户存在
  61. if( !$orderItems ) return json_send(['code'=>'error','msg'=>'缺少子订单信息']);
  62. // 循环处理
  63. foreach ($orderItems as $key => $value) {
  64. // 字符串转换
  65. $value['sku_value'] = (string) $value['sku_value'];
  66. // 时间转换
  67. $modify_time = strtotime($value['modify_time']);
  68. // 重组数据
  69. $value = [
  70. 'status'=>$order['status'],
  71. 'product_name'=> str_ireplace(['()','()','(','('],'',str_ireplace($value['sku_value'],'',$value['product_name'])),
  72. 'sku_attr_names'=>$value['sku_value'],
  73. 'buy_num'=>$value['number'],
  74. 'pay_total'=>$value['sub_total'],
  75. 'price_total'=>$value['sub_total'],
  76. 'insert_time'=>$order['insert_time'],
  77. 'update_time'=>($modify_time<0?time():$modify_time),
  78. ];
  79. // 时间
  80. $orderItems[$key] = $value;
  81. }
  82. // 获取手机号,查询是否用客户
  83. $custom = $Custom->getOneByPhone($phone);
  84. // 如果存在手机号
  85. $uid = $custom ? $custom['uid'] : $Custom->add(['username'=>$userName,'phone'=>$phone]);
  86. // 如果客户存在
  87. if( !$uid ) return json_send(['code'=>'error','msg'=>'无法创建用户']);
  88. // 通过订单号查询是否存在系统订单
  89. $orderId = (int) $Model->query()->where([['weizan_orderid','=',$order['weizan_orderid']]])->value('id');
  90. // 客户ID
  91. $order['custom_uid'] = $uid;
  92. // 组合数据,写入订单表,子表
  93. DB::beginTransaction();
  94. // 写入数据
  95. try {
  96. // 存在订单获取订单ID,不存在则新增
  97. $orderId = $orderId ? $Model->edit($orderId,$order) : $Model->add($order);
  98. // 如果客户存在
  99. if( !$orderId ) {
  100. // 回退数据
  101. DB::rollBack();
  102. // 失败提示
  103. return json_send(['code'=>'error','msg'=>'订单写入失败']);
  104. }
  105. // 循环子订单
  106. foreach ( $orderItems as $item ) {
  107. // 数据结果
  108. $item['custom_uid'] = $uid;
  109. $item['order_id'] = $orderId;
  110. $item['status'] = $order['status'];
  111. $item['id'] = $OrdersProduct->query()->where([['order_id','=',$orderId],'product_name'=>$item['product_name'],'sku_attr_names'=>$item['sku_attr_names']])->value('id');
  112. // 新增还是修改
  113. if( !$item['id'] ) {
  114. // 添加
  115. $result = $OrdersProduct->add($item);
  116. // 失败提示
  117. if( !$result ) {
  118. // 回退数据
  119. DB::rollBack();
  120. // 失败提示
  121. return json_send(['code'=>'error','msg'=>'子订单写入失败']);
  122. }
  123. }else{
  124. // 产品修改
  125. $OrdersProduct->edit($item['id'],$item);
  126. }
  127. }
  128. // 存在详细地址,才创建地址库
  129. if( $contact['contact_name'] && $contact['contact_phone'] && $contact['contact_province'] && $contact['contact_city'] && $contact['contact_area'] && $contact['contact_addr'] ) {
  130. // 收件地址是否存在
  131. $oldAddr = $CustomAddr->query()->where([['custom_uid','=',$uid]])->first();
  132. // 如果不存在地址
  133. if( !$oldAddr ) $CustomAddr->add(array_merge($contact,['custom_uid'=>$uid]));
  134. }
  135. // 订单地址
  136. $addrId = $OrdersAddr->query()->where([['order_id','=',$orderId]])->value('id');
  137. // 如果不存在地址
  138. if( !$addrId ) $OrdersAddr->add(array_merge($contact,['order_id'=>$orderId]));
  139. // 提交数据
  140. DB::commit();
  141. // 返回结果
  142. return json_send(['code'=>'success','msg'=>'同步成功','data'=>['id'=>$orderId]]);
  143. // 返回结果
  144. } catch (\Throwable $th) {
  145. // 回退数据
  146. DB::rollBack();
  147. // 失败提示
  148. return json_send(['code'=>'error','msg'=>'系统异常,请稍后再试','data'=>['error'=>$th->getMessage().'=>'.$th->getLine()]]);
  149. }
  150. }
  151. }