You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
389 lines
8.2 KiB
Vue
389 lines
8.2 KiB
Vue
<template>
|
|
<view class="chatk">
|
|
<view class="msg_list" ref="scrollContainer" id="container">
|
|
<view v-if="jianjie != ''" class="sendMsg">
|
|
<view class="sendMsg_left">
|
|
<view class="sendMsg_left_time">{{jianjie.created_at.substring(5,19)}}</view>
|
|
<view class="sendMsg_left_msg">
|
|
<view class="jianjie_k">
|
|
<view>
|
|
{{jianjie.title}}
|
|
</view>
|
|
<view class="jianjie_img_k">
|
|
<image v-for="(item,index) in jianjie.imgs" :key="index" class="jianjie_img"
|
|
:src="baseUrl+item"></image>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
</view>
|
|
<view class="sendMsg_right">
|
|
<image class="user_img" src="../../static/chat/user.png"></image>
|
|
</view>
|
|
</view>
|
|
|
|
<view v-for="(item,index) in chatList">
|
|
<view v-if="item.user_type==0" class="sendMsg">
|
|
<view class="sendMsg_left">
|
|
<view class="sendMsg_left_time">{{item.created_at.substring(5,19)}}</view>
|
|
<view class="sendMsg_left_msg">
|
|
<span v-if="item.msg_type==0">{{item.content}}</span>
|
|
<span v-if="item.msg_type==1">
|
|
<image class="jianjie_img" :src="baseUrl+item.content"></image>
|
|
</span>
|
|
</view>
|
|
</view>
|
|
<view class="sendMsg_right">
|
|
<image class="user_img" src="../../static/chat/user.png"></image>
|
|
</view>
|
|
</view>
|
|
<view v-if="item.user_type==1" class="receiveMsg">
|
|
<view class="receiveMsg_left">
|
|
<image class="user_img" src="../../static/chat/kefu.png"></image>
|
|
<view class="username">客服</view>
|
|
</view>
|
|
<view class="receiveMsg_right">
|
|
<view class="receiveMsg_right_time">{{item.created_at.substring(5,19)}}</view>
|
|
<view class="receiveMsg_right_msg"><span v-if="item.msg_type==0">{{item.content}}</span>
|
|
<span v-if="item.msg_type==1">
|
|
<image class="jianjie_img" :src="baseUrl+item.content"></image>
|
|
</span>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view v-if="chatList.length==0" class="tishi">欢迎留言</view>
|
|
<view v-if="workOrderstatus.status==3" class="tishi">工单已关闭,如遇到问题请重新提交工单</view>
|
|
<view class="ding"></view>
|
|
</view>
|
|
<view class="end">
|
|
<view v-if="workOrderstatus.status==1 || workOrderstatus.status==2 " style="display: flex;">
|
|
<view style="margin-bottom: 10rpx;font-size: 20rpx;color:#999999">
|
|
发送图片
|
|
<uni-file-picker ref="files" class="file111" @select="selectFile" :imageStyles="imageStyles"
|
|
:auto-upload="false" limit="1">
|
|
|
|
</uni-file-picker>
|
|
</view>
|
|
<view style="display: flex; align-items: center; margin-left: 20rpx;">
|
|
<switch :checked="switchchecked" color="#ff7c2e" @change="CloseWorkOrderChange"
|
|
style="transform:scale(0.7); margin-bottom: 10rpx;" />
|
|
<view style="color:#808080; font-size: 22rpx; margin-top: -10rpx; margin-left: -10rpx;">关闭此工单</view>
|
|
</view>
|
|
</view>
|
|
<view class="msg_k">
|
|
<view class="msg_k_left">
|
|
<uni-easyinput :disabled="workOrderstatus.status!=3?false:true" type="textarea" v-model="msgContent"
|
|
placeholder="请输入留言信息" />
|
|
</view>
|
|
<view class="msg_k_right"><button type="primary" size="mini" plain="true" @click="send">发送</button>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view>
|
|
<!-- 提示窗示例 -->
|
|
<uni-popup ref="alertDialog" type="dialog">
|
|
<uni-popup-dialog cancelText="取消" confirmText="确定" title="提示" content="确定关闭此工单吗?"
|
|
@confirm="dialogConfirm" @close="dialogClose"></uni-popup-dialog>
|
|
</uni-popup>
|
|
</view>
|
|
|
|
</view>
|
|
</template>
|
|
|
|
<script setup>
|
|
import {
|
|
ref,
|
|
onMounted,
|
|
nextTick
|
|
} from "vue"
|
|
import {
|
|
onLoad
|
|
} from '@dcloudio/uni-app'
|
|
import {
|
|
GetSelfMsgList,
|
|
GetWorkOrderInfo,
|
|
BaseFileUrl,
|
|
InsertMsg,
|
|
UserChangeWorkOrder,
|
|
UpFileUrl
|
|
} from '@/api'
|
|
let imageStyles = {
|
|
width: 50,
|
|
height: 50,
|
|
border: {
|
|
color: "#ccc",
|
|
width: 1,
|
|
style: 'dashed',
|
|
radius: '2px'
|
|
},
|
|
|
|
}
|
|
let files = ref(null)
|
|
let switchchecked = ref(true);
|
|
let alertDialog = ref(null)
|
|
const dialogClose = () => {
|
|
|
|
switchchecked.value = true
|
|
}
|
|
//关闭工单
|
|
const CloseWorkOrderChange = (e) => {
|
|
if (e.detail.value == false) {
|
|
alertDialog.value.open()
|
|
switchchecked.value = false
|
|
}
|
|
|
|
}
|
|
|
|
let workOrderId = ref('')
|
|
|
|
onLoad((option) => {
|
|
workOrderId.value = option.id
|
|
})
|
|
//更改工单状态
|
|
const dialogConfirm = async () => {
|
|
let data = {
|
|
WorkOrder: workOrderId.value
|
|
}
|
|
|
|
UserChangeWorkOrder(data).then(res => {
|
|
if (res.status) {
|
|
uni.showToast({
|
|
title: "工单成功关闭",
|
|
duration: 2000,
|
|
icon: 'none'
|
|
});
|
|
getList()
|
|
}
|
|
})
|
|
}
|
|
|
|
|
|
let msgContent = ref("")
|
|
let msgType = ref(0)
|
|
let chatList = ref([]) //聊天记录
|
|
let workOrderstatus = ref('') //工单状态
|
|
const send = async () => {
|
|
if (msgContent.value == '') return
|
|
let data = {
|
|
MsgInfo: {
|
|
WorkOrder: workOrderId.value,
|
|
Content: msgContent.value,
|
|
MsgType: msgType.value
|
|
}
|
|
}
|
|
msgContent.value = ''
|
|
msgType.value = 0
|
|
InsertMsg(data).then(res => {
|
|
if (res.status) {
|
|
getList()
|
|
}
|
|
})
|
|
}
|
|
let page = ref(1)
|
|
const getList = async () => {
|
|
let data = {
|
|
Page: page.value,
|
|
WorkOrder: workOrderId.value
|
|
}
|
|
GetSelfMsgList(data).then(res => {
|
|
if (res.status) {
|
|
chatList.value = res.data.list.reverse()
|
|
workOrderstatus.value = res.data.workorder_status
|
|
toBottom()
|
|
}
|
|
})
|
|
|
|
}
|
|
const scrollContainer = ref(null);
|
|
//滚动到聊天底部
|
|
const toBottom = () => {
|
|
nextTick(() => {
|
|
const container = document.getElementById('container'); // 替换为你的容器元素ID
|
|
|
|
container.scrollIntoView(false);
|
|
})
|
|
|
|
}
|
|
let jianjie = ref('');
|
|
//获取工单简介
|
|
const getJianJie = () => {
|
|
GetWorkOrderInfo({
|
|
WorkOrder: workOrderId.value
|
|
}).then(res => {
|
|
if (res.status) {
|
|
jianjie.value = res.data
|
|
}
|
|
})
|
|
}
|
|
const selectFile = (e) => {
|
|
console.log(e)
|
|
uni.uploadFile({
|
|
url: UpFileUrl(), //仅为示例,非真实的接口地址
|
|
filePath: e.tempFilePaths[0],
|
|
name: 'file',
|
|
header: {
|
|
Authorization: 'Bearer ' + sessionStorage.getItem("access_token")
|
|
},
|
|
success: (uploadFileRes) => {
|
|
let res = JSON.parse(uploadFileRes.data);
|
|
files.value.clearFiles()
|
|
msgContent.value = res.data
|
|
msgType.value = 1
|
|
send()
|
|
},
|
|
fail: (err) => {
|
|
console.log(err);
|
|
}
|
|
})
|
|
}
|
|
|
|
let baseUrl = ref('');
|
|
onMounted(() => {
|
|
baseUrl.value = BaseFileUrl()
|
|
console.log(baseUrl.value)
|
|
getJianJie()
|
|
getList()
|
|
})
|
|
</script>
|
|
|
|
<style scoped>
|
|
.grey {
|
|
filter: grayscale(100%);
|
|
}
|
|
|
|
.chatk {
|
|
height: 100vh;
|
|
background-color: #f4f4f4;
|
|
}
|
|
|
|
.msg_list {
|
|
padding: 20rpx;
|
|
|
|
|
|
}
|
|
|
|
.end {
|
|
background-color: #fff;
|
|
padding: 20rpx;
|
|
position: fixed;
|
|
bottom: 0px;
|
|
width: calc(100% - 40rpx);
|
|
}
|
|
|
|
.msg_k {
|
|
display: flex;
|
|
|
|
}
|
|
|
|
.msg_k_left {
|
|
width: 100%;
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: flex-end;
|
|
}
|
|
|
|
.msg_k_right {
|
|
|
|
margin-left: 20rpx;
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: flex-end;
|
|
}
|
|
|
|
.sendMsg {
|
|
display: flex;
|
|
justify-content: flex-end;
|
|
margin: 20rpx auto;
|
|
}
|
|
|
|
.sendMsg_left_time {
|
|
text-align: right;
|
|
color: #9c9c9c;
|
|
font-size: 24rpx;
|
|
margin-bottom: 4rpx;
|
|
}
|
|
|
|
.sendMsg_left_msg {
|
|
background-color: #6ecda9;
|
|
color: #444444;
|
|
padding: 20rpx 30rpx;
|
|
border-radius: 20rpx 0rpx 20rpx 20rpx;
|
|
}
|
|
|
|
.receiveMsg {
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
margin: 20rpx auto;
|
|
}
|
|
|
|
.receiveMsg_right_time {
|
|
text-align: left;
|
|
color: #9c9c9c;
|
|
font-size: 24rpx;
|
|
margin-bottom: 4rpx;
|
|
}
|
|
|
|
.receiveMsg_right_msg {
|
|
background-color: #ffffff;
|
|
color: #565656;
|
|
padding: 20rpx 30rpx;
|
|
border-radius: 0rpx 20rpx 20rpx 20rpx;
|
|
}
|
|
|
|
.ding {
|
|
height: 350rpx;
|
|
}
|
|
|
|
.receiveMsg_left {
|
|
margin-right: 8rpx;
|
|
}
|
|
|
|
.tishi {
|
|
text-align: center;
|
|
font-size: 20rpx;
|
|
color: #ccc;
|
|
margin-bottom: 10rpx;
|
|
}
|
|
|
|
.user_img {
|
|
width: 80rpx;
|
|
height: 80rpx;
|
|
background-color: #eeeeee;
|
|
border-radius: 50%;
|
|
}
|
|
|
|
.username {
|
|
font-size: 20rpx;
|
|
color: #ccc;
|
|
text-align: center;
|
|
}
|
|
|
|
.jianjie_k {
|
|
|
|
padding: 10rpx;
|
|
|
|
}
|
|
|
|
.jianjie_img_k {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
width: 100%;
|
|
margin-top: 10rpx;
|
|
|
|
}
|
|
|
|
.jianjie_img {
|
|
width: 120rpx;
|
|
height: 120rpx;
|
|
background-color: #5faa9e;
|
|
}
|
|
|
|
.jianjie_img:not(:last-child) {
|
|
margin-right: 20rpx;
|
|
}
|
|
|
|
.icon-add {
|
|
height: 1px !important;
|
|
}
|
|
</style> |