dggjimai/application/common/model/Order.php

346 lines
11 KiB
PHP
Executable File

<?php
/**
* 订单模型
*/
namespace app\common\model;
use think\model\concern\SoftDelete;
use think\db;
use app\common\model\ShopConfig;
class Order extends Model
{
use SoftDelete;
public $softDelete = true;
protected $name = 'order';
protected $autoWriteTimestamp = true;
//可搜索字段
protected $searchField = [];
//发货时间获取器
public function getShippingTimeAttr($value)
{
return date('Y-m-d H:i:s',$value);
}
//付款时间获取器
public function getPayTimeAttr($value)
{
return date('Y-m-d H:i:s',$value);
}
//确认收货时间获取器
public function getConfirmTakeTimeAttr($value)
{
return date('Y-m-d H:i:s',$value);
}
//取消时间获取器
public function getCancelTimeAttr($value)
{
return date('Y-m-d H:i:s',$value);
}
//订单状态
public function getOrderStatusTextAttr($value, $data)
{
return self::ORDER_TEXT[$data['order_status']];
}
//订单关联商品
public function orderGoods()
{
return $this->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();
}
}