Browse Source

1、关联查询指定字段代码简化;2、增加订单详情方法;3、增加10分钟内未付款提示,超时订单设置状态为-1取消;4、增加库存判断;5、订单提交时增加picture/agent_product_id/product_id/coupon_id四个字段;

dev
李可松 4 years ago
parent
commit
c325414e99
  1. 104
      app/Http/Controllers/Api/OrderController.php

104
app/Http/Controllers/Api/OrderController.php

@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\AgentProduct; use App\Models\AgentProduct;
use App\Models\Coupon;
use App\Models\UserMoneyLog; use App\Models\UserMoneyLog;
use App\Models\Order; use App\Models\Order;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@ -22,25 +23,48 @@ class OrderController extends Controller
$formData = $request->only(['page', 'status']); $formData = $request->only(['page', 'status']);
$request->validate([ $request->validate([
'page' => 'regex:/^\d+$/', 'page' => 'regex:/^\d+$/',
'status' => 'integer'
'status' => 'nullable|integer'
], [ ], [
'page.regex' => '页码错误', 'page.regex' => '页码错误',
'status.integer' => '未指定订单状态'
'status.integer' => '订单状态错误'
]); ]);
if (array_key_exists('status', $formData) && $formData['status'] !== null) {
if (isset($formData['status'])) {
$where['status'] = $formData['status']; $where['status'] = $formData['status'];
} }
$where['user_id'] = $this->user_id; $where['user_id'] = $this->user_id;
$list = Order::where($where)
->with(['product' => fn($query) => $query->select('id', 'title', 'pictures')])
->select('id', 'product_id', 'price', 'num', 'created_at')
$order_list = Order::where($where)
->with('product:id,title,pictures')
->select('id', 'product_id', 'price', 'num', 'status', 'created_at')
->orderBy('id', 'DESC') ->orderBy('id', 'DESC')
->simplePaginate(15);
return $this->success($list);
->simplePaginate(15)
->toArray();
$time = time();
$timeout_ids = [];
//10分钟内未付款订单提示付款
foreach ($order_list['data'] as &$v) {
if ($v['status'] == 0) {
$minute = $time - $v['created_at'];
//订单创建后10分钟内未付款则提示,否则取消订单
if ($minute < 600) {
$v['status_text'] = '请在' . ceil($minute / 60) . '分钟内付款';
} else {
$timeout_ids[] = $v['id'];
$v['status'] = -1;
$v['status_text'] = '已取消';
}
}
}
//超时订单设置为已取消
Order::query()->whereIn('id', $timeout_ids)->update(['status' => -1]);
return $this->success($order_list);
} }
//提交订单
public function create(Request $request) public function create(Request $request)
{ {
$formData = $request->only(['id', 'name', 'mobile', 'pay_type', 'num']); $formData = $request->only(['id', 'name', 'mobile', 'pay_type', 'num']);
@ -66,22 +90,36 @@ class OrderController extends Controller
'num.min' => '购买数量输入错误', 'num.min' => '购买数量输入错误',
]); ]);
$agent_product = AgentProduct::query()
$ap = AgentProduct::query()
->where('id', $formData['id']) ->where('id', $formData['id'])
->with('coupon') ->with('coupon')
->with('product') ->with('product')
->first(); ->first();
if (!$agent_product || !$agent_product->product) {
if (!$ap || !$ap->product) {
$this->error('产品不存在'); $this->error('产品不存在');
} }
if ($ap->product->stock < $formData['num']) {
$this->error('对不起,库存不足');
}
$coupon_ids = [];
if ($ap->coupon) {
foreach ($ap->coupon as $v) {
$coupon_ids[] = $v['id'];
}
}
DB::beginTransaction(); DB::beginTransaction();
try { try {
$price = $this->calc($agent_product, $formData['num']);
$title = $agent_product->product->title; //产品标题
//增加销量
$agent_product->increment('sale', $formData['num']); //代理商产品表销量
$agent_product->product->increment('sale', $formData['num']); //供应商产品表
$price = $this->calc($ap, $formData['num']);
$title = $ap->product->title; //产品标题
//代理商产品表增加销量
$ap->increment('sale', $formData['num']);
//供应商产品表加销量、减库存
$ap->product->sale += $formData['num'];
$ap->product->stock -= $formData['num'];
$ap->product->save();
// 存入订单表 // 存入订单表
$order = Order::query()->create([ $order = Order::query()->create([
@ -92,10 +130,12 @@ class OrderController extends Controller
'name' => $formData['name'], 'name' => $formData['name'],
'mobile' => $formData['mobile'], 'mobile' => $formData['mobile'],
'title' => $title, 'title' => $title,
'agent_product_id' => $agent_product->id,
'product_id' => $agent_product->product_id,
'picture' => $ap->product->picture,
'agent_product_id' => $ap->id,
'product_id' => $ap->product_id,
'status' => 0, 'status' => 0,
'pay_type' => $formData['pay_type'], 'pay_type' => $formData['pay_type'],
'coupon_id' => join(',', $coupon_ids),
]); ]);
//资金流水 //资金流水
@ -128,12 +168,35 @@ class OrderController extends Controller
} }
$agent_product = AgentProduct::query() $agent_product = AgentProduct::query()
->with(['coupon' => fn($query) => $query->select('*')])
->with('coupon:agent_product_id,type,detail,agent_id,start_at,end_at')
->find($id); ->find($id);
$final_price = $this->calc($agent_product, $num); $final_price = $this->calc($agent_product, $num);
return $this->success(['price' => $final_price]); return $this->success(['price' => $final_price]);
} }
//订单详情
public function show()
{
$id = (int)request()->input('id');
$fields = ['id', 'order_no', 'agent_product_id', 'num', 'price', 'title',
'picture', 'status', 'pay_type', 'coupon_id', 'paid_at', 'created_at'];
$order = Order::query()
->where('user_id', $this->user_id)
->find($id, $fields);
if (!$order) {
return $this->error('订单不存在');
}
$order->coupon = Coupon::query()
->whereIn('id', $order->coupon_id)
->where(['agent_id' => $this->agent_id, 'agent_product_id' => $order->agent_product_id,])
->get(['tag']);
return $this->success($order);
}
/** /**
* 计算最终价格(扣除优惠券之后的价格) * 计算最终价格(扣除优惠券之后的价格)
* @param $agent_product * @param $agent_product
@ -150,6 +213,7 @@ class OrderController extends Controller
$coupon = $agent_product->coupon->toArray(); $coupon = $agent_product->coupon->toArray();
foreach ($coupon as $v) { foreach ($coupon as $v) {
// TODO 未判断优惠券有效期
if ($v['type'] == 1 && !empty($v['detail']['full']) && !empty($v['detail']['reduction'])) { //满减 if ($v['type'] == 1 && !empty($v['detail']['full']) && !empty($v['detail']['reduction'])) { //满减
if ($total_price >= $v['detail']['full']) { if ($total_price >= $v['detail']['full']) {
$total_price -= $v['detail']['reduction']; $total_price -= $v['detail']['reduction'];
@ -162,10 +226,10 @@ class OrderController extends Controller
} }
// 生成订单号 // 生成订单号
private function getOrderNo()
private function getOrderNo(): string
{ {
list($micro, $sec) = explode(' ', microtime()); list($micro, $sec) = explode(' ', microtime());
$micro = str_pad(floor($micro * 1000000), 6, 0, STR_PAD_LEFT); $micro = str_pad(floor($micro * 1000000), 6, 0, STR_PAD_LEFT);
return date('YmdHis', $sec) . $micro . mt_rand(100, 999);
return date('YmdHis', $sec) . $micro . mt_rand(1000, 9999);
} }
} }
Loading…
Cancel
Save