You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.3 KiB
117 lines
3.3 KiB
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\AgentProduct;
|
|
use App\Models\Order;
|
|
use Illuminate\Http\Request;
|
|
|
|
/**
|
|
* 订单
|
|
* Class OrderController
|
|
* @package App\Http\Controllers\Api
|
|
*/
|
|
class OrderController extends Controller
|
|
{
|
|
//订单列表
|
|
public function index(Request $request)
|
|
{
|
|
$formData = $request->only(['page', 'status']);
|
|
$request->validate([
|
|
'page' => 'regex:/^\d+$/',
|
|
'status' => 'integer'
|
|
], [
|
|
'page.regex' => '页码错误',
|
|
'status.integer' => '未指定订单状态'
|
|
]);
|
|
|
|
if (array_key_exists('status', $formData) && $formData['status'] !== null) {
|
|
$where['status'] = $formData['status'];
|
|
}
|
|
$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')
|
|
->orderBy('id', 'DESC')
|
|
->simplePaginate(15);
|
|
return $this->success($list);
|
|
}
|
|
|
|
public function create(Request $request)
|
|
{
|
|
$formData = $request->only(['id', 'name', 'mobile', 'pay_type', 'num']);
|
|
$formData = array_map(fn($v) => trim($v), $formData); //过滤,删除首尾空
|
|
|
|
//表单验证
|
|
$request->validate([
|
|
'id' => ['required', 'regex:/^\d+$/'],
|
|
'name' => ['required', 'between:2,20'],
|
|
'mobile' => ['required', 'regex:/^1[3-9]\d{9}$/'],
|
|
'pay_type' => ['required', 'in:0,1,2'],
|
|
'num' => ['required', 'min:1'],
|
|
], [
|
|
'id.required' => '未指定产品ID',
|
|
'name.required' => '请输入联系人姓名',
|
|
'mobile.required' => '请输入联系手机号',
|
|
'id.regex' => '产品ID错误',
|
|
'name.between' => '联系人姓名在2~20字符之间',
|
|
'mobile.regex' => '请输入11位手机号',
|
|
'pay_type.required' => '请选择支付方式',
|
|
'pay_type.in' => '不存在此支付方式',
|
|
'num.required' => '请输入购买数量',
|
|
'num.min' => '购买数量输入错误',
|
|
]);
|
|
|
|
$product = AgentProduct::where('id', $formData['id'])->with('product')->first();
|
|
if (!$product) {
|
|
$this->error('产品不存在');
|
|
}
|
|
|
|
$price = $product->price; //TODO 1、成交价格还要扣除优惠券;2、产品表加库存;3、生成资金流水;4、开启事务;
|
|
Order::create([
|
|
'user_id' => $this->user_id,
|
|
'order_no' => $this->getOrderNo(),
|
|
'num' => $formData['num'],
|
|
'price' => $price,
|
|
'name' => $formData['name'],
|
|
'mobile' => $formData['mobile'],
|
|
'title' => $product->product->title,
|
|
'agent_product_id' => $product->id,
|
|
'product_id' => $product->product_id,
|
|
'status' => 0,
|
|
'pay_type' => $formData['pay_type'],
|
|
]);
|
|
return $this->success();
|
|
}
|
|
|
|
//获取应付金额
|
|
public function getPrice(Request $request)
|
|
{
|
|
$id = $request->input('id');
|
|
if (!$id || !ctype_digit($id)) {
|
|
return $this->error('未指定ID');
|
|
}
|
|
|
|
$num = (float)$request->input('num');
|
|
if (!$num || $num < 1) {
|
|
return $this->error('未指定产品数量');
|
|
}
|
|
|
|
return $this->success(['price' => $this->calc($id, $num)]);
|
|
}
|
|
|
|
//计算价格
|
|
private function calc($agent_id, $num)
|
|
{
|
|
return 2888.99; // TODO 此处需要详细计算,并扣除优惠价等之后的价格
|
|
}
|
|
|
|
// 生成订单号
|
|
private function getOrderNo()
|
|
{
|
|
list($micro, $sec) = explode(' ', microtime());
|
|
return date('YmdHis', $sec) . str_pad(floor($micro * 1000000), 6, 0, STR_PAD_LEFT) . mt_rand(100, 999);
|
|
}
|
|
}
|