From 1042bfcb23cffb5f89c142463d0304bb484835bf Mon Sep 17 00:00:00 2001 From: vine_liutk <961510893@qq.com> Date: Sat, 18 Dec 2021 16:02:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E5=8F=96=E5=90=8E=E5=8F=B0orderservic?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Admin/Actions/Grid/CouponTaskStart.php | 2 +- app/Admin/Actions/Grid/OrderPackageFailed.php | 67 +++++ app/Admin/Actions/Show/OrderPay.php | 4 +- app/Admin/Controllers/OrderController.php | 7 +- app/Admin/Forms/OrderConsigneeInfo.php | 4 +- app/Admin/Forms/OrderPackage.php | 4 +- app/Admin/Forms/OrderReduce.php | 4 +- app/Admin/Forms/OrderRemark.php | 4 +- app/Admin/Services/AdminOrderService.php | 169 ++++++++++++ .../Services/AdminSendCouponService.php | 2 +- app/Models/OrderPackage.php | 30 +-- app/Services/OrderService.php | 240 ++++++------------ 12 files changed, 339 insertions(+), 198 deletions(-) create mode 100644 app/Admin/Actions/Grid/OrderPackageFailed.php create mode 100644 app/Admin/Services/AdminOrderService.php rename app/{ => Admin}/Services/AdminSendCouponService.php (97%) diff --git a/app/Admin/Actions/Grid/CouponTaskStart.php b/app/Admin/Actions/Grid/CouponTaskStart.php index fca64809..cd77e659 100644 --- a/app/Admin/Actions/Grid/CouponTaskStart.php +++ b/app/Admin/Actions/Grid/CouponTaskStart.php @@ -2,7 +2,7 @@ namespace App\Admin\Actions\Grid; -use App\Services\AdminSendCouponService; +use App\Admin\Services\AdminSendCouponService; use Dcat\Admin\Actions\Response; use Dcat\Admin\Grid\RowAction; use Illuminate\Http\Request; diff --git a/app/Admin/Actions/Grid/OrderPackageFailed.php b/app/Admin/Actions/Grid/OrderPackageFailed.php new file mode 100644 index 00000000..5012bf76 --- /dev/null +++ b/app/Admin/Actions/Grid/OrderPackageFailed.php @@ -0,0 +1,67 @@ +'; + + public function title() + { + if ($this->title) { + return $this->title.' '.'作废'; + } + + return '作废'; + } + + /** + * @param Model|Authenticatable|HasPermissions|null $user + * + * @return bool + */ + protected function authorize($user): bool + { + return $user->can('dcat.admin.users.enable'); + } + + /** + * Handle the action request. + * + * @param Request $request + * + * @return Response + */ + public function handle(Request $request) + { + $package = OrderPackage::findOrFail($this->getKey()); + try { + DB::beginTransaction(); + $user->enable(); + DB::commit(); + } catch (Throwable $th) { + DB::rollBack(); + report($th); + return $this->response()->error('操作失败,'.$th->getMessage())->refresh(); + } + + return $this->response()->success('操作成功')->refresh(); + } + + /** + * @return string|array|void + */ + public function confirm() + { + return ['确认作废当前货运单?', '该操作不可逆,确认后将作废该货运单,且订单相应恢复。']; + } +} diff --git a/app/Admin/Actions/Show/OrderPay.php b/app/Admin/Actions/Show/OrderPay.php index 79920817..6f9529b1 100644 --- a/app/Admin/Actions/Show/OrderPay.php +++ b/app/Admin/Actions/Show/OrderPay.php @@ -2,8 +2,8 @@ namespace App\Admin\Actions\Show; +use App\Admin\Services\AdminOrderService; use App\Models\Order; -use App\Services\OrderService; use Dcat\Admin\Show\AbstractTool; use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Http\Request; @@ -48,7 +48,7 @@ class OrderPay extends AbstractTool // 获取主键 $key = $this->getKey(); - $orderService = new OrderService(); + $orderService = new AdminOrderService(); $order = Order::where('status', Order::STATUS_PENDING)->findOrFail($key); try { DB::beginTransaction(); diff --git a/app/Admin/Controllers/OrderController.php b/app/Admin/Controllers/OrderController.php index d056721c..d9ef5962 100644 --- a/app/Admin/Controllers/OrderController.php +++ b/app/Admin/Controllers/OrderController.php @@ -166,13 +166,12 @@ class OrderController extends AdminController return bcdiv($v, 100, 2); })->prepend('- ¥'); } - - $show->field('reduced_amount')->as(function ($v) { - return bcdiv($v, 100, 2); - })->prepend('- ¥'); $show->field('shipping_fee')->as(function ($v) { return bcdiv($v, 100, 2); })->prepend('+ ¥'); + $show->field('reduced_amount')->as(function ($v) { + return bcdiv($v, 100, 2); + })->prepend('- ¥'); $show->divider(); $show->field('note'); $show->field('remark'); diff --git a/app/Admin/Forms/OrderConsigneeInfo.php b/app/Admin/Forms/OrderConsigneeInfo.php index dd86017a..b90c4608 100644 --- a/app/Admin/Forms/OrderConsigneeInfo.php +++ b/app/Admin/Forms/OrderConsigneeInfo.php @@ -2,9 +2,9 @@ namespace App\Admin\Forms; +use App\Admin\Services\AdminOrderService; use App\Exceptions\BizException; use App\Models\Order; -use App\Services\OrderService; use Dcat\Admin\Contracts\LazyRenderable; use Dcat\Admin\Traits\LazyWidget; use Dcat\Admin\Widgets\Form; @@ -38,7 +38,7 @@ class OrderConsigneeInfo extends Form implements LazyRenderable { $orderId = $this->payload['id'] ?? 0; $order = Order::findOrFail($orderId); - $orderService = new OrderService(); + $orderService = new AdminOrderService(); try { DB::beginTransaction(); $orderService->adminEditConsignee($order, $input); diff --git a/app/Admin/Forms/OrderPackage.php b/app/Admin/Forms/OrderPackage.php index 5c8c2798..db32bec2 100644 --- a/app/Admin/Forms/OrderPackage.php +++ b/app/Admin/Forms/OrderPackage.php @@ -2,9 +2,9 @@ namespace App\Admin\Forms; +use App\Admin\Services\AdminOrderService; use App\Exceptions\BizException; use App\Models\Order; -use App\Services\OrderService; use Dcat\Admin\Contracts\LazyRenderable; use Dcat\Admin\Traits\LazyWidget; use Dcat\Admin\Widgets\Form; @@ -41,7 +41,7 @@ class OrderPackage extends Form implements LazyRenderable $order = Order::findOrFail($orderId); try { DB::beginTransaction(); - $orderService = new OrderService(); + $orderService = new AdminOrderService(); $orderService->createPackage($order, $input); DB::commit(); } catch (BizException $e) { diff --git a/app/Admin/Forms/OrderReduce.php b/app/Admin/Forms/OrderReduce.php index 0dbca23c..db4a7a24 100644 --- a/app/Admin/Forms/OrderReduce.php +++ b/app/Admin/Forms/OrderReduce.php @@ -2,9 +2,9 @@ namespace App\Admin\Forms; +use App\Admin\Services\AdminOrderService; use App\Exceptions\BizException; use App\Models\Order; -use App\Services\OrderService; use Dcat\Admin\Admin; use Dcat\Admin\Contracts\LazyRenderable; use Dcat\Admin\Traits\LazyWidget; @@ -47,7 +47,7 @@ class OrderReduce extends Form implements LazyRenderable if ($reduceAmount == $order->total_amount) { throw new BizException('调整价格和订单原价格一致,无需调整'); } - $orderService = new OrderService(); + $orderService = new AdminOrderService(); $reduced = $order->total_amount-$reduceAmount; //判断是否在当前操作人调价权限范围内 diff --git a/app/Admin/Forms/OrderRemark.php b/app/Admin/Forms/OrderRemark.php index 334a0b4a..805701ae 100644 --- a/app/Admin/Forms/OrderRemark.php +++ b/app/Admin/Forms/OrderRemark.php @@ -2,9 +2,9 @@ namespace App\Admin\Forms; +use App\Admin\Services\AdminOrderService; use App\Exceptions\BizException; use App\Models\Order; -use App\Services\OrderService; use Dcat\Admin\Contracts\LazyRenderable; use Dcat\Admin\Traits\LazyWidget; use Dcat\Admin\Widgets\Form; @@ -40,7 +40,7 @@ class OrderRemark extends Form implements LazyRenderable $order = Order::findOrFail($orderId); $remark = $input['remark']??''; - $orderService = new OrderService(); + $orderService = new AdminOrderService(); try { DB::beginTransaction(); $orderService->adminRemark($order, $remark); diff --git a/app/Admin/Services/AdminOrderService.php b/app/Admin/Services/AdminOrderService.php new file mode 100644 index 00000000..96e2c2df --- /dev/null +++ b/app/Admin/Services/AdminOrderService.php @@ -0,0 +1,169 @@ +isPending()) { + $res = $order->where('updated_at', $order->updated_at)->update([ + 'reduced_amount' => $order->total_amount - $reduceAmount + $order->reduced_amount, + 'total_amount' => $reduceAmount, + ]); + if ($res === 0) { + throw new BizException('订单已发生改变'); + } + OrderLog::create([ + 'order_id'=>$order->id, + 'content'=> '调整订单支付价格为:¥'.bcdiv($reduceAmount, 100, 2), + ]); + } + } + + /** + * 后台支付订单 + * + * @param Order $order + * @return void + */ + public function adminPay(Order $order) + { + if ($order->isPending()) { + //操作订单状态-需要调整为统一支付方法 + $order->update([ + 'status' => Order::STATUS_PAID, + ]); + + OrderLog::create([ + 'order_id'=>$order->id, + 'content'=> '改变订单状态为【已支付】', + ]); + } + } + + /** + * 添加后台备注 + * + * @param Order $order + * @param string $remark + * @return void + */ + public function adminRemark(Order $order, string $remark) + { + //操作订单状态-需要调整为统一支付方法 + $order->update([ + 'remark' => $remark, + ]); + + OrderLog::create([ + 'order_id'=>$order->id, + 'content'=> '修改订单备注:'.$remark, + ]); + } + + /** + * 修改订单收货信息 + * + * @param Order $order + * @param array $params + * @return void + */ + public function adminEditConsignee(Order $order, array $params) + { + $oldOrderConsignee = $order->consignee_name.','.$order->consignee_telephone.','.$order->consignee_zone.$order->consignee_address; + $order->update($params); + OrderLog::create([ + 'order_id'=>$order->id, + 'content'=> '修改订单收货信息原收货信息:'.$oldOrderConsignee, + ]); + } + + /** + * 创建订单发货单 + * + * @return void + */ + public function createPackage(Order $order, array $params) + { + //合并同样商品,并检验是否能发货 + $packageProducts = []; + if (count($params['packages']) <= 0) { + throw new BizException('请选择发货商品'); + } + foreach ($params['packages'] as $item) { + if ($item['quantity'] < 1) { + throw new BizException('发货数量不能小于1'); + } + if (isset($packageProducts[$item['order_product_id']])) { + $packageProducts[$item['order_product_id']]['quantity'] += $item['quantity']; + } else { + $packageProducts[$item['order_product_id']] = [ + 'order_product_id'=> $item['order_product_id'], + 'quantity' =>$item['quantity'], + ]; + } + } + foreach ($packageProducts as $product) { + $_orderProduct = OrderProduct::where('after_sale_state', '<>', 1) + ->where('remain_quantity', '>=', $product['quantity']) + ->find($product['order_product_id']); + if (is_null($_orderProduct)) { + throw new BizException('发货数量不能大于剩余数量'); + } + $_orderProduct->decrement('remain_quantity', $product['quantity']); + } + + //创建发货单数据 + $package = new OrderPackage(); + $package->order_id = $order->id; + $package->consignee_name = $order->consignee_name; + $package->consignee_telephone = $order->consignee_telephone; + $package->consignee_zone = $order->consignee_zone; + $package->consignee_address = $order->consignee_address; + + $package->shipping_company = $params['shipping_company']; + $package->shipping_code = Arr::get(Kuaidi100Service::$codeArr, $package->shipping_company, ''); + $package->shipping_number = $params['shipping_number']; + + //保存发货单 + $package->save(); + //保存发货单商品 + OrderPackageProduct::insert(array_map(function ($value) use ($package) { + return array_merge($value, [ + 'order_package_id' => $package->id, + 'created_at' => $package->created_at, + 'updated_at' => $package->created_at, + ]); + }, $packageProducts)); + if (config('settings.kuaidi100_is_use')) { + $kuaidi100Service = new Kuaidi100Service(); + $kuaidi100Service->poll($package->shipping_number, $package->shipping_code, $package->consignee_telephone); + } + + //更新订单状态 + if (!OrderProduct::where('order_id', $order->id)->where('remain_quantity', '>', 0)->exists()) { + $order->update([ + 'shipping_state'=>Order::SHIPPING_STATE_PROCESSED, + ]); + } elseif ($order->shipping_state == Order::SHIPPING_STATE_PENDING) { + $order->update([ + 'shipping_state'=>Order::SHIPPING_STATE_PROCESSING, + ]); + } + } +} diff --git a/app/Services/AdminSendCouponService.php b/app/Admin/Services/AdminSendCouponService.php similarity index 97% rename from app/Services/AdminSendCouponService.php rename to app/Admin/Services/AdminSendCouponService.php index 48ae9b9e..9cebc44d 100644 --- a/app/Services/AdminSendCouponService.php +++ b/app/Admin/Services/AdminSendCouponService.php @@ -1,6 +1,6 @@ hasMany(OrderPackageProduct::class, 'order_package_id'); } + /** + * 关联的订单商品 + * + * @return void + */ public function orderProducts() { return $this->belongsToMany(OrderProduct::class, 'order_package_products', 'order_package_id', 'order_product_id'); } - - /** - * 更新包裹物流状态 - */ - public function updatePackageStatus(int $status, ?Carbon $time = null) - { - //如果是签收或者自动签收,填入签收时间; 并填入包裹商品里面的售后有效期; - $this->status = $status; - - if ($status == self::STATUS_CHECK || $status == self::STATUS_AUTOCHECK) { - $this->checked_at = $time ?? now(); - $this->orderProducts()->update([ - 'after_expire_at'=>$this->checked_at->addDays(7), - ]); - //看这个包裹的订单下是否还有未签收的包裹,没有,则把订单status改为已完成, 并完成订单 - if ($this->order->packages()->where('is_failed', false)->whereNotIn('status', [self::STATUS_CHECK, self::STATUS_AUTOCHECK])->doesntExist()) { - $this->order()->update([ - 'status' => Order::STATUS_COMPLETED, - 'completed_at' => now(), - ]); - } - } - $this->save(); - } } diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index 2691f11c..73a8b369 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -11,15 +11,14 @@ use App\Exceptions\ShippingNotSupportedException; use App\Helpers\Numeric; use App\Helpers\Order as OrderHelper; use App\Models\Order; -use App\Models\OrderLog; use App\Models\OrderPackage; -use App\Models\OrderPackageProduct; use App\Models\OrderProduct; use App\Models\ProductSku; use App\Models\ShippingAddress; use App\Models\User; use App\Models\UserCoupon; -use Illuminate\Support\Arr; +use Carbon\Carbon; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; class OrderService @@ -585,160 +584,6 @@ class OrderService return $user->shippingAddresses()->where('is_default', true)->first(); } - /** - * 订单调整价格 - * - * @return void - */ - public function adminReduceOrder(Order $order, int $reduceAmount) - { - if ($order->isPending()) { - $res = $order->where('updated_at', $order->updated_at)->update([ - 'reduced_amount' => $order->total_amount - $reduceAmount + $order->reduced_amount, - 'total_amount' => $reduceAmount, - ]); - if ($res === 0) { - throw new BizException('订单已发生改变'); - } - OrderLog::create([ - 'order_id'=>$order->id, - 'content'=> '调整订单支付价格为:¥'.bcdiv($reduceAmount, 100, 2), - ]); - } - } - - /** - * 后台支付订单 - * - * @param Order $order - * @return void - */ - public function adminPay(Order $order) - { - if ($order->isPending()) { - //操作订单状态-需要调整为统一支付方法 - $order->update([ - 'status' => Order::STATUS_PAID, - ]); - - OrderLog::create([ - 'order_id'=>$order->id, - 'content'=> '改变订单状态为【已支付】', - ]); - } - } - - /** - * 添加后台备注 - * - * @param Order $order - * @param string $remark - * @return void - */ - public function adminRemark(Order $order, string $remark) - { - //操作订单状态-需要调整为统一支付方法 - $order->update([ - 'remark' => $remark, - ]); - - OrderLog::create([ - 'order_id'=>$order->id, - 'content'=> '修改订单备注:'.$remark, - ]); - } - - /** - * 修改订单收货信息 - * - * @param Order $order - * @param array $params - * @return void - */ - public function adminEditConsignee(Order $order, array $params) - { - $oldOrderConsignee = $order->consignee_name.','.$order->consignee_telephone.','.$order->consignee_zone.$order->consignee_address; - $order->update($params); - OrderLog::create([ - 'order_id'=>$order->id, - 'content'=> '修改订单收货信息原收货信息:'.$oldOrderConsignee, - ]); - } - - /** - * 创建订单发货单 - * - * @return void - */ - public function createPackage(Order $order, array $params) - { - //合并同样商品,并检验是否能发货 - $packageProducts = []; - if (count($params['packages']) <= 0) { - throw new BizException('请选择发货商品'); - } - foreach ($params['packages'] as $item) { - if ($item['quantity'] < 1) { - throw new BizException('发货数量不能小于1'); - } - if (isset($packageProducts[$item['order_product_id']])) { - $packageProducts[$item['order_product_id']]['quantity'] += $item['quantity']; - } else { - $packageProducts[$item['order_product_id']] = [ - 'order_product_id'=> $item['order_product_id'], - 'quantity' =>$item['quantity'], - ]; - } - } - foreach ($packageProducts as $product) { - $_orderProduct = OrderProduct::where('after_sale_state', '<>', 1) - ->where('remain_quantity', '>=', $product['quantity']) - ->find($product['order_product_id']); - if (is_null($_orderProduct)) { - throw new BizException('发货数量不能大于剩余数量'); - } - $_orderProduct->decrement('remain_quantity', $product['quantity']); - } - - //创建发货单数据 - $package = new OrderPackage(); - $package->order_id = $order->id; - $package->consignee_name = $order->consignee_name; - $package->consignee_telephone = $order->consignee_telephone; - $package->consignee_zone = $order->consignee_zone; - $package->consignee_address = $order->consignee_address; - - $package->shipping_company = $params['shipping_company']; - $package->shipping_code = Arr::get(Kuaidi100Service::$codeArr, $package->shipping_company, ''); - $package->shipping_number = $params['shipping_number']; - - //保存发货单 - $package->save(); - //保存发货单商品 - OrderPackageProduct::insert(array_map(function ($value) use ($package) { - return array_merge($value, [ - 'order_package_id' => $package->id, - 'created_at' => $package->created_at, - 'updated_at' => $package->created_at, - ]); - }, $packageProducts)); - if (config('settings.kuaidi100_is_use')) { - $kuaidi100Service = new Kuaidi100Service(); - $kuaidi100Service->poll($package->shipping_number, $package->shipping_code, $package->consignee_telephone); - } - - //更新订单状态 - if (!OrderProduct::where('order_id', $order->id)->where('remain_quantity', '>', 0)->exists()) { - $order->update([ - 'shipping_state'=>Order::SHIPPING_STATE_PROCESSED, - ]); - } elseif ($order->shipping_state == Order::SHIPPING_STATE_PENDING) { - $order->update([ - 'shipping_state'=>Order::SHIPPING_STATE_PROCESSING, - ]); - } - } - /** * 订单付款 * @@ -770,4 +615,85 @@ class OrderService throw new BizException('支付方式不支持'); } + + /** + * 更新包裹状态 + * + * @param Collection|null $packages + * @param integer $status + * @return void + */ + public function updatePackageStatus(?Collection $packages, int $status) + { + if ($packages instanceof OrderPackage) { + $packages[] = $packages; + $packages = collect($packages); + } + + //如果签收状态 + if ($status == OrderPackage::STATUS_CHECK || $status == OrderPackage::STATUS_AUTOCHECK) { + $this->checkOrderPackage($packages, $status, now()); + } else { + OrderPackage::whereIn('id', $packages->pluck('id')->toArray())->update([ + 'status'=>$status, + ]); + } + } + + /** + * 签收订单包裹 + * + * status 区分3签收(物流推送签收)和11自动签收(属于用户手动点,或者时间到了) + * @return void + */ + public function checkOrderPackage(?Collection $packages, int $status, ?Carbon $time = null) + { + $checkTime = $time ?? now();//没指定签收时间,则默认当前时间 + if ($packages instanceof OrderPackage) { + $packages[] = $packages; + $packages = collect($packages); + } + //物流签收,更新包裹状态。自动签收不更新包裹状态 + if ($status == OrderPackage::STATUS_CHECK) { + OrderPackage::whereIn('id', $packages->pluck('id')->toArray())->update([ + 'status'=> $status, + 'checked_at' => $checkTime, + ]); + } + + //按订单ID分组包裹 + $packages = $packages->groupBy('order_id'); + + //获取所有订单 + $orders = Order::whereIn('id', $packages->keys()->toArray())->get()->keyBy('id'); + + $checkedOrder = [];//已执行过订单状态更新的订单IDS + //遍历包裹-处理签收 + foreach ($packages as $orderId => $orderPackages) { + $_order = $orders[$orderId]; + //如果订单已完成,则不更新 + if ($_order->isCompleted()) { + continue; + } + + //处理包裹下订单商品售后过期时间 + foreach ($orderPackages as $package) { + $package->orderProducts()->update([ + 'after_expire_at'=>$checkTime->addDays(7), + ]); + } + + //处理订单已完成发货,且包裹已全部签收,则更新为完成状态、记录完成时间; + if (!in_array($_order->id, $checkedOrder) + && $_order->isShipped() + && $_order->packages()->where('is_failed', false)->whereNotIn('status', [OrderPackage::STATUS_CHECK, OrderPackage::STATUS_AUTOCHECK])->doesntExist() + ) { + Order::where('id', $_order->id)->update([ + 'status' => Order::STATUS_COMPLETED, + 'completed_at' => now(), + ]); + $checkedOrder[] = $_order->id;//每个订单只更新执行一次 + } + } + } }