| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -4,8 +4,10 @@ namespace App\Http\Controllers\Api; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use App\Http\Controllers\Controller; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use App\Models\AgentProduct; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use App\Models\UserMoneyLog; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use App\Models\Order; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use Illuminate\Http\Request; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use Illuminate\Support\Facades\DB; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					/** | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 * 订单 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -64,54 +66,106 @@ class OrderController extends Controller | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								'num.min' => '购买数量输入错误', | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							$product = AgentProduct::where('id', $formData['id'])->with('product')->first(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if (!$product) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							$agent_product = AgentProduct::query() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								->where('id', $formData['id']) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								->with('coupon') | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								->with('product') | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								->first(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if (!$agent_product || !$agent_product->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'], | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							DB::beginTransaction(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							try { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								$price = $this->calc($agent_product, $formData['num']); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								$title = $agent_product->product->title; //产品标题
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								//增加销量
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								$agent_product->increment('sale', $formData['num']); //代理商产品表销量
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								$agent_product->product->increment('sale', $formData['num']); //供应商产品表
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								// 存入订单表
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								$order = Order::query()->create([ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'user_id' => $this->user_id, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'order_no' => $this->getOrderNo(), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'num' => $formData['num'], | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'price' => $price, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'name' => $formData['name'], | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'mobile' => $formData['mobile'], | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'title' => $title, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'agent_product_id' => $agent_product->id, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'product_id' => $agent_product->product_id, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'status' => 0, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'pay_type' => $formData['pay_type'], | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								//资金流水
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								UserMoneyLog::query()->create([ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'user_id' => $this->user_id, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'agent_id' => $this->agent_id, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'money' => -$price, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'order_id' => $order->id, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'type' => 1, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'desc' => '购买产品:' . $title, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									'created_at' => time(), //已关闭模型自动写入时间
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								DB::commit(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} catch (\Exception $e) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								DB::rollBack(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return $e->getMessage(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return $this->success(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						//获取应付金额
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						public function getPrice(Request $request) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							$id = $request->input('id'); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if (!$id || !ctype_digit($id)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return $this->error('未指定ID'); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							$id = (int)$request->input('id'); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							$num = (float)$request->input('num'); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if (!$num || $num < 1) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return $this->error('未指定产品数量'); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return $this->success(['price' => $this->calc($id, $num)]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							$agent_product = AgentProduct::query() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								->with(['coupon' => fn($query) => $query->select('*')]) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								->find($id); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							$final_price = $this->calc($agent_product, $num); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return $this->success(['price' => $final_price]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						//计算价格
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						private function calc($agent_id, $num) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/** | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						 * 计算最终价格(扣除优惠券之后的价格) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						 * @param $agent_product | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						 * @param $num | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						 * @return float | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						 */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						private function calc($agent_product, $num) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return 2888.99; // TODO 此处需要详细计算,并扣除优惠价等之后的价格
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							$total_price = $agent_product->price * $num; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							//没有任何优惠券时直接返回最终价
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if ($agent_product->coupon->isEmpty()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return $total_price; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							$coupon = $agent_product->coupon->toArray(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							foreach ($coupon as $v) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if ($v['type'] == 1 && !empty($v['detail']['full']) && !empty($v['detail']['reduction'])) { //满减
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									if ($total_price >= $v['detail']['full']) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										$total_price -= $v['detail']['reduction']; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} else if ($v['type'] == 2 && !empty($v['detail']['discount'])) { //打折
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									$total_price *= $v['detail']['discount']; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return round($total_price, 2); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// 生成订单号
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						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); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							$micro = str_pad(floor($micro * 1000000), 6, 0, STR_PAD_LEFT); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return date('YmdHis', $sec) . $micro . mt_rand(100, 999); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} |