346 lines
11 KiB
PHP
Executable File
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();
|
|
}
|
|
}
|