92 changed files with 8129 additions and 5812 deletions
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,14 +1,14 @@
|
||||
<template> |
||||
<el-config-provider :locale="elConfig.locale" :z-index="elConfig.zIndex" > |
||||
<el-config-provider :locale="elConfig.locale" :z-index="elConfig.zIndex"> |
||||
<router-view /> |
||||
</el-config-provider> |
||||
</template> |
||||
<script setup> |
||||
import zhCn from 'element-plus/es/locale/lang/zh-cn' |
||||
import zhCn from "element-plus/es/locale/lang/zh-cn"; |
||||
|
||||
const elConfig = { |
||||
zIndex: 3000, |
||||
locale: zhCn |
||||
} |
||||
locale: zhCn, |
||||
}; |
||||
</script> |
||||
|
||||
|
||||
@ -0,0 +1,8 @@
|
||||
import request from "@/api/request"; |
||||
|
||||
export function listMailbox(query) { |
||||
return request.get({ |
||||
url: '/data/mailbox', |
||||
query |
||||
}); |
||||
} |
||||
@ -0,0 +1,23 @@
|
||||
import request from "@/api/request"; |
||||
|
||||
|
||||
export function listComfortPacks(query) { |
||||
return request.get({ |
||||
url: `/comfort/packs`, |
||||
query |
||||
}); |
||||
} |
||||
|
||||
export function getComfortPacks(id) { |
||||
return request.get({ |
||||
url: `/comfort/packs/${id}` |
||||
}); |
||||
} |
||||
|
||||
|
||||
export function addComfortPacks(body) { |
||||
return request.post({ |
||||
url: `/comfort/packs`, |
||||
body |
||||
}); |
||||
} |
||||
@ -0,0 +1,30 @@
|
||||
import request from "@/api/request"; |
||||
|
||||
export function listHandleResultMaping(query) { |
||||
return request.get({ |
||||
url: '/handleResultMaping', |
||||
query |
||||
}); |
||||
} |
||||
|
||||
|
||||
export function addHandleResultMaping(body) { |
||||
return request.post({ |
||||
url: '/handleResultMaping', |
||||
body |
||||
}); |
||||
} |
||||
|
||||
|
||||
export function updateHandleResultMaping(body) { |
||||
return request.put({ |
||||
url: '/handleResultMaping', |
||||
body |
||||
}); |
||||
} |
||||
|
||||
export function delHandleResultMaping(id) { |
||||
return request.del({ |
||||
url: '/handleResultMaping/' + id |
||||
}); |
||||
} |
||||
@ -0,0 +1,48 @@
|
||||
import request from "@/api/request"; |
||||
|
||||
export function listVideoConfig(query) { |
||||
return request.get({ |
||||
url: '/videoConfig', |
||||
query |
||||
}); |
||||
} |
||||
|
||||
export function getVideoWsUrl() { |
||||
return request.get({ |
||||
url: '/videoConfig/getVideoWsUrl' |
||||
}); |
||||
} |
||||
|
||||
export function addVideoConfig(body) { |
||||
return request.post({ |
||||
url: '/videoConfig', |
||||
body |
||||
}); |
||||
} |
||||
|
||||
|
||||
export function updateVideoConfig(body) { |
||||
return request.put({ |
||||
url: '/videoConfig', |
||||
body |
||||
}); |
||||
} |
||||
|
||||
export function delVideoConfig(id) { |
||||
return request.del({ |
||||
url: '/videoConfig/' + id |
||||
}); |
||||
} |
||||
|
||||
export function listDevice(query) { |
||||
return request.get({ |
||||
url: '/videoConfig/device', |
||||
query |
||||
}); |
||||
} |
||||
|
||||
export function listVideoConfigByDepartId(departId) { |
||||
return request.get({ |
||||
url: '/videoConfig/depart/' + departId |
||||
}); |
||||
} |
||||
@ -0,0 +1,15 @@
|
||||
import request from "@/api/request"; |
||||
|
||||
export function listMyCountersign(query) { |
||||
return request.get({ |
||||
url: `/work/countersign`, |
||||
query |
||||
}); |
||||
} |
||||
|
||||
export function negativeExport(query) { |
||||
return request.post({ |
||||
url: `/work/countersign/export/excel`, |
||||
query |
||||
}); |
||||
} |
||||
@ -0,0 +1,421 @@
|
||||
<template> |
||||
<div class="file-preview-wrapper flex overlay" v-if="preview"> |
||||
<el-scrollbar height="100vh"> |
||||
<div class="file-list"> |
||||
<section |
||||
v-for="(item, index) in files" |
||||
:key="index" |
||||
class="flex gap v-center pointer" |
||||
:active="files.indexOf(activeFile) === index" |
||||
@click="filePreview(item)" |
||||
> |
||||
<icon :name="getIconName(item.fileName)" :size="24" /> |
||||
<span>{{ item.fileName }}</span> |
||||
</section> |
||||
</div> |
||||
</el-scrollbar> |
||||
<div class="file-content flex center v-center" @click="preview = false"> |
||||
<div |
||||
class="img-container flex center" |
||||
v-if="getFileType(activeFile.fileName) === FileType.IMG" |
||||
@wheel="wheel" |
||||
> |
||||
<img |
||||
:src="`${BASE_PATH}/file/stream/${activeFile.filePath}`" |
||||
ref="imgRef" |
||||
@click.stop |
||||
:style="{ |
||||
transform: `rotate(${rotate}deg) scale(${scale}) translate(${translateX}px, ${translateY}px)`, |
||||
}" |
||||
@mousedown="mousedown" |
||||
@mousemove="mousemove" |
||||
@mouseup="mouseup" |
||||
draggable="false" |
||||
/> |
||||
<button |
||||
class="rotate-left-btn pointer" |
||||
@click.stop.prevent="rotateLeft" |
||||
size="small" |
||||
title="左旋转" |
||||
> |
||||
<icon name="local-icon-rotate-left" :size="28" /> |
||||
</button> |
||||
<button |
||||
class="rotate-right-btn pointer" |
||||
@click.stop.prevent="rotateRight" |
||||
size="small" |
||||
title="右旋转" |
||||
> |
||||
<icon name="local-icon-rotate-right" :size="28" /> |
||||
</button> |
||||
</div> |
||||
<template |
||||
v-else-if="getFileType(activeFile.fileName) === FileType.PDF" |
||||
> |
||||
<iframe |
||||
:src="`${BASE_PATH}/file/stream/${activeFile.filePath}`" |
||||
style="height: 100vh; width: 900px" |
||||
></iframe> |
||||
</template> |
||||
<template |
||||
v-else-if="getFileType(activeFile.fileName) === FileType.MP3" |
||||
> |
||||
<audio controls style="width: 50vw"> |
||||
<source |
||||
:src="`${BASE_PATH}/file/stream/${activeFile.filePath}`" |
||||
type="audio/mp3" |
||||
/> |
||||
</audio> |
||||
</template> |
||||
<template |
||||
v-else-if="getFileType(activeFile.fileName) === FileType.MP4" |
||||
> |
||||
<video controls @click.stop style="max-height: 100vh"> |
||||
<source |
||||
:src="`${BASE_PATH}/file/stream/${activeFile.filePath}`" |
||||
type="video/mp4" |
||||
/> |
||||
</video> |
||||
</template> |
||||
<template |
||||
v-else-if="getFileType(activeFile.fileName) === FileType.WORD" |
||||
> |
||||
<vue-office-docx |
||||
:src="`${BASE_PATH}/file/stream/${activeFile.filePath}`" |
||||
style="height: 100vh; width: 900px" |
||||
@error="fileRrror = true" |
||||
v-if="!fileRrror" |
||||
@click.stop |
||||
/> |
||||
<div v-else class="error flex column text-center"> |
||||
<span style="padding: 20px" |
||||
>文件预览解析错误,如有需要请下载到本地预览</span |
||||
> |
||||
</div> |
||||
</template> |
||||
<template |
||||
v-else-if=" |
||||
getFileType(activeFile.fileName) === FileType.EXCEL && |
||||
activeFile.fileName.toLocaleLowerCase().endsWith('.xlsx') |
||||
" |
||||
> |
||||
<vue-office-excel |
||||
:src="`${BASE_PATH}/file/stream/${activeFile.filePath}`" |
||||
style="height: 100vh; width: 60vw" |
||||
@error="fileRrror = true" |
||||
v-if="!fileRrror" |
||||
@click.stop |
||||
/> |
||||
<div v-else class="error flex column text-center"> |
||||
<span style="padding: 20px" |
||||
>文件预览解析错误,如有需要请下载到本地预览</span |
||||
> |
||||
</div> |
||||
</template> |
||||
<template v-else> |
||||
<div style="background: #fff"> |
||||
<el-result |
||||
icon="error" |
||||
title="不支持预览" |
||||
sub-title="该文件格式暂不支持预览,请下载预览" |
||||
style="background: #fff; width: 600px; height: 400px" |
||||
@click.stop |
||||
> |
||||
<template #extra> |
||||
<el-button |
||||
type="primary" |
||||
text |
||||
size="large" |
||||
@click="download" |
||||
>下载文件</el-button |
||||
> |
||||
</template> |
||||
</el-result> |
||||
</div> |
||||
</template> |
||||
<div class="file-number" @click.stop> |
||||
<span |
||||
>{{ files.indexOf(activeFile) + 1 }} / |
||||
{{ files.length }}</span |
||||
> |
||||
</div> |
||||
<button |
||||
class="left-btn pointer" |
||||
@click.stop.prevent="prev" |
||||
v-if="files.length > 1" |
||||
> |
||||
<icon name="el-icon-ArrowLeftBold" :size="28" /> |
||||
</button> |
||||
<button |
||||
class="right-btn pointer" |
||||
@click.stop.prevent="next" |
||||
v-if="files.length > 1" |
||||
> |
||||
<icon name="el-icon-ArrowRightBold" :size="28" /> |
||||
</button> |
||||
</div> |
||||
<div class="close-btn"></div> |
||||
<button class="close-btn pointer" @click="preview = false"> |
||||
<icon name="el-icon-Close" :size="28" /> |
||||
</button> |
||||
|
||||
<el-button class="download-btn" @click="download" type="primary" plain> |
||||
<template #icon> |
||||
<icon name="el-icon-Download" :size="20" /> |
||||
</template> |
||||
下载文件 |
||||
</el-button> |
||||
</div> |
||||
</template> |
||||
<script setup> |
||||
import { BASE_PATH } from "@/api/request"; |
||||
import { FileType } from "@/enums/fileEnums"; |
||||
import { getFileType, getIconName } from "@/utils/util"; |
||||
import "@vue-office/docx/lib/index.css"; |
||||
import "@vue-office/excel/lib/index.css"; |
||||
|
||||
import VueOfficeDocx from "@vue-office/docx"; |
||||
import VueOfficeExcel from "@vue-office/excel"; |
||||
|
||||
const props = defineProps({ |
||||
files: { |
||||
type: Array, |
||||
default: () => [], |
||||
}, |
||||
show: { |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
}); |
||||
const emit = defineEmits(["update:show"]); |
||||
|
||||
const preview = ref(false); |
||||
const activeFile = ref({}); |
||||
|
||||
watch( |
||||
() => props.show, |
||||
(val) => { |
||||
preview.value = val; |
||||
nextTick(() => { |
||||
if ( |
||||
val && |
||||
Object.keys(activeFile.value).length === 0 && |
||||
props.files.length > 0 |
||||
) { |
||||
activeFile.value = props.files[0]; |
||||
rotate.value = 0; |
||||
scale.value = 1; |
||||
translateX.value = 0; |
||||
translateY.value = 0; |
||||
moveFlag = false; |
||||
} |
||||
}); |
||||
} |
||||
); |
||||
|
||||
watch(preview, (val) => { |
||||
emit("update:show", val); |
||||
}); |
||||
|
||||
const rotate = ref(0); |
||||
const scale = ref(0); |
||||
const translateX = ref(0); |
||||
const translateY = ref(0); |
||||
let moveFlag = false; |
||||
let initialX = 0; |
||||
let initialY = 0; |
||||
const fileRrror = ref(false); |
||||
|
||||
function filePreview(file) { |
||||
preview.value = true; |
||||
activeFile.value = file; |
||||
rotate.value = 0; |
||||
scale.value = 1; |
||||
translateX.value = 0; |
||||
translateY.value = 0; |
||||
moveFlag = false; |
||||
} |
||||
|
||||
function download() { |
||||
window.open(`${BASE_PATH}/file/stream/${activeFile.value.filePath}`); |
||||
} |
||||
|
||||
function prev() { |
||||
const index = props.files.indexOf(activeFile.value); |
||||
if (index === 0) { |
||||
filePreview(props.files[props.files.length - 1]); |
||||
} else { |
||||
filePreview(props.files[index - 1]); |
||||
} |
||||
} |
||||
function next() { |
||||
const index = props.files.indexOf(activeFile.value); |
||||
if (index === props.files.length - 1) { |
||||
filePreview(props.files[0]); |
||||
} else { |
||||
filePreview(props.files[index + 1]); |
||||
} |
||||
} |
||||
|
||||
function wheel(event) { |
||||
if (event.deltaY > 0 && scale.value > 0.5) { |
||||
scale.value -= 0.1; |
||||
} |
||||
if (event.deltaY < 0) { |
||||
scale.value += 0.1; |
||||
} |
||||
} |
||||
|
||||
function mousedown() { |
||||
moveFlag = true; |
||||
initialX = event.clientX; |
||||
initialY = event.clientY; |
||||
} |
||||
function mousemove(event) { |
||||
if (!moveFlag) { |
||||
return; |
||||
} |
||||
if (rotate.value % 360 === 0) { |
||||
translateX.value += event.clientX - initialX; |
||||
translateY.value += event.clientY - initialY; |
||||
} |
||||
if (rotate.value === 90) { |
||||
translateY.value -= event.clientX - initialX; |
||||
translateX.value += event.clientY - initialY; |
||||
} |
||||
if (rotate.value === 180) { |
||||
translateX.value -= event.clientX - initialX; |
||||
translateY.value -= event.clientY - initialY; |
||||
} |
||||
if (rotate.value === 270) { |
||||
translateY.value += event.clientX - initialX; |
||||
translateX.value -= event.clientY - initialY; |
||||
} |
||||
initialX = event.clientX; |
||||
initialY = event.clientY; |
||||
} |
||||
|
||||
function mouseup(event) { |
||||
moveFlag = false; |
||||
} |
||||
|
||||
function rotateLeft() { |
||||
if (rotate.value === 360) { |
||||
rotate.value = 0; |
||||
} else { |
||||
rotate.value += 90; |
||||
} |
||||
} |
||||
|
||||
function rotateRight() { |
||||
if (rotate.value === 0) { |
||||
rotate.value = 270; |
||||
} else { |
||||
rotate.value -= 90; |
||||
} |
||||
} |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
.file-preview-wrapper { |
||||
.file-list { |
||||
width: 15vw; |
||||
height: 100vh; |
||||
padding: 16px 8px; |
||||
background-color: #fff; |
||||
box-sizing: border-box; |
||||
section { |
||||
padding: 8px 16px; |
||||
border: 2px solid transparent; |
||||
background-color: #fff; |
||||
&:hover { |
||||
color: var(--primary-color); |
||||
font-weight: 700; |
||||
} |
||||
&[active="true"] { |
||||
border-color: var(--primary-color); |
||||
} |
||||
span { |
||||
width: calc(100% - 32px); |
||||
overflow: hidden; |
||||
white-space: nowrap; |
||||
text-overflow: ellipsis; |
||||
} |
||||
} |
||||
} |
||||
.file-content { |
||||
width: 86vw; |
||||
position: relative; |
||||
|
||||
.img-container { |
||||
img { |
||||
max-height: 100vh; |
||||
&:hover { |
||||
cursor: pointer; |
||||
} |
||||
} |
||||
} |
||||
.error { |
||||
background-color: #fff; |
||||
img { |
||||
width: 500px; |
||||
} |
||||
} |
||||
} |
||||
.close-btn { |
||||
position: absolute; |
||||
top: 12px; |
||||
right: 8px; |
||||
background-color: transparent; |
||||
border: none; |
||||
color: #fff; |
||||
&:hover { |
||||
color: red; |
||||
} |
||||
} |
||||
.rotate-left-btn { |
||||
position: absolute; |
||||
top: 12px; |
||||
right: 118px; |
||||
background-color: transparent; |
||||
border: none; |
||||
color: #fff; |
||||
} |
||||
.rotate-right-btn { |
||||
position: absolute; |
||||
top: 12px; |
||||
right: 68px; |
||||
background-color: transparent; |
||||
border: none; |
||||
color: #fff; |
||||
} |
||||
.left-btn { |
||||
position: absolute; |
||||
top: 50%; |
||||
left: 0; |
||||
transform: translateY(-50%); |
||||
background-color: transparent; |
||||
border: none; |
||||
color: #fff; |
||||
} |
||||
.right-btn { |
||||
position: absolute; |
||||
top: 50%; |
||||
right: 0; |
||||
transform: translateY(-50%); |
||||
background-color: transparent; |
||||
border: none; |
||||
color: #fff; |
||||
} |
||||
.download-btn { |
||||
position: absolute; |
||||
bottom: 20px; |
||||
right: 20px; |
||||
} |
||||
.file-number { |
||||
position: absolute; |
||||
top: 16px; |
||||
left: 18px; |
||||
color: #fff; |
||||
} |
||||
} |
||||
</style> |
||||
@ -0,0 +1,105 @@
|
||||
<template> |
||||
<div class="table-container"> |
||||
<el-table :data="data"> |
||||
<el-table-column |
||||
label="抚慰编号" |
||||
prop="number" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column label="申请时间" prop="applyDate" width="160" /> |
||||
<el-table-column label="事发时间" prop="happenTime" width="160" /> |
||||
<el-table-column |
||||
label="申请人姓名" |
||||
prop="applicantEmpName" |
||||
width="100" |
||||
/> |
||||
<el-table-column label="申请人单位" prop="departName" /> |
||||
<el-table-column label="开户行"> |
||||
<template #default="{ row }"> |
||||
<span>{{ row.bankCard }}</span> |
||||
<span>{{ row.bankBranch }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="状态" width="100"> |
||||
<template #default="{ row }"> |
||||
<el-tag |
||||
:type=" |
||||
row.rpcStatus !== 'returned' ? 'primary' : 'danger' |
||||
" |
||||
v-if="row.rpcStatus" |
||||
>{{ |
||||
getDictLable(dict.comfortStatus, row.rpcStatus) |
||||
}}</el-tag |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="操作" width="200"> |
||||
<template #default="{ row }"> |
||||
<el-button |
||||
link |
||||
type="primary" |
||||
@click="handleShow(row, false)" |
||||
v-if="row.rpcStatus !== 'returned'" |
||||
>立即处理</el-button |
||||
> |
||||
<template v-else> |
||||
<el-button |
||||
link |
||||
type="primary" |
||||
@click="handleShow(row, true)" |
||||
>查看</el-button |
||||
> |
||||
<!-- <el-button |
||||
link |
||||
type="primary" |
||||
@click="handleReSubmit(row)" |
||||
>重新提交</el-button |
||||
> --> |
||||
<el-button |
||||
link |
||||
type="danger" |
||||
v-if="row.rpcStatus === 'returned'" |
||||
@click="handleDelete(row)" |
||||
>删除</el-button |
||||
> |
||||
</template> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
|
||||
<comfort-dialog |
||||
v-model:show="show" |
||||
:id="activeRpcId" |
||||
:disabled="false" |
||||
@update="emit('update')" |
||||
/> |
||||
</template> |
||||
<script setup> |
||||
import { getDictLable } from "@/utils/util"; |
||||
import useCatchStore from "@/stores/modules/catch"; |
||||
|
||||
const catchStore = useCatchStore(); |
||||
const dict = catchStore.getDicts([ |
||||
"comfortStatus" |
||||
]); |
||||
|
||||
defineProps({ |
||||
data: { |
||||
type: Array, |
||||
default: [], |
||||
}, |
||||
}); |
||||
|
||||
const emit = defineEmits(["update"]); |
||||
|
||||
const show = ref(false); |
||||
const activeRpcId = ref(''); |
||||
|
||||
function handleShow(row) { |
||||
show.value = true; |
||||
activeRpcId.value = row.rpcId; |
||||
} |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
</style> |
||||
@ -0,0 +1,60 @@
|
||||
<template> |
||||
<div ref="playerRef" class="video-container"></div> |
||||
</template> |
||||
<script setup> |
||||
import { nextTick } from "vue"; |
||||
|
||||
|
||||
const props = defineProps({ |
||||
url: { |
||||
type: String, |
||||
default: '' |
||||
}, |
||||
showOperateBtns: { |
||||
type: Boolean, |
||||
default: true |
||||
} |
||||
}) |
||||
|
||||
const playerRef = ref(); |
||||
let jessibucaPlayer; |
||||
onMounted(() => { |
||||
// 调整宽度 |
||||
nextTick(() => { |
||||
playerRef.value.style.height = playerRef.value.scrollWidth * 0.6 + 'px' |
||||
}) |
||||
let operateBtns = {} |
||||
if (props.showOperateBtns) { |
||||
operateBtns = { |
||||
screenshot: true, // 是否启用截图功能 |
||||
fullscreen: true, // 是否启用全屏功能 |
||||
play: true, // 是否启用播放功能 |
||||
audio: true, // 是否启用音频功能 |
||||
record: false, // 是否启用录制功能 |
||||
} |
||||
} |
||||
jessibucaPlayer = new Jessibuca({ |
||||
container: playerRef.value, |
||||
isFlv: true, // 是否使用flv格式 |
||||
showBandwidth: false, // 是否显示带宽使用情况 |
||||
isResize: false, |
||||
operateBtns, |
||||
loadingText: "加载中...", |
||||
}); |
||||
if (props.url) { |
||||
jessibucaPlayer.play(props.url); |
||||
} |
||||
}); |
||||
|
||||
watch(() => props.url, (url) => { |
||||
if (url) { |
||||
jessibucaPlayer.play(url); |
||||
} |
||||
|
||||
}) |
||||
</script> |
||||
<style lang="scss"> |
||||
.video-container { |
||||
background-color: #0d0e1b; |
||||
} |
||||
</style> |
||||
@ -0,0 +1,347 @@
|
||||
<template> |
||||
<div class="container"> |
||||
<header> |
||||
<el-form :label-width="120"> |
||||
<el-row> |
||||
<el-col :span="6"> |
||||
<el-form-item label="问题发现时间"> |
||||
<date-time-range-picker-ext |
||||
v-model="query.discoveryTime" |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="6"> |
||||
<el-form-item label="问题录入时间"> |
||||
<date-time-range-picker-ext |
||||
v-model="query.crtTime" |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
<div class="form-row flex"> |
||||
<label class="text-center">问题信息</label> |
||||
<div class="flex wrap query-box"> |
||||
<el-input |
||||
placeholder="问题编号 / 样本源头编号" |
||||
v-model="query.originId" |
||||
clearable |
||||
style="width: 200px" |
||||
/> |
||||
<el-input |
||||
placeholder="涉及案件 / 警情编号" |
||||
v-model="query.caseNumber" |
||||
clearable |
||||
style="width: 200px" |
||||
/> |
||||
<el-input |
||||
placeholder="事情简要描述" |
||||
v-model="query.thingDesc" |
||||
clearable |
||||
style="width: 260px" |
||||
/> |
||||
<el-select |
||||
style="width: 146px" |
||||
placeholder="业务类别" |
||||
clearable |
||||
v-model="query.businessTypeCode" |
||||
> |
||||
<el-option |
||||
v-for="item in dict.businessType" |
||||
:key="item.id" |
||||
:label="item.dictLabel" |
||||
:value="item.dictValue" |
||||
/> |
||||
</el-select> |
||||
<el-tree-select |
||||
:data="dictProblemSources" |
||||
:props="{ value: 'id' }" |
||||
node-key="id" |
||||
v-model="query.problemSourcesCode" |
||||
clearable |
||||
filterable |
||||
multiple |
||||
collapse-tags |
||||
style="width: 200px" |
||||
placeholder="问题来源" |
||||
/> |
||||
</div> |
||||
</div> |
||||
<div class="form-row flex"> |
||||
<label class="text-center">核查情况</label> |
||||
<div class="flex wrap query-box"> |
||||
<div style="width: 200px"> |
||||
<depart-tree-select |
||||
v-model="query.involveDepartId" |
||||
placeholder="涉及单位" |
||||
/> |
||||
</div> |
||||
<div style="width: 200px"> |
||||
<depart-tree-select |
||||
v-model="query.handleDepartId" |
||||
placeholder="办理单位" |
||||
/> |
||||
</div> |
||||
<el-select |
||||
style="width: 120px" |
||||
placeholder="是否属实" |
||||
clearable |
||||
v-model="query.checkStatus" |
||||
> |
||||
<el-option |
||||
v-for="item in dict.inspectCase" |
||||
:key="item.id" |
||||
:label="item.dictLabel" |
||||
:value="item.dictValue" |
||||
/> |
||||
</el-select> |
||||
<el-select |
||||
style="width: 120px" |
||||
placeholder="是否整改" |
||||
clearable |
||||
v-model="query.isRectifyCode" |
||||
> |
||||
<el-option |
||||
v-for="item in dict.isRectify" |
||||
:key="item.id" |
||||
:label="item.dictLabel" |
||||
:value="item.dictValue" |
||||
/> |
||||
</el-select> |
||||
<div class="flex gap-4"> |
||||
<el-select |
||||
v-model="query.blameKey" |
||||
style="width: 90px" |
||||
@change="delete query.blameValue" |
||||
> |
||||
<el-option value="name" label="姓名" /> |
||||
<el-option value="empNo" label="警号" /> |
||||
<el-option value="idCode" label="身份证" /> |
||||
</el-select> |
||||
<el-input |
||||
placeholder="涉及人员" |
||||
v-model="query.blameValue" |
||||
clearable |
||||
style="width: 190px" |
||||
/> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class="form-row flex"> |
||||
<label class="text-center">其他选项</label> |
||||
<div class="flex wrap query-box"> |
||||
<el-select |
||||
style="width: 200px" |
||||
placeholder="流程阶段" |
||||
clearable |
||||
v-model="query.flowKey" |
||||
> |
||||
<el-option |
||||
v-for="item in flowNodes" |
||||
:key="item.flowKey" |
||||
:label="item.flowName" |
||||
:value="item.flowKey" |
||||
/> |
||||
</el-select> |
||||
<el-select |
||||
style="width: 120px" |
||||
placeholder="办理状态" |
||||
clearable |
||||
v-model="query.processingStatus" |
||||
multiple |
||||
> |
||||
<el-option |
||||
v-for="item in dict.processingStatus" |
||||
:key="item.id" |
||||
:label="item.dictLabel" |
||||
:value="item.dictValue" |
||||
/> |
||||
</el-select> |
||||
|
||||
<el-select |
||||
style="width: 160px" |
||||
placeholder="办理中是否超时" |
||||
clearable |
||||
v-model="query.handleTimeoutFlag" |
||||
> |
||||
<el-option label="未超时" :value="false" /> |
||||
<el-option label="已超时" :value="true" /> |
||||
</el-select> |
||||
|
||||
<el-select |
||||
style="width: 140px" |
||||
placeholder="办结是否超时" |
||||
clearable |
||||
v-model="query.timeoutFlag" |
||||
> |
||||
<el-option label="办结未超时" :value="false" /> |
||||
<el-option label="办结超时" :value="true" /> |
||||
</el-select> |
||||
<el-select |
||||
style="width: 120px" |
||||
placeholder="申请延期" |
||||
clearable |
||||
v-model="query.extensionFlag" |
||||
> |
||||
<el-option label="已申请" :value="true" /> |
||||
<el-option label="未申请" :value="false" /> |
||||
</el-select> |
||||
</div> |
||||
</div> |
||||
</el-form> |
||||
<div class="flex between mt-20 mb-26"> |
||||
<el-button type="primary" @click="handleExport" |
||||
>数据导出 |
||||
</el-button> |
||||
<div> |
||||
<el-button type="primary" @click="getList"> |
||||
<template #icon |
||||
><icon name="el-icon-Search" |
||||
/></template> |
||||
查询</el-button |
||||
> |
||||
<el-button @click="reset">重置</el-button> |
||||
</div> |
||||
</div> |
||||
</header> |
||||
<div class="table-container"> |
||||
<el-table :data="list"> |
||||
<el-table-column |
||||
label="业务类型" |
||||
prop="businessTypeName" |
||||
width="140" |
||||
/> |
||||
<el-table-column |
||||
label="问题来源" |
||||
prop="problemSources" |
||||
width="160" |
||||
/> |
||||
<el-table-column |
||||
label="问题发现时间" |
||||
prop="discoveryTime" |
||||
width="160" |
||||
/> |
||||
<el-table-column |
||||
label="案件/警情编号" |
||||
prop="caseNumber" |
||||
width="160" |
||||
/> |
||||
<el-table-column |
||||
label="具体内容" |
||||
prop="thingDesc" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="整改情况" |
||||
prop="rectifyDesc" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="涉及单位" |
||||
prop="involveDepartName" |
||||
width="180" |
||||
/> |
||||
<el-table-column label="办理单位" show-overflow-tooltip> |
||||
<template #default="{ row }"> |
||||
<span |
||||
>{{ row.handleSecondDepartName |
||||
}}{{ row.handleThreeDepartName }}</span |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="操作" width="120"> |
||||
<template #default="{ row }"> |
||||
<el-button |
||||
type="primary" |
||||
link |
||||
@click="handleAction(row)" |
||||
>详情</el-button |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<div class="flex end mt-8"> |
||||
<el-pagination |
||||
@size-change="getList" |
||||
@current-change="getList" |
||||
:page-sizes="[10, 20, 50]" |
||||
v-model:page-size="query.size" |
||||
v-model:current-page="query.current" |
||||
layout="total, sizes, prev, pager, next" |
||||
:total="total" |
||||
> |
||||
</el-pagination> |
||||
</div> |
||||
</div> |
||||
|
||||
<negative-dialog |
||||
v-model="show" |
||||
:id="activeNegativeId" |
||||
@close="show = false" |
||||
/> |
||||
</template> |
||||
|
||||
<script setup> |
||||
import { BASE_PATH } from "@/api/request"; |
||||
import { ProblemSources } from "@/enums/dictEnums"; |
||||
import feedback from "@/utils/feedback"; |
||||
|
||||
import { getDictLable } from "@/utils/util"; |
||||
|
||||
import useCatchStore from "@/stores/modules/catch"; |
||||
import { listNegativeAudit } from "@/api/books.ts"; |
||||
|
||||
const catchStore = useCatchStore(); |
||||
const flowNodes = catchStore.getFlowNodes(); |
||||
const dictProblemSources = catchStore.getDictProblemSources(); |
||||
const dict = catchStore.getDicts([ |
||||
"inspectCase", |
||||
"businessType", |
||||
"processingStatus", |
||||
"isRectify" |
||||
]); |
||||
|
||||
const query = ref({ |
||||
size: 10, |
||||
current: 1, |
||||
blameKey: "name", |
||||
}); |
||||
|
||||
const list = ref([]); |
||||
const total = ref(0); |
||||
|
||||
function getList() { |
||||
listNegativeAudit(query.value).then((data) => { |
||||
list.value = data.records; |
||||
total.value = data.total; |
||||
}); |
||||
} |
||||
|
||||
function reset() { |
||||
query.value = { |
||||
size: 10, |
||||
current: 1, |
||||
blameKey: "name", |
||||
}; |
||||
getList(); |
||||
} |
||||
|
||||
getList(); |
||||
|
||||
function handleExport() { |
||||
window.open( |
||||
`${BASE_PATH}/negative/books/export/audit?` + |
||||
new URLSearchParams(query.value).toString() |
||||
); |
||||
} |
||||
|
||||
const show = ref(false); |
||||
const activeNegativeId = ref(""); |
||||
|
||||
function handleAction(row) { |
||||
show.value = true; |
||||
activeNegativeId.value = row.id; |
||||
} |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
</style> |
||||
@ -1,9 +1,192 @@
|
||||
<template> |
||||
<div class="container"> |
||||
<header> |
||||
<el-form :label-width="114"> |
||||
<el-row> |
||||
<el-col :span="6"> |
||||
<el-form-item label="投诉人"> |
||||
<div class="flex gap"> |
||||
<el-select |
||||
v-model="query.responderKey" |
||||
style="width: 160px" |
||||
@change="delete query.responderValue" |
||||
> |
||||
<el-option value="name" label="姓名" /> |
||||
<el-option value="phone" label="电话" /> |
||||
</el-select> |
||||
<el-input |
||||
placeholder="请输入" |
||||
v-model="query.responderValue" |
||||
clearable |
||||
/> |
||||
</div> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="6"> |
||||
<el-form-item label="登记时间"> |
||||
<date-time-range-picker-ext |
||||
v-model="query.discoverTime" |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="6"> |
||||
<el-form-item label="具体内容"> |
||||
<el-input |
||||
placeholder="请输入" |
||||
v-model="query.thingDesc" |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
</el-form> |
||||
<div class="mb-25 flex between"> |
||||
<div> |
||||
<el-button type="primary" @click="handleExport" |
||||
>数据导出 |
||||
</el-button> |
||||
</div> |
||||
<div> |
||||
<el-button type="primary" @click="getList"> |
||||
<template #icon> |
||||
<icon name="el-icon-Search" /> |
||||
</template> |
||||
查询 |
||||
</el-button> |
||||
<el-button @click="reset">重置</el-button> |
||||
</div> |
||||
</div> |
||||
</header> |
||||
<div class="table-container"> |
||||
<el-table :data="list"> |
||||
<el-table-column |
||||
label="信件编号" |
||||
prop="onlyId" |
||||
show-overflow-tooltip |
||||
width="180" |
||||
/> |
||||
<el-table-column |
||||
label="投诉渠道" |
||||
prop="letterSource" |
||||
width="120" |
||||
/> |
||||
|
||||
<el-table-column |
||||
label="登记时间" |
||||
prop="discoverTime" |
||||
width="150" |
||||
/> |
||||
<el-table-column label="投诉人" prop="name" width="90" /> |
||||
<el-table-column label="电话" prop="phone" width="116" /> |
||||
|
||||
<el-table-column label="被投诉机构" show-overflow-tooltip> |
||||
<template #default="{ row }"> |
||||
<span>{{ row.secondDepartName }}</span> |
||||
<span>{{ row.thirdDepartName }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column |
||||
label="具体内容" |
||||
prop="wjwfProject" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="是否属实" |
||||
prop="checkStatusName" |
||||
width="120" |
||||
/> |
||||
<el-table-column |
||||
label="核查简要情况" |
||||
prop="checkStatusDesc" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column label="操作" width="120"> |
||||
<template #default="{ row }"> |
||||
<el-button |
||||
type="primary" |
||||
link |
||||
@click="handleAction(row)" |
||||
:disabled="!row.id" |
||||
>详情</el-button |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<div class="flex end mt-8"> |
||||
<el-pagination |
||||
@size-change="getList" |
||||
@current-change="getList" |
||||
:page-sizes="[10, 20, 50]" |
||||
v-model:page-size="query.size" |
||||
v-model:current-page="query.current" |
||||
layout="total, sizes, prev, pager, next" |
||||
:total="total" |
||||
> |
||||
</el-pagination> |
||||
</div> |
||||
</div> |
||||
|
||||
<negative-dialog |
||||
v-model="show" |
||||
:id="activeNegativeId" |
||||
@close="show = false" |
||||
/> |
||||
</template> |
||||
|
||||
<script setup> |
||||
import { BASE_PATH } from "@/api/request"; |
||||
import { ProblemSources } from "@/enums/dictEnums"; |
||||
import feedback from "@/utils/feedback"; |
||||
|
||||
import { getDictLable } from "@/utils/util"; |
||||
|
||||
import useCatchStore from "@/stores/modules/catch"; |
||||
import { listPetitionComplaint12337Books } from "@/api/data/petition12337.ts"; |
||||
|
||||
const catchStore = useCatchStore(); |
||||
const dict = catchStore.getDicts(["distributionState", "inspectCase"]); |
||||
|
||||
const query = ref({ |
||||
size: 10, |
||||
current: 1, |
||||
responderKey: "name", |
||||
}); |
||||
|
||||
const list = ref([]); |
||||
const total = ref(0); |
||||
|
||||
function getList() { |
||||
listPetitionComplaint12337Books(query.value).then((data) => { |
||||
list.value = data.records; |
||||
total.value = data.total; |
||||
}); |
||||
} |
||||
|
||||
function reset() { |
||||
query.value = { |
||||
size: 10, |
||||
current: 1, |
||||
responderKey: "name", |
||||
}; |
||||
getList(); |
||||
} |
||||
|
||||
getList(); |
||||
|
||||
function handleExport() { |
||||
window.open( |
||||
`${BASE_PATH}/negative/books/export/mail12337?` + |
||||
new URLSearchParams(query.value).toString() |
||||
); |
||||
} |
||||
|
||||
const show = ref(false); |
||||
const activeNegativeId = ref(""); |
||||
|
||||
function handleAction(row) { |
||||
show.value = true; |
||||
activeNegativeId.value = row.id; |
||||
} |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
|
||||
</style> |
||||
@ -0,0 +1,129 @@
|
||||
<template> |
||||
<div class="container"> |
||||
<header> |
||||
<el-form :label-width="120"> |
||||
<el-row> |
||||
<el-col :span="6"> |
||||
<el-form-item label="数据来源"> |
||||
<el-select v-model="query.source" clearable> |
||||
<el-option value="公安部信访">公安部信访</el-option> |
||||
<el-option value="国家信访">国家信访</el-option> |
||||
<el-option value="案件核查">案件核查</el-option> |
||||
</el-select> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="6"> |
||||
<el-form-item label="创建时间"> |
||||
<date-time-range-picker-ext v-model="query.crtTime"/> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
</el-form> |
||||
<div class="flex end mb-20"> |
||||
<el-button type="primary" @click="getList"> |
||||
<template #icon> |
||||
<icon name="el-icon-Search" /> |
||||
</template> |
||||
查询</el-button |
||||
> |
||||
<el-button @click="reset">重置</el-button> |
||||
</div> |
||||
</header> |
||||
<div class="table-container" v-loading="loading"> |
||||
<el-table :data="list"> |
||||
<el-table-column label="数据来源" prop="source" show-overflow-tooltip /> |
||||
<el-table-column |
||||
label="导入数量" |
||||
prop="importRow" |
||||
align="center" |
||||
/> |
||||
<el-table-column label="操作时间" prop="crtTime" /> |
||||
<el-table-column label="操作人" prop="crtUser" /> |
||||
<el-table-column label="状态" prop="status"> |
||||
<template #default="{ row }"> |
||||
<el-tag type="success" v-if="row.status === '0'" |
||||
>导入成功</el-tag |
||||
> |
||||
<el-tag type="danger" v-else-if="row.status === '1'" |
||||
>导入失败</el-tag |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<div class="flex end mt-8"> |
||||
<el-pagination |
||||
@size-change="getList" |
||||
@current-change="getList" |
||||
:page-sizes="[10, 20, 50]" |
||||
v-model:page-size="query.size" |
||||
v-model:current-page="query.current" |
||||
layout="total, sizes, prev, pager, next" |
||||
:total="total" |
||||
> |
||||
</el-pagination> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
<script setup> |
||||
import { BASE_PATH } from "@/api/request"; |
||||
import { listNegativeTask } from "@/api/work/negativeTask"; |
||||
|
||||
const list = ref([]); |
||||
const query = ref({ |
||||
size: 10, |
||||
current: 1, |
||||
category: '1' |
||||
}); |
||||
const total = ref(0); |
||||
|
||||
const loading = ref(true) |
||||
function getList() { |
||||
loading.value = true |
||||
listNegativeTask(query.value).then((data) => { |
||||
list.value = data.records; |
||||
total.value = data.total; |
||||
loading.value = false |
||||
}); |
||||
} |
||||
|
||||
function reset() { |
||||
query.value = { |
||||
size: 10, |
||||
current: 1, |
||||
category: '1' |
||||
}; |
||||
getList(); |
||||
} |
||||
|
||||
onMounted(() => { |
||||
getList(); |
||||
}); |
||||
|
||||
function handleDownload(row) { |
||||
if (row.status !== '1') { |
||||
|
||||
} |
||||
fetch(`${BASE_PATH}/file/stream${row.filePath}`) |
||||
.then((response) => { |
||||
console.log(response); |
||||
return response.blob(); |
||||
}) |
||||
.then((res) => { |
||||
console.log(res); |
||||
const blob = new Blob([res], { |
||||
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
||||
}); |
||||
const url = window.URL.createObjectURL(blob); |
||||
const link = document.createElement("a"); |
||||
link.href = url; |
||||
link.setAttribute("download", row.taskName + ".xlsx"); |
||||
document.body.appendChild(link); |
||||
link.click(); |
||||
document.body.removeChild(link); |
||||
window.URL.revokeObjectURL(url); |
||||
}); |
||||
} |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
</style> |
||||
@ -0,0 +1,196 @@
|
||||
<template> |
||||
<div class="container"> |
||||
<header> |
||||
<el-form :label-width="114"> |
||||
<el-row> |
||||
<el-col :span="6"> |
||||
<el-form-item label="信件编号"> |
||||
<el-input |
||||
placeholder="请输入" |
||||
v-model="query.originId" |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="6"> |
||||
<el-form-item label="投诉人"> |
||||
<div class="flex gap"> |
||||
<el-select |
||||
v-model="query.responderKey" |
||||
style="width: 160px" |
||||
@change="delete query.responderValue" |
||||
> |
||||
<el-option value="name" label="姓名" /> |
||||
<el-option value="phone" label="电话" /> |
||||
</el-select> |
||||
<el-input |
||||
placeholder="请输入" |
||||
v-model="query.responderValue" |
||||
clearable |
||||
/> |
||||
</div> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="6"> |
||||
<el-form-item label="来信时间"> |
||||
<date-time-range-picker-ext |
||||
v-model="query.discoveryTime" |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="6"> |
||||
<el-form-item label="具体内容"> |
||||
<el-input |
||||
placeholder="请输入" |
||||
v-model="query.thingDesc" |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
</el-form> |
||||
<div class="mb-25 flex end"> |
||||
<div> |
||||
<el-button type="primary" @click="getList"> |
||||
<template #icon> |
||||
<icon name="el-icon-Search" /> |
||||
</template> |
||||
查询</el-button |
||||
> |
||||
<el-button @click="reset">重置</el-button> |
||||
</div> |
||||
</div> |
||||
</header> |
||||
<div class="table-container"> |
||||
<el-table :data="list"> |
||||
<el-table-column |
||||
label="信件编号" |
||||
prop="originId" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="来信时间" |
||||
prop="discoveryTime" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="投诉人" |
||||
prop="responderName" |
||||
width="90" |
||||
/> |
||||
<el-table-column label="电话" prop="contactPhone" /> |
||||
<el-table-column |
||||
label="具体内容" |
||||
prop="thingDesc" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column label="办理单位" show-overflow-tooltip> |
||||
<template #default="{ row }"> |
||||
<span>{{ row.handleSecondDepartName }}</span> |
||||
<span>{{ row.handleThreeDepartName }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column |
||||
label="是否属实" |
||||
prop="checkStatusName" |
||||
width="100" |
||||
align="center" |
||||
/> |
||||
<el-table-column label="办理状态" width="110"> |
||||
<template #default="{ row }"> |
||||
<el-tag |
||||
:type=" |
||||
row.processingStatus === |
||||
ProcessingStatus.COMPLETED |
||||
? 'success' |
||||
: 'primary' |
||||
" |
||||
v-if="row.processingStatus" |
||||
>{{ |
||||
getDictLable( |
||||
dict.processingStatus, |
||||
row.processingStatus |
||||
) |
||||
}}</el-tag |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="操作" width="200"> |
||||
<template #default="{ row }"> |
||||
<el-button |
||||
type="primary" |
||||
link |
||||
@click="handleAction(row)" |
||||
>详情</el-button |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<div class="flex end mt-8"> |
||||
<el-pagination |
||||
@size-change="getList" |
||||
@current-change="getList" |
||||
:page-sizes="[10, 20, 50]" |
||||
v-model:page-size="query.size" |
||||
v-model:current-page="query.current" |
||||
layout="total, sizes, prev, pager, next" |
||||
:total="total" |
||||
> |
||||
</el-pagination> |
||||
</div> |
||||
</div> |
||||
|
||||
<negative-dialog |
||||
v-model="show" |
||||
:id="activeNegativeId" |
||||
@close="show = false" |
||||
/> |
||||
</template> |
||||
<script setup> |
||||
import { ProcessingStatus } from "@/enums/flowEnums"; |
||||
import { |
||||
listMailbox |
||||
} from "@/api/data/mailbox"; |
||||
import feedback from "@/utils/feedback"; |
||||
import { getDictLable } from "@/utils/util"; |
||||
import useCatchStore from "@/stores/modules/catch"; |
||||
|
||||
const catchStore = useCatchStore(); |
||||
const dict = catchStore.getDicts(["distributionState"]); |
||||
|
||||
const query = ref({ |
||||
size: 10, |
||||
current: 1, |
||||
responderKey: "name", |
||||
}); |
||||
|
||||
const list = ref([]); |
||||
const total = ref(0); |
||||
function getList() { |
||||
listMailbox(query.value).then((data) => { |
||||
list.value = data.records; |
||||
total.value = data.total; |
||||
}); |
||||
} |
||||
|
||||
function reset() { |
||||
query.value = { |
||||
size: 10, |
||||
current: 1, |
||||
responderKey: "name", |
||||
}; |
||||
getList(); |
||||
} |
||||
|
||||
getList(); |
||||
|
||||
const show = ref(false); |
||||
const activeNegativeId = ref(""); |
||||
|
||||
function handleAction(row) { |
||||
show.value = true; |
||||
activeNegativeId.value = row.id; |
||||
} |
||||
|
||||
</script> |
||||
<style lang="scss" scoped> |
||||
</style> |
||||
@ -0,0 +1,445 @@
|
||||
<template> |
||||
<div class="container"> |
||||
<header class="mb-20"> |
||||
<el-form :label-width="114"> |
||||
<el-row> |
||||
<el-col :span="6"> |
||||
<el-form-item label="呈报时间"> |
||||
<date-time-range-picker-ext |
||||
v-model="query.reportTime" |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="6"> |
||||
<el-form-item label="呈报说明"> |
||||
<el-input |
||||
v-model="query.reportTitle" |
||||
placeholder="请输入" |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
</el-form> |
||||
<div class="flex between"> |
||||
<el-button type="primary" @click="handleAdd"> |
||||
<template #icon> |
||||
<icon name="el-icon-Plus" /> |
||||
</template> |
||||
新增抚慰金呈报</el-button |
||||
> |
||||
<div> |
||||
<el-button type="primary" @click="getList"> |
||||
<template #icon> |
||||
<icon name="el-icon-Search" /> |
||||
</template> |
||||
查询</el-button |
||||
> |
||||
<el-button @click="reset">重置</el-button> |
||||
</div> |
||||
</div> |
||||
</header> |
||||
<div class="table-container"> |
||||
<el-table :data="list"> |
||||
<el-table-column |
||||
label="呈报说明" |
||||
prop="reportTitle" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="呈报人数" |
||||
prop="reportNum" |
||||
align="center" |
||||
/> |
||||
<el-table-column label="呈报金额" prop="reportMoney" /> |
||||
<el-table-column label="呈报时间" prop="reportTime" /> |
||||
<el-table-column label="操作" width="200"> |
||||
<template #default="{ row }"> |
||||
<el-button |
||||
link |
||||
type="primary" |
||||
@click="handleShowDetail(row)" |
||||
>查看</el-button |
||||
> |
||||
<el-button link type="primary" @click="download(row)" |
||||
>下载呈报件</el-button |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<div class="flex end mt-8"> |
||||
<el-pagination |
||||
@size-change="getList" |
||||
@current-change="getList" |
||||
:page-sizes="[10, 20, 50]" |
||||
v-model:page-size="query.size" |
||||
v-model:current-page="query.current" |
||||
layout="total, sizes, prev, pager, next" |
||||
:total="total" |
||||
> |
||||
</el-pagination> |
||||
</div> |
||||
</div> |
||||
|
||||
<el-dialog |
||||
v-model="show" |
||||
title="新增抚慰金呈报" |
||||
width="70vw" |
||||
top="3vh" |
||||
style="margin-bottom: 0" |
||||
> |
||||
<el-table |
||||
:data="comforts" |
||||
style="height: 500px" |
||||
ref="comfortTableRef" |
||||
@selection-change="handleSelectionChange" |
||||
> |
||||
<el-table-column |
||||
type="selection" |
||||
:reserve-selection="false" |
||||
width="55" |
||||
/> |
||||
<el-table-column |
||||
label="抚慰编号" |
||||
prop="number" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column label="申请时间" prop="applyDate" width="160" /> |
||||
<el-table-column label="事发时间" prop="happenTime" width="160" /> |
||||
<el-table-column |
||||
label="申请人姓名" |
||||
prop="applicantEmpName" |
||||
width="100" |
||||
/> |
||||
|
||||
<el-table-column label="申请人单位" prop="departName" /> |
||||
<el-table-column |
||||
label="受伤程度" |
||||
prop="injurySeverityName" |
||||
width="120" |
||||
/> |
||||
<el-table-column |
||||
label="抚慰金额" |
||||
prop="injurySeverity" |
||||
width="100" |
||||
align="center" |
||||
> |
||||
<template #default="{ row }"> |
||||
<span v-if="row.injurySeverity" |
||||
>{{ row.injurySeverity }}元</span |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="状态" width="100"> |
||||
<template #default="{ row }"> |
||||
<el-tag type="primary">{{ |
||||
getDictLable(dict.comfortStatus, row.rpcStatus) |
||||
}}</el-tag> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
<div class="flex end mt-8 mb-20"> |
||||
<el-pagination |
||||
@size-change="getComfort" |
||||
@current-change="getComfort" |
||||
:page-sizes="[10, 20, 50]" |
||||
v-model:page-size="comfortQuery.size" |
||||
v-model:current-page="comfortQuery.current" |
||||
layout="total, sizes, prev, pager, next" |
||||
:total="comfortTotal" |
||||
> |
||||
</el-pagination> |
||||
</div> |
||||
<el-form label-width="160" ref="formRef" :model="formData"> |
||||
<el-form-item |
||||
label="呈报人数" |
||||
prop="comforts" |
||||
:rules="{ |
||||
required: true, |
||||
validator: validateComforts, |
||||
}" |
||||
> |
||||
<span>{{ formData.comforts.length }}人</span> |
||||
</el-form-item> |
||||
<el-form-item label="呈报金额"> |
||||
{{ |
||||
formData.comforts.length > 0 |
||||
? formData.comforts |
||||
.map((item) => parseInt(item.injurySeverity)) |
||||
.reduce((a, b) => a + b, 0) |
||||
: 0 |
||||
}}元 |
||||
</el-form-item> |
||||
<el-form-item |
||||
label="呈报说明" |
||||
prop="reportTitle" |
||||
:rules="{ |
||||
required: true, |
||||
message: '请输入呈报说明', |
||||
}" |
||||
> |
||||
<el-input |
||||
type="textarea" |
||||
v-model="formData.reportTitle" |
||||
clearable |
||||
/> |
||||
</el-form-item> |
||||
</el-form> |
||||
|
||||
<footer class="flex end mt-20"> |
||||
<el-button size="large">取消</el-button> |
||||
<el-button |
||||
type="primary" |
||||
size="large" |
||||
@click="handleSubmit" |
||||
:disabled="disabled" |
||||
>提交呈报</el-button |
||||
> |
||||
</footer> |
||||
</el-dialog> |
||||
|
||||
<el-dialog |
||||
v-model="detailShow" |
||||
title="抚慰金呈报详情" |
||||
width="70vw" |
||||
top="3vh" |
||||
style="margin-bottom: 0" |
||||
> |
||||
<div style="min-height: 500px"> |
||||
<div class="table-container mb-40"> |
||||
<el-table |
||||
:data="comfortPack.comforts" |
||||
style="max-height: 500px" |
||||
> |
||||
<el-table-column |
||||
label="抚慰编号" |
||||
prop="number" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="申请时间" |
||||
prop="applyDate" |
||||
width="160" |
||||
/> |
||||
<el-table-column |
||||
label="事发时间" |
||||
prop="happenTime" |
||||
width="160" |
||||
/> |
||||
<el-table-column |
||||
label="申请人姓名" |
||||
prop="applicantEmpName" |
||||
width="100" |
||||
/> |
||||
|
||||
<el-table-column label="申请人单位" prop="departName" /> |
||||
<el-table-column |
||||
label="受伤程度" |
||||
prop="injurySeverityName" |
||||
width="120" |
||||
/> |
||||
<el-table-column |
||||
label="抚慰金额" |
||||
prop="injurySeverity" |
||||
width="100" |
||||
align="center" |
||||
> |
||||
<template #default="{ row }"> |
||||
<span v-if="row.injurySeverity" |
||||
>{{ row.injurySeverity }}元</span |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column |
||||
label="操作" |
||||
width="100" |
||||
> |
||||
<template #default="{ row }"> |
||||
<el-button |
||||
link |
||||
type="primary" |
||||
@click="handleComfortShow(row)" |
||||
>查看</el-button |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<div class="row"> |
||||
<div class="col col-12"> |
||||
<label>呈报人数</label> |
||||
<span>{{ comfortPack.reportNum }}</span> |
||||
</div> |
||||
<div class="col col-12"> |
||||
<label>呈报金额</label> |
||||
<span>{{ comfortPack.reportMoney }}</span> |
||||
</div> |
||||
<div class="col col-24"> |
||||
<label>呈报说明</label> |
||||
<span>{{ comfortPack.reportTitle }}</span> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</el-dialog> |
||||
|
||||
<comfort-dialog v-model:show="actionShow" :id="activeRpcId" /> |
||||
</template> |
||||
<script setup> |
||||
import { BASE_PATH } from "@/api/request"; |
||||
import moment from "moment"; |
||||
import { |
||||
listComfortPacks, |
||||
addComfortPacks, |
||||
getComfortPacks, |
||||
} from "@/api/rightsComfort/comfortPacks"; |
||||
import { listComfort } from "@/api/rightsComfort/comfort"; |
||||
import { listPolice } from "@/api/system/police"; |
||||
import { getDictLable } from "@/utils/util"; |
||||
import feedback from "@/utils/feedback"; |
||||
|
||||
import useCatchStore from "@/stores/modules/catch"; |
||||
import { nextTick } from "vue"; |
||||
|
||||
const catchStore = useCatchStore(); |
||||
const dict = catchStore.getDicts(["comfortStatus"]); |
||||
|
||||
const list = ref([]); |
||||
const query = ref({ |
||||
current: 1, |
||||
size: 10, |
||||
}); |
||||
const total = ref(0); |
||||
function getList() { |
||||
listComfortPacks(query.value).then((data) => { |
||||
list.value = data.records; |
||||
total.value = data.total; |
||||
}); |
||||
} |
||||
|
||||
function reset() { |
||||
query.value = { |
||||
current: 1, |
||||
size: 10, |
||||
}; |
||||
getList(); |
||||
} |
||||
|
||||
getList(); |
||||
|
||||
const actionShow = ref(false); |
||||
const activeRpcId = ref(''); |
||||
|
||||
async function handleComfortShow(row) { |
||||
actionShow.value = true; |
||||
activeRpcId.value = row.rpcId; |
||||
} |
||||
|
||||
const show = ref(false); |
||||
const comforts = ref([]); |
||||
|
||||
const comfortQuery = ref({ |
||||
current: 1, |
||||
size: 10, |
||||
rpcStatus: "to_be_reported", |
||||
}); |
||||
|
||||
const comfortTableRef = ref(); |
||||
const comfortTotal = ref(0); |
||||
async function handleAdd() { |
||||
show.value = true; |
||||
await getComfort(); |
||||
} |
||||
|
||||
let lock = false; |
||||
async function getComfort() { |
||||
const data = await listComfort(comfortQuery.value); |
||||
comforts.value = data.records; |
||||
comfortTotal.value = data.total; |
||||
nextTick(() => { |
||||
lock = true; |
||||
comforts.value.forEach((item) => { |
||||
if (formData.value.comforts.some((o) => o.rpcId === item.rpcId)) { |
||||
comfortTableRef.value.toggleRowSelection(item, true); |
||||
} |
||||
}); |
||||
lock = false; |
||||
}); |
||||
} |
||||
|
||||
const formRef = ref(); |
||||
const formData = ref({ |
||||
comforts: [], |
||||
}); |
||||
|
||||
function handleSelectionChange(selection) { |
||||
if (lock) { |
||||
return; |
||||
} |
||||
selection.forEach((item) => { |
||||
if (!formData.value.comforts.some((o) => o.rpcId === item.rpcId)) { |
||||
formData.value.comforts.push(item); |
||||
} |
||||
}); |
||||
comforts.value |
||||
.filter((item) => !selection.some((o) => o.rpcId === item.rpcId)) |
||||
.forEach((item) => { |
||||
const obj = formData.value.comforts.find( |
||||
(o) => o.rpcId === item.rpcId |
||||
); |
||||
if (obj) { |
||||
formData.value.comforts.splice( |
||||
formData.value.comforts.indexOf(obj), |
||||
1 |
||||
); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
function validateComforts(rule, value, cb) { |
||||
if (value.length === 0) { |
||||
cb(new Error("请选择呈报人")); |
||||
} else { |
||||
cb(); |
||||
} |
||||
} |
||||
|
||||
const disabled = ref(false); |
||||
async function handleSubmit() { |
||||
await formRef.value.validate(); |
||||
disabled.value = true; |
||||
try { |
||||
await addComfortPacks(formData.value); |
||||
} catch (e) { |
||||
disabled.value = false; |
||||
return; |
||||
} |
||||
disabled.value = false; |
||||
formData.value = { |
||||
comforts: [], |
||||
}; |
||||
show.value = false; |
||||
getList(); |
||||
feedback.msgSuccess("操作成功"); |
||||
} |
||||
|
||||
function download(row) { |
||||
window.open(`${BASE_PATH}/file/stream/${row.reportZip}`); |
||||
} |
||||
|
||||
const detailShow = ref(false); |
||||
const comfortPack = ref({ |
||||
comforts: [], |
||||
}); |
||||
const detailLoading = ref(false); |
||||
async function handleShowDetail(row) { |
||||
detailShow.value = true; |
||||
detailLoading.value = true; |
||||
comfortPack.value = await getComfortPacks(row.id); |
||||
detailLoading.value = false; |
||||
} |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
h5 { |
||||
margin: 10px 0; |
||||
} |
||||
</style> |
||||
@ -0,0 +1,251 @@
|
||||
<template> |
||||
<div class="container"> |
||||
<header> |
||||
<el-row> |
||||
<el-col :span="12"> |
||||
<div class="form-row flex"> |
||||
<label class="text-center">局长信箱</label> |
||||
<div class="flex wrap query-box"> |
||||
<el-input |
||||
placeholder="处理结果" |
||||
v-model="query.originId" |
||||
clearable |
||||
style="width: 280px" |
||||
/> |
||||
</div> |
||||
</div> |
||||
</el-col> |
||||
<el-col :span="12"> |
||||
<div class="form-row flex"> |
||||
<label class="text-center">数字督察</label> |
||||
<div class="flex wrap query-box"> |
||||
<el-select |
||||
v-model="query.handleResultCode" |
||||
style="width: 280px" |
||||
clearable |
||||
> |
||||
<el-option |
||||
v-for="item in dict.handleResult" |
||||
:key="item.dictCode" |
||||
:value="item.dictValue" |
||||
:label="item.dictLabel" |
||||
/> |
||||
</el-select> |
||||
</div> |
||||
</div> |
||||
</el-col> |
||||
</el-row> |
||||
<div class="flex between mt-20 mb-26"> |
||||
<el-button type="primary" @click="handleAdd"> |
||||
<template #icon><icon name="el-icon-Plus" /></template> |
||||
新增</el-button |
||||
> |
||||
<div> |
||||
<el-button type="primary" @click="getList"> |
||||
<template #icon |
||||
><icon name="el-icon-Search" |
||||
/></template> |
||||
查询</el-button |
||||
> |
||||
<el-button @click="reset">重置</el-button> |
||||
</div> |
||||
</div> |
||||
</header> |
||||
<div class="table-container"> |
||||
<el-table :data="list"> |
||||
<el-table-column label="局长信箱处理结果" prop="externalName" /> |
||||
<el-table-column label="数字督察处理结果" prop="internalName" /> |
||||
<el-table-column |
||||
label="最后修改时间" |
||||
prop="updateTime" |
||||
width="160" |
||||
/> |
||||
<el-table-column label="操作" width="160"> |
||||
<template #default="{ row }"> |
||||
<el-button type="primary" link @click="handleEdit(row)" |
||||
>编辑</el-button |
||||
> |
||||
<el-button type="danger" link @click="handleDel(row)" |
||||
>删除</el-button |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<div class="flex end mt-8"> |
||||
<el-pagination |
||||
@size-change="getList" |
||||
@current-change="getList" |
||||
:page-sizes="[10, 20, 50]" |
||||
v-model:page-size="query.size" |
||||
v-model:current-page="query.current" |
||||
layout="total, sizes, prev, pager, next" |
||||
:total="total" |
||||
> |
||||
</el-pagination> |
||||
</div> |
||||
</div> |
||||
|
||||
<el-dialog |
||||
v-model="show" |
||||
:title="mode === 'add' ? '新增处理结果映射' : '编辑处理结果映射'" |
||||
width="600" |
||||
> |
||||
<el-form :label-width="140" :model="formData" ref="fomrRef"> |
||||
<el-form-item |
||||
label="局长信箱处理结果" |
||||
prop="externalName" |
||||
:rules="{ |
||||
required: true, |
||||
message: '请输入', |
||||
trigger: ['blur'], |
||||
}" |
||||
> |
||||
<el-input |
||||
v-model="formData.externalName" |
||||
clearable |
||||
style="width: 280px" |
||||
placeholder="请输入" |
||||
/> |
||||
</el-form-item> |
||||
<el-form-item |
||||
label="数字督察处理结果" |
||||
prop="internalId" |
||||
:rules="{ |
||||
required: true, |
||||
message: '请输入', |
||||
trigger: ['blur'], |
||||
}" |
||||
> |
||||
<el-select |
||||
v-model="formData.internalId" |
||||
@change="(val) => { |
||||
formData.internalName = dict.handleResult |
||||
.find((obj) => val === obj.dictValue).dictLabel |
||||
}" |
||||
style="width: 280px" |
||||
clearable |
||||
> |
||||
<el-option |
||||
v-for="item in dict.handleResult" |
||||
:key="item.dictCode" |
||||
:value="item.dictValue" |
||||
:label="item.dictLabel" |
||||
/> |
||||
</el-select> |
||||
</el-form-item> |
||||
</el-form> |
||||
<footer class="flex end mt-40"> |
||||
<el-button @click="show = false" size="large">取消</el-button> |
||||
<el-button type="primary" @click="submit" size="large" |
||||
>确定</el-button |
||||
> |
||||
</footer> |
||||
</el-dialog> |
||||
</template> |
||||
<script setup> |
||||
import { |
||||
listHandleResultMaping, |
||||
addHandleResultMaping, |
||||
updateHandleResultMaping, |
||||
delHandleResultMaping, |
||||
} from "@/api/system/handleResultMaping"; |
||||
import feedback from "@/utils/feedback"; |
||||
import useCatchStore from "@/stores/modules/catch"; |
||||
const catchSotre = useCatchStore(); |
||||
const dict = catchSotre.getDicts(["handleResult"]); |
||||
|
||||
function getProblemType(id) { |
||||
console.log(dictContent); |
||||
dictContent.forEach(() => { |
||||
return "111"; |
||||
}); |
||||
for (let i = 0; i < dictContent.length; i++) { |
||||
const obj1 = dictContent[i]; |
||||
if (obj1.id === id) { |
||||
return obj1.name; |
||||
} |
||||
if (!obj1.children) { |
||||
continue; |
||||
} |
||||
for (let j = 0; j < obj1.children.length; j++) { |
||||
const obj2 = obj1.children[j]; |
||||
if (obj2.id === id) { |
||||
return obj1.name + " / " + obj2.name; |
||||
} |
||||
if (!obj2.children) { |
||||
continue; |
||||
} |
||||
for (let k = 0; k < obj2.children.length; k++) { |
||||
const obj3 = obj2.children[k]; |
||||
if (obj3.id === id) { |
||||
return obj1.name + " / " + obj2.name + " / " + obj3.name; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
const query = ref({ |
||||
current: 1, |
||||
size: 10, |
||||
}); |
||||
|
||||
const list = ref([]); |
||||
const total = ref(0); |
||||
function getList() { |
||||
listHandleResultMaping(query.value).then((data) => { |
||||
list.value = data.records; |
||||
total.value = data.total; |
||||
}); |
||||
} |
||||
|
||||
function reset() { |
||||
query.value = { |
||||
current: 1, |
||||
size: 10, |
||||
}; |
||||
getList(); |
||||
} |
||||
|
||||
onMounted(() => { |
||||
getList(); |
||||
}); |
||||
|
||||
const show = ref(false); |
||||
const mode = ref("add"); |
||||
const formData = ref({}); |
||||
const fomrRef = ref(); |
||||
|
||||
function handleAdd() { |
||||
formData.value = { internalId: "" }; |
||||
show.value = true; |
||||
mode.value = "add"; |
||||
} |
||||
function handleEdit(row) { |
||||
formData.value = { ...row }; |
||||
show.value = true; |
||||
mode.value = "edit"; |
||||
} |
||||
|
||||
async function handleDel(row) { |
||||
await feedback.confirm("确定要删除该数据?"); |
||||
await delHandleResultMaping(row.id); |
||||
getList(); |
||||
feedback.msgSuccess("删除成功"); |
||||
} |
||||
|
||||
async function submit() { |
||||
await fomrRef.value.validate(); |
||||
if (mode.value === "add") { |
||||
await addHandleResultMaping(formData.value); |
||||
} else { |
||||
await updateHandleResultMaping(formData.value); |
||||
} |
||||
show.value = false; |
||||
formData.value = {}; |
||||
getList(); |
||||
feedback.msgSuccess("操作成功"); |
||||
} |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
</style> |
||||
@ -0,0 +1,295 @@
|
||||
<template> |
||||
<div class="container"> |
||||
<header class="mb-20"> |
||||
<el-form :label-width="114"> |
||||
<el-row> |
||||
<el-col :span="6"> |
||||
<el-form-item label="单位"> |
||||
<el-tree-select |
||||
v-model="query.departId" |
||||
:data="departs" |
||||
:props="{ label: 'shortName', value: 'id' }" |
||||
node-key="id" |
||||
:default-expanded-keys="['12630']" |
||||
clearable |
||||
filterable |
||||
check-strictly |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
</el-form> |
||||
<div class="flex between"> |
||||
<el-button type="primary" @click="handleShowAdd"> |
||||
<template #icon> |
||||
<icon name="el-icon-Plus" /> |
||||
</template> |
||||
新增视频配置</el-button |
||||
> |
||||
<div> |
||||
<el-button type="primary" @click="getList"> |
||||
<template #icon> |
||||
<icon name="el-icon-Search" /> |
||||
</template> |
||||
查询</el-button |
||||
> |
||||
<el-button @click="reset">重置</el-button> |
||||
</div> |
||||
</div> |
||||
</header> |
||||
<div class="table-container"> |
||||
<el-table :data="list"> |
||||
<el-table-column |
||||
label="单位" |
||||
prop="departName" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column label="设备" prop="deviceName" /> |
||||
<el-table-column |
||||
label="视频地址" |
||||
prop="videoUrl" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="排序" |
||||
prop="sortId" |
||||
width="90" |
||||
align="center" |
||||
/> |
||||
<el-table-column |
||||
label="创建时间" |
||||
prop="createTime" |
||||
width="180" |
||||
/> |
||||
<el-table-column label="操作" width="200"> |
||||
<template #default="{ row }"> |
||||
<el-button |
||||
type="primary" |
||||
link |
||||
@click="handleEdit(row)" |
||||
v-perms="['user:edit']" |
||||
>编辑</el-button |
||||
> |
||||
<el-button type="danger" link @click="handleDel(row)" |
||||
>删除</el-button |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<div class="flex end mt-8"> |
||||
<el-pagination |
||||
@size-change="getList" |
||||
@current-change="getList" |
||||
:page-sizes="[10, 20, 50]" |
||||
v-model:page-size="query.size" |
||||
v-model:current-page="query.current" |
||||
layout="total, sizes, prev, pager, next" |
||||
:total="total" |
||||
> |
||||
</el-pagination> |
||||
</div> |
||||
</div> |
||||
|
||||
<el-dialog |
||||
:title="mode === 'add' ? '新增视频配置' : '编辑视频配置'" |
||||
v-model="show" |
||||
width="600" |
||||
> |
||||
<el-form :label-width="120" ref="formRef" :model="form"> |
||||
<el-form-item |
||||
label="单位" |
||||
:rules="{ |
||||
required: true, |
||||
message: '请选择', |
||||
trigger: ['blur'], |
||||
}" |
||||
prop="departId" |
||||
> |
||||
<el-tree-select |
||||
v-model="form.departId" |
||||
:data="departs" |
||||
:props="{ label: 'shortName', value: 'id' }" |
||||
node-key="id" |
||||
:default-expanded-keys="['12630']" |
||||
clearable |
||||
filterable |
||||
check-strictly |
||||
@node-click="handleDepartChange" |
||||
/> |
||||
</el-form-item> |
||||
<el-form-item |
||||
label="设备" |
||||
:rules="{ |
||||
required: true, |
||||
message: '请选择', |
||||
trigger: ['blur'], |
||||
}" |
||||
prop="deviceId" |
||||
> |
||||
<el-tree-select |
||||
:data="devices" |
||||
v-model="form.deviceId" |
||||
:props="{ |
||||
label: 'name', |
||||
value: 'deviceId', |
||||
disabled: nodeDisabled, |
||||
}" |
||||
node-key="id" |
||||
clearable |
||||
filterable |
||||
@current-change="handleDeviceChange" |
||||
> |
||||
<template #default="{ node, data }"> |
||||
<div> |
||||
<span class="mr-10">{{ data.name }}</span> |
||||
<el-tag type="success" size="small" v-if="data.status === 'ON'">在线</el-tag> |
||||
<el-tag type="danger" size="small" v-if="data.status === 'OFF'">离线</el-tag> |
||||
</div> |
||||
</template> |
||||
</el-tree-select> |
||||
</el-form-item> |
||||
<el-form-item label="排序" prop="sortId"> |
||||
<el-input |
||||
v-model="form.sortId" |
||||
type="number" |
||||
placeholder="排序" |
||||
/> |
||||
</el-form-item> |
||||
<el-form-item label="视频"> |
||||
<div> |
||||
<div style="width: 400px"> |
||||
<VideoPlay :url="form.videoUrl" /> |
||||
</div> |
||||
<p style="height: 32px">{{ form.videoUrl }}</p> |
||||
</div> |
||||
</el-form-item> |
||||
</el-form> |
||||
|
||||
<footer class="flex end"> |
||||
<el-button @click="show = false" size="large">取消</el-button> |
||||
<el-button type="primary" @click="submit" size="large" |
||||
>确定</el-button |
||||
> |
||||
</footer> |
||||
</el-dialog> |
||||
</template> |
||||
<script setup> |
||||
import { |
||||
listVideoConfig, |
||||
listDevice, |
||||
addVideoConfig, |
||||
updateVideoConfig, |
||||
delVideoConfig, |
||||
getVideoWsUrl, |
||||
} from "@/api/system/videoConfig"; |
||||
import { getCountyAndCityBureausTree } from "@/api/system/depart"; |
||||
import feedback from "@/utils/feedback"; |
||||
|
||||
const list = ref([]); |
||||
const query = ref({ |
||||
current: 1, |
||||
size: 10, |
||||
}); |
||||
const total = ref(0); |
||||
function getList() { |
||||
listVideoConfig(query.value).then((data) => { |
||||
list.value = data.records; |
||||
total.value = data.total; |
||||
}); |
||||
} |
||||
|
||||
function reset() { |
||||
query.value = { |
||||
current: 1, |
||||
size: 10, |
||||
}; |
||||
getList(); |
||||
} |
||||
|
||||
const devices = ref([]); |
||||
const departs = ref([]); |
||||
let videoWsUrl = ""; |
||||
onMounted(() => { |
||||
getList(); |
||||
listDevice().then((data) => { |
||||
devices.value = data; |
||||
}); |
||||
getCountyAndCityBureausTree().then((data) => { |
||||
departs.value = data; |
||||
}); |
||||
getVideoWsUrl().then((data) => { |
||||
videoWsUrl = data; |
||||
}); |
||||
}); |
||||
|
||||
const show = ref(false); |
||||
const mode = ref("add"); |
||||
const form = ref({}); |
||||
const formRef = ref(null); |
||||
function handleEdit(row) { |
||||
show.value = true; |
||||
mode.value = "edit"; |
||||
form.value = row; |
||||
} |
||||
|
||||
function handleDepartChange(node) { |
||||
form.value.departName = node.shortName; |
||||
} |
||||
|
||||
function handleDeviceChange(node) { |
||||
if (departs.value.length > 0) { |
||||
form.value.parentId = devices.value[0].deviceId |
||||
} |
||||
form.value.deviceName = node.name; |
||||
} |
||||
|
||||
watch(() => form.value.deviceId, () => { |
||||
form.value.videoUrl = `${videoWsUrl}rtp/${form.value.parentId}_${form.value.deviceId}.live.flv`; |
||||
}) |
||||
|
||||
function submit() { |
||||
formRef.value.validate((flag) => { |
||||
if (flag) { |
||||
if (mode.value === "edit") { |
||||
updateVideoConfig(form.value).then((data) => { |
||||
show.value = false; |
||||
form.value = {}; |
||||
getList(); |
||||
feedback.msgSuccess("操作成功"); |
||||
}); |
||||
} else { |
||||
addVideoConfig(form.value).then((data) => { |
||||
show.value = false; |
||||
form.value = {}; |
||||
getList(); |
||||
feedback.msgSuccess("操作成功"); |
||||
}); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
watch(mode, (val) => { |
||||
if (val === "add") { |
||||
form.value = {}; |
||||
} |
||||
}); |
||||
|
||||
function handleShowAdd() { |
||||
mode.value = "add"; |
||||
show.value = true; |
||||
} |
||||
|
||||
async function handleDel(row) { |
||||
await feedback.confirm("确定要删除该数据?"); |
||||
await delVideoConfig(row.id); |
||||
getList(); |
||||
} |
||||
|
||||
function nodeDisabled(data) { |
||||
return data.status === "OFF"; |
||||
} |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
</style> |
||||
@ -0,0 +1,528 @@
|
||||
<template> |
||||
<div class="container"> |
||||
<header> |
||||
<el-form :label-width="120"> |
||||
<el-row> |
||||
<el-col :span="6"> |
||||
<el-form-item label="问题发现时间"> |
||||
<date-time-range-picker-ext |
||||
v-model="query.discoveryTime" |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="6"> |
||||
<el-form-item label="问题发生时间"> |
||||
<date-time-range-picker-ext |
||||
v-model="query.happenTime" |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="6"> |
||||
<el-form-item label="问题录入时间"> |
||||
<date-time-range-picker-ext |
||||
v-model="query.crtTime" |
||||
/> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
<div class="form-row flex"> |
||||
<label class="text-center">问题信息</label> |
||||
<div class="flex wrap query-box"> |
||||
<el-input |
||||
placeholder="问题编号 / 样本源头编号" |
||||
v-model="query.originId" |
||||
clearable |
||||
style="width: 200px" |
||||
/> |
||||
<el-input |
||||
placeholder="涉及案件 / 警情编号" |
||||
v-model="query.caseNumber" |
||||
clearable |
||||
style="width: 200px" |
||||
/> |
||||
<el-input |
||||
placeholder="事情简要描述" |
||||
v-model="query.thingDesc" |
||||
clearable |
||||
style="width: 260px" |
||||
/> |
||||
<el-select |
||||
style="width: 146px" |
||||
placeholder="业务类别" |
||||
clearable |
||||
v-model="query.businessTypeCode" |
||||
> |
||||
<el-option |
||||
v-for="item in dict.businessType" |
||||
:key="item.id" |
||||
:label="item.dictLabel" |
||||
:value="item.dictValue" |
||||
/> |
||||
</el-select> |
||||
<el-tree-select |
||||
:data="dictProblemSources" |
||||
:props="{ value: 'id' }" |
||||
node-key="id" |
||||
v-model="query.problemSourcesCode" |
||||
clearable |
||||
filterable |
||||
multiple |
||||
collapse-tags |
||||
style="width: 200px" |
||||
placeholder="问题来源" |
||||
/> |
||||
<el-select |
||||
style="width: 146px" |
||||
placeholder="专项督察" |
||||
clearable |
||||
v-model="query.specialSupervision" |
||||
> |
||||
<el-option |
||||
v-for="item in dict.specialSupervision" |
||||
:key="item.id" |
||||
:label="item.dictLabel" |
||||
:value="item.dictValue" |
||||
/> |
||||
</el-select> |
||||
<el-input |
||||
placeholder="通报期数" |
||||
style="width: 146px" |
||||
v-model="query.reportNumber" |
||||
clearable |
||||
/> |
||||
|
||||
</div> |
||||
</div> |
||||
<div class="form-row flex"> |
||||
<label class="text-center">核查情况</label> |
||||
<div class="flex wrap query-box"> |
||||
<div style="width: 200px"> |
||||
<depart-tree-select |
||||
v-model="query.involveDepartId" |
||||
placeholder="涉及单位" |
||||
/> |
||||
</div> |
||||
<div style="width: 200px"> |
||||
<depart-tree-select |
||||
v-model="query.handleDepartId" |
||||
placeholder="办理单位" |
||||
/> |
||||
</div> |
||||
<el-select |
||||
style="width: 120px" |
||||
placeholder="是否属实" |
||||
clearable |
||||
v-model="query.checkStatus" |
||||
> |
||||
<el-option |
||||
v-for="item in dict.inspectCase" |
||||
:key="item.id" |
||||
:label="item.dictLabel" |
||||
:value="item.dictValue" |
||||
/> |
||||
</el-select> |
||||
<el-select |
||||
style="width: 120px" |
||||
placeholder="是否整改" |
||||
clearable |
||||
v-model="query.isRectifyCode" |
||||
> |
||||
<el-option |
||||
v-for="item in dict.isRectify" |
||||
:key="item.id" |
||||
:label="item.dictLabel" |
||||
:value="item.dictValue" |
||||
/> |
||||
</el-select> |
||||
<div class="flex gap-4"> |
||||
<el-select |
||||
v-model="query.blameKey" |
||||
style="width: 90px" |
||||
@change="delete query.blameValue" |
||||
> |
||||
<el-option value="name" label="姓名" /> |
||||
<el-option value="empNo" label="警号" /> |
||||
<el-option value="idCode" label="身份证" /> |
||||
</el-select> |
||||
<el-input |
||||
placeholder="涉及人员" |
||||
v-model="query.blameValue" |
||||
clearable |
||||
style="width: 190px" |
||||
/> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class="form-row flex"> |
||||
<label class="text-center">其他选项</label> |
||||
<div class="flex wrap query-box"> |
||||
<el-select |
||||
style="width: 200px" |
||||
placeholder="流程阶段" |
||||
clearable |
||||
v-model="query.flowKey" |
||||
> |
||||
<el-option |
||||
v-for="item in flowNodes" |
||||
:key="item.flowKey" |
||||
:label="item.flowName" |
||||
:value="item.flowKey" |
||||
/> |
||||
</el-select> |
||||
<el-select |
||||
style="width: 120px" |
||||
placeholder="办理状态" |
||||
clearable |
||||
v-model="query.processingStatus" |
||||
multiple |
||||
> |
||||
<el-option |
||||
v-for="item in dict.processingStatus" |
||||
:key="item.id" |
||||
:label="item.dictLabel" |
||||
:value="item.dictValue" |
||||
/> |
||||
</el-select> |
||||
|
||||
<div class="flex gap-4" style="height: 32px"> |
||||
<el-select |
||||
v-model="query.responderKey" |
||||
style="width: 90px" |
||||
@change="delete query.responderValue" |
||||
> |
||||
<el-option value="name" label="姓名" /> |
||||
<el-option value="phone" label="电话" /> |
||||
</el-select> |
||||
<el-input |
||||
placeholder="投诉反映人" |
||||
v-model="query.responderValue" |
||||
clearable |
||||
style="width: 190px" |
||||
/> |
||||
</div> |
||||
<el-select |
||||
style="width: 120px" |
||||
placeholder="申请延期" |
||||
clearable |
||||
v-model="query.extensionFlag" |
||||
> |
||||
<el-option label="已申请" :value="true" /> |
||||
<el-option label="未申请" :value="false" /> |
||||
</el-select> |
||||
<el-select |
||||
style="width: 146px" |
||||
placeholder="下发单位的层级" |
||||
clearable |
||||
v-model="query.crtDepartLevel" |
||||
> |
||||
<el-option label="市局下发" :value="0" /> |
||||
<el-option label="二级机构下发" :value="2" /> |
||||
</el-select> |
||||
|
||||
|
||||
</div> |
||||
</div> |
||||
</el-form> |
||||
<div class="flex between mt-20 mb-26"> |
||||
<el-button type="primary" @click="handleExport" |
||||
>数据导出</el-button |
||||
> |
||||
<div> |
||||
<el-button type="primary" @click="getList"> |
||||
<template #icon |
||||
><icon name="el-icon-Search" |
||||
/></template> |
||||
查询</el-button |
||||
> |
||||
<el-button @click="reset">重置</el-button> |
||||
</div> |
||||
</div> |
||||
</header> |
||||
<main> |
||||
<div class="table-container" v-loading="loading"> |
||||
<el-table |
||||
:data="list" |
||||
@sort-change="handleTableSort" |
||||
ref="tableRef" |
||||
> |
||||
<el-table-column type="expand"> |
||||
<template #default="{ row }"> |
||||
<div class="row mt-10"> |
||||
<div class="col col-6"> |
||||
<label>样本源头编号</label> |
||||
<span>{{ row.originId }}</span> |
||||
</div> |
||||
<div class="col col-6"> |
||||
<label>问题发现时间</label> |
||||
<span>{{ row.discoveryTime }}</span> |
||||
</div> |
||||
<div class="col col-6"> |
||||
<label>问题发生时间</label> |
||||
<span>{{ row.happenTime || "/" }}</span> |
||||
</div> |
||||
</div> |
||||
<div class="row mt-10"> |
||||
<div class="col col-6"> |
||||
<label>问题来源</label> |
||||
<span>{{ row.problemSources }}</span> |
||||
</div> |
||||
<div class="col col-6"> |
||||
<label>业务类别</label> |
||||
<span>{{ row.businessTypeName }}</span> |
||||
</div> |
||||
<div class="col col-12"> |
||||
<label>涉嫌问题</label> |
||||
<span>{{ |
||||
getInvolveProblem( |
||||
row.involveProblem, |
||||
dict.suspectProblem |
||||
) || "/" |
||||
}}</span> |
||||
</div> |
||||
</div> |
||||
<div class="row mt-10"> |
||||
<div class="col col-6" v-if="row.responderName"> |
||||
<label>投诉反映人</label> |
||||
<span>{{ row.responderName }}</span> |
||||
</div> |
||||
<div class="col col-6" v-if="row.contactPhone"> |
||||
<label>联系电话</label> |
||||
<span>{{ row.contactPhone }}</span> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="row mt-10"> |
||||
<div class="col col-6"> |
||||
<label>涉及警种</label> |
||||
<span>{{ row.policeTypeName }}</span> |
||||
</div> |
||||
<div class="col col-6"> |
||||
<label>涉及单位</label> |
||||
<span>{{ |
||||
row.involveDepartName || "/" |
||||
}}</span> |
||||
</div> |
||||
</div> |
||||
<div class="row mt-10"> |
||||
<div class="col col-24"> |
||||
<label>事情简要描述</label> |
||||
<span>{{ row.thingDesc }}</span> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column |
||||
label="问题录入时间" |
||||
prop="crtTime" |
||||
width="150" |
||||
sortable="custom" |
||||
/> |
||||
<el-table-column |
||||
label="问题发现时间" |
||||
prop="discoveryTime" |
||||
width="150" |
||||
sortable="custom" |
||||
/> |
||||
<el-table-column |
||||
label="问题来源" |
||||
prop="problemSources" |
||||
width="110" |
||||
/> |
||||
<el-table-column |
||||
label="业务类别" |
||||
prop="businessTypeName" |
||||
width="110" |
||||
/> |
||||
<el-table-column |
||||
label="问题内容" |
||||
prop="thingDesc" |
||||
show-overflow-tooltip |
||||
/> |
||||
|
||||
<el-table-column label="办理单位" show-overflow-tooltip> |
||||
<template #default="{ row }"> |
||||
<span |
||||
>{{ row.handleSecondDepartName |
||||
}}{{ row.handleThreeDepartName }}</span |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column |
||||
label="是否属实" |
||||
prop="checkStatusName" |
||||
width="100" |
||||
align="center" |
||||
/> |
||||
<el-table-column label="办理状态" width="110"> |
||||
<template #default="{ row }"> |
||||
<el-tag |
||||
:type=" |
||||
row.processingStatus === |
||||
ProcessingStatus.COMPLETED |
||||
? 'success' |
||||
: 'primary' |
||||
" |
||||
v-if="row.processingStatus" |
||||
>{{ |
||||
getDictLable( |
||||
dict.processingStatus, |
||||
row.processingStatus |
||||
) |
||||
}}</el-tag |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column |
||||
label="当前处理对象" |
||||
prop="currentProcessingObject" |
||||
show-overflow-tooltip |
||||
> |
||||
<template #default="{ row }"> |
||||
<span |
||||
v-if=" |
||||
row.processingStatus === |
||||
ProcessingStatus.COMPLETED |
||||
" |
||||
>无</span |
||||
> |
||||
<span v-else>{{ |
||||
row.currentProcessingObject |
||||
}}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="操作" width="120"> |
||||
<template #default="{ row }"> |
||||
<el-button |
||||
type="primary" |
||||
link |
||||
@click="handleAction(row)" |
||||
>详情</el-button |
||||
> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<div class="flex between v-center mt-8"> |
||||
<div>说明:会签列表,展示拥有同样权限的专班成员会签过的工作。</div> |
||||
<el-pagination |
||||
@size-change="getList" |
||||
@current-change="getList" |
||||
:page-sizes="[10, 20, 50, 100]" |
||||
v-model:page-size="query.size" |
||||
v-model:current-page="query.current" |
||||
layout="total, sizes, prev, pager, next" |
||||
:total="total" |
||||
> |
||||
</el-pagination> |
||||
</div> |
||||
</main> |
||||
</div> |
||||
|
||||
<negative-dialog |
||||
v-model="show" |
||||
:id="activeNegativeId" |
||||
@close="show = false" |
||||
ref="negativeDialogRef" |
||||
/> |
||||
|
||||
</template> |
||||
<script setup> |
||||
import moment from "moment"; |
||||
import { ElLoading } from "element-plus"; |
||||
import { |
||||
listMyCountersign, |
||||
negativeExport |
||||
} from "@/api/work/myCountersign"; |
||||
import { getDictLable, getInvolveProblem } from "@/utils/util"; |
||||
import feedback from "@/utils/feedback"; |
||||
|
||||
import { ProcessingStatus } from "@/enums/flowEnums"; |
||||
|
||||
import useCatchStore from "@/stores/modules/catch"; |
||||
|
||||
const catchStore = useCatchStore(); |
||||
const dict = catchStore.getDicts([ |
||||
"businessType", |
||||
"inspectCase", |
||||
"isRectify", |
||||
"processingStatus", |
||||
"suspectProblem", |
||||
"policeType", |
||||
"specialSupervision", |
||||
]); |
||||
const flowNodes = catchStore.getFlowNodes(); |
||||
const dictProblemSources = catchStore.getDictProblemSources(); |
||||
|
||||
const queryCrumbs = ref([]); |
||||
const query = ref({ |
||||
current: 1, |
||||
size: 10, |
||||
responderKey: "name", |
||||
blameKey: "name" |
||||
}); |
||||
|
||||
const list = ref([]); |
||||
const total = ref(0); |
||||
|
||||
const loading = ref(true); |
||||
function getList() { |
||||
loading.value = true; |
||||
listMyCountersign(query.value).then((data) => { |
||||
list.value = data.records; |
||||
total.value = data.total; |
||||
loading.value = false; |
||||
}); |
||||
} |
||||
|
||||
function handleTableSort(orderObj) { |
||||
if (orderObj.order) { |
||||
query.value.order = orderObj.order; |
||||
query.value.orderProp = orderObj.prop; |
||||
} else { |
||||
query.value.order = ""; |
||||
query.value.orderProp = ""; |
||||
} |
||||
getList(); |
||||
} |
||||
|
||||
const tableRef = ref(); |
||||
function reset() { |
||||
query.value = { |
||||
current: 1, |
||||
size: 10, |
||||
responderKey: "name", |
||||
blameKey: "name" |
||||
}; |
||||
tableRef.value.clearSort(); |
||||
getList(); |
||||
} |
||||
|
||||
onMounted(() => { |
||||
getList(); |
||||
}); |
||||
|
||||
const show = ref(false); |
||||
const activeNegativeId = ref(""); |
||||
|
||||
function handleAction(row) { |
||||
show.value = true; |
||||
activeNegativeId.value = row.id; |
||||
} |
||||
|
||||
const router = useRouter(); |
||||
async function handleExport() { |
||||
await feedback.confirm("请确定导出当前页面所有数据"); |
||||
const loading = ElLoading.service({ |
||||
lock: true, |
||||
text: "导出中...", |
||||
background: "rgba(0, 0, 0, 0.5)", |
||||
}); |
||||
await negativeExport(query.value); |
||||
loading.close(); |
||||
await feedback.confirm("导出任务已生成,请到“导出记录”页面查看"); |
||||
router.push("/negative/export"); |
||||
} |
||||
|
||||
</script> |
||||
<style lang="scss" scoped> |
||||
</style> |
||||
Loading…
Reference in new issue