order
parent
165a2228e1
commit
d609c83dc5
40
README.md
40
README.md
|
|
@ -25,31 +25,37 @@
|
||||||
```php
|
```php
|
||||||
use Peidikeji\Order\Listeners\UpdateGoodsSoldCount;
|
use Peidikeji\Order\Listeners\UpdateGoodsSoldCount;
|
||||||
use Peidikeji\Order\Listeners\UpdateGoodsStock;
|
use Peidikeji\Order\Listeners\UpdateGoodsStock;
|
||||||
use Peidikeji\Order\Listeners\OrderDiscountProfit;
|
use Peidikeji\Order\Listeners\OrderUseScore;
|
||||||
use Peidikeji\Order\Listeners\OrderInviteProfit;
|
|
||||||
use Peidikeji\Order\Listeners\OrderMakeShipQrcode;
|
|
||||||
use Peidikeji\Order\Listeners\OrderSendProfit;
|
|
||||||
use Peidikeji\Order\Listeners\UpdateGoodsSoldCount;
|
|
||||||
use Peidikeji\Order\Listeners\UpdateGoodsStock;
|
|
||||||
|
|
||||||
protected $listen = [
|
protected $listen = [
|
||||||
\Peidikeji\Order\Events\OrderCreated::class => [
|
\Peidikeji\Order\Events\OrderCreated::class => [
|
||||||
UpdateGoodsStock::class,
|
UpdateGoodsStock::class,
|
||||||
UpdateGoodsSoldCount::class
|
UpdateGoodsSoldCount::class,
|
||||||
],
|
OrderUseScore::class,
|
||||||
\Peidikeji\Order\Events\OrderPaid::class => [
|
|
||||||
OrderDiscountProfit::class,
|
|
||||||
OrderSendProfit::class,
|
|
||||||
OrderMakeShipQrcode::class,
|
|
||||||
],
|
],
|
||||||
\Peidikeji\Order\Events\OrderCanceled::class => [
|
\Peidikeji\Order\Events\OrderCanceled::class => [
|
||||||
UpdateGoodsStock::class,
|
UpdateGoodsStock::class,
|
||||||
UpdateGoodsSoldCount::class,
|
UpdateGoodsSoldCount::class,
|
||||||
OrderDiscountProfit::class,
|
OrderUseScore::class
|
||||||
OrderSendProfit::class,
|
|
||||||
],
|
|
||||||
\Peidikeji\Order\Events\OrderReceived::class => [
|
|
||||||
OrderInviteProfit::class,
|
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### dcat-admin-user\src\Models\User.php
|
||||||
|
|
||||||
|
```php
|
||||||
|
|
||||||
|
namespace Peidikeji\User\Models;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||||
|
use Peidikeji\Order\Models\Order;
|
||||||
|
|
||||||
|
class User extends Authenticatable
|
||||||
|
{
|
||||||
|
// 我的订单
|
||||||
|
public function orders()
|
||||||
|
{
|
||||||
|
return $this->hasMany(Order:class, 'user_id');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@ Route::group([
|
||||||
Route::post('order/{id}/cancel', [OrderController::class, 'cancel']);
|
Route::post('order/{id}/cancel', [OrderController::class, 'cancel']);
|
||||||
Route::post('order/{id}/receive', [OrderController::class, 'receive']);
|
Route::post('order/{id}/receive', [OrderController::class, 'receive']);
|
||||||
Route::get('order/{id}/ship', [OrderController::class, 'ships']);
|
Route::get('order/{id}/ship', [OrderController::class, 'ships']);
|
||||||
Route::get('order/total', [OrderController::class, 'total']);
|
|
||||||
Route::post('order/sure', [OrderController::class, 'sure']);
|
Route::post('order/sure', [OrderController::class, 'sure']);
|
||||||
Route::apiResource('order', OrderController::class);
|
Route::apiResource('order', OrderController::class);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ class ShowReceive extends AbstractTool
|
||||||
|
|
||||||
$admin = Admin::user();
|
$admin = Admin::user();
|
||||||
$order->options()->create([
|
$order->options()->create([
|
||||||
'user_type' => get_class($admin),
|
'user_type' => $admin->getMorphClass(),
|
||||||
'user_id' => $admin->id,
|
'user_id' => $admin->id,
|
||||||
'description' => '管理员: ' . $admin->name . ' 确认收货',
|
'description' => '管理员: ' . $admin->name . ' 确认收货',
|
||||||
'attribute' => [
|
'attribute' => [
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@
|
||||||
|
|
||||||
namespace Peidikeji\Order\Enums;
|
namespace Peidikeji\Order\Enums;
|
||||||
|
|
||||||
use Dcat\Admin\Admin;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订单发货状态
|
* 订单发货状态
|
||||||
*/
|
*/
|
||||||
|
|
@ -11,8 +9,8 @@ enum ShipStatus: int
|
||||||
{
|
{
|
||||||
case None = 0;
|
case None = 0;
|
||||||
case Processing = 1;
|
case Processing = 1;
|
||||||
case Finished = 3;
|
case Finished = 2;
|
||||||
case Received = 4;
|
case Received = 3;
|
||||||
|
|
||||||
public static function options()
|
public static function options()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -3,44 +3,21 @@
|
||||||
namespace Peidikeji\Order\Filters;
|
namespace Peidikeji\Order\Filters;
|
||||||
|
|
||||||
use EloquentFilter\ModelFilter;
|
use EloquentFilter\ModelFilter;
|
||||||
use Peidikeji\Order\Enums\OrderStatus;
|
|
||||||
use Peidikeji\Order\Enums\PayStatus;
|
|
||||||
use Peidikeji\Order\Enums\ShipStatus;
|
|
||||||
use Peidikeji\Order\Exceptions\OrderException;
|
|
||||||
|
|
||||||
class OrderFilter extends ModelFilter
|
class OrderFilter extends ModelFilter
|
||||||
{
|
{
|
||||||
public function status($v)
|
public function payStatus($v)
|
||||||
{
|
{
|
||||||
$status = intval($v);
|
$this->where('pay_status', $v);
|
||||||
if ($status === OrderStatus::None->value) {
|
|
||||||
$this->where('pay_status', PayStatus::None)->where('is_closed', 0);
|
|
||||||
}
|
}
|
||||||
else if ($status === OrderStatus::Paying->value) {
|
|
||||||
$this->where('pay_status', PayStatus::Processing)->where('is_closed', 0);
|
public function shipStatus($v)
|
||||||
}
|
{
|
||||||
else if ($status === OrderStatus::Paid->value) {
|
$this->where('ship_status', $v);
|
||||||
$this->where('pay_status', PayStatus::Success)->where('ship_status', ShipStatus::None)->where('is_closed', 0);
|
|
||||||
}
|
|
||||||
else if ($status === OrderStatus::Send->value) {
|
|
||||||
$this->where('pay_status', PayStatus::Success)->where('ship_status', ShipStatus::Processing)->where('is_closed', 0);
|
|
||||||
}
|
|
||||||
else if ($status === OrderStatus::SendFull->value) {
|
|
||||||
$this->where('pay_status', PayStatus::Success)->where('ship_status', ShipStatus::Finished)->where('is_closed', 0);
|
|
||||||
}
|
|
||||||
else if ($status === OrderStatus::Receive->value) {
|
|
||||||
$this->where('pay_status', PayStatus::Success)->where('ship_status', ShipStatus::Received)->where('is_closed', 0);
|
|
||||||
}
|
|
||||||
else if ($status === OrderStatus::Review->value) {
|
|
||||||
$this->where('pay_status', PayStatus::Success)->where('ship_status', ShipStatus::Received)->whereNotNull('review_at')->where('is_closed', 0);
|
|
||||||
}
|
|
||||||
else if ($status === OrderStatus::PayFail->value) {
|
|
||||||
$this->where('pay_status', PayStatus::Fail)->where('is_closed', 0);
|
|
||||||
}
|
|
||||||
else if ($status === OrderStatus::Cancel->value) {
|
|
||||||
$this->where('is_closed', 1);
|
|
||||||
} else {
|
|
||||||
throw new OrderException('未知的订单状态');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function cancel($v)
|
||||||
|
{
|
||||||
|
$this->where('is_closed', $v ? 1 : 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,8 @@ class ShipForm extends Form implements LazyRenderable
|
||||||
DB::beginTransaction();
|
DB::beginTransaction();
|
||||||
$order = Order::findOrFail($this->payload['id']);
|
$order = Order::findOrFail($this->payload['id']);
|
||||||
|
|
||||||
|
$order->update(['ship_way' => $input['ship_way']]);
|
||||||
|
|
||||||
$code = data_get($input, 'company_code');
|
$code = data_get($input, 'company_code');
|
||||||
$company = data_get($input, 'company');
|
$company = data_get($input, 'company');
|
||||||
$sn = data_get($input, 'sn');
|
$sn = data_get($input, 'sn');
|
||||||
|
|
@ -68,8 +70,9 @@ class ShipForm extends Form implements LazyRenderable
|
||||||
'total_amount' => $item->amount,
|
'total_amount' => $item->amount,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
$this->fill(['goods' => $goods]);
|
$this->fill(['goods' => $goods, 'ship_way' => $this->payload['ship_way']]);
|
||||||
|
|
||||||
|
$this->select('ship_way')->options(ShipWay::options())->required();
|
||||||
$this->text('company', '快递公司');
|
$this->text('company', '快递公司');
|
||||||
$this->text('company_code', '快递公司编码');
|
$this->text('company_code', '快递公司编码');
|
||||||
$this->text('sn', '快递单号');
|
$this->text('sn', '快递单号');
|
||||||
|
|
|
||||||
|
|
@ -7,15 +7,14 @@ use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Illuminate\Validation\Rule;
|
use Illuminate\Validation\Rule;
|
||||||
use Illuminate\Validation\Rules\Enum;
|
use Illuminate\Validation\Rules\Enum;
|
||||||
use Peidikeji\Coupon\Http\Resources\UserCouponResource;
|
|
||||||
use Peidikeji\Coupon\Models\UserCoupon;
|
|
||||||
use Peidikeji\Order\Enums\OrderStatus;
|
|
||||||
use Peidikeji\Order\Enums\PayWay;
|
use Peidikeji\Order\Enums\PayWay;
|
||||||
|
use Peidikeji\Order\Enums\ShipStatus;
|
||||||
use Peidikeji\Order\Enums\ShipWay;
|
use Peidikeji\Order\Enums\ShipWay;
|
||||||
use Peidikeji\Order\Http\Resources\OrderResource;
|
use Peidikeji\Order\Http\Resources\OrderResource;
|
||||||
use Peidikeji\Order\Http\Resources\OrderShipResouce;
|
use Peidikeji\Order\Http\Resources\OrderShipResouce;
|
||||||
use Peidikeji\Order\OrderService;
|
use Peidikeji\Order\OrderService;
|
||||||
use Peidikeji\Order\OrderStore;
|
use Peidikeji\Order\OrderStore;
|
||||||
|
use Peidikeji\User\Models\User;
|
||||||
|
|
||||||
class OrderController extends Controller
|
class OrderController extends Controller
|
||||||
{
|
{
|
||||||
|
|
@ -30,27 +29,6 @@ class OrderController extends Controller
|
||||||
return $this->json(OrderResource::collection($list));
|
return $this->json(OrderResource::collection($list));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function total()
|
|
||||||
{
|
|
||||||
$user = auth('api')->user();
|
|
||||||
|
|
||||||
$query = $user->orders();
|
|
||||||
|
|
||||||
$maps = [
|
|
||||||
'unpay' => OrderStatus::None,
|
|
||||||
'paid' => OrderStatus::Paid,
|
|
||||||
'send_full' => OrderStatus::SendFull,
|
|
||||||
'receive' => OrderStatus::Receive
|
|
||||||
];
|
|
||||||
$data = [];
|
|
||||||
|
|
||||||
foreach($maps as $key => $status) {
|
|
||||||
$data[$key] = $query->clone()->filter(['status' => $status->value])->count();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->json($data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function sure(Request $request)
|
public function sure(Request $request)
|
||||||
{
|
{
|
||||||
$request->validate([
|
$request->validate([
|
||||||
|
|
@ -112,12 +90,13 @@ class OrderController extends Controller
|
||||||
{
|
{
|
||||||
$user = auth('api')->user();
|
$user = auth('api')->user();
|
||||||
|
|
||||||
$store = OrderStore::init()->user($user)->remarks($request->input('remarks'));
|
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'goods' => [Rule::requiredIf(!$request->filled('cart_id')), 'array'],
|
'goods' => [Rule::requiredIf(!$request->filled('cart_id')), 'array'],
|
||||||
'cart_id' => ['array'],
|
'cart_id' => ['array'],
|
||||||
'address' => [Rule::requiredIf(!$request->filled('address_id')), 'array'],
|
'address' => [Rule::requiredIf(!$request->filled('address_id')), 'array'],
|
||||||
|
'pay_way' => [Rule::in([PayWay::WxMini->value])]
|
||||||
]);
|
]);
|
||||||
|
$store = OrderStore::init()->user($user)->remarks($request->input('remarks'));
|
||||||
|
|
||||||
$goods = $request->input('goods');
|
$goods = $request->input('goods');
|
||||||
if ($request->filled('cart_id')) {
|
if ($request->filled('cart_id')) {
|
||||||
|
|
@ -148,13 +127,13 @@ class OrderController extends Controller
|
||||||
$user->carts()->whereIn('id', $request->input('cart_id'))->delete();
|
$user->carts()->whereIn('id', $request->input('cart_id'))->delete();
|
||||||
}
|
}
|
||||||
$result = OrderResource::make($order);
|
$result = OrderResource::make($order);
|
||||||
|
DB::commit();
|
||||||
if ($request->filled('pay_way')) {
|
if ($request->filled('pay_way')) {
|
||||||
$result = [];
|
$result = [];
|
||||||
$payData = OrderService::make()->pay($order, $request->input('pay_way'));
|
$payData = OrderService::make()->pay($order, $request->input('pay_way'));
|
||||||
$result['order'] = OrderResource::make($order);
|
$result['order'] = OrderResource::make($order);
|
||||||
$result['payment'] = $payData;
|
$result['payment'] = $payData;
|
||||||
}
|
}
|
||||||
DB::commit();
|
|
||||||
return $this->json($result);
|
return $this->json($result);
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return $this->error($e->getMessage());
|
return $this->error($e->getMessage());
|
||||||
|
|
@ -172,7 +151,7 @@ class OrderController extends Controller
|
||||||
public function pay($id, Request $request)
|
public function pay($id, Request $request)
|
||||||
{
|
{
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'pay_way' => ['required', new Enum(PayWay::class)]
|
'pay_way' => ['required', Rule::in([PayWay::WxMini->value])]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$user = auth('api')->user();
|
$user = auth('api')->user();
|
||||||
|
|
@ -189,7 +168,7 @@ class OrderController extends Controller
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function cancel($id, Request $request)
|
public function cancel($id)
|
||||||
{
|
{
|
||||||
$user = auth('api')->user();
|
$user = auth('api')->user();
|
||||||
|
|
||||||
|
|
@ -221,13 +200,13 @@ class OrderController extends Controller
|
||||||
|
|
||||||
try {
|
try {
|
||||||
DB::beginTransaction();
|
DB::beginTransaction();
|
||||||
OrderService::make()->receive($order);
|
OrderService::make()->receive($order, true);
|
||||||
$order->options()->create([
|
$order->options()->create([
|
||||||
'user_type' => get_class($user),
|
'user_type' => $user->getMorphClass(),
|
||||||
'user_id' => $user->id,
|
'user_id' => $user->id,
|
||||||
'description' => '用户 确认收货',
|
'description' => '用户:'.$user->getSubPhone().' 确认收货',
|
||||||
'attribute' => [
|
'attribute' => [
|
||||||
'is_closed' => 1
|
'ship_status' => ShipStatus::Finished
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
DB::commit();
|
DB::commit();
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,6 @@ class OrderGoodsResource extends JsonResource
|
||||||
'id' => $this->id,
|
'id' => $this->id,
|
||||||
'goods_id' => $this->goods_id,
|
'goods_id' => $this->goods_id,
|
||||||
|
|
||||||
'merchant_id' => $this->merchant_id,
|
|
||||||
|
|
||||||
'order_id' => $this->order_id,
|
'order_id' => $this->order_id,
|
||||||
'order' => OrderResource::make($this->whenLoaded('order')),
|
'order' => OrderResource::make($this->whenLoaded('order')),
|
||||||
|
|
||||||
|
|
@ -25,8 +23,6 @@ class OrderGoodsResource extends JsonResource
|
||||||
'spec' => $this->spec,
|
'spec' => $this->spec,
|
||||||
'part' => $this->part,
|
'part' => $this->part,
|
||||||
'price' => floatval($this->price),
|
'price' => floatval($this->price),
|
||||||
'vip_price' => floatval($this->vip_price),
|
|
||||||
'user_price' => floatval($this->user_price),
|
|
||||||
'amount' => $this->amount,
|
'amount' => $this->amount,
|
||||||
'money' => floatval($this->money),
|
'money' => floatval($this->money),
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ class OrderResource extends JsonResource
|
||||||
'ship_way' => $this->ship_way,
|
'ship_way' => $this->ship_way,
|
||||||
'ship_address' => $this->ship_address,
|
'ship_address' => $this->ship_address,
|
||||||
'ship_at' => $this->ship_at?->timestamp,
|
'ship_at' => $this->ship_at?->timestamp,
|
||||||
'ship_money' => $this->ship_money,
|
'ship_money' => floatval($this->ship_money),
|
||||||
|
|
||||||
'user_remarks' => $this->user_remarks,
|
'user_remarks' => $this->user_remarks,
|
||||||
'created_at' => $this->created_at->timestamp,
|
'created_at' => $this->created_at->timestamp,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Peidikeji\Order\Listeners;
|
||||||
|
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Peidikeji\Order\Enums\PayStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单使用积分抵扣
|
||||||
|
* 订单已支付 => 扣除用户的积分
|
||||||
|
* 订单已退款 => 返还用户扣除的积分
|
||||||
|
*/
|
||||||
|
class OrderUseScore implements ShouldQueue
|
||||||
|
{
|
||||||
|
public function handle($event)
|
||||||
|
{
|
||||||
|
$order = $event->order;
|
||||||
|
$user = $order->user;
|
||||||
|
$amount = floatval($order->score_discount_amount);
|
||||||
|
if ($amount > 0) {
|
||||||
|
if ($order->pay_status === PayStatus::Success) {
|
||||||
|
$user->decrement('profit', $amount);
|
||||||
|
$user->balanceLogs()->create([
|
||||||
|
'cate' => '订单扣除',
|
||||||
|
'amount' => 0 - $amount,
|
||||||
|
'balance' => $user->profit,
|
||||||
|
'description' => '订单 '.substr($order->sn, -4, 4).' 使用 '.$amount.' 积分抵扣 '.floatval($order->score_discount_money).' 元',
|
||||||
|
'source_id' => $order->id,
|
||||||
|
'source_type' => $order->getMorphClass(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
} elseif ($order->pay_status === PayStatus::Refund) {
|
||||||
|
$user->increment('profit', $amount);
|
||||||
|
$user->balanceLogs()->create([
|
||||||
|
'cate' => '订单返还',
|
||||||
|
'amount' => $amount,
|
||||||
|
'balance' => $user->profit,
|
||||||
|
'description' => '订单退款, 返还 '.$amount.' 积分',
|
||||||
|
'source_id' => $order->id,
|
||||||
|
'source_type' => $order->getMorphClass(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -286,9 +286,7 @@ class OrderService
|
||||||
*/
|
*/
|
||||||
public function cancel(Order $order)
|
public function cancel(Order $order)
|
||||||
{
|
{
|
||||||
if (!$order->canCancel()) {
|
$order->canCancel(true);
|
||||||
throw new OrderException('订单无法取消');
|
|
||||||
}
|
|
||||||
// 订单已经支付, 全额退款
|
// 订单已经支付, 全额退款
|
||||||
if ($order->pay_status === PayStatus::Success) {
|
if ($order->pay_status === PayStatus::Success) {
|
||||||
|
|
||||||
|
|
@ -319,9 +317,7 @@ class OrderService
|
||||||
*/
|
*/
|
||||||
public function delete(Order $order)
|
public function delete(Order $order)
|
||||||
{
|
{
|
||||||
if (!$order->canDelete()) {
|
$order->canDelete(true);
|
||||||
throw new OrderException('订单无法删除');
|
|
||||||
}
|
|
||||||
|
|
||||||
$order->goods()->delete();
|
$order->goods()->delete();
|
||||||
$order->options()->delete();
|
$order->options()->delete();
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,28 @@ class ShipLog extends LazyRenderable
|
||||||
{
|
{
|
||||||
public function render()
|
public function render()
|
||||||
{
|
{
|
||||||
return $this->id;
|
// dump($this->id, $this->ship);
|
||||||
|
return <<<HTML
|
||||||
|
<div class="timeline">
|
||||||
|
<div>
|
||||||
|
<i class="fa fa-truck bg-blue"></i>
|
||||||
|
<div class="timeline-item">
|
||||||
|
<div class="time">
|
||||||
|
<i class="fas fa-clock"></i> 2022-09-30 14:00:00
|
||||||
|
</div>
|
||||||
|
<div class="timeline-header">物流信息</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<i class="fa fa-truck bg-blue"></i>
|
||||||
|
<div class="timeline-item">
|
||||||
|
<div class="time">
|
||||||
|
<i class="fas fa-clock"></i> 2022-09-30 14:00:00
|
||||||
|
</div>
|
||||||
|
<div class="timeline-header">物流信息</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
HTML;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue