添加自动分配订单动作
parent
6585376e3a
commit
fb1fc3160f
|
|
@ -41,6 +41,7 @@ class Dealer extends Form
|
||||||
$this->currency('upgrade_amount_'.DealerLvl::Contracted->value, '签约门槛')->symbol('¥');
|
$this->currency('upgrade_amount_'.DealerLvl::Contracted->value, '签约门槛')->symbol('¥');
|
||||||
$this->currency('upgrade_amount_'.DealerLvl::Special->value, '特邀门槛')->symbol('¥');
|
$this->currency('upgrade_amount_'.DealerLvl::Special->value, '特邀门槛')->symbol('¥');
|
||||||
$this->currency('upgrade_amount_'.DealerLvl::Gold->value, '金牌门槛')->symbol('¥');
|
$this->currency('upgrade_amount_'.DealerLvl::Gold->value, '金牌门槛')->symbol('¥');
|
||||||
|
$this->number('order_auto_allocate_times', '订单自动分配时间(小时)')->min(1);
|
||||||
$this->table('purchase_rules', '进货补贴规则', function ($table) {
|
$this->table('purchase_rules', '进货补贴规则', function ($table) {
|
||||||
$table->number('price', '阶梯(万)');
|
$table->number('price', '阶梯(万)');
|
||||||
$table->currency('rate', '比例(百分比)')->symbol('%');
|
$table->currency('rate', '比例(百分比)')->symbol('%');
|
||||||
|
|
@ -84,9 +85,10 @@ class Dealer extends Form
|
||||||
$dealerSettings = (array) Setting::where('key', 'dealer')->value('value');
|
$dealerSettings = (array) Setting::where('key', 'dealer')->value('value');
|
||||||
return [
|
return [
|
||||||
'fee_rate'=>$dealerSettings['fee_rate'] ?? '',
|
'fee_rate'=>$dealerSettings['fee_rate'] ?? '',
|
||||||
'upgrade_amount_'.DealerLvl::Contracted->value => $dealerSettings['upgrade_amount_'.DealerLvl::Contracted->value]??'',
|
'order_auto_allocate_times'=>$dealerSettings['order_auto_allocate_times'] ?? 1,
|
||||||
'upgrade_amount_'.DealerLvl::Special->value => $dealerSettings['upgrade_amount_'.DealerLvl::Special->value]??'',
|
'upgrade_amount_'.DealerLvl::Contracted->value => $dealerSettings['upgrade_amount_'.DealerLvl::Contracted->value] ?? '',
|
||||||
'upgrade_amount_'.DealerLvl::Gold->value => $dealerSettings['upgrade_amount_'.DealerLvl::Gold->value]??'',
|
'upgrade_amount_'.DealerLvl::Special->value => $dealerSettings['upgrade_amount_'.DealerLvl::Special->value] ?? '',
|
||||||
|
'upgrade_amount_'.DealerLvl::Gold->value => $dealerSettings['upgrade_amount_'.DealerLvl::Gold->value] ?? '',
|
||||||
'bank'=>$dealerSettings['bank'] ?? [],
|
'bank'=>$dealerSettings['bank'] ?? [],
|
||||||
'alipay'=>$dealerSettings['alipay'] ?? [],
|
'alipay'=>$dealerSettings['alipay'] ?? [],
|
||||||
'wechat' =>$dealerSettings['wechat'] ?? [],
|
'wechat' =>$dealerSettings['wechat'] ?? [],
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands\Dealer;
|
||||||
|
|
||||||
|
use App\Enums\DealerOrderStatus;
|
||||||
|
use App\Models\DealerOrder;
|
||||||
|
use App\Services\Dealer\OrderService;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Throwable;
|
||||||
|
|
||||||
|
class OrderAutoAllocate extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'dealer:order-auto-allocate';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The console command description.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $description = '自动分配订单';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
DealerOrder::where('status', DealerOrderStatus::Pending)
|
||||||
|
->where('consignor_id', '>', 1)//到1用户或者公司的订单不需要再分配
|
||||||
|
->where('allocated_at', '<', now()->subHours(app_settings('dealer.order_auto_allocate_times')))
|
||||||
|
->chunkById(200, function ($orders) {
|
||||||
|
$orders->load([
|
||||||
|
'consignor',
|
||||||
|
]);
|
||||||
|
$orderService = new OrderService();
|
||||||
|
foreach ($orders as $order) {
|
||||||
|
try {
|
||||||
|
DB::beginTransaction();
|
||||||
|
$orderService->updateOrderConsignor($order);
|
||||||
|
DB::commit();
|
||||||
|
} catch (Throwable $th) {
|
||||||
|
DB::rollBack();
|
||||||
|
report($th);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -27,6 +27,7 @@ class DealerOrder extends Model
|
||||||
'paied_time'=>'datetime',
|
'paied_time'=>'datetime',
|
||||||
'shipping_time'=>'datetime',
|
'shipping_time'=>'datetime',
|
||||||
'shippinged_time'=>'datetime',
|
'shippinged_time'=>'datetime',
|
||||||
|
'allocated_at'=>'datetime',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
|
|
@ -43,6 +44,7 @@ class DealerOrder extends Model
|
||||||
'paied_time',
|
'paied_time',
|
||||||
'shipping_time',
|
'shipping_time',
|
||||||
'shippinged_time',
|
'shippinged_time',
|
||||||
|
'allocated_at', //分配时间
|
||||||
];
|
];
|
||||||
|
|
||||||
public function getOrderStatusAttribute()
|
public function getOrderStatusAttribute()
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Dcat\Admin\Traits\HasDateTimeFormatter;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class DealerOrderAllocateLog extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
use HasDateTimeFormatter;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'order_id',
|
||||||
|
'last_consignor_id',
|
||||||
|
'new_consignor_id',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ use App\Enums\DealerLvl;
|
||||||
use App\Enums\DealerOrderStatus;
|
use App\Enums\DealerOrderStatus;
|
||||||
use App\Exceptions\BizException;
|
use App\Exceptions\BizException;
|
||||||
use App\Models\DealerOrder;
|
use App\Models\DealerOrder;
|
||||||
|
use App\Models\DealerOrderAllocateLog;
|
||||||
use App\Models\DealerProduct;
|
use App\Models\DealerProduct;
|
||||||
use App\Models\DealerUserProductLog;
|
use App\Models\DealerUserProductLog;
|
||||||
use App\Models\ShippingAddress;
|
use App\Models\ShippingAddress;
|
||||||
|
|
@ -86,6 +87,7 @@ class OrderService
|
||||||
$order->consignee_telephone = $shippingAddress->telephone;
|
$order->consignee_telephone = $shippingAddress->telephone;
|
||||||
$order->consignee_zone = $shippingAddress->zone;
|
$order->consignee_zone = $shippingAddress->zone;
|
||||||
$order->consignee_address = $shippingAddress->address;
|
$order->consignee_address = $shippingAddress->address;
|
||||||
|
$order->allocated_at = now();//记录分配时间
|
||||||
$order->save();
|
$order->save();
|
||||||
break;
|
break;
|
||||||
} catch (QueryException $e) {
|
} catch (QueryException $e) {
|
||||||
|
|
@ -216,12 +218,23 @@ class OrderService
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
protected function updateOrderConsignor(DealerOrder $order)
|
public function updateOrderConsignor(DealerOrder $order)
|
||||||
{
|
{
|
||||||
$consignor = $this->getConsignor($order->user, $order->consignor);
|
//只处理当前订单有发货人的情况
|
||||||
$order->update([
|
if ($order->consignor) {
|
||||||
'consignor_id' => $consignor?->user_id,
|
$consignor = $this->getConsignor($order->user, $order->totalAmount, $order->consignor);
|
||||||
]);
|
$oldConsignor = $order->consignor;
|
||||||
|
$order->update([
|
||||||
|
'allocated_at' => now(),
|
||||||
|
'consignor_id' => $consignor?->user_id,
|
||||||
|
]);
|
||||||
|
//记录分配日志
|
||||||
|
DealerOrderAllocateLog::create([
|
||||||
|
'order_id'=>$order->id,
|
||||||
|
'last_consignor_id'=>$oldConsignor->id,
|
||||||
|
'new_consignor_id' =>$order->consignor_id,
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -288,7 +301,7 @@ class OrderService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getConsignor(User $user, $totalAmount, ?User $lastConsignor = null)
|
private function getConsignor(User $user, $totalAmount, ?User $lastConsignor = null)
|
||||||
{
|
{
|
||||||
$rules = [
|
$rules = [
|
||||||
[
|
[
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class AddAllocatedAtToDealerOrdersTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('dealer_orders', function (Blueprint $table) {
|
||||||
|
//
|
||||||
|
$table->timestamp('allocated_at')->nullable()->comment('分配时间');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('dealer_orders', function (Blueprint $table) {
|
||||||
|
//
|
||||||
|
$table->dropColumn('allocated_at');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreateDealerOrderAllocateLogsTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::create('dealer_order_allocate_logs', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->unsignedBigInteger('order_id')->comment('订单ID');
|
||||||
|
$table->unsignedBigInteger('last_consignor_id')->comment('上个接单人');
|
||||||
|
$table->unsignedBigInteger('new_consignor_id')->nullable()->comment('新接单人');
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('dealer_order_allocate_logs');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -185,6 +185,9 @@ class AppSettingSeeder extends Seeder
|
||||||
// 合约经销商升级金额
|
// 合约经销商升级金额
|
||||||
'upgrade_amount_'.DealerLvl::Contracted->value => '26400',
|
'upgrade_amount_'.DealerLvl::Contracted->value => '26400',
|
||||||
|
|
||||||
|
//超过N小时未接单自动分配
|
||||||
|
'order_auto_allocate_times'=>'1',
|
||||||
|
|
||||||
'purchase_rules'=>[
|
'purchase_rules'=>[
|
||||||
['price' => '1', 'rate' => '2.00'],
|
['price' => '1', 'rate' => '2.00'],
|
||||||
['price' => '2', 'rate' => '3.00'],
|
['price' => '2', 'rate' => '3.00'],
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue