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. 72
      src/components/negative/add.vue
  7. 23
      src/components/negative/distribute.vue
  8. 4
      src/components/negative/verify-description.vue
  9. 112
      src/components/negative/verify.vue
  10. 52
      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. 162
      src/views/data/Gabxf.vue
  16. 39
      src/views/data/Gjxf.vue
  17. 10
      src/views/sensitivePerception/ClueData.vue
  18. 62
      src/views/system/Dict.vue
  19. 6
      src/views/system/Holiday.vue
  20. 45
      src/views/system/Menu.vue
  21. 150
      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({
url: `/data/petitionComplaint/dataUpdateMethod/${dataUpdateMethod}`,
url: `/data/petitionComplaint`,
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) {
return request.get({
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) {
return request.get({
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>

72
src/components/negative/add.vue

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

23
src/components/negative/distribute.vue

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

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

@ -46,7 +46,7 @@
</div>
<div class="col col-6">
<label>督察措施</label>
<span>{{ blame.superviseMeasuresName }}</span>
<span>{{ blame.superviseMeasuresName || '/' }}</span>
</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`">
<div class="row">
<div class="col col-6">
<label>涉及人姓名</label>
<label>班子成员姓名</label>
<span>{{ blame.blameName }}</span>
</div>
<div class="col col-6">

112
src/components/negative/verify.vue

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

52
src/layout/components/Header.vue

@ -6,29 +6,29 @@
</a>
<span>长沙公安数字督察一体化平台</span>
</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" />
<span>{{ userStore.user.nickName }}</span>
<span>{{ userStore.user.departName }}</span>
</section>
</header>
<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" />
<span>帮助手册</span>
</li>
</li> -->
<li class="flex gap v-center" @click="supportShow = true">
<icon name="el-icon-Star" :size="22" />
<span>技术支持</span>
</li>
<template v-if="VITE_PROFILES === 'prod'">
<li class="flex gap v-center" @click="goBackV1">
<icon name="local-icon-logout" :size="20" />
<icon name="el-icon-Back" :size="20" />
<span>返回旧版</span>
</li>
</template>
<li class="flex gap v-center" @click="handleLogout" v-else>
<li class="flex gap v-center" @click="handleLogout">
<icon name="local-icon-logout" :size="20" />
<span>退出登录</span>
</li>
@ -48,35 +48,35 @@
</div>
</template>
<script lang="ts" setup>
import useUserStore from '@/stores/modules/user'
import { deleteToken } from '@/utils/token'
import { logout } from '@/api/auth'
import useUserStore from "@/stores/modules/user";
import { deleteToken } from "@/utils/token";
import { logout } from "@/api/auth";
const { VITE_PROFILES } = process.env;
const userStore = useUserStore()
const userStore = useUserStore();
const router = useRouter()
const router = useRouter();
const dropdownShow = ref(false)
const supportShow = ref(false)
const dropdownShow = ref(false);
const supportShow = ref(false);
document.addEventListener("click", () => {
dropdownShow.value = false;
})
});
async function handleLogout() {
await logout()
deleteToken()
location.reload()
await logout();
deleteToken();
location.reload();
}
function goBackV1() {
window.location.href = '/'
window.location.href = "/";
}
function openHelp() {
window.open(router.resolve('/support').href)
window.open(router.resolve("/support").href);
}
</script>
<style lang="scss" scoped>
@ -107,8 +107,10 @@ header.main-header {
position: fixed;
right: 16px;
top: calc(var(--header-height) - 8px);
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);
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);
border-radius: 8px;
margin: 0;
padding: 8px 0;
@ -131,7 +133,7 @@ header.main-header {
width: 100%;
height: 160px;
line-height: 160px;
background: linear-gradient( 270deg, #1227BB 0%, #3BA2CF 100%);
background: linear-gradient(270deg, #1227bb 0%, #3ba2cf 100%);
span {
width: 50%;
box-sizing: border-box;
@ -148,7 +150,7 @@ header.main-header {
color: #333;
p {
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]
},
getDictContent() {
if (!this.dictProblemSources.length) {
if (!this.dictContent.length) {
const refresh = async () => {
const res = await Promise.allSettled<Promise<any>>([listDictContentTree()])
res.forEach((item) => {

5
src/utils/token.ts

@ -1,3 +1,5 @@
const { VITE_PROFILES } = process.env;
export function setCookie(name, value, daysToLive) {
let cookie = name + "=" + encodeURIComponent(value);
if (typeof daysToLive === "number") {
@ -18,7 +20,8 @@ export function getCookie(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"

8
src/utils/util.ts

@ -361,3 +361,11 @@ export function getIconName(fileName) {
}
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>

162
src/views/data/Gabxf.vue

@ -3,11 +3,43 @@
<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.userName"
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>
@ -15,7 +47,7 @@
</el-form>
<div class="mb-25 flex between">
<el-button type="primary" @click="show = true"
>公安部信访数据导入</el-button
>数据导入</el-button
>
<div>
<el-button type="primary" @click="getList">
@ -30,31 +62,64 @@
</header>
<div class="table-container">
<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
label="投诉渠道"
prop="channelForFilingComplaints"
/>
<el-table-column label="受理层级" prop="acceptanceLevel" show-overflow-tooltip />
<el-table-column label="登记时间" width="discoveryTime" />
<el-table-column label="投诉人" prop="responderName" />
<el-table-column
label="受理层级"
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="initialPetition" />
<el-table-column label="缠访闹访" prop="entanglementVisits" />
<el-table-column
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="involveProblem" />
<el-table-column label="业务类别" prop="businessTypeName" />
<el-table-column label="具体内容" prop="thingDesc" show-overflow-tooltip />
<el-table-column 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 }">
<el-button
<!-- <el-button type="primary" link>核查情况</el-button> -->
<el-button type="danger" link @click="handleDel(row)">删除</el-button>
<!-- <el-button
type="primary"
link
@click="handleEdit(row)"
v-perms="['user:edit']"
>编辑</el-button
>
>问题核查</el-button
> -->
</template>
</el-table-column>
</el-table>
@ -77,11 +142,6 @@
<el-dialog title="公安部信访投诉 数据导入" v-model="show" width="80vw">
<div style="min-height: 500px">
<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">
<span>信访投诉数据台账模板</span>
<a
@ -115,6 +175,10 @@
</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>
@ -184,7 +248,9 @@
</template>
</div>
<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
type="primary"
@ -210,13 +276,17 @@ import { BASE_PATH } from "@/api/request";
import {
importPetitionComplaint,
listPetitionComplaint,
addPetitionComplaint
addPetitionComplaint,
delPetitionComplaint
} from "@/api/data/petitionComplaint";
import feedback from '@/utils/feedback'
import { ProblemSources } from '@/enums/dictEnums'
import feedback from "@/utils/feedback";
const query = ref({
size: 10,
current: 1,
responderKey: 'name',
problemSourcesCode: ProblemSources.GABXF
});
const list = ref([]);
@ -228,18 +298,20 @@ function getList() {
});
}
getList()
function reset() {
query.value = {
size: 10,
current: 1,
responderKey: 'name',
problemSourcesCode: ProblemSources.GABXF
};
getList();
}
getList();
const show = ref(false);
const templateType = ref("1");
const dataUpdateMethod = ref("incremental");
const fileList = ref([]);
@ -251,21 +323,33 @@ async function handleImport() {
importTableData.value = await importPetitionComplaint(formData);
step.value = 2;
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() {
const rows = tableRef.value.getSelectionRows()
console.log(rows)
await addPetitionComplaint([...rows])
feedback.msgSuccess(`成功导入${rows.length}条数据`)
show.value = false
const rows = tableRef.value.getSelectionRows();
await addPetitionComplaint({
dataUpdateMethod: dataUpdateMethod.value,
problemSourcesCode: ProblemSources.GABXF,
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()
}
</script>

39
src/views/data/Gjxf.vue

@ -32,19 +32,14 @@
</el-col>
<el-col :span="6">
<el-form-item label="登记时间">
<el-date-picker
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
v-model="query.happenTime"
/>
<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.userName"
v-model="query.thingDesc"
/>
</el-form-item>
</el-col>
@ -52,7 +47,7 @@
</el-form>
<div class="mb-25 flex between">
<el-button type="primary" @click="show = true"
>国家信访数据导入</el-button
>数据导入</el-button
>
<div>
<el-button type="primary" @click="getList">
@ -107,7 +102,7 @@
<el-table-column label="群众集访" prop="massVisits" />
<el-table-column label="涉嫌问题" prop="involveProblem" />
<el-table-column
label="涉及单位"
label="被投诉机构"
prop="involveProblem"
show-overflow-tooltip
/>
@ -118,7 +113,8 @@
/>
<el-table-column label="操作" width="200">
<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
type="primary"
link
@ -253,7 +249,7 @@
</div>
<footer class="flex end mt-20 v-center">
<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
@ -281,12 +277,16 @@ import {
importPetitionComplaint,
listPetitionComplaint,
addPetitionComplaint,
delPetitionComplaint
} from "@/api/data/petitionComplaint";
import { ProblemSources } from '@/enums/dictEnums'
import feedback from "@/utils/feedback";
const query = ref({
size: 10,
current: 1,
responderKey: 'name',
problemSourcesCode: ProblemSources.GJXFPT
});
const list = ref([]);
@ -302,6 +302,8 @@ function reset() {
query.value = {
size: 10,
current: 1,
responderKey: 'name',
problemSourcesCode: ProblemSources.GJXFPT
};
getList();
}
@ -332,11 +334,24 @@ const checkRowSize = computed(
const tableRef = ref(null);
async function handleSaveImport() {
const rows = tableRef.value.getSelectionRows();
await addPetitionComplaint([...rows]);
await addPetitionComplaint({
dataUpdateMethod: dataUpdateMethod.value,
problemSourcesCode: ProblemSources.GJXFPT,
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()
}
</script>
<style lang="scss" scoped>
</style>

10
src/views/sensitivePerception/ClueData.vue

@ -10,15 +10,7 @@
<el-row>
<el-col :span="8">
<el-form-item label="预警时间">
<el-date-picker
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="结束日期"
/>
<date-time-range-picker-ext v-model="query.happenTime"/>
</el-form-item>
</el-col>
<el-col :span="8">

62
src/views/system/Dict.vue

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

6
src/views/system/Holiday.vue

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

45
src/views/system/Menu.vue

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

150
src/views/system/Police.vue

@ -89,6 +89,27 @@
<el-table :data="polices" row-key="id">
<el-table-column type="expand">
<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="col col-6">
<label>年龄</label>
@ -96,21 +117,32 @@
</div>
<div class="col col-6">
<label>婚姻状况</label>
<span>{{ getDictLable(dict.maritalStatus, row.maritalStatus) }}</span>
<span>{{
getDictLable(
dict.maritalStatus,
row.maritalStatus
)
}}</span>
</div>
<div class="col col-6">
<label>子女</label>
<span>{{ row.personType }}</span>
<span>{{ row.haveChildren }}</span>
</div>
<div class="col col-6">
<label>学历</label>
<span>{{ getDictLable(dict.education, row.education) || '/' }}</span>
<span>{{
getDictLable(
dict.education,
row.education
) || "/"
}}</span>
</div>
</div>
<div class="row mt-10">
<div class="col col-6">
<label>创建时间</label>
<span>{{ row.createdAt }}</span>
<span>{{ row.createdAt || "/" }}</span>
</div>
<div class="col col-6">
<label>更新时间</label>
@ -126,13 +158,12 @@
width="100"
show-overflow-tooltip
/>
<el-table-column
label="所属机构"
show-overflow-tooltip
>
<el-table-column label="所属机构" show-overflow-tooltip>
<template #default="{ row }">
<span class="mr-4">{{ row.parentDepartShortName }}</span>
<div class="flex gap-4">
<span>{{ row.parentDepartShortName }}</span>
<span>{{ row.departShortName }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="职位" prop="position" width="120" />
@ -142,7 +173,9 @@
<el-table-column label="电话" prop="mobile" width="180" />
<el-table-column label="人员属性" width="160" align="center">
<template #default="{ row }">
<span>{{ getDictLable(dict.personType, row.personType) }}</span>
<span>{{
getDictLable(dict.personType, row.personType)
}}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
@ -196,7 +229,15 @@
/>
</el-form-item>
<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>
<footer class="flex end">
@ -211,24 +252,27 @@
width="600"
>
<el-form :model="form" :label-width="120" ref="fomrRef">
<el-form-item label="头像" prop="avatarUrl">
<!-- <el-form-item label="头像" prop="avatarUrl">
<el-avatar
shape="square"
:size="50"
:src="form.avatarUrl"
:icon="UserFilled"
/>
</el-form-item>
</el-form-item> -->
<el-form-item
label="姓名"
prop="name"
:rules="{
required: true,
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
label="警号"
@ -236,10 +280,13 @@
:rules="{
required: true,
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
label="身份证"
@ -249,7 +296,11 @@
message: '请输入身份证',
}"
>
<el-input placeholder="请输入" v-model="form.idCode" />
<el-input
placeholder="请输入"
v-model="form.idCode"
style="width: 280px"
/>
</el-form-item>
<el-form-item
label="所属单位"
@ -257,19 +308,56 @@
:rules="{
required: true,
message: '请选择所属单位',
trigger: ['blur'],
}"
>
<depart-tree-select v-model="form.orgId" />
</el-form-item>
<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-select>
</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-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 label="人员属性">
<el-radio-group v-model="form.personType">
@ -326,13 +414,15 @@ import useCatchStore from "@/stores/modules/catch";
import feedback from "@/utils/feedback";
import { getDictLable } from "@/utils/util";
import { UserFilled } from "@element-plus/icons-vue";
import moment from "moment";
const catchStore = useCatchStore();
const dict = catchStore.getDicts([
"problemSources",
"personType",
"education",
"maritalStatus"
"maritalStatus",
"policeRole",
]);
const dictProblemSources = catchStore.getDictProblemSources();
@ -421,6 +511,22 @@ function getAge(idCode) {
}
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>
<style lang="scss" scoped>
</style>

57
src/views/work/Done.vue

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

7
src/views/work/Fav.vue

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

10
src/views/work/NegativeTask.vue

@ -13,15 +13,7 @@
</el-col>
<el-col :span="6">
<el-form-item label="创建时间">
<el-date-picker
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="结束日期"
/>
<date-time-range-picker-ext v-model="query.crtTime"/>
</el-form-item>
</el-col>
</el-row>

36
src/views/work/Query.vue

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

21
src/views/work/Todo.vue

@ -5,12 +5,7 @@
<el-row>
<el-col :span="6">
<el-form-item label="问题发生时间">
<el-date-picker
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
v-model="query.happenTime"
/>
<date-time-range-picker-ext v-model="query.happenTime"/>
</el-form-item>
</el-col>
<el-col :span="6">
@ -148,7 +143,7 @@
</div>
<div class="col col-6">
<label>涉嫌问题</label>
<span>{{}}</span>
<span>{{ getInvolveProblem(row.involveProblem) }}</span>
</div>
</div>
<div class="row mt-10">
@ -166,11 +161,21 @@
<el-table-column label="问题发现时间" prop="discoveryTime" />
<el-table-column label="问题来源" prop="problemSources" />
<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
label="问题内容"
prop="thingDesc"
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>
<template #default="{ row }">
<span>{{row.handleSecondDepartName}}{{row.handleThreeDepartName}}</span>
@ -239,7 +244,7 @@
<script lang="ts" setup>
import { listTodos } from "@/api/work";
import { getDictLable } from "@/utils/util";
import { getDictLable, getInvolveProblem } from "@/utils/util";
import useCatchStore from "@/stores/modules/catch";

Loading…
Cancel
Save