| 
					
					
						
							
						
					
					
				 | 
				@ -4,8 +4,10 @@ namespace App\Http\Controllers\Api; | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				use App\Http\Controllers\Controller; | 
				 | 
				 | 
				use App\Http\Controllers\Controller; | 
			
		
		
	
		
			
				 | 
				 | 
				use App\Models\AgentProduct; | 
				 | 
				 | 
				use App\Models\AgentProduct; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				use App\Models\UserMoneyLog; | 
			
		
		
	
		
			
				 | 
				 | 
				use App\Models\Order; | 
				 | 
				 | 
				use App\Models\Order; | 
			
		
		
	
		
			
				 | 
				 | 
				use Illuminate\Http\Request; | 
				 | 
				 | 
				use Illuminate\Http\Request; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				use Illuminate\Support\Facades\DB; | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				/** | 
				 | 
				 | 
				/** | 
			
		
		
	
		
			
				 | 
				 | 
				 * 订单 | 
				 | 
				 | 
				 * 订单 | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -64,54 +66,106 @@ class OrderController extends Controller | 
			
		
		
	
		
			
				 | 
				 | 
							'num.min' => '购买数量输入错误', | 
				 | 
				 | 
							'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('产品不存在'); | 
				 | 
				 | 
							$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(); | 
				 | 
				 | 
						return $this->success(); | 
			
		
		
	
		
			
				 | 
				 | 
					} | 
				 | 
				 | 
					} | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
					//获取应付金额
 | 
				 | 
				 | 
					//获取应付金额
 | 
			
		
		
	
		
			
				 | 
				 | 
					public function getPrice(Request $request) | 
				 | 
				 | 
					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'); | 
				 | 
				 | 
						$num = (float)$request->input('num'); | 
			
		
		
	
		
			
				 | 
				 | 
						if (!$num || $num < 1) { | 
				 | 
				 | 
						if (!$num || $num < 1) { | 
			
		
		
	
		
			
				 | 
				 | 
							return $this->error('未指定产品数量'); | 
				 | 
				 | 
							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() | 
				 | 
				 | 
					private function getOrderNo() | 
			
		
		
	
		
			
				 | 
				 | 
					{ | 
				 | 
				 | 
					{ | 
			
		
		
	
		
			
				 | 
				 | 
						list($micro, $sec) = explode(' ', microtime()); | 
				 | 
				 | 
						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); | 
			
		
		
	
		
			
				 | 
				 | 
					} | 
				 | 
				 | 
					} | 
			
		
		
	
		
			
				 | 
				 | 
				} | 
				 | 
				 | 
				} |