145 lines
5.2 KiB
PHP
145 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace app\common\service;
|
|
|
|
use app\common\model\StockOrderAccounts;
|
|
use app\common\model\StockOrderItemOptions;
|
|
use app\common\model\StockOrderItems;
|
|
use app\common\validate\StockOrdersValidate;
|
|
use app\common\traits\crud\CrudServiceTrait;
|
|
use app\common\model\StockOrders;
|
|
use support\Request;
|
|
use app\common\model\User;
|
|
use support\exception\BusinessException;
|
|
use support\Db;
|
|
|
|
class StockOrdersService
|
|
{
|
|
|
|
use CrudServiceTrait;
|
|
|
|
/**
|
|
* 指定当前要操作的模型
|
|
*/
|
|
protected string $modelClass = StockOrders::class;
|
|
|
|
/**
|
|
* 验证器
|
|
*/
|
|
protected $validator = StockOrdersValidate::class;
|
|
|
|
/**
|
|
* 获取验证器
|
|
*/
|
|
public function getValidator()
|
|
{
|
|
return new $this->validator;
|
|
}
|
|
|
|
|
|
protected function buildQueryConfig(Request $request, string $scene = 'index'): array
|
|
{
|
|
$p = $request->all();
|
|
|
|
$config = [];
|
|
$config['model'] = $this->modelClass;
|
|
switch ($scene) {
|
|
case 'index':
|
|
$config['order']['id'] = 'desc';
|
|
break;
|
|
case 'show':
|
|
$config['where']['id'] = $p['id'];
|
|
|
|
$config['with'][] = 'items';
|
|
$config['with'][] = 'items.options';
|
|
$config['with'][] = 'items.moneyValues';
|
|
$config['with'][] = 'accounts';
|
|
$config['with'][] = 'moneyValues';
|
|
break;
|
|
case 'store':
|
|
break;
|
|
case 'update':
|
|
$config['where']['id'] = $p['id'];
|
|
break;
|
|
case 'destroy':
|
|
$config['where']['id'] = $p['id'];
|
|
break;
|
|
}
|
|
|
|
return $config;
|
|
}
|
|
|
|
|
|
public function serviceStore(Request $request, array $data = [])
|
|
{
|
|
// 关联表较多,增加事务处理
|
|
return Db::transaction(function () use ($request, $data) {
|
|
$data = $this->preProcess('Store', $data, $request);
|
|
$dl = $this->getDataLimitFromRequest($request);
|
|
$created = $this->logicCreate($data, $dl); // 表1
|
|
|
|
// 车辆
|
|
foreach ($data['veh_list'] as $veh) {
|
|
$veh['order_id'] = $created->id;
|
|
$item = StockOrderItems::create($veh); // 表2
|
|
|
|
// 金额 // 表3
|
|
$item->addMoney('official_price', $veh['official_price']['currency'], $veh['official_price']['amount'], $veh['official_price']['rate'], '官方指导价');
|
|
$item->addMoney('discount_price', $veh['discount_price']['currency'], $veh['discount_price']['amount'], $veh['discount_price']['rate'], '优惠价');
|
|
$item->addMoney('unit_price', $veh['unit_price']['currency'], $veh['unit_price']['amount'], $veh['unit_price']['rate'], '单价');
|
|
$item->addMoney('total_price', $veh['total_price']['currency'], $veh['total_price']['amount'], $veh['total_price']['rate'], '总价');
|
|
$item->addMoney('handling_fee', $veh['handling_fee']['currency'], $veh['handling_fee']['amount'], $veh['handling_fee']['rate'], '手续费');
|
|
$item->addMoney('fob_transport_fee', $veh['fob_transport_fee']['currency'], $veh['fob_transport_fee']['amount'], $veh['fob_transport_fee']['rate'], 'FOB运输费');
|
|
$item->addMoney('port_misc_fee', $veh['port_misc_fee']['currency'], $veh['port_misc_fee']['amount'], $veh['port_misc_fee']['rate'], '港杂');
|
|
$item->addMoney('retrofit_fee', $veh['retrofit_fee']['currency'], $veh['retrofit_fee']['amount'], $veh['retrofit_fee']['rate'], '改装费');
|
|
|
|
// 改装
|
|
if (count($veh['modify_list']) > 0) {
|
|
foreach ($veh['modify_list'] as $modify) {
|
|
$modify['order_item_id'] = $item->id;
|
|
StockOrderItemOptions::create($modify); // 表4
|
|
}
|
|
}
|
|
}
|
|
|
|
// 账户
|
|
if (count($data['account_list']) > 0) {
|
|
foreach ($data['account_list'] as $account) {
|
|
$account['order_id'] = $created->id;
|
|
$account['remit_date'] = strtotime($account['remit_date']);
|
|
StockOrderAccounts::create($account); // 表5
|
|
}
|
|
}
|
|
|
|
return $this->postProcess('Store', $created);
|
|
});
|
|
}
|
|
|
|
public function beforeServiceStore($data, Request $request)
|
|
{
|
|
$userId = $request->user->uid;
|
|
|
|
$data['order_no'] = generateStockNo();
|
|
$data['biz_date'] = strtotime($data['biz_date']);
|
|
$data['eta_ship_date'] = strtotime($data['eta_ship_date']);
|
|
$data['latest_arrival_date'] = strtotime($data['latest_arrival_date']);
|
|
$data['salesperson_id'] = $userId;
|
|
$data['salesperson_snapshot'] = User::where('id', $userId)->value('name') ?? '';
|
|
|
|
return $data;
|
|
}
|
|
|
|
// protected function afterServiceStore($res)
|
|
// {
|
|
|
|
// return $res;
|
|
// }
|
|
|
|
|
|
public function serviceShow(Request $request)
|
|
{
|
|
$config = $this->buildQueryConfig($request, 'show');
|
|
$item = $this->logicShow($config);
|
|
return $this->postProcess('Show', $item);
|
|
}
|
|
} |