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
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							117 lines
						
					
					
						
							3.3 KiB
						
					
					
				
								<?php
							 | 
						|
								
							 | 
						|
								namespace App\Http\Controllers\Api;
							 | 
						|
								
							 | 
						|
								use App\Http\Controllers\Controller;
							 | 
						|
								use App\Models\AgentProduct;
							 | 
						|
								use App\Models\Order;
							 | 
						|
								use Illuminate\Http\Request;
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * 订单
							 | 
						|
								 * Class OrderController
							 | 
						|
								 * @package App\Http\Controllers\Api
							 | 
						|
								 */
							 | 
						|
								class OrderController extends Controller
							 | 
						|
								{
							 | 
						|
									//订单列表
							 | 
						|
								    public function index(Request $request)
							 | 
						|
									{
							 | 
						|
										$formData = $request->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);
							 | 
						|
									}
							 | 
						|
								}
							 |