添加财务审核模块

This commit is contained in:
老李 2021-03-29 23:13:38 +08:00
parent e7e6cbcf8e
commit 01168c6dec
17 changed files with 440 additions and 60 deletions

View File

@ -14,6 +14,17 @@ if (!function_exists('uuid_generate')) {
} }
} }
if (!function_exists('create_customer_num')) {
/**
* 生成客户编号
* @return string
*/
function create_customer_num()
{
return 'K'.date('YmdHis').\Illuminate\Support\Facades\Redis::incr('customer_num_id');
}
}
if (!function_exists('create_order_num')) { if (!function_exists('create_order_num')) {
/** /**
* 生成唯一订单号 * 生成唯一订单号

View File

@ -0,0 +1,71 @@
<?php
namespace App\Http\Controllers\Account;
use App\Http\Controllers\Controller;
use App\Models\OrderPay;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\View;
class PayController extends Controller
{
public function index(Request $request)
{
if ($request->ajax()){
$res = OrderPay::with('order')
->orderBy('status','asc')
->orderByDesc('created_at')
->paginate($request->input('limit',30));
return $this->success('ok',$res->items(),$res->total());
}
return View::make('account.pay.index');
}
public function check(Request $request)
{
$model = OrderPay::with('order')->where('id','=',$request->input('id'))->first();
if ($request->ajax()){
$data = $request->all(['check_result','status']);
if ($model->order==null){
return $this->error('订单已不存在');
}
DB::beginTransaction();
try {
if ($data['status']==2&&!$data['check_result']){
return $this->error('请备注审核未通过原因');
}
$model->update([
'check_result' => $data['check_result'],
'status' => $data['status'],
'check_user_id' => $request->user()->id,
'check_user_nickname' => $request->user()->nickname,
'check_time' => date('Y-m-d H:i:s'),
]);
if ($data['status']==1){
$payed_money = $model->order->payed_money + $model->money;
if ($payed_money >= $model->order->total_money){
$model->order->update([
'payed_money' => $payed_money,
'status' => 1,
]);
}else{
$model->order->update([
'payed_money' => $payed_money,
]);
}
}
DB::commit();
return $this->success();
}catch (\Exception $exception){
DB::rollBack();
Log::error('审核异常:'.$exception->getMessage());
return $this->error();
}
}
return View::make('account.pay.check',compact('model'));
}
}

View File

@ -6,6 +6,8 @@ use App\Models\Cdr;
use App\Models\CustomerRemark; use App\Models\CustomerRemark;
use App\Models\Department; use App\Models\Department;
use App\Models\Node; use App\Models\Node;
use App\Models\Order;
use App\Models\OrderPay;
use App\Models\OrderRemark; use App\Models\OrderRemark;
use App\Models\Permission; use App\Models\Permission;
use App\Models\Role; use App\Models\Role;
@ -190,4 +192,12 @@ class ApiController extends Controller
} }
public function payList(Request $request)
{
$id = $request->input('id');
$res = OrderPay::query()->where('order_id','=',$id)->orderByDesc('id')->paginate($request->get('limit', 2));
return $this->success('ok',['list'=>$res->items(),'lastPage'=>$res->lastPage()]);
}
} }

View File

@ -87,7 +87,7 @@ class AssignmentController extends Controller
DB::beginTransaction(); DB::beginTransaction();
try{ try{
$customer_id = DB::table('customer')->insertGetId([ $customer_id = DB::table('customer')->insertGetId([
'uuid' => uuid_generate(), 'uuid' => create_customer_num(),
'name' => $data['name'], 'name' => $data['name'],
'contact_name' => $data['contact_name'], 'contact_name' => $data['contact_name'],
'contact_phone' => $data['contact_phone'], 'contact_phone' => $data['contact_phone'],

View File

@ -22,6 +22,7 @@ class CustomerController extends Controller
{ {
if ($request->ajax()){ if ($request->ajax()){
$data = $request->all([ $data = $request->all([
'uuid',
'name', 'name',
'contact_name', 'contact_name',
'contact_phone', 'contact_phone',
@ -42,6 +43,10 @@ class CustomerController extends Controller
} }
}) })
->where('status','=',3) ->where('status','=',3)
//客户编号
->when($data['uuid'], function ($query) use ($data) {
return $query->where('uuid', $data['uuid']);
})
//客户名称 //客户名称
->when($data['name'], function ($query) use ($data) { ->when($data['name'], function ($query) use ($data) {
return $query->where('name', $data['name']); return $query->where('name', $data['name']);
@ -114,7 +119,7 @@ class CustomerController extends Controller
DB::beginTransaction(); DB::beginTransaction();
try{ try{
$customer_id = DB::table('customer')->insertGetId([ $customer_id = DB::table('customer')->insertGetId([
'uuid' => uuid_generate(), 'uuid' => create_customer_num(),
'name' => $data['name'], 'name' => $data['name'],
'contact_name' => $data['contact_name'], 'contact_name' => $data['contact_name'],
'contact_phone' => $data['contact_phone'], 'contact_phone' => $data['contact_phone'],

View File

@ -21,10 +21,32 @@ class OrderController extends Controller
{ {
if ($request->ajax()){ if ($request->ajax()){
$user = $request->user(); $user = $request->user();
$data = $request->all([
'name',
'contact_name',
'contact_phone',
'num',
]);
$res = Order::query() $res = Order::query()
->where(function ($q) use ($user){ ->where(function ($q) use ($user){
return $q->where('frontend_user_id',$user->id)->orWhere('backend_user_id',$user->id); return $q->where('frontend_user_id',$user->id)->orWhere('backend_user_id',$user->id);
}) })
//订单号
->when($data['num'], function ($query) use ($data) {
return $query->where('num', $data['num']);
})
//客户名称
->when($data['name'], function ($query) use ($data) {
return $query->where('name', $data['name']);
})
//联系电话
->when($data['contact_phone'], function ($query) use ($data) {
return $query->where('contact_phone', $data['contact_phone']);
})
//联系人
->when($data['contact_name'], function ($query) use ($data) {
return $query->where('contact_name', $data['contact_name'] );
})
->orderBy('status','asc') ->orderBy('status','asc')
->orderByDesc('accept_time') ->orderByDesc('accept_time')
->paginate($request->get('limit', 30)); ->paginate($request->get('limit', 30));
@ -57,7 +79,9 @@ class OrderController extends Controller
return $this->error('订单金额比例不正确'); return $this->error('订单金额比例不正确');
} }
$user = User::query()->where('id',$data['user_id'])->first(); $user = User::query()->where('id',$data['user_id'])->first();
$customer->update(['is_end'=>1]); if ($customer->is_end!=1){
$customer->update(['is_end'=>1]);
}
Order::create([ Order::create([
'num' => create_order_num(), 'num' => create_order_num(),
'customer_id' => $customer->id, 'customer_id' => $customer->id,
@ -164,6 +188,8 @@ class OrderController extends Controller
'pay_type' => $data['pay_type'], 'pay_type' => $data['pay_type'],
'content' => $data['content'], 'content' => $data['content'],
'status' => 0, 'status' => 0,
'created_user_id' => $request->user()->id,
'created_user_nickname' => $request->user()->nickname,
]); ]);
DB::commit(); DB::commit();
return $this->success('操作成功,等待财务审核'); return $this->success('操作成功,等待财务审核');

View File

@ -3,9 +3,28 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
class OrderPay extends Model class OrderPay extends Model
{ {
protected $table = 'order_pay'; protected $table = 'order_pay';
protected $guarded = ['id']; protected $guarded = ['id'];
protected $appends = ['pay_type_name','status_name'];
public function getPayTypeNameAttribute()
{
return $this->attributes['pay_type_name'] = Arr::get(config('freeswitch.pay_type'),$this->pay_type,'-');
}
public function getStatusNameAttribute()
{
return $this->attributes['status_name'] = Arr::get([0=>'待审核',1=>'审核通过',2=>'审核不通过'],$this->status,'-');
}
public function order()
{
return $this->hasOne(Order::class,'id','order_id');
}
} }

View File

@ -20,6 +20,12 @@ class OrderPay extends Migration
$table->tinyInteger('pay_type')->comment('1现金|2对公账户|3支付宝|4微信|5其它'); $table->tinyInteger('pay_type')->comment('1现金|2对公账户|3支付宝|4微信|5其它');
$table->text('content')->comment('备注'); $table->text('content')->comment('备注');
$table->tinyInteger('status')->default(0)->comment('审核状态,0待审核1审核通过2审核不通过'); $table->tinyInteger('status')->default(0)->comment('审核状态,0待审核1审核通过2审核不通过');
$table->unsignedBigInteger('check_user_id')->default(0)->comment('审核人ID');
$table->string('check_user_nickname')->nullable()->comment('审核人昵称');
$table->text('check_result')->nullable()->comment('审核备注');
$table->text('check_time')->nullable()->comment('审核时间');
$table->unsignedBigInteger('created_user_id')->default(0)->comment('操作人ID');
$table->string('created_user_nickname')->nullable()->comment('操作人昵称');
$table->timestamps(); $table->timestamps();
}); });
} }

View File

@ -99,6 +99,33 @@ class MenuTableSeeder extends Seeder
], ],
] ]
], ],
[
'name' => '实时聊天',
'route' => null,
'url' => null,
'icon' => 'layui-icon-cellphone-fine',
'type' => 2,
'sort' => 2,
'permission_name' => 'chat',
'child' => [
[
'name' => '消息中心',
'route' => 'chat.message',
'url' => null,
'icon' => 'layui-icon-note',
'type' => 1,
'permission_name' => 'chat.message',
],
[
'name' => '语音通话',
'route' => 'chat.audio',
'url' => null,
'icon' => 'layui-icon-service',
'type' => 1,
'permission_name' => 'chat.audio',
],
]
],
[ [
'name' => 'CRM管理', 'name' => 'CRM管理',
'route' => null, 'route' => null,
@ -174,33 +201,6 @@ class MenuTableSeeder extends Seeder
], ],
] ]
], ],
[
'name' => '实时聊天',
'route' => null,
'url' => null,
'icon' => 'layui-icon-cellphone-fine',
'type' => 2,
'sort' => 2,
'permission_name' => 'chat',
'child' => [
[
'name' => '消息中心',
'route' => 'chat.message',
'url' => null,
'icon' => 'layui-icon-note',
'type' => 1,
'permission_name' => 'chat.message',
],
[
'name' => '语音通话',
'route' => 'chat.audio',
'url' => null,
'icon' => 'layui-icon-service',
'type' => 1,
'permission_name' => 'chat.audio',
],
]
],
[ [
'name' => '订单模块', 'name' => '订单模块',
'route' => null, 'route' => null,
@ -220,6 +220,25 @@ class MenuTableSeeder extends Seeder
], ],
] ]
], ],
[
'name' => '账务模块',
'route' => null,
'url' => null,
'icon' => 'layui-icon-diamond',
'type' => 2,
'sort' => 2,
'permission_name' => 'account',
'child' => [
[
'name' => '订单付款',
'route' => 'account.pay',
'url' => null,
'icon' => 'layui-icon-dollar',
'type' => 1,
'permission_name' => 'account.pay',
],
]
],
]; ];
$permissions = \App\Models\Permission::pluck('id','name')->toArray(); $permissions = \App\Models\Permission::pluck('id','name')->toArray();
foreach ($datas as $k1 => $d1){ foreach ($datas as $k1 => $d1){

View File

@ -247,6 +247,19 @@ class UserTableSeeder extends Seeder
], ],
], ],
], ],
[
'name' => 'account',
'display_name' => '财务模块',
'child' => [
[
'name' => 'account.pay',
'display_name' => '订单付款',
'child' => [
['name' => 'account.pay.check', 'display_name' => '审核'],
]
],
],
],
]; ];
foreach ($permissions as $pem1) { foreach ($permissions as $pem1) {
//生成一级权限 //生成一级权限

View File

@ -0,0 +1,33 @@
@extends('base')
@section('content')
<div class="layui-card">
<div class="layui-card-body">
<form class="layui-form" action="{{route('account.pay.check',['id'=>$model->id])}}" method="post">
{{csrf_field()}}
<div class="layui-form-item">
<label for="" class="layui-form-label">状态</label>
<div class="layui-input-block">
<input type="radio" name="status" value="1" title="通过" checked>
<input type="radio" name="status" value="2" title="不通过" >
</div>
</div>
<div class="layui-form-item">
<label for="" class="layui-form-label">备注</label>
<div class="layui-input-block">
<textarea name="check_result" class="layui-textarea" placeholder="审核不通过时备注"></textarea>
</div>
<div class="layui-word-aux layui-form-mid"></div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button type="button" lay-submit lay-filter="go-close-refresh" class="layui-btn layui-btn-sm">确认</button>
</div>
</div>
</form>
</div>
</div>
@endsection

View File

@ -0,0 +1,87 @@
@extends('base')
@section('content')
<div class="layui-card">
<div class="layui-card-header layuiadmin-card-header-auto">
<form class="layui-form" action="{{route("account.pay")}}">
<div class="layui-btn-group">
<button type="button" lay-submit lay-filter="search" class="layui-btn layui-btn-sm" >搜索</button>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label for="" class="layui-form-label">订单号:</label>
<div class="layui-input-block" style="width: 275px">
<input type="text" name="num" placeholder="请输入名称" class="layui-input" >
</div>
</div>
</div>
</form>
</div>
<div class="layui-card-body">
<table id="dataTable" lay-filter="dataTable"></table>
<script type="text/html" id="options">
@{{# if(d.status==0){ }}
@can('account.pay.check')
<a class="layui-btn layui-btn-sm" lay-event="check">待审核</a>
@endcan
@{{# }else{ }}
<span class="layui-badge layui-bg-gray">@{{ d.status_name }}</span>
@{{# } }}
</script>
</div>
</div>
@endsection
@section('script')
<script>
layui.use(['layer','table','form','laydate','upload'],function () {
var $ = layui.jquery;
var layer = layui.layer;
var form = layui.form;
var table = layui.table;
var laydate = layui.laydate;
var upload = layui.upload;
//用户表格初始化
var dataTable = table.render({
elem: '#dataTable'
,height: 'full-200'
,url: "{{ route('account.pay') }}" //数据接口
,page: true //开启分页
,cols: [[ //表头
{checkbox: true}
,{field: 'num', title: '订单号',templet:function (d) {
return d.order.num
}}
,{field: 'total_money', title: '总金额',templet:function (d) {
return d.order.total_money
}}
,{field: 'payed_money', title: '已付金额',templet:function (d) {
return d.order.payed_money
}}
,{field: 'money', title: '本次付款金额'}
,{field: 'pay_type_name', title: '付款方式'}
,{field: 'created_user_nickname', title: '申请人'}
,{field: 'created_at', title: '申请时间'}
,{field: 'content', title: '备注'}
,{align:'center', toolbar: '#options', title:'操作'}
]]
});
//监听工具条
table.on('tool(dataTable)', function(obj){ //注tool是工具条事件名dataTable是table原始容器的属性 lay-filter="对应的值"
var data = obj.data //获得当前行数据
,layEvent = obj.event; //获得 lay-event 对应的值
if (layEvent === 'check'){
layer.open({
type: 2,
title: "审核",
shadeClose: true,
area: ["600px","400px"],
content: '/account/pay/check?id='+data.id,
})
}
});
})
</script>
@endsection

View File

@ -14,6 +14,12 @@
<button type="button" lay-submit lay-filter="search" class="layui-btn layui-btn-sm" >搜索</button> <button type="button" lay-submit lay-filter="search" class="layui-btn layui-btn-sm" >搜索</button>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-inline">
<label for="" class="layui-form-label">客户编号:</label>
<div class="layui-input-block" style="width: 275px">
<input type="text" name="uuid" placeholder="请输入客户编号" class="layui-input" >
</div>
</div>
<div class="layui-inline"> <div class="layui-inline">
<label for="" class="layui-form-label">客户名称:</label> <label for="" class="layui-form-label">客户名称:</label>
<div class="layui-input-block" style="width: 275px"> <div class="layui-input-block" style="width: 275px">

View File

@ -11,6 +11,12 @@
<button type="button" lay-submit lay-filter="search" class="layui-btn layui-btn-sm" >搜索</button> <button type="button" lay-submit lay-filter="search" class="layui-btn layui-btn-sm" >搜索</button>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-inline">
<label for="" class="layui-form-label">订单号:</label>
<div class="layui-input-block" style="width: 275px">
<input type="text" name="num" placeholder="请输入名称" class="layui-input" >
</div>
</div>
<div class="layui-inline"> <div class="layui-inline">
<label for="" class="layui-form-label">客户名称:</label> <label for="" class="layui-form-label">客户名称:</label>
<div class="layui-input-block" style="width: 275px"> <div class="layui-input-block" style="width: 275px">
@ -97,7 +103,7 @@
type: 2, type: 2,
title: "付款", title: "付款",
shadeClose: true, shadeClose: true,
area: ["600px","400px"], area: ["80%","80%"],
content: '/order/order/payForm?id=' + data.id, content: '/order/order/payForm?id=' + data.id,
}) })
} }

View File

@ -3,43 +3,94 @@
@section('content') @section('content')
<div class="layui-card"> <div class="layui-card">
<div class="layui-card-body"> <div class="layui-card-body">
<div class="layui-card"> <div class="layui-row layui-col-space30">
<form class="layui-form" action="{{route('order.order.pay',['id'=>$model->id])}}" method="post"> <div class="layui-col-xs6">
{{csrf_field()}} <div class="layui-card">
<div class="layui-form-item"> <div class="layui-card-header"><b>付款记录</b></div>
<label for="" class="layui-form-label">付款方式</label> <div class="layui-card-body">
<div class="layui-input-block"> <ul class="layui-timeline" id="pay_list_box"></ul>
<select name="pay_type" lay-verify="required" >
@foreach(config('freeswitch.pay_type') as $k => $v)
<option value="{{$k}}">{{$v}}</option>
@endforeach
</select>
</div> </div>
</div> </div>
<div class="layui-form-item"> </div>
<label for="" class="layui-form-label">付款金额</label> <div class="layui-col-xs6">
<div class="layui-input-block"> <div class="layui-card">
<input type="number" name="money" placeholder="付款金额" lay-verify="required" class="layui-input"> <div class="layui-card-header"><b>新增付款</b></div>
</div> <div class="layui-card-body">
</div> <form class="layui-form" action="{{route('order.order.pay',['id'=>$model->id])}}" method="post">
<div class="layui-form-item"> {{csrf_field()}}
<label for="" class="layui-form-label">备注内容</label> <div class="layui-form-item">
<div class="layui-input-block"> <label for="" class="layui-form-label">付款方式</label>
<textarea name="content" class="layui-textarea" lay-verify="required"></textarea> <div class="layui-input-block">
</div> <select name="pay_type" lay-verify="required" >
<div class="layui-word-aux layui-form-mid"></div> @foreach(config('freeswitch.pay_type') as $k => $v)
</div> <option value="{{$k}}">{{$v}}</option>
@endforeach
</select>
</div>
</div>
<div class="layui-form-item">
<label for="" class="layui-form-label">付款金额</label>
<div class="layui-input-block">
<input type="number" name="money" placeholder="付款金额" lay-verify="required" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label for="" class="layui-form-label">备注内容</label>
<div class="layui-input-block">
<textarea name="content" class="layui-textarea" lay-verify="required"></textarea>
</div>
<div class="layui-word-aux layui-form-mid"></div>
</div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <div class="layui-input-block">
<button type="button" lay-submit lay-filter="go-close-refresh" class="layui-btn layui-btn-sm">确认</button> <button type="button" lay-submit lay-filter="go-close-refresh" class="layui-btn layui-btn-sm">确认</button>
</div>
</div>
</form>
</div> </div>
</div> </div>
</form> </div>
</div> </div>
</div> </div>
</div> </div>
@endsection @endsection
@section('script')
<script>
layui.use(['layer','table','form','element','flow','laydate'],function () {
var $ = layui.jquery;
var form = layui.form;
var flow = layui.flow;
var laydate = layui.laydate;
flow.load({
elem: '#pay_list_box' //流加载容器
,done: function(page, next){ //执行下一页的回调
$.post('{{route('api.payList')}}',{id:'{{$model->id}}',page:page},function (res) {
var _html = '';
res.data.list.forEach(function (item,index) {
console.log(item)
_html += '<li class="layui-timeline-item">';
_html += ' <i class="layui-icon layui-timeline-axis">&#xe63f;</i>';
_html += ' <div class="layui-timeline-content layui-text">';
_html += ' <h3 class="layui-timeline-title">【'+item.status_name+'】'+item.created_at+'</h3>';
_html += ' <p><b>付款金额:</b>' + item.money + '</p>';
_html += ' <p><b>付款方式:</b>' + item.pay_type_name + '</p>';
_html += ' <p><b>备注:</b>' + item.content + '</p>';
if(item.status==2){
_html += ' <p><b>审核人:</b>' + item.check_user_nickname + '</p>';
_html += ' <p><b>审核时间:</b>' + item.check_time + '</p>';
_html += ' <p><b>原因:</b>' + item.check_result + '</p>';
}
_html += ' </div>';
_html += '</li>';
})
next(_html, page < res.data.lastPage); //假设总页数为 10
});
}
});
});
</script>
@endsection

View File

@ -23,5 +23,6 @@ Route::post('get_department_by_user_id','ApiController@getDepartmentByUserId')->
Route::post('get_user','ApiController@getUser')->name('api.getUser'); Route::post('get_user','ApiController@getUser')->name('api.getUser');
Route::post('get_node','ApiController@getNode')->name('api.getNode'); Route::post('get_node','ApiController@getNode')->name('api.getNode');
Route::post('remark_list','ApiController@remarkList')->name('api.remarkList'); Route::post('remark_list','ApiController@remarkList')->name('api.remarkList');
Route::post('pay_list','ApiController@payList')->name('api.payList');
Route::post('call','ApiController@call')->name('api.call'); Route::post('call','ApiController@call')->name('api.call');
Route::post('upload','ApiController@upload')->name('api.upload'); Route::post('upload','ApiController@upload')->name('api.upload');

View File

@ -354,7 +354,23 @@ Route::group(['prefix'=>'order','namespace'=>'Order','middleware'=>['auth','perm
}); });
/*
|--------------------------------------------------------------------------
| 财务模块
|--------------------------------------------------------------------------
*/
Route::group(['prefix'=>'account','namespace'=>'Account','middleware'=>['auth','permission:account']],function () {
//订单付款
Route::group([],function (){
Route::get('pay','PayController@index')->name('account.pay')->middleware('permission:account.pay');
//审核
Route::match(['get','post'],'pay/check','PayController@check')->name('account.pay.check')->middleware('permission:account.pay.check');
});
});