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
use Peidikeji\Order\Listeners\UpdateGoodsSoldCount;
use Peidikeji\Order\Listeners\UpdateGoodsStock;
use Peidikeji\Order\Listeners\OrderDiscountProfit;
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;
use Peidikeji\Order\Listeners\OrderUseScore;
protected $listen = [
\Peidikeji\Order\Events\OrderCreated::class => [
UpdateGoodsStock::class,
UpdateGoodsSoldCount::class
],
\Peidikeji\Order\Events\OrderPaid::class => [
OrderDiscountProfit::class,
OrderSendProfit::class,
OrderMakeShipQrcode::class,
UpdateGoodsSoldCount::class,
OrderUseScore::class,
],
\Peidikeji\Order\Events\OrderCanceled::class => [
UpdateGoodsStock::class,
UpdateGoodsSoldCount::class,
OrderDiscountProfit::class,
OrderSendProfit::class,
],
\Peidikeji\Order\Events\OrderReceived::class => [
OrderInviteProfit::class,
OrderUseScore::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}/receive', [OrderController::class, 'receive']);
Route::get('order/{id}/ship', [OrderController::class, 'ships']);
Route::get('order/total', [OrderController::class, 'total']);
Route::post('order/sure', [OrderController::class, 'sure']);
Route::apiResource('order', OrderController::class);
});

View File

@ -24,7 +24,7 @@ class ShowReceive extends AbstractTool
$admin = Admin::user();
$order->options()->create([
'user_type' => get_class($admin),
'user_type' => $admin->getMorphClass(),
'user_id' => $admin->id,
'description' => '管理员: ' . $admin->name . ' 确认收货',
'attribute' => [

View File

@ -2,8 +2,6 @@
namespace Peidikeji\Order\Enums;
use Dcat\Admin\Admin;
/**
* 订单发货状态
*/
@ -11,8 +9,8 @@ enum ShipStatus: int
{
case None = 0;
case Processing = 1;
case Finished = 3;
case Received = 4;
case Finished = 2;
case Received = 3;
public static function options()
{

View File

@ -3,44 +3,21 @@
namespace Peidikeji\Order\Filters;
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
{
public function status($v)
public function payStatus($v)
{
$status = intval($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);
}
else if ($status === OrderStatus::Paid->value) {
$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('未知的订单状态');
}
$this->where('pay_status', $v);
}
public function shipStatus($v)
{
$this->where('ship_status', $v);
}
public function cancel($v)
{
$this->where('is_closed', $v ? 1 : 0);
}
}

View File

@ -31,6 +31,8 @@ class ShipForm extends Form implements LazyRenderable
}
DB::beginTransaction();
$order = Order::findOrFail($this->payload['id']);
$order->update(['ship_way' => $input['ship_way']]);
$code = data_get($input, 'company_code');
$company = data_get($input, 'company');
@ -68,8 +70,9 @@ class ShipForm extends Form implements LazyRenderable
'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_code', '快递公司编码');
$this->text('sn', '快递单号');

View File

@ -7,15 +7,14 @@ use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
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\ShipStatus;
use Peidikeji\Order\Enums\ShipWay;
use Peidikeji\Order\Http\Resources\OrderResource;
use Peidikeji\Order\Http\Resources\OrderShipResouce;
use Peidikeji\Order\OrderService;
use Peidikeji\Order\OrderStore;
use Peidikeji\User\Models\User;
class OrderController extends Controller
{
@ -30,27 +29,6 @@ class OrderController extends Controller
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)
{
$request->validate([
@ -112,12 +90,13 @@ class OrderController extends Controller
{
$user = auth('api')->user();
$store = OrderStore::init()->user($user)->remarks($request->input('remarks'));
$request->validate([
'goods' => [Rule::requiredIf(!$request->filled('cart_id')), 'array'],
'cart_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');
if ($request->filled('cart_id')) {
@ -148,13 +127,13 @@ class OrderController extends Controller
$user->carts()->whereIn('id', $request->input('cart_id'))->delete();
}
$result = OrderResource::make($order);
DB::commit();
if ($request->filled('pay_way')) {
$result = [];
$payData = OrderService::make()->pay($order, $request->input('pay_way'));
$result['order'] = OrderResource::make($order);
$result['payment'] = $payData;
}
DB::commit();
return $this->json($result);
} catch (\Exception $e) {
return $this->error($e->getMessage());
@ -172,7 +151,7 @@ class OrderController extends Controller
public function pay($id, Request $request)
{
$request->validate([
'pay_way' => ['required', new Enum(PayWay::class)]
'pay_way' => ['required', Rule::in([PayWay::WxMini->value])]
]);
$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();
@ -221,13 +200,13 @@ class OrderController extends Controller
try {
DB::beginTransaction();
OrderService::make()->receive($order);
OrderService::make()->receive($order, true);
$order->options()->create([
'user_type' => get_class($user),
'user_type' => $user->getMorphClass(),
'user_id' => $user->id,
'description' => '用户 确认收货',
'description' => '用户:'.$user->getSubPhone().' 确认收货',
'attribute' => [
'is_closed' => 1
'ship_status' => ShipStatus::Finished
]
]);
DB::commit();

View File

@ -11,8 +11,6 @@ class OrderGoodsResource extends JsonResource
return [
'id' => $this->id,
'goods_id' => $this->goods_id,
'merchant_id' => $this->merchant_id,
'order_id' => $this->order_id,
'order' => OrderResource::make($this->whenLoaded('order')),
@ -25,8 +23,6 @@ class OrderGoodsResource extends JsonResource
'spec' => $this->spec,
'part' => $this->part,
'price' => floatval($this->price),
'vip_price' => floatval($this->vip_price),
'user_price' => floatval($this->user_price),
'amount' => $this->amount,
'money' => floatval($this->money),

View File

@ -33,7 +33,7 @@ class OrderResource extends JsonResource
'ship_way' => $this->ship_way,
'ship_address' => $this->ship_address,
'ship_at' => $this->ship_at?->timestamp,
'ship_money' => $this->ship_money,
'ship_money' => floatval($this->ship_money),
'user_remarks' => $this->user_remarks,
'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)
{
if (!$order->canCancel()) {
throw new OrderException('订单无法取消');
}
$order->canCancel(true);
// 订单已经支付, 全额退款
if ($order->pay_status === PayStatus::Success) {
@ -319,9 +317,7 @@ class OrderService
*/
public function delete(Order $order)
{
if (!$order->canDelete()) {
throw new OrderException('订单无法删除');
}
$order->canDelete(true);
$order->goods()->delete();
$order->options()->delete();

View File

@ -8,6 +8,28 @@ class ShipLog extends LazyRenderable
{
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;
}
}