Browse Source

fit: 新增基础数据/案件核查 perf: 完善基础数据/国家信访投诉、基础数据/公安部信访投诉

main
wxc 1 year ago
parent
commit
494f0b9c19
  1. 28
      src/api/data/caseVerif.ts
  2. 10
      src/api/data/petitionComplaint.ts
  3. 6
      src/api/system/depart.ts
  4. 7
      src/api/system/dict.ts
  5. 51
      src/components/date-time-range-picker-ext.vue
  6. 74
      src/components/negative/add.vue
  7. 23
      src/components/negative/distribute.vue
  8. 4
      src/components/negative/verify-description.vue
  9. 140
      src/components/negative/verify.vue
  10. 60
      src/layout/components/Header.vue
  11. 2
      src/stores/modules/catch.ts
  12. 5
      src/utils/token.ts
  13. 8
      src/utils/util.ts
  14. 349
      src/views/data/Ajhc.vue
  15. 164
      src/views/data/Gabxf.vue
  16. 39
      src/views/data/Gjxf.vue
  17. 10
      src/views/sensitivePerception/ClueData.vue
  18. 84
      src/views/system/Dict.vue
  19. 6
      src/views/system/Holiday.vue
  20. 45
      src/views/system/Menu.vue
  21. 152
      src/views/system/Police.vue
  22. 57
      src/views/work/Done.vue
  23. 7
      src/views/work/Fav.vue
  24. 10
      src/views/work/NegativeTask.vue
  25. 36
      src/views/work/Query.vue
  26. 21
      src/views/work/Todo.vue

28
src/api/data/caseVerif.ts

@ -0,0 +1,28 @@
import request from "@/api/request";
export function importCaseVerif(body) {
return request.post({
url: '/data/caseVerif/import',
body
});
}
export function listCaseVerif(query) {
return request.get({
url: '/data/caseVerif',
query
});
}
export function addCaseVerif(dataUpdateMethod, body) {
return request.post({
url: `/data/caseVerif/${dataUpdateMethod}`,
body
});
}
export function delCaseVerif(id) {
return request.del({
url: `/data/caseVerif/${id}`
});
}

10
src/api/data/petitionComplaint.ts

@ -14,9 +14,15 @@ export function listPetitionComplaint(query) {
}); });
} }
export function addPetitionComplaint(body, dataUpdateMethod) { export function addPetitionComplaint(body) {
return request.post({ return request.post({
url: `/data/petitionComplaint/dataUpdateMethod/${dataUpdateMethod}`, url: `/data/petitionComplaint`,
body body
}); });
} }
export function delPetitionComplaint(id) {
return request.del({
url: `/data/petitionComplaint/${id}`
});
}

6
src/api/system/depart.ts

@ -26,6 +26,12 @@ export function secondList() {
}); });
} }
export function listByFirstHost() {
return request.get({
url: '/depart/firstHost'
});
}
export function listChildren(departId) { export function listChildren(departId) {
return request.get({ return request.get({
url: `/depart/${departId}/children` url: `/depart/${departId}/children`

7
src/api/system/dict.ts

@ -14,6 +14,13 @@ export function addDictType(body) {
}); });
} }
export function updateDictType(body) {
return request.put({
url: '/dict',
body
});
}
export function listDictDatas(query, dictType) { export function listDictDatas(query, dictType) {
return request.get({ return request.get({
url: `/dict/${dictType}/dictData`, url: `/dict/${dictType}/dictData`,

51
src/components/date-time-range-picker-ext.vue

@ -0,0 +1,51 @@
<template>
<el-date-picker
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
value-format="YYYY-MM-DD HH:mm:ss"
:shortcuts="shortcuts"
/>
</template>
<script setup>
const shortcuts = [
{
text: "今天",
value: () => {
const end = new Date();
const start = new Date();
start.setHours(0, 0, 0, 0);
return [start, end];
},
},
{
text: "近一周",
value: () => {
const end = new Date();
const start = new Date();
start.setDate(start.getDate() - 7);
return [start, end];
},
},
{
text: "近一个月",
value: () => {
const end = new Date();
const start = new Date();
start.setMonth(start.getMonth() - 1)
return [start, end];
},
},
{
text: "近三个月",
value: () => {
const end = new Date();
const start = new Date();
start.setMonth(start.getMonth() - 3)
return [start, end];
},
},
];
</script>
<style lang="scss" scoped>
</style>

74
src/components/negative/add.vue

@ -21,10 +21,15 @@
trigger: ['blur'], trigger: ['blur'],
}" }"
> >
<dict-select name="problemSources" v-model="form.problemSourcesCode" @change=" <dict-select
name="problemSources"
v-model="form.problemSourcesCode"
@change="
(nodeData) => (nodeData) =>
(form.problemSources = nodeData.label) (form.problemSources =
" /> nodeData.label)
"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -173,14 +178,14 @@
prop="involveDepartId" prop="involveDepartId"
:rules="{ :rules="{
required: true, required: true,
message: '请选择问题涉及单位' message: '请选择问题涉及单位',
}" }"
> >
<depart-tree-select <depart-tree-select
v-model="form.involveDepartId" v-model="form.involveDepartId"
@node-click=" @node-click="
(row) => (row) =>
(form.involveDepartName = row.name) (form.involveDepartName = row.shortName)
" "
/> />
</el-form-item> </el-form-item>
@ -188,7 +193,9 @@
</el-row> </el-row>
<el-row <el-row
v-if=" v-if="
ProblemSources_XFTS.includes(form.problemSourcesCode) ProblemSources_XFTS.includes(
form.problemSourcesCode
)
" "
> >
<el-col :span="12"> <el-col :span="12">
@ -253,7 +260,7 @@
prop="thingDesc" prop="thingDesc"
:rules="{ :rules="{
required: true, required: true,
message: '请输入事情简要描述' message: '请输入事情简要描述',
}" }"
> >
<el-input <el-input
@ -307,7 +314,7 @@
</div> </div>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="指具体办理单位" label="指具体办理单位"
prop="departId" prop="departId"
:rules="{ :rules="{
required: true, required: true,
@ -324,6 +331,7 @@
filterable filterable
v-model="form.departId" v-model="form.departId"
@node-click="handleSelectDepart" @node-click="handleSelectDepart"
check-strictly
style="width: 280px" style="width: 280px"
/> />
<el-button <el-button
@ -477,11 +485,11 @@ import {
TimeLimit, TimeLimit,
ApprovalFlow, ApprovalFlow,
ProblemSources, ProblemSources,
ProblemSources_XFTS ProblemSources_XFTS,
} from "@/enums/dictEnums"; } from "@/enums/dictEnums";
import feedback from "@/utils/feedback"; import feedback from "@/utils/feedback";
import { addNegative, generateOriginId } from "@/api/work/negative"; import { addNegative, generateOriginId } from "@/api/work/negative";
import { secondList, departTree } from "@/api/system/depart"; import { secondList, departTree, listByFirstHost } from "@/api/system/depart";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore(); const catchStore = useCatchStore();
@ -513,9 +521,9 @@ const formRef = ref(null);
async function handleAddNegative() { async function handleAddNegative() {
try { try {
await formRef.value.validate(); await formRef.value.validate();
} catch(e) { } catch (e) {
feedback.msgWarning('请检查输入项') feedback.msgWarning("请检查输入项");
throw e throw e;
} }
form.value.thingFiles = form.value.thingFiles.filter( form.value.thingFiles = form.value.thingFiles.filter(
(item) => item.filePath (item) => item.filePath
@ -532,33 +540,23 @@ async function handleAddNegative() {
} }
const departs = ref<any[]>([]); const departs = ref<any[]>([]);
function getDeparts() { async function getDeparts() {
if (form.value.hostLevel === HostLevel.FIRST) { if (form.value.hostLevel === HostLevel.FIRST) {
departs.value = [ departs.value = await listByFirstHost()
{
id: "2785",
shortName: "警务督察支队",
},
{
id: "13494",
shortName: "机关纪委",
},
{
id: "2780",
shortName: "市纪委市监委派驻纪检监察组",
},
];
} }
if (form.value.hostLevel === HostLevel.SECOND) { else if (form.value.hostLevel === HostLevel.SECOND) {
secondList().then((data) => { departs.value = await secondList()
departs.value = data;
});
} }
if (form.value.hostLevel === HostLevel.THREE) { else if (form.value.hostLevel === HostLevel.THREE) {
departTree().then((data) => { const data = await departTree()
departs.value = data; data.forEach(item => {
}); if (item.level === 1) {
item.disabled = true
}
})
departs.value = data
} }
} }
function handleSelectDepart(row, node) { function handleSelectDepart(row, node) {
@ -579,8 +577,8 @@ function handleSelectInvolveProblem(vals) {
} }
function handleLinkDepart() { function handleLinkDepart() {
form.value.departId = form.value.involveDepartId form.value.departId = form.value.involveDepartId;
form.value.departName = form.value.involveDepartName form.value.departName = form.value.involveDepartName;
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

23
src/components/negative/distribute.vue

@ -67,7 +67,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
import { secondList, listChildren, departTree } from "@/api/system/depart"; import { secondList, listChildren, departTree, listByFirstHost } from "@/api/system/depart";
import { FlowNodeEnum } from "@/enums/flowEnums"; import { FlowNodeEnum } from "@/enums/flowEnums";
import { HostLevel } from "@/enums/dictEnums"; import { HostLevel } from "@/enums/dictEnums";
@ -86,27 +86,16 @@ const negative = inject("negative");
function getDeparts() { function getDeparts() {
if (negative.value.flowKey === FlowNodeEnum.FIRST_DISTRIBUTE) { if (negative.value.flowKey === FlowNodeEnum.FIRST_DISTRIBUTE) {
if (form.value.hostLevel === HostLevel.FIRST) { if (form.value.hostLevel === HostLevel.FIRST) {
departs.value = [ listByFirstHost().then((data) => {
{ departs.value = data;
id: '2785', });
name: '警务督察支队'
},
{
id: '13494',
name: '机关纪委'
},
{
id: '2780',
name: '市纪委市监委派驻纪检监察组'
},
]
} }
if (form.value.hostLevel === HostLevel.SECOND) { else if (form.value.hostLevel === HostLevel.SECOND) {
secondList().then((data) => { secondList().then((data) => {
departs.value = data; departs.value = data;
}); });
} }
if (form.value.hostLevel === HostLevel.THREE) { else if (form.value.hostLevel === HostLevel.THREE) {
departTree().then((data) => { departTree().then((data) => {
departs.value = data; departs.value = data;
}); });

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

@ -46,7 +46,7 @@
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>督察措施</label> <label>督察措施</label>
<span>{{ blame.superviseMeasuresName }}</span> <span>{{ blame.superviseMeasuresName || '/' }}</span>
</div> </div>
</div> </div>
@ -115,7 +115,7 @@
<el-collapse-item v-for="(blame, index) in negative.blames.filter(item => item.type === BlameType.DEPARTMENT)" :key="index" :title="`涉及单位`" :name="`involved_department`"> <el-collapse-item v-for="(blame, index) in negative.blames.filter(item => item.type === BlameType.DEPARTMENT)" :key="index" :title="`涉及单位`" :name="`involved_department`">
<div class="row"> <div class="row">
<div class="col col-6"> <div class="col col-6">
<label>涉及人姓名</label> <label>班子成员姓名</label>
<span>{{ blame.blameName }}</span> <span>{{ blame.blameName }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">

140
src/components/negative/verify.vue

@ -287,8 +287,13 @@
filterable filterable
accordion accordion
style="width: 420px" style="width: 420px"
@current-change="(nodeData, node) => handleChangeProblem(node, problem)" @current-change="
(nodeData, node) =>
handleChangeProblem(
node,
problem
)
"
/> />
<el-button <el-button
type="danger" type="danger"
@ -302,9 +307,21 @@
</template> </template>
</el-button> </el-button>
<div class="ml-16"> <div class="ml-16">
<span>{{ problem.oneLevelContent }}</span> <span>{{
<span>{{ problem.twoLevelContent ? ' / ' + problem.twoLevelContent : '' }}</span> problem.oneLevelContent
<span>{{ problem.threeLevelContent ? ' / ' + problem.threeLevelContent : '' }}</span> }}</span>
<span>{{
problem.twoLevelContent
? " / " +
problem.twoLevelContent
: ""
}}</span>
<span>{{
problem.threeLevelContent
? " / " +
problem.threeLevelContent
: ""
}}</span>
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -351,7 +368,10 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" v-if="form.checkStatus !== InspectCase.FALSE"> <el-col
:span="12"
v-if="form.checkStatus !== InspectCase.FALSE"
>
<el-form-item <el-form-item
label="主观方面" label="主观方面"
:prop="`blames.${index}.subjectiveAspectCode`" :prop="`blames.${index}.subjectiveAspectCode`"
@ -436,7 +456,10 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" v-if="form.checkStatus !== InspectCase.FALSE"> <el-col
:span="12"
v-if="form.checkStatus !== InspectCase.FALSE"
>
<el-form-item <el-form-item
label="督察措施" label="督察措施"
:prop="`blames[${index}].superviseMeasuresCode`" :prop="`blames[${index}].superviseMeasuresCode`"
@ -673,7 +696,10 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" v-if="form.checkStatus !== InspectCase.FALSE"> <el-col
:span="12"
v-if="form.checkStatus !== InspectCase.FALSE"
>
<el-form-item <el-form-item
label="督察措施" label="督察措施"
:prop="`blames.${index}.leadMeasuresCode`" :prop="`blames.${index}.leadMeasuresCode`"
@ -828,7 +854,10 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" v-if="form.checkStatus !== InspectCase.FALSE"> <el-col
:span="12"
v-if="form.checkStatus !== InspectCase.FALSE"
>
<el-form-item <el-form-item
label="督察措施" label="督察措施"
:prop="`blames.${index}.superviseMeasuresCode`" :prop="`blames.${index}.superviseMeasuresCode`"
@ -890,8 +919,13 @@
filterable filterable
accordion accordion
style="width: 420px" style="width: 420px"
@current-change="(nodeData, node) => handleChangeProblem(node, problem)" @current-change="
(nodeData, node) =>
handleChangeProblem(
node,
problem
)
"
/> />
<el-button <el-button
type="danger" type="danger"
@ -905,9 +939,21 @@
</template> </template>
</el-button> </el-button>
<div class="ml-16"> <div class="ml-16">
<span>{{ problem.oneLevelContent }}</span> <span>{{
<span>{{ problem.twoLevelContent ? ' / ' + problem.twoLevelContent : '' }}</span> problem.oneLevelContent
<span>{{ problem.threeLevelContent ? ' / ' + problem.threeLevelContent : '' }}</span> }}</span>
<span>{{
problem.twoLevelContent
? " / " +
problem.twoLevelContent
: ""
}}</span>
<span>{{
problem.threeLevelContent
? " / " +
problem.threeLevelContent
: ""
}}</span>
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -1063,9 +1109,14 @@
<p>自动回访结果不满意时请提供所队的回访录音</p> <p>自动回访结果不满意时请提供所队的回访录音</p>
<p>单位或个人所开展的其他相关工作证明材料</p> <p>单位或个人所开展的其他相关工作证明材料</p>
</div> </div>
<div v-if="negative.problemSourcesCode === ProblemSources.JDGL"></div> <div
v-if="negative.problemSourcesCode === ProblemSources.JDGL"
></div>
<div style="width: 100%" class="mb-10 mt-10"> <div style="width: 100%" class="mb-10 mt-10">
<file-upload-group v-model:files="form.files" :problemSourcesCode="negative.problemSourcesCode" /> <file-upload-group
v-model:files="form.files"
:problemSourcesCode="negative.problemSourcesCode"
/>
</div> </div>
<file-list :files="form.files" /> <file-list :files="form.files" />
</el-form-item> </el-form-item>
@ -1103,24 +1154,33 @@ const dict = catchSotre.getDicts([
const dictContent = catchSotre.getDictContent(); const dictContent = catchSotre.getDictContent();
const negative = inject("negative"); const negative = inject("negative");
const form = ref({ const form = ref({});
caseNumber: negative.value.caseNumber, getFormData()
checkStatus: negative.value.checkStatus,
checkStatusName: negative.value.checkStatusName, watch(negative, () => {
isRectifyName: negative.value.isRectifyName, getFormData()
isRectifyCode: negative.value.isRectifyCode,
checkStatusDesc: negative.value.checkStatusDesc,
rectifyDesc: negative.value.rectifyDesc,
rectifyRestrictionDays: negative.value.rectifyRestrictionDays,
accountabilityTarget:
negative.value.accountabilityTarget ||
negative.value.problemSourcesCode === ProblemSources.JWDC
? AccountabilityTarget.PERSONAL
: "",
blames: negative.value.blames,
files: [],
}); });
function getFormData() {
form.value = {
caseNumber: negative.value.caseNumber,
checkStatus: negative.value.checkStatus,
checkStatusName: negative.value.checkStatusName,
isRectifyName: negative.value.isRectifyName,
isRectifyCode: negative.value.isRectifyCode,
checkStatusDesc: negative.value.checkStatusDesc,
rectifyDesc: negative.value.rectifyDesc,
rectifyRestrictionDays: negative.value.rectifyRestrictionDays,
accountabilityTarget:
negative.value.accountabilityTarget ||
negative.value.problemSourcesCode === ProblemSources.JWDC
? AccountabilityTarget.PERSONAL
: "",
blames: negative.value.blames,
files: [],
};
}
function handleAddPersomal() { function handleAddPersomal() {
form.value.blames.push({ form.value.blames.push({
type: BlameType.PERSONAL, type: BlameType.PERSONAL,
@ -1245,7 +1305,10 @@ function handleChangeCheckStatus(val, item) {
form.value.checkStatusName = dict.inspectCase.filter( form.value.checkStatusName = dict.inspectCase.filter(
(item) => item.dictValue === val (item) => item.dictValue === val
)[0].dictLabel; )[0].dictLabel;
if (form.value.accountabilityTarget !== AccountabilityTarget.DEPARTMENT && form.value.blames.length === 0) { if (
form.value.accountabilityTarget !== AccountabilityTarget.DEPARTMENT &&
form.value.blames.length === 0
) {
handleAddPersomal(); handleAddPersomal();
} }
} }
@ -1258,16 +1321,15 @@ function handleChangeSubjectiveAspect(val, item) {
item.subjectiveAspectName = dict.subjectiveAspect.filter( item.subjectiveAspectName = dict.subjectiveAspect.filter(
(item) => item.dictValue === val (item) => item.dictValue === val
)[0].dictLabel; )[0].dictLabel;
} }
function handleChangeProblem(node, problem) { function handleChangeProblem(node, problem) {
if (node.level === 3) { if (node.level === 3) {
problem.threeLevelContent = node.label problem.threeLevelContent = node.label;
problem.oneLevelCode = node.parent.parent.key problem.oneLevelCode = node.parent.parent.key;
problem.oneLevelContent = node.parent.parent.label problem.oneLevelContent = node.parent.parent.label;
problem.twoLevelCode = node.parent.key problem.twoLevelCode = node.parent.key;
problem.twoLevelContent = node.parent.label problem.twoLevelContent = node.parent.label;
} }
} }

60
src/layout/components/Header.vue

@ -6,29 +6,29 @@
</a> </a>
<span>长沙公安数字督察一体化平台</span> <span>长沙公安数字督察一体化平台</span>
</div> </div>
<section class="flex gap userinfo v-center pointer" @click.stop="dropdownShow = true"> <section
class="flex gap userinfo v-center pointer"
@click.stop="dropdownShow = true"
>
<icon name="el-icon-UserFilled" :size="29" color="#586EFF" /> <icon name="el-icon-UserFilled" :size="29" color="#586EFF" />
<span>{{ userStore.user.nickName }}</span> <span>{{ userStore.user.nickName }}</span>
<span>{{ userStore.user.departName }}</span> <span>{{ userStore.user.departName }}</span>
</section> </section>
</header> </header>
<ul class="userinfo-dropdown" v-if="dropdownShow"> <ul class="userinfo-dropdown" v-if="dropdownShow">
<li class="flex gap v-center" @click="openHelp"> <!-- <li class="flex gap v-center" @click="openHelp">
<icon name="local-icon-question" :size="22" /> <icon name="local-icon-question" :size="22" />
<span>帮助手册</span> <span>帮助手册</span>
</li> </li> -->
<li class="flex gap v-center" @click="supportShow = true"> <li class="flex gap v-center" @click="supportShow = true">
<icon name="el-icon-Star" :size="22" /> <icon name="el-icon-Star" :size="22" />
<span>技术支持</span> <span>技术支持</span>
</li> </li>
<li class="flex gap v-center" @click="goBackV1">
<template v-if="VITE_PROFILES === 'prod'"> <icon name="el-icon-Back" :size="20" />
<li class="flex gap v-center" @click="goBackV1"> <span>返回旧版</span>
<icon name="local-icon-logout" :size="20" /> </li>
<span>返回旧版</span> <li class="flex gap v-center" @click="handleLogout">
</li>
</template>
<li class="flex gap v-center" @click="handleLogout" v-else>
<icon name="local-icon-logout" :size="20" /> <icon name="local-icon-logout" :size="20" />
<span>退出登录</span> <span>退出登录</span>
</li> </li>
@ -48,35 +48,35 @@
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import useUserStore from '@/stores/modules/user' import useUserStore from "@/stores/modules/user";
import { deleteToken } from '@/utils/token' import { deleteToken } from "@/utils/token";
import { logout } from '@/api/auth' import { logout } from "@/api/auth";
const { VITE_PROFILES } = process.env; const { VITE_PROFILES } = process.env;
const userStore = useUserStore() const userStore = useUserStore();
const router = useRouter() const router = useRouter();
const dropdownShow = ref(false) const dropdownShow = ref(false);
const supportShow = ref(false) const supportShow = ref(false);
document.addEventListener("click", () => { document.addEventListener("click", () => {
dropdownShow.value = false; dropdownShow.value = false;
}) });
async function handleLogout() { async function handleLogout() {
await logout() await logout();
deleteToken() deleteToken();
location.reload() location.reload();
} }
function goBackV1() { function goBackV1() {
window.location.href = '/' window.location.href = "/";
} }
function openHelp() { function openHelp() {
window.open(router.resolve('/support').href) window.open(router.resolve("/support").href);
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -107,8 +107,10 @@ header.main-header {
position: fixed; position: fixed;
right: 16px; right: 16px;
top: calc(var(--header-height) - 8px); top: calc(var(--header-height) - 8px);
background: #FFFFFF; background: #ffffff;
box-shadow: 0px 9px 28px 8px rgba(0,0,0,0.05), 0px 6px 16px 0px rgba(0,0,0,0.08), 0px 3px 6px -4px rgba(0,0,0,0.12); box-shadow: 0px 9px 28px 8px rgba(0, 0, 0, 0.05),
0px 6px 16px 0px rgba(0, 0, 0, 0.08),
0px 3px 6px -4px rgba(0, 0, 0, 0.12);
border-radius: 8px; border-radius: 8px;
margin: 0; margin: 0;
padding: 8px 0; padding: 8px 0;
@ -131,7 +133,7 @@ header.main-header {
width: 100%; width: 100%;
height: 160px; height: 160px;
line-height: 160px; line-height: 160px;
background: linear-gradient( 270deg, #1227BB 0%, #3BA2CF 100%); background: linear-gradient(270deg, #1227bb 0%, #3ba2cf 100%);
span { span {
width: 50%; width: 50%;
box-sizing: border-box; box-sizing: border-box;
@ -148,7 +150,7 @@ header.main-header {
color: #333; color: #333;
p { p {
margin-top: 1em; margin-top: 1em;
margin-bottom: .5em; margin-bottom: 0.5em;
} }
} }
} }

2
src/stores/modules/catch.ts

@ -51,7 +51,7 @@ const useCatchStore = defineStore({
return this.dict[key] return this.dict[key]
}, },
getDictContent() { getDictContent() {
if (!this.dictProblemSources.length) { if (!this.dictContent.length) {
const refresh = async () => { const refresh = async () => {
const res = await Promise.allSettled<Promise<any>>([listDictContentTree()]) const res = await Promise.allSettled<Promise<any>>([listDictContentTree()])
res.forEach((item) => { res.forEach((item) => {

5
src/utils/token.ts

@ -1,3 +1,5 @@
const { VITE_PROFILES } = process.env;
export function setCookie(name, value, daysToLive) { export function setCookie(name, value, daysToLive) {
let cookie = name + "=" + encodeURIComponent(value); let cookie = name + "=" + encodeURIComponent(value);
if (typeof daysToLive === "number") { if (typeof daysToLive === "number") {
@ -18,7 +20,8 @@ export function getCookie(name) {
} }
export function deleteCookie(name) { export function deleteCookie(name) {
document.cookie = name + '=; expires=-1;'; document.cookie = name + `=; expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/;`;
document.cookie = name + `=; expires=Thu, 01 Jan 1970 00:00:00 GMT;path=${VITE_PROFILES};`;
} }
const TOKEN_KEY = "token" const TOKEN_KEY = "token"

8
src/utils/util.ts

@ -361,3 +361,11 @@ export function getIconName(fileName) {
} }
return "el-icon-document"; return "el-icon-document";
} }
// 解析涉嫌问题
export function getInvolveProblem(json) {
if (!json) {
return ''
}
return JSON.parse(json).map(item => item.dictLabel).join(' ')
}

349
src/views/data/Ajhc.vue

@ -0,0 +1,349 @@
<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 between">
<el-button type="primary" @click="show = true"
>数据导入</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="originId"
show-overflow-tooltip
/>
<el-table-column
label="受理时间"
prop="discoveryTime"
show-overflow-tooltip
/>
<el-table-column
label="问题发生时间"
prop="happenTime"
/>
<el-table-column
label="问题来源"
prop="problemSources"
show-overflow-tooltip
/>
<el-table-column
label="投诉人"
prop="responderName"
width="90"
/>
<el-table-column
label="投诉人电话"
prop="contactPhone"
width="120"
/>
<el-table-column
label="业务类别"
prop="businessTypeName"
/>
<el-table-column
label="涉嫌问题"
prop="involveProblem"
/>
<el-table-column
label="涉及警种"
prop="policeTypeName"
/>
<el-table-column
label="涉及单位"
prop="complainedDepartName"
/>
<el-table-column
label="具体内容"
prop="thingDesc"
show-overflow-tooltip
/>
<el-table-column label="操作" width="200">
<template #default="{ row }">
<!-- <el-button type="primary" link>核查情况</el-button> -->
<el-button type="danger" link @click="handleDel(row)">删除</el-button>
<!-- <el-button
type="primary"
link
>问题核查</el-button
> -->
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getList"
@current-change="getList"
:current-page="query.current"
: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="案件核查 数据导入" v-model="show" width="80vw">
<div style="min-height: 500px">
<template v-if="step === 1">
<div class="mt-20">
<span>案件核查问题台账模板</span>
<a
class="link"
:href="`${BASE_PATH}/templates/案件核查问题台账(模板).xlsx`"
target="__blank"
>下载</a
>
</div>
<el-upload
drag
:multiple="false"
:auto-upload="false"
:show-file-list="false"
v-model:file-list="fileList"
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
class="mt-20"
>
<template v-if="fileList.length === 0">
<el-icon class="el-icon--upload"
><upload-filled
/></el-icon>
<div class="el-upload__text">
点击或拖拽文件到此区域上传
</div>
</template>
<template v-else>
<el-icon class="el-icon--upload"><Select /></el-icon>
<div class="el-upload__text">
已选择文件{{ fileList[fileList.length - 1].name }}
</div>
</template>
</el-upload>
<el-radio-group v-model="dataUpdateMethod" class="mt-20">
<el-radio value="incremental" border>增量更新</el-radio>
<el-radio value="overwrite" border>覆盖更新</el-radio>
</el-radio-group>
</template>
<template v-else>
<el-page-header @back="step = 1" class="mb-20"></el-page-header>
<div class="table-container">
<el-table :data="importTableData" ref="tableRef">
<el-table-column type="selection" />
<el-table-column
label="案件编号"
prop="originId"
show-overflow-tooltip
/>
<el-table-column
label="受理时间"
prop="discoveryTime"
show-overflow-tooltip
/>
<el-table-column
label="问题发生时间"
prop="happenTime"
/>
<el-table-column
label="问题来源"
prop="problemSources"
show-overflow-tooltip
/>
<el-table-column
label="投诉人"
prop="responderName"
width="90"
/>
<el-table-column
label="投诉人电话"
prop="contactPhone"
width="120"
/>
<el-table-column
label="业务类别"
prop="businessTypeName"
/>
<el-table-column
label="涉嫌问题"
prop="involveProblem"
/>
<el-table-column
label="涉及警种"
prop="policeTypeName"
/>
<el-table-column
label="涉及单位"
prop="complainedDepartName"
/>
<el-table-column
label="具体内容"
prop="thingDesc"
show-overflow-tooltip
/>
<el-table-column label="数据校验" width="120">
<template #default="{ row }">
<el-tag type="success">正确</el-tag>
</template>
</el-table-column>
</el-table>
</div>
</template>
</div>
<footer class="flex end mt-20 v-center">
<span class="mr-20" v-if="step === 2"
>选中<b>{{ checkRowSize }}</b>条数据</span
>
<el-button size="large" @click="show = false">取消</el-button>
<el-button
type="primary"
size="large"
@click="handleImport"
:disabled="fileList.length === 0"
v-if="step === 1"
>下一步</el-button
>
<el-button
type="primary"
size="large"
@click="handleSaveImport"
:disabled="checkRowSize === 0"
v-else
>确认导入</el-button
>
</footer>
</el-dialog>
</template>
<script setup>
import { BASE_PATH } from "@/api/request";
import {
importCaseVerif,
listCaseVerif,
addCaseVerif,
delCaseVerif
} from "@/api/data/caseVerif";
import { ProblemSources } from '@/enums/dictEnums'
import feedback from "@/utils/feedback";
const query = ref({
size: 10,
current: 1,
responderKey: 'name'
});
const list = ref([]);
const total = ref(0);
function getList() {
listCaseVerif(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 dataUpdateMethod = ref("incremental");
const fileList = ref([]);
const importTableData = ref([]);
const step = ref(1);
async function handleImport() {
const formData = new FormData();
formData.append("file", fileList.value[fileList.value.length - 1].raw);
importTableData.value = await importCaseVerif(formData);
step.value = 2;
nextTick(() => {
tableRef.value.toggleAllSelection();
});
}
const checkRowSize = computed(
() => tableRef.value?.getSelectionRows().length || 0
);
const tableRef = ref(null);
async function handleSaveImport() {
const rows = tableRef.value.getSelectionRows();
await addCaseVerif(dataUpdateMethod.value, [...rows]);
feedback.msgSuccess(`成功导入${rows.length}条数据`);
show.value = false;
step.value = 1
importTableData.value = []
fileList.value = []
getList();
}
async function handleDel(row) {
await feedback.confirm('确定要删除该数据?')
await delCaseVerif(row.originId)
getList()
}
</script>
<style lang="scss" scoped>
</style>

164
src/views/data/Gabxf.vue

@ -3,11 +3,43 @@
<header> <header>
<el-form :label-width="114"> <el-form :label-width="114">
<el-row> <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-col :span="6">
<el-form-item label="投诉人"> <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 <el-input
placeholder="请输入" placeholder="请输入"
v-model="query.userName" v-model="query.thingDesc"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -15,7 +47,7 @@
</el-form> </el-form>
<div class="mb-25 flex between"> <div class="mb-25 flex between">
<el-button type="primary" @click="show = true" <el-button type="primary" @click="show = true"
>公安部信访数据导入</el-button >数据导入</el-button
> >
<div> <div>
<el-button type="primary" @click="getList"> <el-button type="primary" @click="getList">
@ -30,31 +62,64 @@
</header> </header>
<div class="table-container"> <div class="table-container">
<el-table :data="list"> <el-table :data="list">
<el-table-column label="信件编号" prop="originId" show-overflow-tooltip /> <el-table-column
label="信件编号"
prop="originId"
show-overflow-tooltip
/>
<el-table-column <el-table-column
label="投诉渠道" label="投诉渠道"
prop="channelForFilingComplaints" prop="channelForFilingComplaints"
/> />
<el-table-column label="受理层级" prop="acceptanceLevel" show-overflow-tooltip /> <el-table-column
<el-table-column label="登记时间" width="discoveryTime" /> label="受理层级"
<el-table-column label="投诉人" prop="responderName" /> prop="acceptanceLevel"
show-overflow-tooltip
/>
<el-table-column
label="登记时间"
width="discoveryTime"
show-overflow-tooltip
/>
<el-table-column
label="投诉人"
prop="responderName"
width="90"
/>
<el-table-column label="电话" prop="responderPhone" /> <el-table-column label="电话" prop="responderPhone" />
<el-table-column label="初重信访" prop="initialPetition" /> <el-table-column
<el-table-column label="缠访闹访" prop="entanglementVisits" /> label="初重信访"
prop="initialPetition"
align="center"
width="90"
/>
<el-table-column
label="缠访闹访"
prop="entanglementVisits"
align="center"
width="90"
/>
<el-table-column label="群众集访" prop="massVisits" /> <el-table-column label="群众集访" prop="massVisits" />
<el-table-column label="涉嫌问题" prop="involveProblem" /> <el-table-column label="涉嫌问题" prop="involveProblem" />
<el-table-column label="业务类别" prop="businessTypeName" /> <el-table-column
<el-table-column label="具体内容" prop="thingDesc" show-overflow-tooltip /> label="被投诉机构"
<el-table-column label="操作"> prop="involveProblem"
show-overflow-tooltip
/>
<el-table-column
label="具体内容"
prop="thingDesc"
show-overflow-tooltip
/>
<el-table-column label="操作" width="200">
<template #default="{ row }"> <template #default="{ row }">
<el-button <!-- <el-button type="primary" link>核查情况</el-button> -->
<el-button type="danger" link @click="handleDel(row)">删除</el-button>
<!-- <el-button
type="primary" type="primary"
link link
@click="handleEdit(row)" >问题核查</el-button
v-perms="['user:edit']" > -->
>编辑</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -74,14 +139,9 @@
</div> </div>
</div> </div>
<el-dialog title="公安部信访投诉数据导入" v-model="show" width="80vw"> <el-dialog title="公安部信访投诉 数据导入" v-model="show" width="80vw">
<div style="min-height: 500px"> <div style="min-height: 500px">
<template v-if="step === 1"> <template v-if="step === 1">
<el-radio-group v-model="templateType">
<el-radio value="1" size="large" border>国家信访</el-radio>
<el-radio value="2" size="large" border>公安部信访</el-radio>
<el-radio value="3" size="large" border>12337信访</el-radio>
</el-radio-group>
<div class="mt-20"> <div class="mt-20">
<span>信访投诉数据台账模板</span> <span>信访投诉数据台账模板</span>
<a <a
@ -115,6 +175,10 @@
</div> </div>
</template> </template>
</el-upload> </el-upload>
<el-radio-group v-model="dataUpdateMethod" class="mt-20">
<el-radio value="incremental" border>增量更新</el-radio>
<el-radio value="overwrite" border>覆盖更新</el-radio>
</el-radio-group>
</template> </template>
<template v-else> <template v-else>
<el-page-header @back="step = 1" class="mb-20"></el-page-header> <el-page-header @back="step = 1" class="mb-20"></el-page-header>
@ -184,7 +248,9 @@
</template> </template>
</div> </div>
<footer class="flex end mt-20 v-center"> <footer class="flex end mt-20 v-center">
<span class="mr-20" v-if="step === 2">选中{{ checkRowSize }}</span> <span class="mr-20" v-if="step === 2"
>选中<b>{{ checkRowSize }}</b>条数据</span
>
<el-button size="large" @click="show = false">取消</el-button> <el-button size="large" @click="show = false">取消</el-button>
<el-button <el-button
type="primary" type="primary"
@ -210,13 +276,17 @@ import { BASE_PATH } from "@/api/request";
import { import {
importPetitionComplaint, importPetitionComplaint,
listPetitionComplaint, listPetitionComplaint,
addPetitionComplaint addPetitionComplaint,
delPetitionComplaint
} from "@/api/data/petitionComplaint"; } from "@/api/data/petitionComplaint";
import feedback from '@/utils/feedback' import { ProblemSources } from '@/enums/dictEnums'
import feedback from "@/utils/feedback";
const query = ref({ const query = ref({
size: 10, size: 10,
current: 1, current: 1,
responderKey: 'name',
problemSourcesCode: ProblemSources.GABXF
}); });
const list = ref([]); const list = ref([]);
@ -228,18 +298,20 @@ function getList() {
}); });
} }
getList()
function reset() { function reset() {
query.value = { query.value = {
size: 10, size: 10,
current: 1, current: 1,
responderKey: 'name',
problemSourcesCode: ProblemSources.GABXF
}; };
getList(); getList();
} }
getList();
const show = ref(false); const show = ref(false);
const templateType = ref("1"); const dataUpdateMethod = ref("incremental");
const fileList = ref([]); const fileList = ref([]);
@ -251,21 +323,33 @@ async function handleImport() {
importTableData.value = await importPetitionComplaint(formData); importTableData.value = await importPetitionComplaint(formData);
step.value = 2; step.value = 2;
nextTick(() => { nextTick(() => {
tableRef.value.toggleAllSelection() tableRef.value.toggleAllSelection();
}) });
} }
const checkRowSize = computed(() => tableRef.value?.getSelectionRows().length || 0) const checkRowSize = computed(
() => tableRef.value?.getSelectionRows().length || 0
);
const tableRef = ref(null);
const tableRef = ref(null)
async function handleSaveImport() { async function handleSaveImport() {
const rows = tableRef.value.getSelectionRows() const rows = tableRef.value.getSelectionRows();
console.log(rows) await addPetitionComplaint({
await addPetitionComplaint([...rows]) dataUpdateMethod: dataUpdateMethod.value,
feedback.msgSuccess(`成功导入${rows.length}条数据`) problemSourcesCode: ProblemSources.GABXF,
show.value = false data: [...rows]
});
feedback.msgSuccess(`成功导入${rows.length}条数据`);
show.value = false;
step.value = 1
importTableData.value = []
fileList.value = []
getList();
}
async function handleDel(row) {
await feedback.confirm('确定要删除该数据?')
await delPetitionComplaint(row.originId)
getList() getList()
} }
</script> </script>

39
src/views/data/Gjxf.vue

@ -32,19 +32,14 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="登记时间"> <el-form-item label="登记时间">
<el-date-picker <date-time-range-picker-ext v-model="query.discoveryTime" />
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
v-model="query.happenTime"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="具体内容"> <el-form-item label="具体内容">
<el-input <el-input
placeholder="请输入" placeholder="请输入"
v-model="query.userName" v-model="query.thingDesc"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -52,7 +47,7 @@
</el-form> </el-form>
<div class="mb-25 flex between"> <div class="mb-25 flex between">
<el-button type="primary" @click="show = true" <el-button type="primary" @click="show = true"
>国家信访数据导入</el-button >数据导入</el-button
> >
<div> <div>
<el-button type="primary" @click="getList"> <el-button type="primary" @click="getList">
@ -107,7 +102,7 @@
<el-table-column label="群众集访" prop="massVisits" /> <el-table-column label="群众集访" prop="massVisits" />
<el-table-column label="涉嫌问题" prop="involveProblem" /> <el-table-column label="涉嫌问题" prop="involveProblem" />
<el-table-column <el-table-column
label="涉及单位" label="被投诉机构"
prop="involveProblem" prop="involveProblem"
show-overflow-tooltip show-overflow-tooltip
/> />
@ -118,7 +113,8 @@
/> />
<el-table-column label="操作" width="200"> <el-table-column label="操作" width="200">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link>核查情况</el-button> <!-- <el-button type="primary" link>核查情况</el-button> -->
<el-button type="danger" link @click="handleDel(row)">删除</el-button>
<!-- <el-button <!-- <el-button
type="primary" type="primary"
link link
@ -253,7 +249,7 @@
</div> </div>
<footer class="flex end mt-20 v-center"> <footer class="flex end mt-20 v-center">
<span class="mr-20" v-if="step === 2" <span class="mr-20" v-if="step === 2"
>选中{{ checkRowSize }}</span >选中<b>{{ checkRowSize }}</b>数据</span
> >
<el-button size="large" @click="show = false">取消</el-button> <el-button size="large" @click="show = false">取消</el-button>
<el-button <el-button
@ -281,12 +277,16 @@ import {
importPetitionComplaint, importPetitionComplaint,
listPetitionComplaint, listPetitionComplaint,
addPetitionComplaint, addPetitionComplaint,
delPetitionComplaint
} from "@/api/data/petitionComplaint"; } from "@/api/data/petitionComplaint";
import { ProblemSources } from '@/enums/dictEnums'
import feedback from "@/utils/feedback"; import feedback from "@/utils/feedback";
const query = ref({ const query = ref({
size: 10, size: 10,
current: 1, current: 1,
responderKey: 'name',
problemSourcesCode: ProblemSources.GJXFPT
}); });
const list = ref([]); const list = ref([]);
@ -302,6 +302,8 @@ function reset() {
query.value = { query.value = {
size: 10, size: 10,
current: 1, current: 1,
responderKey: 'name',
problemSourcesCode: ProblemSources.GJXFPT
}; };
getList(); getList();
} }
@ -332,11 +334,24 @@ const checkRowSize = computed(
const tableRef = ref(null); const tableRef = ref(null);
async function handleSaveImport() { async function handleSaveImport() {
const rows = tableRef.value.getSelectionRows(); const rows = tableRef.value.getSelectionRows();
await addPetitionComplaint([...rows]); await addPetitionComplaint({
dataUpdateMethod: dataUpdateMethod.value,
problemSourcesCode: ProblemSources.GJXFPT,
data: [...rows]
});
feedback.msgSuccess(`成功导入${rows.length}条数据`); feedback.msgSuccess(`成功导入${rows.length}条数据`);
show.value = false; show.value = false;
step.value = 1
importTableData.value = []
fileList.value = []
getList(); getList();
} }
async function handleDel(row) {
await feedback.confirm('确定要删除该数据?')
await delPetitionComplaint(row.originId)
getList()
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>

10
src/views/sensitivePerception/ClueData.vue

@ -10,15 +10,7 @@
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="预警时间"> <el-form-item label="预警时间">
<el-date-picker <date-time-range-picker-ext v-model="query.happenTime"/>
v-model="query.discoveryTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetimerange"
format="YYYY-MM-DD HH:mm:ss"
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">

84
src/views/system/Dict.vue

@ -5,7 +5,10 @@
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="字典名称"> <el-form-item label="字典名称">
<el-input placeholder="请选择字典名称" v-model="query.dictName" /> <el-input
placeholder="请选择字典名称"
v-model="query.dictName"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -15,7 +18,8 @@
<template #icon> <template #icon>
<icon name="el-icon-Plus" /> <icon name="el-icon-Plus" />
</template> </template>
新增字典</el-button> 新增字典</el-button
>
<div> <div>
<el-button type="primary" @click="getList">查询</el-button> <el-button type="primary" @click="getList">查询</el-button>
<el-button @click="reset">重置</el-button> <el-button @click="reset">重置</el-button>
@ -44,7 +48,7 @@
<el-button type="primary" link @click="handleEdit(row)" <el-button type="primary" link @click="handleEdit(row)"
>编辑</el-button >编辑</el-button
> >
<el-button type="danger" link @click="handleEdit(row)" <el-button type="danger" link @click="handleDel(row)"
>删除</el-button >删除</el-button
> >
</template> </template>
@ -73,8 +77,7 @@
</template> </template>
</el-page-header> </el-page-header>
<div class="mb-25 flex between"> <div class="mb-25 flex between">
<el-button type="primary" @click="handleAddData" <el-button type="primary" @click="handleAddData">
>
<template #icon> <template #icon>
<icon name="el-icon-Plus" /> <icon name="el-icon-Plus" />
</template> </template>
@ -105,11 +108,7 @@
<el-tag type="danger" v-else>禁用</el-tag> <el-tag type="danger" v-else>禁用</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="排序" prop="dictSort" width="120" />
label="排序"
prop="dictSort"
width="120"
/>
<el-table-column <el-table-column
label="最后更新时间" label="最后更新时间"
prop="updateTime" prop="updateTime"
@ -254,17 +253,18 @@
import { import {
listDictTypes, listDictTypes,
addDictType, addDictType,
updateDictType,
listDictDatas, listDictDatas,
addDictData, addDictData,
updateDictData, updateDictData,
delDictData delDictData,
} from "@/api/system/dict"; } from "@/api/system/dict";
import feedback from '@/utils/feedback' import feedback from "@/utils/feedback";
const dicts = ref([]); const dicts = ref([]);
const query = ref({ const query = ref({
current: 1, current: 1,
size: 10 size: 10,
}); });
const total = ref(0); const total = ref(0);
function getList() { function getList() {
@ -278,9 +278,9 @@ getList();
function reset() { function reset() {
query.value = { query.value = {
current: 1, current: 1,
size: 10 size: 10,
} };
getList() getList();
} }
const subShow = ref(false); const subShow = ref(false);
@ -333,16 +333,25 @@ function handleAdd() {
function handleEdit(row) { function handleEdit(row) {
typeShow.value = true; typeShow.value = true;
typeMode.value = "edit"; typeMode.value = "edit";
typeForm.value = { ...row };
} }
function submit() { function submit() {
typeFormRef.value.validate((flag) => { typeFormRef.value.validate((flag) => {
if (flag) { if (flag) {
addDictType(typeForm.value).then(() => { if (typeMode.value === "add") {
typeShow.value = false; addDictType(typeForm.value).then(() => {
typeForm.value = { status: "0" }; typeShow.value = false;
getList(); typeForm.value = { status: "0" };
}); getList();
});
} else {
updateDictType(typeForm.value).then(() => {
typeShow.value = false;
getList();
});
}
} else {
} }
}); });
} }
@ -365,20 +374,23 @@ function dataSubmit() {
if (flag) { if (flag) {
dataForm.value.dictType = activeDict.value.dictType; dataForm.value.dictType = activeDict.value.dictType;
if (dataMode.value === "add") { if (dataMode.value === "add") {
addDictData(dataForm.value, activeDict.value.dictType).then(() => { addDictData(dataForm.value, activeDict.value.dictType).then(
dataShow.value = false; () => {
dataForm.value = { status: "0" }; dataShow.value = false;
getDatas(); dataForm.value = { status: "0" };
}); getDatas();
}
);
} else { } else {
updateDictData(dataForm.value, activeDict.value.dictType).then(() => { updateDictData(dataForm.value, activeDict.value.dictType).then(
dataShow.value = false; () => {
dataForm.value = { status: "0" }; dataShow.value = false;
getDatas(); dataForm.value = { status: "0" };
}); getDatas();
}
);
} }
feedback.msgSuccess('操作成功') feedback.msgSuccess("操作成功");
} }
}); });
} }
@ -391,14 +403,12 @@ function handleEditDictData(row) {
async function handleDelDictData(dictCode) { async function handleDelDictData(dictCode) {
await feedback.confirm("确定要删除?"); await feedback.confirm("确定要删除?");
await delDictData(dictCode, activeDict.value.dictType) await delDictData(dictCode, activeDict.value.dictType);
feedback.msgSuccess("删除成功"); feedback.msgSuccess("删除成功");
getDatas(); getDatas();
} }
const tableRef = ref(null) const tableRef = ref(null);
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>

6
src/views/system/Holiday.vue

@ -8,7 +8,7 @@
type="year" type="year"
value-format="YYYY" value-format="YYYY"
placeholder="请选择年份" placeholder="请选择年份"
:disabled-date="disabledDate" :disabled-date="(time) => time.getFullYear() < 2023"
/> />
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -55,10 +55,6 @@ const holidays = ref([]);
const weeks = ["一", "二", "三", "四", "五", "六", "日"]; const weeks = ["一", "二", "三", "四", "五", "六", "日"];
const disabledDate = (time) => {
return time.getFullYear() < 2023
}
function getHolidays() { function getHolidays() {
listHolidays(year.value).then((data) => { listHolidays(year.value).then((data) => {
holidays.value = data; holidays.value = data;

45
src/views/system/Menu.vue

@ -2,7 +2,7 @@
<div class="container"> <div class="container">
<header class="flex between mb-20"> <header class="flex between mb-20">
<div> <div>
<el-button type="primary" @click="show = true"> <el-button type="primary" @click="handleAdd">
<template #icon> <template #icon>
<icon name="el-icon-Plus" /> <icon name="el-icon-Plus" />
</template> </template>
@ -16,15 +16,24 @@
<el-table-column label="菜单名称" prop="menuName" /> <el-table-column label="菜单名称" prop="menuName" />
<el-table-column label="类型"> <el-table-column label="类型">
<template #default="{ row }"> <template #default="{ row }">
<div class="flex v-center gap-4" v-if="row.menuType === MenuEnum.CATALOGUE"> <div
class="flex v-center gap-4"
v-if="row.menuType === MenuEnum.CATALOGUE"
>
<icon name="el-icon-Folder" /> <icon name="el-icon-Folder" />
<span>目录</span> <span>目录</span>
</div> </div>
<div class="flex v-center gap-4" v-else-if="row.menuType === MenuEnum.MENU"> <div
class="flex v-center gap-4"
v-else-if="row.menuType === MenuEnum.MENU"
>
<icon name="local-icon-menu" /> <icon name="local-icon-menu" />
<span>菜单</span> <span>菜单</span>
</div> </div>
<div class="flex v-center gap-4" v-else-if="row.menuType === MenuEnum.BUTTON"> <div
class="flex v-center gap-4"
v-else-if="row.menuType === MenuEnum.BUTTON"
>
<icon name="el-icon-SwitchButton" /> <icon name="el-icon-SwitchButton" />
<span>按钮</span> <span>按钮</span>
</div> </div>
@ -256,6 +265,7 @@
import { MenuEnum, MENU_ROOT_ID } from "@/enums/appEnums"; import { MenuEnum, MENU_ROOT_ID } from "@/enums/appEnums";
import { listMenu, addMenu, updateMenu, delMenu } from "@/api/system/menu"; import { listMenu, addMenu, updateMenu, delMenu } from "@/api/system/menu";
import feedback from "@/utils/feedback"; import feedback from "@/utils/feedback";
import { watch } from "vue";
const menus = ref([]); const menus = ref([]);
const menuOptions = ref([ const menuOptions = ref([
@ -293,17 +303,32 @@ const querySearch = (queryString, cb) => {
}; };
const mode = ref<string>("add"); const mode = ref<string>("add");
watch(mode, (val) => {
if (val === "add") {
initFormData()
}
});
function initFormData() {
formData.value = {
openNewPage: false,
isShow: 1,
isCache: 1,
};
}
function handleAdd() {
show.value = true
mode.value = 'add'
}
function submit() { function submit() {
formRef.value.validate((flag) => { formRef.value.validate((flag) => {
if (flag) { if (flag) {
if (mode.value === "add") { if (mode.value === "add") {
addMenu(formData.value).then(() => { addMenu(formData.value).then(() => {
show.value = false; show.value = false;
formData.value = { initFormData()
openNewPage: false,
isShow: 1,
isCache: 1,
};
getList(); getList();
}); });
} else { } else {
@ -319,7 +344,7 @@ function submit() {
function handleEdit(row) { function handleEdit(row) {
show.value = true; show.value = true;
mode.value = "edit"; mode.value = "edit";
formData.value = row; formData.value = {...row};
} }
const handleDelete = async (id: number) => { const handleDelete = async (id: number) => {

152
src/views/system/Police.vue

@ -89,6 +89,27 @@
<el-table :data="polices" row-key="id"> <el-table :data="polices" row-key="id">
<el-table-column type="expand"> <el-table-column type="expand">
<template #default="{ row }"> <template #default="{ row }">
<div class="row mt-10">
<div class="col col-6">
<label>角色</label>
<span>{{
getDictLable(
dict.policeRole,
row.policeRole
)
}}</span>
</div>
<div class="col col-6">
<label>入职时间</label>
<span>{{ row.employmentDate }}</span>
</div>
<div class="col col-6" v-if="row.employmentDate">
<label>工龄</label>
<span>{{
getWorkYear(row.employmentDate)
}}</span>
</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>
@ -96,21 +117,32 @@
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>婚姻状况</label> <label>婚姻状况</label>
<span>{{ getDictLable(dict.maritalStatus, row.maritalStatus) }}</span> <span>{{
getDictLable(
dict.maritalStatus,
row.maritalStatus
)
}}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>子女</label> <label>子女</label>
<span>{{ row.personType }}</span> <span>{{ row.haveChildren }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>学历</label> <label>学历</label>
<span>{{ getDictLable(dict.education, row.education) || '/' }}</span> <span>{{
getDictLable(
dict.education,
row.education
) || "/"
}}</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.createdAt }}</span> <span>{{ row.createdAt || "/" }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>更新时间</label> <label>更新时间</label>
@ -126,13 +158,12 @@
width="100" width="100"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column <el-table-column label="所属机构" show-overflow-tooltip>
label="所属机构"
show-overflow-tooltip
>
<template #default="{ row }"> <template #default="{ row }">
<span class="mr-4">{{ row.parentDepartShortName }}</span> <div class="flex gap-4">
<span>{{ row.departShortName }}</span> <span>{{ row.parentDepartShortName }}</span>
<span>{{ row.departShortName }}</span>
</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="职位" prop="position" width="120" /> <el-table-column label="职位" prop="position" width="120" />
@ -142,7 +173,9 @@
<el-table-column label="电话" prop="mobile" width="180" /> <el-table-column label="电话" prop="mobile" width="180" />
<el-table-column label="人员属性" width="160" align="center"> <el-table-column label="人员属性" width="160" align="center">
<template #default="{ row }"> <template #default="{ row }">
<span>{{ getDictLable(dict.personType, row.personType) }}</span> <span>{{
getDictLable(dict.personType, row.personType)
}}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="200"> <el-table-column label="操作" width="200">
@ -196,7 +229,15 @@
/> />
</el-form-item> </el-form-item>
<el-form-item label="业务权限(问题来源)"> <el-form-item label="业务权限(问题来源)">
<el-tree-select :data="dictProblemSources" :props="{value: 'id'}" node-key="id" clearable filterable v-model="authForm.sources" multiple /> <el-tree-select
:data="dictProblemSources"
:props="{ value: 'id' }"
node-key="id"
clearable
filterable
v-model="authForm.sources"
multiple
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<footer class="flex end"> <footer class="flex end">
@ -211,24 +252,27 @@
width="600" width="600"
> >
<el-form :model="form" :label-width="120" ref="fomrRef"> <el-form :model="form" :label-width="120" ref="fomrRef">
<el-form-item label="头像" prop="avatarUrl"> <!-- <el-form-item label="头像" prop="avatarUrl">
<el-avatar <el-avatar
shape="square" shape="square"
:size="50" :size="50"
:src="form.avatarUrl" :src="form.avatarUrl"
:icon="UserFilled" :icon="UserFilled"
/> />
</el-form-item> </el-form-item> -->
<el-form-item <el-form-item
label="姓名" label="姓名"
prop="name" prop="name"
:rules="{ :rules="{
required: true, required: true,
message: '请输入姓名', message: '请输入姓名',
trigger: ['blur'],
}" }"
> >
<el-input placeholder="请输入" v-model="form.name" /> <el-input
placeholder="请输入"
v-model="form.name"
style="width: 280px"
/>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="警号" label="警号"
@ -236,10 +280,13 @@
:rules="{ :rules="{
required: true, required: true,
message: '请输入警号', message: '请输入警号',
trigger: ['blur'],
}" }"
> >
<el-input placeholder="请输入" v-model="form.empNo" /> <el-input
placeholder="请输入"
v-model="form.empNo"
style="width: 280px"
/>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="身份证" label="身份证"
@ -249,7 +296,11 @@
message: '请输入身份证', message: '请输入身份证',
}" }"
> >
<el-input placeholder="请输入" v-model="form.idCode" /> <el-input
placeholder="请输入"
v-model="form.idCode"
style="width: 280px"
/>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="所属单位" label="所属单位"
@ -257,19 +308,56 @@
:rules="{ :rules="{
required: true, required: true,
message: '请选择所属单位', message: '请选择所属单位',
trigger: ['blur'],
}" }"
> >
<depart-tree-select v-model="form.orgId" /> <depart-tree-select v-model="form.orgId" />
</el-form-item> </el-form-item>
<el-form-item label="职位" prop="position"> <el-form-item label="职位" prop="position">
<el-select v-model="form.position" clearable> <el-select
v-model="form.position"
clearable
style="width: 280px"
>
<el-option value="正职">正职</el-option> <el-option value="正职">正职</el-option>
<el-option value="副职">副职</el-option> <el-option value="副职">副职</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="角色" prop="policeRole">
<el-select
clearable
v-model="query.policeRole"
style="width: 280px"
>
<el-option
v-for="item in dict.policeRole"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item label="电话" prop="mobile"> <el-form-item label="电话" prop="mobile">
<el-input placeholder="请输入" v-model="form.mobile" /> <el-input
placeholder="请输入"
v-model="form.mobile"
style="width: 280px"
/>
</el-form-item>
<el-form-item label="入职时间">
<div>
<el-date-picker
v-model="form.employmentDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择"
:disabled-date="
(time) => time.getTime() > new Date().getTime()
"
/>
<span class="ml-10" v-if="form.employmentDate"
>工龄{{ getWorkYear(form.employmentDate) }}</span
>
</div>
</el-form-item> </el-form-item>
<el-form-item label="人员属性"> <el-form-item label="人员属性">
<el-radio-group v-model="form.personType"> <el-radio-group v-model="form.personType">
@ -326,13 +414,15 @@ import useCatchStore from "@/stores/modules/catch";
import feedback from "@/utils/feedback"; import feedback from "@/utils/feedback";
import { getDictLable } from "@/utils/util"; import { getDictLable } from "@/utils/util";
import { UserFilled } from "@element-plus/icons-vue"; import { UserFilled } from "@element-plus/icons-vue";
import moment from "moment";
const catchStore = useCatchStore(); const catchStore = useCatchStore();
const dict = catchStore.getDicts([ const dict = catchStore.getDicts([
"problemSources", "problemSources",
"personType", "personType",
"education", "education",
"maritalStatus" "maritalStatus",
"policeRole",
]); ]);
const dictProblemSources = catchStore.getDictProblemSources(); const dictProblemSources = catchStore.getDictProblemSources();
@ -421,6 +511,22 @@ function getAge(idCode) {
} }
return new Date().getFullYear() - parseInt(idCode.substr(6, 4)); return new Date().getFullYear() - parseInt(idCode.substr(6, 4));
} }
function getWorkYear(employmentDate) {
if (!employmentDate) {
return "";
}
const year =
new Date().getFullYear() - parseInt(employmentDate.substr(0, 4));
if (year > 0) {
return year + "年";
}
const days = moment().diff(moment(employmentDate), "days");
if (days < 30) {
return days + "天";
}
return moment().diff(moment(employmentDate), "month") + "个月";
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>

57
src/views/work/Done.vue

@ -5,12 +5,7 @@
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="问题发生时间"> <el-form-item label="问题发生时间">
<el-date-picker <date-time-range-picker-ext v-model="query.happenTime"/>
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
v-model="query.happenTime"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@ -108,7 +103,7 @@
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>涉嫌问题</label> <label>涉嫌问题</label>
<span>{{ }}</span> <span>{{ getInvolveProblem(row.involveProblem) }}</span>
</div> </div>
</div> </div>
<div class="row mt-10"> <div class="row mt-10">
@ -123,19 +118,46 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="问题发生时间" prop="happenTime" /> <el-table-column label="问题发现时间" prop="discoveryTime" width="150" />
<el-table-column label="问题来源" prop="problemSources" /> <el-table-column label="问题来源" prop="problemSources" width="90" />
<el-table-column label="业务类别" prop="businessTypeName" /> <el-table-column label="业务类别" prop="businessTypeName" width="100" />
<el-table-column label="涉嫌问题" prop="" /> <el-table-column label="涉嫌问题">
<template #default="{ row }">
<span>{{ getInvolveProblem(row.involveProblem) }}</span>
</template>
</el-table-column>
<el-table-column label="问题内容" prop="thingDesc" show-overflow-tooltip /> <el-table-column label="问题内容" prop="thingDesc" show-overflow-tooltip />
<el-table-column label="办理单位" prop="" /> <el-table-column label="涉及单位" show-overflow-tooltip>
<el-table-column label="办理状态"> <template #default="{ row }">
<span>{{row.involveDepartName}}</span>
</template>
</el-table-column>
<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="100" align="center">
<template #default="{ row }">
<el-tag>{{
getDictLable(
dict.processingStatus,
row.processingStatus
)
}}</el-tag>
</template>
</el-table-column>
<el-table-column label="流程节点" width="120" align="center">
<template #default="{ row }"> <template #default="{ row }">
<el-tag>{{ getDictLable(dict.processingStatus, row.processingStatus) }}</el-tag> <el-tag v-if="row.flowKey">{{
flowNodes.filter(
(item) => item.flowKey === row.flowKey
)[0]?.flowName
}}</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="流程节点" prop="" /> <el-table-column label="当前处理对象" prop="currentProcessingObject" show-overflow-tooltip />
<el-table-column label="操作"> <el-table-column label="操作" width="120">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="handleAction(row)" <el-button type="primary" link @click="handleAction(row)"
>详情</el-button >详情</el-button
@ -163,12 +185,13 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { listDones } from '@/api/work' import { listDones } 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 catchStore = useCatchStore(); const catchStore = useCatchStore();
const dict = catchStore.getDicts(['businessType', 'suspectProblem', 'processingStatus']) const dict = catchStore.getDicts(['businessType', 'suspectProblem', 'processingStatus'])
const dictProblemSources = catchStore.getDictProblemSources(); const dictProblemSources = catchStore.getDictProblemSources();
const flowNodes = catchStore.getFlowNodes();
const dones = ref([]) const dones = ref([])
const query = ref({ const query = ref({

7
src/views/work/Fav.vue

@ -5,12 +5,7 @@
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="问题发生时间"> <el-form-item label="问题发生时间">
<el-date-picker <date-time-range-picker-ext v-model="query.happenTime"/>
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
v-model="query.happenTime"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">

10
src/views/work/NegativeTask.vue

@ -13,15 +13,7 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="创建时间"> <el-form-item label="创建时间">
<el-date-picker <date-time-range-picker-ext v-model="query.crtTime"/>
v-model="query.crtTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetimerange"
format="YYYY-MM-DD HH:mm:ss"
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>

36
src/views/work/Query.vue

@ -29,28 +29,12 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="问题发现时间"> <el-form-item label="问题发现时间">
<el-date-picker <date-time-range-picker-ext v-model="query.discoveryTime"/>
v-model="query.discoveryTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetimerange"
format="YYYY-MM-DD HH:mm:ss"
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="问题发生时间"> <el-form-item label="问题发生时间">
<el-date-picker <date-time-range-picker-ext v-model="query.happenTime"/>
v-model="query.happenTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetimerange"
format="YYYY-MM-DD HH:mm:ss"
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@ -239,7 +223,7 @@
</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>
@ -257,7 +241,7 @@
</div> </div>
<div class="col col-12"> <div class="col col-12">
<label>涉嫌问题</label> <label>涉嫌问题</label>
<span>{{}}</span> <span>{{ getInvolveProblem(row.involveProblem) }}</span>
</div> </div>
</div> </div>
<div class="row mt-10"> <div class="row mt-10">
@ -314,21 +298,22 @@
<el-table-column <el-table-column
label="是否属实" label="是否属实"
prop="checkStatusName" prop="checkStatusName"
width="110" width="100"
align="center"
/> />
<el-table-column <el-table-column
label="涉及单位" label="涉及单位"
prop="involveDepartName" prop="involveDepartName"
show-overflow-tooltip show-overflow-tooltip
/> />
<!-- <el-table-column label="办理单位" show-overflow-tooltip> <el-table-column label="办理单位" show-overflow-tooltip>
<template #default="{ row }"> <template #default="{ row }">
<span <span
>{{ row.handleSecondDepartName >{{ row.handleSecondDepartName
}}{{ row.handleThreeDepartName }}</span }}{{ row.handleThreeDepartName }}</span
> >
</template> </template>
</el-table-column> --> </el-table-column>
<el-table-column <el-table-column
label="流程限时" label="流程限时"
width="150" width="150"
@ -380,6 +365,7 @@
> >
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前处理对象" prop="currentProcessingObject" show-overflow-tooltip />
<el-table-column label="操作" width="120"> <el-table-column label="操作" width="120">
<template #default="{ row }"> <template #default="{ row }">
<el-button <el-button
@ -418,7 +404,7 @@
<script setup> <script setup>
import { ElLoading } from 'element-plus' import { ElLoading } from 'element-plus'
import { listNegative, negativeExport } from "@/api/work/negative"; import { listNegative, negativeExport } from "@/api/work/negative";
import { getDictLable, formatTimeText } 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";
@ -489,6 +475,8 @@ async function handleExport() {
await feedback.confirm("导出任务已生成,请到“导出记录”页面查看"); await feedback.confirm("导出任务已生成,请到“导出记录”页面查看");
router.push('/negative/export') router.push('/negative/export')
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.form-row { .form-row {

21
src/views/work/Todo.vue

@ -5,12 +5,7 @@
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="问题发生时间"> <el-form-item label="问题发生时间">
<el-date-picker <date-time-range-picker-ext v-model="query.happenTime"/>
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
v-model="query.happenTime"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@ -148,7 +143,7 @@
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>涉嫌问题</label> <label>涉嫌问题</label>
<span>{{}}</span> <span>{{ getInvolveProblem(row.involveProblem) }}</span>
</div> </div>
</div> </div>
<div class="row mt-10"> <div class="row mt-10">
@ -166,11 +161,21 @@
<el-table-column label="问题发现时间" prop="discoveryTime" /> <el-table-column label="问题发现时间" prop="discoveryTime" />
<el-table-column label="问题来源" prop="problemSources" /> <el-table-column label="问题来源" prop="problemSources" />
<el-table-column label="业务类别" prop="businessTypeName" /> <el-table-column label="业务类别" prop="businessTypeName" />
<el-table-column label="涉嫌问题">
<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="涉及单位" show-overflow-tooltip>
<template #default="{ row }">
<span>{{row.involveDepartName}}</span>
</template>
</el-table-column>
<el-table-column label="办理单位" show-overflow-tooltip> <el-table-column label="办理单位" show-overflow-tooltip>
<template #default="{ row }"> <template #default="{ row }">
<span>{{row.handleSecondDepartName}}{{row.handleThreeDepartName}}</span> <span>{{row.handleSecondDepartName}}{{row.handleThreeDepartName}}</span>
@ -239,7 +244,7 @@
<script lang="ts" setup> <script lang="ts" 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";

Loading…
Cancel
Save