6
0
Fork 0

添加导出发货单

release
vine_liutk 2022-01-05 19:36:01 +08:00
parent 3b8eb74a13
commit 0bedac5f1f
11 changed files with 214 additions and 30 deletions

View File

@ -0,0 +1,53 @@
<?php
namespace App\Admin\Actions\Grid\Exports;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Dcat\Admin\Actions\Response;
use Dcat\Admin\Grid\RowAction;
use Dcat\Admin\Traits\HasPermissions;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
class ShippingOrder extends RowAction
{
public function title()
{
if ($this->title) {
return $this->title;
}
return '<i class="feather grid-action-icon icon-download"></i> 导出发货单&nbsp;&nbsp;';
}
/**
* @param Model|Authenticatable|HasPermissions|null $user
*
* @return bool
*/
protected function authorize($user): bool
{
return $user->can('dcat.admin.articles.index');
}
/**
* Handle the action request.
*
* @param Request $request
*
* @return Response
*/
public function handle(Request $request)
{
// return response()->streamDownload(function () {
// $writer = WriterEntityFactory::createXLSXWriter();
// $writer->openToBrowser('测试'.date('Ymd'));
// $writer->addRow(WriterEntityFactory::createRowFromArray([
// '订单编号', '商品编号', '商品名称', '数量', '姓名', '电话', '地址', '下单时间', '发货数量', '发货单号',
// ]));
// $writer->close();
// });
return $this->response()->download(admin_route('orders.export_shipping_orders'));
}
}

View File

@ -3,6 +3,7 @@
namespace App\Admin\Controllers;
use App\Admin\Actions\Grid\CreateOrderPackage;
use App\Admin\Actions\Grid\Exports\ShippingOrder as ExportShippingOrder;
use App\Admin\Actions\Grid\OrderSetTag;
use App\Admin\Actions\Show\OrderConsigneeInfo;
use App\Admin\Actions\Show\OrderCreatePackage;
@ -17,6 +18,7 @@ use App\Models\OrderLog;
use App\Models\OrderPackage;
use App\Models\OrderProduct;
use App\Models\Tag;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
@ -40,6 +42,12 @@ class OrderController extends AdminController
return Grid::make($builder, function (Grid $grid) {
// $grid->column('id')->sortable();
$grid->tools(function (Grid\Tools $tools) {
//设置规格
if (Admin::user()->can('dcat.admin.orders.export_shipping_orders')) {
$tools->append(new ExportShippingOrder());
}
});
$grid->column('sn')->copyable();
$grid->column('tags', '标签')->display(function ($tags) {
$array = [];
@ -382,4 +390,33 @@ class OrderController extends AdminController
return response()->json($query->get());
}
public function exportShippingOrder(Request $request)
{
return response()->streamDownload(function () {
$writer = WriterEntityFactory::createXLSXWriter();
$writer->openToBrowser('测试'.date('Ymd').'.xlsx');
$writer->addRow(WriterEntityFactory::createRowFromArray([
'订单编号', '商品编号', '商品名称', '数量', '姓名', '电话', '地址', '下单时间', '发货数量', '发货单号',
]));
foreach (OrderModel::with('products')->needShipping()->cursor() as $order) {
foreach ($order->products as $product) {
if ($product->remain_quantity > 0) {
$writer->addRow(WriterEntityFactory::createRowFromArray([
$order->sn,
$product->sku_id,
$product->name.'数量:'.$product->remain_quantity,
$product->remain_quantity,
$order->consignee_name,
$order->consignee_telephone,
$order->consignee_zone.$order->consignee_address,
$order->created_at->toDateTimeString(),
]));
}
}
};
$writer->close();
});
}
}

View File

@ -106,7 +106,7 @@ class AfterSaleShippingFill extends Form implements LazyRenderable
'EMS'=>'EMS',
'顺丰速运'=>'顺丰速运',
'德邦快递'=>'德邦快递',
])->required();
])->default('韵达快递')->required();
$this->text('shipping_number', '快递单号')->required();
// $this->text('remarks', '填写补货物流单号')->required();
$this->confirm('是否确认补货完成', '该操作不可逆,确认后将完成该售后单。');

View File

@ -76,7 +76,7 @@ class OrderPackage extends Form implements LazyRenderable
'EMS'=>'EMS',
'顺丰速运'=>'顺丰速运',
'德邦快递'=>'德邦快递',
])->required();
])->default('韵达快递')->required();
$this->text('shipping_number')->required();
$this->hasMany('packages', function (Form $form) use ($order) {
$form->select('order_product_id')->options($order->products()->where('after_sale_state', '<>', 1)->pluck('name', 'id'));

View File

@ -91,6 +91,7 @@ Route::group([
'index', 'create', 'store', 'edit', 'update', 'destroy',
]);
$router->get('orders/export/shipping-order', 'OrderController@exportShippingOrder')->name('orders.export_shipping_orders');
$router->resource('orders', 'OrderController')->only([
'index', 'show', 'edit', 'update',
]);

View File

@ -42,19 +42,22 @@ class QuotaV1SendCommand extends Command
//依次分红
foreach ($userInfos as $userInfo) {
if ($userInfo->bonusable) {//只针对享受分红的人发放
$log = new QuotaV1SendLog();
$log->user_id = $userInfo->user_id;
$log->job_id = $job->id;
$log->amount = round(bcmul(bcdiv($job->amount, $totalQuotaV1, 5), $userInfo->quota_v1, 3));
$log->save();
try {
DB::beginTransaction();
$log->update(['status'=>1]);
$walletService->changeBalance($userInfo->user, $log->amount, WalletLog::ACTION_QUOTA_V1, '老配额分红', $log);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
report($th);
$quotaV1amount = round(bcmul(bcdiv($job->amount, $totalQuotaV1, 5), $userInfo->quota_v1, 3));
if ($quotaV1amount >0) {
$log = new QuotaV1SendLog();
$log->user_id = $userInfo->user_id;
$log->job_id = $job->id;
$log->amount = $quotaV1amount;
$log->save();
try {
DB::beginTransaction();
$log->update(['status'=>1]);
$walletService->changeBalance($userInfo->user, $log->amount, WalletLog::ACTION_QUOTA_V1, '老配额分红', $log);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
report($th);
}
}
}
}

View File

@ -17,9 +17,9 @@ class CouponRange extends Model
/**
* 仅查询可用的券规则
*/
public function scopeIsEnable()
public function scopeIsEnable($query)
{
return $this->where('is_enable', true);
return $query->where('is_enable', true);
}
public function coupon()

View File

@ -100,18 +100,18 @@ class Order extends Model
/**
* 仅查询支付过期的订单
*/
public function scopeExpired()
public function scopeExpired($query)
{
return $this->where('status', static::STATUS_PENDING)
return $query->where('status', static::STATUS_PENDING)
->where('created_at', '<=', now()->subSeconds(app_settings('app.order_payment_expires_at')));
}
/**
* 仅查询可自动完成的订单
*/
public function scopeCompletable()
public function scopeCompletable($query)
{
return $this->where('status', static::STATUS_PAID)
return $query->where('status', static::STATUS_PAID)
->where('shipping_state', static::SHIPPING_STATE_PROCESSED)
->where('auto_complete_at', '<=', now());
}
@ -119,13 +119,22 @@ class Order extends Model
/**
* 仅查询可结算的订单
*/
public function scopeSettlable()
public function scopeSettlable($query)
{
return $this->where('status', static::STATUS_COMPLETED)
return $query->where('status', static::STATUS_COMPLETED)
->where('completed_at', '<=', now()->subDays(app_settings('distribution.settle_days', 7)))
->where('is_settle', false);
}
/**
* 仅查询待发货的订单
*/
public function scopeNeedShipping($query)
{
return $query->where('status', static::STATUS_PAID)
->where('shipping_state', '<', static::SHIPPING_STATE_PROCESSED);
}
/**
* 下单人
*

View File

@ -34,18 +34,18 @@ class Tag extends Model
// return $this->morphedByMany(OrderPackage::class, 'taggable');
// }
public function scopeOrderTag()
public function scopeOrderTag($query)
{
return $this->where('type', self::TYPE_ORDER);
return $query->where('type', self::TYPE_ORDER);
}
public function scopeOrderPackageTag()
public function scopeOrderPackageTag($query)
{
return $this->where('type', self::TYPE_PACKAGE);
return $query->where('type', self::TYPE_PACKAGE);
}
public function scopeAfterSaleTag()
public function scopeAfterSaleTag($query)
{
return $this->where('type', self::TYPE_AFTER_SALE);
return $query->where('type', self::TYPE_AFTER_SALE);
}
}

View File

@ -15,6 +15,7 @@
"alibabacloud/sts": "^1.8",
"alipaysdk/easysdk": "^2.2",
"alphasnow/aliyun-oss-laravel": "^3.0",
"box/spout": "^3.3",
"dcat/laravel-admin": "2.1.5-beta",
"fruitcake/laravel-cors": "^2.0",
"gregwar/captcha": "^1.1",

82
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "e29674f9d20d1f4352e096af590c340b",
"content-hash": "a1bf80b8df4152dc433261263b5aa05f",
"packages": [
{
"name": "adbario/php-dot-notation",
@ -705,6 +705,86 @@
},
"time": "2021-06-18T13:26:35+00:00"
},
{
"name": "box/spout",
"version": "v3.3.0",
"source": {
"type": "git",
"url": "https://github.com/box/spout.git",
"reference": "9bdb027d312b732515b884a341c0ad70372c6295"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/box/spout/zipball/9bdb027d312b732515b884a341c0ad70372c6295",
"reference": "9bdb027d312b732515b884a341c0ad70372c6295",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"ext-dom": "*",
"ext-xmlreader": "*",
"ext-zip": "*",
"php": ">=7.2.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2",
"phpunit/phpunit": "^8"
},
"suggest": {
"ext-iconv": "To handle non UTF-8 CSV files (if \"php-intl\" is not already installed or is too limited)",
"ext-intl": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.1.x-dev"
}
},
"autoload": {
"psr-4": {
"Box\\Spout\\": "src/Spout"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Adrien Loison",
"email": "adrien@box.com"
}
],
"description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way",
"homepage": "https://www.github.com/box/spout",
"keywords": [
"OOXML",
"csv",
"excel",
"memory",
"odf",
"ods",
"office",
"open",
"php",
"read",
"scale",
"spreadsheet",
"stream",
"write",
"xlsx"
],
"support": {
"issues": "https://github.com/box/spout/issues",
"source": "https://github.com/box/spout/tree/v3.3.0"
},
"time": "2021-05-14T21:18:09+00:00"
},
{
"name": "brick/math",
"version": "0.9.3",