海南旅游SAAS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

171 lines
4.8 KiB

<?php
namespace App\Http\Controllers\Api;
use App\Common\StatementType;
use App\Models\Agent;
use App\Models\Guide;
use App\Models\Order;
use App\Models\OrderProductItem;
use App\Models\Supplier;
use App\Service\WithdrawalService;
use App\Traits\DemandTraits;
use App\Traits\StatementTraits;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
/**
* 仅用于测试
* Class TController
* @package App\Http\Controllers\Api
*/
class TestController
{
public function index()
{
dd($this->fund(Order::find(221)));
}
public function fund($order)
{
$service = new WithdrawalService();
DB::beginTransaction();
try {
//最后批量插入
$statementCreate = [];
$cost = 0;
//如果有地接价格 分帐给地接
if ($order->guide_price > 0) {
$guidePrice = $order->guide_price;
$cost = bcadd($cost, $order->guide_price, 6);
//成本价 加上地接价格
$statementCreate[] = $service->createByOrder(
$order->guide_price,
StatementType::ORDER,
$order->guide->id,
DemandTraits::$col[2],
$order->id,
StatementTraits::$type[0]
);
//抽成
$guide = Guide::query()->where('id', $order->guide->id)->lockForUpdate()->first();
$guide->balance = bcadd($guide->balance, $guidePrice, 6);
$guide->save();
}
//分账给供应商
$orderItem = OrderProductItem::query()
->where('order_id', $order->id)
->with('supplier')
->select('*')
->selectRaw('sum(price) as sum_price,sum(single_deposit * num) as sum_persons')
->groupBy('supplier_id')
->get();
foreach ($orderItem as $v) {
$cost = bcadd($cost, $v->sum_price, 6);
$supplierPrice = $v->sum_price;
$statementCreate[] = $service->createByOrder(
$v->sum_price,
StatementType::ORDER,
$v->supplier_id,
DemandTraits::$col[1],
$order->id,
StatementTraits::$type[0]
);
$supplier = Supplier::query()->where('id', $v->supplier_id)->lockForUpdate()->first();
//处理交易金
if ($v->sum_persons > 0) {
//计算交易金
$deposit = $v->sum_persons;
//流水
//扣
$supplier->trade_balance = bcsub($supplier->trade_balance,$deposit,6);
}
$supplier->balance = bcadd($supplier->balance, $supplierPrice, 6);
$supplier->save();
}
//分账给代理商
//成本价 加上地接价格
$agentPrice = bcsub($order->price, $cost, 2);
$statementCreate[] = $service->createByOrder(
$agentPrice,
StatementType::ORDER,
$order->agent_id,
DemandTraits::$col[0],
$order->id,
StatementTraits::$type[0]
);
$agent = Agent::query()->where('id', $order->agent->id)->lockForUpdate()->first();
$agent->balance = bcadd($agent->balance, $agentPrice, 6);
$agent->save();
if (!empty($statementCreate)) {
$order->statement()->createMany($statementCreate);
}
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
return $this->error($e->getMessage());
}
}
/**
* 模拟登录
* @param $user_id
* @return string
*/
private function login($user_id)
{
$token_key = md5($user_id . env('APP_KEY'));
Cache::put($token_key, $user_id);
return $token_key;
}
public function index2()
{
$handle = fopen(base_path('area.txt'), 'r');
if ($handle) {
DB::statement('TRUNCATE `areas`;');
while (($line = fgets($handle, 4096)) !== false) {
$line = trim($line);
$last2 = substr($line, 4, 2); //区划码后2位
$front2 = substr($line, 0, 2); //区划码前2位
$front4 = substr($line, 0, 4); //区划码前4位
//判断是否是直辖市,是直辖市则再插入一次上条记录作为二级联动
if (isset($last4, $arr, $parent_arr[$front2]) && $last4 == '0000' && $last2 != '00') {
$insert_id = DB::table('areas')->insertGetId(['code' => $arr[0], 'pid' => $parent_arr[$front2], 'name' => $arr[1]]);
$parent_arr[$front4] = $insert_id;
//对直辖市不做省直辖县处理,如:重庆市
$parent_arr[$front2] = $insert_id;
}
$last4 = substr($line, 2, 4); //区划码后4位
$arr = preg_split('/\s+/', $line);
if (count($arr) !== 2) continue;
if ($last4 == '0000') {
$insert_id = DB::table('areas')->insertGetId(['code' => $arr[0], 'pid' => 0, 'name' => $arr[1]]);
$parent_arr[$front2] = $insert_id;
} else if ($last2 == '00') {
$insert_id = DB::table('areas')->insertGetId(['code' => $arr[0], 'pid' => $parent_arr[$front2], 'name' => $arr[1]]);
$parent_arr[$front4] = $insert_id;
} else {
//考虑到省直辖县级市情况,如:海南琼海市、湖北仙桃市等,但重庆市的省辖县除外(已在上面判断直辖市逻辑中做处理)
$parent_id = $parent_arr[$front4] ?? $parent_arr[$front2];
DB::table('areas')->insertGetId(['code' => $arr[0], 'pid' => $parent_id, 'name' => $arr[1]]);
}
}
} else {
return 'open file fail!';
}
return 'success';
}}