hasMany(OrderGoods::class, 'order_id', 'id')->field('goods_id,item_value,goods_name,goods_img,brand_name,goods_num,goods_price,total_price,order_id,id'); } //订单用户 public function user() { return $this->hasOne('user', 'id', 'user_id') ->field('id,sn,nickname,avatar,mobile,create_time'); } //收货地址 public function getDeliveryAddressAttr($value, $data) { $region = Db::name('dev_region') ->where('id', 'IN', [$data['province'], $data['city'], $data['district']]) ->order('level asc') ->column('name'); $region_desc = implode('', $region); return $region_desc . $data['address']; } /** * Notes: 发货操作 * @param $data */ public static function delivery_handle($data) { $order_id = $data['order_id']; $order = Order::get(['id' => $order_id], ['order_goods']); if ($order['invoice_no']){ return true; } //更新订单下商品的发货状态 $order->update_time = time(); $order->shipping_time = time(); $order->order_status = 2; $order->invoice_name = $data['invoice_name']; $order->invoice_no = $data['invoice_no']; $order->save(); $data_info=[ 'user_id' => $order['user_id'], 'order_id' => $order['id'], 'scene' =>101, 'shipping_name' => $data['invoice_name'], 'invoice_no' => $data['invoice_no'], 'time' => date('Y-m-d H:i:s') ]; Notice::noticeByScene($order['user_id'],$data_info); } /** * Notes: 结算详情 * @param $post * @param $user_id * @return array */ public static function info($post, $user_id) { try{ $goods =Db::name('cart') ->alias('c') ->field("mi.thumb_image as goods_img,g.name as goods_name,g.price as goods_price,g.id as goods_id,gb.name as brand_name,c.goods_num,item_value,g.status,g.stock,g.original_price") ->join('goods g', 'g.id = c.goods_id') ->join('goods_brand gb', 'gb.id= g.brand_id') ->join('mall_image mi', 'mi.union_id= c.goods_id and is_cover=1 and mi.type=1', 'LEFT') ->where(array('c.user_id'=>$user_id,'selected'=>1)) ->select(); $goods_lists = array(); $total_num = 0;//商品总数量 $total_goods_price = 0;//商品总金额 $img_url=ShopConfig::get('website', 'img_url'); foreach ($goods as $good) { $good['sub_price'] = round($good['goods_price'] * $good['goods_num'], 2); $good['goods_img'] = $good['goods_img']; $good['goods_img_url'] = $img_url.$good['goods_img']; $goods_item=Db::name('goods_item')->where(array('spec_value'=>$good['item_value'],'goods_id'=>$good['goods_id']))->find(); $good['stock'] =$goods_item['stock']; $goods_lists[] = $good; //订单汇总信息 $total_num += $good['goods_num']; $total_goods_price += $good['goods_price'] * $good['goods_num']; } if (empty($goods_lists)) { $data=[ 'code' =>0, 'msg' =>'购物车无商品', 'data' =>'', ]; return $data; } //用户地址 $user_address = UserAddress::getOrderUserAddress($post, $user_id); //订单金额 $total_amount = $total_goods_price; //订单应付金额 $order_amount = $total_goods_price; if ($order_amount <= 0){ $order_amount = 0; } $result = [ 'goods_lists' => array_values($goods_lists), 'total_num' => $total_num,//订单总数量 'total_goods_price' => round($total_goods_price, 2),//订单商品总价 'total_amount' => round($total_amount, 2),//订单总价(商品价格,运费,优惠券等) 'order_amount' => round($order_amount, 2),//订单应付价格 'address' => $user_address, 'remark' => $post['remark'] ?? '', ]; $data=[ 'code' =>1, 'msg' =>'', 'data' =>$result, ]; return $data; } catch (Exception $e) { $data=[ 'code' =>0, 'msg' =>$e->getMessage(), 'data' =>'', ]; return $data; } } /** * Notes: 添加订单 * @param $user_id * @param $data * @param $post */ public static function add($user_id, $data, $post) { Db::startTrans(); try { $goods_lists = $data['goods_lists']; if (empty($data['goods_lists'])) { $data=[ 'code' =>0, 'msg' =>'购物车无商品', 'data' =>'', ]; return $data; } $user_address = $data['address']; $user = User::get($user_id); if (empty($data['address'])) { $data=[ 'code' =>0, 'msg' =>'请选择收货地址', 'data' =>'', ]; return $data; } $order = self::addOrder($user_id, $data, $user_address); $order_id = $order['order_id']; $addOrderGoods=self::addOrderGoods($order_id, $goods_lists); if($addOrderGoods['code']==0){ return $addOrderGoods; } self::addOrderAfter($order_id, $user_id, $data); Db::commit(); $data=[ 'code' =>1, 'msg' =>'', 'data' =>$order, ]; return $data; } catch (Exception $e) { Db::rollback(); $data=[ 'code' =>0, 'msg' =>$e->getMessage(), 'data' =>'', ]; return $data; } } /** * Notes: 添加订单记录 * @param $user_id * @param $data * @param $user_address * @param array $extra */ public static function addOrder($user_id, $data, $user_address) { $order_data = [ 'order_sn' => createSn('order', 'order_sn', '', 4), 'user_id' => $user_id, 'consignee' => $user_address['contact'], 'province' => $user_address['province_id'], 'city' => $user_address['city_id'], 'district' => $user_address['district_id'], 'address' => $user_address['address'], 'mobile' => $user_address['telephone'], 'total_goods_price' => $data['total_goods_price'], 'order_amount' => $data['order_amount'],//应付金额 'total_amount' => $data['total_amount'],//订单总金额 'total_num' => $data['total_num'],//订单商品数量 'user_remark' => $data['remark'], 'create_time' => time(), ]; $order_id = Db::name('order')->insertGetId($order_data); return [ 'order_id' => $order_id, 'order_sn' => $order_data['order_sn'], 'order_amount' => $order_data['order_amount'], ]; } /** * Notes: 添加订单商品记录 * @param $order_id * @param $goods_lists */ public static function addOrderGoods($order_id, $goods_lists) { foreach ($goods_lists as $k1 => $good) { //商品验证 if ($good['status'] != 1) { $data=[ 'code' =>0, 'msg' =>'包含不存在或已下架的商品,无法下单', 'data' =>'', ]; return $data; } if ($good['goods_num'] > $good['stock']) { $data=[ 'code' =>0, 'msg' =>'商品库存不足,无法下单', 'data' =>'', ]; return $data; } $goods_data[] = [ 'order_id' => $order_id, 'goods_id' => $good['goods_id'], 'goods_img' => $good['goods_img'], 'item_value' => $good['item_value'], 'brand_name' => $good['brand_name'], 'goods_name' => $good['goods_name'], 'goods_num' => $good['goods_num'], 'goods_price' => $good['goods_price'],//商品价格单价(未扣减优惠和积分价格) 'total_price' => $good['goods_price'] * $good['goods_num'], 'original_price' => $good['original_price'] ?? 0,//商品原始价格 'create_time' => time(), ]; } Db::name('order_goods')->insertAll($goods_data); $data=[ 'code' =>1, 'msg' =>'', 'data' =>'', ]; return $data; } /** * Notes: 下单后操作 * @param $order_id * @param $user_id * @param $type * @param $data */ public static function addOrderAfter($order_id, $user_id, $data) { $goods_data = $data['goods_lists']; //下单时扣减商品库存 OrderGoods::decStock($goods_data); //删除购物车商品 $cart_items = array_column($goods_data, 'item_value'); Db::name('cart')->where([ ['user_id', '=', $user_id], ['selected', '=', 1], ['item_value', 'in', $cart_items], ])->delete(); } }