fix:ocr识别开发

dev_1.0.0
xiangcongshuai 8 months ago
parent 5f91a15868
commit a7783e1fc6

@ -168,3 +168,11 @@ export function updatePerson(data) {
data
})
}
/** 重新提取三元组 */
export function redoExtract(data) {
return request({
url: `/record/redoExtract`,
method: 'post',
data
})
}

@ -0,0 +1,91 @@
import request from '@/utils/request'
import routes from '../gateway-routes'
/** 获取笔录基本信息 */
export function getRocordInfo(data) {
return request({
url: `/ocr/record/info`,
method: 'get',
params: data
})
}
/** 保存笔录 */
export function saveRecord(data) {
return request({
url: `/ocr/record/saveRecord`,
method: 'post',
data
})
}
/** 获取笔录文件列表 */
export function queryFileList(data) {
return request({
url: `/ocr/record/queryFileList`,
method: 'get',
params: data
})
}
/** 修正图片识别文字内容 */
export function reviseOcrText(data) {
return request({
url: `/ocr/record/reviseOcrText`,
method: 'post',
data
})
}
/** 提交识别任务 */
export function submitOrcTask(data) {
return request({
url: `/ocr/evidence/submitOrcTask`,
method: 'get',
params: data
})
}
/** 提取标题 */
export function retrieveTitle(data) {
return request({
url: `/ocr/evidence/retrieveTitle`,
method: 'post',
data
})
}
/** 查询提取标题进度 */
export function retrieveTitleProcess(data) {
return request({
url: `/ocr/evidence/retrieveTitleProcess`,
method: 'post',
data
})
}
/** 查询OCR识别结果 */
export function queryEvidenceFileList(data) {
return request({
url: `/ocr/evidence/queryFileList`,
method: 'post',
data
})
}
/** 保存证据 */
export function saveEvidence(data) {
return request({
url: `/ocr/evidence/batchSaveEvidence`,
method: 'post',
data
})
}
/** 获取证据基本信息 */
export function queryEvidenceInfo(data) {
return request({
url: `/ocr/evidence/info`,
method: 'get',
params: data
})
}
/** 更新案件证据信息(复用接口) */
export function updateEvidence(data) {
return request({
url: `/caseEvidence/updateEvidence`,
method: 'post',
data
})
}

@ -89,4 +89,12 @@ export function realDeleteByIds(data) {
method: 'delete',
data
})
}
/** 获取案件得分详情 */
export function getCaseScore(data) {
return request({
url: `/model/caseScoreByCaseId`,
method: 'get',
params: data
})
}

@ -16,3 +16,11 @@ export function queryHome(data) {
params: data
})
}
/** 获取统计数据 */
export function queryStatisticsData(data) {
return request({
url: `/homepage/queryStatisticsData`,
method: 'post',
data
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

@ -8,7 +8,7 @@
@tab-remove="handleTabRemove"
>
<el-tab-pane label="首页" name="/index">
<svg-icon slot="label" icon-class="home" class="tags-home"/>
<svg-icon slot="label" icon-class="home" class="tags-home" />
</el-tab-pane>
<el-tab-pane
v-for="(item, index) in visitedRoutes"
@ -80,7 +80,7 @@ export default {
//
formatterTitle(item) {
const pathName = item.path.split('/')
if (pathName.length > 3) {
if (pathName.length > 3 && pathName[1] === 'case-details') {
return decodeURIComponent(pathName[pathName.length - 1])
} else {
return item.meta.title

@ -154,12 +154,26 @@ export const asyncRoutes = [
component: () => import('@/views/caseDetails/components/AddRecord/index.vue'),
meta: { title: '上传图像笔录', affix: true }
},
{
path: '/edit-record/:id/:recordId',
name: 'EditRecord',
permission: 'p_caseDetails',
component: () => import('@/views/caseDetails/components/AddRecord/index.vue'),
meta: { title: '编辑图像笔录', affix: true }
},
{
path: '/add-evidence/:id',
name: 'AddEvidence',
permission: 'p_caseDetails',
component: () => import('@/views/caseDetails/components/AddEvidence/index.vue'),
meta: { title: '上传图像证据', affix: true }
},
{
path: '/edit-evidence/:id',
name: 'EditEvidence',
permission: 'p_caseDetails',
component: () => import('@/views/caseDetails/components/EditEvidence/index.vue'),
meta: { title: '编辑图像证据', affix: true }
}
]
},

@ -0,0 +1,36 @@
/**
* @description 代码生成机状态管理
*/
const state = () => ({
recordInfo: {
confessionTime: [],
lawAsker: '',
confessionMaterial: '',
indexNum: undefined,
personId: ''
},
fileList: []
})
const getters = {
recordInfo: (state) => state.recordInfo,
fileList: (state) => state.fileList
}
const mutations = {
setRecordInfo(state, data) {
state.recordInfo = data
},
setFileList(state, data) {
state.fileList = data
},
}
const actions = {
setRecordInfo({ commit }, data) {
commit('setRecordInfo', data)
},
setFileList({ commit }, data) {
commit('setFileList', data)
}
}
export default { state, getters, mutations, actions }

@ -68,12 +68,14 @@ const actions = {
commit('addVisitedRoute', route)
},
async delRoute({ dispatch, state }, route) {
console.log('2222',route)
await dispatch('delVisitedRoute', route)
return {
visitedRoutes: [...state.visitedRoutes]
}
},
delVisitedRoute({ commit, state }, route) {
console.log('2222',route)
commit('delVisitedRoute', route)
return [...state.visitedRoutes]
},

@ -1,33 +1,89 @@
<template>
<div class="EvidenceProofread">
<div class="FormInfo">
<el-form ref="form" :model="dataInfo" :rules="rules" label-width="80px" style="margin-top: 10px">
<el-form ref="form" :model="dataInfo" :rules="rules" label-width="100px" style="margin-top: 10px">
<el-row :gutter="10" class="form-content">
<el-col :span="24">
<el-form-item label="案件编号">
<span>11111</span>
<span>{{ caseNo }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="案件名称">
<span>的点点滴滴</span>
<span>{{ caseName }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="证据名称" prop="questioner">
<el-input v-model="dataInfo['questioner']" placeholder="请输入证据名称" />
<el-form-item label="证据名称" prop="evidenceName">
<el-input v-model="selectInfo['evidenceName']" placeholder="请输入证据名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="证据类型" prop="questioner">
<el-input v-model="dataInfo['questioner']" placeholder="请输入证据类型" />
</el-form-item>
<el-form-item label="证据类型" prop="evidenceType">
<el-select v-model="selectInfo['evidenceType']" style="width: 100%" placeholder="请选择证据类型">
<el-option
v-for="item in evidenceTypeList"
:key="item.value"
:value="item.value"
:label="item.label"
/>
</el-select></el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="提供人" prop="questioner">
<el-input v-model="dataInfo['questioner']" placeholder="请输入提供人" />
<el-form-item label="提供人" prop="provider">
<el-input v-model="selectInfo.property['provider']" placeholder="请输入提供人" />
</el-form-item>
</el-col>
<div class="expand" @click="handleExpand">
<span>收起</span>
<span v-show="isExpand"></span>
<img :src="expandImg" alt="">
<span class="line" />
</div>
<div v-show="isExpand">
<el-col :span="24">
<el-form-item label="受害人" prop="victim">
<el-input v-model="selectInfo.property['victim']" placeholder="请输入受害人名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同标的物" prop="contractSubject">
<el-input v-model="selectInfo.property['contractSubject']" placeholder="请输入合同标的物" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同签订时间" prop="contractSignTime">
<el-date-picker
v-model="selectInfo.property['contractSignTime']"
type="datetime"
format="yyyy-MM-dd HH:MM"
value-format="yyyy-MM-dd HH:mm"
placeholder="请选择合同签订时间"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="金额" prop="amount">
<el-input v-model="selectInfo.property['amount']" type="number" placeholder="请输入金额" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="证据结果" prop="evidenceResult">
<el-input v-model="selectInfo.property['evidenceResult']" placeholder="请输入证据结果" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="其他" prop="otherDesc">
<el-input
v-model="selectInfo.property.otherDesc"
row
type="textarea"
/>
</el-form-item>
</el-col>
</div>
</el-row>
</el-form>
</div>
@ -35,7 +91,9 @@
<div class="left">
<el-scrollbar noresize class="left-scroll">
<vuedraggable v-model="dataList" animation="400" class="img_list">
<div v-for="(item,index) in dataList" :key="index" class="img_item">{{ item }}</div>
<img v-for="(item,index) in dataList" :key="index" class="img_item" :class="[item.fileId === selectInfo.fileId?'actived':'']" :src="getImgUrl(item.fileId)" @click="selectItem(item)">
</img>
</vuedraggable>
</el-scrollbar>
<div class="show-img">
@ -49,6 +107,12 @@
</div>
<div class="right">
<div class="title">识别结果</div>
<el-input
v-model="selectInfo.ocrText"
readonly
class="right-text"
type="textarea"
/>
<span class="boder1" />
<span class="boder2" />
<span class="boder3" />
@ -56,9 +120,8 @@
</div>
</div>
<div class="footer-btns">
<div class="reset_btn" @click="back"></div>
<div class="btn" @click="back"></div>
<div class="btn" @click="next"></div>
<div class="reset_btn" @click="reset"></div>
<div class="btn" @click="submit"></div>
</div>
</div>
@ -67,27 +130,94 @@
import * as vuedraggable from 'vuedraggable'
import { baseURL } from '@/config'
import { commonDownloadFile } from '@/api/config/uploadApi'
import { queryEvidenceFileList, saveEvidence } from '@/api/caseDetails/ocr'
export default {
name: 'EvidenceProofread',
components: { vuedraggable },
props: {
fileList: {
type: Array,
default: () => {
return []
}
}
},
data() {
return {
dataList: [
'1111',
'2222',
'3333',
'44444',
'1111',
'2222',
'3333',
'44444'
],
dataList: [],
isExpand: true,
rules: {
evidenceName: [{ required: true, message: '证据名称不能为空!', trigger: 'blur' }],
evidenceType: [{ required: true, message: '证据类型不能为空!', trigger: 'blur' }]
},
//
evidenceTypeList: JSON.parse(sessionStorage.getItem('evidence_type')),
expandImg: require('@/assets/record/expand.png'),
caseNo: '',
caseName: '',
dataInfo: {},
activedImg: `${baseURL}${commonDownloadFile}1829334930064207873`
selectInfo: {
fileId: '',
ocrText: '',
property: {}
},
activedImg: ''
}
},
mounted() {
this.caseNo = this.$route.query.caseNo
this.caseName = this.$route.query.caseName
this.getData()
},
methods: {
getImgUrl(id) {
return `${baseURL}${commonDownloadFile}${id}`
},
selectItem(item) {
this.selectInfo = item
this.activedImg = `${baseURL}${commonDownloadFile}${this.selectInfo.fileId}`
},
getData() {
const list = []
this.fileList.forEach(e => {
list.push(e.fileId)
})
queryEvidenceFileList(list).then(res => {
this.dataList = res.data
this.selectInfo = this.dataList[0]
this.activedImg = `${baseURL}${commonDownloadFile}${this.selectInfo.fileId}`
})
},
handleExpand() {
this.isExpand = !this.isExpand
},
reset() {
this.getData()
},
submit() {
let flag = true
this.dataList.forEach(e => {
e.caseId = this.$route.params.id
if (!e.evidenceName) {
flag = false
}
})
if (!flag) {
this.$baseMessage.error('证据名称不能为空!')
return
}
saveEvidence(this.dataList).then(res => {
if (res.code === 200) {
this.$store.dispatch(
'tabsBar/delRoute',
this.$route
)
this.$baseMessage.success('提交成功')
this.$router.push({ path: `/case-details/${this.$route.params.id}/${this.$route.query.caseName}`, query: { currentKey: '1-2',isEdit: 1 }})
}
})
}
}
}
</script>
@ -103,6 +233,25 @@ export default {
// height: calc(100vh - 350px);
padding: 0 24px;
margin-bottom: 72px;
.expand {
display: flex;
flex-direction: row-reverse;
padding: 0 24px;
align-items: center;
cursor: pointer;
margin-bottom: 16px;
img {
width: 18px;
height: 18px;
margin-right: 8px;
}
.line {
flex: 1;
height: 1px;
background: #E9E9E9;
margin-right: 8px;
}
}
}
:deep(.el-scrollbar__wrap) {
overflow-x: hidden;
@ -126,6 +275,9 @@ export default {
width: 150px;
margin-right: 14px;
}
.actived {
border: 2px solid #3763FF !important;
}
.show-img {
padding: 16px 28px;
flex: 1;
@ -143,6 +295,7 @@ export default {
border: 1px solid #DCE3EB;
display: flex;
padding: 8px;
flex-direction: column;
.title {
background: #F6F8F9;
border-bottom: 1px solid #DCE3EB;
@ -154,6 +307,11 @@ export default {
color: #333333;
width: 100%;
}
::v-deep .el-textarea__inner {
height: calc(100vh - 450px);
border: none;
box-shadow: none;
}
}
.img_list {
display: flex;
@ -244,3 +402,6 @@ export default {
}
}
</style>
<style lang="scss" scoped>
</style>

@ -1,5 +1,5 @@
<template>
<div class="AddEvidence">
<div v-loading="loading" class="AddEvidence">
<div v-if="fileList.length === 0 && status === '1'" class="no-upload-main">
<el-upload
drag
@ -58,11 +58,11 @@
<!-- <img :src="getImgUrl(item.id)" alt=""> -->
<el-image
class="img_item_url"
:src="getImgUrl(item.id)"
:src="getImgUrl(item.fileId)"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="[getImgUrl(item.id)]"
:preview-src-list="[getImgUrl(item.fileId)]"
fit="cover"
/>
<span>{{ item.name }}</span>
@ -71,9 +71,9 @@
<!-- </transition-group> -->
</vuedraggable>
</div>
<div class="submit-btn">内容核</div>
<div class="submit-btn" @click="submit"></div>
</div>
<EvidenceProofread v-if="status ==='2'" />
<EvidenceProofread v-if="status ==='2'" :file-list="fileList" />
</div>
</template>
<script>
@ -82,27 +82,84 @@ import { getAccessToken } from '@/utils/accessToken'
import { commonDownloadFile } from '@/api/config/uploadApi'
import * as vuedraggable from 'vuedraggable'
import EvidenceProofread from './EvidenceProofread.vue'
import { submitOrcTask, retrieveTitle, retrieveTitleProcess } from '@/api/caseDetails/ocr'
export default {
name: 'AddEvidence',
components: { vuedraggable, EvidenceProofread },
data() {
return {
fileList: [{}],
status: '2',
fileList: [],
status: '1',
loading: false,
//
uploadOption: {
action: `${baseURL}/minio/uploadFile`,
accept: '.bmp,.jpg,.png'
},
interval: undefined,
token: getAccessToken()
}
},
beforeDestroy() {
clearInterval(this.interval) //
},
mounted() {
},
methods: {
getImgUrl(id) {
return `${baseURL}${commonDownloadFile}${id}`
},
beforeUpload(file) {
const isLt5M = file.size / 1024 / 1024 < 5
const filename = file.name
const postfix = filename.substring(filename.lastIndexOf('.'))
if (!['.jpg', '.png'].includes(postfix)) {
this.$message.error('上传图片只能是 JPG,PNG 格式!')
return false
}
if (!isLt5M) {
this.$message.error('上传头像图片大小不能超过 5MB!')
return false
}
return true
},
handleSuccess(res, file) {
const obj = {
name: file.name,
fileId: res.data
}
this.fileList.push(obj)
this.imgOcrIdentify(res.data)
},
//
imgOcrIdentify(id) {
submitOrcTask({ fileId: id })
},
//
queryProcess() {
const list = []
this.fileList.forEach(e => {
list.push(e.fileId)
})
retrieveTitleProcess(list).then(res => {
if (res.code === 200 && res.data === true) {
this.loading = false
this.status = '2'
clearInterval(this.interval)
}
})
},
async submit() {
const list = []
this.fileList.forEach(e => {
list.push(e.fileId)
})
this.loading = true
const res = await retrieveTitle(list)
if (res.code === 200) {
this.interval = setInterval(this.queryProcess, 3000)
}
}
}
}
@ -115,9 +172,8 @@ export default {
height: 100%;
.no-upload-main {
margin-top: 16px;
height: 100%;
padding: 0 270px;
margin: auto 270px;
flex: 1;
border: 1px dashed #3763FF;
display: flex;
@ -240,6 +296,7 @@ export default {
span {
font-size: 16px;
color: #333333;
word-break: break-all;
}
.del {
position: absolute;

@ -1,43 +1,54 @@
<template>
<div class="FormInfo">
<el-form ref="form" :model="recordForm" :rules="rules" label-width="80px" style="margin-top: 10px">
<el-form :disabled="isEdit" ref="form" :model="recordForm" :rules="rules" label-width="80px" style="margin-top: 10px">
<el-row :gutter="10" class="form-content">
<el-col :span="24">
<el-form-item label="案件编号">
<span>11111</span>
<span>{{ caseNo }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="案件名称">
<span>的点点滴滴</span>
<span>{{ caseName }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="姓名" prop="userId">
<el-form-item label="姓名" prop="personId">
<div class="flex-row" style="justify-content: space-between">
<el-select v-model="recordForm.userId" placeholder="请选择姓名" style="width: 80%">
<el-select
v-model="recordForm.personId"
placeholder="请选择姓名"
style="width: 83%"
>
<el-option
v-for="item in userList"
:key="item.value"
:value="item.value"
:label:="item.name"
/>
:key="item.id"
:value="item.id"
:label="item.name"
>
<span>{{ `${item.name}-${item['roleName']}` }}</span>
</el-option>
</el-select>
<el-button type="primary" @click="handleAdd"></el-button>
<el-button v-if="!isEdit" type="primary" @click="handleAdd"></el-button>
</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="第" prop="number">
<el-form-item label="第" prop="indexNum">
<div class="flex-row">
<el-input v-model="recordForm['number']" placeholder="请输入数字" type="number" style="width: 100px" />
<el-input v-model="recordForm['indexNum']" placeholder="请输入数字" type="number" style="width: 100px" />
<span style="margin-left: 10px;color: #333333">询问笔录</span>
</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="询问人" prop="questioner">
<el-input v-model="recordForm['questioner']" placeholder="请输入询问人,多人可用英文逗号隔开" />
<el-form-item label="供述材料" prop="confessionMaterial">
<el-input v-model="recordForm['confessionMaterial']" placeholder="请输入供述材料" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="询问人" prop="lawAsker">
<el-input v-model="recordForm['lawAsker']" placeholder="请输入询问人,多人可用英文逗号隔开" />
</el-form-item>
</el-col>
<el-col :span="24">
@ -45,7 +56,8 @@
<el-date-picker
v-model="recordForm['confessionTime']"
type="datetimerange"
format="yyyy-MM-dd HH:MM"
format="yyyy-MM-dd HH:mm"
value-format="yyyy-MM-dd HH:mm"
start-placeholder="请选择开始时间"
end-placeholder="请选择结束时间"
style="width: 100%"
@ -60,21 +72,67 @@
</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 },
props: {
//
isEdit: {
type: Boolean,
default: false
}
},
data() {
return {
recordForm: {},
recordForm: {
confessionTime: [],
lawAsker: '',
confessionMaterial: '',
indexNum: undefined,
personId: ''
},
caseNo: '',
caseName: '',
rules: {
personId: [{ required: true, message: '姓名不能为空!', trigger: 'blur' }],
lawAsker: [{ required: true, message: '询问人不能为空!', trigger: 'blur' }],
confessionTime: [{ required: true, message: '供述时间不能为空!', trigger: 'blur' }]
},
//
userList: []
}
},
mounted() {
this.getUserList()
this.caseNo = this.$route.query.caseNo
this.caseName = this.$route.query.caseName
// this.openDeatil(this.recordForm)
},
methods: {
//
handleAdd() {
this.$refs.add.show()
},
//
openDeatil(item) {
this.recordForm.personId = item.casePersonId
this.recordForm.lawAsker = item.lawAsker
this.recordForm.indexNum = item.indexNum
this.recordForm.confessionMaterial = item.confessionMaterial
//
if (item['confessionStartTime'] && item['confessionEndTime']) {
this.$set(this.recordForm, 'confessionTime', [item['confessionStartTime'], item['confessionEndTime']])
}
},
//
getUserList() {
queryUserList({ caseId: this.$route.params.id }).then(res => {
this.userList = res.data
})
}
}
}
</script>
@ -82,8 +140,8 @@ export default {
.FormInfo {
width: 470px;
background: #F6F8F9;
border-radius: 8px 8px 8px 8px;
height: calc(100vh - 350px);
padding: 0 24px;
border-radius: 8px 8px 8px 8px;
height: calc(100vh - 350px);
padding: 0 24px;
}
</style>

@ -1,11 +1,11 @@
<template>
<div class="RecordAnalysis">
<FormInfo />
<FormInfo ref="formInfoRef" :is-edit="true" />
<div class="analysis-main">
<div class="content">
<span class="title">笔录上传成功</span>
<span class="desc">系统正在处理笔录信息可稍后在笔录列表中提交[笔录分析]以免超载</span>
<span class="btn">笔录分</span>
<!-- <span class="desc">系统正在处理笔录信息可稍后在笔录列表中提交[笔录分析]以免超载</span> -->
<span class="btn" @click="closed"></span>
</div>
</div>
@ -23,7 +23,13 @@ export default {
}
},
methods: {
closed() {
this.$store.dispatch(
'tabsBar/delRoute',
this.$route
)
this.$router.push({ path: `/case-details/${this.$route.params.id}/${this.$route.query.caseName}`, query: { isEdit: 1, caseNo: this.$route.query.caseNo }})
}
}
}
</script>

@ -1,18 +1,22 @@
<template>
<div class="RecordIdentify">
<FormInfo />
<FormInfo ref="formInfoRef" :is-edit="true" />
<vxe-grid v-bind="gridOptions" class="record_table">
<template #status="{row}">
<div v-if="row.status === 1" class="status">
<div v-if="row.ocrStatus === '1'" class="status">
<img src="@/assets/record/success.png" alt="">
<span>识别成功</span>
</div>
<div v-if="row.status === 2">
<div v-if="row.ocrStatus === '2'">
<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>
</div>
</template>
<template #opera="{row}">
<template #opera="{row,index}">
<div class="btn-list">
<img src="@/assets/record/reset_identify.png" alt="">
<!-- <img src="@/assets/record/view_detail.png" alt=""> -->
@ -23,7 +27,7 @@
fit="cover"
@click="openDeatils(row)"
/>
<img src="@/assets/record/del.png" alt="">
<img src="@/assets/record/del.png" alt="" @click="del(index)">
</div>
</template>
</vxe-grid>
@ -39,19 +43,26 @@ import * as vuedraggable from 'vuedraggable'
import FormInfo from './FormInfo.vue'
import { baseURL } from '@/config'
import { commonDownloadFile } from '@/api/config/uploadApi'
import { saveRecord } from '@/api/caseDetails/ocr'
export default {
name: 'RecordIdentify',
components: { vuedraggable, FormInfo },
data() {
return {
detailImg: require('@/assets/record/view_detail.png'),
props: {
recordId: {
type: String,
default: ''
}
},
gridOptions: {
columns: [
{ title: '序号', type: 'seq', width: '80px' },
{ title: '附件名称', field: 'name' },
{ title: '证据类型', field: 'type' },
{ title: '附件大小', field: 'size' },
{ title: '附件名称', field: 'fileName' },
{ title: '证据类型', field: 'evidenceTypeDesc' },
{ title: '附件大小', field: 'fileSize' },
{ title: '状态', slots: { default: 'status' }, align: 'center' },
{ title: '操作', slots: { default: 'opera' }, fixed: 'right', width: '200px' }
],
@ -66,17 +77,49 @@ export default {
},
srcList: []
}
},
mounted() {
},
methods: {
getImgUrlList(row) {
// this.srcList.push(`${baseURL}${commonDownloadFile}1829334930064207873`)
return [`${baseURL}${commonDownloadFile}1829334930064207873`]
return [`${baseURL}${commonDownloadFile}${row.fileId}`]
},
del(index) {
if (this.gridOptions.data.length === 1) {
this.$baseMessage.error('至少保留一条数据!')
return
}
this.gridOptions.data.splice(index, 1)
},
next() {
this.$emit('next',2)
const formData = this.$refs.formInfoRef.recordForm
const fileIdList = []
this.gridOptions.data.forEach(e => {
fileIdList.push(e.fileId)
})
const params = {
caseId: this.$route.params.id,
personId: formData.personId,
lawAsker: formData.lawAsker,
confessionMaterial: formData.confessionMaterial,
confessionStartTime: formData.confessionTime[0],
confessionEndTime: formData.confessionTime[1],
imgRecordStatus: '2',
indexNum: formData.indexNum,
id: this.$route.query.recordId,
fileIdList
}
saveRecord(params).then(res => {
if (res.code === 200) {
this.$baseMessage.success(res.msg || '提交成功!')
this.$emit('save', res.data)
}
})
},
back() {
this.$emit('back',0)
this.$emit('back', 0)
}
}
}

@ -1,14 +1,16 @@
<template>
<div class="RecordProofread">
<FormInfo />
<FormInfo ref="formInfoRef" :is-edit="true" />
<div class="proofread-content">
<div class="left">
<el-scrollbar class="left-scroll">
<vuedraggable v-model="dataList" animation="400" class="img_list">
<div v-for="(item,index) in dataList" :key="index" class="img_item">{{ item }}</div>
<img v-for="(item,index) in dataList" :key="index" class="img_item" :class="[item.fileId === selectInfo.fileId?'actived':'']" :src="getImgUrl(item.fileId)" @click="selectItem(item)">
</img>
</vuedraggable>
</el-scrollbar>
<img :src="activedImg" class="act_img" alt="">
<img v-if="selectInfo.fileId" :src="getImgUrl(selectInfo.fileId)" class="act_img" alt="">
<span class="boder1" />
<span class="boder2" />
<span class="boder3" />
@ -16,6 +18,11 @@
</div>
<div class="right">
<div class="title">识别结果</div>
<el-input
v-model="selectInfo.reviseText"
class="right-text"
type="textarea"
/>
<span class="boder1" />
<span class="boder2" />
<span class="boder3" />
@ -23,9 +30,9 @@
</div>
</div>
<div class="footer-btns">
<div class="reset_btn" @click="back"></div>
<div class="btn" @click="back"></div>
<div class="btn" @click="next"></div>
<div class="reset_btn" @click="reset"></div>
<div class="btn" @click="save"></div>
<div class="btn" @click="submit"></div>
</div>
</div>
@ -35,26 +42,59 @@ import * as vuedraggable from 'vuedraggable'
import FormInfo from './FormInfo.vue'
import { baseURL } from '@/config'
import { commonDownloadFile } from '@/api/config/uploadApi'
import { reviseOcrText, queryFileList } from '@/api/caseDetails/ocr'
export default {
name: 'RecordProofread',
components: { vuedraggable, FormInfo },
data() {
return {
dataList: [
'1111',
'2222',
'3333',
'44444',
'1111',
'2222',
'3333',
'44444'
],
activedImg: `${baseURL}${commonDownloadFile}1829334930064207873`
dataList: [],
activedImg: '',
selectInfo: {
fileId: '',
reviseText: ''
}
}
},
mounted() {
},
methods: {
getImgUrl(id) {
return `${baseURL}${commonDownloadFile}${id}`
},
selectItem(item) {
this.selectInfo = item
this.activedImg = `${baseURL}${commonDownloadFile}${this.selectInfo.fileId}`
},
reset() {
queryFileList({ recordId: this.$route.query.recordId }).then(res => {
if (res.code === 200) {
this.dataList = res.data
this.selectInfo = res.data[0]
// this.gridOptions.data = res.data
}
})
},
save() {
const list = []
this.dataList.forEach(e => {
list.push({
ocrId: e.ocrId,
reviseText: e.reviseText
})
})
reviseOcrText(list).then(res => {
if (res.code === 200) {
this.$baseMessage.success(res.msg || '保存成功!')
}
})
},
submit() {
this.save()
this.$emit('submit')
}
}
}
</script>
@ -88,6 +128,9 @@ export default {
height: calc(100vh - 400px);
background-size: 100% 100%;
}
.actived {
border: 2px solid #3763FF !important;
}
}
.right {
width: 45%;
@ -95,6 +138,7 @@ export default {
border: 1px solid #DCE3EB;
display: flex;
padding: 8px;
flex-direction: column;
.title {
background: #F6F8F9;
border-bottom: 1px solid #DCE3EB;
@ -104,7 +148,10 @@ export default {
font-weight: bold;
font-size: 18px;
color: #333333;
}
.right-text {
width: 100%;
height: 500px;
}
}
.img_list {
@ -196,3 +243,11 @@ export default {
}
}
</style>
<style lang="scss" scoped>
::v-deep .el-textarea__inner {
height: calc(100vh - 450px);
border: none;
box-shadow: none;
}
</style>

@ -1,6 +1,6 @@
<template>
<div class="UploadRecord">
<FormInfo />
<FormInfo ref="formInfoRef" />
<div class="main-content">
<span class="tips">文档格式笔录可直接上传若非文档格式系统将进行0CR识别内容人工核实后支持继续上传或保存结束本次笔录信息上传</span>
<div v-if="fileList.length === 0" class="main-content-upload">
@ -61,11 +61,11 @@
<!-- <img :src="getImgUrl(item.id)" alt=""> -->
<el-image
class="img_item_url"
:src="getImgUrl(item.id)"
:src="getImgUrl(item.fileId)"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="[getImgUrl(item.id)]"
:preview-src-list="[getImgUrl(item.fileId)]"
fit="cover"
/>
<span>{{ item.name }}</span>
@ -86,6 +86,7 @@ import { baseURL } from '@/config'
import { getAccessToken } from '@/utils/accessToken'
import { commonDownloadFile } from '@/api/config/uploadApi'
import * as vuedraggable from 'vuedraggable'
import { saveRecord } from '@/api/caseDetails/ocr'
export default {
name: 'UploadRecord',
components: { FormInfo, vuedraggable },
@ -118,15 +119,49 @@ export default {
handleSuccess(res, file) {
const obj = {
name: file.name,
id: res.data
fileId: res.data
}
this.fileList.push(obj)
},
getImgUrl(id) {
return `${baseURL}${commonDownloadFile}${id}`
},
save() {
this.$emit('save', 1)
async save() {
this.$refs.formInfoRef.$refs.form.validate(async valid => {
if (valid) {
if (this.fileList.length === 0) {
this.$baseMessage.error('请上传文件')
return
} else {
this.submit()
}
}
})
// this.$emit('save', 1)
},
submit() {
const formData = this.$refs.formInfoRef.recordForm
const fileIdList = []
this.fileList.forEach(e => {
fileIdList.push(e.fileId)
})
const params = {
caseId: this.$route.params.id,
personId: formData.personId,
lawAsker: formData.lawAsker,
confessionMaterial: formData.confessionMaterial,
confessionStartTime: formData.confessionTime[0],
confessionEndTime: formData.confessionTime[1],
imgRecordStatus: '1',
indexNum: formData.indexNum,
fileIdList
}
saveRecord(params).then(res => {
if (res.code === 200) {
this.$baseMessage.success(res.msg || '提交成功!')
this.$emit('save', res.data)
}
})
}
}
}
@ -249,6 +284,9 @@ export default {
span {
font-size: 16px;
color: #333333;
width: 136px;
word-break: break-all;
}
.del {
position: absolute;

@ -33,10 +33,10 @@
</div>
</div>
<!-- <p class="tips">文档格式笔录可直接上传若非文档格式系统将进行0CR识别内容人工核实后支持继续上传或保存结束本次笔录信息上传</p> -->
<upload-record v-if="activeStep === 0" @save="uploadRecord" />
<record-identify v-if="activeStep === 1" @back="activeStep = 0" @next="activeStep = 2" />
<record-proofread v-if="activeStep === 2" />
<RecordAnalysis v-if="activeStep === 3" />
<upload-record v-show="activeStep === 0" ref="UploadRecordRef" @save="saveOk" />
<record-identify v-if="activeStep === 1" ref="RecordIdentifyRef" :record-id="recordId" @back="activeStep = 0" @save="saveOk" />
<record-proofread v-if="activeStep === 2" ref="RecordProofreadRef" :record-id="recordId" @submit="submitRecord" />
<RecordAnalysis v-if="activeStep === 3" ref="RecordAnalysisRef" />
</div>
</template>
@ -46,6 +46,7 @@ import RecordIdentify from './components/RecordIdentify.vue'
import RecordProofread from './components/RecordProofread.vue'
import UploadRecord from './components/UploadRecord.vue'
import RecordAnalysis from './components/RecordAnalysis.vue'
import { getRocordInfo, queryFileList } from '@/api/caseDetails/ocr'
export default {
name: 'OcrRecord',
components: { RecordIdentify, RecordProofread, UploadRecord, RecordAnalysis },
@ -61,14 +62,9 @@ export default {
//
uploadOption: {
action: '',
accept: '.docx,.bmp,.jpg,.png'
},
rules: {
userId: [{ required: true, message: '姓名不能为空!', trigger: 'blur' }],
role: [{ required: true, message: '角色不能为空!', trigger: 'blur' }],
questioner: [{ required: true, message: '询问人不能为空!', trigger: 'blur' }],
confessionTime: [{ required: true, message: '供述时间不能为空!', trigger: 'blur' }]
accept: '.bmp,.jpg,.png'
},
recordId: '',
//
userList: [],
//
@ -77,14 +73,66 @@ export default {
fileList: []
}
},
mounted() {
this.$store.dispatch('record/setRecordInfo', {})
if (this.$route.query.imgRecordStatus === '1') {
this.activeStep = 1
} else if (this.$route.query.imgRecordStatus === '2') {
this.activeStep = 2
}
if (this.$route.query.recordId) {
this.recordId = this.$route.query.recordId
this.getDetail()
this.getFileList()
}
},
methods: {
//
handleAdd() {
this.$refs.add.show()
},
//
getDetail() {
getRocordInfo({ recordId: this.recordId }).then(res => {
if (res.code === 200) {
if (this.activeStep === 1) {
this.$refs.RecordIdentifyRef.$refs.formInfoRef.openDeatil(res.data)
} else if (this.activeStep === 2) {
this.$refs.RecordProofreadRef.$refs.formInfoRef.openDeatil(res.data)
} else if (this.activeStep === 3) {
this.$refs.RecordAnalysisRef.$refs.formInfoRef.openDeatil(res.data)
}
this.$refs.UploadRecordRef.$refs.formInfoRef.openDeatil(res.data)
}
})
},
//
getFileList() {
queryFileList({ recordId: this.recordId }).then(res => {
if (res.code === 200) {
this.$refs.UploadRecordRef.fileList = res.data
if (this.activeStep === 1) {
this.$refs.RecordIdentifyRef.gridOptions.data = res.data
} else if (this.activeStep === 2) {
this.$refs.RecordProofreadRef.dataList = res.data
this.$refs.RecordProofreadRef.selectInfo = res.data[0]
}
// this.gridOptions.data = res.data
}
})
},
//
uploadRecord(val) {
this.activeStep = val
saveOk(val) {
this.activeStep += 1
this.recordId = val
this.$route.query.recordId = val
this.getDetail()
this.getFileList()
},
submitRecord() {
this.activeStep = 3
this.getDetail()
}
}
}

@ -9,7 +9,7 @@
<div class="title">{{ caseInfo.caseName }}</div>
<div class="time">{{ caseInfo.evaluationTime }}</div>
<div class="desc">
<span>按照取证智能分析大模型指标设置及赋分规则该案共性指标<span :class="['score', caseInfo.totalScore >= 70 ? 'success' : 'warning']">{{ caseInfo.commonScore }}</span>入罪指标<span :class="['score', caseInfo.totalScore >= 70 ? 'success' : 'warning']">{{ caseInfo.specificCrimeScore }}</span>综合得分<span :class="['score', caseInfo.totalScore >= 70 ? 'success' : 'warning']">{{ caseInfo.totalScore }}</span>初步判定<span :class="['score', caseInfo.totalScore >= 70 ? 'success' : 'warning']">{{ caseInfo.scoreDesc }}</span></span>
<span>按照取证智能分析大模型指标设置及赋分规则该案共性指标<span :class="['score', caseInfo.totalScore >= 70 ? 'success' : 'warning']">{{ caseInfo.commonScore }}</span><span v-if="caseInfo.crimeOrOut === 0">入罪指标</span><span v-if="caseInfo.crimeOrOut === 1">出罪指标</span><span :class="['score', caseInfo.totalScore >= 70 ? 'success' : 'warning']">{{ caseInfo.specificCrimeScore }}</span>分,综合得分<span :class="['score', caseInfo.totalScore >= 70 ? 'success' : 'warning']">{{ caseInfo.totalScore }}</span>分,初步判定“<span :class="['score', caseInfo.totalScore >= 70 ? 'success' : 'warning']">{{ caseInfo.scoreDesc }}</span></span>
</div>
</div>
<div class="card">

@ -42,7 +42,7 @@ import { debounce } from '@/utils'
import SelectUploadType from './SelectUploadType.vue'
export default {
name: 'CaseEvidence',
components: { EditEvidence ,SelectUploadType},
components: { EditEvidence, SelectUploadType },
mixins: [mixin],
props: {
//
@ -103,8 +103,8 @@ export default {
const params = {
caseId: this.caseId,
evidenceName: this.searchName,
page: this.queryForm.page,
size: this.queryForm.size
pageNum: this.queryForm.page,
pageSize: this.queryForm.size
}
queryEvidenceList(params).then(res => {
this.gridOptions.data = res.data.records
@ -113,15 +113,19 @@ export default {
},
//
handleAdd() {
// this.$refs.edit.show()
this.$refs.SelectUploadTypeRef.show()
this.$refs.edit.show()
// this.$refs.SelectUploadTypeRef.show()
},
//
handelEdit(row) {
this.$refs.edit.show(row, true)
if (row.contentType === '2') {
this.$router.push({ path: `/edit-evidence/${this.caseId}`, query: { caseName: this.$route.params.caseName, caseNo: this.$route.query.caseNo, evidenceId: row.id }})
} else {
this.$refs.edit.show(row, true)
}
},
handleSelect(val) {
val === '1' ? this.$refs.edit.show() : this.$router.push({ path: `/add-evidence/${this.caseId}`, query: { isEdit: 0 }})
val === '1' ? this.$refs.edit.show() : this.$router.push({ path: `/add-evidence/${this.caseId}`, query: { caseName: this.$route.params.caseName, caseNo: this.$route.query.caseNo }})
},
//
handleDel(row) {

@ -13,9 +13,8 @@
<!-- <el-button type="primary" icon="el-icon-circle-plus-outline" @click="handleAdd"></el-button> -->
<el-dropdown @command="handleSelect">
<el-button type="primary" icon="el-icon-circle-plus-outline">添加笔录</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="1">文档笔录</el-dropdown-item>
<!-- <el-dropdown-item command="2">图像笔录</el-dropdown-item> -->
</el-dropdown-menu>
</el-dropdown>
<el-button type="primary" style="margin-left: 16px;" @click="addUser"></el-button>
@ -28,6 +27,16 @@
<el-button v-if="row.children.length === 0" type="text" icon="el-icon-video-play" :disabled="!isEdit" title="笔录分析" @click="handleCreateAtlas(row)" />
<el-button type="text" icon="el-icon-edit" title="编辑" :disabled="!isEdit" @click="handelEdit(row)" />
<el-button v-if="row.children.length === 0" type="text" icon="el-icon-delete" :disabled="!isEdit" style="color: red" title="删除" @click="handleDel(row)" />
<el-button v-if="row.children.length === 0" type="text" icon="el-icon-collection" :disabled="!isEdit" title="笔录提取" @click="handleExtract(row)" />
</template>
<template #percentage="{row}">
<div class="per-content">
<span>{{ row.percentage }}</span>
<el-badge v-if="row.isPromptUpdate" style="margin-left: 6px;">
<el-tag type="success">最新</el-tag>
</el-badge>
</div>
</template>
</vxe-grid>
<div style="text-align: center">
@ -43,7 +52,7 @@
<!--选择三元组信息入库-->
<triplet-info ref="triplet" />
<!--选择上传方式-->
<!-- <select-upload ref="type" @select="handleSelect" /> -->
<select-upload ref="type" @select="handleSelect" />
<!--新增/编辑笔录-->
<edit-record ref="edit" :case-id="caseId" @reloadData="refreshData" />
<!--选择上传笔录方式-->
@ -57,7 +66,7 @@ import EditRecord from './edit/EditRecord.vue'
import SelectUpload from '@/views/caseDetails/components/edit/SelectUpload.vue'
// import OcrRecord from '@/views/caseDetails/components/edit/OcrRecord.vue'
import TripletInfo from '@/views/caseDetails/components/TripletInfo.vue'
import { queryRecordList, delRecords } from '@/api/caseDetails'
import { queryRecordList, delRecords, redoExtract } from '@/api/caseDetails'
import AddCaseUser from './edit/AddCaseUser.vue'
import { debounce } from '@/utils'
import SelectUploadType from './SelectUploadType.vue'
@ -91,7 +100,7 @@ export default {
{ title: '角色', field: 'roleName' },
{ title: '供述材料', field: 'confessionMaterial' },
{ title: '询问人', field: 'lawAsker' },
{ title: '进度', field: 'percentage' },
{ title: '进度', field: 'percentage', slots: { default: 'percentage' }},
{ title: '供述开始时间', field: 'confessionStartTime' },
{ title: '供述结束时间', field: 'confessionEndTime' },
{ title: '最新时间', field: 'updateTime' },
@ -150,7 +159,7 @@ export default {
// val === '1' ? this.$refs.edit.show() : this.$router.push({ path: `/add-record/${this.caseId}`, query: { isEdit: 0 }})
},
handleSelect(val) {
val === '1' ? this.$refs.edit.show() : this.$router.push({ path: `/add-record/${this.caseId}`, query: { isEdit: 0 }})
val === '1' ? this.$refs.edit.show() : this.$router.push({ path: `/add-record/${this.caseId}`, query: { caseName: this.$route.params.caseName, caseNo: this.$route.query.caseNo }})
},
//
handleCreateAtlas(row) {
@ -158,7 +167,11 @@ export default {
},
//
handelEdit(row) {
this.$refs.edit.show(row, true)
if (row.recordType === '1') {
this.$router.push({ path: `/edit-record/${this.caseId}/${row.id}`, query: { caseName: this.$route.params.caseName, caseNo: this.$route.query.caseNo, recordId: row.id, imgRecordStatus: row.imgRecordStatus }})
} else {
this.$refs.edit.show(row, true)
}
},
//
handleDel(row) {
@ -167,6 +180,26 @@ export default {
code === 200 ? this.$baseMessage.success(msg || '删除成功!') : this.$baseMessage.error(msg || '删除成功!')
this.fetchData()
})
},
handleExtract(row) {
if (row.percentage !== '100%') {
this.$baseMessage.error('笔录解析任务未完成,请等待!')
return
}
const fileIdList = []
row.fileList.forEach(e => {
fileIdList.push(e.fileId)
})
const params = {
caseId: this.caseId,
fileIdList,
id: row.id
}
this.$baseConfirm('你确定要重新提取当前笔录信息吗笔录提取可能需要10-20分钟请重新执行【模型分析】获得最新分数。', null, async() => {
const { code, msg } = await redoExtract(params)
code === 200 ? this.$baseMessage.success(msg || '提取成功!') : this.$baseMessage.error(msg || '提取成功!')
this.fetchData()
})
}
}
}

@ -55,10 +55,10 @@ import { debounce } from '@/utils'
import RecordDetails from './RecordDetails.vue'
export default {
name: 'CommonIndex',
mixins: [mixin],
components: {
RecordDetails
},
mixins: [mixin],
props: {
//
isEdit: {
@ -88,7 +88,7 @@ export default {
treeConfig: {},
columns: [
{ title: '', width: '50px', treeNode: true },
{ title: '序号', type: 'seq', width: '50px' },
{ title: '序号', type: 'seq', width: '80px' },
{ title: '分析结果', width: '200px', field: 'indexResult', slots: { default: 'result' }},
{ title: '指标名称', field: 'indexName', align: 'left' },
@ -116,7 +116,7 @@ export default {
isExpand: {
handler: function(newVal, oldVal) {
if (newVal !== oldVal) {
this.tableHeight(this.isExpand ? 530 : 320)
this.tableHeight(this.isExpand ? 570 : 360)
}
},
immediate: true

@ -0,0 +1,366 @@
<template>
<div class="EditEvidence">
<div class="EvidenceProofread">
<div class="FormInfo">
<el-form ref="form" :model="dataInfo" :rules="rules" label-width="100px" style="margin-top: 10px">
<el-row :gutter="10" class="form-content">
<el-col :span="24">
<el-form-item label="案件编号">
<span>{{ caseNo }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="案件名称">
<span>{{ caseName }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="证据名称" prop="evidenceName">
<el-input v-model="dataInfo['evidenceName']" placeholder="请输入证据名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="证据类型" prop="evidenceType">
<el-select v-model="dataInfo['evidenceType']" style="width: 100%" placeholder="请选择证据类型">
<el-option
v-for="item in evidenceTypeList"
:key="item.value"
:value="item.value"
:label="item.label"
/>
</el-select></el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="提供人" prop="provider">
<el-input v-model="dataInfo.property['provider']" placeholder="请输入提供人" />
</el-form-item>
</el-col>
<div class="expand">
<span>收起</span>
<img :src="expandImg" alt="">
<span class="line" />
</div>
<div v-show="isExpand">
<el-col :span="24">
<el-form-item label="受害人" prop="victim">
<el-input v-model="dataInfo.property['victim']" placeholder="请输入受害人名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同标的物" prop="contractSubject">
<el-input v-model="dataInfo.property['contractSubject']" placeholder="请输入合同标的物" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同签订时间" prop="contractSignTime">
<el-date-picker
v-model="dataInfo.property['contractSignTime']"
type="datetime"
format="yyyy-MM-dd HH:MM"
value-format="yyyy-MM-dd HH:mm"
placeholder="请选择合同签订时间"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="金额" prop="amount">
<el-input v-model="dataInfo.property['amount']" type="number" placeholder="请输入金额" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="证据结果" prop="evidenceResult">
<el-input v-model="dataInfo.property['evidenceResult']" placeholder="请输入证据结果" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="其他" prop="otherDesc">
<el-input
v-model="dataInfo.property.otherDesc"
row
type="textarea"
/>
</el-form-item>
</el-col>
</div>
</el-row>
</el-form>
</div>
<div class="proofread-content">
<div class="left">
<div class="show-img">
<img :src="activedImg" alt="">
</div>
<span class="boder1" />
<span class="boder2" />
<span class="boder3" />
<span class="boder4" />
</div>
<div class="right">
<div class="title">识别结果</div>
<el-input
v-model="dataInfo.ocrText"
readonly
class="right-text"
type="textarea"
/>
<span class="boder1" />
<span class="boder2" />
<span class="boder3" />
<span class="boder4" />
</div>
</div>
<div class="footer-btns">
<div class="reset_btn" @click="reset"></div>
<div class="btn" @click="submit"></div>
</div>
</div>
</div>
</template>
<script>
import * as vuedraggable from 'vuedraggable'
import { baseURL } from '@/config'
import { commonDownloadFile } from '@/api/config/uploadApi'
import { queryEvidenceInfo, updateEvidence } from '@/api/caseDetails/ocr'
export default {
name: 'EvidenceProofread',
components: { vuedraggable },
data() {
return {
dataList: [],
isExpand: true,
rules: {
evidenceName: [{ required: true, message: '证据名称不能为空!', trigger: 'blur' }],
evidenceType: [{ required: true, message: '证据类型不能为空!', trigger: 'blur' }]
},
//
evidenceTypeList: JSON.parse(sessionStorage.getItem('evidence_type')),
expandImg: require('@/assets/record/expand.png'),
caseNo: '',
caseName: '',
dataInfo: {
fileId: '',
ocrText: '',
property: {}
},
activedImg: ''
}
},
mounted() {
this.caseNo = this.$route.query.caseNo
this.caseName = this.$route.query.caseName
this.getData()
},
methods: {
getImgUrl(id) {
return `${baseURL}${commonDownloadFile}${id}`
},
getData() {
queryEvidenceInfo({ evidenceId: this.$route.query.evidenceId }).then(res => {
this.dataInfo = res.data
this.dataInfo.fileId = res.data.fileList[0].fileId
this.dataInfo.ocrText = res.data.fileList[0].ocrText
this.activedImg = `${baseURL}${commonDownloadFile}${this.dataInfo.fileId}`
})
},
reset() {
this.getData()
},
submit() {
this.dataInfo.caseId = this.$route.params.id
this.dataInfo.fileIdList = [this.dataInfo.fileList[0].fileId]
updateEvidence(this.dataInfo).then(res => {
if (res.code === 200) {
this.$store.dispatch(
'tabsBar/delRoute',
this.$route
)
this.$router.push({ path: `/case-details/${this.$route.params.id}/${this.$route.query.caseName}`, query: { currentKey: '1-2', isEdit: 1 }})
}
})
}
}
}
</script>
<style lang="scss" scoped>
.EditEvidence {
display: flex;
background: #FFFFFF;
height: 100%;
.EvidenceProofread {
display: flex;
margin: 24px;
width: 100%;
.FormInfo {
width: 470px;
background: #F6F8F9;
border-radius: 8px 8px 8px 8px;
// height: calc(100vh - 350px);
padding: 0 24px;
margin-bottom: 72px;
.expand {
display: flex;
flex-direction: row-reverse;
padding: 0 24px;
align-items: center;
cursor: pointer;
margin-bottom: 16px;
img {
width: 18px;
height: 18px;
margin-right: 8px;
}
.line {
flex: 1;
height: 1px;
background: #E9E9E9;
margin-right: 8px;
}
}
}
:deep(.el-scrollbar__wrap) {
overflow-x: hidden;
}
.proofread-content {
flex: 1;
margin-left: 18px;
display: flex;
margin-bottom: 72px;
.left {
width: 55%;
margin-right: 24px;
position: relative;
// background: #F6F8F9;
border: 1px solid #DCE3EB;
display: flex;
padding: 8px;
.show-img {
padding: 16px 28px;
flex: 1;
background: #F6F8F9;
img {
width: 100%;
height: 100%;
background-size: 100% 100%;
}
}
}
.right {
width: 45%;
position: relative;
border: 1px solid #DCE3EB;
display: flex;
padding: 8px;
flex-direction: column;
.title {
background: #F6F8F9;
border-bottom: 1px solid #DCE3EB;
height: 70px;
padding-left: 24px;
line-height: 70px;
font-weight: bold;
font-size: 18px;
color: #333333;
width: 100%;
}
::v-deep .el-textarea__inner {
height: calc(100vh - 450px);
border: none;
box-shadow: none;
}
}
.img_list {
display: flex;
flex-direction: column;
align-items: center;
padding-top: 25px;
overflow-x: hidden;
padding: 24px;
background: #F6F8F9;
.img_item {
width: 98px;
height: 138px;
margin-bottom: 16px;
border-radius: 6px 6px 6px 6px;
border: 1px solid #D1D3D6;
cursor: pointer;
}
}
.boder1 {
position: absolute;
width: 15px;
height: 15px;
left: 0;
top: 0;
border-top: 2px solid #2073FF;
border-left: 2px solid #2073FF;
}
.boder2 {
position: absolute;
width: 15px;
height: 15px;
right: 0;
top: 0;
border-top: 2px solid #2073FF;
border-right: 2px solid #2073FF;
}
.boder3 {
position: absolute;
width: 15px;
height: 15px;
left: 0;
bottom: 0;
border-bottom: 2px solid #2073FF;
border-left: 2px solid #2073FF;
}
.boder4 {
position: absolute;
width: 15px;
height: 15px;
right: 0;
bottom: 0;
border-bottom: 2px solid #2073FF;
border-right: 2px solid #2073FF;
}
}
.footer-btns {
position: absolute;
right: 24px;
bottom: 24px;
display: flex;
.btn {
width: 188px;
height: 48px;
background: #3763FF;
box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04);
border-radius: 6px 6px 6px 6px;
text-align: center;
line-height: 48px;
font-size: 16px;
color: #FFFFFF;
cursor: pointer;
margin-left: 24px;
}
.reset_btn {
width: 188px;
height: 48px;
background: #FFFFFF;
box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04);
border-radius: 6px 6px 6px 6px;
border: 1px solid #3763FF;
text-align: center;
line-height: 48px;
font-size: 16px;
color: #3763FF;
cursor: pointer;
margin-left: 24px;
}
}
}
}
</style>

@ -92,7 +92,7 @@ export default {
},
columns: [
{ title: '', width: '50px', treeNode: true },
{ title: '序号', type: 'seq', width: '50px' },
{ title: '序号', type: 'seq', width: '80px' },
{ title: '分析结果', width: '200px', field: 'indexResult', slots: { default: 'result' }},
{ title: '指标名称', field: 'indexName', align: 'left' },
{ title: '分值', width: '200px', field: 'score' },
@ -119,7 +119,7 @@ export default {
isExpand: {
handler: function(newVal, oldVal) {
if (newVal !== oldVal) {
this.tableHeight(this.isExpand ? 530 : 320)
this.tableHeight(this.isExpand ? 570 : 360)
}
},
immediate: true

@ -88,7 +88,7 @@ export default {
treeConfig: {},
columns: [
{ title: '', width: '50px', treeNode: true },
{ title: '序号', type: 'seq', width: '50px' },
{ title: '序号', type: 'seq', width: '80px' },
{ title: '分析结果', width: '200px', field: 'indexResult', slots: { default: 'result' }},
{ title: '指标名称', field: 'indexName', align: 'left' },
{ title: '分值', width: '200px', field: 'score' },
@ -116,7 +116,7 @@ export default {
isExpand: {
handler: function(newVal, oldVal) {
if (newVal !== oldVal) {
this.tableHeight(this.isExpand ? 530 : 320)
this.tableHeight(this.isExpand ? 570 : 360)
}
},
immediate: true

@ -83,16 +83,20 @@
<div class="flex-row details-info" :style="{ height: expand ? 'calc(100% - 270px)' : 'calc(100% - 80px)' }">
<div class="info-left">
<el-tree
v-if="currentKey"
:data="leftTabs"
node-key="value"
highlight-current
current-node-key="1-1"
:current-node-key="currentKey"
default-expand-all
@node-click="handleNodeClick"
/>
</div>
<div class="info-right">
<h4 style="margin: 0">{{ selectTitle }}</h4>
<h4 style="margin: 0">
<span>{{ selectTitle }}</span>
<span v-if="score!==''">{{ ` ${score}` }}</span>
</h4>
<component :is="selectCom" :is-edit="isEdit" :is-expand="expand" @reloadData="fetchData" />
</div>
</div>
@ -118,7 +122,7 @@ import CaseAtlas from './components/CaseAtlas.vue'
import ModelAnalysis from '@/views/caseManagement/components/ModelAnalysis.vue'
import CaseAnalysis from './components/CaseAnalysis.vue'
import ManuallyDefined from './components/ManuallyDefined.vue'
import { executeModelAnalyse, queryCaseList } from '@/api/caseManagement'
import { executeModelAnalyse, queryCaseList, getCaseScore } from '@/api/caseManagement'
export default {
name: 'Index',
components: {
@ -150,6 +154,7 @@ export default {
alignItems: 'center',
boxShadow: '0px 1px 30px 0px rgba(255,169,66,0.2)'
},
score: '',
//
leftTabs: [
{ label: '案件证据', value: '1', children: [
@ -169,10 +174,13 @@ export default {
{ label: '案件图谱', value: '3-1', component: 'CaseAtlas' }
] }
],
currentKey: '',
//
selectTitle: '案件证据-笔录',
//
selectCom: 'CaseRecord',
//
scoreInfo: {},
//
isEdit: false,
timer: undefined
@ -182,9 +190,24 @@ export default {
//
this.isEdit = this.$route.query.isEdit === '1'
this.fetchData()
this.queryCaseScore()
if (this.$route.query.currentKey) {
this.currentKey = '1-2'
this.selectTitle = '案件证据-证据'
this.selectCom = 'CaseEvidence'
} else {
this.currentKey = '1-1'
}
},
methods: {
//
queryCaseScore() {
getCaseScore({ caseId: this.$route.params['id'] }).then(res => {
if (res.code === 200) {
this.scoreInfo = res.data
}
})
},
//
updateGauge(value) {
this.scoreOption.series[0].data = [{ value }]
@ -278,6 +301,15 @@ export default {
// console.log(data, 666)
if (data.level === 1) return
this.selectTitle = `${data.parent.data['label']}-${data.data['label']}`
if (data.data['label'] === '共性指标') {
this.score = this.scoreInfo.commonScore
} else if (data.data['label'] === '入罪指标') {
this.score = this.scoreInfo.crimeScore
} else if (data.data['label'] === '出罪指标') {
this.score = this.scoreInfo.crimeOutScore
} else {
this.score = ''
}
this.selectCom = node.component
}
}

@ -11,12 +11,18 @@
<cs-search title="案件检索" :data="searchData" :span="4" direction="row" @onSearch="onSearch" @getData="onSearch" />
<div class="case-content">
<div class="flex-row header">
<el-radio-group v-model="caseDataStatus" size="large" @change="handleChange">
<el-radio-button label="">全部</el-radio-button>
<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>
<el-button icon="el-icon-upload2" title="导入案件" circle @click="handleImport" />
<el-button icon="el-icon-download" title="模板下载" circle @click="handleDownload" />
</div> -->
<input ref="file" type="file" style="display: none" @change="uploadFile">
<!-- <input ref="file" type="file" style="display: none" @change="uploadFile"> -->
</div>
<el-row :gutter="24" type="flex" class="list-content">
@ -123,7 +129,8 @@ export default {
{ label: '最新时间', model: 'updateTime', type: 'datetimerange' }
],
//
caseList: []
caseList: [],
caseDataStatus: ''
}
},
mounted() {
@ -149,6 +156,7 @@ export default {
}
delete params['updateTime']
if (params.identifyResult && params.identifyResult.length === 0) delete params['identifyResult']
params.caseDataStatus = this.caseDataStatus
queryCaseList(params, this.queryForm.page, this.queryForm.size).then(res => {
this.caseList = res.data.records
this.caseList.forEach(e => {
@ -227,7 +235,7 @@ export default {
},
//
handleEdit(item) {
this.$router.push({ path: `/case-details/${item.id}/${item.caseName}`, query: { isEdit: 1 }})
this.$router.push({ path: `/case-details/${item.id}/${item.caseName}`, query: { isEdit: 1, caseNo: item.caseNo }})
},
//
handleAnalysis(item) {
@ -266,6 +274,12 @@ export default {
}
return statusName
},
// tab
handleChange(val) {
this.caseDataStatus = val
this.queryForm.page = 1
this.fetchData()
},
//
onSearch(data, callback) {
this.searchFormData = Object.assign({}, data)

@ -7,7 +7,7 @@
<img src="~@/assets/home/anjian@2x.png">
<div class="flex-column top-right">
<span>案件数量</span>
<vue-count-up :end-val="homeData['caseNum']" />
<vue-count-up :end-val="statisticsData['caseNumber']" />
</div>
</div>
<div>
@ -31,7 +31,7 @@
<img src="~@/assets/home/xianyiren@2x(1).png">
<div class="flex-column top-right">
<span>嫌疑人/行为人数量</span>
<vue-count-up :end-val="homeData['doerNum']" />
<vue-count-up :end-val="statisticsData['caseActorNumber']" />
</div>
</div>
<div>
@ -57,7 +57,7 @@
<img src="~@/assets/home/xinzeng@2x.png">
<div class="flex-column right-item-info">
<span>月新增案件</span>
<vue-count-up :end-val="homeData['monthAddCase']" />
<vue-count-up :end-val="statisticsData['monthlyNewCaseNumber']" />
</div>
</div>
</el-col>
@ -67,8 +67,8 @@
<div class="flex-column right-item-info">
<span>较上月新增</span>
<div class="flex-row" style="align-items: flex-end">
<vue-count-up :end-val="homeData['monthIncreaseCase']" class="num-title" />
<img src="~@/assets/home/shangsheng@2x(1).png" class="tag-icon"/>
<vue-count-up :end-val="statisticsData['comparedToLastMonthIncreaseNumber']" class="num-title" />
<img src="~@/assets/home/shangsheng@2x(1).png" class="tag-icon">
</div>
</div>
</div>
@ -78,7 +78,7 @@
<img src="~@/assets/home/moxing@2x.png">
<div class="flex-column right-item-info">
<span>模型分数<70</span>
<vue-count-up :end-val="homeData['modelFraction']" />
<vue-count-up :end-val="statisticsData['modelScoreLessThan70Number']" />
</div>
</div>
</el-col>
@ -87,7 +87,7 @@
<img src="~@/assets/home/pingjun@2x.png">
<div class="flex-column right-item-info">
<span>平均案件定性周期</span>
<vue-count-up :end-val="homeData['averageCaseDuration']" />
<vue-count-up :end-val="statisticsData['caseQualificationCycleAvg']" />
</div>
</div>
</el-col>
@ -124,6 +124,7 @@ import VictimCharacteristicStatistics from '@/views/index/components/VictimChara
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: {
@ -132,6 +133,14 @@ export default {
JudicatureRecognized, VictimCharacteristicStatistics, DoerCharacteristicStatistics, VueCountUp },
data() {
return {
statisticsData: {
caseNumber: '',
caseActorNumber: '',
monthlyNewCaseNumber: '',
comparedToLastMonthIncreaseNumber: '',
caseQualificationCycleAvg: '',
modelScoreLessThan70Number: ''
},
homeData: {
caseNum: 1134,
doerNum: 1433,
@ -163,10 +172,16 @@ export default {
}
},
mounted() {
this.getStatisticsData()
},
methods: {
getStatisticsData() {
queryStatisticsData().then(res => {
if (res.code === 200) {
this.statisticsData = res.data
}
})
}
}
}
</script>
@ -269,11 +284,13 @@ export default {
}
}
.case-num {
background: #5278FF;
background-image: url(../../assets/home/bg1.png);
background-size: 100% 100%;
justify-content: space-between;
}
.doer-num {
background: #736FFF;
background-image: url(../../assets/home/bg2.png);
background-size: 100% 100%;
justify-content: space-between;
}
}

@ -46,7 +46,7 @@ export default {
queryIndexData({
indexType: this.indexType
}, this.queryForm.page, this.queryForm.size).then(res => {
}, 1, 9999).then(res => {
this.gridOptions.data = res.data.result
this.queryForm.total = res.data.total
})

Loading…
Cancel
Save