Browse Source

fix: 修复BUG

main
wxc 1 year ago
parent
commit
6fdd1ac451
  1. 9
      .idea/libraries/v2.xml
  2. 6
      .idea/misc.xml
  3. 8
      .idea/modules.xml
  4. 9
      .idea/supervision-vue.iml
  5. 6
      .idea/vcs.xml
  6. 7
      src/api/sensitivePerception/modelClueTask.ts
  7. 7
      src/api/work/negative.ts
  8. 30
      src/components/file/list.vue
  9. 12
      src/components/file/upload-group.vue
  10. 85
      src/components/home/work/my-fav.vue
  11. 89
      src/components/home/work/my-todo.vue
  12. 2
      src/components/negative/add.vue
  13. 1
      src/components/negative/dialog.vue
  14. 14
      src/components/negative/verify-description.vue
  15. 89
      src/components/negative/verify.vue
  16. 4
      src/style/public.scss
  17. 14
      src/views/sensitivePerception/DepartNegative.vue
  18. 25
      src/views/sensitivePerception/ModelClueTask.vue
  19. 10
      src/views/sensitivePerception/PoliceNegative.vue
  20. 39
      src/views/work/Done.vue
  21. 273
      src/views/work/Query.vue

9
.idea/libraries/v2.xml

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="v2">
<CLASSES>
<root url="jar://$PROJECT_DIR$/v2.zip!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

6
.idea/misc.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/supervision-vue.iml" filepath="$PROJECT_DIR$/.idea/supervision-vue.iml" />
</modules>
</component>
</project>

9
.idea/supervision-vue.iml

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
.idea/vcs.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

7
src/api/sensitivePerception/modelClueTask.ts

@ -12,3 +12,10 @@ export function listModelClueByDepart(taskId) {
url: `/model/clue/tasks/${taskId}/byDepart` url: `/model/clue/tasks/${taskId}/byDepart`
}); });
} }
export function listModelClues(taskId, query) {
return request.get({
url: `/model/clue/tasks/${taskId}/clues`,
query
});
}

7
src/api/work/negative.ts

@ -22,6 +22,13 @@ export function addNegative(body) {
}); });
} }
export function updateNegative(body) {
return request.put({
url: `/negative`,
body
});
}
export function negativeExecute(id, body) { export function negativeExecute(id, body) {
return request.post({ return request.post({
url: `/negative/${id}/execute`, url: `/negative/${id}/execute`,

30
src/components/file/list.vue

@ -110,11 +110,11 @@
<template <template
v-else-if="getFileType(activeFile.fileName) === FileType.MP3" v-else-if="getFileType(activeFile.fileName) === FileType.MP3"
> >
<audio <audio controls style="width: 50vw">
controls <source
style="width: 50vw" :src="`${BASE_PATH}/file/stream/${activeFile.filePath}`"
> type="audio/mp3"
<source :src="`${BASE_PATH}/file/stream/${activeFile.filePath}`" type="audio/mp3"> />
</audio> </audio>
</template> </template>
<template <template
@ -128,7 +128,10 @@
</video> </video>
</template> </template>
<template <template
v-else-if="getFileType(activeFile.fileName) === FileType.WORD && activeFile.fileName.toLocaleLowerCase().endsWith('.docx')" v-else-if="
getFileType(activeFile.fileName) === FileType.WORD &&
activeFile.fileName.toLocaleLowerCase().endsWith('.docx')
"
> >
<vue-office-docx <vue-office-docx
:src="`${BASE_PATH}/file/stream/${activeFile.filePath}`" :src="`${BASE_PATH}/file/stream/${activeFile.filePath}`"
@ -144,7 +147,10 @@
</div> </div>
</template> </template>
<template <template
v-else-if="getFileType(activeFile.fileName) === FileType.EXCEL && activeFile.fileName.toLocaleLowerCase().endsWith('.xlsx')" v-else-if="
getFileType(activeFile.fileName) === FileType.EXCEL &&
activeFile.fileName.toLocaleLowerCase().endsWith('.xlsx')
"
> >
<vue-office-excel <vue-office-excel
:src="`${BASE_PATH}/file/stream/${activeFile.filePath}`" :src="`${BASE_PATH}/file/stream/${activeFile.filePath}`"
@ -165,9 +171,13 @@
icon="error" icon="error"
title="不支持预览" title="不支持预览"
sub-title="该文件格式暂不支持预览,请下载预览" sub-title="该文件格式暂不支持预览,请下载预览"
style="background: #fff; width: 400px" style="background: #fff; width: 600px; height: 400px"
@click.stop @click.stop
></el-result> >
<template #extra>
<el-button type="primary" text size="large" @click="download">下载文件</el-button>
</template>
</el-result>
</div> </div>
</template> </template>
<div class="file-number" @click.stop> <div class="file-number" @click.stop>
@ -200,7 +210,7 @@
class="download-btn" class="download-btn"
@click="download" @click="download"
type="primary" type="primary"
size="large" plain
> >
<template #icon> <template #icon>
<icon name="el-icon-Download" :size="20" /> <icon name="el-icon-Download" :size="20" />

12
src/components/file/upload-group.vue

@ -27,7 +27,8 @@
<el-icon class="el-icon--upload"><upload-filled /></el-icon> <el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text"> <div class="el-upload__text">
<div>将文件拖拽到此处或<em>点击上传</em></div> <div>将文件拖拽到此处或<em>点击上传</em></div>
<div class="text-small">文件大小限制为 100MB</div> <div class="text-small">文件类型支持图片/录音/MP4/PDF/WORD/EXCEL/压缩文件文件大小限制为 100MB</div>
<div class="text-small">如遇到无法正常上传的情况请将文件压缩之后再上传</div>
</div> </div>
</el-upload> </el-upload>
<h4>未分类文件</h4> <h4>未分类文件</h4>
@ -203,6 +204,9 @@ const emit = defineEmits(["update:files"]);
const show = ref(false); const show = ref(false);
const fileList = ref(props.files); const fileList = ref(props.files);
watch(() => props.files, (val => {
fileList.value = val
}))
const fileClasss = ref([]); const fileClasss = ref([]);
if (props.problemSourcesCode === ProblemSources.JWDC) { if (props.problemSourcesCode === ProblemSources.JWDC) {
@ -312,4 +316,10 @@ h4 {
.file-list-item_active { .file-list-item_active {
background: #f1f3ff; background: #f1f3ff;
} }
.img-box {
width: 40px;
height: 40px;
background-position: center;
background-size: cover;
}
</style> </style>

85
src/components/home/work/my-fav.vue

@ -3,8 +3,8 @@
<el-table :data="favs"> <el-table :data="favs">
<el-table-column type="expand"> <el-table-column type="expand">
<template #default="{ row }"> <template #default="{ row }">
<div class="row mt-10"> <div class="row mt-12">
<div class="col col-6"> <div class="col col-12">
<label>样本源头编号</label> <label>样本源头编号</label>
<span>{{ row.originId }}</span> <span>{{ row.originId }}</span>
</div> </div>
@ -14,48 +14,54 @@
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>问题发生时间</label> <label>问题发生时间</label>
<span>{{ row.happenTime }}</span> <span>{{ row.happenTime || "/" }}</span>
</div>
<div class="col col-6">
<label>问题来源</label>
<span>{{ row.problemSources }}</span>
</div>
</div> </div>
<div class="row mt-10">
<div class="col col-6"> <div class="col col-6">
<label>投诉反映人</label> <label>问题录入时间</label>
<span>{{ row.responderName }}</span> <span>{{ row.crtTime || "/" }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>联系电话</label> <label>问题来源</label>
<span>{{ row.contactPhone }}</span> <span>{{ row.problemSources }}</span>
</div>
</div> </div>
<div class="row mt-10">
<div class="col col-6"> <div class="col col-6">
<label>业务类别</label> <label>业务类别</label>
<span>{{ row.businessTypeName }}</span> <span>{{ row.businessTypeName }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>涉及警种</label>
<span>{{ row.policeTypeName || "/" }}</span>
</div>
<div class="col col-12">
<label>涉嫌问题</label> <label>涉嫌问题</label>
<span>{{}}</span> <span>{{
getInvolveProblem(row.involveProblem) || "/"
}}</span>
</div> </div>
<div class="col col-6" v-if="row.responderName">
<label>投诉反映人</label>
<span>{{ row.responderName }}</span>
</div> </div>
<div class="row mt-10"> <div class="col col-6" v-if="row.contactPhone">
<div class="col col-6"> <label>联系电话</label>
<label>涉及警种</label> <span>{{ row.contactPhone }}</span>
<span>{{ row.policeTypeName }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>涉及单位</label> <label>涉及单位</label>
<span>{{ row.involveDepartName }}</span> <span>{{ row.involveDepartName || "/" }}</span>
</div>
</div>
<div class="row mt-12">
<div class="col col-24">
<label>事情简要描述</label>
<span>{{ row.thingDesc }}</span>
</div> </div>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="问题发生时间" label="问题发时间"
prop="happenTime" prop="discoveryTime"
width="164" width="164"
/> />
<el-table-column <el-table-column
@ -68,23 +74,40 @@
prop="businessTypeName" prop="businessTypeName"
width="98" width="98"
/> />
<el-table-column label="涉嫌问题" width="100" /> <el-table-column label="涉嫌问题" width="100" >
<template #default="{ row }">
<span>{{
getInvolveProblem(row.involveProblem)
}}</span>
</template>
</el-table-column>
<el-table-column <el-table-column
label="问题内容" label="问题内容"
prop="thingDesc" prop="thingDesc"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column label="办理状态" width="98"> <el-table-column label="办理状态" width="140" align="center">
<template #default="{ row }"> <template #default="{ row }">
<el-tag>{{ <el-tag
>{{
getDictLable( getDictLable(
dict.processingStatus, dict.processingStatus,
row.processingStatus row.processingStatus
) )
}}</el-tag> }}</el-tag
>
</template>
</el-table-column>
<el-table-column label="流程节点" width="120" show-overflow-tooltip>
<template #default="{ row }">
<span>{{
flowNodes.filter(
(item) => item.flowKey === row.flowKey
)[0]?.flowName
}}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="流程节点" prop="" width="98" />
<el-table-column label="操作" width="98"> <el-table-column label="操作" width="98">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="handleAction(row)" <el-button type="primary" link @click="handleAction(row)"
@ -104,10 +127,12 @@
</template> </template>
<script setup> <script setup>
import { listFav } from "@/api/work/fav"; import { listFav } from "@/api/work/fav";
import { getDictLable } from "@/utils/util"; import { getDictLable, getInvolveProblem } from "@/utils/util";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
const dict = useCatchStore().getDicts(["processingStatus"]); const catchStore = useCatchStore();
const dict = catchStore.getDicts(["processingStatus"]);
const flowNodes = catchStore.getFlowNodes();
const favs = ref([]); const favs = ref([]);

89
src/components/home/work/my-todo.vue

@ -22,8 +22,7 @@
v-perms="['negative:add']" v-perms="['negative:add']"
plain plain
class="add-btn" class="add-btn"
><template #icon> ><template #icon> <icon name="el-icon-Plus" /> </template
<icon name="el-icon-Plus" /> </template
>问题下发</el-button >问题下发</el-button
> >
</div> </div>
@ -31,8 +30,8 @@
<el-table :data="todos"> <el-table :data="todos">
<el-table-column type="expand"> <el-table-column type="expand">
<template #default="{ row }"> <template #default="{ row }">
<div class="row mt-10"> <div class="row mt-12">
<div class="col col-6"> <div class="col col-12">
<label>样本源头编号</label> <label>样本源头编号</label>
<span>{{ row.originId }}</span> <span>{{ row.originId }}</span>
</div> </div>
@ -42,41 +41,47 @@
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>问题发生时间</label> <label>问题发生时间</label>
<span>{{ row.happenTime }}</span> <span>{{ row.happenTime || "/" }}</span>
</div>
<div class="col col-6">
<label>问题来源</label>
<span>{{ row.problemSources }}</span>
</div>
</div> </div>
<div class="row mt-10">
<div class="col col-6"> <div class="col col-6">
<label>投诉反映人</label> <label>问题录入时间</label>
<span>{{ row.responderName }}</span> <span>{{ row.crtTime || "/" }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>联系电话</label> <label>问题来源</label>
<span>{{ row.contactPhone }}</span> <span>{{ row.problemSources }}</span>
</div>
</div> </div>
<div class="row mt-10">
<div class="col col-6"> <div class="col col-6">
<label>业务类别</label> <label>业务类别</label>
<span>{{ row.businessTypeName }}</span> <span>{{ row.businessTypeName }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>涉及警种</label>
<span>{{ row.policeTypeName || "/" }}</span>
</div>
<div class="col col-12">
<label>涉嫌问题</label> <label>涉嫌问题</label>
<span>{{}}</span> <span>{{
getInvolveProblem(row.involveProblem) || "/"
}}</span>
</div> </div>
<div class="col col-6" v-if="row.responderName">
<label>投诉反映人</label>
<span>{{ row.responderName }}</span>
</div> </div>
<div class="row mt-10"> <div class="col col-6" v-if="row.contactPhone">
<div class="col col-6"> <label>联系电话</label>
<label>涉及警种</label> <span>{{ row.contactPhone }}</span>
<span>{{ row.policeTypeName }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>涉及单位</label> <label>涉及单位</label>
<span>{{ row.involveDepartName }}</span> <span>{{ row.involveDepartName || "/" }}</span>
</div>
</div>
<div class="row mt-12">
<div class="col col-24">
<label>事情简要描述</label>
<span>{{ row.thingDesc }}</span>
</div> </div>
</div> </div>
</template> </template>
@ -84,12 +89,13 @@
<el-table-column <el-table-column
label="问题发现时间" label="问题发现时间"
prop="discoveryTime" prop="discoveryTime"
width="164" width="156"
/> />
<el-table-column <el-table-column
label="问题来源" label="问题来源"
prop="problemSources" prop="problemSources"
width="84" width="108"
show-overflow-tooltip
/> />
<el-table-column <el-table-column
label="业务类别" label="业务类别"
@ -101,18 +107,30 @@
prop="thingDesc" prop="thingDesc"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column label="办理状态" width="98"> <el-table-column label="办理状态" width="140" align="center">
<template #default="{ row }"> <template #default="{ row }">
<el-tag>{{ <el-tag
>{{
getDictLable( getDictLable(
dict.processingStatus, dict.processingStatus,
row.processingStatus row.processingStatus
) )
}}</el-tag> }}{{
row.extensionApplyFlag ? "" : "(延期申请)"
}}</el-tag
>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="流程节点" prop="" width="98" /> <el-table-column label="流程节点" width="120" show-overflow-tooltip>
<el-table-column label="操作" width="98"> <template #default="{ row }">
<span>{{
flowNodes.filter(
(item) => item.flowKey === row.flowKey
)[0]?.flowName
}}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="90">
<template #default="{ row }"> <template #default="{ row }">
<el-button <el-button
type="primary" type="primary"
@ -134,17 +152,16 @@
:disabled="false" :disabled="false"
/> />
<negative-add <negative-add v-model="addShow" @close="addShow = false" />
v-model="addShow"
@close="addShow = false"
/>
</template> </template>
<script setup> <script setup>
import { listTodos } from "@/api/work"; import { listTodos } from "@/api/work";
import { getDictLable } from "@/utils/util"; import { getDictLable, getInvolveProblem } from "@/utils/util";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
const dict = useCatchStore().getDicts(["processingStatus"]); const catchStore = useCatchStore();
const dict = catchStore.getDicts(["processingStatus"]);
const flowNodes = catchStore.getFlowNodes();
const props = defineProps({ const props = defineProps({
data: { data: {

2
src/components/negative/add.vue

@ -11,7 +11,7 @@
ref="formRef" ref="formRef"
style="padding: 0 16px" style="padding: 0 16px"
> >
<h2 style="">问题信息</h2> <h2>问题信息</h2>
<div class="add-negation-container"> <div class="add-negation-container">
<el-row> <el-row>

1
src/components/negative/dialog.vue

@ -263,7 +263,6 @@ const setActionItemRef = (actionKey, el) => {
const activeAction = ref({}); const activeAction = ref({});
async function handleExecute(action, data) { async function handleExecute(action, data) {
if (action.validateForm) { if (action.validateForm) {
debugger
if (action.actionKey !== FlowActionEnum.SAVE) { if (action.actionKey !== FlowActionEnum.SAVE) {
try { try {
data = await componentRef.value.validate(); data = await componentRef.value.validate();

14
src/components/negative/verify-description.vue

@ -42,7 +42,7 @@
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>人员属性</label> <label>人员属性</label>
<span>{{ blame.ivPersonType }}</span> <span>{{ getDictLable(dict.personType, blame.ivPersonTypeCode) }}</span>
</div> </div>
<div class="col col-6" v-if="blame.superviseMeasuresCode"> <div class="col col-6" v-if="blame.superviseMeasuresCode">
<label>督察措施</label> <label>督察措施</label>
@ -50,7 +50,7 @@
</div> </div>
</div> </div>
<div class="row" v-for="(problem, index) in blame.problems"> <div class="row" v-for="(problem, index) in blame.problems" :key="index">
<div class="col col-24"> <div class="col col-24">
<label>问题类型{{ index + 1 }}</label> <label>问题类型{{ index + 1 }}</label>
<span>{{ problem.oneLevelContent }} / {{ problem.twoLevelContent }} / {{ problem.threeLevelContent }}</span> <span>{{ problem.oneLevelContent }} / {{ problem.twoLevelContent }} / {{ problem.threeLevelContent }}</span>
@ -61,7 +61,7 @@
<label>主观方面</label> <label>主观方面</label>
<span>{{ blame.subjectiveAspectName }}</span> <span>{{ blame.subjectiveAspectName }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6" v-if="blame.responsibilityTypeName">
<label>责任类别</label> <label>责任类别</label>
<span>{{ blame.responsibilityTypeName }}</span> <span>{{ blame.responsibilityTypeName }}</span>
</div> </div>
@ -94,7 +94,7 @@
<span>{{ blame.leadIdCode }}</span> <span>{{ blame.leadIdCode }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6" v-if="blame.leadResponsibilityTypeName">
<label>责任类别</label> <label>责任类别</label>
<span>{{ blame.leadResponsibilityTypeName }}</span> <span>{{ blame.leadResponsibilityTypeName }}</span>
</div> </div>
@ -124,10 +124,10 @@
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>人员属性</label> <label>人员属性</label>
<span>{{ blame.ivPersonType }}</span> <span>{{ getDictLable(dict.personType, blame.ivPersonTypeCode) }}</span>
</div> </div>
</div> </div>
<div class="row" v-for="problem in blame.problems"> <div class="row" v-for="problem in blame.problems" :key="problem">
<div class="col col-6"> <div class="col col-6">
<label>问题类型</label> <label>问题类型</label>
<span>{{ problem.oneLevelContent }}</span> <span>{{ problem.oneLevelContent }}</span>
@ -168,7 +168,7 @@ import {
import { getDictLable } from "@/utils/util"; import { getDictLable } from "@/utils/util";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
const dict = useCatchStore().getDicts(["accountabilityTarget"]); const dict = useCatchStore().getDicts(["accountabilityTarget", "personType"]);
const activeNames = ref(['verify', 'involved_department', 'completionAttachment']) const activeNames = ref(['verify', 'involved_department', 'completionAttachment'])
const negative = inject('negative'); const negative = inject('negative');

89
src/components/negative/verify.vue

@ -2,7 +2,7 @@
<h5>核查办理</h5> <h5>核查办理</h5>
<el-form :label-width="146" :model="form" ref="formRef"> <el-form :label-width="146" :model="form" ref="formRef">
<el-row> <el-row>
<el-col :span="24"> <el-col :span="12">
<el-form-item label="涉及案件/警情编号" prop="caseNumber"> <el-form-item label="涉及案件/警情编号" prop="caseNumber">
<el-input <el-input
v-model="form.caseNumber" v-model="form.caseNumber"
@ -11,6 +11,21 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item
label="涉及单位"
prop="involveDepartId"
:rules="{
required: true,
message: '请选择涉及单位',
trigger: ['blur'],
}"
>
<div style="width: 280px">
<depart-tree-select v-model="form.involveDepartId" />
</div>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label="核查情况" label="核查情况"
@ -177,10 +192,7 @@
" "
v-model="item.blameEmpNo" v-model="item.blameEmpNo"
@change=" @change="
(police) => { (police) => handleChangePolice(police, item)
item.blameName = police.name;
item.blameIdCode = police.idCode;
}
" "
/> />
</el-form-item> </el-form-item>
@ -347,6 +359,7 @@
message: '请选择责任类别', message: '请选择责任类别',
trigger: ['blur'], trigger: ['blur'],
}" }"
v-if="form.checkStatus !== InspectCase.FALSE"
> >
<el-radio-group <el-radio-group
v-model="item.responsibilityTypeCode" v-model="item.responsibilityTypeCode"
@ -642,6 +655,7 @@
message: '请选择责任类别', message: '请选择责任类别',
trigger: ['blur'], trigger: ['blur'],
}" }"
v-if="form.checkStatus !== InspectCase.FALSE"
> >
<el-radio-group <el-radio-group
v-model="item.leadResponsibilityTypeCode" v-model="item.leadResponsibilityTypeCode"
@ -839,14 +853,6 @@
> >
<el-radio-group <el-radio-group
v-model="item.ivPersonTypeCode" v-model="item.ivPersonTypeCode"
@change="
(val) =>
(item.ivPersonType =
dict.personType.filter(
(item) =>
item.dictValue === val
)[0].dictLabel)
"
> >
<el-radio :value="PersonType.POLICE" <el-radio :value="PersonType.POLICE"
>民警</el-radio >民警</el-radio
@ -1010,6 +1016,7 @@
message: '请选择责任类别', message: '请选择责任类别',
trigger: ['blur'], trigger: ['blur'],
}" }"
v-if="form.checkStatus !== InspectCase.FALSE"
> >
<el-radio-group <el-radio-group
v-model="item.responsibilityTypeCode" v-model="item.responsibilityTypeCode"
@ -1155,14 +1162,15 @@ const dictContent = catchSotre.getDictContent();
const negative = inject("negative"); const negative = inject("negative");
const form = ref({}); const form = ref({});
getFormData() getFormData();
watch(negative, () => { watch(negative, () => {
getFormData() getFormData();
}); });
function getFormData() { function getFormData() {
form.value = { form.value = {
involveDepartId: negative.value.involveDepartId,
caseNumber: negative.value.caseNumber, caseNumber: negative.value.caseNumber,
checkStatus: negative.value.checkStatus, checkStatus: negative.value.checkStatus,
checkStatusName: negative.value.checkStatusName, checkStatusName: negative.value.checkStatusName,
@ -1260,47 +1268,6 @@ function handleAccountabilityTargetChange(val) {
} }
} }
const fileClasss = [
{
id: 1,
classTitle: "容错免责样本申请表",
classRemarks: "",
},
{
id: 2,
classTitle:
"针对群众不满意原因,提供无过错的音视频、微信或短信截图等证明资料",
classRemarks: "",
},
{
id: 3,
classTitle: "110、122接处警开始、结束及处置过程中的视频截图",
classRemarks: "",
},
{
id: 4,
classTitle: "自动回访不满意后所对的回访录音",
classRemarks: "",
},
{
id: 5,
classTitle: "单位/个人所做其他工作",
classRemarks: "",
},
];
function validatFiles(rule, value, callback) {
const keys = Object.keys(value);
if (keys.length === 0) {
return callback(new Error("请上传佐证材料"));
}
const sum = keys.map((key) => value[key].length).reduce((a, b) => a + b, 0);
if (sum === 0) {
return callback(new Error("请上传佐证材料"));
}
return callback();
}
function handleChangeCheckStatus(val, item) { function handleChangeCheckStatus(val, item) {
form.value.checkStatusName = dict.inspectCase.filter( form.value.checkStatusName = dict.inspectCase.filter(
(item) => item.dictValue === val (item) => item.dictValue === val
@ -1313,6 +1280,14 @@ function handleChangeCheckStatus(val, item) {
} }
} }
function handleChangePolice(police, item) {
console.log(police)
item.blameName = police.name;
item.blameIdCode = police.idCode;
item.ivPersonTypeCode = police.personType
}
function handleChangeSubjectiveAspect(val, item) { function handleChangeSubjectiveAspect(val, item) {
if (val === SubjectiveAspect.OTHER) { if (val === SubjectiveAspect.OTHER) {
item.subjectiveAspectName = ""; item.subjectiveAspectName = "";
@ -1348,7 +1323,7 @@ function getData() {
defineExpose({ defineExpose({
validate, validate,
getData getData,
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

4
src/style/public.scss

@ -389,7 +389,9 @@ svg+span {
top: 0; top: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
background-color: rgba(0, 0, 0, 0.8); background-color: #4d515d80;
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
z-index: 999; z-index: 999;
} }

14
src/views/sensitivePerception/DepartNegative.vue

@ -94,7 +94,7 @@
type="primary" type="primary"
link link
@click="handleShowProfile(row)" @click="handleShowProfile(row)"
>问题画像</el-button >问题详情</el-button
> >
</template> </template>
</el-table-column> </el-table-column>
@ -117,7 +117,7 @@
</div> </div>
<el-dialog <el-dialog
title="单位问题画像" title="单位问题详情"
v-model="show" v-model="show"
width="85vw" width="85vw"
top="1vh" top="1vh"
@ -137,7 +137,7 @@
<el-scrollbar <el-scrollbar
max-height="calc(98vh - 120px)" max-height="calc(98vh - 120px)"
v-loading="loading" v-loading="loading"
element-loading-text="单位问题画像加载中..." element-loading-text="单位问题详情加载中..."
> >
<main> <main>
<el-row class="mb-20"> <el-row class="mb-20">
@ -202,7 +202,7 @@
</el-col> </el-col>
<el-col :span="18"> <el-col :span="18">
<el-row> <el-row>
<el-col :span="12" class="mb-20"> <el-col :span="12" class="mb-20" v-if="negativeInfo.jcj110BusinessSize || negativeInfo.jcj110Size">
<description-pair <description-pair
label1="110接处警量" label1="110接处警量"
label2="问题数" label2="问题数"
@ -212,7 +212,7 @@
:value2="negativeInfo.jcj110Size" :value2="negativeInfo.jcj110Size"
/> />
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12" v-if="negativeInfo.jcj122BusinessSize || negativeInfo.jcj122Size">
<description-pair <description-pair
label1="122接处警量" label1="122接处警量"
label2="问题数" label2="问题数"
@ -298,7 +298,7 @@
<el-row class="mb-20"> <el-row class="mb-20">
<el-col :span="8"> <el-col :span="8">
<h5>个人问题排名</h5> <h5>个人问题排名</h5>
<el-scrollbar max-height="500px"> <el-scrollbar max-height="300px">
<datav-chart-bar <datav-chart-bar
size="small" size="small"
:data="policeBarList" :data="policeBarList"
@ -310,7 +310,7 @@
<el-col :span="8"> <el-col :span="8">
<h5>突出问题排名</h5> <h5>突出问题排名</h5>
<el-scrollbar max-height="500px"> <el-scrollbar max-height="300px">
<datav-chart-bar <datav-chart-bar
size="small" size="small"
:data="problemTypeBarList" :data="problemTypeBarList"

25
src/views/sensitivePerception/ModelClueTask.vue

@ -76,6 +76,7 @@
label="涉及单位数" label="涉及单位数"
align="center" align="center"
prop="departSize" prop="departSize"
width="130"
/> />
<el-table-column <el-table-column
label="涉及人数" label="涉及人数"
@ -90,6 +91,12 @@
@click="handleStatisticsShow(row.id)" @click="handleStatisticsShow(row.id)"
>任务统计</el-button >任务统计</el-button
> >
<el-button
type="primary"
link
@click="handleCluesShow(row.id)"
>查看详情</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -152,9 +159,13 @@
</div> </div>
</div> </div>
</el-dialog> </el-dialog>
<el-dialog title="分发详情" v-model="show" width="80vw">
</el-dialog>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { listModelClueTask, listModelClueByDepart } from "@/api/sensitivePerception/modelClueTask"; import { listModelClueTask, listModelClueByDepart, listModelClues } from "@/api/sensitivePerception/modelClueTask";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
import { getDictLable } from "@/utils/util"; import { getDictLable } from "@/utils/util";
@ -195,6 +206,18 @@ async function handleStatisticsShow(id) {
departList.value = data; departList.value = data;
statisticsShow.value = true; statisticsShow.value = true;
} }
const show = ref(false)
const modelClues = ref([])
const modelClueQuery = ref({
current: 1,
size: 10
})
async function handleCluesShow(id) {
const data = await listModelClues(id, modelClueQuery.value)
modelClues.value = data.records;
show.value = true;
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>

10
src/views/sensitivePerception/PoliceNegative.vue

@ -96,7 +96,7 @@
type="primary" type="primary"
link link
@click="handleShowProfile(row)" @click="handleShowProfile(row)"
>问题画像</el-button >问题详情</el-button
> >
</template> </template>
</el-table-column> </el-table-column>
@ -119,7 +119,7 @@
</div> </div>
<el-dialog <el-dialog
title="个人问题画像" title="个人问题详情"
v-model="show" v-model="show"
width="85vw" width="85vw"
top="1vh" top="1vh"
@ -139,7 +139,7 @@
<el-scrollbar <el-scrollbar
max-height="calc(98vh - 120px)" max-height="calc(98vh - 120px)"
v-loading="loading" v-loading="loading"
element-loading-text="个人问题画像加载中..." element-loading-text="个人问题详情加载中..."
> >
<main> <main>
<el-row class="mb-20"> <el-row class="mb-20">
@ -215,7 +215,7 @@
</el-col> </el-col>
<el-col :span="18"> <el-col :span="18">
<el-row> <el-row>
<el-col :span="12" class="mb-20"> <el-col :span="12" class="mb-20" v-if="negativeInfo.jcj110BusinessSize || negativeInfo.jcj110Size">
<description-pair <description-pair
label1="110接处警量" label1="110接处警量"
label2="问题数" label2="问题数"
@ -225,7 +225,7 @@
:value2="negativeInfo.jcj110Size" :value2="negativeInfo.jcj110Size"
/> />
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12" v-if="negativeInfo.jcj122BusinessSize || negativeInfo.jcj122Size">
<description-pair <description-pair
label1="122接处警量" label1="122接处警量"
label2="问题数" label2="问题数"

39
src/views/work/Done.vue

@ -79,33 +79,40 @@
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>问题发生时间</label> <label>问题发生时间</label>
<span>{{ row.happenTime }}</span> <span>{{ row.happenTime || "/" }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>问题来源</label> <label>问题录入时间</label>
<span>{{ row.problemSources }}</span> <span>{{ row.crtTime }}</span>
</div> </div>
</div> </div>
<div class="row mt-10"> <div class="row mt-10">
<div class="col col-6"> <div class="col col-6">
<label>投诉反映人</label> <label>问题来源</label>
<span>{{ row.responderName }}</span> <span>{{ row.problemSources }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>联系电话</label> <label>业务类别</label>
<span>{{ row.contactPhone }}</span> <span>{{ row.businessTypeName }}</span>
</div>
<div class="col col-12">
<label>涉嫌问题</label>
<span>{{
getInvolveProblem(row.involveProblem)
}}</span>
</div> </div>
</div> </div>
<div class="row mt-10"> <div class="row mt-10">
<div class="col col-6"> <div class="col col-6">
<label>业务类别</label> <label>投诉反映人</label>
<span>{{ row.businessTypeName }}</span> <span>{{ row.responderName }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>涉嫌问题</label> <label>联系电话</label>
<span>{{ getInvolveProblem(row.involveProblem) }}</span> <span>{{ row.contactPhone }}</span>
</div> </div>
</div> </div>
<div class="row mt-10"> <div class="row mt-10">
<div class="col col-6"> <div class="col col-6">
<label>涉及警种</label> <label>涉及警种</label>
@ -113,7 +120,15 @@
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>涉及单位</label> <label>涉及单位</label>
<span>{{ row.involveDepartName }}</span> <span>{{
row.involveDepartName || "/"
}}</span>
</div>
</div>
<div class="row mt-10">
<div class="col col-24">
<label>事情简要描述</label>
<span>{{ row.thingDesc }}</span>
</div> </div>
</div> </div>
</template> </template>

273
src/views/work/Query.vue

@ -361,14 +361,6 @@
>办理超时 >办理超时
{{ formatTimeText(row.handleTimeout) }}</el-tag {{ formatTimeText(row.handleTimeout) }}</el-tag
> >
<el-tag
v-else-if="
row.processingStatus ===
ProcessingStatus.COMPLETED
"
type="success"
>未超时</el-tag
>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="办理状态" width="110"> <el-table-column label="办理状态" width="110">
@ -408,7 +400,7 @@
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="120"> <el-table-column label="操作" width="160">
<template #default="{ row }"> <template #default="{ row }">
<el-button <el-button
type="primary" type="primary"
@ -416,6 +408,13 @@
@click="handleAction(row)" @click="handleAction(row)"
>详情</el-button >详情</el-button
> >
<el-button
type="primary"
link
@click="handleEdit(row)"
v-perms="['negative:edit']"
>编辑</el-button
>
<el-button <el-button
type="danger" type="danger"
link link
@ -448,15 +447,246 @@
:id="activeNegativeId" :id="activeNegativeId"
@close="show = false" @close="show = false"
/> />
<el-dialog v-model="editShow" title="问题编辑" width="900px">
<el-form
label-width="148"
:model="formData"
ref="formRef"
>
<div style="margin-bottom: 80px">
<el-row>
<el-col :span="12">
<el-form-item
label="问题来源"
prop="problemSourcesCode"
:rules="{
required: true,
message: '请选择问题来源',
trigger: ['blur'],
}"
>
<dict-select
name="problemSources"
v-model="formData.problemSourcesCode"
@change="
(nodeData) =>
(formData.problemSources = nodeData.label)
"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="业务类别"
prop="businessTypeCode"
:rules="{
required: true,
message: '请选择业务类别',
trigger: ['blur'],
}"
>
<el-select
v-model="formData.businessTypeCode"
@change="
(val) =>
(formData.businessTypeName =
dict.businessType.filter(
(item) => item.dictValue === val
)[0].dictLabel)
"
>
<el-option
v-for="item in dict.businessType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="涉及案件/警情编号"
prop="caseNumber"
>
<el-input
v-model="formData.caseNumber"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="涉嫌问题"
prop="involveProblem"
:rules="{
required: true,
message: '请选择涉嫌问题',
trigger: ['blur'],
}"
>
<el-select
v-model="formData.involveProblemCode"
multiple
@change="handleSelectInvolveProblem"
clearable
>
<el-option
v-for="item in dict.suspectProblem"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item-ext
label="涉及警种"
content="囊括了市局除分县市局以外的所有业务警种,便于后期统计分析业务条线的问题。"
prop="policeType"
>
<el-select
v-model="formData.policeType"
@change="
(val) =>
(formData.policeTypeName =
dict.policeType.filter(
(item) => item.dictValue === val
)[0].dictLabel)
"
clearable
>
<el-option
v-for="item in dict.policeType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item-ext>
</el-col>
<el-col :span="12">
<el-form-item
label="问题涉及单位"
prop="involveDepartId"
:rules="{
required: true,
message: '请选择问题涉及单位',
trigger: ['blur'],
}"
>
<depart-tree-select
v-model="formData.involveDepartId"
:check-strictly="true"
@node-click="
(row) =>
(formData.involveDepartName = row.shortName)
"
/>
</el-form-item>
</el-col>
</el-row>
<el-row
v-if="ProblemSources_XFTS.includes(formData.problemSourcesCode)"
>
<el-col :span="12">
<el-form-item label="投诉反映人" prop="responderName">
<el-input
placeholder="请输入"
v-model="formData.responderName"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="contactPhone">
<el-input
v-model="formData.contactPhone"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
label="问题发现时间"
prop="discoveryTime"
:rules="{
required: true,
message: '请选择问题发现时间',
trigger: ['blur'],
}"
>
<el-date-picker
v-model="formData.discoveryTime"
type="datetime"
placeholder="请选择"
value-format="YYYY-MM-DD HH:mm"
time-format="HH:mm"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="问题发生时间" prop="happenTime">
<el-date-picker
v-model="formData.happenTime"
type="datetime"
placeholder="请选择"
value-format="YYYY-MM-DD HH:mm"
time-format="HH:mm"
style="width: 100%"
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item
label="事情简要描述"
prop="thingDesc"
:rules="{
required: true,
message: '请输入事情简要描述',
trigger: ['blur'],
}"
>
<el-input
type="textarea"
placeholder="请输入"
v-model="formData.thingDesc"
:autosize="{ minRows: 4 }"
/>
</el-form-item>
</div>
</el-form>
<footer class="flex end">
<el-button @click="editShow = false" size="large">取消</el-button>
<el-button
type="primary"
@click="handleSumbit"
size="large"
>确定</el-button
>
</footer>
</el-dialog>
</template> </template>
<script setup> <script setup>
import moment from "moment"; import moment from "moment";
import { ElLoading } from "element-plus"; import { ElLoading } from "element-plus";
import { listNegative, negativeExport, delNegative } from "@/api/work/negative"; import { listNegative, negativeExport, delNegative, updateNegative } from "@/api/work/negative";
import { getDictLable, formatTimeText, getInvolveProblem } from "@/utils/util"; import { getDictLable, formatTimeText, getInvolveProblem } from "@/utils/util";
import feedback from "@/utils/feedback"; import feedback from "@/utils/feedback";
import { ProcessingStatus } from "@/enums/flowEnums"; import { ProcessingStatus } from "@/enums/flowEnums";
import {
ProblemSources_XFTS,
} from "@/enums/dictEnums";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore(); const catchStore = useCatchStore();
@ -465,6 +695,8 @@ const dict = catchStore.getDicts([
"inspectCase", "inspectCase",
"isRectify", "isRectify",
"processingStatus", "processingStatus",
"suspectProblem",
"policeType",
]); ]);
const flowNodes = catchStore.getFlowNodes(); const flowNodes = catchStore.getFlowNodes();
const dictProblemSources = catchStore.getDictProblemSources(); const dictProblemSources = catchStore.getDictProblemSources();
@ -505,7 +737,7 @@ const route = useRoute();
watch( watch(
() => route.query, () => route.query,
() => { () => {
updateQuery() updateQuery();
getList(); getList();
} }
); );
@ -527,7 +759,7 @@ function updateQuery() {
} }
onMounted(() => { onMounted(() => {
updateQuery() updateQuery();
getList(); getList();
}); });
@ -559,6 +791,23 @@ async function handleDel(row) {
feedback.msgSuccess("操作成功"); feedback.msgSuccess("操作成功");
getList(); getList();
} }
const editShow = ref(false)
const formData = ref({})
const formRef = ref(null)
function handleEdit(row) {
formData.value = {...row}
editShow.value = true
}
async function handleSumbit() {
await formRef.value.validate()
await updateNegative(formData.value)
editShow.value = false
feedback.msgSuccess("操作成功");
getList();
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.form-row { .form-row {

Loading…
Cancel
Save