fix:ocr识别开发

dev_1.0.0
xiangcongshuai 8 months ago
parent 0a4f5ba630
commit 5f91a15868

@ -82,7 +82,7 @@ export function delRecords(id) {
/** 获取上传笔录列表 */
export function queryRecordList(data, page, size) {
return request({
url: `${routes.record}/queryRecords?page=${page}&size=${size}`,
url: `${routes.record}/queryRecordList?page=${page}&size=${size}`,
method: 'post',
data
})

@ -10,7 +10,7 @@ import routes from '../gateway-routes'
/** 查看指标规则列表 */
export function queryIndexData(data, page, size) {
return request({
url: `${routes.modelIndex}/selectAll`,
url: `${routes.modelIndex}/selectAll?page=${page}&size=${size}`,
method: 'post',
data
})

@ -109,7 +109,7 @@ export function queryDictionary(data) {
/** 删除字典数据*/
export function deleteDictionary(data) {
return request({
url: `${routes.comDictionary}/del`,
url: `${routes.comDictionary}/deleteByStatus/delete`,
method: 'post',
params: data
})
@ -130,6 +130,15 @@ export function updateDictionary(data) {
data
})
}
/** 修改字典数据*/
export function updateCategory(data) {
return request({
url: `${routes.comDictionary}/updateCategory`,
method: 'post',
data
})
}
/** 查询个人信息*/
export function queryExamineeInfo(data) {
return request({

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 855 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 932 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 892 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

@ -218,10 +218,8 @@ export default {
//
getIndexData(val) {
queryIndexData({
indexType: val,
page: 1,
size: 9999
}).then(res => {
indexType: val
}, 1, 9999).then(res => {
this.questionlist = res.data.result
})
},

@ -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',

@ -35,7 +35,7 @@ export default {
<style lang="scss" scoped>
.float_info {
position: fixed;
bottom: 60px;
bottom: 120px;
right: 2%;
width: 50px;
height: 50px;

@ -43,8 +43,9 @@ export default {
this.handleChildren(this.item.children, this.item) &&
(!this.routeChildren.children ||
this.routeChildren.notShowChildren) &&
!this.item.alwaysShow
!this.item.alwaysShow || this.item.meta.title === '首页'
) {
// if (this.item.meta.title === '') return 'VabSubmenu'
return 'VabMenuItem'
} else {
return 'VabSubmenu'

@ -80,7 +80,7 @@ export default {
//
formatterTitle(item) {
const pathName = item.path.split('/')
if (pathName.length > 2) {
if (pathName.length > 3) {
return decodeURIComponent(pathName[pathName.length - 1])
} else {
return item.meta.title
@ -109,9 +109,9 @@ export default {
if (Number(tab.index) === 0) {
//
this.$router.push({
path: '/case-management',
path: '/index',
query: {},
fullPath: '/case-management'
fullPath: '/index'
})
return
}

@ -37,24 +37,24 @@ export const constantRoutes = [
]
export const asyncRoutes = [
// {
// path: '/',
// name: 'home',
// component: Layout,
// redirect: '/index',
// authKey: 'back_home',
// meta: { title: '首页' },
// permission: 'p_home',
// children: [
// {
// path: '/index',
// name: 'Index',
// permission: 'p_home',
// component: () => import('@/views/index/index.vue'),
// meta: { title: '首页', affix: false }
// }
// ]
// },
{
path: '/',
name: 'home',
component: Layout,
redirect: '/index',
authKey: 'back_home',
meta: { title: '首页' },
permission: 'p_home',
children: [
{
path: '/index',
name: 'Index',
permission: 'p_home',
component: () => import('@/views/index/index.vue'),
meta: { title: '首页', affix: false }
}
]
},
{
path: '/case',
@ -146,6 +146,20 @@ export const asyncRoutes = [
permission: 'p_caseDetails',
component: () => import('@/views/caseDetails/index.vue'),
meta: { title: '案件详情', affix: true }
},
{
path: '/add-record/:id',
name: 'AddRecord',
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 }
}
]
},

@ -52,7 +52,7 @@
</div>
<a
class="bullshit-return-home"
href="#/case-management"
href="#/index"
>
{{ jumpTime }}s&nbsp;{{ btn }}
</a>
@ -88,9 +88,9 @@ export default {
if (this.jumpTime) {
this.jumpTime--
} else {
this.$router.push({ path: '/case-management' })
this.$router.push({ path: '/index' })
this.$store.dispatch('tabsBar/delOthersRoutes', {
path: '/case-management'
path: '/index'
})
clearInterval(this.timer)
}

@ -0,0 +1,246 @@
<template>
<div class="EvidenceProofread">
<div class="FormInfo">
<el-form ref="form" :model="dataInfo" :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>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="案件名称">
<span>的点点滴滴</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>
</el-col>
<el-col :span="24">
<el-form-item label="证据类型" prop="questioner">
<el-input v-model="dataInfo['questioner']" 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-col>
</el-row>
</el-form>
</div>
<div class="proofread-content">
<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>
</vuedraggable>
</el-scrollbar>
<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>
<span class="boder1" />
<span class="boder2" />
<span class="boder3" />
<span class="boder4" />
</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>
</div>
</template>
<script>
import * as vuedraggable from 'vuedraggable'
import { baseURL } from '@/config'
import { commonDownloadFile } from '@/api/config/uploadApi'
export default {
name: 'EvidenceProofread',
components: { vuedraggable },
data() {
return {
dataList: [
'1111',
'2222',
'3333',
'44444',
'1111',
'2222',
'3333',
'44444'
],
dataInfo: {},
activedImg: `${baseURL}${commonDownloadFile}1829334930064207873`
}
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.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;
}
: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;
.left-scroll {
// height: calc(100vh - 308px);
background: #F6F8F9;
width: 150px;
margin-right: 14px;
}
.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;
.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%;
}
}
.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>

@ -0,0 +1,293 @@
<template>
<div class="AddEvidence">
<div v-if="fileList.length === 0 && status === '1'" class="no-upload-main">
<el-upload
drag
:headers="{
token: token
}"
:action="uploadOption.action"
:accept="uploadOption.accept"
multiple
:on-success="handleSuccess"
:before-upload="beforeUpload"
:show-file-list="false"
class="drag-content"
>
<div class="upload-content">
<!-- <div>点击或将文件拖拽到这里上传</div>
<div>支持PNGJPGJPEGBMPWEBP图片格式OCR转换一次可以处理12张</div>
<el-button type="primary" icon="el-icon-upload2" style="margin-top: 10px">点击上传</el-button> -->
<img src="@/assets/record/upload_content.png" alt="">
<div class="upload-content-main">
<span class="title">点击或将文件拖拽到这里上传</span>
<span class="desc">支持PNGJPGJPEG图片格式OCR转换一次可以处理12张</span>
</div>
</div>
</el-upload>
</div>
<div v-if=" fileList.length > 0&& status === '1'" class="handle-upload-main">
<el-upload
drag
:headers="{
token: token
}"
:action="uploadOption.action"
:accept="uploadOption.accept"
multiple
:on-success="handleSuccess"
:before-upload="beforeUpload"
:show-file-list="false"
class="handle-drag-content"
>
<div class="upload-content-main">
<span class="title">点击或将文件拖拽到这里上传</span>
<span class="desc">支持PNGJPGJPEG图片格式OCR转换一次可以处理12张</span>
<div class="up-btn">
<img src="@/assets/record/upload_btn.png" alt="">
<span>选择文件</span>
</div>
</div>
</el-upload>
<div class="upload-list">
<vuedraggable v-model="fileList" animation="400" class="img_list">
<!-- <transition-group> -->
<div v-for="(item,index) in fileList" :key="index" class="img_item">
<!-- <img :src="getImgUrl(item.id)" alt=""> -->
<el-image
class="img_item_url"
:src="getImgUrl(item.id)"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="[getImgUrl(item.id)]"
fit="cover"
/>
<span>{{ item.name }}</span>
<img class="del" src="@/assets/record/del_img.png" alt="">
</div>
<!-- </transition-group> -->
</vuedraggable>
</div>
<div class="submit-btn">内容核实</div>
</div>
<EvidenceProofread v-if="status ==='2'" />
</div>
</template>
<script>
import { baseURL } from '@/config'
import { getAccessToken } from '@/utils/accessToken'
import { commonDownloadFile } from '@/api/config/uploadApi'
import * as vuedraggable from 'vuedraggable'
import EvidenceProofread from './EvidenceProofread.vue'
export default {
name: 'AddEvidence',
components: { vuedraggable, EvidenceProofread },
data() {
return {
fileList: [{}],
status: '2',
//
uploadOption: {
action: `${baseURL}/minio/uploadFile`,
accept: '.bmp,.jpg,.png'
},
token: getAccessToken()
}
},
mounted() {
},
methods: {
getImgUrl(id) {
return `${baseURL}${commonDownloadFile}${id}`
}
}
}
</script>
<style scoped lang="scss">
.AddEvidence {
display: flex;
background: #FFFFFF;
height: 100%;
.no-upload-main {
margin-top: 16px;
height: 100%;
padding: 0 270px;
flex: 1;
border: 1px dashed #3763FF;
display: flex;
align-items: center;
justify-content: center;
height: calc(100vh - 400px);
.drag-content {
.upload-content {
position: relative;
display: flex;
align-items: center;
justify-content: center;
img {
width: 463px;
height:361px ;
}
.upload-content-main {
position: absolute;
top: 200px;
display: flex;
flex-direction: column;
.title {
font-size: 20px;
color: #333333;
}
.desc {
font-size: 16px;
color: #999999;
margin-top: 12px;
}
}
}
}
}
.handle-upload-main {
display: flex;
flex-direction: column;
margin-top: 16px;
flex: 1;
// align-items: center;
justify-content: center;
height: calc(100vh - 330px);
padding: 0 26px;
.handle-drag-content {
height: 240px;
border: 1px dashed transparent;
background: linear-gradient(#fff,#fff) padding-box,
repeating-linear-gradient(-45deg,#3763FF 0, #3763FF 0.3em, #fff 0,#fff 0.6em);
display: flex;
width: 100%;
align-items: center;
justify-content: center;
margin-bottom: 16px;
::v-deep {
.el-upload-dragger {
border: 0;
}
}
.upload-content-main {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.title {
font-size: 20px;
color: #333333;
}
.desc {
font-size: 16px;
color: #999999;
margin-top: 12px;
}
.up-btn {
margin-left: 16px;
display: flex;
align-items: center;
justify-content: center;
width: 122px;
height: 42px;
background: #3763FF;
border-radius: 6px 6px 6px 6px;
cursor: pointer;
font-size: 16px;
color: #FFFFFF;
margin-top: 32px;
img {
width: 20px;
height: 20px;
margin-right: 6px;
}
}
}
}
.upload-list {
flex: 1;
width: 100%;
border: 1px dashed transparent;
background: linear-gradient(#fff,#fff) padding-box,
repeating-linear-gradient(-45deg,#3763FF 0, #3763FF 0.3em, #fff 0,#fff 0.6em);
.img_list {
display: flex;
flex-wrap: wrap;
padding: 24px 0 0 24px;
.img_item {
display: flex;
flex-direction: column;
margin-right: 16px;
margin-bottom: 16px;
position: relative;
.img_item_url {
width: 136px;
height: 190px;
border-radius: 6px 6px 6px 6px;
border: 1px solid #D1D3D6;
margin-bottom: 8px;
cursor: pointer;
}
span {
font-size: 16px;
color: #333333;
}
.del {
position: absolute;
width: 24px;
height: 24px;
right: 8px;
top: 8px;
display: none;
cursor: pointer;
}
}
.img_item:hover {
.del {
display: block;
}
}
}
}
.submit-btn {
position: absolute;
bottom: 16px;
right: 16px;width: 188px;
height: 48px;
background: #3763FF;
box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04);
border-radius: 6px 6px 6px 6px;font-size: 16px;
color: #FFFFFF;
text-align: center;
line-height: 48px;
cursor: pointer;
}
}
::v-deep {
.el-upload {
width: 100%;
}
.el-upload-dragger {
width: 100%;
height: 100%;
}
.el-steps--simple {
padding: 0;
background: none;
}
.el-step.is-simple .el-step__title {
font-size: 14px;
}
}
}
</style>

@ -0,0 +1,89 @@
<template>
<div class="FormInfo">
<el-form 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>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="案件名称">
<span>的点点滴滴</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="姓名" prop="userId">
<div class="flex-row" style="justify-content: space-between">
<el-select v-model="recordForm.userId" placeholder="请选择姓名" style="width: 80%">
<el-option
v-for="item in userList"
:key="item.value"
:value="item.value"
:label:="item.name"
/>
</el-select>
<el-button type="primary" @click="handleAdd"></el-button>
</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="第" prop="number">
<div class="flex-row">
<el-input v-model="recordForm['number']" 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>
</el-col>
<el-col :span="24">
<el-form-item label="供述时间" prop="confessionTime">
<el-date-picker
v-model="recordForm['confessionTime']"
type="datetimerange"
format="yyyy-MM-dd HH:MM"
start-placeholder="请选择开始时间"
end-placeholder="请选择结束时间"
style="width: 100%"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!--新增用户-->
<add-case-user ref="add" />
</div>
</template>
<script>
import AddCaseUser from '@/views/caseDetails/components/edit/AddCaseUser.vue'
export default {
name: 'FormInfo',
components: { AddCaseUser },
data() {
return {
recordForm: {},
//
userList: []
}
},
methods: {
//
handleAdd() {
this.$refs.add.show()
}
}
}
</script>
<style lang="scss" scoped>
.FormInfo {
width: 470px;
background: #F6F8F9;
border-radius: 8px 8px 8px 8px;
height: calc(100vh - 350px);
padding: 0 24px;
}
</style>

@ -0,0 +1,81 @@
<template>
<div class="RecordAnalysis">
<FormInfo />
<div class="analysis-main">
<div class="content">
<span class="title">笔录上传成功</span>
<span class="desc">系统正在处理笔录信息可稍后在笔录列表中提交[笔录分析]以免超载</span>
<span class="btn">笔录分析</span>
</div>
</div>
</div>
</template>
<script>
import FormInfo from './FormInfo.vue'
export default {
name: 'RecordAnalysis',
components: { FormInfo },
data() {
return {
}
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.RecordAnalysis {
display: flex;
padding: 0 24px;
.analysis-main {
flex: 1;
margin-left: 16px;
// border: 1px dashed #3763FF;
border: 1px dashed transparent;
background: linear-gradient(#fff,#fff) padding-box,
repeating-linear-gradient(-45deg,#3763FF 0, #3763FF 0.3em, #fff 0,#fff 0.6em);
display: flex;
align-items: center;
justify-content: center;
.content {
width: 463px;
height: 316px;
background-image: url(../../../../../assets/record/submit_ok.png);
background-size: 100% 100%;
display: flex;
flex-direction: column;
// justify-content: center;
align-items: center;
.title {
font-size: 20px;
padding-top: 170px;
color: #333333;
}
.desc {
margin-top: 13px;
font-size: 16px;
color: #999999;
width: 600px;
text-align: center;
}
.btn {
width: 156px;
height: 56px;
background: #3763FF;
border-radius: 6px 6px 6px 6px;
line-height: 56px;
text-align: center;
font-size: 18px;
color: #FFFFFF;
cursor: pointer;
margin-top: 32px;
}
}
}
}
</style>

@ -0,0 +1,130 @@
<template>
<div class="RecordIdentify">
<FormInfo />
<vxe-grid v-bind="gridOptions" class="record_table">
<template #status="{row}">
<div v-if="row.status === 1" class="status">
<img src="@/assets/record/success.png" alt="">
<span>识别成功</span>
</div>
<div v-if="row.status === 2">
<img src="@/assets/record/error.png" alt="">
<span>识别失败</span>
</div>
</template>
<template #opera="{row}">
<div class="btn-list">
<img src="@/assets/record/reset_identify.png" alt="">
<!-- <img src="@/assets/record/view_detail.png" alt=""> -->
<el-image
style="width: 16px; height: 16px;margin-right: 16px;"
:src="detailImg"
:preview-src-list="getImgUrlList(row)"
fit="cover"
@click="openDeatils(row)"
/>
<img src="@/assets/record/del.png" alt="">
</div>
</template>
</vxe-grid>
<div class="footer-btns">
<div class="btn" @click="back"></div>
<div class="btn" @click="next"></div>
</div>
</div>
</template>
<script>
import * as vuedraggable from 'vuedraggable'
import FormInfo from './FormInfo.vue'
import { baseURL } from '@/config'
import { commonDownloadFile } from '@/api/config/uploadApi'
export default {
name: 'RecordIdentify',
components: { vuedraggable, FormInfo },
data() {
return {
detailImg: require('@/assets/record/view_detail.png'),
gridOptions: {
columns: [
{ title: '序号', type: 'seq', width: '80px' },
{ title: '附件名称', field: 'name' },
{ title: '证据类型', field: 'type' },
{ title: '附件大小', field: 'size' },
{ title: '状态', slots: { default: 'status' }, align: 'center' },
{ title: '操作', slots: { default: 'opera' }, fixed: 'right', width: '200px' }
],
data: [
{
name: '第一次讯问笔录.bmp',
type: '笔录',
size: '2.98M',
status: 1
}
]
},
srcList: []
}
},
methods: {
getImgUrlList(row) {
// this.srcList.push(`${baseURL}${commonDownloadFile}1829334930064207873`)
return [`${baseURL}${commonDownloadFile}1829334930064207873`]
},
next() {
this.$emit('next',2)
},
back() {
this.$emit('back',0)
}
}
}
</script>
<style lang="scss" scoped>
.RecordIdentify {
display: flex;
padding: 0 24px;
.record_table {
flex: 1;
margin-left: 18px;
}
.status {
display: flex;
justify-content: center;
align-items: center;
img {
width: 20px;
height: 20px;
margin-right: 8px;
}
}
.btn-list {
img {
width: 16px;
height: 16px;
cursor: pointer;
margin-right: 16px;
}
}
.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;
}
}
}
</style>

@ -0,0 +1,198 @@
<template>
<div class="RecordProofread">
<FormInfo />
<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>
</vuedraggable>
</el-scrollbar>
<img :src="activedImg" class="act_img" alt="">
<span class="boder1" />
<span class="boder2" />
<span class="boder3" />
<span class="boder4" />
</div>
<div class="right">
<div class="title">识别结果</div>
<span class="boder1" />
<span class="boder2" />
<span class="boder3" />
<span class="boder4" />
</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>
</div>
</template>
<script>
import * as vuedraggable from 'vuedraggable'
import FormInfo from './FormInfo.vue'
import { baseURL } from '@/config'
import { commonDownloadFile } from '@/api/config/uploadApi'
export default {
name: 'RecordProofread',
components: { vuedraggable, FormInfo },
data() {
return {
dataList: [
'1111',
'2222',
'3333',
'44444',
'1111',
'2222',
'3333',
'44444'
],
activedImg: `${baseURL}${commonDownloadFile}1829334930064207873`
}
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.RecordProofread {
display: flex;
padding: 0 24px;
:deep(.el-scrollbar__wrap) {
overflow-x: hidden;
}
.proofread-content {
flex: 1;
margin-left: 18px;
display: flex;
.left {
width: 55%;
margin-right: 24px;
position: relative;
// background: #F6F8F9;
border: 1px solid #DCE3EB;
display: flex;
padding: 8px;
.left-scroll {
height: calc(100vh - 368px);
background: #F6F8F9;
}
.act_img {
padding: 16px 28px;
flex: 1;
background: #F6F8F9;
height: calc(100vh - 400px);
background-size: 100% 100%;
}
}
.right {
width: 45%;
position: relative;
border: 1px solid #DCE3EB;
display: flex;
padding: 8px;
.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%;
}
}
.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>

@ -0,0 +1,288 @@
<template>
<div class="UploadRecord">
<FormInfo />
<div class="main-content">
<span class="tips">文档格式笔录可直接上传若非文档格式系统将进行0CR识别内容人工核实后支持继续上传或保存结束本次笔录信息上传</span>
<div v-if="fileList.length === 0" class="main-content-upload">
<!-- <span class="title">点击或将文件拖拽到这里上传</span> -->
<el-upload
drag
:headers="{
token: token
}"
:action="uploadOption.action"
:accept="uploadOption.accept"
multiple
:on-success="handleSuccess"
:before-upload="beforeUpload"
:show-file-list="false"
class="drag-content"
>
<div class="upload-content">
<!-- <div>点击或将文件拖拽到这里上传</div>
<div>支持PNGJPGJPEGBMPWEBP图片格式OCR转换一次可以处理12张</div>
<el-button type="primary" icon="el-icon-upload2" style="margin-top: 10px">点击上传</el-button> -->
<img src="@/assets/record/upload_content.png" alt="">
<div class="upload-content-main">
<span class="title">点击或将文件拖拽到这里上传</span>
<span class="desc">支持PNGJPGJPEG图片格式OCR转换一次可以处理12张</span>
</div>
</div>
</el-upload>
</div>
<div v-else class="upload-card">
<div class="header">
<span>上传材料</span>
<el-upload
:headers="{
token: token
}"
:action="uploadOption.action"
:accept="uploadOption.accept"
multiple
:on-success="handleSuccess"
:before-upload="beforeUpload"
:show-file-list="false"
>
<div class="up-btn">
<img src="@/assets/record/upload_btn.png" alt="">
<span>选择文件</span>
</div>
</el-upload>
</div>
<div class="upload-card-main">
<vuedraggable v-model="fileList" animation="400" class="img_list">
<!-- <transition-group> -->
<div v-for="(item,index) in fileList" :key="index" class="img_item">
<!-- <img :src="getImgUrl(item.id)" alt=""> -->
<el-image
class="img_item_url"
:src="getImgUrl(item.id)"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="[getImgUrl(item.id)]"
fit="cover"
/>
<span>{{ item.name }}</span>
<img class="del" src="@/assets/record/del_img.png" alt="">
</div>
<!-- </transition-group> -->
</vuedraggable>
</div>
</div>
</div>
<div class="footer-btn" @click="save"></div>
</div>
</template>
<script>
import FormInfo from './FormInfo.vue'
import { baseURL } from '@/config'
import { getAccessToken } from '@/utils/accessToken'
import { commonDownloadFile } from '@/api/config/uploadApi'
import * as vuedraggable from 'vuedraggable'
export default {
name: 'UploadRecord',
components: { FormInfo, vuedraggable },
data() {
return {
//
uploadOption: {
action: `${baseURL}/minio/uploadFile`,
accept: '.bmp,.jpg,.png'
},
token: getAccessToken(),
fileList: []
}
},
methods: {
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,
id: res.data
}
this.fileList.push(obj)
},
getImgUrl(id) {
return `${baseURL}${commonDownloadFile}${id}`
},
save() {
this.$emit('save', 1)
}
}
}
</script>
<style lang="scss" scoped>
.UploadRecord {
display: flex;
padding: 0 24px;
.main-content {
flex: 1;
margin-left: 18px;
display: flex;
flex-direction: column;
.tips {
font-weight: 400;
font-size: 14px;
color: #B4B4B4
}
.main-content-upload {
margin-top: 16px;
flex: 1;
border: 1px dashed #3763FF;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
.drag-content {
// width: 800px;
// height: 600px;
.upload-content {
position: relative;
display: flex;
align-items: center;
justify-content: center;
img {
width: 463px;
height:361px ;
}
.upload-content-main {
position: absolute;
top: 200px;
display: flex;
flex-direction: column;
.title {
font-size: 20px;
color: #333333;
}
.desc {
font-size: 16px;
color: #999999;
margin-top: 12px;
}
}
}
}
.main {
background-image: url(@/assets/record/upload_content.png);
background-size: 100% 100%;
width: 463px;
height: 316px;
}
}
}
.upload-card {
margin-top: 16px;
flex: 1;
display: flex;
flex-direction: column;
.header {
display: flex;
font-size: 16px;
color: #333333;
align-items: center;
.up-btn {
margin-left: 16px;
display: flex;
align-items: center;
justify-content: center;
width: 122px;
height: 42px;
background: #3763FF;
border-radius: 6px 6px 6px 6px;
cursor: pointer;
font-size: 16px;
color: #FFFFFF;
img {
width: 20px;
height: 20px;
margin-right: 6px;
}
}
}
.upload-card-main {
flex: 1;
margin-top: 16px;
// border: 1px dashed #3763FF;
border: 1px dashed transparent;
background: linear-gradient(#fff,#fff) padding-box,
repeating-linear-gradient(-45deg,#3763FF 0, #3763FF 0.3em, #fff 0,#fff 0.6em);
.img_list {
display: flex;
flex-wrap: wrap;
padding: 24px 0 0 24px;
.img_item {
display: flex;
flex-direction: column;
margin-right: 16px;
margin-bottom: 16px;
position: relative;
.img_item_url {
width: 136px;
height: 190px;
border-radius: 6px 6px 6px 6px;
border: 1px solid #D1D3D6;
margin-bottom: 8px;
cursor: pointer;
}
span {
font-size: 16px;
color: #333333;
}
.del {
position: absolute;
width: 24px;
height: 24px;
right: 8px;
top: 8px;
display: none;
cursor: pointer;
}
}
.img_item:hover {
.del {
display: block;
}
}
}
}
}
.footer-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;
font-size: 16px;
color: #FFFFFF;
text-align: center;
line-height: 48px;
position: absolute;
right: 24px;
bottom: 24px;
cursor: pointer;
}
}
</style>

@ -0,0 +1,226 @@
<template>
<div class="OcrRecord">
<div class="step-list">
<div class="step-list-item">
<img :src="actUploadImg" alt="">
<span class="actived">上传笔录</span>
</div>
<div :class="[activeStep > 0 ?'act-step-line':'step-line']">
<span>>></span>
</div>
<div class="step-list-item">
<img v-if="activeStep > 0" :src="actIdentifyImg" alt="">
<img v-else :src="identifyImg" alt="">
<span :class="[activeStep > 0 ?'actived':'']">笔录识别</span>
</div>
<div :class="[activeStep > 0 ?'act-step-line':'step-line']">
<span>>></span>
</div>
<div class="step-list-item">
<img v-if="activeStep > 1" :src="actIdentifyImg" alt="">
<img v-else :src="identifyImg" alt="">
<span :class="[activeStep > 1 ?'actived':'']">笔录内容校准</span>
</div>
<div :class="[activeStep > 1 ?'act-step-line':'step-line']">
<span>>></span>
</div>
<div class="step-list-item">
<img v-if="activeStep > 2" :src="actUploadImg" alt="">
<img v-else :src="uploadImg" alt="">
<span :class="[activeStep > 2 ?'actived':'']">笔录提交及分析</span>
</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" />
</div>
</template>
<script>
import RecordIdentify from './components/RecordIdentify.vue'
import RecordProofread from './components/RecordProofread.vue'
import UploadRecord from './components/UploadRecord.vue'
import RecordAnalysis from './components/RecordAnalysis.vue'
export default {
name: 'OcrRecord',
components: { RecordIdentify, RecordProofread, UploadRecord, RecordAnalysis },
data() {
return {
actRecordImg: require('@/assets/record/act_record.png'),
actIdentifyImg: require('@/assets/record/act_identify.png'),
actUploadImg: require('@/assets/record/act_upload.png'),
identifyImg: require('@/assets/record/identify.png'),
uploadImg: require('@/assets/record/upload.png'),
activeStep: 0,
recordForm: {},
//
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' }]
},
//
userList: [],
//
roleList: [],
//
fileList: []
}
},
methods: {
//
handleAdd() {
this.$refs.add.show()
},
//
uploadRecord(val) {
this.activeStep = val
}
}
}
</script>
<style scoped lang="scss">
.OcrRecord {
width: 100%;
height: 100%;
background: #fff;
.step-list {
display: flex;
align-items: center;
width: 100%;
justify-content: center;
padding-top: 36px;
margin-bottom: 32px;
.step-list-item {
display: flex;
align-items: center;
span {
font-size: 20px;
color: #999999;
margin-left: 16px;
margin-right: 16px;
}
.actived {
color: #3763FF;
}
}
.step-line {
width: 137px;
height: 2px;
border-top: 2px dashed #999999;
display: flex;
position: relative;
margin-right: 42px;
span {
position: absolute;
right: -24px;
top: -11px;
color: #999999;
font-size: 16px;
}
}
.act-step-line {
width: 137px;
height: 2px;
border-top: 2px dashed #3763FF;
display: flex;
position: relative;
margin-right: 42px;
span {
position: absolute;
right: -24px;
top: -11px;
color: #3763FF;
font-size: 16px;
}
}
img {
width: 36px;
height: 36px;
}
}
}
.tips {
font-size: 12px;
color: #999999;
}
.form-content {
background: #F6F8F9;
padding-top: 20px;
border-radius: 8px;
}
.upload-content {
position: relative;
color: #333333;
.upload-icon {
width: 300px;
height: 220px;
object-fit: contain;
}
>div:nth-child(2) {
margin-top: -100px;
}
>div:nth-child(3) {
margin-top: 10px;
color: #999999;
font-size: 12px;
}
}
.footer {
margin-top: 20px;
align-items: center;
padding: 15px 10px;
box-sizing: border-box;
background: #F6F8F9;
>div {
flex: 1;
align-items: center;
justify-content: center;
cursor: pointer;
&:nth-child(2) {
border-left: 1px solid #CADFFF;
border-right: 1px solid #CADFFF;
}
img {
width: 50px;
height: 50px;
}
>div{
font-size: 14px;
margin-left: 10px;
span:nth-last-child(1) {
font-size: 12px;
color: #999999;
margin-top: 10px;
}
}
}
}
::v-deep {
.el-upload {
width: 100%;
}
.el-upload-dragger {
width: 100%;
height: 100%;
}
.el-steps--simple {
padding: 0;
background: none;
}
.el-step.is-simple .el-step__title {
font-size: 14px;
}
}
</style>

@ -28,6 +28,8 @@
</div>
<!--编辑/新增证据-->
<edit-evidence ref="edit" @onClose="fetchData" />
<!--选择上传笔录方式-->
<SelectUploadType ref="SelectUploadTypeRef" @selectOk="handleSelect" />
</div>
</template>
@ -37,9 +39,10 @@ import mixin from '@/views/mixin'
import EditEvidence from '@/views/caseDetails/components/edit/EditEvidence.vue'
import { queryEvidenceList, deleteEvidence } from '@/api/caseDetails'
import { debounce } from '@/utils'
import SelectUploadType from './SelectUploadType.vue'
export default {
name: 'CaseEvidence',
components: { EditEvidence },
components: { EditEvidence ,SelectUploadType},
mixins: [mixin],
props: {
//
@ -108,14 +111,18 @@ export default {
this.queryForm.total = res.data.total
})
},
//
//
handleAdd() {
this.$refs.edit.show()
// this.$refs.edit.show()
this.$refs.SelectUploadTypeRef.show()
},
//
handelEdit(row) {
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 }})
},
//
handleDel(row) {
this.$baseConfirm('你确定要删除当前项吗', null, async() => {

@ -10,8 +10,9 @@
<div class="record-content">
<div v-if="isEdit" class="flex-row" style="align-items: center; justify-content: space-between">
<div>
<!-- <el-button type="primary" icon="el-icon-circle-plus-outline" @click="handleAdd"></el-button> -->
<el-dropdown @command="handleSelect">
<el-button type="primary">添加笔录<i class="el-icon-arrow-down el-icon--right" /></el-button>
<el-button type="primary" icon="el-icon-circle-plus-outline">添加笔录</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="1">文档笔录</el-dropdown-item>
<!-- <el-dropdown-item command="2">图像笔录</el-dropdown-item> -->
@ -42,11 +43,11 @@
<!--选择三元组信息入库-->
<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" />
<!--ocr方式上传笔录-->
<ocr-record ref="ocr" />
<!--选择上传笔录方式-->
<SelectUploadType ref="SelectUploadTypeRef" @selectOk="handleSelect" />
</div>
</template>
@ -54,14 +55,15 @@
import mixin from '@/views/mixin'
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 OcrRecord from '@/views/caseDetails/components/edit/OcrRecord.vue'
import TripletInfo from '@/views/caseDetails/components/TripletInfo.vue'
import { queryRecordList, delRecords } from '@/api/caseDetails'
import AddCaseUser from './edit/AddCaseUser.vue'
import { debounce } from '@/utils'
import SelectUploadType from './SelectUploadType.vue'
export default {
name: 'CaseRecord',
components: { TripletInfo, OcrRecord, SelectUpload, EditRecord, AddCaseUser },
components: { TripletInfo, SelectUpload, EditRecord, AddCaseUser, SelectUploadType },
mixins: [mixin],
props: {
//
@ -82,11 +84,8 @@ export default {
caseId: '',
gridOptions: {
...mixin.data().gridOptions,
treeConfig: {
},
columns: [
{ title: '序号', type: 'seq', treeNode: true },
{ title: '序号', field: 'serialNumber' },
{ title: '姓名', field: 'name', sortable: true },
// { title: '', field: 'recordNum', sortable: true },
{ title: '角色', field: 'roleName' },
@ -142,12 +141,16 @@ export default {
this.$refs.addUser.show()
},
//
// handleAdd() {
// this.$refs.type.show()
// },
//
handleAdd() {
this.$refs.type.show()
this.$refs.SelectUploadTypeRef.show()
// 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.$refs.ocr.show()
val === '1' ? this.$refs.edit.show() : this.$router.push({ path: `/add-record/${this.caseId}`, query: { isEdit: 0 }})
},
//
handleCreateAtlas(row) {
@ -155,11 +158,7 @@ export default {
},
//
handelEdit(row) {
if (row.children.length > 0) {
this.$refs.addUser.show(row)
} else {
this.$refs.edit.show(row, true)
}
},
//
handleDel(row) {

@ -0,0 +1,119 @@
<template>
<div class="evidence-content">
<vxe-grid ref="xTable" v-bind="gridOptions">
<template #result_edit="{row}">
<el-select v-model="row['atomicResult']" placeholder="请选择" @change="save">
<el-option
v-for="item in resultOptions"
:key="item.value"
:value="item.value"
:label="item.label"
/>
</el-select>
</template>
<template #remark_edit="{row}">
<el-input @blur="save" v-model="row['remark']" placeholder="请输入" />
</template>
</vxe-grid>
</div>
</template>
<script>
import mixin from '@/views/mixin'
import { listCaseAtomicIndex, saveCaseAtomicResult } from '@/api/caseDetails'
import { debounce } from '@/utils'
export default {
name: 'CaseEvidence',
mixins: [mixin],
props: {
//
isEdit: {
type: Boolean,
default: false
},
//
isExpand: {
type: Boolean,
default: true
}
},
data() {
return {
searchName: '',
gridOptions: {
...mixin.data().gridOptions,
editConfig: {
trigger: 'click',
mode: 'cell'
},
editRules: {
atomicResult: [{ required: true, message: '判断结果不能为空!' }]
},
columns: [
{ title: '序号', type: 'seq', width: '50px' },
{ title: '指标名称', field: 'indexName', align: 'left' },
{ title: '原子指标', field: 'automicIndexName', align: 'left' },
{ title: '判断结果', field: 'atomicResult', width: '150px', formatter: ({ cellValue }) => {
return cellValue ? this.resultOptions.find(item => item.value === cellValue).label : ''
}, editRender: {}, slots: { edit: 'result_edit' }},
{ title: '备注', field: 'remark', width: '500px', formatter: ({ cellValue }) => {
return cellValue || ''
}, editRender: {}, slots: { edit: 'remark_edit' }}
],
data: []
},
resultOptions: JSON.parse(sessionStorage.getItem('judge_result'))
}
},
watch: {
isExpand: {
handler: function(newVal, oldVal) {
if (newVal !== oldVal) {
this.tableHeight(this.isExpand ? this.isEdit ? 580 : 530 : this.isEdit ? 400 : 320)
}
},
immediate: true
},
searchName: function() {
this.debounceSearch(this)
}
},
mounted() {
this.caseId = this.$route.params.id
this.$nextTick(() => {
this.tableHeight(this.isExpand ? (this.isEdit ? 580 : 530) : (this.isEdit ? 400 : 320))
})
this.fetchData()
},
methods: {
//
debounceSearch: debounce((_this) => {
_this.fetchData()
}),
//
async save() {
await saveCaseAtomicResult({
caseAtomicIndexList: this.gridOptions.data,
caseId: this.caseId
})
},
//
fetchData() {
const params = {
caseId: this.caseId
}
listCaseAtomicIndex(params).then(res => {
this.gridOptions.data = res.data
})
}
}
}
</script>
<style scoped lang="scss">
.evidence-content {
}
</style>

@ -0,0 +1,116 @@
<template>
<cs-dialog
:dialog="dialogOptions"
>
<template slot="content">
<div class="upload-way">
<div class="word_list" @click="handleSelect('1')">
<img class="bg_img" src="../../../assets/record/word_bg.png" alt="">
<span class="title">普通笔录文档</span>
<span class="desc">笔录为有效的 docdocxtxtrtfwpd格式文件</span>
<div class="up-btn">
<img src="@/assets/record/upload_btn.png" alt="">
<span>选择上传</span>
</div>
</div>
<div class="word_list" @click="handleSelect('2')">
<img class="bg_img" src="../../../assets/record/ocr_bg.png" alt="">
<span class="title">OCR识别</span>
<span class="desc">笔录为有效的 PNGJPGJPEGBMPWEBP图片格式</span>
<div class="up-btn">
<img src="@/assets/record/upload_btn.png" alt="">
<span>选择上传</span>
</div>
</div>
</div>
</template>
</cs-dialog>
</template>
<script>
export default {
name: 'SelectUploadType',
data() {
return {
dialogOptions: {
show: false,
width: '930px',
title: {
title: '选择上传类型'
},
hiddenFooter: true,
appendToBody: true
}
}
},
mounted() {
},
methods: {
//
show() {
this.dialogOptions.show = true
},
handleSelect(val) {
this.$emit('selectOk', val)
this.dialogOptions.show = false
}
}
}
</script>
<style scoped lang="scss">
.upload-way {
padding-top: 58px;
padding-bottom: 80px;
display: flex;
justify-content: space-around;
.word_list {
width: 334px;
height: 420px;
border-radius: 8px 8px 8px 8px;
padding: 0 24px;
border: 1px solid #D9D9D9;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.bg_img {
width: 130px;
height: 130px;
}
.title {
font-size: 24px;
color: #333333;
margin-top: 24px;
margin-bottom: 24px;
}
.desc {
font-size: 16px;
color: #999999;
text-align: center;
margin-bottom: 36px;
}
.up-btn {
display: flex;
width: 184px;
height: 56px;
background: #3763FF;
border-radius: 6px 6px 6px 6px;
cursor: pointer;
justify-content: center;
align-items: center;
font-size: 18px;
color: #FFFFFF;
img {
width: 20px;
height: 20px;
margin-right: 8px;
}
}
}
}
</style>

@ -10,15 +10,52 @@
<cs-drawer
:drawer-option="dialogOption"
>
<div slot="content">
<el-steps :active="activeStep" simple finish-status="success">
<div slot="content" class="OcrRecord">
<div class="step-list">
<div class="step-list-item">
<img :src="actRecordImg" alt="">
<span class="actived">笔录供述人</span>
</div>
<div :class="[activeStep > 0 ?'act-step-line':'step-line']">
<span>>></span>
</div>
<div class="step-list-item">
<img v-if="activeStep > 1" :src="actUploadImg" alt="">
<img v-else :src="uploadImg" alt="">
<span :class="[activeStep > 1 ?'actived':'']">上传笔录</span>
</div>
<div :class="[activeStep > 1 ?'act-step-line':'step-line']">
<span>>></span>
</div>
<div class="step-list-item">
<img v-if="activeStep > 2" :src="actIdentifyImg" alt="">
<img v-else :src="identifyImg" alt="">
<span :class="[activeStep > 2 ?'actived':'']">笔录识别</span>
</div>
<div :class="[activeStep > 2 ?'act-step-line':'step-line']">
<span>>></span>
</div>
<div class="step-list-item">
<img v-if="activeStep > 3" :src="actUploadImg" alt="">
<img v-else :src="uploadImg" alt="">
<span :class="[activeStep > 3 ?'actived':'']">继续上传或结束本次上传</span>
</div>
</div>
<!-- <el-steps :active="activeStep" simple finish-status="success">
<el-step title="笔录供述人" icon="el-icon-user-solid" />
<el-step title="上传笔录" icon="el-icon-upload" />
<el-step title="笔录识别" icon="el-icon-s-claim" />
<el-step title="继续上传或结束本次上传" icon="el-icon-upload" />
</el-steps>
</el-steps> -->
<div v-if="activeStep > 0" class="add_info">
<span>{{ recordForm.userName }}</span>
<span>{{ `${recordForm.number}次笔录` }}</span>
<span>{{ `询问人:${recordForm.questioner}` }}</span>
<!-- <span>{{ `供述时间:${recordForm.confessionTime[0]} ~ ${recordForm.confessionTime[1]}` }}</span> -->
</div>
<div v-if="activeStep === 0">
<p class="tips">文档格式笔录可直接上传若非文档格式系统将进行0CR识别内容人工核实后支持继续上传或保存结束本次笔录信息上传</p>
<el-form v-if="activeStep === 0 || activeStep === 1" ref="form" :model="recordForm" :rules="rules" label-width="80px" style="margin-top: 10px">
<el-form ref="form" :model="recordForm" :rules="rules" label-width="80px" style="margin-top: 10px">
<el-row :gutter="10" class="form-content">
<el-col :span="12">
<el-form-item label="姓名" prop="userId">
@ -53,7 +90,7 @@
<el-date-picker
v-model="recordForm['confessionTime']"
type="datetimerange"
format="yyyy-MM-dd HH:mm"
format="yyyy-MM-dd HH:MM"
start-placeholder="请选择开始时间"
end-placeholder="请选择结束时间"
style="width: 100%"
@ -98,18 +135,23 @@
</div>
</div>
</div>
</div>
<!-- <record-identify v-if="activeStep === 1" />
<record-proofread v-if="activeStep === 2" /> -->
<!--新增用户-->
<add-case-user ref="add" />
<!-- <add-case-user ref="add" /> -->
</div>
</cs-drawer>
</template>
<script>
import AddCaseUser from '@/views/caseDetails/components/edit/AddCaseUser.vue'
// import AddCaseUser from '@/views/caseDetails/components/edit/AddCaseUser.vue'
// import RecordIdentify from './components/RecordIdentify.vue'
// import RecordProofread from './components/RecordProofread.vue'
export default {
name: 'OcrRecord',
components: { AddCaseUser },
// components: { AddCaseUser, RecordIdentify, RecordProofread },
data() {
return {
dialogOption: {
@ -118,7 +160,12 @@ export default {
width: '60%',
hiddenFooter: true
},
activeStep: 0,
actRecordImg: require('@/assets/record/act_record.png'),
actIdentifyImg: require('@/assets/record/act_identify.png'),
actUploadImg: require('@/assets/record/act_upload.png'),
identifyImg: require('@/assets/record/identify.png'),
uploadImg: require('@/assets/record/upload.png'),
activeStep: 1,
recordForm: {},
//
uploadOption: {
@ -155,6 +202,73 @@ export default {
</script>
<style scoped lang="scss">
.OcrRecord {
.step-list {
display: flex;
align-items: center;
.step-list-item {
display: flex;
align-items: center;
span {
font-size: 20px;
color: #999999;
margin-left: 16px;
margin-right: 16px;
}
.actived {
color: #3763FF;
}
}
.step-line {
width: 137px;
height: 2px;
border-top: 2px dashed #999999;
display: flex;
position: relative;
margin-right: 42px;
span {
position: absolute;
right: -24px;
top: -11px;
color: #999999;
font-size: 16px;
}
}
.act-step-line {
width: 137px;
height: 2px;
border-top: 2px dashed #3763FF;
display: flex;
position: relative;
margin-right: 42px;
span {
position: absolute;
right: -24px;
top: -11px;
color: #3763FF;
font-size: 16px;
}
}
img {
width: 36px;
height: 36px;
}
}
.add_info {
margin-top: 16px;
width: 100%;
height: 54px;
background: #F6F8F9;
border-radius: 8px 8px 8px 8px;
display: flex;
align-items: center;
span {
margin: 0 24px;
font-size: 16px;
color: #333333;
}
}
}
.tips {
font-size: 12px;
color: #999999;

@ -40,7 +40,6 @@
<!-- <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="caseData['totalScore'] != null" type="primary" plain @click="openDeatil"></el-button>
<el-button type="text" icon="el-icon-arrow-up" style="color: #666666" @click="expand = false">收起</el-button>
</div>
</div>
@ -118,6 +117,7 @@ import IncriminateIndex from './components/IncriminateIndex.vue'
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'
export default {
name: 'Index',
@ -131,7 +131,8 @@ export default {
InnocentIndex,
IncriminateIndex,
CaseAtlas,
CaseAnalysis
CaseAnalysis,
ManuallyDefined
},
data() {
return {
@ -155,6 +156,9 @@ export default {
{ label: '笔录', value: '1-1', component: 'CaseRecord' },
{ label: '证据', value: '1-2', component: 'CaseEvidence' }
] },
{ label: '指标判断', value: '4', children: [
{ label: '人工定义', value: '4-1', component: 'ManuallyDefined' }
] },
{ label: '指标结果', value: '2', children: [
{ label: '共性指标', value: '2-1', component: 'CommonIndex' },
{ label: '入罪指标', value: '2-2', component: 'IncriminateIndex' },
@ -170,7 +174,8 @@ export default {
//
selectCom: 'CaseRecord',
//
isEdit: false
isEdit: false,
timer: undefined
}
},
mounted() {
@ -179,6 +184,15 @@ export default {
this.fetchData()
},
methods: {
//
updateGauge(value) {
this.scoreOption.series[0].data = [{ value }]
this.caseData.totalScore = this.getRandomNumber(20, 80)
},
getRandomNumber(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min
},
//
fetchData() {
queryCaseList({ id: this.$route.params['id'] }, 1, 1).then(res => {
@ -194,6 +208,8 @@ export default {
//
this.scoreOption.series[0].data = [{ value: this.caseData.totalScore }]
clearInterval(this.timer)
this.timer = undefined
//
if (this.caseData.totalScore >= 70) {
this.scoreOption.series[0].progress.itemStyle.color.colorStops = [{
@ -230,7 +246,18 @@ export default {
},
//
handleAnalysis() {
this.$refs.analysis.show(this.caseData)
this.handleConfirmAnalysis()
let value = 80
if (this.timer) return
this.timer = setInterval(() => {
this.updateGauge(value)
value = value === 20 ? 80 : 20
}, 500)
setTimeout(() => {
this.fetchData()
}, 5000)
// this.$refs.analysis.show(this.caseData)
},
handleConfirmAnalysis(data) {
this.$set(this.caseData, 'isAnalysing', true)
@ -243,7 +270,7 @@ export default {
const { code, msg } = res
this.$set(this.caseData, 'isAnalysing', false)
code === 200 ? this.$baseMessage.success(msg || '模型分析成功!') : this.$baseMessage.error(msg || '模型分析失败!')
this.fetchData()
// this.fetchData()
})
},
//

@ -26,7 +26,7 @@
<div class="flex-row item-header">
<div class="flex-row" style="align-items: center;flex: 1">
<el-tag
v-if="item.caseStatus && item.identifyResultName "
v-if="item.caseStatus && item.identifyResultName"
:type="getTypeStatus(item.identifyResult)"
style="margin-right: 5px"
>
@ -231,18 +231,19 @@ export default {
},
//
handleAnalysis(item) {
this.$refs.analysis.show(item)
// this.$refs.analysis.show(item)
this.handleConfirmAnalysis(item)
},
//
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()
})
},

@ -97,7 +97,7 @@ export default {
this.$store
.dispatch('user/login', this.loginForm)
.then(() => {
this.$router.push('/case-management')
this.$router.push('/index')
this.loading = false
})
.catch(() => {

@ -112,7 +112,7 @@ export default {
methods: {
//
fetchData() {
queryIndexData({ ...this.searchFormData, page: this.queryForm.page, size: this.queryForm.size }).then(res => {
queryIndexData({ ...this.searchFormData }, this.queryForm.page, this.queryForm.size).then(res => {
this.gridOptions.data = res.data.result
this.queryForm.total = res.data.total
})

@ -44,9 +44,9 @@ export default {
methods: {
fetchData() {
queryIndexData({
indexType: this.indexType,
page: this.queryForm.page, size: this.queryForm.size
}).then(res => {
indexType: this.indexType
}, this.queryForm.page, this.queryForm.size).then(res => {
this.gridOptions.data = res.data.result
this.queryForm.total = res.data.total
})

@ -80,7 +80,7 @@ export default {
password: '',
phoneNum: '',
roleId: '',
status:0
status: 0
},
//
rules: {
@ -124,7 +124,7 @@ export default {
//
queryRole() {
getRoleList({
pageNum : 1,
pageNum: 1,
pageSize: 999999
}).then(res => {
this.roleOptions = res.data.records

@ -13,22 +13,12 @@
<el-form-item label="字典名称" prop="label">
<el-input v-model="dicData['label']" placeholder="请输入字典名称" />
</el-form-item>
<el-form-item label="字典编码" prop="value">
<el-input v-model="dicData['value']" disabled placeholder="请输入字典编码" />
<el-form-item label="字典编码" prop="type">
<el-input v-model="dicData['type']" disabled placeholder="请输入字典编码" />
</el-form-item>
<el-form-item label="字典状态" prop="status">
<el-switch v-model="dicData['status']" active-value="1" inactive-value="2" />
<el-form-item label="排序" prop="priority">
<el-input-number v-model="dicData['priority']" style="width: 200px;" :min="0" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="最新时间" prop="time">
<el-date-picker
v-model="dicData['time']"
type="date"
placeholder="请选择最新时间"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
disabled
style="width: 100%"
/>
</el-form-item>
<el-form-item label="备注" prop="note">
<el-input v-model="dicData['note']" type="textarea" :rows="5" placeholder="请输入备注" />
@ -39,6 +29,7 @@
</template>
<script>
import { updateCategory } from '@/api/system/index'
export default {
name: 'EditDicData',
data() {
@ -55,9 +46,7 @@ export default {
//
rules: {
label: [{ required: true, message: '字典名称不能为空!', trigger: 'blur' }],
code: [{ required: false, message: '字典编码不能为空!', trigger: 'blur' }],
status: [{ required: false, message: '字典状态不能为空!', trigger: 'blur' }],
updateTime: [{ required: true, message: '最新时间不能为空!', trigger: 'blur' }]
type: [{ required: false, message: '字典编码不能为空!', trigger: 'blur' }]
},
//
isEdit: false
@ -68,7 +57,7 @@ export default {
this.drawerOption.show = true
this.isEdit = isEdit
this.drawerOption.title = isEdit ? '编辑字典' : '编辑字典'
this.dicData = isEdit ? data : {}
this.dicData = isEdit ? JSON.parse(JSON.stringify(data)) : {}
},
//
handleReset() {
@ -77,9 +66,12 @@ export default {
},
//
handleSubmit() {
this.$refs.form.validate(valid => {
this.$refs.form.validate(async valid => {
if (valid) {
const { code, msg } = await updateCategory(this.dicData)
this.drawerOption.show = false
code === 200 ? this.$baseMessage.success(msg || '编辑成功!') : this.$baseMessage.error(msg || '编辑失败!')
this.$emit('onClose')
}
})
}

@ -16,18 +16,8 @@
<el-form-item label="字典标签数值" prop="value">
<el-input v-model="dicData['value']" placeholder="请输入字典标签数值" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="dicData['sort']" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="最新时间" prop="updateTime">
<el-date-picker
v-model="dicData['updateTime']"
type="date"
placeholder="请选择最新时间"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"
/>
<el-form-item label="排序" prop="priority">
<el-input-number v-model="dicData['priority']" style="width: 200px;" :min="0" placeholder="请输入排序" />
</el-form-item>
</el-form>
</template>
@ -54,7 +44,7 @@ export default {
rules: {
label: [{ required: true, message: '字典标签名称不能为空!', trigger: 'blur' }],
value: [{ required: true, message: '字典标签数值不能为空!', trigger: 'blur' }],
sort: [{ required: true, message: '排序不能为空!', trigger: 'blur' }],
priority: [{ required: true, message: '排序不能为空!', trigger: 'blur' }],
updateTime: [{ required: false, message: '最新时间不能为空!', trigger: 'blur' }]
},
//
@ -66,7 +56,7 @@ export default {
this.drawerOption.show = true
this.isEdit = isEdit
this.drawerOption.title = isEdit ? '编辑字典' : '新建字典'
this.dicData = isEdit ? data : {}
this.dicData = isEdit ? data : { type: data.type, pid: data.id }
},
//
handleReset() {
@ -79,10 +69,10 @@ export default {
if (valid) {
if (this.isEdit) {
const { code, msg } = await updateDictionary(this.dicData)
code === 200 ? this.$baseMessage(msg, '修改成功!') : this.$baseMessage(msg, '修改失败!')
code === 200 ? this.$baseMessage.success(msg, '修改成功!') : ''
} else {
const { code, msg } = await addDictionary(this.dicData)
code === 200 ? this.$baseMessage(msg, '保存成功!') : this.$baseMessage(msg, '保存失败!')
code === 200 ? this.$baseMessage.success(msg, '保存成功!') : ''
}
this.drawerOption.show = false
this.$emit('update')

@ -47,9 +47,6 @@
<el-descriptions-item label="字典编码">
<span class="dic-info">{{ dicData['type'] }}</span>
</el-descriptions-item>
<el-descriptions-item label="字典状态">
<el-switch v-model="dicData['status']" disabled active-value="1" inactive-value="0" />
</el-descriptions-item>
<el-descriptions-item label="最新时间">
<span class="dic-info">{{ dicData['updateTime'] }}</span>
</el-descriptions-item>
@ -71,9 +68,9 @@
</el-col>
</el-row>
<!--编辑字典类型信息-->
<edit-dic-data ref="editDrawer" />
<edit-dic-data ref="editDrawer" @onClose="fetchData" />
<!--编辑字典信息-->
<edit-dic-info @update="fetchData" ref="edit" />
<edit-dic-info ref="edit" @update="fetchData" />
</div>
</template>
@ -102,7 +99,7 @@ export default {
{ title: '序号', type: 'seq' },
{ title: '字典表签名称', field: 'label' },
{ title: '字典标签数值', field: 'value' },
{ title: '排序', field: 'sort' },
{ title: '排序', field: 'priority' },
{ title: '最新时间', field: 'updateTime', sortable: true },
{ title: '操作', slots: { default: 'operate' }, fixed: 'right', width: '150px' }
],
@ -150,7 +147,7 @@ export default {
},
// &
handleAdd() {
this.$refs.edit.show()
this.$refs.edit.show(this.dicData)
},
handleEditInfo(row) {
this.$refs.edit.show(row, true)
@ -158,8 +155,11 @@ export default {
//
handleDel(row) {
this.$baseConfirm('确定要删除吗?', null, async() => {
const { code, msg } = await deleteDictionary(row)
code === 200 ? this.$baseMessage.success(msg || '删除成功!') : this.$baseMessage.error(msg || '删除失败!')
const { code } = await deleteDictionary({
id: row.id
})
code === 200 ? this.$baseMessage.success('删除成功!') : ''
this.fetchData()
})
}

Loading…
Cancel
Save