海南旅游SAAS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
3.3 KiB

  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\AgentProduct;
  5. use App\Models\Order;
  6. use Illuminate\Http\Request;
  7. /**
  8. * 订单
  9. * Class OrderController
  10. * @package App\Http\Controllers\Api
  11. */
  12. class OrderController extends Controller
  13. {
  14. //订单列表
  15. public function index(Request $request)
  16. {
  17. $formData = $request->only(['page', 'status']);
  18. $request->validate([
  19. 'page' => 'regex:/^\d+$/',
  20. 'status' => 'integer'
  21. ], [
  22. 'page.regex' => '页码错误',
  23. 'status.integer' => '未指定订单状态'
  24. ]);
  25. if (array_key_exists('status', $formData) && $formData['status'] !== null) {
  26. $where['status'] = $formData['status'];
  27. }
  28. $where['user_id'] = $this->user_id;
  29. $list = Order::where($where)
  30. ->with(['product' => fn($query) => $query->select('id', 'title', 'pictures')])
  31. ->select('id', 'product_id', 'price', 'num', 'created_at')
  32. ->orderBy('id', 'DESC')
  33. ->simplePaginate(15);
  34. return $this->success($list);
  35. }
  36. public function create(Request $request)
  37. {
  38. $formData = $request->only(['id', 'name', 'mobile', 'pay_type', 'num']);
  39. $formData = array_map(fn($v) => trim($v), $formData); //过滤,删除首尾空
  40. //表单验证
  41. $request->validate([
  42. 'id' => ['required', 'regex:/^\d+$/'],
  43. 'name' => ['required', 'between:2,20'],
  44. 'mobile' => ['required', 'regex:/^1[3-9]\d{9}$/'],
  45. 'pay_type' => ['required', 'in:0,1,2'],
  46. 'num' => ['required', 'min:1'],
  47. ], [
  48. 'id.required' => '未指定产品ID',
  49. 'name.required' => '请输入联系人姓名',
  50. 'mobile.required' => '请输入联系手机号',
  51. 'id.regex' => '产品ID错误',
  52. 'name.between' => '联系人姓名在2~20字符之间',
  53. 'mobile.regex' => '请输入11位手机号',
  54. 'pay_type.required' => '请选择支付方式',
  55. 'pay_type.in' => '不存在此支付方式',
  56. 'num.required' => '请输入购买数量',
  57. 'num.min' => '购买数量输入错误',
  58. ]);
  59. $product = AgentProduct::where('id', $formData['id'])->with('product')->first();
  60. if (!$product) {
  61. $this->error('产品不存在');
  62. }
  63. $price = $product->price; //TODO 1、成交价格还要扣除优惠券;2、产品表加库存;3、生成资金流水;4、开启事务;
  64. Order::create([
  65. 'user_id' => $this->user_id,
  66. 'order_no' => $this->getOrderNo(),
  67. 'num' => $formData['num'],
  68. 'price' => $price,
  69. 'name' => $formData['name'],
  70. 'mobile' => $formData['mobile'],
  71. 'title' => $product->product->title,
  72. 'agent_product_id' => $product->id,
  73. 'product_id' => $product->product_id,
  74. 'status' => 0,
  75. 'pay_type' => $formData['pay_type'],
  76. ]);
  77. return $this->success();
  78. }
  79. //获取应付金额
  80. public function getPrice(Request $request)
  81. {
  82. $id = $request->input('id');
  83. if (!$id || !ctype_digit($id)) {
  84. return $this->error('未指定ID');
  85. }
  86. $num = (float)$request->input('num');
  87. if (!$num || $num < 1) {
  88. return $this->error('未指定产品数量');
  89. }
  90. return $this->success(['price' => $this->calc($id, $num)]);
  91. }
  92. //计算价格
  93. private function calc($agent_id, $num)
  94. {
  95. return 2888.99; // TODO 此处需要详细计算,并扣除优惠价等之后的价格
  96. }
  97. // 生成订单号
  98. private function getOrderNo()
  99. {
  100. list($micro, $sec) = explode(' ', microtime());
  101. return date('YmdHis', $sec) . str_pad(floor($micro * 1000000), 6, 0, STR_PAD_LEFT) . mt_rand(100, 999);
  102. }
  103. }