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.
fu-hsi-web/src/views/caseDetails/index.vue

389 lines
12 KiB
Vue

11 months ago
<!--
* @description: 案件详情
* @fileName: index
* @author: 17076
* @date: 2024/6/19-下午2:54
* @version: V1.0.0
-->
<template>
<div class="details-content">
<div class="details-header">
<div v-if="expand" class="flex-row expand-info">
<div class="left-score">
<vue-chart autoresize :option="scoreOption" :style="{ width: '100%', height: '220px' }" />
<div
v-if="caseData['totalScore'] && caseData['totalScore'] > 0"
class="flex-column circle-info"
:style="circleStyle"
>
<span>综合得分</span>
<span :style="commonStyle">{{ caseData['totalScore'] }}</span>
<span :style="commonStyle">{{ caseData['identifyResultName'] }}</span>
<span>{{ `最新时间:${caseData['updateTime']}` }}</span>
</div>
<div
v-else
class="flex-column circle-info empty-score"
>
<span>待分析</span>
<span>暂无结果</span>
</div>
</div>
<div class="base-info">
<div class="flex-row" style="align-items: center; justify-content: space-between">
<h4>基本信息</h4>
<div>
<el-button type="info" plain icon="el-icon-download" @click="handleDownload"></el-button>
<el-button v-if="isEdit" type="primary" plain icon="el-icon-edit" @click="handleEdit"></el-button>
<el-button v-if="isEdit" type="primary" :icon="caseData.isAnalysing ? 'el-icon-loading' : 'el-icon-refresh'" @click="handleAnalysis"></el-button>
<el-button type="text" icon="el-icon-arrow-up" style="color: #666666" @click="expand = false">收起</el-button>
</div>
</div>
<el-descriptions :column="4">
<el-descriptions-item label="案件编号">{{ caseData['caseNo'] }}</el-descriptions-item>
<el-descriptions-item label="案件名称">{{ caseData['caseName'] }}</el-descriptions-item>
<el-descriptions-item label="案件类型" span="2">{{ caseData.caseTypeName }}</el-descriptions-item>
<el-descriptions-item label="案件状态">{{ caseData.caseStatusName }}</el-descriptions-item>
<el-descriptions-item label="作案方式">{{ caseData.crimeModeName }}</el-descriptions-item>
<el-descriptions-item label="立案时间">{{ caseData.registerTime }}</el-descriptions-item>
<el-descriptions-item label="受理时间">{{ caseData.acceptTime }}</el-descriptions-item>
<el-descriptions-item label="案件概述" span="4">
<div slot="default" class="case-summarize">
{{ caseData.caseDetail }}
</div>
</el-descriptions-item>
11 months ago
<el-descriptions-item label="行为人">{{ caseData.lawActorName }}</el-descriptions-item>
11 months ago
<el-descriptions-item label="当事人">{{ caseData.lawParty }}</el-descriptions-item>
</el-descriptions>
</div>
</div>
<div v-else class="flex-row pick-up-info">
<div class="flex-row left-title" style="align-items: center">
<span>综合得分</span>
<span :style="commonStyle">{{ caseData.score }}</span>
</div>
<div class="base-info flex-row" style="align-items: center; justify-content: space-between">
<div class="flex-row">
<span>案件编号</span>
<span>{{ caseData.caseNum }}</span>
<span style="margin-left: 30px">案件名称</span>
<span>{{ caseData.caseName }}</span>
<span style="margin-left: 30px">案件状态</span>
<span>{{ caseData.caseStatusName }}</span>
</div>
<el-button type="text" icon="el-icon-arrow-down" style="color: #666666" @click="expand = true">展开</el-button>
</div>
</div>
</div>
<div class="flex-row details-info" :style="{ height: expand ? 'calc(100% - 250px)' : 'calc(100% - 80px)' }">
<div class="info-left">
<el-tree
:data="leftTabs"
node-key="value"
highlight-current
current-node-key="1-1"
default-expand-all
@node-click="handleNodeClick"
/>
</div>
<div class="info-right">
<h4 style="margin: 0">{{ selectTitle }}</h4>
<component :is="selectCom" :is-edit="isEdit" :is-expand="expand" @reloadData="fetchData" />
</div>
</div>
<!--编辑/新增弹窗-->
<edit-case-info ref="edit" />
<!--模型分析-->
<model-analysis ref="analysis" @confirm="handleConfirmAnalysis" />
</div>
</template>
<script>
import VueChart from '@/plugins/echarts'
import scoreConfig from './js/scoreConfig'
import EditCaseInfo from '@/views/caseManagement/components/EditCaseInfo.vue'
import CaseRecord from './components/CaseRecord.vue'
import CaseEvidence from './components/CaseEvidence.vue'
import CommonIndex from './components/CommonIndex.vue'
import InnocentIndex from './components/InnocentIndex.vue'
import IncriminateIndex from './components/IncriminateIndex.vue'
import CaseAtlas from './components/CaseAtlas.vue'
import ModelAnalysis from '@/views/caseManagement/components/ModelAnalysis.vue'
import { executeModelAnalyse, queryCaseList } from '@/api/caseManagement'
export default {
name: 'Index',
components: {
ModelAnalysis,
EditCaseInfo,
VueChart,
CaseRecord,
CaseEvidence,
CommonIndex,
InnocentIndex,
IncriminateIndex,
CaseAtlas
},
data() {
return {
// 是否展开
expand: true,
caseData: {},
// 得分配置
scoreOption: scoreConfig,
// 得分/结果样式
commonStyle: {
color: '#FFBB69'
},
// 圆圈样式
circleStyle: {
alignItems: 'center',
boxShadow: '0px 1px 30px 0px rgba(255,169,66,0.2)'
},
// 左侧分类树
leftTabs: [
{ label: '案件证据', value: '1', children: [
{ label: '笔录', value: '1-1', component: 'CaseRecord' },
{ label: '证据', value: '1-2', component: 'CaseEvidence' }
] },
{ label: '指标结果', value: '2', children: [
{ label: '共性指标', value: '2-1', component: 'CommonIndex' },
{ label: '入罪指标', value: '2-2', component: 'IncriminateIndex' },
{ label: '出罪指标', value: '2-3', component: 'InnocentIndex' }
] },
{ label: '知识图谱', value: '3', children: [
{ label: '案件图谱', value: '3-1', component: 'CaseAtlas' }
] }
],
// 当前选中的标题
selectTitle: '案件证据-笔录',
// 当前选中的组件
selectCom: 'CaseRecord',
// 是否编辑
isEdit: false
}
},
mounted() {
// 是否是编辑
this.isEdit = this.$route.query.isEdit === '1'
this.fetchData()
},
methods: {
// 获取案件数据
fetchData() {
queryCaseList({ id: this.$route.params['id'] }, 1, 1).then(res => {
if (res.code === 200) {
11 months ago
this.caseData = res.data.records[0]
if (this.caseData.lawPartyList) {
const list = []
this.caseData.lawPartyList.forEach(e => {
list.push(e.name)
})
this.caseData.lawParty = list.join(',')
}
11 months ago
// 设置分数
this.scoreOption.series[0].data = [{ value: this.caseData.totalScore }]
// 判断分数设置不通颜色
if (this.caseData.totalScore >= 70) {
this.scoreOption.series[0].progress.itemStyle.color.colorStops = [{
offset: 0, color: '#00975E'
}, {
offset: 1, color: '#3EE5A6'
}]
this.scoreOption.series[0].pointer.itemStyle.color = '#3EE5A6'
this.commonStyle.color = '#00975E'
this.circleStyle.boxShadow = '0px 1px 30px 0px rgba(0,151,94,0.2)'
} else if (this.caseData.totalScore > 0 && this.caseData.totalScore < 70) {
this.scoreOption.series[0].progress.itemStyle.color.colorStops = [{
offset: 0, color: '#F68600'
}, {
offset: 1, color: '#FFA942'
}]
this.scoreOption.series[0].pointer.itemStyle.color = '#FFA942'
this.commonStyle.color = '#FFBB69'
this.circleStyle.boxShadow = '0px 1px 30px 0px rgba(255,169,66,0.2)'
}
}
})
},
// 下载
handleDownload() {
},
// 编辑
handleEdit() {
this.$refs.edit.show(this.caseData, true)
},
// 模型分析
handleAnalysis() {
this.$refs.analysis.show(this.caseData)
},
handleConfirmAnalysis(data) {
this.$set(this.caseData, 'isAnalysing', true)
const params = {
caseId: this.$route.params['id'],
11 months ago
lawActorName: this.caseData.lawActorName,
11 months ago
lawParty: this.caseData.lawParty
}
executeModelAnalyse(params).then(res => {
const { code, msg } = res
this.$set(this.caseData, 'isAnalysing', false)
code === 200 ? this.$baseMessage.success(msg || '模型分析成功!') : this.$baseMessage.error(msg || '模型分析失败!')
this.fetchData()
})
},
// 节点点击回调
handleNodeClick(node, data) {
// console.log(data, 666)
if (data.level === 1) return
this.selectTitle = `${data.parent.data['label']}-${data.data['label']}`
this.selectCom = node.component
}
}
}
</script>
<style scoped lang="scss">
.details-content {
height: 100%;
color: #333333;
box-sizing: border-box;
.details-header {
padding: 10px;
box-sizing: border-box;
border-radius: 8px;
background: #FFFFFF;
.expand-info {
height: 220px;
align-items: center;
.left-score {
position: relative;
width: 300px;
.circle-info {
position: absolute;
width: 180px;
height: 180px;
top: 30px;
left: 60px;
box-shadow: 0 1px 30px 0 rgba(255,169,66,0.2);
border-radius: 50%;
font-size: 12px;
color: #999999;
span {
margin-top: 10px;
}
span:nth-child(2) {
font-size: 35px;
font-weight: 700;
}
span:nth-child(3) {
font-size: 13px;
font-weight: bold;
}
span:nth-last-child(1) {
font-size: 12px;
}
}
.empty-score {
justify-content: center;
align-items: center;
font-weight: bold;
font-size: 16px;
span:nth-child(1) {
margin-top: 0;
}
span:nth-last-child(1) {
font-size: 17px;
}
}
}
}
.pick-up-info {
height: 50px;
color: #333333;
line-height: 50px;
.left-title {
font-weight: 500;
margin-right: 10px;
span:nth-last-child(1) {
font-weight: 700;
font-size: 20px;
color: #FF9311;
}
}
}
.base-info {
flex: 1;
background: #F5F9FF;
padding: 10px;
box-sizing: border-box;
border-radius: 8px;
}
.case-summarize {
max-height: 55px;
overflow-y: auto;
overflow-x: hidden;
text-wrap: wrap;
}
}
.details-info {
margin-top: 10px;
box-sizing: border-box;
>div {
height: 100%;
background: #FFFFFF;
padding: 20px;
box-sizing: border-box;
border-radius: 8px;
}
.info-left {
width: 10%;
overflow-y: auto;
overflow-x: hidden;
}
.info-right {
width: 90%;
margin-left: 10px;
>div {
margin-top: 10px;
height: calc(100% - 10px - 20px);
}
}
}
}
::v-deep {
.el-descriptions__body {
background: none;
}
.el-tree-node__content {
background: linear-gradient( 90deg, rgba(69, 105, 255, .1) 0%, #FFFFFF 100%);
border-radius: 5px;
height: 35px;
line-height: 35px;
margin-bottom: 10px;
.el-tree-node__expand-icon {
padding: 6px;
}
}
.el-tree-node__children{
margin-left: 10px;
border-left: 1px solid rgba(51, 51, 51, 0.20);
}
.el-tree-node__children .el-tree-node__content {
background: #FFFFFF;
padding-left: 0 !important;
margin-left: 8px;
}
.el-tree-node__children .el-tree-node__content .el-tree-node__expand-icon {
padding: 0;
}
.el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
background: #3763FF;
color: white;
}
}
</style>