4
0
Fork 0
master
panliang 2022-09-30 14:43:00 +08:00
parent 165a2228e1
commit d609c83dc5
12 changed files with 125 additions and 104 deletions

View File

@ -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');
}
}
```

View File

@ -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);
}); });

View File

@ -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' => [

View File

@ -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()
{ {

View File

@ -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);
} public function shipStatus($v)
else if ($status === OrderStatus::Paying->value) { {
$this->where('pay_status', PayStatus::Processing)->where('is_closed', 0); $this->where('ship_status', $v);
} }
else if ($status === OrderStatus::Paid->value) {
$this->where('pay_status', PayStatus::Success)->where('ship_status', ShipStatus::None)->where('is_closed', 0); public function cancel($v)
} {
else if ($status === OrderStatus::Send->value) { $this->where('is_closed', $v ? 1 : 0);
$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('未知的订单状态');
}
} }
} }

View File

@ -31,6 +31,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');
@ -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', '快递单号');

View File

@ -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();

View File

@ -11,8 +11,6 @@ class OrderGoodsResource extends JsonResource
return [ return [
'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),

View File

@ -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,

View File

@ -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(),
]);
}
}
}
}

View File

@ -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();

View File

@ -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;
} }
} }