diff --git a/app/Http/Controllers/Api/OrderController.php b/app/Http/Controllers/Api/OrderController.php new file mode 100644 index 0000000..f9f6281 --- /dev/null +++ b/app/Http/Controllers/Api/OrderController.php @@ -0,0 +1,117 @@ +only(['page', 'status']); + $request->validate([ + 'page' => 'regex:/^\d+$/', + 'status' => 'integer' + ], [ + 'page.regex' => '页码错误', + 'status.integer' => '未指定订单状态' + ]); + + if (array_key_exists('status', $formData) && $formData['status'] !== null) { + $where['status'] = $formData['status']; + } + $where['user_id'] = $this->user_id; + + $list = Order::where($where) + ->with(['product' => fn($query) => $query->select('id', 'title', 'pictures')]) + ->select('id', 'product_id', 'price', 'num', 'created_at') + ->orderBy('id', 'DESC') + ->simplePaginate(15); + return $this->success($list); + } + + public function create(Request $request) + { + $formData = $request->only(['id', 'name', 'mobile', 'pay_type', 'num']); + $formData = array_map(fn($v) => trim($v), $formData); //过滤,删除首尾空 + + //表单验证 + $request->validate([ + 'id' => ['required', 'regex:/^\d+$/'], + 'name' => ['required', 'between:2,20'], + 'mobile' => ['required', 'regex:/^1[3-9]\d{9}$/'], + 'pay_type' => ['required', 'in:0,1,2'], + 'num' => ['required', 'min:1'], + ], [ + 'id.required' => '未指定产品ID', + 'name.required' => '请输入联系人姓名', + 'mobile.required' => '请输入联系手机号', + 'id.regex' => '产品ID错误', + 'name.between' => '联系人姓名在2~20字符之间', + 'mobile.regex' => '请输入11位手机号', + 'pay_type.required' => '请选择支付方式', + 'pay_type.in' => '不存在此支付方式', + 'num.required' => '请输入购买数量', + 'num.min' => '购买数量输入错误', + ]); + + $product = AgentProduct::where('id', $formData['id'])->with('product')->first(); + if (!$product) { + $this->error('产品不存在'); + } + + $price = $product->price; //TODO 1、成交价格还要扣除优惠券;2、产品表加库存;3、生成资金流水;4、开启事务; + Order::create([ + 'user_id' => $this->user_id, + 'order_no' => $this->getOrderNo(), + 'num' => $formData['num'], + 'price' => $price, + 'name' => $formData['name'], + 'mobile' => $formData['mobile'], + 'title' => $product->product->title, + 'agent_product_id' => $product->id, + 'product_id' => $product->product_id, + 'status' => 0, + 'pay_type' => $formData['pay_type'], + ]); + return $this->success(); + } + + //获取应付金额 + public function getPrice(Request $request) + { + $id = $request->input('id'); + if (!$id || !ctype_digit($id)) { + return $this->error('未指定ID'); + } + + $num = (float)$request->input('num'); + if (!$num || $num < 1) { + return $this->error('未指定产品数量'); + } + + return $this->success(['price' => $this->calc($id, $num)]); + } + + //计算价格 + private function calc($agent_id, $num) + { + return 2888.99; // TODO 此处需要详细计算,并扣除优惠价等之后的价格 + } + + // 生成订单号 + private function getOrderNo() + { + list($micro, $sec) = explode(' ', microtime()); + return date('YmdHis', $sec) . str_pad(floor($micro * 1000000), 6, 0, STR_PAD_LEFT) . mt_rand(100, 999); + } +}