fix:测试问题修改

ocr_2.0
xiangcongshuai 9 months ago
parent 68f4317284
commit bf1f806a03

@ -31,4 +31,5 @@ export default {
}
</script>
<style lang="scss">
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

@ -5,7 +5,7 @@ const network = {
// 默认的接口地址 如果是开发环境和生产环境走vab-mock-server当然你也可以选择自己配置成需要的接口地址
baseURL:
process.env.NODE_ENV === 'development'
? 'http://192.168.10.25:8097/fu-hsi-server'
? 'http://192.168.10.137:8097/fu-hsi-server'
: '/fuHsiApi',
// 配后端数据的接收方式application/json;charset=UTF-8或者application/x-www-form-urlencoded;charset=UTF-8
contentType: 'application/json;charset=UTF-8',

@ -43,7 +43,7 @@ export default {
this.handleChildren(this.item.children, this.item) &&
(!this.routeChildren.children ||
this.routeChildren.notShowChildren) &&
!this.item.alwaysShow || this.item.meta.title === '首页'
!this.item.alwaysShow || this.item.meta.title === '首页' || this.item.meta.title === '信息分析'
) {
// if (this.item.meta.title === '') return 'VabSubmenu'
return 'VabMenuItem'

@ -286,10 +286,17 @@ export default {
color: $base-color-default;
}
::v-deep {
.el-tabs__nav-prev {
left: 10px;
}
.el-tabs__nav-wrap.is-scrollable {
padding: 0 30px !important;
}
.el-tabs__nav-next,
.el-tabs__nav-prev {
height: 40px;
line-height: 40px;
font-size: 20px;
}
.el-tabs__header {
border-bottom: 0;

@ -10,10 +10,14 @@
<div v-if="!isHome" class="main-breadcrumb">
<tabs-bar />
</div>
<div v-if="isHome" class="home-top">
<span style="margin-left: 8px;">{{ time }}</span>
<i @click="reset" class="el-icon-refresh-right" />
</div>
</div>
<div class="main-container">
<app-main />
<hover-button/>
<hover-button />
</div>
</div>
<el-backtop />
@ -24,13 +28,15 @@
import { mapActions, mapGetters } from 'vuex'
import { tokenName } from '@/config'
import TopBar from '@/layouts/components/TopBar/index.vue'
import HoverButton from "@/layouts/components/HoverButton/index.vue";
import HoverButton from '@/layouts/components/HoverButton/index.vue'
import moment from 'moment'
export default {
name: 'Layout',
components: {HoverButton, TopBar },
components: { HoverButton, TopBar },
data() {
return {
// colorBgc: this.$store.baseColor
time: moment().format('YYYY-MM-DD HH:mm:ss')
}
},
computed: {
@ -78,6 +84,10 @@ export default {
handleIsMobile() {
return document.body.getBoundingClientRect().width - 1 < 992
},
reset() {
this.$store.dispatch('settings/changeRefresh', true)
this.time = moment().format('YYYY-MM-DD HH:mm:ss')
},
handleResize() {
if (!document.hidden) {
const isMobile = this.handleIsMobile()
@ -110,5 +120,21 @@ export default {
transition: margin-left 0.28s;
position: relative;
}
.home-top {
height: 53px;
background: rgba(255,255,255,0.5);
border-radius: 8px 8px 8px 8px;
// width: 100%;
padding: 0 24px;
margin: 0 2%;
margin-bottom: 16px;
display: flex;
flex-direction: row-reverse;
align-items: center;
font-weight: 400;
font-size: 16px;
color: #666666;
cursor: pointer;
}
}
</style>

@ -79,6 +79,23 @@ export const asyncRoutes = [
}
]
},
{
path: '/infoAnalysis',
name: 'InfoAnalysis',
component: Layout,
redirect: '/infoAnalysis',
meta: { title: '信息分析' },
permission: 'p_home',
children: [
{
path: '/infoAnalysis',
name: 'InfoAnalysis',
permission: 'p_home',
component: () => import('@/views/infoAnalysis/index.vue'),
meta: { title: '信息分析', affix: false }
}
]
},
{
path: '/rule',
name: 'Rule',

@ -15,6 +15,7 @@ const state = () => ({
tagsView: theme.tagsView || true,
header: theme?.header || header,
device: 'desktop',
refresh: false,
layout: theme.layout || layout,
themeBar
})
@ -25,7 +26,8 @@ const getters = {
tagsView: (state) => state.tagsView,
tabsBar: (state) => state.tabsBar,
themeBar: (state) => state.themeBar,
layout: (state) => state.layout
layout: (state) => state.layout,
refresh: (state) => state.refresh,
}
const mutations = {
changeLayout: (state, layout) => {
@ -42,6 +44,9 @@ const mutations = {
},
toggleDevice: (state, device) => {
state.device = device
},
changeRefresh: (state, refresh) => {
state.refresh = refresh
}
}
const actions = {
@ -59,6 +64,9 @@ const actions = {
},
toggleDevice({ commit }, device) {
commit('toggleDevice', device)
},
changeRefresh({ commit }, refresh) {
commit('changeRefresh', refresh)
}
}
export default { state, getters, mutations, actions }

@ -96,6 +96,7 @@ html {
font-family: "微软雅黑", Avenir, Helvetica, Arial, sans-serif;
font-size: $base-font-size-default;
color: #2c3e50;
overflow: hidden;
background: $base-body-background;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;

@ -58,8 +58,8 @@
<el-date-picker
v-model="selectInfo.property['contractSignTime']"
type="datetime"
format="yyyy-MM-dd HH:MM"
value-format="yyyy-MM-dd HH:mm"
format="yyyy-MM-dd HH:MM:ss"
value-format="yyyy-MM-dd HH:MM:ss"
placeholder="请选择合同签订时间"
style="width: 100%"
/>
@ -210,7 +210,9 @@ export default {
this.$baseMessage.error('证据名称不能为空!')
return
}
const loading = this.$baseLoading(1, '保存中...')
saveEvidence(this.dataList).then(res => {
loading.close()
if (res.code === 200) {
this.$store.dispatch(
'tabsBar/delRoute',
@ -330,7 +332,7 @@ box-shadow: none;
margin-bottom: 16px;
border-radius: 6px 6px 6px 6px;
border: 1px solid #D1D3D6;
cursor: pointer;
cursor: move;
}
}
.boder1 {

@ -1,5 +1,5 @@
<template>
<div v-loading="loading" class="AddEvidence">
<div v-loading="loading" element-loading-text="识别中..." class="AddEvidence">
<div v-if="fileList.length === 0 && status === '1'" class="no-upload-main">
<el-upload
drag
@ -298,7 +298,7 @@ export default {
border-radius: 6px 6px 6px 6px;
border: 1px solid #D1D3D6;
margin-bottom: 8px;
cursor: pointer;
cursor: move;
}
span {
font-size: 16px;

@ -67,13 +67,12 @@
</el-row>
</el-form>
<!--新增用户-->
<add-case-user ref="add" />
<add-case-user ref="add" @reloadData="getUserList" />
</div>
</template>
<script>
import AddCaseUser from '@/views/caseDetails/components/edit/AddCaseUser.vue'
import { queryUserList } from '@/api/caseDetails'
import { mapGetters } from 'vuex'
export default {
name: 'FormInfo',
components: { AddCaseUser },

@ -5,7 +5,7 @@
<div class="content">
<span class="title">笔录上传成功</span>
<!-- <span class="desc">系统正在处理笔录信息可稍后在笔录列表中提交[笔录分析]以免超载</span> -->
<span class="btn" @click="closed"></span>
<span class="btn" @click="closed"></span>
</div>
</div>

@ -11,6 +11,10 @@
<img src="@/assets/record/error.png" alt="">
<span>识别失败</span>
</div>
<div v-if="row.ocrStatus === '-1'">
<img src="@/assets/record/error.png" alt="">
<span>未识别</span>
</div>
<div v-if="row.ocrStatus === '0'">
<!-- <img src="@/assets/record/error.png" alt=""> -->
<span>正在识别</span>
@ -99,11 +103,19 @@ export default {
})
},
next() {
let flag = true
const formData = this.$refs.formInfoRef.recordForm
const fileIdList = []
this.gridOptions.data.forEach(e => {
if (e.ocrStatus !== '1') {
flag = false
}
fileIdList.push(e.fileId)
})
if (!flag) {
this.$baseMessage.error('有部分笔录未识别成功!')
return
}
const params = {
caseId: this.$route.params.id,
personId: formData.personId,

@ -176,7 +176,7 @@ export default {
margin-bottom: 16px;
border-radius: 6px 6px 6px 6px;
border: 1px solid #D1D3D6;
cursor: pointer;
cursor: move;
}
}
.boder1 {

@ -289,7 +289,7 @@ export default {
border-radius: 6px 6px 6px 6px;
border: 1px solid #D1D3D6;
margin-bottom: 8px;
cursor: pointer;
cursor: move;
}
span {
font-size: 16px;

@ -138,6 +138,11 @@ export default {
fetchData() {
queryRecordList({ name: this.searchName, caseId: this.caseId }, this.queryForm.page, this.queryForm.size).then(res => {
this.gridOptions.data = res.data.result
this.gridOptions.data.forEach(e => {
if (e.percentage == null) {
e.percentage = '未提取'
}
})
this.queryForm.total = res.data.total
})
},
@ -163,6 +168,10 @@ export default {
},
//
handleCreateAtlas(row) {
if (row.percentage === '未提取') {
this.$baseMessage.error('请先操作笔录提取')
return
}
this.$refs.triplet.show(row)
},
//
@ -182,7 +191,7 @@ export default {
})
},
handleExtract(row) {
if (row.percentage !== '100%') {
if (row.percentage !== '100%' && row.percentage !== '未提取') {
this.$baseMessage.error('笔录解析任务未完成,请等待!')
return
}
@ -192,6 +201,7 @@ export default {
})
const params = {
caseId: this.caseId,
name: row.name,
fileIdList,
id: row.id
}

@ -59,8 +59,8 @@
<el-date-picker
v-model="dataInfo.property['contractSignTime']"
type="datetime"
format="yyyy-MM-dd HH:MM"
value-format="yyyy-MM-dd HH:mm"
format="yyyy-MM-dd HH:MM:ss"
value-format="yyyy-MM-dd HH:MM:ss"
placeholder="请选择合同签订时间"
style="width: 100%"
/>
@ -177,9 +177,11 @@ export default {
this.getData()
},
submit() {
const loading = this.$baseLoading(1, '保存中...')
this.dataInfo.caseId = this.$route.params.id
this.dataInfo.fileIdList = [this.dataInfo.fileList[0].fileId]
updateEvidence(this.dataInfo).then(res => {
loading.close()
if (res.code === 200) {
this.$store.dispatch(
'tabsBar/delRoute',

@ -61,9 +61,9 @@ export default {
//
userForm: {},
userRules: {
userName: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
name: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
idCard: [{ required: true, message: '身份证号不能为空', trigger: 'blur' }, { validator: validIdCard, trigger: 'blur' }],
role: [{ required: true, message: '角色不能为空', trigger: 'blur' }]
roleCode: [{ required: true, message: '角色不能为空', trigger: 'blur' }]
},
isEdit: false,
userList: [],

@ -143,14 +143,17 @@ export default {
},
//
handleSubmit() {
const loading = this.$baseLoading(1, '保存中...')
this.$refs.form.validate(valid => {
if (valid) {
const params = {
...this.evidenceForm,
caseId: this.$route.params.id
}
if (this.isEdit) {
updateEvidence(params).then(res => {
loading.close()
if (res.code === 200) {
this.$baseMessage.success('提交成功')
this.drawerOption.show = false
@ -159,6 +162,7 @@ export default {
})
} else {
saveEvidence(params).then(res => {
loading.close()
if (res.code === 200) {
this.$baseMessage.success('提交成功')
this.drawerOption.show = false
@ -166,6 +170,8 @@ export default {
}
})
}
} else {
loading.close()
}
})
},

@ -53,7 +53,11 @@
<el-descriptions-item label="受理时间">{{ caseData.acceptTime || '暂未添加,上传笔录后自动生成' }}</el-descriptions-item> -->
<el-descriptions-item label="行为人">{{ caseData.caseActorName || '暂未添加,上传笔录后自动生成' }}</el-descriptions-item>
<el-descriptions-item label="当事人">{{ caseData.lawParty || '暂未添加,上传笔录后自动生成' }}</el-descriptions-item>
<el-descriptions-item label="当事人">
<div slot="default" :title="caseData.lawParty || '暂未添加,上传笔录后自动生成'" class="case-lawParty">
{{ caseData.lawParty || '暂未添加,上传笔录后自动生成' }}
</div>
</el-descriptions-item>
<el-descriptions-item label="案件概述" span="24">
<div slot="default" class="case-summarize">
{{ caseData.caseDetail }}
@ -234,7 +238,7 @@ export default {
clearInterval(this.timer)
this.timer = undefined
//
if (this.caseData.totalScore >= 70) {
if (this.caseData.identifyResult === '3') {
this.scoreOption.series[0].progress.itemStyle.color.colorStops = [{
offset: 0, color: '#00975E'
}, {
@ -243,7 +247,7 @@ export default {
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) {
} else if (this.caseData.identifyResult === '2') {
this.scoreOption.series[0].progress.itemStyle.color.colorStops = [{
offset: 0, color: '#F68600'
}, {
@ -252,6 +256,15 @@ export default {
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)'
} else {
this.scoreOption.series[0].progress.itemStyle.color.colorStops = [{
offset: 0, color: '#FF3429'
}, {
offset: 1, color: '#FF3429'
}]
this.scoreOption.series[0].pointer.itemStyle.color = '#FF3429'
this.commonStyle.color = '#FF3429'
this.circleStyle.boxShadow = '0px 1px 30px 0px rgba(255,169,66,0.2)'
}
}
})
@ -422,6 +435,12 @@ export default {
overflow-x: hidden;
text-wrap: wrap;
}
.case-lawParty {
width: 250px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.details-info {
margin-top: 10px;

@ -125,7 +125,9 @@ export default {
handleSubmit: debounce(function() {
this.$refs['form'].validate(async valid => {
if (valid) {
const loading = this.$baseLoading(1, '保存中...')
const { code, msg } = await addCaseInfo(this.caseForm)
loading.close()
code === 200 ? (this.isEdit ? this.$baseMessage.success(msg || '编辑成功!') : this.$baseMessage.success(msg || '新增成功!')) : (this.isEdit ? this.$baseMessage.error(msg || '编辑失败!') : this.$baseMessage.error(msg || '新增失败!'))
this.drawerOption.show = false
this.$emit('reloadData')

@ -17,8 +17,19 @@
<el-radio-button label="0">未分析</el-radio-button>
<el-radio-button label="2">已分析</el-radio-button>
</el-radio-group>
<el-button type="primary" icon="el-icon-circle-plus-outline" @click="handleAdd"></el-button>
<div class="sort">
<div class="sort-main vxe-table">
<span v-if="orderType ==='ASC'"></span>
<span v-else></span>
<span class="icon-list vxe-cell--sort">
<i :class="[orderType ==='ASC'?'sort--active':'']" class="vxe-sort--asc-btn vxe-icon-caret-up" @click="changeType('ASC')" />
<i :class="[orderType ==='DESC'?'sort--active':'']" class="vxe-sort--desc-btn vxe-icon-caret-down" @click="changeType('DESC')" />
</span>
</div>
<el-button type="primary" icon="el-icon-circle-plus-outline" @click="handleAdd"></el-button>
</div>
<!-- <div>
<el-button icon="el-icon-upload2" title="导入案件" circle @click="handleImport" />
<el-button icon="el-icon-download" title="模板下载" circle @click="handleDownload" />
@ -72,7 +83,7 @@
<span class="subtitle">{{ item.updateTime }}</span>
</div>
<div v-show="item['totalScore']" class="flex-column" style="align-items: center">
<span :class="['score', item.totalScore >= 70 ? 'success' : 'warning']">{{ item.totalScore }}</span>
<span :class="['score', item.identifyResult ==='3' ? 'success' :item.identifyResult ==='2'? 'warning':'error']">{{ item.totalScore }}</span>
<span class="subtitle">综合得分</span>
</div>
</div>
@ -131,7 +142,8 @@ export default {
],
//
caseList: [],
caseAnalysisStatus: ''
caseAnalysisStatus: '',
orderType: ''
}
},
mounted() {
@ -158,6 +170,7 @@ export default {
delete params['updateTime']
if (params.identifyResult && params.identifyResult.length === 0) delete params['identifyResult']
params.caseAnalysisStatus = this.caseAnalysisStatus
params.orderType = this.orderType
queryCaseList(params, this.queryForm.page, this.queryForm.size).then(res => {
this.caseList = res.data.records
this.caseList.forEach(e => {
@ -245,14 +258,14 @@ export default {
},
//
handleConfirmAnalysis(item) {
// this.$set(item, 'isAnalysing', true)
this.$set(item, 'isAnalysing', true)
const params = {
caseId: item.id,
lawActorName: item.lawActorName,
lawParty: item.lawParty
}
executeModelAnalyse(params).then(res => {
// this.$set(item, 'isAnalysing', false)
this.$set(item, 'isAnalysing', false)
this.fetchData()
})
},
@ -281,6 +294,11 @@ export default {
this.queryForm.page = 1
this.fetchData()
},
changeType(val) {
this.orderType = val
this.queryForm.page = 1
this.fetchData()
},
//
onSearch(data, callback) {
this.searchFormData = Object.assign({}, data)
@ -305,6 +323,20 @@ export default {
.header {
align-items: center;
justify-content: space-between;
.sort {
display: flex;
.sort-main {
margin-right: 24px;
display: flex;
align-items: center;
.icon-list {
display: flex;
flex-direction: column;
align-items: center;
margin-left: 8px;
}
}
}
}
.list-content {
margin-top: 10px;

@ -1,6 +1,103 @@
<template>
<div class="home-content">
<el-row :gutter="10">
<div v-if="!refresh" class="case-main">
<div v-if="statisticsData.homepageLlmText.length > 0" class="case-main-left">
<img src="~@/assets/home/left_main.png">
<span class="left-item left_items1">{{ statisticsData.homepageLlmText[0] }}</span>
<span class="left-item left_items2">{{ statisticsData.homepageLlmText[1] }}</span>
<span class="left-item left_items3">{{ statisticsData.homepageLlmText[2] }}</span>
<span class="left-item left_items4">{{ statisticsData.homepageLlmText[3] }}</span>
<span class="left-item left_items5">{{ statisticsData.homepageLlmText[4] }}</span>
<span class="right-item right_items1">{{ statisticsData.homepageLlmText[5] }}</span>
<span class="right-item right_items2">{{ statisticsData.homepageLlmText[6] }}</span>
<span class="right-item right_items3">{{ statisticsData.homepageLlmText[7] }}</span>
<span class="right-item right_items4">{{ statisticsData.homepageLlmText[8] }}</span>
<span class="right-item right_items5">{{ statisticsData.homepageLlmText[9] }}</span>
</div>
<div class="case-main-right">
<div class="base-card flex-column case-num">
<div class="flex-row">
<img src="~@/assets/home/anjian@2x.png">
<div class="flex-column top-right">
<span>案件数量</span>
<vue-count-up :end-val="statisticsData['caseNumber']" />
</div>
</div>
<div>
<div class="flex-row" style="justify-content: space-between;margin-bottom: 10px">
<span>取证不全面占比</span>
<span>{{ `${statisticsData['incompleteEvidenceRate']}%` }}</span>
</div>
<el-progress
:percentage="statisticsData['incompleteEvidenceRate']"
color="#FFFFFF"
:show-text="false"
:stroke-width="15"
define-back-color="none"
/>
</div>
</div>
<div class="base-card flex-column doer-num">
<div class="flex-row">
<img src="~@/assets/home/xianyiren@2x(1).png">
<div class="flex-column top-right">
<span>嫌疑人/行为人数量</span>
<vue-count-up :end-val="statisticsData['caseActorNumber']" />
</div>
</div>
<!-- <div>
<div class="flex-row" style="justify-content: space-between;margin-bottom: 10px">
<span>自动投案占比</span>
<span>{{ `${statisticsData['surrenderRate']}%` }}</span>
</div>
<el-progress
:percentage="statisticsData['surrenderRate']"
color="#FFFFFF"
:show-text="false"
:stroke-width="15"
define-back-color="none"
/>
</div> -->
</div>
</div>
</div>
<div v-if="!refresh" class="case-card-list">
<div class="flex-row card-item">
<img class="card-icon" src="~@/assets/home/xinzeng@2x.png">
<div class="flex-column right-item-info">
<span class="title">月新增案件</span>
<vue-count-up :end-val="statisticsData['monthlyNewCaseNumber']" class="num-title" />
</div>
</div>
<div class="flex-row card-item">
<img class="card-icon" src="~@/assets/home/xinzeng@2x(1).png">
<div class="flex-column right-item-info">
<span class="title">较上月新增</span>
<div class="flex-row" style="align-items: flex-end">
<vue-count-up :end-val="statisticsData['comparedToLastMonthIncreaseNumber']" class="num-title" />
<!-- <img src="~@/assets/home/shangsheng@2x(1).png" class="tag-icon"> -->
</div>
</div>
</div>
<div class="flex-row card-item">
<img class="card-icon" src="~@/assets/home/moxing@2x.png">
<div class="flex-column right-item-info">
<span class="title">模型分数<70</span>
<vue-count-up :end-val="statisticsData['modelScoreLessThan70Number']" class="num-title" />
</div>
</div>
<div class="flex-row card-item">
<img class="card-icon" src="~@/assets/home/pingjun@2x.png">
<div class="flex-column right-item-info">
<span class="title">平均案件定性周期</span>
<vue-count-up :end-val="statisticsData['caseQualificationCycleAvg']" class="num-title" />
</div>
</div>
</div>
<div class="footer"></div>
<!-- <el-row v-if="!refresh" :gutter="10">
<el-col :span="7">
<div class="base-card flex-column case-num">
<div class="flex-row">
@ -94,26 +191,8 @@
</el-row>
</div>
</el-col>
<el-col :span="24" style="margin-top: 10px">
<doer-characteristic-statistics :last-data="homeData" />
</el-col>
<el-col :span="24" style="margin-top: 10px">
<victim-characteristic-statistics :last-data="homeData" />
</el-col>
<el-col :span="24" style="margin-top: 10px">
<judicature-recognized :last-data="homeData" />
</el-col>
<el-col :span="24" style="margin-top: 10px">
<el-row :gutter="10">
<el-col :span="8">
<case-prosecution-status :last-data="homeData" />
</el-col>
<el-col :span="16">
<judicial-cases :last-data="homeData" />
</el-col>
</el-row>
</el-col>
</el-row>
</el-row> -->
</div>
</template>
@ -125,6 +204,7 @@ import JudicatureRecognized from '@/views/index/components/JudicatureRecognized.
import CaseProsecutionStatus from '@/views/index/components/CaseProsecutionStatus.vue'
import JudicialCases from '@/views/index/components/JudicialCases.vue'
import { queryStatisticsData } from '@/api/home/index'
import { mapGetters } from 'vuex'
export default {
name: 'Index',
components: {
@ -134,12 +214,13 @@ export default {
data() {
return {
statisticsData: {
caseNumber: '',
caseActorNumber: '',
monthlyNewCaseNumber: '',
comparedToLastMonthIncreaseNumber: '',
caseQualificationCycleAvg: '',
modelScoreLessThan70Number: ''
caseNumber: 0,
caseActorNumber: 0,
monthlyNewCaseNumber: 0,
comparedToLastMonthIncreaseNumber: 0,
caseQualificationCycleAvg: 0,
modelScoreLessThan70Number: 0,
homepageLlmText: []
},
homeData: {
caseNum: 1134,
@ -171,6 +252,18 @@ export default {
}
}
},
computed: {
...mapGetters({
refresh: 'settings/refresh'
})
},
watch: {
refresh(val) {
if (val === true) {
this.getStatisticsData()
}
}
},
mounted() {
this.getStatisticsData()
},
@ -179,6 +272,7 @@ export default {
queryStatisticsData().then(res => {
if (res.code === 200) {
this.statisticsData = res.data
this.$store.dispatch('settings/changeRefresh', false)
}
})
}
@ -191,17 +285,165 @@ export default {
overflow-y: auto;
height: 100%;
overflow-x: hidden;
.case-main {
display: flex;
.case-main-left {
width: 60%;
height: calc(100vh - 560px);
background-image: url(../../assets/home/main-left-bg.png);
background-size: 100% 100%;
position: relative;
align-items: center;
justify-content: center;
display: flex;
img {
width: 606px;
height: 554px;
}
.left-item {
padding: 20px 24px;
background: linear-gradient( 127deg, #DAEAFF 0%, #F5F9FF 100%);
border-radius: 12px 12px 12px 12px;
font-size: 16px;
color: #001633;
}
.right-item {
padding: 20px 24px;
background: linear-gradient( 115deg, #F7FAFF 0%, #D1E5FF 100%);
border-radius: 12px 12px 12px 12px;
font-size: 16px;
color: #001633;
}
.left_items1 {
position: absolute;
left: 22%;
top: 7%;
}
.left_items2 {
position: absolute;
left: 12%;
top: 24%
}
.left_items3 {
position: absolute;
left: 14%;
top: 43%;
}
.left_items4 {
position: absolute;
left: 13%;
top: 64%;
}
.left_items5 {
position: absolute;
left: 19%;
bottom: 9%;
}
.right_items1 {
position: absolute;
right: 22%;
top: 7%;
}
.right_items2 {
position: absolute;
right: 16%;
top: 24%
}
.right_items3 {
position: absolute;
right: 12%;
top: 43%;
}
.right_items4 {
position: absolute;
right: 10%;
top: 64%;
}
.right_items5 {
position: absolute;
right: 20%;
bottom: 9%;
}
}
.case-main-right {
flex: 1;
margin-left: 16px;
display: flex;
flex-direction: column;
}
}
.case-card-list {
background: #FFFFFF;
border-radius: 8px 8px 8px 8px;
margin-top: 16px;
display: flex;
justify-content: space-around;
padding: 40px 0 40px 40px;
.card-item {
margin-right: 40px;
width: 25%;
display: flex;
padding: 28px 0 0 42px;
.card-icon {
width: 130px;
height: 130px;
}
.right-item-info {
flex: 1;
margin-left: 42px;
display: flex;
flex-direction: column;
.title {
margin-top: 40px;
font-size: 16px;
color: rgba(0,56,81,0.7);
}
.num-title {
font-weight: bold;
font-size: 32px;
color: #003851;
margin-top: 10px;
}
}
}
}
.case-card-list {
::v-deep {
.card-item:nth-child(1){
background: url("~@/assets/home/beijing3@2x.png") center no-repeat;
background-size: 100% 100%;
}
.card-item:nth-child(2){
background: url("~@/assets/home/beijing4@2x.png") center no-repeat;
background-size: 100% 100%;
}
.card-item:nth-child(3){
background: url("~@/assets/home/beijing5@2x.png") center no-repeat;
background-size: 100% 100%;
}
.card-item:nth-child(4){
background: url("~@/assets/home/beijing6@2x.png") center no-repeat;
background-size: 100% 100%;
}
}
}
.base-card {
border-radius: 8px;
min-height: 220px;
padding: 20px;
padding: 40px;
box-sizing: border-box;
color: #FFFFFF;
background: #FFFFFF;
img {
width: 60px;
height: 60px;
width: 80px;
height: 80px;
}
font-size: 20px;
.top-right {
margin-left: 16px;
justify-content: space-between;
@ -210,88 +452,25 @@ export default {
font-size: 27px;
}
}
.top-right-content {
.top-right-item {
height: 80px;
align-items: center;
img {
width: 80px;
height: 80px;
margin-left: 20px;
}
.right-item-info {
position: relative;
span:nth-child(1) {
font-size: 12px;
}
span:nth-child(2){
font-size: 20px;
margin-top: 10px;
font-weight: 700;
}
.tag-icon {
width: 15px;
height: 8px;
margin-left: 5px;
}
}
}
::v-deep {
.el-col:nth-child(1)>.top-right-item{
background: url("~@/assets/home/beijing3@2x.png") center no-repeat;
background-size: 100% 100%;
.right-item-info>span:nth-child(1) {
color: rgba(0, 56, 81, 0.70);
}
.right-item-info>span:nth-child(2) {
color: rgba(0, 56, 81, 1);
}
}
.el-col:nth-child(2)>.top-right-item{
background: url("~@/assets/home/beijing4@2x.png") center no-repeat;
background-size: 100% 100%;
.right-item-info>span:nth-child(1) {
color: rgba(79, 40, 0, 0.70);
}
.right-item-info>div>span {
font-size: 20px;
font-weight: 700;
margin-top: 10px;
color: rgba(79, 40, 0, 1);
}
}
.el-col:nth-child(3)>.top-right-item{
background: url("~@/assets/home/beijing5@2x.png") center no-repeat;
background-size: 100% 100%;
.right-item-info>span:nth-child(1) {
color: rgba(40, 0, 81, 0.70);
}
.right-item-info>span:nth-child(2) {
color: rgba(40, 0, 81, 1);
}
}
.el-col:nth-child(4)>.top-right-item{
background: url("~@/assets/home/beijing6@2x.png") center no-repeat;
background-size: 100% 100%;
.right-item-info>span:nth-child(1) {
color: rgba(0, 64, 79, 0.70);
}
.right-item-info>span:nth-child(2) {
color: rgba(0, 64, 79, 1);
}
}
}
}
}
.case-num {
background-image: url(../../assets/home/bg1.png);
background-size: 100% 100%;
justify-content: space-between;
height: 50%;
margin-bottom: 16px;
}
.doer-num {
background-image: url(../../assets/home/bg2.png);
background-size: 100% 100%;
justify-content: space-between;
flex: 1;
}
.footer {
background-image: url(../../assets/home/footer.png);
background-size: 100% 100%;
margin-top: 16px;
height: 120px;
}
}
::v-deep {

@ -0,0 +1,209 @@
<template>
<div class="home-content">
<div class="top"></div>
<el-row :gutter="10">
<el-col :span="24" style="margin-top: 10px">
<doer-characteristic-statistics :last-data="homeData" />
</el-col>
<el-col :span="24" style="margin-top: 10px">
<victim-characteristic-statistics :last-data="homeData" />
</el-col>
<el-col :span="24" style="margin-top: 10px">
<judicature-recognized :last-data="homeData" />
</el-col>
<el-col :span="24" style="margin-top: 10px">
<el-row :gutter="10">
<el-col :span="8">
<case-prosecution-status :last-data="homeData" />
</el-col>
<el-col :span="16">
<judicial-cases :last-data="homeData" />
</el-col>
</el-row>
</el-col>
</el-row>
</div>
</template>
<script>
import VueCountUp from 'vue-countup-v2'
import DoerCharacteristicStatistics from '@/views/index/components/DoerCharacteristicStatistics.vue'
import VictimCharacteristicStatistics from '@/views/index/components/VictimCharacteristicStatistics.vue'
import JudicatureRecognized from '@/views/index/components/JudicatureRecognized.vue'
import CaseProsecutionStatus from '@/views/index/components/CaseProsecutionStatus.vue'
import JudicialCases from '@/views/index/components/JudicialCases.vue'
import { queryStatisticsData } from '@/api/home/index'
export default {
name: 'Index',
components: {
JudicialCases,
CaseProsecutionStatus,
JudicatureRecognized, VictimCharacteristicStatistics, DoerCharacteristicStatistics, VueCountUp },
data() {
return {
statisticsData: {
caseNumber: '',
caseActorNumber: '',
monthlyNewCaseNumber: '',
comparedToLastMonthIncreaseNumber: '',
caseQualificationCycleAvg: '',
modelScoreLessThan70Number: ''
},
homeData: {
caseNum: 1134,
doerNum: 1433,
evidenceProportion: 75,
doerProportion: 78,
monthAddCase: 21,
monthIncreaseCase: 2,
modelFraction: 60,
averageCaseDuration: 20,
caseMoneyNum: 1000,
victimNum: 3200,
prosecutedCaseRate: 76,
prosecutedCase: 1048,
unProsecutedCaseRate: 45,
unProsecutedCase: 948,
moneyLastMonth: 12,
victimLastMonth: 13,
caseData: [
{ id: 0, caseNum: 212, caseName: '汽车租赁诈骗案', time: '2024-02-28 10:30' },
{ id: 1, caseNum: 213, caseName: '陈明恩涉嫌合同诈骗案', time: '2024-02-28 10:30' },
{ id: 2, caseNum: 214, caseName: '社畜找工作诈骗案', time: '2024-02-28 10:30' },
{ id: 3, caseNum: 215, caseName: '案件名称5', time: '2024-02-28 10:30' },
{ id: 4, caseNum: 216, caseName: '裴金禄涉嫌合同诈骗案', time: '2024-02-28 10:30' },
{ id: 5, caseNum: 217, caseName: '汽车租赁诈骗案', time: '2024-02-28 10:30' }
],
manNum: 1212,
womanNum: 323
}
}
},
mounted() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.home-content {
font-weight: 400;
overflow-y: auto;
height: 100%;
overflow-x: hidden;
.top {
background-image: url(../../assets/home/top_bg.png);
background-size: 100% 100%;
height: 112px;
}
.base-card {
border-radius: 8px;
min-height: 220px;
padding: 20px;
box-sizing: border-box;
color: #FFFFFF;
background: #FFFFFF;
img {
width: 60px;
height: 60px;
}
.top-right {
margin-left: 16px;
justify-content: space-between;
span:nth-child(2) {
font-weight: bold;
font-size: 27px;
}
}
.top-right-content {
.top-right-item {
height: 80px;
align-items: center;
img {
width: 80px;
height: 80px;
margin-left: 20px;
}
.right-item-info {
position: relative;
span:nth-child(1) {
font-size: 12px;
}
span:nth-child(2){
font-size: 20px;
margin-top: 10px;
font-weight: 700;
}
.tag-icon {
width: 15px;
height: 8px;
margin-left: 5px;
}
}
}
::v-deep {
.el-col:nth-child(1)>.top-right-item{
background: url("~@/assets/home/beijing3@2x.png") center no-repeat;
background-size: 100% 100%;
.right-item-info>span:nth-child(1) {
color: rgba(0, 56, 81, 0.70);
}
.right-item-info>span:nth-child(2) {
color: rgba(0, 56, 81, 1);
}
}
.el-col:nth-child(2)>.top-right-item{
background: url("~@/assets/home/beijing4@2x.png") center no-repeat;
background-size: 100% 100%;
.right-item-info>span:nth-child(1) {
color: rgba(79, 40, 0, 0.70);
}
.right-item-info>div>span {
font-size: 20px;
font-weight: 700;
margin-top: 10px;
color: rgba(79, 40, 0, 1);
}
}
.el-col:nth-child(3)>.top-right-item{
background: url("~@/assets/home/beijing5@2x.png") center no-repeat;
background-size: 100% 100%;
.right-item-info>span:nth-child(1) {
color: rgba(40, 0, 81, 0.70);
}
.right-item-info>span:nth-child(2) {
color: rgba(40, 0, 81, 1);
}
}
.el-col:nth-child(4)>.top-right-item{
background: url("~@/assets/home/beijing6@2x.png") center no-repeat;
background-size: 100% 100%;
.right-item-info>span:nth-child(1) {
color: rgba(0, 64, 79, 0.70);
}
.right-item-info>span:nth-child(2) {
color: rgba(0, 64, 79, 1);
}
}
}
}
}
.case-num {
background-image: url(../../assets/home/bg1.png);
background-size: 100% 100%;
justify-content: space-between;
}
.doer-num {
background-image: url(../../assets/home/bg2.png);
background-size: 100% 100%;
justify-content: space-between;
}
}
::v-deep {
.el-progress-bar__outer {
background: rgba(255, 255, 255, .3);
}
}
</style>

@ -23,7 +23,7 @@
<el-date-picker
v-model="changeForm['createTime']"
type="datetimerange"
format="yyyy-MM-dd HH:mm"
format="yyyy-MM-dd HH:MM"
start-placeholder="开始时间"
end-placeholder="结束时间"
style="width: 100%"

@ -122,11 +122,6 @@ export default {
type: String,
required: true,
defaultValue: ''
},
isChange: {
type: Boolean,
required: true,
defaultValue: false
}
},
data() {
@ -153,24 +148,25 @@ export default {
return list
}
},
watch: {
isChange(val) {
if (val === true) {
this.logicData = [
{ groupLogic: '1', rowLogic: '1', atomicData: [{ atomicIndex: '', relationalSymbol: '' }] }
]
}
}
},
// watch: {
// isChange(val) {
// if (val === true) {
// this.logicData = [
// { groupLogic: '1', rowLogic: '1', atomicData: [{ atomicIndex: '', relationalSymbol: '' }] }
// ]
// }
// }
// },
mounted() {
if (this.isChange) {
this.logicData = [
{ groupLogic: '1', rowLogic: '1', atomicData: [{ atomicIndex: '', relationalSymbol: '' }] }
]
} else {
if (!this.judgeLogic) return
this.logicData = JSON.parse(this.judgeLogic)
}
if (!this.judgeLogic) return
this.logicData = JSON.parse(this.judgeLogic)
this.logicData.map((item) => {
item.atomicData.map((subItem) => {
if (!this.getListValueFlag(subItem.atomicIndex)) {
subItem.atomicIndex = ""
}
})
})
},
methods: {
//
@ -182,6 +178,15 @@ export default {
indexResult: ''
})
},
getListValueFlag(val) {
let flag = false
for (const item of this.atomicIndexData) {
if (item.id === val) {
flag = true
}
}
return flag
},
//
handleAddRow(val) {
val.atomicData.push({

@ -114,7 +114,7 @@
</el-form>
<div v-if="activeStep === 1">
<p>{{ `[${indexTypeName}] ${ruleForm['name']}` }}</p>
<custom-logic ref="custom" :is-change="isChange" :atomic-index-data="ruleForm['atomicIndexList']" :judge-logic="ruleForm['judgeLogic']" />
<custom-logic ref="custom" :atomic-index-data="ruleForm['atomicIndexList']" :judge-logic="ruleForm['judgeLogic']" />
</div>
<!--原子指标选择-->
<select-atomic ref="select" @submit="handleAtomicSubmit" />
@ -179,7 +179,6 @@ export default {
//
isEdit: false,
//
isChange: false
}
},
methods: {
@ -188,7 +187,6 @@ export default {
this.activeStep = 0
this.isEdit = isEdit
this.drawerOption.show = true
this.isChange = false
this.$nextTick(() => {
const _this = this
_this.ruleForm = isEdit ? JSON.parse(JSON.stringify(data)) : {}
@ -202,7 +200,6 @@ export default {
},
delItem(index) {
this.ruleForm['atomicIndexList'].splice(index, 1)
this.isChange = true
},
//
handleChange(val) {
@ -216,7 +213,6 @@ export default {
handleAtomicSubmit(data) {
this.$refs.form.clearValidate('atomicIndexList')
this.$set(this.ruleForm, 'atomicIndexList', data)
this.isChange = true
},
//
handleReset() {

Loading…
Cancel
Save