Browse Source

Merge remote-tracking branch 'origin/develop' into develop

develop
李可松 4 years ago
parent
commit
3de3916bf3
  1. 20
      app/AdminAgent/Controllers/WorkorderController.php
  2. 21
      app/AdminGuide/Controllers/WorkorderController.php
  3. 20
      app/AdminSupplier/Controllers/WorkorderController.php
  4. 10
      app/Models/Agent.php
  5. 10
      app/Models/Guide.php
  6. 5
      app/Models/Supplier.php
  7. 40
      database/migrations/2021_09_10_144727_update_workorder_table.php
  8. 4
      public/js/helper.js
  9. 309
      resources/views/admin/pages/index.blade.php

20
app/AdminAgent/Controllers/WorkorderController.php

@ -41,12 +41,17 @@ class WorkorderController extends AdminController
->orderByDesc('updated_at')
->get();
// 先这么处理吧
if ($workorderId == 0 && !empty($workorder)) {
return redirect('/admin-agent/workorder_item?workorder_id='.$workorder[0]->id);
}
foreach ($workorder as $v) {
$item = WorkorderItem::query()->where('workorder_id',$v->id)->orderByDesc('updated_at')->first();
$arr = [
'workorder_id' => $v->id,
'unread' => true,
'avatar' => $v->publisher_type == DemandTraits::$col[0] ? $v->point->avatar : $v->publisher->avatar,
'avatar' => Storage::url($v->publisher_type == DemandTraits::$col[0] ? $v->point->avatar : $v->publisher->avatar),
'name' => $v->publisher_type == DemandTraits::$col[0] ? $v->point->name : $v->publisher->name,
'content' => $v->title,
'last_message' => $item ? ($item->type == 1 ? $item->content : '【 图片 】') : '',
@ -64,13 +69,24 @@ class WorkorderController extends AdminController
$arr = [
'type' => $v->publisher_type == DemandTraits::$col[0] ? 'my' : 'op',
'it_type' => $v->type,
'avatar' => $v->publisher->avatar,
'avatar' => Storage::url($v->publisher->avatar),
'name' => $v->publisher->name,
'content' => $v->content,
'created_at_text' => $v->created_at,
];
$msgList [] = $arr;
}
$currentWorkorder = \App\Models\Workorder::find($workorderId);
array_unshift($msgList, [
'type' => 'op',
'it_type' => 1,
'avatar' => Storage::url($currentWorkorder->publisher->avatar),
'name' => $currentWorkorder->publisher->name,
'content' => $currentWorkorder->content,
'created_at_text' => $currentWorkorder->created_at,
]);
$data = [
'user_list' => $userList,
'msg_list' => $msgList,

21
app/AdminGuide/Controllers/WorkorderController.php

@ -41,12 +41,18 @@ class WorkorderController extends AdminController
})
->orderByDesc('updated_at')
->get();
// 先这么处理吧
if ($workorderId == 0 && !empty($workorder)) {
return redirect('/admin-agent/workorder_item?workorder_id='.$workorder[0]->id);
}
foreach ($workorder as $v) {
$item = WorkorderItem::query()->where('workorder_id',$v->id)->orderByDesc('updated_at')->first();
$arr = [
'workorder_id' => $v->id,
'unread' => true,
'avatar' => $v->publisher_type == DemandTraits::$col[2] ? $v->point->avatar : $v->publisher->avatar,
'avatar' => Storage::url($v->publisher_type == DemandTraits::$col[2] ? $v->point->avatar : $v->publisher->avatar),
'name' => $v->publisher_type == DemandTraits::$col[2] ? $v->point->name : $v->publisher->name,
'content' => $v->title,
'last_message' => $item ? ($item->type == 1 ? $item->content : '【 图片 】') : '',
@ -64,13 +70,24 @@ class WorkorderController extends AdminController
$arr = [
'type' => $v->publisher_type == DemandTraits::$col[2] ? 'my' : 'op',
'it_type' => $v->type,
'avatar' => $v->publisher->avatar,
'avatar' => Storage::url($v->publisher->avatar),
'name' => $v->publisher->name,
'content' => $v->content,
'created_at_text' => $v->created_at,
];
$msgList [] = $arr;
}
$currentWorkorder = \App\Models\Workorder::find($workorderId);
array_unshift($msgList, [
'type' => 'op',
'it_type' => 1,
'avatar' => Storage::url($currentWorkorder->publisher->avatar),
'name' => $currentWorkorder->publisher->name,
'content' => $currentWorkorder->content,
'created_at_text' => $currentWorkorder->created_at,
]);
$data = [
'user_list' => $userList,
'msg_list' => $msgList,

20
app/AdminSupplier/Controllers/WorkorderController.php

@ -41,12 +41,17 @@ class WorkorderController extends AdminController
->orderByDesc('updated_at')
->get();
// 先这么处理吧
if ($workorderId == 0 && !empty($workorder)) {
return redirect('/admin-agent/workorder_item?workorder_id='.$workorder[0]->id);
}
foreach ($workorder as $v) {
$item = WorkorderItem::query()->where('workorder_id',$v->id)->orderByDesc('updated_at')->first();
$arr = [
'workorder_id' => $v->id,
'unread' => true,
'avatar' => $v->publisher_type == DemandTraits::$col[1] ? $v->point->avatar : $v->publisher->avatar,
'avatar' => Storage::url($v->publisher_type == DemandTraits::$col[1] ? $v->point->avatar : $v->publisher->avatar),
'name' => $v->publisher_type == DemandTraits::$col[1] ? $v->point->name : $v->publisher->name,
'content' => $v->title,
'last_message' => $item ? ($item->type == 1 ? $item->content : '【 图片 】') : '',
@ -64,13 +69,24 @@ class WorkorderController extends AdminController
$arr = [
'type' => $v->publisher_type == DemandTraits::$col[1] ? 'my' : 'op',
'it_type' => $v->type,
'avatar' => $v->publisher->avatar,
'avatar' => Storage::url($v->publisher->avatar),
'name' => $v->publisher->name,
'content' => $v->content,
'created_at_text' => $v->created_at,
];
$msgList [] = $arr;
}
$currentWorkorder = \App\Models\Workorder::find($workorderId);
array_unshift($msgList, [
'type' => 'op',
'it_type' => 1,
'avatar' => Storage::url($currentWorkorder->publisher->avatar),
'name' => $currentWorkorder->publisher->name,
'content' => $currentWorkorder->content,
'created_at_text' => $currentWorkorder->created_at,
]);
$data = [
'user_list' => $userList,
'msg_list' => $msgList,

10
app/Models/Agent.php

@ -43,4 +43,14 @@ class Agent extends BaseModel
{
return $this->morphOne('App\Models\DemandBidding', 'biddingUser');
}
public function workoorder()
{
return $this->morphOne('App\Models\Workorder', 'publisher');
}
public function workoorderitem()
{
return $this->morphOne('App\Models\WorkorderItem', 'publisher');
}
}

10
app/Models/Guide.php

@ -31,4 +31,14 @@ class Guide extends BaseModel
{
return $this->morphOne('App\Models\DemandBidding', 'biddingUser');
}
public function workoorder()
{
return $this->morphOne('App\Models\Workorder', 'publisher');
}
public function workoorderitem()
{
return $this->morphOne('App\Models\WorkorderItem', 'publisher');
}
}

5
app/Models/Supplier.php

@ -48,4 +48,9 @@ class Supplier extends BaseModel
{
return $this->morphOne('App\Models\Workorder', 'point');
}
public function workoorderitem()
{
return $this->morphOne('App\Models\WorkorderItem', 'publisher');
}
}

40
database/migrations/2021_09_10_144727_update_workorder_table.php

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class UpdateWorkorderTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('workorder', function (Blueprint $table) {
$table->text('content')->nullable()->change();
});
Schema::table('workorder_item', function (Blueprint $table) {
$table->text('content')->nullable()->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('workorder', function (Blueprint $table) {
$table->string('content')->change();
});
Schema::table('workorder_item', function (Blueprint $table) {
$table->string('content')->change();
});
}
}

4
public/js/helper.js

@ -0,0 +1,4 @@
function viewImage(ele) {
$('#viewImage').find('img').attr('src', $(ele).attr('src'));
$('#viewImage').modal();
}

309
resources/views/admin/pages/index.blade.php

@ -1,134 +1,145 @@
<style>
.chat-container { padding: 20px 40px; }
.chat-container { padding: 20px 40px; height: calc(100vh - 160px) }
.msg-chat {
position: relative; background-color: white; padding: 40px 20px;
border-top-right-radius: 8px; border-bottom-right-radius: 8px;
position: relative; background-color: white; padding: 40px 20px 50px 20px;
border-top-right-radius: 8px; border-bottom-right-radius: 8px; height: 100%;
}
.msg-chat-list { min-height: 800px; max-height: 800px; overflow-y: auto; overflow-x: hidden; }
.msg-chat-list { height: 100%; overflow-y: auto; overflow-x: hidden; padding-bottom: 20px; }
.msg-user { margin: 5px 0px; line-height: 30px; }
.msg-name { display: inline-block; font-size: 14px; font-weight: bold; padding: 0px 5px; }
.msg-avatar { display: inline-block; }
.msg-avatar img { width: 30px; height: 30px; border-radius: 50%; }
.msg-content { display: inline-block; background-color: #f4f4f4; padding: 20px; border-radius: 10px; }
.msg-content-image { max-width: 120px; max-height: 120px; }
.msg-send { position: absolute; bottom: 0; left: 0; z-index: 999; }
.msg-send { position: absolute; bottom: 0; left: 0; z-index: 999; height: 50px; }
.msg-send .input-group-addon { width: 40px; border: none; line-height: 2.7; background-color: #dbe3e6; cursor: pointer; }
.msg-send .input-group-addon.msg-text { background-color: #586cb1; color: white; padding: 5px 10px; width: 60px; line-height: 2.8; }
.msg-time { padding: 0 5px; color: gray; font-size: 12px; margin: 5px 0; }
.msg-list {
position: relative; background-color: white;
border-top-left-radius: 5px; border-bottom-left-radius: 5px; min-height: 900px;
max-height: 1000px; border-right: 1px solid #dbe3e6; overflow-y: auto;
border-top-left-radius: 5px; border-bottom-left-radius: 5px;
height: 100%; border-right: 1px solid #dbe3e6; overflow-y: auto;
padding: 20px 10px;
}
.msg-list-item { position: relative; border: 1px solid #dbe3e6; padding: 10px; border-radius: 5px; margin-bottom: 1px; cursor: pointer; }
.msg-list-item:hover { border-color: green; }
.msg-list-item.active { border: 2px solid green; box-shadow: 0px 0px 4px green; }
.msg-list-title { font-weight: bold; font-size: 14px; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; border-radius: 5px; padding: 2px 5px; overflow: hidden; text-overflow: ellipsis; margin-bottom: 5px; }
.msg-list-content { color: gray; background-color: #f4f4f4; border-radius: 5px; padding: 2px 5px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.msg-list-badge {
position: absolute; right: 5px; top: 5px;
width: 10px; height: 10px; border-radius: 10px;
}
/*.background-red { background-color: red; }*/
.background-red { background-color: red; }
.background-gray { background-color: gray; }
</style>
<div class="row chat-container">
<div class="col-lg-3 col-md-4 msg-list">
@foreach($user_list as $key => $item)
<div class="msg-list-item" onclick="window.location.href = '?workorder_id={{$item['workorder_id']}}'">
<div class="msg-user">
<div class="msg-avatar">
<img src="{{$item['avatar']}}" alt="头像" title="头像" />
</div>
<div class="msg-name">
{{$item['name']}}
</div>
</div>
<div class="msg-list-title">
{{$item['content']}}
</div>
<div class="msg-list-content">
{{$item['last_message']}}
</div>
<div class="msg-time">
{{$item['last_message_time']}}
</div>
@if($item['unread'] == true)
<div class="msg-list-badge background-red"></div>
@if(empty($user_list))
<div class="text-center">暂无工单数据</div>
@else
@foreach($user_list as $key => $item)
@if($workorder['workorder_id']==$item['workorder_id'])
<div class="msg-list-item active" onclick="window.location.href = '?workorder_id={{$item['workorder_id']}}'">
@else
<div class="msg-list-badge background-gray"></div>
<div class="msg-list-item" onclick="window.location.href = '?workorder_id={{$item['workorder_id']}}'">
@endif
</div>
@endforeach
</div>
<div class="col-lg-9 col-md-8 msg-chat">
<div class="input-group input-group-lg msg-send">
<input name="msg-input" type="text" class="form-control" style="border-radius: 0; border-color: #dbe3e6; text-align: center;">
<div class="input-group-addon msg-image"><span class="fa fa-picture-o"></span></div>
<div class="input-group-addon msg-text">发送</div>
<input type="file" class="hidden image" name="image">
</div>
<div class="msg-chat-list">
@foreach($msg_list as $key => $item)
@if($item['type'] == 'op')
<div class="row">
<div class="col-lg-11 text-left">
<div class="msg-user">
<div class="msg-avatar">
<img src="{{$item['avatar']}}" alt="头像" title="头像" />
</div>
<div class="msg-name">
{{$item['name']}}
</div>
</div>
<div class="msg-content">
@if($item['it_type'] == 1)
{{$item['content']}}
@elseif($item['it_type'] == 2)
<img class="msg-content-image" src="{{$item['content']}}" alt="图片" title="图片" />
@endif
<div class="msg-list-title">
{{$item['content']}}
</div>
<div class="msg-list-content">
{{$item['last_message']}}
</div>
<div class="msg-time">
2021-01-01 12:02:03
{{$item['last_message_time']}}
</div>
{{--@if($item['unread'] == true)--}}
{{--<div class="msg-list-badge background-red"></div>--}}
{{--@else--}}
{{--<div class="msg-list-badge background-gray"></div>--}}
{{--@endif--}}
</div>
</div>
@elseif($item['type'] == 'my')
<div class="row">
<div class="col-lg-11 offset-1 text-right">
<div class="msg-user">
<div class="msg-name">
{{$item['name']}}
@endforeach
@endif
</div>
<div class="col-lg-9 col-md-8 msg-chat">
@if(empty($msg_list))
<div class="text-center">暂无工单数据</div>
@else
<div class="input-group input-group-lg msg-send">
<input name="msg-input" type="text" class="form-control" style="border-radius: 0; border-color: #dbe3e6; text-align: center;">
<div class="input-group-addon msg-image"><span class="fa fa-picture-o"></span></div>
<div class="input-group-addon msg-text">发送</div>
<input type="file" class="hidden image" name="image">
</div>
<div class="msg-chat-list">
@foreach($msg_list as $key => $item)
@if($item['type'] == 'op')
<div class="row">
<div class="col-lg-11 text-left">
<div class="msg-user">
<div class="msg-avatar">
<img src="{{$item['avatar']}}" alt="头像" title="头像" />
</div>
<div class="msg-name">
{{$item['name']}}
</div>
</div>
<div class="msg-avatar">
<img src="{{$item['avatar']}}" alt="头像" title="头像" />
<div class="msg-content">
@if($item['it_type'] == 1)
{{$item['content']}}
@elseif($item['it_type'] == 2)
<img class="msg-content-image" onclick="viewImage(this)" src="{{$item['content']}}" alt="图片" title="图片" />
@endif
</div>
</div>
<div class="msg-content text-left">
@if($item['it_type'] == 1)
{{$item['content']}}
@elseif($item['it_type'] == 2)
<img class="msg-content-image" src="{{$item['content']}}" alt="图片" title="图片" />
@endif
<div class="msg-time">
{{$item['created_at_text']}}
</div>
</div>
</div>
@elseif($item['type'] == 'my')
<div class="row">
<div class="col-lg-11 offset-1 text-right">
<div class="msg-user">
<div class="msg-name">
{{$item['name']}}
</div>
<div class="msg-avatar">
<img src="{{$item['avatar']}}" alt="头像" title="头像" />
</div>
</div>
<div class="msg-time">
2021-01-01 12:02:03
<div class="msg-content text-left">
@if($item['it_type'] == 1)
{{$item['content']}}
@elseif($item['it_type'] == 2)
<img class="msg-content-image" onclick="viewImage(this)" src="{{$item['content']}}" alt="图片" title="图片" />
@endif
</div>
<div class="msg-time">
{{$item['created_at_text']}}
</div>
</div>
</div>
</div>
@endif
@endforeach
</div>
@endif
@endforeach
</div>
@endif
</div>
<div class="hidden-forms">
@ -162,7 +173,7 @@
{{$user->name}}
</div>
<div class="msg-avatar">
<img src="{{$user->avatar}}" alt="头像" title="头像" />
<img src="{{\Illuminate\Support\Facades\Storage::url($user->avatar)}}" alt="头像" title="头像" />
</div>
</div>
<div class="msg-content text-left">#contents</div>
@ -171,71 +182,87 @@
</div>
</div>
<script>
Dcat.ready(function() {
$('.msg-image').on('click', function (e) {
$('.image').click();
});
<div class="modal fade" tabindex="-1" role="dialog" id="viewImage">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<img src="" style="width: 100%; height: 100%;" />
</div>
</div>
</div>
<script src="js/helper.js" type="application/javascript"></script>
<script>
$('.image').on('change', function (e) {
let formData = new FormData()
formData.append("image", $(this)[0].files[0])
formData.append("workorder_id", $('input[name=workorder-id]').val())
$.ajax({
url: '/admin-agent/send_image',
type: 'POST',
data: formData,
processData: false,
contentType: false,
dataType: 'json',
success: function(res) {
let imageUrl = 'https://hainan.lanzulive.com/'+res.data.content
let msgTime = res.data.created_at
let templateHtml = $('.template-my').html()
let imgDoc = '<img class="msg-content-image" src="'+imageUrl+'" alt="图片" title="图片" />'
templateHtml = templateHtml.replace('#contents', imgDoc)
templateHtml = templateHtml.replace('#times', msgTime)
$(".msg-chat-list").append(templateHtml)
$(".msg-chat-list").animate({ scrollTop: $(".msg-chat-list")[0].scrollHeight - $('.msg-chat-list').height() }, 1)
},
error: function (error) {
console.log(error)
}
Dcat.ready(function() {
// 获取元素距离父级元素顶部的距离
let offsetTop = $('.msg-list-item.active').position().top
$(".msg-list").animate({ scrollTop: offsetTop - 20}, 1)
$(".msg-chat-list").animate({ scrollTop: $(".msg-chat-list")[0].scrollHeight - $('.msg-chat-list').height() + 600 }, 1)
$('.msg-image').on('click', function (e) {
$('.image').click();
});
});
$('input[name=msg-input]').on('keyup', function (e) {
if (e.keyCode == 13) {
$('.msg-text').click()
}
});
$('.image').on('change', function (e) {
let formData = new FormData()
formData.append("image", $(this)[0].files[0])
formData.append("workorder_id", $('input[name=workorder-id]').val())
$.ajax({
url: '/admin-agent/send_image',
type: 'POST',
data: formData,
processData: false,
contentType: false,
dataType: 'json',
success: function(res) {
let imageUrl = 'https://hainan.lanzulive.com/'+res.data.content
let msgTime = res.data.created_at
let templateHtml = $('.template-my').html()
let imgDoc = '<img class="msg-content-image" onclick="viewImage(this)" src="'+imageUrl+'" alt="图片" title="图片" />'
templateHtml = templateHtml.replace('#contents', imgDoc)
templateHtml = templateHtml.replace('#times', msgTime)
$(".msg-chat-list").append(templateHtml)
$(".msg-chat-list").animate({ scrollTop: $(".msg-chat-list")[0].scrollHeight - $('.msg-chat-list').height() + 600 }, 1)
},
error: function (error) {
console.log(error)
}
});
});
$('.msg-text').on('click', function (e) {
let msgText = $('input[name=msg-input]').val()
let workorderId = $('input[name=workorder-id]').val()
$.ajax({
url: '/admin-agent/send_text',
type: 'POST',
data: {content: msgText, workorder_id: workorderId},
dataType: 'json',
success: function(res) {
let msgText = res.data.content
let msgTime = res.data.created_at
let templateHtml = $('.template-my').html()
templateHtml = templateHtml.replace('#contents', msgText)
templateHtml = templateHtml.replace('#times', msgTime)
$(".msg-chat-list").append(templateHtml)
$('input[name=msg-input]').val('')
$(".msg-chat-list").animate({ scrollTop: $(".msg-chat-list")[0].scrollHeight - $('.msg-chat-list').height() }, 1)
},
error: function (error) {
console.log(error)
$('input[name=msg-input]').on('keyup', function (e) {
if (e.keyCode == 13) {
$('.msg-text').click()
}
});
$('.msg-text').on('click', function (e) {
let msgText = $('input[name=msg-input]').val()
let workorderId = $('input[name=workorder-id]').val()
$.ajax({
url: '/admin-agent/send_text',
type: 'POST',
data: {content: msgText, workorder_id: workorderId},
dataType: 'json',
success: function(res) {
let msgText = res.data.content
let msgTime = res.data.created_at
let templateHtml = $('.template-my').html()
templateHtml = templateHtml.replace('#contents', msgText)
templateHtml = templateHtml.replace('#times', msgTime)
$(".msg-chat-list").append(templateHtml)
$('input[name=msg-input]').val('')
$(".msg-chat-list").animate({ scrollTop: $(".msg-chat-list")[0].scrollHeight - $('.msg-chat-list').height() }, 1)
},
error: function (error) {
console.log(error)
}
});
});
});
});
</script>
</script>
Loading…
Cancel
Save