From 0273648f71609bca3ce82475b393480a1be6c285 Mon Sep 17 00:00:00 2001 From: liapples Date: Wed, 27 Oct 2021 00:35:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=8C=E4=B8=9A=E4=BA=A7=E5=93=81=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MySQL_change.sql | 7 ++ .../Controllers/IndustryOrderController.php | 84 ++++++++++++++- .../Controllers/IndustryOrderController.php | 28 ++++- .../Extensions/Grid/IndustryOrderAudit.php | 88 +++++++++++++++ app/Http/Controllers/Api/TestController.php | 100 +++++++++++++++++- 5 files changed, 301 insertions(+), 6 deletions(-) create mode 100644 app/AdminSupplier/Extensions/Grid/IndustryOrderAudit.php diff --git a/MySQL_change.sql b/MySQL_change.sql index c6ad657..4883370 100644 --- a/MySQL_change.sql +++ b/MySQL_change.sql @@ -386,3 +386,10 @@ ALTER TABLE `guides` # 21:06 ‎2021/‎10/‎25 ALTER TABLE `orders` CHANGE COLUMN `price` `price` DECIMAL(20,2) NOT NULL COMMENT '订单总价(单价*数量)' AFTER `num`; + + + +# 10:31 ‎2021/‎10/‎26 +ALTER TABLE `industry_orders` + ADD COLUMN `audit_status` TINYINT NOT NULL DEFAULT 0 COMMENT '审核状态,-1拒绝,0待审核,1通过' AFTER `info`, + ADD COLUMN `audit_opinion` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '审核不通过原因' AFTER `audit_status`; diff --git a/app/AdminAgent/Controllers/IndustryOrderController.php b/app/AdminAgent/Controllers/IndustryOrderController.php index f4e5a39..9b6fd8e 100644 --- a/app/AdminAgent/Controllers/IndustryOrderController.php +++ b/app/AdminAgent/Controllers/IndustryOrderController.php @@ -7,9 +7,12 @@ use App\Common\OrderStatus; use App\Common\PayType; use App\Models\AdminSetting; use Dcat\Admin\Admin; +use Dcat\Admin\Form; use Dcat\Admin\Grid; use Dcat\Admin\Show; use Dcat\Admin\Http\Controllers\AdminController; +use Dcat\Admin\Widgets\Alert; +use Dcat\Admin\Widgets\Modal; use Dcat\Admin\Widgets\Table; use EasyWeChat\Factory; use EasyWeChat\Kernel\Http\StreamResponse; @@ -61,12 +64,31 @@ class IndustryOrderController extends AdminController })->xl(); $grid->column('title')->limit(15); $grid->column('picture')->image('', 80, 80); + $grid->column('pay_type')->using(PayType::array()); $grid->column('status') ->using(OrderStatus::array()) ->if(fn() => $this->status == OrderStatus::UNPAID) ->display(fn() => '付款') ->if(fn() => $this->status == OrderStatus::PAY_EARNEST) - ->display(fn() => '付尾款'); + ->display(fn() => '付尾款') + ->if(fn() => $this->audit_status == -1) + ->then(function ($column) { + $column->display('') + ->append(function () { + return Modal::make() + ->lg() + ->title('审核信息') + ->body($this->audit_opinion) + ->button(''); + }) + ->append(function () { + return ' 编辑'; + }); + }) + ->if(fn() => $this->audit_status == 0) + ->then(function ($column) { + $column->display('待审核')->label(); + }); $grid->column('paid_at'); $grid->column('verify_qrcode', '核销二维码') ->if(fn() => $this->verify_code) @@ -225,4 +247,64 @@ JS 'trade_type' => 'NATIVE', // 请对应换成你的支付方式对应的值类型 ]); } + + protected function form() + { + return Form::make(new IndustryOrder(), function (Form $form) { + if ($form->model()->agent_id != Admin::user()->id) { + Admin::exit('数据不存在'); + } + if ($form->model()->audit_status != -1) { + return redirect(admin_url('industry_order/list'))->send(); + } + + $form->display('id'); + + $form->number('num'); + $form->number('name'); + $form->mobile('mobile'); + + //载入信息收集表单数据 + if (!empty($form->model()->info)) { + $form->html(Alert::make(null, '客户信息收集表单')->warning())->width(12); + $fields = $form->model()->info; + foreach ($fields as $v) { + if (!isset($v['type'], $v['field'], $v['value'])) { + continue; + } + if ($v['type'] == 'radio' || $v['type'] == 'checkbox') { + $form->{$v['type']}('info.' . $v['field']) + ->options(array_combine($v['options'], $v['options'])) + ->required((bool)$v['required']) + ->customFormat(fn() => $v['value']); + } else if ($v['type'] == 'image') { + $form->multipleImage('info.' . $v['field']) + ->uniqueName()->saveFullUrl() + ->required((bool)$v['required']) + ->customFormat(fn() => $v['value']); + } else { + $form->{$v['type']}('info.' . $v['field']) + ->required((bool)$v['required']) + ->customFormat(fn() => $v['value']); + } + } + } + })->saving(function (Form $form) { + //信息收集表处理,保留字段类型等信息,便于后台显示 + $order_info = $form->info ?? []; + if (!empty($order_info)) { + $fields = array_column($form->model()->info, null, 'field'); + foreach ($fields as &$field) { + if ($field['required'] && !isset($order_info[$field['field']])) { //判断是否必填 + return $form->response()->error($field['field'] . '不能为空'); + } + $field['value'] = $order_info[$field['field']] ?? ''; + } + $form->info = $fields; + } + + $form->hidden(['audit_status']); + $form->audit_status = 0; + }); + } } diff --git a/app/AdminSupplier/Controllers/IndustryOrderController.php b/app/AdminSupplier/Controllers/IndustryOrderController.php index 9c453d6..137fc12 100644 --- a/app/AdminSupplier/Controllers/IndustryOrderController.php +++ b/app/AdminSupplier/Controllers/IndustryOrderController.php @@ -2,9 +2,11 @@ namespace App\AdminSupplier\Controllers; +use App\AdminSupplier\Extensions\Grid\IndustryOrderAudit; use App\AdminSupplier\Extensions\Grid\IndustryOrderStatus; use App\AdminSupplier\Repositories\IndustryOrder; use App\Common\OrderStatus; +use App\Common\PayType; use Dcat\Admin\Admin; use Dcat\Admin\Form; use Dcat\Admin\Grid; @@ -58,10 +60,28 @@ class IndustryOrderController extends AdminController $grid->column('industry_product_id', '产品ID'); $grid->column('title')->limit(15); $grid->column('picture')->image('', 60, 60); - $grid->column('status') - ->using(OrderStatus::array()) - ->if(fn() => $this->status == OrderStatus::OFFLINE_UNPAID) - ->action(new IndustryOrderStatus); + $grid->column('pay_type')->using(PayType::array()); + $grid->column('订单状态') + //待审核 + ->if(fn() => $this->audit_status == 0) + ->then(function ($column) { + $column->append((new IndustryOrderAudit(null, 1))->setKey($this->id))->append(' '); + $column->append((new IndustryOrderAudit(null, 2))->setKey($this->id)); + }) + //审核拒绝 + ->if(fn() => $this->audit_status == -1) + ->then(function ($column) { + $column->append('已拒绝')->label(); + }) + //审核通过 + ->if(fn() => $this->audit_status == 1) + ->then(function ($column) { + if ($this->status == OrderStatus::OFFLINE_UNPAID) { + $column->action(new IndustryOrderStatus); + } else { + $column->append(OrderStatus::array()[$this->status]); + } + }); $grid->column('paid_at'); // $grid->column('timeout'); $grid->column('created_at'); diff --git a/app/AdminSupplier/Extensions/Grid/IndustryOrderAudit.php b/app/AdminSupplier/Extensions/Grid/IndustryOrderAudit.php new file mode 100644 index 0000000..159d985 --- /dev/null +++ b/app/AdminSupplier/Extensions/Grid/IndustryOrderAudit.php @@ -0,0 +1,88 @@ +action = $action; //$action:1=通过;2=拒绝 + $this->title = $action == 1 ? '通过' : '拒绝'; + } + + protected function html() + { + $class = $this->action == 1 ? 'btn btn-sm btn-success' : 'btn btn-sm btn-danger'; + $this->appendHtmlAttribute('class', $class); + $this->defaultHtmlAttribute('href', 'javascript:;'); + + return "formatHtmlAttributes()}>{$this->title}"; + } + + protected function actionScript() + { + if ($this->action == 2) { + return <<getKey(); + $status = $request->action == 1 ? 1 : -1; + + try { + $order = IndustryOrder::where('audit_status', 0)->find($id); + if (!$order) { + throw new \Exception('订单不存在或已经审核过了'); + } + + if (!is_null($request->audit_opinion)) { + $order->audit_opinion = $request->audit_opinion; + } + $order->audit_status = $status; + $order->save(); + + return $this->response()->success('操作成功')->refresh(); + } catch (\Exception $e) { + return $this->response()->error($e->getMessage())->refresh(); + } + } + + public function confirm() + { + if ($this->action == 1) { + return ['确定要设置为已通过吗?', '']; + } + } + + public function parameters() + { + return [ + 'action' => $this->action, + ]; + } +} diff --git a/app/Http/Controllers/Api/TestController.php b/app/Http/Controllers/Api/TestController.php index fe0974c..cf60c25 100644 --- a/app/Http/Controllers/Api/TestController.php +++ b/app/Http/Controllers/Api/TestController.php @@ -2,7 +2,15 @@ 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; @@ -15,9 +23,99 @@ class TestController { public function index() { - dd(Supplier::class); + 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