From e7e6cbcf8e5fcb7c5b0e598ef3056826659afbec Mon Sep 17 00:00:00 2001 From: "lilong@dgg.net" <123456789> Date: Mon, 29 Mar 2021 19:30:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=A2=E5=8D=95=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Helper/function.php | 11 ++ app/Http/Controllers/ApiController.php | 12 +- .../Controllers/Crm/CustomerController.php | 7 +- .../Controllers/Order/OrderController.php | 177 ++++++++++++++++++ app/Models/Order.php | 11 ++ app/Models/OrderPay.php | 11 ++ app/Models/OrderRemark.php | 11 ++ config/freeswitch.php | 7 + .../migrations/2021_03_29_133410_order.php | 58 ++++++ .../2021_03_29_142218_order_remark.php | 40 ++++ .../2021_03_29_142739_order_pay.php | 36 ++++ database/seeds/MenuTableSeeder.php | 19 ++ database/seeds/UserTableSeeder.php | 17 +- resources/views/crm/customer/index.blade.php | 14 ++ resources/views/crm/customer/show.blade.php | 2 +- resources/views/order/order/create.blade.php | 116 ++++++++++++ resources/views/order/order/index.blade.php | 108 +++++++++++ resources/views/order/order/pay.blade.php | 45 +++++ resources/views/order/order/remark.blade.php | 90 +++++++++ routes/web.php | 42 ++++- 20 files changed, 825 insertions(+), 9 deletions(-) create mode 100644 app/Http/Controllers/Order/OrderController.php create mode 100644 app/Models/Order.php create mode 100644 app/Models/OrderPay.php create mode 100644 app/Models/OrderRemark.php create mode 100644 database/migrations/2021_03_29_133410_order.php create mode 100644 database/migrations/2021_03_29_142218_order_remark.php create mode 100644 database/migrations/2021_03_29_142739_order_pay.php create mode 100644 resources/views/order/order/create.blade.php create mode 100644 resources/views/order/order/index.blade.php create mode 100644 resources/views/order/order/pay.blade.php create mode 100644 resources/views/order/order/remark.blade.php diff --git a/app/Helper/function.php b/app/Helper/function.php index 202d3c62..78745d7e 100644 --- a/app/Helper/function.php +++ b/app/Helper/function.php @@ -14,6 +14,17 @@ if (!function_exists('uuid_generate')) { } } +if (!function_exists('create_order_num')) { + /** + * 生成唯一订单号 + * @return string + */ + function create_order_num() + { + return 'D'.date('YmdHis').\Illuminate\Support\Facades\Redis::incr('order_num_id'); + } +} + if (!function_exists('recursive')) { /** * 递归树形上下级 diff --git a/app/Http/Controllers/ApiController.php b/app/Http/Controllers/ApiController.php index 5f617858..22fd9aee 100644 --- a/app/Http/Controllers/ApiController.php +++ b/app/Http/Controllers/ApiController.php @@ -6,6 +6,7 @@ use App\Models\Cdr; use App\Models\CustomerRemark; use App\Models\Department; use App\Models\Node; +use App\Models\OrderRemark; use App\Models\Permission; use App\Models\Role; use App\Models\Sip; @@ -93,8 +94,13 @@ class ApiController extends Controller public function remarkList(Request $request) { - $id = $request->input('customer_id'); - $res = CustomerRemark::query()->where('customer_id','=',$id)->orderByDesc('id')->paginate($request->get('limit', 2));; + $node_type = $request->input('type'); + $id = $request->input('id'); + if ($node_type == 2){ + $res = CustomerRemark::query()->where('customer_id','=',$id)->orderByDesc('id')->paginate($request->get('limit', 2)); + }elseif ($node_type == 3){ + $res = OrderRemark::query()->where('order_id','=',$id)->orderByDesc('id')->paginate($request->get('limit', 2)); + } return $this->success('ok',['list'=>$res->items(),'lastPage'=>$res->lastPage()]); } @@ -140,7 +146,7 @@ class ApiController extends Controller return $this->error('呼叫失败'); } } - + //文件上传 public function upload(Request $request) { diff --git a/app/Http/Controllers/Crm/CustomerController.php b/app/Http/Controllers/Crm/CustomerController.php index 27ba840e..82afab39 100644 --- a/app/Http/Controllers/Crm/CustomerController.php +++ b/app/Http/Controllers/Crm/CustomerController.php @@ -83,7 +83,11 @@ class CustomerController extends Controller public function create() { - return View::make('crm.customer.create'); + $fields = CustomerField::query() + ->where('visiable',1) + ->orderBy('sort','asc') + ->get(); + return View::make('crm.customer.create',compact('fields')); } @@ -319,5 +323,4 @@ class CustomerController extends Controller } - } diff --git a/app/Http/Controllers/Order/OrderController.php b/app/Http/Controllers/Order/OrderController.php new file mode 100644 index 00000000..0cb18a2a --- /dev/null +++ b/app/Http/Controllers/Order/OrderController.php @@ -0,0 +1,177 @@ +ajax()){ + $user = $request->user(); + $res = Order::query() + ->where(function ($q) use ($user){ + return $q->where('frontend_user_id',$user->id)->orWhere('backend_user_id',$user->id); + }) + ->orderBy('status','asc') + ->orderByDesc('accept_time') + ->paginate($request->get('limit', 30)); + return $this->success('ok',$res->items(),$res->total()); + } + return View::make('order.order.index'); + } + + public function create(Request $request) + { + $id = $request->input('customer_id'); + $model = Customer::query()->where('id',$id)->first(); + return View::make('order.order.create',compact('model')); + } + + public function store(Request $request) + { + $id = $request->input('customer_id'); + $customer = Customer::query()->where('id',$id)->first(); + DB::beginTransaction(); + try { + $data = $request->all([ + 'total_money', + 'first_money', + 'mid_money', + 'last_money', + 'user_id', + ]); + if ($data['total_money'] != ($data['first_money']+$data['mid_money']+$data['last_money'])){ + return $this->error('订单金额比例不正确'); + } + $user = User::query()->where('id',$data['user_id'])->first(); + $customer->update(['is_end'=>1]); + Order::create([ + 'num' => create_order_num(), + 'customer_id' => $customer->id, + 'name' => $customer->name, + 'contact_name' => $customer->contact_name, + 'contact_phone' => $customer->contact_phone, + 'total_money' => $data['total_money'], + 'first_money' => $data['first_money'], + 'mid_money' => $data['mid_money'], + 'last_money' => $data['last_money'], + 'payed_money' => 0, + 'frontend_department_id' => $customer->owner_department_id??0, + 'frontend_user_id' => $customer->owner_user_id, + 'frontend_user_nickname' => $customer->owner_user_nickname, + 'accept_time' => date('Y-m-d H:i:s'), + 'backend_department_id' => $user->department_id??0, + 'backend_user_id' => $user->id, + 'backend_user_nickname' => $user->nickname, + 'created_user_id' => $request->user()->id, + ]); + DB::commit(); + return $this->success(); + }catch (\Exception $exception){ + DB::rollBack(); + Log::error('生成订单异常:'.$exception->getMessage()); + return $this->error(); + } + } + + + public function remark(Request $request) + { + $id = $request->input('id'); + $model = Order::query()->where('id',$id)->first(); + $nodes = Node::query()->whereIn('type',[1,3])->orderBy('sort','asc')->get(); + if ($request->ajax()){ + $data = $request->all(['node_id','content','next_follow_time']); + $old_node_id = $model->node_id; + $old_node_name = null; + $new_node_id = $data['node_id']??0; + $new_node_name = null; + foreach ($nodes as $node){ + if ($node->id == $old_node_id){ + $old_node_name = $node->name; + } + if ($node->id == $new_node_id){ + $new_node_name = $node->name; + } + } + DB::beginTransaction(); + try { + $model->update([ + 'follow_time' => date('Y-m-d H:i:s'), + 'node_id' => $new_node_id, + 'node_name' => $new_node_name, + 'follow_user_id' => $request->user()->id, + 'follow_user_nickname' => $request->user()->nickname, + 'next_follow_time' => $data['next_follow_time'], + 'remark' => $data['content'], + ]); + OrderRemark::create([ + 'order_id' => $model->id, + 'old_node_id' => $old_node_id, + 'old_node_name' => $old_node_name, + 'new_node_id' => $new_node_id, + 'new_node_name' => $new_node_name, + 'content' => $data['content'], + 'next_follow_time' => $data['next_follow_time'], + 'user_id' => $request->user()->id, + 'user_nickname' => $request->user()->nickname, + ]); + DB::commit(); + return $this->success(); + }catch (\Exception $exception){ + DB::rollBack(); + Log::error('备注跟进订单异常:'.$exception->getMessage()); + return $this->error(); + } + } + return View::make('order.order.remark',compact('model')); + } + + + public function payForm(Request $request) + { + $model = Order::query()->where('id',$request->input('id'))->first(); + return View::make('order.order.pay',compact('model')); + } + + + public function pay(Request $request) + { + $model = Order::query()->where('id',$request->input('id'))->first(); + DB::beginTransaction(); + try { + $data = $request->all([ + 'money', + 'pay_type', + 'content', + ]); + OrderPay::create([ + 'order_id' => $model->id, + 'money' => $data['money'], + 'pay_type' => $data['pay_type'], + 'content' => $data['content'], + 'status' => 0, + ]); + DB::commit(); + return $this->success('操作成功,等待财务审核'); + }catch (\Exception $exception){ + DB::rollBack(); + Log::error('付款异常:'.$exception->getMessage()); + return $this->error(); + } + } + +} diff --git a/app/Models/Order.php b/app/Models/Order.php new file mode 100644 index 00000000..81a11c86 --- /dev/null +++ b/app/Models/Order.php @@ -0,0 +1,11 @@ + '文本框', ], + 'pay_type' => [ + 1 => '现金', + 2 => '对公账户', + 3 => '支付宝', + 4 => '微信', + 5 => '其它', + ], ]; diff --git a/database/migrations/2021_03_29_133410_order.php b/database/migrations/2021_03_29_133410_order.php new file mode 100644 index 00000000..569c56e3 --- /dev/null +++ b/database/migrations/2021_03_29_133410_order.php @@ -0,0 +1,58 @@ +bigIncrements('id'); + $table->string('num')->comment('订单号'); + $table->unsignedBigInteger('customer_id')->comment('客户ID'); + $table->string('name')->nullable()->comment('客户名称'); + $table->string('contact_name')->nullable()->comment('联系人'); + $table->string('contact_phone')->nullable()->comment('联系电话'); + $table->decimal('total_money',10,2)->comment('订单总金额'); + $table->decimal('first_money',10,2)->comment('前期款'); + $table->decimal('mid_money',10,2)->comment('中期款'); + $table->decimal('last_money',10,2)->comment('尾款'); + $table->decimal('payed_money',10,2)->comment('已付金额'); + $table->unsignedBigInteger('frontend_department_id')->comment('订单成单人部门ID'); + $table->unsignedBigInteger('frontend_user_id')->comment('订单成单人ID'); + $table->string('frontend_user_nickname')->comment('订单成单人昵称'); + $table->dateTime('accept_time')->nullable()->comment('接单时间'); + $table->unsignedBigInteger('backend_department_id')->comment('订单生产人部门ID'); + $table->unsignedBigInteger('backend_user_id')->comment('订单生产人ID'); + $table->string('backend_user_nickname')->comment('订单生产人昵称'); + $table->unsignedBigInteger('created_user_id')->comment('订单创建人ID'); + $table->tinyInteger('status')->default(0)->comment('订单状态,0生产中,1已完成,2作废'); + + $table->unsignedBigInteger('node_id')->default(0)->comment('当前节点ID'); + $table->string('node_name')->nullable()->comment('当前节点名称'); + $table->timestamp('follow_time')->nullable()->comment('最近跟进时间'); + $table->unsignedBigInteger('follow_user_id')->default(0)->comment('最近跟进人ID'); + $table->string('follow_user_nickname')->nullable()->comment('最近跟进人姓名'); + $table->timestamp('next_follow_time')->nullable()->comment('下次跟进时间'); + $table->text('remark')->nullable()->comment('备注'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('order'); + } +} diff --git a/database/migrations/2021_03_29_142218_order_remark.php b/database/migrations/2021_03_29_142218_order_remark.php new file mode 100644 index 00000000..c6b6950b --- /dev/null +++ b/database/migrations/2021_03_29_142218_order_remark.php @@ -0,0 +1,40 @@ +bigIncrements('id'); + $table->unsignedBigInteger('order_id')->comment('订单ID'); + $table->unsignedBigInteger('old_node_id')->default(0)->comment('原节点ID'); + $table->unsignedBigInteger('new_node_id')->default(0)->comment('新节点ID'); + $table->string('old_node_name')->nullable()->comment('原节点名称'); + $table->string('new_node_name')->nullable()->comment('新节点名称'); + $table->text('content')->nullable()->comment('备注跟进内容'); + $table->unsignedBigInteger('user_id')->default(0)->comment('备注跟进人ID'); + $table->string('user_nickname')->nullable()->comment('备注跟进人昵称'); + $table->dateTime('next_follow_time')->nullable()->comment('下次跟进时间'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('order_remark'); + } +} diff --git a/database/migrations/2021_03_29_142739_order_pay.php b/database/migrations/2021_03_29_142739_order_pay.php new file mode 100644 index 00000000..1ebdbca8 --- /dev/null +++ b/database/migrations/2021_03_29_142739_order_pay.php @@ -0,0 +1,36 @@ +bigIncrements('id'); + $table->unsignedBigInteger('order_id')->comment('订单ID'); + $table->decimal('money',10,2)->comment('金额'); + $table->tinyInteger('pay_type')->comment('1现金|2对公账户|3支付宝|4微信|5其它'); + $table->text('content')->comment('备注'); + $table->tinyInteger('status')->default(0)->comment('审核状态,0待审核,1审核通过,2审核不通过'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('order_pay'); + } +} diff --git a/database/seeds/MenuTableSeeder.php b/database/seeds/MenuTableSeeder.php index baf0b33a..1c8af797 100644 --- a/database/seeds/MenuTableSeeder.php +++ b/database/seeds/MenuTableSeeder.php @@ -201,6 +201,25 @@ class MenuTableSeeder extends Seeder ], ] ], + [ + 'name' => '订单模块', + 'route' => null, + 'url' => null, + 'icon' => 'layui-icon-align-left', + 'type' => 2, + 'sort' => 2, + 'permission_name' => 'order', + 'child' => [ + [ + 'name' => '订单管理', + 'route' => 'order.order', + 'url' => null, + 'icon' => 'layui-icon-form', + 'type' => 1, + 'permission_name' => 'order.order', + ], + ] + ], ]; $permissions = \App\Models\Permission::pluck('id','name')->toArray(); foreach ($datas as $k1 => $d1){ diff --git a/database/seeds/UserTableSeeder.php b/database/seeds/UserTableSeeder.php index d83be48c..e4dc1b60 100644 --- a/database/seeds/UserTableSeeder.php +++ b/database/seeds/UserTableSeeder.php @@ -201,7 +201,6 @@ class UserTableSeeder extends Seeder ['name' => 'crm.customer.remark', 'display_name' => '备注跟进'], ['name' => 'crm.customer.list_all', 'display_name' => '查看所有客户'], ['name' => 'crm.customer.list_department', 'display_name' => '查看本部门客户'], - ['name' => 'crm.customer.order', 'display_name' => '下单'], ['name' => 'crm.customer.transfer', 'display_name' => '移交'], ['name' => 'crm.customer.remove', 'display_name' => '剔除'], ] @@ -232,6 +231,22 @@ class UserTableSeeder extends Seeder ], ], + [ + 'name' => 'order', + 'display_name' => '订单模块', + 'child' => [ + [ + 'name' => 'order.order', + 'display_name' => '订单管理', + 'child' => [ + ['name' => 'order.order.create', 'display_name' => '下单'], + ['name' => 'order.order.pay', 'display_name' => '付款'], + ['name' => 'order.order.remark', 'display_name' => '跟进'], + ['name' => 'order.order.destroy', 'display_name' => '删除'], + ] + ], + ], + ], ]; foreach ($permissions as $pem1) { //生成一级权限 diff --git a/resources/views/crm/customer/index.blade.php b/resources/views/crm/customer/index.blade.php index c050028c..947f6010 100644 --- a/resources/views/crm/customer/index.blade.php +++ b/resources/views/crm/customer/index.blade.php @@ -82,6 +82,9 @@ @can('crm.customer.remove') 剔除 @endcan + @can('order.order.create') + 下单 + @endcan @@ -113,6 +116,9 @@ ,{field: 'follow_time', title: '跟进时间'} ,{field: 'follow_user_nickname', title: '跟进人'} ,{field: 'remark', title: '跟进备注'} + ,{field: 'is_end', title: '是否成单',templet:function (d) { + return d.is_end!=1?'跟进中':'已成单'; + }} ,{fixed: 'right', width: 250, align:'center', toolbar: '#options', title:'操作'} ]] }); @@ -160,6 +166,14 @@ } }); }); + } else if (layEvent === 'order'){ + layer.open({ + type: 2, + title: "下单", + shadeClose: true, + area: ["800px","600px"], + content: '/order/order/create?customer_id='+data.id, + }) } }); $("#addBtn").click(function () { diff --git a/resources/views/crm/customer/show.blade.php b/resources/views/crm/customer/show.blade.php index cc2b9712..d6d259fa 100644 --- a/resources/views/crm/customer/show.blade.php +++ b/resources/views/crm/customer/show.blade.php @@ -176,7 +176,7 @@ flow.load({ elem: '#remark_list_box' //流加载容器 ,done: function(page, next){ //执行下一页的回调 - $.post('{{route('api.remarkList',['customer_id'=>$model->id])}}',{page:page},function (res) { + $.post('{{route('api.remarkList')}}',{id:'{{$model->id}}',page:page,type:2},function (res) { var _html = ''; res.data.list.forEach(function (item,index) { console.log(item) diff --git a/resources/views/order/order/create.blade.php b/resources/views/order/order/create.blade.php new file mode 100644 index 00000000..178824aa --- /dev/null +++ b/resources/views/order/order/create.blade.php @@ -0,0 +1,116 @@ +@extends('base') + +@section('content') +
+
+
+ {{csrf_field()}} +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ @include('common.get_user') +
+
+
+ +
+ +
+
+
+ +
+
+ +
+
+ +
+
根据总金额和比例自动结算
+
+
+
+ +
+
+ +
+
+ +
+
根据总金额和比例自动结算
+
+
+
+ +
+
+ +
+
+ +
+
根据总金额和比例自动结算
+
+
+
+
+ +
+
+
+
+
+@endsection + +@section('script') + +@endsection diff --git a/resources/views/order/order/index.blade.php b/resources/views/order/order/index.blade.php new file mode 100644 index 00000000..9d55b8de --- /dev/null +++ b/resources/views/order/order/index.blade.php @@ -0,0 +1,108 @@ +@extends('base') + +@section('content') +
+
+
+
+ @can('order.order.destroy') + + @endcan + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+
+@endsection + +@section('script') + +@endsection diff --git a/resources/views/order/order/pay.blade.php b/resources/views/order/order/pay.blade.php new file mode 100644 index 00000000..2c7d93d1 --- /dev/null +++ b/resources/views/order/order/pay.blade.php @@ -0,0 +1,45 @@ +@extends('base') + +@section('content') +
+
+
+
+ {{csrf_field()}} +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+@endsection + + + diff --git a/resources/views/order/order/remark.blade.php b/resources/views/order/order/remark.blade.php new file mode 100644 index 00000000..704a655e --- /dev/null +++ b/resources/views/order/order/remark.blade.php @@ -0,0 +1,90 @@ +@extends('base') + +@section('content') +
+
+
+
+
+
跟进记录
+
+
    +
    +
    +
    +
    +
    +
    备注跟进
    +
    +
    + {{csrf_field()}} +
    + +
    + @include('common.get_node',['node_id'=>$model->node_id,'type'=>3]) +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +@endsection + +@section('script') + +@endsection + diff --git a/routes/web.php b/routes/web.php index d00e1472..691adf4d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -285,8 +285,7 @@ Route::group(['prefix'=>'crm','namespace'=>'Crm','middleware'=>['auth','permissi Route::match(['get','post'],'customer/{id}/remark','CustomerController@remark')->name('crm.customer.remark')->middleware('permission:crm.customer.remark'); //移交 Route::post('customer/transfer','CustomerController@transfer')->name('crm.customer.transfer')->middleware('permission:crm.customer.transfer'); - //下单 - Route::post('customer/{id}/order','CustomerController@order')->name('crm.customer.order')->middleware('permission:crm.customer.order'); + }); //公海库 @@ -327,3 +326,42 @@ Route::group(['prefix'=>'chat','namespace'=>'Chat','middleware'=>['auth','permis }); }); + + +/* +|-------------------------------------------------------------------------- +| 订单模块 +|-------------------------------------------------------------------------- +*/ + +Route::group(['prefix'=>'order','namespace'=>'Order','middleware'=>['auth','permission:order']],function () { + + //订单 + Route::group([],function (){ + Route::get('order','OrderController@index')->name('order.order')->middleware('permission:order.order'); + //下单 + Route::get('order/create','OrderController@create')->name('order.order.create')->middleware('permission:order.order.create'); + Route::post('order/store','OrderController@store')->name('order.order.store')->middleware('permission:order.order.create'); + //付款 + Route::get('order/payForm','OrderController@payForm')->name('order.order.payForm')->middleware('permission:order.order.pay'); + Route::post('order/pay','OrderController@pay')->name('order.order.pay')->middleware('permission:order.order.pay'); + //备注跟进 + Route::match(['get','post'],'order/remark','OrderController@remark')->name('order.order.remark')->middleware('permission:order.order.remark'); + //删除 + Route::delete('order/destroy','OrderController@destroy')->name('order.order.destroy')->middleware('permission:order.order.destroy'); + }); + +}); + + + + + + + + + + + + +