This commit is contained in:
张运江 2025-01-16 17:44:49 +08:00
commit 5c39ee6700
28 changed files with 636 additions and 100 deletions

View File

@ -21,14 +21,22 @@ export default {
},
data(){
return {
acceptDialog: null,// id
acceptDialog: null,
}
},
mounted() {
let token = sessionStorage.getItem('token')
if (token){this.initVoiceCall();}
let brokerEndpoint = sessionStorage.getItem('brokerEndpoint')
if (brokerEndpoint){this.$stompSocket.initStomp(brokerEndpoint,a => this.socketSucc(a), b => this.socketErr(b));}
},
methods: {
socketSucc(frame) {
console.log(frame, '---初始化成功app')
},
socketErr(frame) {
console.log(frame, '---初始化失败app')
},
scriptWithDataSetExists(dataId) {
const scriptElement = document.querySelector(`script[data-telephone="${dataId}"]`);
return scriptElement !== null;
@ -57,33 +65,40 @@ export default {
console.error('---初始化失败', message)
})
this.acceptDialog = {
"sessionId": "32cca051-dcae-4269-ae12-e8eca5e02146",
"calleePhoneNumber": "008605305343323",
"callerPhoneNumber": "008613882832314",
"protectedCallee": "008605305343323",
"protectedCaller": "008613882832314",
"ivrPath": [
{
"key": "1",
"label": "分支内容1"
}
],
"callerLocation": "四川达州移动",
"timeout": 30,
"type": "phone",
"serverType": "staffSeat",
"aiEnabled": false,
"id": "32cca051-dcae-4269-ae12-e8eca5e02146",
"phone": "008613882832314",
"direction": "0",
"startCallTime": 1736923493486
};
// this.acceptDialog = {
// "sessionId": "32cca051-dcae-4269-ae12-e8eca5e02146",
// "calleePhoneNumber": "008605305343323",
// "callerPhoneNumber": "008613882832314",
// "protectedCallee": "008605305343323",
// "protectedCaller": "008613882832314",
// "ivrPath": [
// {
// "key": "1",
// "label": "1"
// }
// ],
// "callerLocation": "",
// "timeout": 30,
// "type": "phone",
// "serverType": "staffSeat",
// "aiEnabled": false,
// "id": "32cca051-dcae-4269-ae12-e8eca5e02146",
// "phone": "008613882832314",
// "direction": "0",
// "startCallTime": 1736923493486
// };
//
window.tccc.on('callIn', (callback) => {
this.acceptDialog = callback;
// this.acceptID = callback.id;
console.log(callback, '---呼入')
window.tccc.on('callIn', (data) => {
this.acceptDialog = data;
// this.acceptID = data.id;
console.log(data, '---语音呼入')
})
//
window.tccc.on('sessionEnded', (data) => {
this.$message.error('通话已结束!')
this.acceptDialog = null;
console.log(data, '---语音会话结束')
})
})
},
@ -113,6 +128,9 @@ export default {
}
}
}
},
beforeDestroy() {
this.$stompSocket.deactivate();
}
};
</script>

View File

@ -0,0 +1,10 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_853_50466)">
<path d="M3.73317 1.06641C3.14384 1.06641 2.6665 1.54374 2.6665 2.13307V13.8664C2.6665 14.4557 3.14384 14.9331 3.73317 14.9331H8.27588C7.76495 14.1704 7.4665 13.2536 7.4665 12.2664C7.4665 9.61521 9.6153 7.46641 12.2665 7.46641C12.6334 7.46641 12.9897 7.51092 13.3332 7.58932V5.06641C13.3332 4.92507 13.2772 4.78906 13.1769 4.68932L9.71025 1.22266C9.60999 1.12239 9.4745 1.06641 9.33317 1.06641H3.73317ZM9.0665 2.08203L12.3175 5.33307H9.59984C9.30544 5.33307 9.0665 5.09414 9.0665 4.79974V2.08203ZM12.2665 8.53307C10.2046 8.53307 8.53317 10.2045 8.53317 12.2664C8.53317 14.3283 10.2046 15.9997 12.2665 15.9997C14.3284 15.9997 15.9998 14.3283 15.9998 12.2664C15.9998 10.2045 14.3284 8.53307 12.2665 8.53307ZM13.8665 10.6664C14.0029 10.6664 14.1393 10.7184 14.2436 10.8227C14.4521 11.0312 14.4521 11.3683 14.2436 11.5768L12.1103 13.7102C12.0063 13.8142 11.8697 13.8664 11.7332 13.8664C11.5966 13.8664 11.4601 13.8142 11.3561 13.7102L10.2894 12.6435C10.0809 12.435 10.0809 12.0979 10.2894 11.8893C10.498 11.6808 10.8351 11.6808 11.0436 11.8893L11.7332 12.5789L13.4894 10.8227C13.5937 10.7184 13.7301 10.6664 13.8665 10.6664Z" fill="#4E5969"/>
</g>
<defs>
<clipPath id="clip0_853_50466">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,4 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="40" height="40" rx="20" fill="#F87272"/>
<path d="M14.8443 22.6733C15.2086 22.5783 15.488 22.2932 15.5808 21.9288L16.0486 20.0819C16.1533 19.6684 16.4949 19.3629 16.9181 19.3109C17.6495 19.2209 18.8504 19.0993 20.0011 19.0993C21.1517 19.0993 22.3526 19.2209 23.084 19.3109C23.5072 19.3629 23.8488 19.6684 23.9535 20.0819L24.4213 21.9289C24.5135 22.2937 24.7969 22.5794 25.1612 22.6744L29.7603 23.8771C30.2055 23.993 30.6704 23.8041 30.9092 23.4104C31.1417 23.0285 31.3583 22.4476 31.3577 21.6109C31.3577 18.9929 29.8451 16.0898 19.9999 16.0898C10.1547 16.0898 8.64209 18.9918 8.64209 21.6109C8.64209 22.4493 8.85988 23.0302 9.09237 23.4132C9.33166 23.8052 9.79213 23.9942 10.2362 23.8782C11.3444 23.588 13.7355 22.9629 14.8443 22.6733Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 868 B

View File

@ -0,0 +1,12 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="24" height="24" rx="12" fill="white"/>
<rect width="24" height="24" rx="12" fill="black" fill-opacity="0.5"/>
<g clip-path="url(#clip0_1478_54965)">
<path d="M4.91042 4.15625L4.15625 4.91042L19.0896 19.8438L19.8438 19.0896L15.3854 14.6313C15.6071 14.1551 15.7333 13.6261 15.7333 13.0667V10.9333C15.7333 10.6384 15.4949 10.4 15.2 10.4C14.9051 10.4 14.6667 10.6384 14.6667 10.9333V13.0667C14.6667 13.3221 14.6202 13.5643 14.551 13.7969L13.6 12.8458V6.66667C13.6 5.78293 12.8837 5.06667 12 5.06667C11.1163 5.06667 10.4 5.78293 10.4 6.66667V9.64583L4.91042 4.15625ZM8.38646 10.6104C8.31606 10.7006 8.26667 10.8096 8.26667 10.9333V13.0667C8.26667 14.9435 9.6608 16.497 11.4667 16.7573V17.8667H9.86667C9.57173 17.8667 9.33333 18.1051 9.33333 18.4C9.33333 18.6949 9.57173 18.9333 9.86667 18.9333H14.1333C14.4283 18.9333 14.6667 18.6949 14.6667 18.4C14.6667 18.1051 14.4283 17.8667 14.1333 17.8667H12.5333V16.7573C13.0635 16.681 13.5565 16.4908 13.9906 16.2156L13.2063 15.4313C12.8425 15.6185 12.4363 15.7333 12 15.7333C10.5296 15.7333 9.33333 14.5371 9.33333 13.0667V11.5583L8.38646 10.6104ZM10.4 12.625V13.0667C10.4 13.9504 11.1163 14.6667 12 14.6667C12.1349 14.6667 12.2637 14.645 12.3885 14.6135L10.4 12.625Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_1478_54965">
<rect width="16" height="16" fill="white" transform="translate(4 4)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,4 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="40" height="40" rx="20" fill="#23C343"/>
<path d="M23.78 21.911C23.4552 21.7206 23.056 21.7246 22.7328 21.9166L21.096 22.8918C20.7296 23.1102 20.272 23.0846 19.936 22.8222C19.3552 22.3686 18.42 21.6054 17.6064 20.7918C16.7928 19.9782 16.0296 19.043 15.576 18.4622C15.3136 18.1262 15.288 17.6686 15.5064 17.3022L16.4816 15.6654C16.6744 15.3422 16.676 14.9398 16.4856 14.615L14.084 10.5126C13.8512 10.1158 13.3888 9.92059 12.9416 10.0302C12.5072 10.1358 11.9432 10.3934 11.352 10.9854C9.50081 12.8366 8.51761 15.959 15.4792 22.9206C22.4408 29.8822 25.5624 28.8998 27.4144 27.0478C28.0072 26.455 28.264 25.8902 28.3704 25.455C28.4784 25.0086 28.2864 24.5494 27.8904 24.3174C26.9016 23.739 24.7688 22.4902 23.78 21.911Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 848 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,5 +1,112 @@
<template>
<div></div>
<div :class="zoomActive ? 'voiceCall-content-big' : 'voiceCall-content-small'">
<!-- -->
<div v-if="zoomActive" class="cover"></div>
<div v-if="zoomActive" class="big-layout">
<div class="big-header flex-row justify-content-end">
<div class="big-header-btn bg-color-light flex-row align-items-center border-radius-4 cursor-pointer"
@click="toggleZoom">
<span class="mr-4">{{ zoomActive ? '缩小' : '放大' }}</span>
<svg-icon
:icon-class="zoomActive ? `zoom-1` : 'zoom-2'"
className="tabs-svg" />
</div>
</div>
<div class="pb-32 big-middle">
<div class="pb-32 f24 f-weight600 text-center">{{ acceptDialog.phone }}</div>
<div class="flex-row justify-content-center">
<div class="big-middle-up mr-16 text-center cursor-pointer" v-if="!answerSts" @click="handleAccept">
<svg-icon icon-class="up-telephone" className="tabs-svg" />
<div class="f12">接听</div>
</div>
<div class="big-middle-hang ml-16 text-center cursor-pointer" @click="handleHungUp">
<svg-icon icon-class="hang-telephone" className="tabs-svg" />
<div class="f12">拒接</div>
</div>
</div>
</div>
<div class="pt-32 big-bottom">
<el-form label-position="top">
<el-row :gutter="10">
<el-col :span="7">
<el-form-item label="电话号码">
<el-input
clearable
placeholder="请输入"
v-model="queryParam.phone">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="姓名">
<el-input
clearable
placeholder="请输入"
v-model="queryParam.name">
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="身份证">
<el-input
clearable
placeholder="请输入"
v-model="queryParam.idCard">
</el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="操作">
<el-button type="primary" @click="getCaseList">查询</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div v-if="tableData.length">
<el-scrollbar style="height: 224px;">
<div class="p-8 mt-8 bottom-case-list border-radius-8" v-for="(item, index) in tableData" :key="index">
<div class="flex-row justify-content-between align-items-center bor-bottom-E5E6EB pr-16">
<div>{{item.contact}}</div>
<el-button type="text" @click="handleRelevance(item)">关联并进入案件</el-button>
</div>
<div class="flex-row p-8">
<div class="width-50 f12">
<div class="color-86909C">案件号</div>
<div>{{item.caseNo}} </div>
</div>
<div class="width-25 f12">
<div class="color-86909C">调解员</div>
<div>{{item.mediatorName}}</div>
</div>
<div class="width-25 f12">
<div class="color-86909C">逾期金额</div>
<div>{{item.moneyAmount}}</div>
</div>
</div>
</div>
</el-scrollbar>
</div>
<div v-else class="flex-row justify-content-between align-items-center p-16 big-bottom-empty">
<div class="color-FF7D00"><i class="el-icon-warning f16 color-FF7D00"></i>未找到相关案件</div>
<div class="color-4E5969 flex-row align-items-center cursor-pointer">
<svg-icon icon-class="bmld" className="tabs-svg-bmld" />
<span>标记为不明来电</span>
</div>
</div>
</div>
</div>
<!-- -->
<div v-else class="small-layout flex-row justify-content-between align-items-center pl-32 pr-32">
<div class="f24 f-weight600 mr-16">{{ acceptDialog.phone }}</div>
<div class="mr-16" v-if="!answerSts" @click="handleAccept"><svg-icon icon-class="up-telephone" className="tabs-svg-phone" /></div>
<div class="mr-16" @click="handleHungUp"><svg-icon icon-class="hang-telephone" className="tabs-svg-phone" /></div>
<div class="big-header-btn bg-color-light flex-row align-items-center border-radius-4 cursor-pointer"
@click="toggleZoom">
<span class="mr-4">{{ zoomActive ? '缩小' : '放大' }}</span>
<svg-icon :icon-class="zoomActive ? `zoom-1` : 'zoom-2'" className="tabs-svg-zoom" />
</div>
</div>
</div>
</template>
<script>
@ -16,16 +123,182 @@ export default {
},
data() {
return {
zoomActive: true,//
answerSts: false,//
queryParam: {
phone: '',
name: '',
idCard: ''
},
tableData: [],
total:0,
}
},
mounted() {
this.initLoad()
},
methods: {
initLoad() {
let phoneNumber = this.acceptDialog.phone;
phoneNumber = phoneNumber.slice(4);
this.queryParam.phone = phoneNumber;
this.getCaseList();
},
toggleZoom() {
this.zoomActive = !this.zoomActive;
},
getCaseList() {
voiceCall.caseMatchList(this.queryParam).then(res => {
if (!res.code) {
this.tableData = res;
}
})
},
//
async handleAccept() {
try {
console.log({ sessionId: this.acceptDialog.sessionId }, '---主动接听')
await window.tccc.Call.accept({ sessionId: this.acceptDialog.sessionId })
this.answerSts = true;
} catch (error) {
console.error(`呼入接听:${error.message}`)
}
},
//
async handleHungUp() {
try {
console.log({ sessionId: this.acceptDialog.sessionId }, '---主动挂断')
await window.tccc.Call.hungUp({ sessionId: this.acceptDialog.sessionId })
this.$emit('update:acceptDialog', null)
} catch (error) {
console.error(`挂断:${error.message}`)
}
},
//
async handleMarkers(item) {
try {
// voiceCall.caseMatchList(this.queryParam).then(res => {
// if (!res.code) {
// this.tableData = res;
// }
// })
} catch (error) {
console.error(`${error}`)
}
},
// -
async handleRelevance(item) {
try {
voiceCall.caseMatch({caseId: item.caseId, sessionId: this.acceptDialog.sessionId}).then(res => {
this.$router.push(`/mediation-page?sourcePage=sourcePage&caseId=${item.caseId}`);
})
} catch (error) {
console.error(`${error}`)
}
}
}
}
</script>
<style scoped lang="scss">
.bor-bottom-E5E6EB{
border-bottom: solid 1px #E5E6EB;
}
.voiceCall-content-big{
z-index: 8000;
margin: 0;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
overflow: auto;
.cover {
z-index: 8001;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.5);
}
.big-layout{
z-index: 8002;
position: relative;
width: 560px;
//height: 390px;
padding: 24px;
margin: 15vh auto 50px;
background-color: #fff;
border-radius: 16px;
.big-header{
.big-header-btn{
background-color: #e4e7ed;
padding: 6px 10px;
.tabs-svg{
width: 16px;
height: 16px;
}
}
}
.big-middle{
border-bottom: 1px solid #E5E6EB;
.tabs-svg{
width: 40px;
height: 40px;
}
}
.big-bottom{
.bottom-case-list{
background-color: #F2F3F5;
.width-50{
width: 50%;
}
.width-25{
width: 25%;
}
}
.big-bottom-empty{
background: #FFF7E8;
border: 1px solid #FF7D0080;
.tabs-svg-bmld{
width: 16px;
height: 16px;
}
}
}
}
}
.voiceCall-content-small{
position: absolute;
top: 0;
left: 50%;
height: 56px;
width: 460px;
margin-left: -230px;
.small-layout{
height: 56px;
border-radius: 16px;
background-color: #dcdfe6;
.tabs-svg-phone{
width: 40px;
height: 40px;
}
.big-header-btn{
background-color: #ffffff;
padding: 6px 10px;
.tabs-svg{
width: 16px;
height: 16px;
}
}
}
}
</style>

View File

@ -46,7 +46,10 @@ new Vue({
keyWords:null,//关键字
description:null,//描述
sitetitle:null,//标题
sitetitleinit:null//
sitetitleinit:null,//
firstlevelmenu:['/case-management','/mediation-package','/case-package','/payment-receipt','/mediation-management',
'/system-management/area-management','/system-management/role-permissions-management',
'/system-management/role-management','/system-management/user-management']
}
},
metaInfo () {
@ -60,7 +63,42 @@ new Vue({
render: h => h(App),
watch:{
'$route': function(to, from) {
console.log(to,from,'路由信息')
// console.log(to,from,'路由信息')
// 判断当前登录人是否有该地址的访问权限
if(this.firstlevelmenu.includes(to.path))
{
let interviewFlag = false
if(JSON.parse(sessionStorage.getItem('userInfo')))
{
let resources = JSON.parse(sessionStorage.getItem('userInfo')).resources
let menuTree = resources[0].children
menuTree.forEach(item =>{
if(item.url == to.path){ interviewFlag = true}
if(!interviewFlag)
{
item.children.forEach(item =>{
if(item.url == to.path){ interviewFlag = true}
})
}
})
}
if(!interviewFlag)
{
// 判断当前登录人角色,如果是普通调解员,则默认展示区域且不可选择
let identifier = this.$store.state.userinfo.roleIdentifier
if(identifier.includes('manager'))
{
router.push('/workbench')
}
else
{
router.push('/workbenchcm')
}
}
}
if(to.meta.title!=null&&to.meta.sitetitleinit!=null)
{
this.sitetitle=to.meta.title+'-'+this.sitetitleinit;

View File

@ -52,7 +52,7 @@
<el-table :data="tableData" height="330" >
<el-table-column type="index" label="序号" width="55"></el-table-column>
<!-- <el-table-column type="selection" width="55" ></el-table-column> -->
<el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column>
<!-- <el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column> -->
<el-table-column prop="queueName" label="队列名称" show-overflow-tooltip ></el-table-column>
<el-table-column prop="objectCount" label="外呼对象数" show-overflow-tooltip ></el-table-column>
<el-table-column prop="calledCount" label="已呼数" show-overflow-tooltip ></el-table-column>
@ -66,10 +66,10 @@
</template>
</el-table-column>
<el-table-column label="操作" width="190">
<el-table-column label="操作" width="160">
<template slot-scope="scope">
<div class="flex-row align-items-center">
<el-button size="mini" v-if="scope.row.notCalledCount != 0" @click="handleEnterqueue(scope)">进入外呼队列</el-button>
<el-button size="mini" v-if="scope.row.status.code == 1" @click="handleEnterqueue(scope)">进入外呼队列</el-button>
<!-- <el-button size="mini" v-if="scope.row.notCalledCount != 0" @click="handleBackCase(scope)">取消</el-button> -->
</div>
</template>

View File

@ -88,7 +88,7 @@
<template slot-scope="scope">
<div class="flex-row align-items-center">
<!-- 只有进行中 快开始的时候才能进入视频间 -->
<el-button size="mini" v-if="scope.row.status.code == 1 || scope.row.status.code == 2" @click="handleDelete(scope.row)">进入视频间</el-button>
<el-button size="mini" v-if="scope.row.status.code == 0 || scope.row.status.code == 1 " @click="handleDelete(scope.row)">进入视频间</el-button>
<el-button size="mini" v-if="scope.row.status.code == 0" @click="VideoDialog={id:scope.row.id, bookingTime:scope.row.bookingTime}">修改</el-button>
<el-button size="mini" v-if="scope.row.status.code == 0" @click="handleBackCase(scope.row)">取消</el-button>
</div>

View File

@ -252,7 +252,7 @@
if(JSON.parse(sessionStorage.getItem('userInfo'))){
this.userInfo = JSON.parse(sessionStorage.getItem('userInfo'))
}
console.log('获取当前登录人的信息',this.userInfo)
// console.log('',this.userInfo)
// console.log(this.userInfo.showName)
},
methods: {

View File

@ -47,16 +47,17 @@
if(this.menuTree.length>0)
{
//
let identifier = this.$store.state.userinfo.identifier
if(identifier=='mediator'){
//
this.menuTree.unshift({children:[],id:0,menuIcon:"menu-home",name:"调解首页",nameEn:"",pid:0,prefix:"mediate",sort:0,type:1,typeName:"",url:"/workbenchcm"})
}
else
let identifier = this.$store.state.userinfo.roleIdentifier
if(identifier.includes('manager'))
{
//
this.menuTree.unshift({children:[],id:0,menuIcon:"menu-home",name:"调解首页",nameEn:"",pid:0,prefix:"mediate",sort:0,type:1,typeName:"",url:"/workbench"})
}
else
{
//
this.menuTree.unshift({children:[],id:0,menuIcon:"menu-home",name:"调解首页",nameEn:"",pid:0,prefix:"mediate",sort:0,type:1,typeName:"",url:"/workbenchcm"})
}
}
else
{

View File

@ -176,10 +176,18 @@ export default {
sessionStorage.setItem('userInfo', JSON.stringify(res.user))
this.$store.commit('setUserInfo', res.user)
sessionStorage.setItem('brokerEndpoint', res.brokerEndpoint)
this.$store.commit('setBrokerEndpoint', res.brokerEndpoint)
let socketUrl = res.brokerEndpoint ? res.brokerEndpoint : `wss://mediate.dev.trydotec.com/mediate/ws/websocket`;
this.$stompSocket.initStomp(socketUrl,a => this.socketSucc(a), b => this.socketErr(b));
if (res.user.resources.length > 0) {
let url = "/workbench";
let url = "/workbenchcm";
let identifier = res.user.roleIdentifier
if(identifier.includes('manager'))
{
url = '/workbench'
}
// let data= res.user.resources[0].children[0]
// if(data.children.length>0){
// url = data.children[0].url
@ -297,10 +305,10 @@ export default {
},
socketSucc(frame) {
console.log(frame, '---初始化成功!!!')
console.log(frame, '---初始化成功login')
},
socketErr(frame) {
console.log(frame, '---初始化失败!!!')
console.log(frame, '---初始化失败login')
}
}
}

View File

@ -259,6 +259,7 @@
<a :class="'case-status'+ $util.getMediationTypeData(scope.row.mediateStatus).key">{{$util.getMediationTypeData(scope.row.mediateStatus).label}}</a>
<a v-if="scope.row.mediateRecordStatus != undefined && scope.row.mediateRecordStatus != null" :class="'case-status'+ $util.getMediationprogressData(scope.row.mediateRecordStatus).key">{{$util.getMediationprogressData(scope.row.mediateRecordStatus).label}}</a>
<a class="case-status0" v-if="scope.row.assistMediatorId">协办</a>
<a class="case-status0" v-if="scope.row.caseStatus == 2">办结</a>
</span>
</div>
<div class="flex-row justify-content-between table-span-one">

View File

@ -44,6 +44,10 @@
<!-- 债务信息 -->
<div v-if="leftActive == 1" class="case-debt-info">
<div class="descriptions-t">
<div class="mediate-status-log">
<img v-if="baseInfo.mediateStatus == 4" src="../../../assets/image/mediate/mediatefail.png" />
<img v-if="baseInfo.mediateStatus == 5" src="../../../assets/image/mediate/mediatesuccess.png" />
</div>
<div class="f16 f-weight600 descriptions-t-title">基本信息</div>
<div class="flex-row descriptions-t-item">
<div class="descriptions-t-item-l color-86909C">案件包名称:</div>
@ -311,6 +315,15 @@ export default {
coobligationInfo: () => import('./coobligationInfo.vue'),//
singleRemarkPopover: () => import('./singleRemarkPopover.vue'),//
},
props: {
caseId: {
type: String,
default: () => {
return ''
},
},
},
data() {
return {
singleremarkvisible:false,
@ -324,7 +337,6 @@ export default {
mediationRecord: [],//
baseInfo: {},//
obligorInfo: [],//
caseId: '',//id
communicationRecord: [],
mediaterecordpm:{
@ -347,7 +359,6 @@ export default {
},
},
async created() {
this.caseId = this.$route.query.caseId
this.mediaterecordpm.caseId = this.caseId
this.eventDialog.caseId = this.caseId
@ -550,6 +561,12 @@ export default {
.case-debt-info{
.mediate-status-log{
position: absolute;
top: 50px;
left: 270px;
img{width: 130px;}
}
.descriptions-t{
.descriptions-t-title{
//margin-bottom: 5px;

View File

@ -109,12 +109,12 @@
<div class="ml-24 mr-24 btn-group-interval"></div>
<div class="flex-row justify-content-between align-items-center btn-group-processing-event">
<div class="flex-row justify-content-between align-items-center cursor-pointer" @click="visiblePopover={caseId: caseId}">
<div class="flex-row justify-content-between align-items-center cursor-pointer bottom-case-btn" @click="visiblePopover={caseId: caseId}">
<i class="f24 el-icon-video-camera color-4E5969"></i>
<div class="pl-4 f14">预约</div>
</div>
<div class="flex-row justify-content-between align-items-center cursor-pointer">
<div class="flex-row justify-content-between align-items-center cursor-pointer bottom-case-btn">
<i class="f24 el-icon-document color-4E5969"></i>
<div class="pl-4 f14">协议</div>
</div>
@ -126,7 +126,7 @@
title="发起签字"
trigger="click">
<singleofficeWritPopover :caseId="caseId" :singleofficevisible.sync="singleofficevisible"/>
<span slot="reference" class="flex-row justify-content-between align-items-center cursor-pointer">
<span slot="reference" class="flex-row justify-content-between align-items-center cursor-pointer bottom-case-btn">
<i class="f24 el-icon-document-remove color-4E5969"></i>
<a class="pl-4 f14">签字</a>
</span>
@ -140,7 +140,7 @@
title="发起签章"
trigger="click">
<singleofficeSealPopover :caseId="caseId" :singlesealvisible.sync="singlesealvisible"/>
<span slot="reference" class="flex-row justify-content-between align-items-center cursor-pointer">
<span slot="reference" class="flex-row justify-content-between align-items-center cursor-pointer bottom-case-btn">
<i class="f24 el-icon-s-check color-4E5969"></i>
<a class="pl-4 f14">签章</a>
</span>
@ -153,26 +153,30 @@
title="发起送达"
trigger="click">
<singleofficeDeliveryPopover :caseId="caseId" :singledeliveryvisible.sync="singledeliveryvisible"/>
<span slot="reference" class="flex-row justify-content-between align-items-center cursor-pointer">
<span slot="reference" class="flex-row justify-content-between align-items-center cursor-pointer bottom-case-btn">
<i class="f24 el-icon-s-claim color-4E5969"></i>
<a class="pl-4 f14">送达</a>
</span>
</el-popover>
<div class="flex-row justify-content-between align-items-center cursor-pointer">
<div class="flex-row justify-content-between align-items-center cursor-pointer bottom-case-btn">
<i class="f24 el-icon-wallet color-4E5969"></i>
<div class="pl-4 f14">类案</div>
</div>
<div class="flex-row justify-content-between align-items-center cursor-pointer">
<div class="flex-row justify-content-between align-items-center cursor-pointer bottom-case-btn">
<i class="f24 el-icon-document-checked color-4E5969"></i>
<div class="pl-4 f14">办结</div>
</div>
<div class="flex-row justify-content-between align-items-center cursor-pointer">
<div class="flex-row justify-content-between align-items-center cursor-pointer bottom-case-btn" @click="handleChangeMediation(4)">
<i class="f24 el-icon-document-delete color-4E5969"></i>
<div class="pl-4 f14">失败</div>
</div>
<div class="flex-row justify-content-between align-items-center cursor-pointer">
<div class="flex-row justify-content-between align-items-center cursor-pointer bottom-case-btn" @click="handleChangeMediation(5)">
<i class="f24 el-icon-bangzhu color-4E5969"></i>
<div class="pl-4 f14">成功</div>
</div>
<div class="flex-row justify-content-between align-items-center cursor-pointer bottom-case-btn">
<i class="f24 el-icon-user-solid color-4E5969"></i>
<div class="pl-4 f14">帮扶</div>
</div>
@ -184,7 +188,7 @@
title="案件协办"
trigger="click">
<singleJointlyPopover :caseId="caseId" :singlejointlyvisible.sync="singlejointlyvisible" @handleSubmit="getCaseInfoById()"/>
<span slot="reference" class="flex-row justify-content-between align-items-center cursor-pointer">
<span slot="reference" class="flex-row justify-content-between align-items-center cursor-pointer bottom-case-btn">
<i class="f24 el-icon-s-management color-4E5969"></i>
<a class="pl-4 f14">协办</a>
</span>
@ -222,10 +226,9 @@ export default {
singledeliveryvisible:false,
singlesealvisible:false,
singleofficevisible:false,
eventDialog: {caseId: this.$route.query.caseId},
eventDialog: {caseId: ''},
leftActive: 1,
rightActive: 1,
fileList: [],
mediationRecord: [],//
baseInfo: {},//
obligorInfo: [],//
@ -289,7 +292,7 @@ export default {
visiblePopover: null,
VideoCallDialog: null,
mediaterecordpm:{
caseId:this.$route.query.caseId,
caseId:'',
linkedWay:''
},
materialTypeOptions: [
@ -359,10 +362,14 @@ export default {
},
},
async created() {
this.caseId = this.$route.query.caseId || null
if(this.$route.query.caseId != null && this.$route.query.caseId != undefined)
{ || null
this.queue = this.$route.query.queue || null
this.getCaseInfoById();//
this.getmediate_record()
await this.getCaseInfoById();//
}
this.callingTodayCount() //
if (this.queue) {
@ -399,19 +406,23 @@ export default {
return {cardNo: datacardno.substring(0, len), phone: dataphone.substring(0, len)};
},
//
getCaseInfoById() {
let _that = this
api.getCaseInfoById(this.caseId).then(res => {
async getCaseInfoById() {
await api.getCaseInfoById(this.$route.query.caseId).then(res => {
if (!res.code) {
this.baseInfo = res
//
// console.log('',res.caseFileEntityList)
let caseFileEntityList = []
res.caseFileEntityList.forEach((item) => {
caseFileEntityList.push({name: item.name, fileName: item.name, url: item.url})
})
_that.fileList = caseFileEntityList
if(res.jointDebt == 1){
// mainCaseId
this.caseId = res.mainCaseId.toString()
}
else
{
this.caseId = res.id.toString()
}
}
this.eventDialog.caseId = this.caseId
this.getmediate_record()
})
},
//
@ -443,12 +454,38 @@ export default {
},
//
getmediate_record() {
this.mediaterecordpm.caseId = this.caseId
api.mediate_record_list(this.mediaterecordpm).then(res => {
if (!res.code) {
this.communicationRecord = res
}
})
},
//
handleChangeMediation(resultStatus){
let data={
id:this.caseId,
resultStatus:resultStatus
}
let resultmsg = '成功'
if(resultStatus == 4){resultmsg = '失败'}
this.$confirm("请确定是否将案件标记为"+resultmsg+"?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
if(!this.$clickThrottle()) { return }//
api.updateResultStatus(data).then(res => {
this.getCaseInfoById()
this.$message({message: '案件标记成功', type: "success",customClass:'messageZindex'})
thiis.getCaseInfoById()
})
}).catch(() => {});
},
async callingInfo() {
try {
let res = await api.callingInfo({})
@ -628,6 +665,10 @@ export default {
}
.btn-group-processing-event{
width: calc(100% - 64px - 1px - 48px);
.bottom-case-btn:hover{
color: #BC6F60;
i{color: #BC6F60;}
}
}
}

View File

@ -9,7 +9,7 @@
:rules="rulesClientRule"
label-width="130px">
<el-row :gutter="56">
<el-col :span="24">
<!-- <el-col :span="24">
<el-form-item label="预约视频名称" prop="name">
<el-input
v-model="repaymentObj.name"
@ -17,8 +17,8 @@
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
</el-col> -->
<!-- <el-col :span="24">
<el-form-item label="预约视频内容" prop="content">
<el-input
v-model="repaymentObj.content"
@ -27,7 +27,7 @@
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
</el-col> -->
<el-col :span="24">
<el-form-item label="开始时间" prop="bookingTime">
<!-- format="yyyy-MM-dd HH:mm"-->
@ -127,7 +127,7 @@
]">
<el-input
v-model="item.phone"
placeholder="请输入"
placeholder="请输入" maxlength="11"
></el-input>
</el-form-item>
</el-col>
@ -211,12 +211,12 @@ export default {
caseId: '', // ID
},
rulesClientRule: {
name: [
{ required: true, message: '请输入', trigger: 'change',},
],
content: [
{ required: true, message: '请输入', trigger: 'change',},
],
// name: [
// { required: true, message: '', trigger: 'change',},
// ],
// content: [
// { required: true, message: '', trigger: 'change',},
// ],
litigants: [
{ type: 'array', required: true, message: '请选择', trigger: 'change' }
],
@ -267,6 +267,23 @@ export default {
.map(({name, phone, identity}) => ({name, phone, identity}));
this.repaymentObj.caseId = this.eventDialog.caseId;
// console.log(resultArr, '---resultArr' , this.repaymentObj)
let videotitle = ''
if(resultArr.length>0){
resultArr.forEach((item,index)=>{
if(index == 0){videotitle+=item.name}
else{videotitle+='、'+item.name}
})
}
if(this.repaymentObj.members.length>0){
this.repaymentObj.members.forEach((item,index)=>{
if(index == 0 && videotitle == ''){videotitle+=item.name}
else{videotitle+='、'+item.name}
})
}
videotitle+='的视频预约'
this.repaymentObj.name = videotitle
this.repaymentObj.content = videotitle
videoTelephone.videoTelephoneBooking({...this.repaymentObj, litigants: resultArr}).then(res => {
this.$parent.getList()
this.handleClose()

View File

@ -28,7 +28,7 @@
<svg-icon class="mb-8" icon-class="sound-off" className="tabs-svg" />
</div>
<div class="cursor-pointer" v-if="!item.microphone" @click="handleOnRemoteAudio(item.userId)">
<svg-icon class="mb-8" icon-class="sound-off" className="tabs-svg" />
<svg-icon class="mb-8" icon-class="sound-on" className="tabs-svg" />
</div>
<div class="cursor-pointer" @click="handleKickOut(item.userId)"><svg-icon icon-class="remove-room" className="tabs-svg" /></div>
</div>
@ -389,6 +389,16 @@ export default {
microphone: false
}
})
}else {
this.remoteUsersViews = this.remoteUsersViews.map(item => {
if (item.userId == userId){
item.microphone = false;
return {
...item,
microphone: false
}
}
})
}
let json = {behavior: 'offAudio', userId: userId}
let data = {
@ -426,6 +436,16 @@ export default {
microphone: true
}
})
}else {
this.remoteUsersViews = this.remoteUsersViews.map(item => {
if (item.userId == userId){
item.microphone = true;
return {
...item,
microphone: true
}
}
})
}
let json = {behavior: 'onAudio', userId: userId}

View File

@ -19,12 +19,13 @@
<div class="p-16 border-radius-8 border-solid-lighter-1">
<el-scrollbar :style="'height: 130px'">
<div class="pb-6 pt-6 bor-E5E6EB" v-for="(item, index) in videoTableData" :key="index">
<div class="flex-row align-items-center">
<div class="mr-8 color-000 f-weight600 f16">{{item.name}} {{item.bookingTime}}</div>
<el-tag size="small" :type="queryCondition.type?'success':''">{{ queryCondition.type ? '已视频' : '待视频' }}</el-tag>
</div>
<div class="flex-row justify-content-between align-items-center">
<div class="f12">{{item.content}}</div>
<div class="flex-row justify-content-between">
<div class="flex-row">
<div class="mr-8 color-000 f-weight600 f16">
{{item.bookingTime}}
</div>
<el-tag size="small" :type="queryCondition.type?'success':''">{{ queryCondition.type ? '已视频' : '待视频' }}</el-tag>
</div>
<div class="flex-row align-items-center">
<div class="f16 mr-8 cursor-pointer"
v-if="item.roomId && item.sdkAppId && item.userId && item.userSig && (item.status.code === 0 || item.status.code === 1)"
@ -43,6 +44,26 @@
</div>
</div>
</div>
<div class="flex-row justify-content-between align-items-center">
<div class="f12">{{item.content}}</div>
<!-- <div class="flex-row align-items-center">
<div class="f16 mr-8 cursor-pointer"
v-if="item.roomId && item.sdkAppId && item.userId && item.userSig && (item.status.code === 0 || item.status.code === 1)"
@click="handleVideoCall(item)">
<i class="el-icon-video-camera"></i>
</div>
<div class="f16 mr-8 cursor-pointer"
v-if="item.status.code === 0"
@click="VideoEditDialog={id:item.id, bookingTime:item.bookingTime}">
<i class="el-icon-edit-outline"></i>
</div>
<div class="f16 mr-8 cursor-pointer"
v-if="item.status.code === 0"
@click="handleBackCase(item)">
<i class="el-icon-delete"></i>
</div>
</div> -->
</div>
</div>
</el-scrollbar>
</div>

View File

@ -12,7 +12,7 @@
<div v-for="(item,index) in coobligationInfo.caseList" :key="index">
<div class="flex-row justify-content-between descriptions-t-item bgColor-F7F8FA mt-16">
<div class="descriptions-t-item-l f-weight500" style="width: 80px;"><a class="dot"></a>债务</div>
<div class="descriptions-t-item-l f-weight500" style="width: 80px;"><a class="dot"></a>债务{{ $util.changeNumToHan(index+1)}}</div>
<!-- <el-popover
placement="bottom"

View File

@ -15,7 +15,8 @@
v-for="item in operateMethodOptions"
:key="item.id"
:label="item.realName"
:value="item.id">
:value="item.id"
:disabled="userInfo.id == item.id ? true : false">
</el-option>
</el-select>
</el-form-item>
@ -42,6 +43,7 @@ import api from "@/services/caseManagement";
},
data() {
return {
userInfo:this.$store.state.userinfo,
operateMethodOptions:[],
ObjectInfo:{
assistMediatorId: '',

View File

@ -32,7 +32,7 @@
<template slot-scope="scope">
<div class="flex-row">
<div class="f14 color-1960F4 cursor-pointer mr-8" @click="handleAddForm(scope)">编辑</div>
<div class="f14 color-1960F4 cursor-pointer" @click="handleDelete(scope)">删除</div>
<div class="f14 color-1960F4 cursor-pointer" v-if="scope.row.identifier == null || scope.row.identifier == '' " @click="handleDelete(scope)">删除</div>
</div>
</template>

View File

@ -103,7 +103,7 @@
</div>
<span class="resultplan" v-if="mediation_success_rate.caseTotal > 0 ">{{ (mediation_success_rate.mediateSuccess/mediation_success_rate.caseTotal).toFixed(2) }} %</span>
<span class="resultplan">0 %</span>
<span class="resultplan" v-else>0 %</span>
</div>
<div class="flex-row justify-content-between">
<span class="flex-column align-items-center color-86909C"><a class="color-000 f16">{{mediation_success_rate.caseTotal}}</a><a>总案件数</a></span>
@ -263,10 +263,9 @@
}
this.getCaseapkList()
this.drawCharts()
this.getstatisticcases()
this.getstatistic_trace()
this.getCaseapkStatistics()
},
methods: {
jumpUrl (url) {
@ -288,7 +287,14 @@
workApi.getmy_case_pkg({size:100,current:1}).then(res => {
if (!res.code) {
this.casePkOptions = res;
if(this.casePkOptions.length > 0 )
{
this.queryParamJZ.id = this.casePkOptions[0].id
this.queryParamCGL.id = this.casePkOptions[0].id
}
}
this.getCaseapkStatistics()
this.drawCharts()
})
},
//

View File

@ -77,7 +77,7 @@
</el-select>
</span>
<span class="case-pk-btn ml-16" @click="handleImport"><i class="el-icon-upload2"></i>批量导入</span>
<span class="case-pk-btn"><i class="el-icon-plus"></i>添加案件</span>
<!-- <span class="case-pk-btn"><i class="el-icon-plus"></i>添加案件</span> -->
</div>
</div>
@ -144,7 +144,7 @@
</div>
<span class="resultplan" v-if="mediation_success_rate.caseTotal > 0 ">{{ (mediation_success_rate.mediateSuccess/mediation_success_rate.caseTotal).toFixed(2) }} %</span>
<span class="resultplan">0 %</span>
<span class="resultplan" v-else>0 %</span>
</div>
<div class="flex-row justify-content-between">
<span class="flex-column align-items-center color-86909C"><a class="color-000 f16">{{mediation_success_rate.caseTotal}}</a><a>总案件数</a></span>
@ -312,10 +312,8 @@ import { color } from "echarts";
this.getCaseapkList()
this.getCaseInfoList()
this.drawCharts()
this.getstatisticcases()
this.getstatistic_trace()
this.getCaseapkStatistics()
},
methods: {
jumpUrl (url) {
@ -341,7 +339,15 @@ import { color } from "echarts";
workApi.getmy_case_pkg({size:100,current:1}).then(res => {
if (!res.code) {
this.casePkOptions = res;
if(this.casePkOptions.length > 0 )
{
this.queryParamJZ.id = this.casePkOptions[0].id
this.queryParamCGL.id = this.casePkOptions[0].id
}
}
this.getCaseapkStatistics()
this.drawCharts()
})
},
//

View File

@ -24,6 +24,7 @@ const store = new Vuex.Store({
userinfo: {},
idFrontPath: '',
routes: [], // 从后端获取的路由菜单
brokerEndpoint: '',
},
plugins: [vuexPersisted],
// 全局同步方法, 调用方法,this.$store.commit("xxx",'赋值数据')
@ -40,6 +41,9 @@ const store = new Vuex.Store({
setUserInfo(state, data) {
state.userinfo = data;
},
setBrokerEndpoint(state, data) {
state.brokerEndpoint = data;
},
},
// 异步方法 调用方法,this.$store.dispatch("xxx")

View File

@ -33,7 +33,9 @@ const socketClass = {
// body: 'Hello world',
// headers: { priority: '9' },
// }
// console.log(data, '---发起消息111')
if (!client)return;
// console.log(data, '---发起消息222')
client.publish(data);
},
// 订阅

View File

@ -440,6 +440,37 @@ const util = {
}
},
// 阿拉伯转中文
changeNumToHan(num) {
var arr1 = new Array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
var arr2 = new Array('', '十', '百', '千', '万', '十', '百', '千', '亿', '十', '百', '千','万', '十', '百', '千','亿');//可继续追加更高位转换值
if(!num || isNaN(num)){
return "零";
}
var english = num.toString().split("")
var result = "";
for (var i = 0; i < english.length; i++) {
var des_i = english.length - 1 - i;//倒序排列设值
result = arr2[i] + result;
var arr1_index = english[des_i];
result = arr1[arr1_index] + result;
}
//将【零千、零百】换成【零】 【十零】换成【十】
result = result.replace(/零(千|百|十)/g, '零').replace(/十零/g, '十');
//合并中间多个零为一个零
result = result.replace(/零+/g, '零');
//将【零亿】换成【亿】【零万】换成【万】
result = result.replace(/零亿/g, '亿').replace(/零万/g, '万');
//将【亿万】换成【亿】
result = result.replace(/亿万/g, '亿');
//移除末尾的零
result = result.replace(/零+$/, '')
//将【零一十】换成【零十】
//result = result.replace(/零一十/g, '零十');//貌似正规读法是零一十
//将【一十】换成【十】
result = result.replace(/^一十/g, '十')
return result;
},
}
export default util;