完成统计功能

This commit is contained in:
lilong 2020-05-11 17:16:17 +08:00
parent 36398637a9
commit f59d5b967e
29 changed files with 1392 additions and 577 deletions

View File

@ -3,8 +3,27 @@
<component name="ChangeListManager">
<list default="true" id="003b7c19-25d9-476a-8425-57fc330161a6" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/Http/Controllers/Admin/CdrController.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Http/Controllers/Admin/CdrController.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/Http/Controllers/Admin/IndexController.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Http/Controllers/Admin/IndexController.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/Http/Controllers/ApiController.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Http/Controllers/ApiController.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/config/freeswitch.php" beforeDir="false" afterPath="$PROJECT_DIR$/config/freeswitch.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/Http/Controllers/Auth/ConfirmPasswordController.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/app/Http/Controllers/Auth/ForgotPasswordController.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/app/Http/Controllers/Auth/LoginController.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/app/Http/Controllers/Auth/RegisterController.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/app/Http/Controllers/Auth/ResetPasswordController.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/app/Http/Controllers/Auth/VerificationController.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/app/Http/Requests/Admin/User/StoreRequest.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Http/Requests/Admin/User/StoreRequest.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/Http/Requests/Admin/User/UpdateRequest.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Http/Requests/Admin/User/UpdateRequest.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/composer.json" beforeDir="false" afterPath="$PROJECT_DIR$/composer.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/config/permission.php" beforeDir="false" afterPath="$PROJECT_DIR$/config/permission.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/database/seeds/MenuTableSeeder.php" beforeDir="false" afterPath="$PROJECT_DIR$/database/seeds/MenuTableSeeder.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/database/seeds/UserTableSeeder.php" beforeDir="false" afterPath="$PROJECT_DIR$/database/seeds/UserTableSeeder.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/resources/views/admin/index/index.blade.php" beforeDir="false" afterPath="$PROJECT_DIR$/resources/views/admin/index/index.blade.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/resources/views/admin/layout.blade.php" beforeDir="false" afterPath="$PROJECT_DIR$/resources/views/admin/layout.blade.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/routes/admin.php" beforeDir="false" afterPath="$PROJECT_DIR$/routes/admin.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/vendor/composer/autoload_classmap.php" beforeDir="false" afterPath="$PROJECT_DIR$/vendor/composer/autoload_classmap.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/vendor/composer/autoload_files.php" beforeDir="false" afterPath="$PROJECT_DIR$/vendor/composer/autoload_files.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/vendor/composer/autoload_static.php" beforeDir="false" afterPath="$PROJECT_DIR$/vendor/composer/autoload_static.php" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
@ -16,24 +35,24 @@
<pharConfigPath>$PROJECT_DIR$/composer.json</pharConfigPath>
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/app/Console/Commands/asrListen.php">
<leaf>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/app/Console/Commands/callcenterListen.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="449">
<caret line="118" column="50" lean-forward="true" selection-start-line="118" selection-start-column="50" selection-end-line="118" selection-end-column="50" />
<state relative-caret-position="128">
<caret line="4" column="4" lean-forward="true" selection-start-line="4" selection-start-column="4" selection-end-line="4" selection-end-column="4" />
<folding>
<element signature="e#40#71#0#PHP" expanded="true" />
<element signature="e#40#61#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/ApiController.php">
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/app/Console/Commands/callcenterRun.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="416">
<caret line="148" column="41" selection-start-line="148" selection-start-column="41" selection-end-line="148" selection-end-column="41" />
<state relative-caret-position="256">
<caret line="8" column="4" selection-start-line="8" selection-start-column="4" selection-end-line="8" selection-end-column="36" />
</state>
</provider>
</entry>
@ -64,6 +83,7 @@
<find>堆积柱状图</find>
<find>直接</find>
<find>array_get</find>
<find>time</find>
</findStrings>
<replaceStrings>
<replace>department</replace>
@ -83,14 +103,6 @@
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/database/migrations/2019_11_14_193518_project_remark.php" />
<option value="$PROJECT_DIR$/database/migrations/2019_11_12_180646_project_design.php" />
<option value="$PROJECT_DIR$/app/Models/ProjectDesign.php" />
<option value="$PROJECT_DIR$/app/Http/Requests/Admin/Project/ProjectRequest.php" />
<option value="$PROJECT_DIR$/app/Http/Requests/Admin/Project/ProjectDesignRequest.php" />
<option value="$PROJECT_DIR$/resources/views/admin/project_design/_form.blade.php" />
<option value="$PROJECT_DIR$/resources/views/admin/project_design/_js.blade.php" />
<option value="$PROJECT_DIR$/resources/views/admin/project/_btn.blade.php" />
<option value="$PROJECT_DIR$/resources/views/admin/project/_form.blade.php" />
<option value="$PROJECT_DIR$/resources/views/admin/project/create.blade.php" />
<option value="$PROJECT_DIR$/resources/views/admin/project/edit.blade.php" />
@ -115,15 +127,9 @@
<option value="$PROJECT_DIR$/resources/views/admin/waste/index.blade.php" />
<option value="$PROJECT_DIR$/resources/views/admin/project/index.blade.php" />
<option value="$PROJECT_DIR$/app/Models/Cdr.php" />
<option value="$PROJECT_DIR$/app/Http/Controllers/Admin/CdrController.php" />
<option value="$PROJECT_DIR$/database/migrations/2019_11_20_165744_cdr.php" />
<option value="$PROJECT_DIR$/resources/views/admin/cdr/index.blade.php" />
<option value="$PROJECT_DIR$/database/seeds/MenuTableSeeder.php" />
<option value="$PROJECT_DIR$/database/seeds/UserTableSeeder.php" />
<option value="$PROJECT_DIR$/../index.php" />
<option value="$PROJECT_DIR$/resources/views/admin/index/index.blade.php" />
<option value="$PROJECT_DIR$/routes/admin.php" />
<option value="$PROJECT_DIR$/app/Http/Controllers/Admin/IndexController.php" />
<option value="$PROJECT_DIR$/storage/logs/laravel.log" />
<option value="$PROJECT_DIR$/resources/views/admin/remind/index.blade.php" />
<option value="$PROJECT_DIR$/database/migrations/2014_10_12_000000_create_users_table.php" />
@ -131,9 +137,23 @@
<option value="$PROJECT_DIR$/../ai_robot/app/Console/Commands/callcenterRun.php" />
<option value="$PROJECT_DIR$/app/Console/Commands/callcenterRun.php" />
<option value="$PROJECT_DIR$/config/freeswitch.php" />
<option value="$PROJECT_DIR$/app/Http/Controllers/ApiController.php" />
<option value="$PROJECT_DIR$/app/Console/Commands/asrRecord.php" />
<option value="$PROJECT_DIR$/app/Console/Commands/asrListen.php" />
<option value="$PROJECT_DIR$/config/permission.php" />
<option value="$PROJECT_DIR$/app/Http/Requests/Admin/User/StoreRequest.php" />
<option value="$PROJECT_DIR$/app/Http/Requests/Admin/User/UpdateRequest.php" />
<option value="$PROJECT_DIR$/database/seeds/UserTableSeeder.php" />
<option value="$PROJECT_DIR$/database/seeds/MenuTableSeeder.php" />
<option value="$PROJECT_DIR$/app/Http/Controllers/Admin/CdrController.php" />
<option value="$PROJECT_DIR$/resources/views/admin/cdr/count.blade.php" />
<option value="$PROJECT_DIR$/resources/views/admin/index/onlinecall.blade.php" />
<option value="$PROJECT_DIR$/app/Http/Controllers/Admin/IndexController.php" />
<option value="$PROJECT_DIR$/routes/admin.php" />
<option value="$PROJECT_DIR$/resources/views/admin/layout.blade.php" />
<option value="$PROJECT_DIR$/app/Http/Controllers/ApiController.php" />
<option value="$PROJECT_DIR$/bootstrap/Freeswitchesl.php" />
<option value="$PROJECT_DIR$/composer.json" />
<option value="$PROJECT_DIR$/resources/views/admin/index/index.blade.php" />
</list>
</option>
</component>
@ -291,19 +311,6 @@
<item name="Console" type="462c0819:PsiDirectoryNode" />
<item name="Commands" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="freeswitch-gui-laravel" type="b2602c69:ProjectViewProjectNode" />
<item name="freeswitch-gui-laravel" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="Http" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="freeswitch-gui-laravel" type="b2602c69:ProjectViewProjectNode" />
<item name="freeswitch-gui-laravel" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="Http" type="462c0819:PsiDirectoryNode" />
<item name="Controllers" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
@ -317,15 +324,15 @@
<property name="nodejs_package_manager_path" value="npm" />
</component>
<component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS">
<recent name="D:\wnmp\www\freeswitch-gui-laravel\app\Http\Requests\Admin\Sip" />
</key>
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\wnmp\www\freeswitch-gui-laravel\bootstrap" />
<recent name="D:\wnmp\www\freeswitch-gui-laravel\resources\views\admin\index" />
<recent name="D:\wnmp\www\freeswitch-gui-laravel\resources\views\admin\cdr" />
<recent name="D:\wnmp\www\freeswitch-gui-laravel\app\Console\Commands" />
<recent name="D:\wnmp\www\freeswitch-gui-laravel\app\Console" />
<recent name="D:\wnmp\www\freeswitch-gui-laravel\resources\views\admin" />
<recent name="D:\wnmp\www\freeswitch-gui-laravel\app\Http\Controllers\Admin" />
<recent name="D:\wnmp\www\freeswitch-gui-laravel\database\migrations" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="D:\wnmp\www\freeswitch-gui-laravel\app\Http\Requests\Admin\Sip" />
</key>
</component>
<component name="RunDashboard">
@ -378,7 +385,9 @@
<workItem from="1588907621373" duration="635000" />
<workItem from="1588915745995" duration="6718000" />
<workItem from="1588936852248" duration="3654000" />
<workItem from="1588986695085" duration="9122000" />
<workItem from="1588986695085" duration="9432000" />
<workItem from="1589005480980" duration="58000" />
<workItem from="1589177390618" duration="11019000" />
</task>
<task id="LOCAL-00001" summary="完善系统管理">
<created>1588737340771</created>
@ -429,17 +438,23 @@
<option name="project" value="LOCAL" />
<updated>1588994483788</updated>
</task>
<option name="localTasksCounter" value="8" />
<task id="LOCAL-00008" summary="添加事件监听">
<created>1588996402230</created>
<option name="number" value="00008" />
<option name="presentableId" value="LOCAL-00008" />
<option name="project" value="LOCAL" />
<updated>1588996402230</updated>
</task>
<option name="localTasksCounter" value="9" />
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="112735000" />
<option name="totallyTimeSpent" value="124122000" />
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1936" height="1056" extended-state="0" />
<editor active="true" />
<layout>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.21321961" />
<window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.21748401" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Favorites" order="2" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
@ -452,7 +467,7 @@
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
<window_info anchor="bottom" id="Database Changes" order="8" />
<window_info anchor="bottom" id="Version Control" order="9" weight="0.32998884" />
<window_info anchor="bottom" id="Terminal" order="10" weight="0.38127092" />
<window_info active="true" anchor="bottom" id="Terminal" order="10" visible="true" weight="0.45261985" />
<window_info anchor="bottom" id="Event Log" order="11" side_tool="true" weight="0.32998884" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
@ -491,192 +506,10 @@
<MESSAGE value="添加公海库功能" />
<MESSAGE value="完成图表统计功能" />
<MESSAGE value="更改用户表备注" />
<option name="LAST_COMMIT_MESSAGE" value="更改用户表备注" />
<MESSAGE value="添加事件监听" />
<option name="LAST_COMMIT_MESSAGE" value="添加事件监听" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/../freeswitch-gui-laravel - 副本/routes/api.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="386">
<caret line="24" selection-start-line="24" selection-end-line="28" selection-end-column="65" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/routes/api.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="576">
<caret line="18" column="59" selection-start-line="18" selection-start-column="59" selection-end-line="18" selection-end-column="59" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/resources/views/admin/project_design/edit.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="448">
<caret line="14" column="11" selection-start-line="14" selection-start-column="11" selection-end-line="14" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/resources/views/admin/project_design/_js.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="704">
<caret line="22" column="11" lean-forward="true" selection-start-line="22" selection-start-column="11" selection-end-line="22" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/resources/views/admin/project_design/_form.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="450">
<caret line="61" column="6" lean-forward="true" selection-start-line="61" selection-start-column="6" selection-end-line="61" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/Admin/ProjectDesignController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="538">
<caret line="103" column="27" selection-start-line="103" selection-start-column="27" selection-end-line="103" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Models/ProjectDesign.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="378">
<caret line="17" column="15" selection-start-line="17" selection-start-column="15" selection-end-line="17" selection-end-column="15" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/Admin/WasteController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="544">
<caret line="65" column="16" selection-start-line="65" selection-start-column="16" selection-end-line="65" selection-end-column="16" />
<folding>
<element signature="e#46#66#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/resources/views/admin/waste/index.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="160">
<caret line="27" column="92" selection-start-line="27" selection-start-column="92" selection-end-line="27" selection-end-column="92" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/resources/views/admin/project/index.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="282">
<caret line="169" column="54" selection-start-line="169" selection-start-column="54" selection-end-line="169" selection-end-column="54" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/Admin/RemindController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="378">
<caret line="32" column="45" lean-forward="true" selection-start-line="32" selection-start-column="45" selection-end-line="32" selection-end-column="45" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../freeswitch-gui-laravel - 副本/database/migrations/2019_11_20_165744_cdr.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="384">
<caret line="23" column="71" lean-forward="true" selection-start-line="23" selection-start-column="71" selection-end-line="23" selection-end-column="71" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../freeswitch-gui-laravel - 副本/database/seeds/HomeSeeder.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-256">
<caret line="100" column="47" lean-forward="true" selection-start-line="100" selection-start-column="47" selection-end-line="100" selection-end-column="47" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Models/Cdr.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="288">
<caret line="9" column="32" selection-start-line="9" selection-start-column="32" selection-end-line="9" selection-end-column="32" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../freeswitch-gui-laravel - 副本/app/Models/Cdr.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="128">
<caret line="4" column="14" lean-forward="true" selection-start-line="4" selection-start-column="14" selection-end-line="4" selection-end-column="14" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/Admin/CdrController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1472">
<caret line="46" column="10" selection-start-line="46" selection-start-column="10" selection-end-line="46" selection-end-column="10" />
<folding>
<element signature="e#47#66#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/Admin/ProjectController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="556">
<caret line="65" column="14" lean-forward="true" selection-start-line="56" selection-start-column="12" selection-end-line="65" selection-end-column="14" />
<folding>
<element signature="e#46#76#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/database/migrations/2019_11_20_165744_cdr.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="352">
<caret line="25" column="72" lean-forward="true" selection-start-line="25" selection-start-column="72" selection-end-line="25" selection-end-column="72" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/resources/views/admin/cdr/index.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="610">
<caret line="74" column="16" selection-start-line="74" selection-start-column="16" selection-end-line="74" selection-end-column="16" />
<folding>
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../freeswitch-gui-laravel - 副本/routes/web.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="608">
<caret line="190" column="3" lean-forward="true" selection-start-line="166" selection-end-line="190" selection-end-column="3" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/database/seeds/UserTableSeeder.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="324">
<caret line="255" column="41" lean-forward="true" selection-start-line="255" selection-start-column="41" selection-end-line="255" selection-end-column="41" />
<folding>
<element signature="e#1267#3670#1#PHP" />
<element signature="e#1396#2117#1#PHP" />
<element signature="e#2139#2679#1#PHP" />
<element signature="e#2701#3173#1#PHP" />
<element signature="e#3195#3637#1#PHP" />
<element signature="e#3684#6221#1#PHP" />
<element signature="e#3787#6207#1#PHP" />
<element signature="e#6235#8387#1#PHP" />
<element signature="e#8505#11676#1#PHP" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/database/seeds/MenuTableSeeder.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="480">
<caret line="208" column="53" selection-start-line="208" selection-start-column="53" selection-end-line="208" selection-end-column="53" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/public/layuiadmin/lib/index.js">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/public/layuiadmin/lib/admin.js">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/public/layuiadmin/lib/view.js">
<provider selected="true" editor-type-id="text-editor" />
</entry>
@ -701,20 +534,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../freeswitch-gui-laravel - 副本/app/Http/Controllers/Home/IndexController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="320">
<caret line="11" column="5" lean-forward="true" selection-start-line="11" selection-start-column="5" selection-end-line="11" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../freeswitch-gui-laravel - 副本/app/Http/Controllers/Admin/IndexController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="276">
<caret line="32" column="54" selection-start-line="32" selection-start-column="54" selection-end-line="32" selection-end-column="54" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../index.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="352">
@ -722,33 +541,9 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/routes/admin.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="556">
<caret line="28" column="15" selection-start-line="28" selection-start-column="15" selection-end-line="28" selection-end-column="15" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/storage/logs/laravel.log">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/Admin/IndexController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="482">
<caret line="65" column="15" selection-start-line="65" selection-start-column="15" selection-end-line="65" selection-end-column="15" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/resources/views/admin/index/index.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1556">
<caret line="233" column="41" selection-start-line="233" selection-start-column="41" selection-end-line="233" selection-end-column="41" />
<folding>
<element signature="e#10111#11140#0#HTML" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/resources/views/admin/remind/index.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="250">
@ -805,26 +600,7 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Console/Commands/callcenterRun.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1664">
<caret line="73" column="49" selection-start-line="73" selection-start-column="49" selection-end-line="73" selection-end-column="49" />
<folding>
<element signature="e#40#71#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Console/Commands/cdrCreate.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="320">
<caret line="10" column="7" lean-forward="true" selection-start-line="10" selection-start-column="7" selection-end-line="10" selection-end-column="7" />
<folding>
<element signature="e#40#58#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Console/Commands/cdrCreate.php" />
<entry file="file://$PROJECT_DIR$/../ai_robot/app/Console/Commands/asrListen.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="320">
@ -832,20 +608,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Console/Commands/callcenterListen.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="640">
<caret line="48" column="9" lean-forward="true" selection-start-line="44" selection-start-column="8" selection-end-line="48" selection-end-column="9" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/ApiController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="416">
<caret line="148" column="41" selection-start-line="148" selection-start-column="41" selection-end-line="148" selection-end-column="41" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Console/Commands/asrRecord.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="672">
@ -856,15 +618,262 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../ai_robot/app/Console/Kernel.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="800">
<caret line="35" column="115" lean-forward="true" selection-start-line="34" selection-start-column="8" selection-end-line="35" selection-end-column="115" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Console/Commands/asrListen.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="449">
<caret line="118" column="50" lean-forward="true" selection-start-line="118" selection-start-column="50" selection-end-line="118" selection-end-column="50" />
<state relative-caret-position="2913">
<caret line="129" column="30" lean-forward="true" selection-start-line="129" selection-start-column="30" selection-end-line="129" selection-end-column="30" />
<folding>
<element signature="e#40#71#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Models/Permission.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="96">
<caret line="3" column="6" selection-start-line="3" selection-start-column="6" selection-end-line="3" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config/permission.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="448">
<caret line="26" column="21" selection-start-line="26" selection-start-column="21" selection-end-line="26" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Requests/Admin/User/StoreRequest.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="704">
<caret line="39" column="5" lean-forward="true" selection-start-line="34" selection-start-column="4" selection-end-line="39" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Requests/Admin/User/UpdateRequest.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="672">
<caret line="38" column="5" selection-start-line="38" selection-start-column="5" selection-end-line="38" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/vendor/nesbot/carbon/src/Carbon/Traits/Date.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="384">
<caret line="41" column="46" lean-forward="true" selection-start-line="41" selection-start-column="46" selection-end-line="41" selection-end-column="46" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="286">
<caret line="4022" column="20" selection-start-line="4022" selection-start-column="20" selection-end-line="4022" selection-end-column="20" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../freeswitch-gui-laravel - 副本/app/Http/Controllers/Admin/IndexController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="436">
<caret line="37" column="63" selection-start-line="37" selection-start-column="58" selection-end-line="37" selection-end-column="63" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-96" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/database/seeds/UserTableSeeder.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="9">
<caret line="254" selection-start-line="254" selection-end-line="254" />
<folding>
<element signature="e#1267#3670#1#PHP" />
<element signature="e#1396#2117#1#PHP" />
<element signature="e#2139#2679#1#PHP" />
<element signature="e#2701#3173#1#PHP" />
<element signature="e#3195#3637#1#PHP" />
<element signature="e#3684#6221#1#PHP" />
<element signature="e#3787#6207#1#PHP" />
<element signature="e#6235#8387#1#PHP" />
<element signature="e#8505#11676#1#PHP" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/database/seeds/MenuTableSeeder.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="592">
<caret line="219" column="22" lean-forward="true" selection-start-line="219" selection-start-column="22" selection-end-line="219" selection-end-column="22" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../freeswitch-gui-laravel - 副本/resources/views/admin/index/index.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="575">
<caret line="184" column="27" lean-forward="true" selection-start-line="184" selection-start-column="27" selection-end-line="184" selection-end-column="27" />
<folding>
<element signature="e#10881#10899#0#HTML" expanded="true" />
<element signature="e#10989#11009#0#HTML" expanded="true" />
<element signature="e#11106#11128#0#HTML" expanded="true" />
<element signature="e#11223#11241#0#HTML" expanded="true" />
<element signature="e#11330#11350#0#HTML" expanded="true" />
<element signature="e#11446#11468#0#HTML" expanded="true" />
<element signature="e#11562#11580#0#HTML" expanded="true" />
<element signature="e#11670#11690#0#HTML" expanded="true" />
<element signature="e#11787#11809#0#HTML" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/Admin/IndexController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="642">
<caret line="70" column="5" lean-forward="true" selection-start-line="70" selection-start-column="5" selection-end-line="70" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../freeswitch-gui-laravel - 副本/app/Http/Controllers/Home/IndexController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="416">
<caret line="17" column="35" selection-start-line="17" selection-start-column="35" selection-end-line="17" selection-end-column="35" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../freeswitch-gui-laravel - 副本/routes/web.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="640">
<caret line="29" column="83" lean-forward="true" selection-start-line="28" selection-start-column="4" selection-end-line="29" selection-end-column="83" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/resources/views/admin/cdr/count.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-512">
<caret line="26" column="89" selection-start-line="26" selection-start-column="89" selection-end-line="26" selection-end-column="89" />
<folding>
<element signature="e#1485#1505#0#HTML" expanded="true" />
<element signature="e#2484#4145#0#HTML" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/Admin/CdrController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="514">
<caret line="132" column="108" selection-start-line="132" selection-start-column="108" selection-end-line="132" selection-end-column="108" />
<folding>
<element signature="e#3474#4160#0#PHP" />
<element signature="e#4301#7655#1#PHP" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/Admin/SipController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-2400" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/routes/admin.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="672">
<caret line="30" column="94" selection-start-line="30" selection-start-column="84" selection-end-line="30" selection-end-column="94" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/resources/views/admin/layout.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="576">
<caret line="96" column="29" lean-forward="true" selection-start-line="96" selection-start-column="29" selection-end-line="96" selection-end-column="29" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Providers/AppServiceProvider.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="514">
<caret line="32" column="30" selection-start-line="32" selection-start-column="25" selection-end-line="32" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/storage/framework/views/bd4232dc25491f93366cf0bdb235ea5a772a0380.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="286">
<caret line="37" column="8" selection-start-line="37" selection-start-column="8" selection-end-line="37" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/resources/views/admin/index/onlinecall.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="322">
<caret line="171" column="18" selection-start-line="171" selection-start-column="18" selection-end-line="171" selection-end-column="18" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/ApiController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-192">
<caret line="69" column="59" selection-start-line="69" selection-start-column="59" selection-end-line="69" selection-end-column="59" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/bootstrap/Snowflake.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/bootstrap/Freeswitchesl.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="770">
<caret line="284" column="5" selection-start-line="284" selection-start-column="5" selection-end-line="284" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/composer.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="672">
<caret line="48" column="9" selection-start-line="48" selection-start-column="9" selection-end-line="48" selection-end-column="9" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../freeswitch-gui-laravel - 副本/composer.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="549">
<caret line="48" column="9" lean-forward="true" selection-start-line="45" selection-start-column="8" selection-end-line="48" selection-end-column="9" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/resources/views/admin/index/index.blade.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="538">
<caret line="141" column="63" selection-start-line="141" selection-start-column="63" selection-end-line="141" selection-end-column="63" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Http/Controllers/Admin/TaskController.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-4032" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Console/Commands/callcenterListen.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="128">
<caret line="4" column="4" lean-forward="true" selection-start-line="4" selection-start-column="4" selection-end-line="4" selection-end-column="4" />
<folding>
<element signature="e#40#61#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/Console/Commands/callcenterRun.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="256">
<caret line="8" column="4" selection-start-line="8" selection-start-column="4" selection-end-line="8" selection-end-column="36" />
</state>
</provider>
</entry>
</component>
</project>

View File

@ -25,7 +25,6 @@ class asrListen extends Command
protected $channel;
protected $fs_record = '/usr/local/freeswitch/recordings/';
protected $record_table = null;
/**
* Create a new command instance.

View File

@ -4,7 +4,6 @@ namespace App\Console\Commands;
use Illuminate\Console\Command;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use App\Models\Task;

View File

@ -5,9 +5,12 @@ namespace App\Http\Controllers\Admin;
use App\Models\Cdr;
use App\Models\Sip;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\View;
class CdrController extends Controller
{
@ -89,5 +92,111 @@ class CdrController extends Controller
return response()->download($cdr->record_file,$uuid.".wav");
}
/**
* 人员统计
* @param Request $request
* @return \Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function count(Request $request)
{
$users = User::where('id','!=',config('freeswitch.user_root_id'))->get();
if ($request->ajax()){
$res = $request->all(['user_id','start_stamp_start','start_stamp_end']);
$data = $users->keyBy('id')->all();
foreach ($data as &$d){
$d['todayCalls'] = 0;
$d['todaySuccessCalls'] = 0;
$d['todayRateCalls'] = '0.00%';
$d['todayThirtyCalls'] = 0;
$d['todaySixtyCalls'] = 0;
$d['weekCalls'] = 0;
$d['weekSuccessCalls'] = 0;
$d['weekRateCalls'] = '0.00%';
$d['weekThirtyCalls'] = 0;
$d['weekSixtyCalls'] = 0;
$d['monthCalls'] = 0;
$d['monthSuccessCalls'] = 0;
$d['monthRateCalls'] = '0.00%';
$d['monthThirtyCalls'] = 0;
$d['monthSixtyCalls'] = 0;
}
Cdr::when($res['user_id'],function ($q) use($res){
return $q->where('user_id',$res['user_id']);
})
->when($res['start_stamp_start'] && !$res['start_stamp_end'],function ($q) use($res){
return $q->where('aleg_start_at','>=',$res['start_stamp_start']);
})
->when(!$res['start_stamp_start'] && $res['start_stamp_end'],function ($q) use($res){
return $q->where('aleg_start_at','<=',$res['start_stamp_end']);
})
->when($res['start_stamp_start'] && $res['start_stamp_end'],function ($q) use($res){
return $q->whereBetween('aleg_start_at',[$res['start_stamp_start'],$res['start_stamp_end']]);
})
->where('user_id','!=',config('freeswitch.user_root_id'))
->orderBy('id','asc')
->chunk(1000,function ($cdrs) use(&$data){
foreach ($cdrs as $cdr){
foreach ($data as $d){
if ($cdr->user_id==$d['id']){
$time = strtotime($cdr->aleg_start_at);
//当天
if ($time>=Carbon::today()->timestamp && $time<=Carbon::tomorrow()->timestamp){
$d['todayCalls'] += 1;
}
if ($time>=Carbon::today()->timestamp && $time<=Carbon::tomorrow()->timestamp && $cdr->billsec>0){
$d['todaySuccessCalls'] += 1;
}
if ($time>=Carbon::today()->timestamp && $time<=Carbon::tomorrow()->timestamp && $cdr->billsec>30){
$d['todayThirtyCalls'] += 1;
}
if ($time>=Carbon::today()->timestamp && $time<=Carbon::tomorrow()->timestamp && $cdr->billsec>60){
$d['todaySixtyCalls'] += 1;
}
//本周
if ($time>=Carbon::now()->startOfWeek()->timestamp && $time<=Carbon::now()->endOfWeek()->timestamp){
$d['weekCalls'] += 1;
}
if ($time>=Carbon::now()->endOfWeek()->timestamp && $time<=Carbon::now()->endOfWeek()->timestamp && $cdr->billsec>0){
$d['weekSuccessCalls'] += 1;
}
if ($time>=Carbon::now()->endOfWeek()->timestamp && $time<=Carbon::now()->endOfWeek()->timestamp && $cdr->billsec>30){
$d['weekThirtyCalls'] += 1;
}
if ($time>=Carbon::now()->endOfWeek()->timestamp && $time<=Carbon::now()->endOfWeek()->timestamp && $cdr->billsec>60){
$d['weekSixtyCalls'] += 1;
}
//本月
if ($time>=Carbon::now()->startOfMonth()->timestamp && $time<=Carbon::now()->endOfMonth()->timestamp){
$d['monthCalls'] += 1;
}
if ($time>=Carbon::now()->startOfMonth()->timestamp && $time<=Carbon::now()->endOfMonth()->timestamp && $cdr->billsec>0){
$d['monthSuccessCalls'] += 1;
}
if ($time>=Carbon::now()->startOfMonth()->timestamp && $time<=Carbon::now()->endOfMonth()->timestamp && $cdr->billsec>30){
$d['monthThirtyCalls'] += 1;
}
if ($time>=Carbon::now()->startOfMonth()->timestamp && $time<=Carbon::now()->endOfMonth()->timestamp && $cdr->billsec>60){
$d['monthSixtyCalls'] += 1;
}
break;
}
}
}
});
foreach ($data as &$d){
$d['todayRateCalls'] = $d['todayCalls']>0?100*round($d['todaySuccessCalls']/$d['todayCalls'],4).'%':'0.00%';
$d['weekRateCalls'] = $d['weekCalls']>0?100*round($d['weekSuccessCalls']/$d['weekCalls'],4).'%':'0.00%';
$d['monthRateCalls'] = $d['monthCalls']>0?100*round($d['monthSuccessCalls']/$d['monthCalls'],4).'%':'0.00%';
}
return Response::json([
'code' => 0,
'msg' => '正在请求中...',
'count' => count($data),
'data' => $data,
]);
}
return View::make('admin.cdr.count',compact('users'));
}
}

View File

@ -66,5 +66,10 @@ class IndexController extends Controller
});
return Response::json(['code'=>0,'msg'=>'请求成功','data'=>$data]);
}
public function onlinecall()
{
return View::make('admin.index.onlinecall');
}
}

View File

@ -67,7 +67,7 @@ class ApiController extends Controller
{
$data = $request->all(['exten','phone','user_data']);
if ($data['exten'] == null || $data['phone'] == null) {
return Response::json(['code'=>1,'msg'=>'参数错误']);
return Response::json(['code'=>1,'msg'=>'号码不能为空']);
}
//检测10秒重复请求

View File

@ -1,40 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\ConfirmsPasswords;
class ConfirmPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Confirm Password Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password confirmations and
| uses a simple trait to include the behavior. You're free to explore
| this trait and override any functions that require customization.
|
*/
use ConfirmsPasswords;
/**
* Where to redirect users when the intended url fails.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
}

View File

@ -1,22 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset emails and
| includes a trait which assists in sending these notifications from
| your application to your users. Feel free to explore this trait.
|
*/
use SendsPasswordResetEmails;
}

View File

@ -1,40 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}

View File

@ -1,73 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
}

View File

@ -1,30 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\ResetsPasswords;
class ResetPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset requests
| and uses a simple trait to include this behavior. You're free to
| explore this trait and override any methods you wish to tweak.
|
*/
use ResetsPasswords;
/**
* Where to redirect users after resetting their password.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
}

View File

@ -1,42 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\VerifiesEmails;
class VerificationController extends Controller
{
/*
|--------------------------------------------------------------------------
| Email Verification Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling email verification for any
| user that recently registered with the application. Emails may also
| be re-sent if the user didn't receive the original email message.
|
*/
use VerifiesEmails;
/**
* Where to redirect users after verification.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('signed')->only('verify');
$this->middleware('throttle:6,1')->only('verify', 'resend');
}
}

View File

@ -27,11 +27,18 @@ class StoreRequest extends FormRequest
{
return [
'phone' => 'required|numeric|regex:/^1[3456789][0-9]{9}$/|unique:users',
'nickname' => 'required|min:4|max:14|unique:users',
'nickname' => 'required|min:2|max:14|unique:users',
'password' => 'required|confirmed|min:6|max:14'
];
}
public function attributes()
{
return [
'nickname' => '昵称',
];
}
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(response()->json(['code'=>1,'msg'=>$validator->errors()->first()]));

View File

@ -31,6 +31,13 @@ class UpdateRequest extends FormRequest
];
}
public function attributes()
{
return [
'nickname' => '昵称',
];
}
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(response()->json(['code'=>1,'msg'=>$validator->errors()->first()]));

288
bootstrap/Freeswitchesl.php Normal file
View File

@ -0,0 +1,288 @@
<?php
class Freeswitchesl {
public function __construct() {
$this->socket = "";
$this->sorts = "";
$this->length = 1024;
}
public function eliminate($parameter)
{
$array = array(" "," ","\t","\n","\r");
return str_replace($array, '', $parameter);
}
public function eliminateLine($parameter)
{
return str_replace("\n\n", "\n", $parameter);
}
public function typeClear($response)
{
$commenType = array("Content-Type: text/event-xml\n","Content-Type: text/event-plain\n","Content-Type: text/event-json\n");
return str_replace($commenType, '', $response);
}
public function connect($host,$port,$password)
{
$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$connection = socket_connect($this->socket, $host,$port);
$connect = false;
$error = "";
while ($socket_info = @socket_read($this->socket, 1024, PHP_NORMAL_READ)) {
$eliminate_socket_info = $this->eliminate($socket_info);
if ($eliminate_socket_info == "Content-Type:auth/request") {
socket_write($this->socket, "auth ".$password."\r\n\r\n");
}elseif ($eliminate_socket_info == "") {
continue;
}elseif ($eliminate_socket_info == "Content-Type:command/reply") {
continue;
}elseif ($eliminate_socket_info == "Reply-Text:+OKaccepted") {
$connect = true;
break;
} else {
$error .= $eliminate_socket_info."\r\n";
}
}
if (!$connect) {
echo $error;
}
return $connect;
}
public function api($api,$args="")
{
if ($this->socket) {
socket_write($this->socket, "api ".$api." ".$args."\r\n\r\n");
}
$response = $this->recvEvent("common");
return $response;
}
public function bgapi($api,$args="",$custom_job_uuid="")
{
if ($this->socket) {
socket_write($this->socket, "bgapi ".$api." ".$args." ".$custom_job_uuid."\r\n\r\n");
}
return "executed";
}
public function execute($app,$args,$uuid)
{
if ($this->socket) {
$str = "sendmsg ".$uuid."\ncall-command: execute\nexecute-app-name: ".$app."\nexecute-app-arg: ".$args."\n\n";
socket_write($this->socket, $str);
}
$response = $this->recvEvent("common");
return $response;
}
public function executeAsync($app,$args,$uuid)
{
if ($this->socket) {
$str = "sendmsg ".$uuid."\ncall-command: executeAsync\nexecute-app-name: ".$app."\nexecute-app-arg: ".$args."\n\n";
socket_write($this->socket, $str);
}
return "executed";
}
public function sendmsg($uuid)
{
if ($this->socket) {
socket_write($this->socket, "sendmsg ".$uuid."\r\n\r\n");
}
return "executed";
}
public function events($sorts,$args)
{
$this->sorts = $sorts;
if ($sorts == "json") {
$sorts = "xml";
}
if ($this->socket) {
socket_write($this->socket, "event ".$sorts." ".$args."\r\n\r\n");
}
return true;
}
public function getHeader($response,$args)
{
$serialize = $this->serialize($response,"json");
$serializearray = json_decode($serialize);
try {
return $serializearray->$args;
} catch (Exception $e) {
return "";
}
}
public function recvEvent($type="event")
{
$response = '';
$length = 0;
$x = 0;
/*while ($socket_info = @socket_read($this->socket, 1024, PHP_NORMAL_READ)){
$x++;
usleep(100);
if ($length > 0) {
$response .= $socket_info;
}
if ($length == 0 && strpos($socket_info, 'Content-Length:') !== false) {
$lengtharray = explode("Content-Length:",$socket_info);
if ($type == "event") {
$length = (int)$lengtharray[1]+30;
} else {
$length = (int)$lengtharray[1];
}
}
if ($length > 0 && strlen($response) >= $length) {
break;
}
if ($x > 10000) break;
}*/
//-------------------------------- 2020.02.26 lilong update -----------------------
if($type=='common'){
while ($socket_info = @socket_read($this->socket, 1024, PHP_BINARY_READ)){
$x++;
usleep(100);
$response .= $socket_info;
if (strpos($socket_info, 'Content-Length:') !== false) {
$lengtharray = explode("Content-Length:",$socket_info);
if ($type == "event") {
$length = (int)$lengtharray[1]+30;
} else {
$length = (int)$lengtharray[1];
}
}
if ($length > 0 && strlen(substr($response, strpos($response, "Content-Length: {$length}"))) == $length+strlen("Content-Length: {$length}\r\n")) {
break;
}
if ($x > 10000) break;
}
$replace_arr = ["Content-Type: api/response\n","Content-Length: {$length}"];
$response = str_replace($replace_arr, '', $response);
}else{
//与原代码做兼容
while ($socket_info = @socket_read($this->socket, 1024, PHP_NORMAL_READ)){
$x++;
usleep(100);
if ($length > 0) {
$response .= $socket_info;
}
if ($length == 0 && strpos($socket_info, 'Content-Length:') !== false) {
$lengtharray = explode("Content-Length:",$socket_info);
if ($type == "event") {
$length = (int)$lengtharray[1]+30;
} else {
$length = (int)$lengtharray[1];
}
}
if ($length > 0 && strlen($response) >= $length) {
break;
}
if ($x > 10000) break;
}
}
//-------------------------------- 2020.02.26 lilong update -----------------------
if ($this->sorts == "json" && $type == "event") {
$response = $this->typeClear($response);
$responsedata = simplexml_load_string($response);
$response = [];
foreach ($responsedata->headers->children() as $key => $value) {
$response[(string)$key] = (string)$value;
}
return json_encode($response);
} else {
$response = $this->eliminateLine($response);
}
return $response;
}
public function serialize($response,$type)
{
$response = $this->typeClear($response);
if ($this->sorts == $type) return $response;
if ($this->sorts == "json") {
$responsedata = json_decode($response);
if ($type == "plain") {
$response = "";
foreach ($responsedata as $key => $value) {
$responseline = $key.": ".$value."\r\n";
$response .= $responseline;
}
} else {
$response = "<event>\r\n <headers>\r\n";
foreach ($responsedata as $key => $value) {
$responseline = " <".$key.">".$value."</".$key.">"."\r\n";
$response .= $responseline;
}
$response .= " </headers>\r\n</event>";
}
return $response;
} elseif ($this->sorts == "xml") {
$responsedata = simplexml_load_string($response);
if ($type == "plain") {
$response = "";
foreach ($responsedata->headers->children() as $key => $value) {
$responseline = (string)$key.": ".(string)$value."\r\n";
$response .= $responseline;
}
return $response;
} else {
$response = [];
foreach ($responsedata->headers->children() as $key => $value) {
$response[(string)$key] = (string)$value;
}
return json_encode($response);
}
} else {
$response = str_replace("\n", '","', $response);
$response = str_replace(": ", '":"', $response);
$response = substr($response, 0, -2);
$response = '{"'.$response.'}';
if ($type == "json") return $response;
$responsedata = json_decode($response);
$response = "<event>\r\n <headers>\r\n";
foreach ($responsedata as $key => $value) {
$responseline = " <".$key.">".$value."</".$key.">"."\r\n";
$response .= $responseline;
}
$response .= " </headers>\r\n</event>";
return $response;
}
}
public function disconnect()
{
//-------------------------------- 2020.02.26 lilong add -----------------------
socket_write($this->socket, "exit"."\r\n\r\n");
//-------------------------------- 2020.02.26 lilong add -----------------------
socket_close($this->socket);
}
//只订阅uuid事件
public function filteruuid($uuid)
{
if ($this->socket) {
socket_write($this->socket, "filter Unique-ID ".$uuid."\r\n\r\n");
}
return "filter";
}
}

77
bootstrap/Snowflake.php Normal file
View File

@ -0,0 +1,77 @@
<?php
//namespace anerg\helper;
/**
* Twitter的Snowflake生成全局唯一ID的PHP实现
*
* 可实现分布式全局唯一ID的生成
*
* 因为PHP不是常驻内存运行所以无法实现原版的队列编号采用随机数代替
* 可以最大程度避免并发请求时生成相同的ID
* 理论上当MAX_RANDOM_BIT为12也就是随机数最大值为4095时
* 每毫秒需生成的id小于1000即可以安全的生成不冲突的id
*
* @author Coeus <r.anerg@gmail.com>
*/
class Snowflake
{
//开始时间戳,固定小于当前时间的毫秒,用于缩减时间位数
const EPOCH = 1575388800000;
//最大机器标识位数8->255 10->1023
const MAX_MACHINE_BIT = 8;
//最大随机数位数12->4095
const MAX_RANDOM_BIT = 12;
/**
* 获取一个10进制唯一ID
*
* 如果$machineId为0则会忽略掉机器标识位
*
* @param integer $machineId
* @param array $options 数组形式只包含epochmaxMachineBit和maxRandomBit
* @return integer
*/
public static function nextId($machineId = 1, $options = [])
{
$epoch = isset($options['epoch']) ? $options['epoch'] : self::EPOCH;
$maxMachineBit = isset($options['maxMachineBit']) ? $options['maxMachineBit'] : self::MAX_MACHINE_BIT;
$maxRandomBit = isset($options['maxRandomBit']) ? $options['maxRandomBit'] : self::MAX_RANDOM_BIT;
//机器标识范围判断
$maxMachineId = ~(-1 << $maxMachineBit);
if ($machineId > $maxMachineId || $machineId < 0) {
throw new \Exception("MachineId can't be less than " . $maxMachineId . " or greater than 0");
}
//毫秒时间戳
$time = \floor(\microtime(true) * 1000);
$time -= $epoch;
//生成随机数因为php不是内存持久化的在并发时无法做到维护一个唯一的序列所以用随机数替代
$random = \mt_rand(0, ~(-1 << $maxRandomBit));
//组合数据 {时间戳差值|机器标识|随机数}
//机器标识为0则抛弃掉机器标识
if ($machineId == 0) {
//时间戳要左移的位数
$timeLeftShift = $maxRandomBit;
$nextId = ($time << $timeLeftShift) | $random;
} else {
//时间戳要左移的位数
$timeLeftShift = $maxRandomBit + $maxMachineBit;
$nextId = ($time << $timeLeftShift) | ($machineId << $maxRandomBit) | $random;
}
return $nextId;
}
/**
* 获取一个36进制的唯一ID
*
* @param integer $machineId
* @return string
*/
public static function nextHash($machineId = 0, $options = [])
{
return \strtoupper(\base_convert(self::nextId($machineId, $options), 10, 36));
}
}

View File

@ -42,6 +42,10 @@
"classmap": [
"database/seeds",
"database/factories"
],
"files": [
"bootstrap/Freeswitchesl.php",
"bootstrap/Snowflake.php"
]
},
"autoload-dev": {

View File

@ -13,7 +13,7 @@ return [
* `Spatie\Permission\Contracts\Permission` contract.
*/
'permission' => Spatie\Permission\Models\Permission::class,
'permission' => App\Models\Permission::class,
/*
* When using the "HasRoles" trait from this package, we need to know which
@ -24,7 +24,7 @@ return [
* `Spatie\Permission\Contracts\Role` contract.
*/
'role' => Spatie\Permission\Models\Role::class,
'role' => App\Models\Role::class,
],

View File

@ -210,7 +210,14 @@ class MenuTableSeeder extends Seeder
'type' => 1,
'permission_name' => 'data.cdr',
],
[
'name' => '呼叫统计',
'route' => 'admin.cdr.count',
'url' => null,
'icon' => 'layui-icon-ios',
'type' => 1,
'permission_name' => 'data.cdr.count',
],
]
],
];

View File

@ -248,7 +248,13 @@ class UserTableSeeder extends Seeder
['name' => 'data.cdr.list_department', 'display_name' => '查看部门记录'],
]
],
[
'name' => 'data.cdr.count',
'display_name' => '呼叫统计',
'child' => [
]
],
]
],
];

View File

@ -0,0 +1,248 @@
/*打电话键盘*/
/*.call-warp {*/
/*background: #FFFFFF;*/
/*position: absolute;*/
/*top: 50%;*/
/*left: 50%;*/
/*-webkit-transform: translateX(-50%) translateY(-50%);*/
/*-moz-transform: translateX(-50%) translateY(-50%);*/
/*-o-transform: translateX(-50%) translateY(-50%);*/
/*-ms-transform: translateX(-50%) translateY(-50%);*/
/*transform: translateX(-50%) translateY(-50%);*/
/*width: 316px;*/
/*margin: 0 auto;*/
/*padding: 15px;*/
/*border: 1px solid rgba(0, 0, 0, .2);*/
/*border-radius: 8px;*/
/*outline: 0;*/
/*-webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);*/
/*box-shadow: 0 3px 9px rgba(0, 0, 0, .5);*/
/*}*/
/*.call-input {*/
/*position: relative;*/
/*}*/
/*.call-input input {*/
/*width: 100%;*/
/*font-size: 18px;*/
/*height: 54px;*/
/*line-height: 24px;*/
/*padding: 15px 60px 15px 10px;*/
/*border: 1px solid #D8D8D8;*/
/*box-sizing: border-box;*/
/*}*/
/*.call-input input.error-tips {*/
/*border: 1px solid #e78081;*/
/*}*/
/*.number-key {*/
/*padding: 5px 0 15px;*/
/*overflow: hidden;*/
/*}*/
/*.number-key>a {*/
/*display: block;*/
/*float: left;*/
/*width: 33.3333%;*/
/*box-sizing: border-box;*/
/*border: 1px solid #D8D8D8;*/
/*border-top: none;*/
/*border-right: none;*/
/*text-align: center;*/
/*line-height: 52px;*/
/*color: #333;*/
/*font-size: 24px;*/
/*font-weight: bold;*/
/*}*/
/*.number-key>a:hover {*/
/*background: #eee;*/
/*}*/
/*.number-key>a:first-child,*/
/*.number-key>a:nth-child(2),*/
/*.number-key>a:nth-child(3) {*/
/*border-top: 1px solid #D8D8D8;*/
/*}*/
/*.number-key>a:nth-child(3n) {*/
/*border-right: 1px solid #D8D8D8;*/
/*}*/
/*.inline {*/
/*display: inline-block;*/
/*vertical-align: middle;*/
/*}*/
/*.call-btn {*/
/*display: block;*/
/*font-size: 18px;*/
/*text-align: center;*/
/*border-radius: 4px;*/
/*color: #fff;*/
/*line-height: 54px;*/
/*background: -moz-linear-gradient(top, #02BB92 0%, #09CBA1 100%);*/
/*background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#02BB92), color-stop(100%,#09CBA1));*/
/*background: -webkit-linear-gradient(top, #02BB92 0%,#09CBA1 100%);*/
/*background: -o-linear-gradient(top, #02BB92 0%,#09CBA1 100%);*/
/*background: -ms-linear-gradient(top, #02BB92 0%,#09CBA1 100%);*/
/*background: linear-gradient(to bottom, #02BB92 0%,#09CBA1 100%);*/
/*}*/
/*.call-btn.down{*/
/*background: -moz-linear-gradient(top, #E47172 0%, #E68181 100%);*/
/*background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#E47172), color-stop(100%,#E68181));*/
/*background: -webkit-linear-gradient(top,#E47172 0%,#E68181 100%);*/
/*background: -o-linear-gradient(top, #E47172 0%,#E68181 100%);*/
/*background: -ms-linear-gradient(top, #E47172 0%,#E68181 100%);*/
/*background: linear-gradient(to bottom,#E47172 0%,#E68181 100%);*/
/*}*/
/*.call-btn.none {*/
/*display: none;*/
/*}*/
/*.del-num:hover,*/
/*.del-all:hover,*/
/*.call-btn:hover{*/
/*color: #fff;*/
/*opacity: 0.8;*/
/*}*/
/*.call-icon {*/
/*display: inline-block;*/
/*vertical-align: middle;*/
/*width: 28px;*/
/*height: 28px;*/
/*background: url(../../static/images/dianhua.png);*/
/*margin-right: 15px;*/
/*}*/
/*.del-all {*/
/*position: absolute;*/
/*display: block;*/
/*width: 30px;*/
/*top: 0;*/
/*right: 0;*/
/*bottom: 0;*/
/*background: url(../../static/images/close.png) no-repeat center center;*/
/*}*/
/*.del-num {*/
/*position: absolute;*/
/*display: block;*/
/*width: 30px;*/
/*top: 0;*/
/*right: 30px;*/
/*bottom: 0;*/
/*background: url(../../static/images/quchu.png) no-repeat center center;*/
/*}*/
/*new 弹窗样式*/
.call-warp {
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translateX(-50%) translateY(-50%);
-moz-transform: translateX(-50%) translateY(-50%);
-o-transform: translateX(-50%) translateY(-50%);
-ms-transform: translateX(-50%) translateY(-50%);
transform: translateX(-50%) translateY(-50%);
width: 240px;
margin: 0 auto;
padding: 15px;
border: 1px solid rgba(0, 0, 0, .2);
border-radius: 8px;
outline: 0;
-webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
}
.call-input {
position: relative;
}
.call-input input {
width: 100%;
font-size: 16px;
height: 30px;
padding: 15px 60px 15px 10px;
border: 1px solid #D8D8D8;
}
.call-input input.error-tips {
border: 1px solid #e78081;
}
.number-key {
padding: 5px 0 10px;
overflow: hidden;
}
.number-key>a {
display: block;
float: left;
width: 33.3333%;
box-sizing: border-box;
border: 1px solid #D8D8D8;
border-top: none;
border-right: none;
text-align: center;
line-height: 30px;
color: #333;
font-size: 18px;
font-weight: bold;
}
.number-key>a:hover {
background: #eee;
}
.number-key>a:first-child,
.number-key>a:nth-child(2),
.number-key>a:nth-child(3) {
border-top: 1px solid #D8D8D8;
}
.number-key>a:nth-child(3n) {
border-right: 1px solid #D8D8D8;
}
.call-btn {
display: block;
font-size: 14px;
text-align: center;
border-radius: 4px;
color: #fff;
line-height: 36px;
background: -moz-linear-gradient(top, #02BB92 0%, #09CBA1 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#02BB92), color-stop(100%,#09CBA1));
background: -webkit-linear-gradient(top, #02BB92 0%,#09CBA1 100%);
background: -o-linear-gradient(top, #02BB92 0%,#09CBA1 100%);
background: -ms-linear-gradient(top, #02BB92 0%,#09CBA1 100%);
background: linear-gradient(to bottom, #02BB92 0%,#09CBA1 100%);
}
.call-btn.down{
background: -moz-linear-gradient(top, #E47172 0%, #E68181 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#E47172), color-stop(100%,#E68181));
background: -webkit-linear-gradient(top,#E47172 0%,#E68181 100%);
background: -o-linear-gradient(top, #E47172 0%,#E68181 100%);
background: -ms-linear-gradient(top, #E47172 0%,#E68181 100%);
background: linear-gradient(to bottom,#E47172 0%,#E68181 100%);
}
.call-btn.none {
display: none;
}
.del-num:hover,
.del-all:hover,
.call-btn:hover{
color: #fff;
opacity: 0.8;
}
/*.call-icon {*/
/*display: inline-block;*/
/*vertical-align: middle;*/
/*width: 28px;*/
/*height: 28px;*/
/*background: url(../../static/images/dianhua.png);*/
/*margin-right: 15px;*/
/*}*/
.del-all {
position: absolute;
display: block;
width: 30px;
top: 0;
right: 0;
bottom: 0;
background: url(./res/close.png) no-repeat center center;
}
.del-num {
position: absolute;
display: block;
width: 30px;
top: 0;
right: 30px;
bottom: 0;
background: url(./res/quchu.png) no-repeat center center;
}

View File

@ -0,0 +1,96 @@
@extends('admin.base')
@section('content')
<div class="layui-card">
<div class="layui-card-header layuiadmin-card-header-auto">
<form class="layui-form">
<button class="layui-btn layui-btn-sm" lay-submit lay-filter="*" >搜索</button>
<div class="layui-form-item">
<div class="layui-inline">
<label for="" class="layui-form-label">用户</label>
<div class="layui-input-block">
<select name="user_id">
<option value=""></option>
@foreach($users as $user)
<option value="{{$user->id}}">{{$user->nickname}}</option>
@endforeach
</select>
</div>
</div>
<div class="layui-inline">
<label for="" class="layui-form-label">呼叫时间</label>
<div class="layui-input-inline" style="width: 160px">
<input type="text" name="start_stamp_start" id="start_stamp_start" class="layui-input" placeholder="开始时间">
</div>
<div class="layui-form-mid layui-word-aux">-</div>
<div class="layui-input-inline" style="width: 160px">
<input type="text" name="start_stamp_end" id="start_stamp_end" class="layui-input" placeholder="结束时间">
</div>
</div>
</div>
</form>
</div>
<div class="layui-card-body">
<table id="dataTable" lay-filter="dataTable"></table>
</div>
</div>
@endsection
@section('script')
<script>
layui.use(['layer','table','form','laydate'],function () {
var $ = layui.jquery;
var layer = layui.layer;
var form = layui.form;
var table = layui.table;
var laydate = layui.laydate;
//用户表格初始化
var dataTable = table.render({
elem: '#dataTable'
,height: 500
,url: "{{ route('admin.cdr.count') }}" //数据接口
,page: false //开启分页
,cols: [[
{align: 'center', title: '用户', rowspan: 2,field:'nickname'},
{align: 'center', title: '当日', colspan: 5},
{align: 'center', title: '本周', colspan: 5},
{align: 'center', title: '本月', colspan: 5},
],[ //表头
{field: 'todayCalls', title: '呼出', sort: true,align: 'center',style:'color:red'}
,{field: 'todaySuccessCalls', title: '接通', sort: true,align: 'center',style:'color:green'}
,{field: 'todayRateCalls', title: '接通率', sort: true,align: 'center',style:'color:#0000FF'}
,{field: 'todayThirtyCalls', title: '30秒以上', sort: true,align: 'center',}
,{field: 'todaySixtyCalls', title: '60秒以上', sort: true,align: 'center',}
,{field: 'weekCalls', title: '呼出', sort: true,align: 'center',style:'color:red'}
,{field: 'weekSuccessCalls', title: '接通', sort: true,align: 'center',style:'color:green'}
,{field: 'weekRateCalls', title: '接通率', sort: true,align: 'center',style:'color:#0000FF'}
,{field: 'weekThirtyCalls', title: '30秒以上', sort: true,align: 'center',}
,{field: 'weekSixtyCalls', title: '60秒以上', sort: true,align: 'center',}
,{field: 'monthCalls', title: '呼出', sort: true,align: 'center',style:'color:red'}
,{field: 'monthSuccessCalls', title: '接通', sort: true,align: 'center',style:'color:green'}
,{field: 'monthRateCalls', title: '接通率', sort: true,align: 'center',style:'color:#0000FF'}
,{field: 'monthThirtyCalls', title: '30秒以上', sort: true,align: 'center',}
,{field: 'monthSixtyCalls', title: '60秒以上', sort: true,align: 'center',}
]]
});
//时间选择
laydate.render({type: 'datetime', elem: '#start_stamp_start'});
laydate.render({type: 'datetime', elem: '#start_stamp_end'});
//监听搜索提交
form.on('submit(*)', function(data){
dataTable.reload({
where: data.field,
page: {curr:1}
});
return false;
});
})
</script>
@endsection

View File

@ -139,7 +139,7 @@
</div>
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-header">最近15天数据</div>
<div class="layui-card-header">图表数据</div>
<div class="layui-card-body">
<div class="layui-row layui-col-space30">
<div class="layui-col-md6">

View File

@ -0,0 +1,182 @@
@extends('admin.base')
@section('content')
<link rel="stylesheet" href="/layuiadmin/style/keyboard-call.css">
<div class="layui-card">
<div class="layui-card-header layuiadmin-card-header-auto">
<h2>在线拨号</h2>
</div>
<div class="layui-card-body">
<div class="body-main" style="min-height: 720px;">
<div class="call-warp">
<div class="call-input">
<input type="text" id="telNum" autofocus="autofocus" style="box-sizing:border-box"/>
<a href="javascript:void(0)" class="del-num"></a>
<a href="javascript:void(0)" class="del-all"></a>
</div>
<div class="number-key" id="number">
<a href="javascript:void(0)">1</a>
<a href="javascript:void(0)">2</a>
<a href="javascript:void(0)">3</a>
<a href="javascript:void(0)">4</a>
<a href="javascript:void(0)">5</a>
<a href="javascript:void(0)">6</a>
<a href="javascript:void(0)">7</a>
<a href="javascript:void(0)">8</a>
<a href="javascript:void(0)">9</a>
<a href="javascript:void(0)">*</a>
<a href="javascript:void(0)">0</a>
<a href="javascript:void(0)">#</a>
</div>
<a href="javascript:void(0)" class="call-btn">
<i class="call-icon"></i>
<span class="inline">&nbsp;&nbsp;</span>
</a>
</div>
</div>
</div>
</div>
@endsection
@section('script')
<script>
layui.use(['form','element','table', 'layer','upload'],function() {
var $ = layui.jquery;
var form = layui.form;
var element = layui.element;
var table = layui.table;
var layer = layui.layer;
var upload = layui.upload;
$('#number').children().click(function () {
var num = $(this).text();
var showNum = $('#telNum').val();
$('#telNum').val(showNum + num);
});
$(document).keydown(function (e) {
var keyNum = e.keyCode;
var showNum = $('#telNum').val();
var num = '';
if (keyNum == 13) {
markCall();
}
if (e.target.id == 'telNum') {
} else {
if (!e.shiftKey) {
switch (keyNum) {
case 96:
num = 0;
break;
case 48:
num = 0;
break;
case 97:
num = 1;
break;
case 49:
num = 1;
break;
case 98:
num = 2;
break;
case 50:
num = 2;
break;
case 99:
num = 3;
break;
case 51:
num = 3;
break;
case 100:
num = 4;
break;
case 52:
num = 4;
break;
case 101:
num = 5;
break;
case 53:
num = 5;
break;
case 102:
num = 6;
break;
case 54:
num = 6;
break;
case 103:
num = 7;
break;
case 55:
num = 7;
break;
case 104:
num = 8;
break;
case 56:
num = 8;
break;
case 105:
num = 9;
break;
case 57:
num = 9;
break;
case 106:
num = "*";
break;
}
} else {
switch (keyNum) {
case 51:
num = "#";
break;
case 56:
num = "*";
break;
}
}
switch (keyNum) {
//回删一个
case 8:
delStr();
num = '';
return false;
//回删所有
case 46:
$('#telNum').val('')
num = '';
return false;
}
$('#telNum').val(showNum + num);
}
});
$('.del-num').click(function () {
delStr();
});
$('.del-all').click(function () {
$('#telNum').val('');
});
$('.call-btn').click(function () {
markCall();
});
function markCall() {
var phone = $("#telNum").val();
$("#telNum").val(phone.replace(/\s/g, ""));
call(phone);
}
function delStr() {
var telStr = $('#telNum').val();
telStr = telStr.substr(0, telStr.length - 1);
$('#telNum').val(telStr);
}
});
</script>
@endsection

View File

@ -90,6 +90,11 @@
<a lay-href="{{route('admin.index')}}">控制台</a>
</dd>
</dl>
<dl class="layui-nav-child">
<dd data-name="console">
<a lay-href="{{route('admin.index.onlinecall')}}">在线拨号</a>
</dd>
</dl>
</li>
@foreach(\Illuminate\Support\Facades\Cache::get('menus') as $menu1)
<li data-name="{{$menu1['name']}}" class="layui-nav-item">

View File

@ -27,6 +27,8 @@ Route::group(['namespace'=>'Admin','prefix'=>'admin','middleware'=>'auth'],funct
Route::get('/index','IndexController@index')->name('admin.index');
//后台首页图表统计
Route::post('/index/chart','IndexController@chart')->name('admin.index.chart');
//在线拨号
Route::get('/index/onlinecall','IndexController@onlinecall')->name('admin.index.onlinecall');
});
/*
@ -372,5 +374,5 @@ Route::group(['namespace'=>'Admin','prefix'=>'admin','middleware'=>['auth','perm
Route::get('cdr/{uuid}/download','CdrController@download')->name('admin.cdr.download')->middleware('permission:data.cdr.download');
});
Route::get('cdr/count','CdrController@count')->name('admin.cdr.count')->middleware('permission:data.cdr.count');
});

View File

@ -6,11 +6,17 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'App\\Console\\Commands\\asrListen' => $baseDir . '/app/Console/Commands/asrListen.php',
'App\\Console\\Commands\\asrRecord' => $baseDir . '/app/Console/Commands/asrRecord.php',
'App\\Console\\Commands\\callcenterListen' => $baseDir . '/app/Console/Commands/callcenterListen.php',
'App\\Console\\Commands\\callcenterRun' => $baseDir . '/app/Console/Commands/callcenterRun.php',
'App\\Console\\Commands\\submeter' => $baseDir . '/app/Console/Commands/submeter.php',
'App\\Console\\Kernel' => $baseDir . '/app/Console/Kernel.php',
'App\\Exceptions\\Handler' => $baseDir . '/app/Exceptions/Handler.php',
'App\\Exports\\ProjectExport' => $baseDir . '/app/Exports/ProjectExport.php',
'App\\Http\\Controllers\\Admin\\ActionController' => $baseDir . '/app/Http/Controllers/Admin/ActionController.php',
'App\\Http\\Controllers\\Admin\\AgentController' => $baseDir . '/app/Http/Controllers/Admin/AgentController.php',
'App\\Http\\Controllers\\Admin\\CdrController' => $baseDir . '/app/Http/Controllers/Admin/CdrController.php',
'App\\Http\\Controllers\\Admin\\ConditionController' => $baseDir . '/app/Http/Controllers/Admin/ConditionController.php',
'App\\Http\\Controllers\\Admin\\DepartmentController' => $baseDir . '/app/Http/Controllers/Admin/DepartmentController.php',
'App\\Http\\Controllers\\Admin\\ExtensionController' => $baseDir . '/app/Http/Controllers/Admin/ExtensionController.php',
@ -23,16 +29,13 @@ return array(
'App\\Http\\Controllers\\Admin\\ProjectController' => $baseDir . '/app/Http/Controllers/Admin/ProjectController.php',
'App\\Http\\Controllers\\Admin\\ProjectDesignController' => $baseDir . '/app/Http/Controllers/Admin/ProjectDesignController.php',
'App\\Http\\Controllers\\Admin\\QueueController' => $baseDir . '/app/Http/Controllers/Admin/QueueController.php',
'App\\Http\\Controllers\\Admin\\RemindController' => $baseDir . '/app/Http/Controllers/Admin/RemindController.php',
'App\\Http\\Controllers\\Admin\\RoleController' => $baseDir . '/app/Http/Controllers/Admin/RoleController.php',
'App\\Http\\Controllers\\Admin\\SipController' => $baseDir . '/app/Http/Controllers/Admin/SipController.php',
'App\\Http\\Controllers\\Admin\\TaskController' => $baseDir . '/app/Http/Controllers/Admin/TaskController.php',
'App\\Http\\Controllers\\Admin\\UserController' => $baseDir . '/app/Http/Controllers/Admin/UserController.php',
'App\\Http\\Controllers\\Auth\\ConfirmPasswordController' => $baseDir . '/app/Http/Controllers/Auth/ConfirmPasswordController.php',
'App\\Http\\Controllers\\Auth\\ForgotPasswordController' => $baseDir . '/app/Http/Controllers/Auth/ForgotPasswordController.php',
'App\\Http\\Controllers\\Auth\\LoginController' => $baseDir . '/app/Http/Controllers/Auth/LoginController.php',
'App\\Http\\Controllers\\Auth\\RegisterController' => $baseDir . '/app/Http/Controllers/Auth/RegisterController.php',
'App\\Http\\Controllers\\Auth\\ResetPasswordController' => $baseDir . '/app/Http/Controllers/Auth/ResetPasswordController.php',
'App\\Http\\Controllers\\Auth\\VerificationController' => $baseDir . '/app/Http/Controllers/Auth/VerificationController.php',
'App\\Http\\Controllers\\Admin\\WasteController' => $baseDir . '/app/Http/Controllers/Admin/WasteController.php',
'App\\Http\\Controllers\\ApiController' => $baseDir . '/app/Http/Controllers/ApiController.php',
'App\\Http\\Controllers\\Controller' => $baseDir . '/app/Http/Controllers/Controller.php',
'App\\Http\\Kernel' => $baseDir . '/app/Http/Kernel.php',
'App\\Http\\Middleware\\Authenticate' => $baseDir . '/app/Http/Middleware/Authenticate.php',
@ -67,6 +70,7 @@ return array(
'App\\Models\\Action' => $baseDir . '/app/Models/Action.php',
'App\\Models\\Agent' => $baseDir . '/app/Models/Agent.php',
'App\\Models\\Call' => $baseDir . '/app/Models/Call.php',
'App\\Models\\Cdr' => $baseDir . '/app/Models/Cdr.php',
'App\\Models\\Condition' => $baseDir . '/app/Models/Condition.php',
'App\\Models\\Department' => $baseDir . '/app/Models/Department.php',
'App\\Models\\Extension' => $baseDir . '/app/Models/Extension.php',

View File

@ -87,4 +87,6 @@ return array(
'ed962a97bd972bc82007176b647d4e36' => $vendorDir . '/facade/ignition/src/helpers.php',
'5e8fe2a5ffaded85af682684fe3bbf5a' => $vendorDir . '/mews/captcha/src/helpers.php',
'377b22b161c09ed6e5152de788ca020a' => $vendorDir . '/spatie/laravel-permission/src/helpers.php',
'a38b85dec9d83a5d3b31723990f6f122' => $baseDir . '/bootstrap/Freeswitchesl.php',
'14cd3a4930749f01c4f7f007ebf2139a' => $baseDir . '/bootstrap/Snowflake.php',
);

View File

@ -88,6 +88,8 @@ class ComposerStaticInita823d0d9fdfb372460e15358f4fe1e65
'ed962a97bd972bc82007176b647d4e36' => __DIR__ . '/..' . '/facade/ignition/src/helpers.php',
'5e8fe2a5ffaded85af682684fe3bbf5a' => __DIR__ . '/..' . '/mews/captcha/src/helpers.php',
'377b22b161c09ed6e5152de788ca020a' => __DIR__ . '/..' . '/spatie/laravel-permission/src/helpers.php',
'a38b85dec9d83a5d3b31723990f6f122' => __DIR__ . '/../..' . '/bootstrap/Freeswitchesl.php',
'14cd3a4930749f01c4f7f007ebf2139a' => __DIR__ . '/../..' . '/bootstrap/Snowflake.php',
);
public static $prefixLengthsPsr4 = array (
@ -527,11 +529,17 @@ class ComposerStaticInita823d0d9fdfb372460e15358f4fe1e65
);
public static $classMap = array (
'App\\Console\\Commands\\asrListen' => __DIR__ . '/../..' . '/app/Console/Commands/asrListen.php',
'App\\Console\\Commands\\asrRecord' => __DIR__ . '/../..' . '/app/Console/Commands/asrRecord.php',
'App\\Console\\Commands\\callcenterListen' => __DIR__ . '/../..' . '/app/Console/Commands/callcenterListen.php',
'App\\Console\\Commands\\callcenterRun' => __DIR__ . '/../..' . '/app/Console/Commands/callcenterRun.php',
'App\\Console\\Commands\\submeter' => __DIR__ . '/../..' . '/app/Console/Commands/submeter.php',
'App\\Console\\Kernel' => __DIR__ . '/../..' . '/app/Console/Kernel.php',
'App\\Exceptions\\Handler' => __DIR__ . '/../..' . '/app/Exceptions/Handler.php',
'App\\Exports\\ProjectExport' => __DIR__ . '/../..' . '/app/Exports/ProjectExport.php',
'App\\Http\\Controllers\\Admin\\ActionController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/ActionController.php',
'App\\Http\\Controllers\\Admin\\AgentController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/AgentController.php',
'App\\Http\\Controllers\\Admin\\CdrController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/CdrController.php',
'App\\Http\\Controllers\\Admin\\ConditionController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/ConditionController.php',
'App\\Http\\Controllers\\Admin\\DepartmentController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/DepartmentController.php',
'App\\Http\\Controllers\\Admin\\ExtensionController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/ExtensionController.php',
@ -544,16 +552,13 @@ class ComposerStaticInita823d0d9fdfb372460e15358f4fe1e65
'App\\Http\\Controllers\\Admin\\ProjectController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/ProjectController.php',
'App\\Http\\Controllers\\Admin\\ProjectDesignController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/ProjectDesignController.php',
'App\\Http\\Controllers\\Admin\\QueueController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/QueueController.php',
'App\\Http\\Controllers\\Admin\\RemindController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/RemindController.php',
'App\\Http\\Controllers\\Admin\\RoleController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/RoleController.php',
'App\\Http\\Controllers\\Admin\\SipController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/SipController.php',
'App\\Http\\Controllers\\Admin\\TaskController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/TaskController.php',
'App\\Http\\Controllers\\Admin\\UserController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/UserController.php',
'App\\Http\\Controllers\\Auth\\ConfirmPasswordController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/ConfirmPasswordController.php',
'App\\Http\\Controllers\\Auth\\ForgotPasswordController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/ForgotPasswordController.php',
'App\\Http\\Controllers\\Auth\\LoginController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/LoginController.php',
'App\\Http\\Controllers\\Auth\\RegisterController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/RegisterController.php',
'App\\Http\\Controllers\\Auth\\ResetPasswordController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/ResetPasswordController.php',
'App\\Http\\Controllers\\Auth\\VerificationController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/VerificationController.php',
'App\\Http\\Controllers\\Admin\\WasteController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/WasteController.php',
'App\\Http\\Controllers\\ApiController' => __DIR__ . '/../..' . '/app/Http/Controllers/ApiController.php',
'App\\Http\\Controllers\\Controller' => __DIR__ . '/../..' . '/app/Http/Controllers/Controller.php',
'App\\Http\\Kernel' => __DIR__ . '/../..' . '/app/Http/Kernel.php',
'App\\Http\\Middleware\\Authenticate' => __DIR__ . '/../..' . '/app/Http/Middleware/Authenticate.php',
@ -588,6 +593,7 @@ class ComposerStaticInita823d0d9fdfb372460e15358f4fe1e65
'App\\Models\\Action' => __DIR__ . '/../..' . '/app/Models/Action.php',
'App\\Models\\Agent' => __DIR__ . '/../..' . '/app/Models/Agent.php',
'App\\Models\\Call' => __DIR__ . '/../..' . '/app/Models/Call.php',
'App\\Models\\Cdr' => __DIR__ . '/../..' . '/app/Models/Cdr.php',
'App\\Models\\Condition' => __DIR__ . '/../..' . '/app/Models/Condition.php',
'App\\Models\\Department' => __DIR__ . '/../..' . '/app/Models/Department.php',
'App\\Models\\Extension' => __DIR__ . '/../..' . '/app/Models/Extension.php',