<?php namespace App\Http\Services; use App\Exceptions\InvalidRequestException; use App\Http\Models\User\TaxInfoModel; use App\Models\OrderAddressModel; use App\Models\OrderItemsModel; use App\Models\OrderModel; use App\Models\OrderPriceModel; use App\Models\OrderReturnItemsModel; use App\Models\UserAddressModel; use App\Models\UserModel; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Redis; use App\Models\CartModel; //订单服务层 class OrderService { #收款常量 static $bank_info = [ "paypal" => "Paypal@semour.com", "ttl_bank_name" => "HSBC Hong Kong", "ttl_bank_address" => "1 Queen's Road Central, Hong Kong", "ttl_swift_code" => "HSBCHKHHHKH", "ttl_company_name" => "SEMOUR ELECTRONICS CO., LIMITED", "ttl_account_no" => "819-847187-838", ]; /* * 新增订单 address_id:0 items: [{ "goods_id": 1166788996788323300, //sku_id "buy_number": 2, //购买数量 "buy_price":1.1 //购买单价 "remark":"",//备注 }] */ public static function addOrder($data, $user_id) { $shipping_address_id = $data["shipping_address_id"]; //收货地址 $billing_address_id = $data["billing_address_id"]; //账单地址 $items = json_decode(\Arr::get($data, 'items', []),true); //查询用户详情 $userInfo = UserModel::getUserInfo($user_id); $order_sn = self::createOrderSn(); try{ $con = DB::connection(); $redis = Redis::connection(); $con->beginTransaction(); #订单主表 $mainData =[ "order_sn"=>$order_sn, "user_id"=>$user_id, "creator_uid"=>$user_id, "company_name"=>$userInfo["company_name"], "sale_id"=>$userInfo["sale_id"], "sale_name"=>$userInfo["sale_name"], "exchange_rate"=>getRate(), "currency"=>2, "create_time"=>time(), "update_time"=>time(), ]; $order_id = OrderModel::insertGetId($mainData); if (!$order_id){ throw new InvalidRequestException("error:order main"); } #订单地址 $shippingAddress = UserAddressModel::where("address_id",$shipping_address_id)->first(); $billingAddress = UserAddressModel::where("address_id",$billing_address_id)->first(); if (!$shippingAddress || !$billingAddress){ throw new InvalidRequestException("error: Address"); } $addressData =[[ "address_id"=>$shipping_address_id, "user_id"=>$user_id, "order_id"=>$order_id, "address_type"=>\Arr::get($shippingAddress,"address_type",0), "order_address_type"=>1, //收货信息 "consignee"=>\Arr::get($shippingAddress,"first_name","")." ".\Arr::get($shippingAddress,"last_name",""), "company_name"=>\Arr::get($shippingAddress,"company_name",""), "email"=>\Arr::get($shippingAddress,"email",""), "post_code"=>\Arr::get($shippingAddress,"post_code",""), "phone"=>\Arr::get($shippingAddress,"phone",""), "country_name"=>\Arr::get($shippingAddress,"country_name","") , "country"=>\Arr::get($shippingAddress,"country",""), "province"=>\Arr::get($shippingAddress,"province",""), "city"=>\Arr::get($shippingAddress,"city",""), "detail_address"=>\Arr::get($shippingAddress,"detail_address",""), "create_time"=>time(), "update_time"=>time(), ],[ "address_id"=>$billing_address_id, "user_id"=>$user_id, "order_id"=>$order_id, "address_type"=>\Arr::get($billingAddress,"address_type",0), "order_address_type"=>2, //账单邮寄信息 "consignee"=>\Arr::get($billingAddress,"first_name","")." ".\Arr::get($billingAddress,"last_name",""), "company_name"=>\Arr::get($billingAddress,"company_name",""), "email"=>\Arr::get($billingAddress,"email",""), "post_code"=>\Arr::get($billingAddress,"post_code",""), "phone"=>\Arr::get($billingAddress,"phone",""), "country_name"=>\Arr::get($billingAddress,"country_name","") , "country"=>\Arr::get($billingAddress,"country",""), "province"=>\Arr::get($billingAddress,"province",""), "city"=>\Arr::get($billingAddress,"city",""), "detail_address"=>\Arr::get($billingAddress,"detail_address",""), "create_time"=>time(), "update_time"=>time(), ] ]; $order_address_id = OrderAddressModel::insert($addressData); if (!$order_address_id){ throw new InvalidRequestException("error:order address"); } #订单明细 $goodsInfoArr = ThirdService::getSemourData("goods_info",implode(",",array_column($items,"goods_id"))); $orderItems = []; //订单商品明细 $orderAmount = 0; foreach ($items as $v) { $goods_id = $v['goods_id']; $skuInfo = $goodsInfoArr[$goods_id]; //sku详情 $cartInfo = CartModel::where(["user_id"=>$user_id,"goods_id"=>(string)$goods_id,"status"=>1])->first(); $buy_number = $v["buy_number"]; $buy_price = $v["buy_price"]; $orderAmount += round($buy_number*$buy_price,2); $standard_brand = data_get($skuInfo,"standard_brand"); #查询英文品牌缩写 $brandName = $skuInfo["brand_name"]; $standard_brand_id = \Arr::get($standard_brand,"standard_brand_id",0); $standardBrandInfo = ThirdService::getSemourData("standard_brand",$standard_brand_id); if ($standardBrandInfo){ $standardBrandInfoArr = json_decode($standardBrandInfo,true); #深贸商城的品牌字段需展示该SKU对应基石标准品牌列表的英文简称,无则取英文名称、都无则取品牌名称 if ($standardBrandInfoArr["brand_short_name_en"]){ $brandName = $standardBrandInfoArr["brand_short_name_en"]; }else if ($standardBrandInfoArr["brand_name_en"]){ $brandName = $standardBrandInfoArr["brand_name_en"]; } } //订单明细 $orderItems[] = [ "order_id"=>$order_id, //订单ID "user_id"=>$user_id, //用户ID "goods_id"=>$goods_id, //商品ID "supplier_id"=>\Arr::get($skuInfo,"supplier_id",0), //供应商ID(=company_id) "brand_id"=>$skuInfo["brand_id"], //品牌ID "standard_brand_id"=>$standard_brand_id, //标准品牌ID "goods_name"=>\Arr::get($skuInfo,"goods_name",0), //型号 "class_id2"=>\Arr::get($skuInfo,"class_id2",0), //商品二级分类id "batch"=>\Arr::get($skuInfo,"batch_sn",0), //批次 "class_id2_name"=>"", //商品二级分类名称 "supplier_name"=>\Arr::get($skuInfo,"supplier_name",0), //供应商名(=company_name) "brand_name"=>$brandName, //品牌名 "standard_brand_name"=>\Arr::get($standard_brand,"brand_name",""), //标准品牌 "goods_type"=>2, //商品类型 联营:1专卖 2联营 自营 :3自营 4寄售 5第三方仓库 "goods_number"=>$buy_number, //购买数量 "goods_price"=>$buy_price, //商品单价 "goods_unit"=>"pcs", //商品单位 "delivery_time"=>\Arr::get($skuInfo,"hk_delivery_time",""), //交货时间 "canal"=>\Arr::get($skuInfo,"canal",""), //渠道标签 "initial_price"=>\Arr::get($v,"buy_price",0), //原始销售价格 "purchase_uid"=>0, //采购员id(内部账户系统id) "purchase_name"=>"", //采购员 "contract_remark"=>"", //合同备注 6个汉子 "tax_rate"=>0, //税率 "raw_goods_sn"=>\Arr::get($cartInfo,"raw_goods_sn",0), //DGK原始编码 "raw_goods_packing"=>\Arr::get($cartInfo,"raw_goods_packing",0), //DGK原始包装 "raw_brand_name"=>\Arr::get($cartInfo,"raw_brand_name",0), //DGK原始品牌名称 "discount_amount"=>0, //折扣金额 "other_amount"=>0, //其它费用金额 "remarks"=>$v["remark"], //客户备注 ]; if ($cartInfo){ #扣减购物车库存 $temp["status"] = $v["buy_number"] > 0 ? CartModel::status_yes:CartModel::status_no; $temp["create_time"] = time(); $temp["update_time"] = time(); $cartUpdate = CartModel::where("cart_id",$cartInfo["cart_id"])->update($temp); if (!$cartUpdate){ throw new InvalidRequestException("error:update cart"); } } } $itemFlag = OrderItemsModel::insert($orderItems); if (!$itemFlag){ throw new InvalidRequestException("error:order items"); } #插入收款信息 $priceData = [ "order_id"=>$order_id, //用户ID "order_sn"=>$order_sn, // "price"=>$orderAmount, // "price_type"=>1, //金额类型(正数ID大于0,负数ID小于0)-8活动优惠 -7支付优惠 -6运费优惠 -5尾款减款 -4优惠券优惠金额 -3尾款 -2预付款 -1付款,1货款 2附加费 3运费 4退款 5支付手续费 "create_time"=>time(), //添加时间 ]; $priceFlag = OrderPriceModel::insert($priceData); if (!$priceFlag){ throw new InvalidRequestException("error:order price"); } #更新订单总额 $orderFlag = OrderModel::where("order_id",$order_id)->update(["order_amount"=>$orderAmount,"update_time"=>time()]); if (!$orderFlag){ throw new InvalidRequestException("error:order update"); } $con->commit(); return $order_id; }catch (\Exception $e){ $con->rollback(); throw new InvalidRequestException($e->getMessage()); } } //生成订单单号 public static function createOrderSn($pre = "SE"){ $order_sn = $pre.date("Ymd").rand(1000,9999); $check = OrderModel::getOrderInfo(["order_sn"=>$order_sn]); if ($check){ self::createOrderSn(); } return $order_sn; } /* * 个人所有订单列表 */ public static function orderLists($user_id,$param){ $query = OrderModel::with('order_items') ->select([ 'order_id', 'order_sn', 'order_amount', 'status', 'create_time', ]) ->orderBy('order_id', 'desc'); $query->where("user_id",$user_id); #拼接搜索 foreach ($param as $a => $b) { $b = trim($b); $a = trim($a); if (empty($b)) { continue; } switch ($a) { case "order_sn": // case "order_id": // case "status": // $query->where($a,$b); break; case "goods_name": // $query->whereHas('order_items', function ($q) use ($b) { $q->where('goods_name', $b); }); break; } } $res = $query->paginate(\Arr::get($param,"page_size",10), ['*'], 'page',\Arr::get($param,"page",1) )->toArray(); if (!$res){ return false; } $result = $res["data"]; $orderAddressArr = OrderAddressModel::whereIn("order_id", array_column($result, "order_id"))->get()->keyBy("order_address_type")->toArray(); //地址信息 $temp = []; foreach ($result as $k=>$v){ $order_id = $v["order_id"]; $items = OrderItemsModel::where("order_id",$order_id)->get()->toArray(); $receiveAddress = \Arr::get($orderAddressArr,OrderAddressModel::order_address_type_receive,[]); $piaoAddress = \Arr::get($orderAddressArr,OrderAddressModel::order_address_type_piao,[]); $merchandise_total = 0; //商品总额 foreach ($items as $a=>$b){ $ext_price = round($b["goods_number"]*$b["goods_price"],2); $merchandise_total += $ext_price; } $merchandise_total = round($merchandise_total,2); $priceInfo = OrderPriceModel::selectRaw("price_type,price") ->where("order_id",$order_id) ->get()->toArray(); //金额类型(正数ID大于0,负数ID小于0)-8活动优惠 -7支付优惠 -6运费优惠 -5尾款减款 -4优惠券优惠金额 -3尾款 -2预付款 -1付款,1货款 2附加费 3运费 4退款 5支付手续费 $priceArr = array_column($priceInfo,"price","price_type"); # $sub_total = OrderPriceModel::getOrderSubTotal($order_id); $payment_surcharge_paypal = round($merchandise_total*0.046+0.5,2); $ts =[ "order_id"=>$order_id, "order_sn"=>$v["order_sn"], "order_amount"=>$v["order_amount"], "goods_name_arr"=>array_column($items,"goods_name"), "status"=>$v["status"], "status_en"=>\Arr::get(OrderModel::$status,$v["status"],""), "receiver"=>\Arr::get($receiveAddress,"consignee"), "email"=>\Arr::get($receiveAddress,"email"), "phone"=>\Arr::get($receiveAddress,"phone"), "shipping_address"=>\Arr::get($receiveAddress,"detail_address"), "shipping"=>\Arr::get($priceArr,3,0), //运费 "payment_surcharge_paypal"=>$payment_surcharge_paypal, //paypal 支付手续费 "payment_surcharge_ttl"=>35, //ttl 支付手续费 "merchandise_total"=>$merchandise_total, //商品总额 "create_time"=>date('Y-m-d H:i:s', $v['create_time']), //下单时间 "over_time"=> date('Y-m-d H:i:s', $v['create_time']+48*3600), //截止时间 ]; $ts["sub_total_payal"] = round($ts["payment_surcharge_paypal"]+$merchandise_total+$ts["shipping"],2); //paypal 小计 $ts["sub_total_ttl"] = round($ts["payment_surcharge_ttl"]+$merchandise_total+$ts["shipping"],2); //ttl 小计 $temp[] = $ts; } #统计当前用户各个状态数量 $orderCount = OrderModel::select(DB::raw('count(*) as num, status')) ->where("user_id",$user_id) ->groupBy('status') ->get() ->keyby("status") ->toArray(); $statusCount[0] = OrderModel::where(["user_id"=>$user_id])->count(); foreach (OrderModel::$status as $k=>$v){ $statusCount[$k] = \Arr::get(\Arr::get($orderCount,$k),"num",0); } return [ "order_count"=>$statusCount, "bank_info"=>self::$bank_info, "total"=> $res["total"], //返回总条数 "page"=>$res["current_page"], //第几页 "page_size"=> \Arr::get($param,"page_size",10), //每页多少条 "lists"=>$temp //数据列表 ]; } /* * 取消订单 */ public static function cancelOrder($user_id,$order_id){ if (!$order_id){ return [1001,"error:order_id no empty"]; } $where["order_id"] = $order_id; if ($user_id >0){ $where["user_id"] = $user_id; } $orderInfo = OrderModel::getOrderInfo($where); if (!$orderInfo || $orderInfo["status"] > OrderModel::status_waiting_delivery){ return [1003,"error:order status"]; } $flag = OrderModel::where("order_id",$order_id)->update(["status"=>OrderModel::status_cancel,"update_time"=>time()]); return $flag ? [0,"Cancel order success"]:[1002,"Cancel order failed"]; } /* * 订单详情 */ public static function orderDetail($user_id,$order_id){ $where["order_id"] = $order_id; if ($user_id >0){ // $where["user_id"] = $user_id; } $orderInfo = OrderModel::getOrderInfo($where); if (!$orderInfo){ return false; } $items = OrderItemsModel::where("order_id",$order_id)->get()->toArray(); //商品详情 $orderAddressArr = OrderAddressModel::selectRaw("consignee,company_name,email,phone,detail_address,shipping_sn,shipping_name,order_address_type") ->where("order_id",$order_id) ->get() ->keyBy("order_address_type")->toArray(); //地址信息,1收货信息 2账单邮寄信息 $goodsInfoArr = ThirdService::getSemourData("goods_info",implode(",",array_column($items,"goods_id"))); //商品详情 $itemsTemp = []; $merchandise_total = 0; //商品总额 foreach ($items as $k=>$v){ $goods_id = $v["goods_id"]; $oneInfo = \Arr::get($goodsInfoArr,$goods_id,[]); $ext_price = round($v["goods_number"]*$v["goods_price"],2); $itemsTemp[] = [ "id"=>$k+1, "goods_id"=>$v["goods_id"], "goods_name"=>$v["goods_name"], "brand_name"=>$v["brand_name"], "delivery_time"=>changeDeliverToEn($v["delivery_time"]), "pdf"=>\Arr::get($oneInfo,"pdf"), "goods_number"=>$v["goods_number"], "goods_price"=>$v["goods_price"], "ext_price"=>$ext_price, "remarks"=>$v["remarks"], ]; $merchandise_total += $ext_price; } $priceInfo = OrderPriceModel::selectRaw("price_type,price") ->where("order_id",$order_id) ->get()->toArray(); //金额类型(正数ID大于0,负数ID小于0)-8活动优惠 -7支付优惠 -6运费优惠 -5尾款减款 -4优惠券优惠金额 -3尾款 -2预付款 -1付款,1货款 2附加费 3运费 4退款 5支付手续费 $priceArr = array_column($priceInfo,"price","price_type"); $temp = [ "order_id"=>$order_id, "order_sn"=>$orderInfo["order_sn"], "order_amount"=>$orderInfo["order_amount"], "sub_total"=>OrderPriceModel::getOrderSubTotal($order_id), //小计 "created_time"=>timeToDate($orderInfo["create_time"]), //创建时间 "reviewed_time"=>timeToDate($orderInfo["confirm_time"]), //审核时间 "paid_time"=>timeToDate($orderInfo["pay_time"]), //支付时间 "delivered_time"=>timeToDate($orderInfo["shipping_time"]), //发货时间 "received_time"=>"", //收货时间 "cancel_time"=>timeToDate($orderInfo["cancel_time"]), //订单取消时间 "finish_time"=>"", //交易成功时间 "shipping"=>\Arr::get($priceArr,3,0), //运费 "payment_surcharge"=>\Arr::get($priceArr,5,0), //支付手续费 "merchandise_total"=>round($merchandise_total,2), //商品总额 "status"=>$orderInfo["status"], "status_en"=>\Arr::get(OrderModel::$status,$orderInfo["status"],""), "shipping_address"=>\Arr::get($orderAddressArr,1,[]), "billing_address"=>\Arr::get($orderAddressArr,2,[]), "items"=>$itemsTemp, ]; return $temp; } //订单售后详情 public static function orderServiceDetail($user_id,$order_id){ $returnItems = OrderReturnItemsModel::where("order_id",$order_id)->get()->toArray(); if (!$returnItems){ return false; } $orderItemsArr = OrderItemsModel::where(["order_id"=>$order_id]) ->wherein("rec_id",array_column($returnItems,"rec_id")) ->get() ->keyby("rec_id") ->toArray(); $temp = []; foreach ($returnItems as $k=>$v){ $recId = $v["rec_id"]; $orderGoodsInfo = \Arr::get($orderItemsArr,$recId); $temp[$recId] = [ "part_no"=>$orderGoodsInfo["goods_name"], // 型号名称 "manufacturer"=>$orderGoodsInfo["brand_name"], // 品牌名称 "price_per_unit"=>$orderGoodsInfo["goods_price"], // 单价 "quantity"=>$orderGoodsInfo["goods_number"], // 购买数量 "subtotal"=>round($orderGoodsInfo["goods_price"]*$orderGoodsInfo["goods_number"],2), // 金额 "type"=>OrderReturnItemsModel::$types[$v["type"]], // 售后类型 "after_sale_quantity"=>$v["return_num"], // 售后数量 "after_sale_price"=>$v["return_price"], // 售后单价 "return_amount"=>$v["return_amount"], // 售后金额 ]; } $return_amount_all = 0; $temp = array_values($temp); foreach ($temp as $c=>&$a){ $a["no"] = $c+1; $return_amount_all += $a["return_amount"]; } return ["return_amount_all"=>$return_amount_all,"items"=>$temp]; } }