Files
nl-mall-api/app/Service/CodeGeneration/OrderService.php

205 lines
6.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Service\CodeGeneration;
use App\BaseApp\BaseService;
use App\Enum\order\OrderStatusEnum;
use App\Models\OrderDetailModel;
use App\Models\OrderModel;
use App\Models\ProductModel;
use App\Models\SkuModel;
use App\Models\UserModel;
use App\Models\UserReceivingAddressModel;
use Exception;
use Illuminate\Support\Facades\DB;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
class OrderService extends BaseService
{
public function __construct()
{
parent::__construct();
$this->selectField = ["id", "user_id", "order_no", "order_status", "total_amount", "status", "created_at", "updated_at", "deleted_at"];
$this->queryField = ['user_id' => '=','order_no' => 'like','order_status' => '=,status='];
$this->model = OrderModel::class;
$this->with = [
'user:id,nick_name,avatar'
];
}
/**
* 获取订单管理列表
* @return array
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function list(): array
{
$result = $this->getPageList();
foreach ($result['items'] as &$v) {
$v['status_text'] = OrderStatusEnum::from($v['status'])->description();
$v['status_color'] = OrderStatusEnum::from($v['status'])->getColor();
}
return $result;
}
/**
* 获取订单管理详情
* @param $id
* @return mixed
* @throws Exception
*/
public function detail($id)
{
$this->selectField[] = 'recipient';
$this->with[] = 'detail:id,order_id,product_id,sku_id,price,quantity,subtotal,snapshot';
$result = $this->getDetail($id);
$result['status_text'] = OrderStatusEnum::from($result['status'])->description();
$result['status_color'] = OrderStatusEnum::from($result['status'])->getColor();
$result['recipient'] = json_decode($result['recipient'], true);
foreach ($result['detail'] as &$v) {
$v['snapshot'] = !empty($v['snapshot']) ? json_decode($v['snapshot'], true) : [];
}
return $result;
}
/**
* 订单管理下拉列表
* @return mixed
*/
public function option()
{
$this->optionField = ['id', 'name'];
return $this->getOption();
}
/**
* 创建订单管理
* @param $params
* @return mixed
* @throws Exception
*/
public function create($params): mixed
{
return $this->insert($params);
}
/**
* 编辑订单管理
* @param $id
* @param $params
* @return mixed
* @throws Exception
*/
public function update($id, $params): mixed
{
return $this->save($id, $params);
}
/**
* 删除订单管理
* @param $ids
* @return mixed|true
* @throws Exception
*/
public function delete($ids): mixed
{
return $this->del($ids);
}
public function generateOrder($params)
{
$userIds = UserModel::pluck('id');
$userId = $userIds->random();
$skuIds = array_column($params['products'], 'sku_id');
$skuQuantity = array_column($params['products'], 'number', 'sku_id');
$skus = SkuModel::with('product')->whereIn('id', $skuIds)->get();
if (empty($skus)) {
$this->utils->errorThrow('商品sku不存在');
}
$skus = $skus->toArray();
$skuGetIds = array_column($skus, 'id');
// 对比skuIds和skuGetIds如果传入的skuId不存在于skuGetIds中则抛出异常
$diffSkuIds = array_diff($skuIds, $skuGetIds);
if ($diffSkuIds) {
$this->utils->errorThrow('商品sku不存在SkuId'. implode(',', $diffSkuIds));
}
// 获取收件人地址
$recipient = $this->getRecipientInfo($params['address_id']?? 0);
// 生成订单号
$orderNo = $this->utils->genOrderNo();
$orderInsertData = [
'user_id' => $userId,
'order_no' => $orderNo,
'total_amount' => 0,
'recipient' => $recipient,
'user_remarks' => $params['user_remarks'] ?? '',
'status' => 0,
];
DB::beginTransaction();
try {
$totalAmount = 0;
$orderId = $this->insert($orderInsertData);
if (!$orderId) {
$this->utils->errorThrow('订单生成失败!');
}
$orderProducts = [];
foreach ($skus as $v) {
$subtotal = bcmul($v['price'], $skuQuantity[$v['id']], 2);
$orderProducts[] = [
'order_id' => $orderId,
'product_id' => $v['product_id'],
'sku_id' => $v['id'],
'price' => $v['price'],
'quantity' => $skuQuantity[$v['id']],
'subtotal' => $subtotal,
'snapshot' => json_encode($v),
];
$totalAmount = bcadd($totalAmount, $subtotal, 2);
}
$orderDetailInsertModel = OrderDetailModel::insert($orderProducts);
if (!$orderDetailInsertModel) {
$this->utils->errorThrow('订单商品生成失败!');
}
$orderUpdateModel = $this->update($orderId, [
'total_amount' => $totalAmount,
]);
if (!$orderUpdateModel) {
$this->utils->errorThrow('订单生成失败!');
}
DB::commit();
} catch (Exception $e) {
DB::rollBack();
$this->utils->errorThrow($e->getMessage());
}
return $orderId;
}
public function getRecipientInfo($id = null)
{
if (empty($id)) {
$this->utils->errorThrow('请选择收件人!');
}
$recipientInfo = UserReceivingAddressModel::where('id', $id)->first();
$recipientInfo['copy_text'] = "{$recipientInfo['name']} {$recipientInfo['phone']} {$recipientInfo['complete_address']}";
return json_encode($recipientInfo);
}
}