hujiao-gui/app/Http/Controllers/Callcenter/TaskController.php

188 lines
6.0 KiB
PHP

<?php
namespace App\Http\Controllers\Callcenter;
use App\Http\Controllers\Controller;
use App\Imports\CallImport;
use App\Models\Call;
use App\Models\Gateway;
use App\Models\Queue;
use App\Models\Task;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Facades\View;
use Maatwebsite\Excel\Facades\Excel;
class TaskController extends Controller
{
public function index(Request $request)
{
if ($request->ajax()){
$res = Task::query()->withCount('calls')->orderByDesc('id')->paginate($request->get('limit', 30));
return $this->success('ok',$res->items(),$res->total());
}
return View::make('callcenter.task.index');
}
public function create()
{
$queues = Queue::query()->orderByDesc('id')->get();
$gateways = Gateway::query()->orderByDesc('id')->get();
return View::make('callcenter.task.create',compact('queues','gateways'));
}
public function store(Request $request)
{
$data = $request->all([
'name',
'date_start',
'date_end',
'time_start',
'time_end',
'gateway_id',
'queue_id',
'max_channel',
]);
try {
Task::create($data);
return $this->success();
}catch (\Exception $exception){
Log::error('添加任务异常:'.$exception->getMessage());
return $this->error();
}
}
public function edit($id)
{
$model = Task::query()->findOrFail($id);
$queues = Queue::query()->orderByDesc('id')->get();
$gateways = Gateway::query()->orderByDesc('id')->get();
return View::make('callcenter.task.edit',compact('model', 'queues', 'gateways'));
}
public function update(Request $request,$id)
{
$data = $request->all([
'name',
'date_start',
'date_end',
'time_start',
'time_end',
'gateway_id',
'queue_id',
'max_channel',
]);
$model = Task::query()->findOrFail($id);
try {
$model->update($data);
return $this->success();
}catch (\Exception $exception){
Log::error('更新任务异常:'.$exception->getMessage());
return $this->error();
}
}
public function destroy(Request $request)
{
$ids = $request->get('ids');
if (empty($ids)){
return $this->error('请选择删除项');
}
DB::beginTransaction();
try {
Task::destroy($ids);
DB::commit();
return $this->success();
}catch (\Exception $exception){
DB::rollBack();
Log::error('删除群呼任务异常:'.$exception->getMessage());
return $this->error();
}
}
public function show(Request $request,$id)
{
$task = Task::query()->withCount(['calls','hasCalls','missCalls','successCalls','failCalls'])->findOrFail($id);
$percent = $task->calls_count>0?100*round(($task->has_calls_count)/($task->calls_count),4).'%':'0.00%';
if ($request->isMethod('post')){
$tiers = DB::table('queue_agent')->where('queue_id',$task->queue_id)->pluck('agent_id');
return response()->json(['code'=>0, 'msg'=>'请求成功']);
}
return view('callcenter.task.show',compact('task','percent'));
}
public function setStatus(Request $request)
{
$ids = $request->get('ids',[]);
if (count($ids)!=1){
return $this->error('请选择一条记录');
}
$task = Task::query()->withCount('calls')->find($ids[0]);
if ($task==null){
return $this->error('任务不存在');
}
if ($task->status==3){
return $this->error('任务已完成,禁止操作');
}
$status = $request->get('status',1);
if ($status==2&&$task->calls_count==0){
return $this->error('任务未导入号码,禁止操作');
}
if ($status==1&&$task->status!=2){
return $this->error('任务未启动,禁止操作');
}
try {
$task->update(['status'=>$status]);
$key = config('freeswitch.redis_key.callcenter_task');
Redis::rPush($key,$task->id);
return $this->success();
}catch (\Exception $exception){
Log::error('设置任务状态异常:'.$exception->getMessage());
return $this->error();
}
}
public function importCall(Request $request, $id)
{
$model = Task::query()->findOrFail($id);
if ($request->ajax()){
$file = $request->input('file');
if ($file == null){
return $this->error('请先上传文件');
}
$xlsFile = public_path().$file;
try{
Excel::import(new CallImport($id), $xlsFile);
return $this->success('导入成功');
}catch (\Exception $exception){
Log::error('导入失败:'.$exception->getMessage());
return $this->error('导入失败');
}
}
return View::make('callcenter.task.import',compact('model'));
}
public function calls(Request $request)
{
$data = $request->all(['task_id','phone']);
$res = Call::query()
->when($data['phone'],function ($q) use($data){
return $q->where('phone','like','%'.$data['phone'].'%');
})
->where('task_id',$data['task_id'])
->orderBy('id','asc')
->paginate($request->get('limit', 30));
foreach ($res->items() as $item){
$item->status_name = Arr::get(config('freeswitch.callcenter_call_status'),$item->status,'-');
}
return $this->success('ok',$res->items(),$res->total());
}
}