Laravel订单与订单商品表按供应商拆分订单实现问题
问题排查与修复方案
原有代码问题梳理
- 第一个购物车遍历逻辑中写了
break,循环仅执行1次就终止,仅会生成1条订单,无法适配多供应商场景 - 订单总金额
$total_ht、$total_ttc为全局累加变量,未按供应商维度单独计算,就算移除break,后续生成的供应商订单金额也会包含前面所有供应商的商品金额,计算错误 - 订单商品写入逻辑是全局遍历所有购物车商品,全部写入第一次生成的唯一订单中,完全未实现按供应商拆分订单的需求
- 团购标识
$achat_groupe仅取最后一个购物车商品的属性赋值,逻辑错误,应该按商品维度判断
修复后代码
public function validation_commande(Request $request){ $utilisateur = Utilisateur::where('id','=',session('utilisateur'))->first(); $paniers = Panier::where('utilisateur_id','=',$utilisateur->id)->get(); $utilisateur_id = $utilisateur->id; $mode_paiement_id = 4; $adresse = Adresse::where('utilisateur_id','=',$utilisateur_id) ->where('adresse_par_defaut','=',1) ->first(); $nombre_produit_panier = count($paniers); if($nombre_produit_panier >= 1) { // 按供应商ID分组购物车商品 $paniersParFournisseur = $paniers->groupBy(function ($item) { return $item->produit->utilisateur_id; }); foreach ($paniersParFournisseur as $fournisseurId => $produitsGroupe) { // 单独计算当前供应商订单的总金额 $total_ht = 0; $total_ttc = 0; foreach ($produitsGroupe as $c) { $total_ht += $c->produit->prix_total($c->quantite); $total_ttc += $c->produit->prix_total_ttc($c->quantite); } // 生成当前供应商对应的独立订单 $commande = Commande::create([ 'utilisateur_id'=>$utilisateur_id, 'fournisseur_id'=>$fournisseurId, 'boutique_id'=>$produitsGroupe->first()->produit->boutique_id, 'statut'=>'en_cours_de_traitement', 'statut_fournisseur'=>'pas_encore_vue_sa_commande', 'total_ht'=>$total_ht, 'total_ttc'=>$total_ttc, 'mode_paiement_id'=>$mode_paiement_id, 'adresse_id'=>$adresse->id, 'date_commande'=>now() ]); // 写入当前供应商对应订单的所有商品 foreach ($produitsGroupe as $c) { $achat_groupe = $c->achat_groupe == 1 ? 1 : 0; CommandeProduit::create([ 'commande_id'=>$commande->id, 'produit_id'=>$c->produit->id, 'prix_ht'=>$c->produit->prix_sans_taxe($c->quantite), 'prix_ttc'=>$c->produit->prix($c->quantite), 'quantite'=>$c->quantite, 'utilisateur_id'=>$utilisateur->id, 'fournisseur_id'=>$fournisseurId, 'boutique_id'=>$c->produit->boutique_id, 'achat_groupe'=>$achat_groupe, 'date_creation'=>now() ]); } // 若需给每个供应商单独发邮件通知,可在此处放开对应注释 $lien_button = env('APP_URL').'/mes-commandes-b/'; $data = [ 'subject' => "Nouvelle commande", 'titre_page' => 'Vous avez reçu une nouvelle commande', 'message' => 'Vous avez reçu une nouvelle commande sur votre espace Market Makers', 'lien_button' => $lien_button, 'message_button' => 'Voir' ]; // Mail::to($produitsGroupe->first()->produit->utilisateur->email)->send(new NotificationMail($data,$produitsGroupe->first()->produit->utilisateur)); } // 全局通知逻辑 $message_a_envoye = "**** Market Makers **** \n \n"; $message_a_envoye .= "Une nouvelle commande vient d'arriver"; $this->telegram_send_2(urlencode($message_a_envoye)); Session::flash('success','Votre commande a bien été effectué avec succès'); Panier::where('utilisateur_id', $utilisateur->id)->delete(); $request->session()->put('venue_du_panier',null); return redirect(route('mes-commandes')); } else { return redirect(route('mes-commandes')); } }
内容的提问来源于stack exchange,提问作者Dassoah Maixent
相关产品推荐
相关产品推荐

