Browse Source

fix: BUG修复

master
wxc 1 year ago
parent
commit
5d281d556e
  1. 2
      src/components/FileList.vue
  2. 5
      src/components/Upload.vue
  3. 116
      src/layout/components/Aside.vue
  4. 8
      src/layout/components/NoticeMessage.vue
  5. 2
      src/main.ts
  6. 2
      src/permission.ts
  7. 32
      src/views/data/data.vue
  8. 2
      src/views/data/report.vue
  9. 2
      src/views/data/timeout.vue
  10. 3
      src/views/datascreen/index.vue
  11. 189
      src/views/duty/index.vue
  12. 1
      src/views/home/components/Duty.vue
  13. 2
      src/views/reportpolice/hot.vue
  14. 24
      src/views/reportpolice/report.vue
  15. 10
      src/views/work/Dissatisfied.vue
  16. 2
      src/views/work/Done.vue
  17. 2
      src/views/work/Fav.vue
  18. 12
      src/views/work/NewQuery.vue
  19. 2
      src/views/work/Notice.vue
  20. 62
      src/views/work/Query.vue
  21. 2
      src/views/work/Sms.vue
  22. 2
      src/views/work/Todo.vue
  23. 1
      src/views/work/components/AddMail.vue
  24. 2
      src/views/work/components/AppealProgress.vue
  25. 2
      src/views/work/components/HandleAppeal.vue
  26. 2
      src/views/work/components/LaunchAppeal.vue
  27. 34
      src/views/work/components/MailDialog.vue
  28. 2
      src/views/work/components/OverruleReason.vue
  29. 74
      src/views/work/components/templates/DeptSelectForm.vue
  30. 12
      src/views/work/components/templates/MailTypeForm.vue
  31. 27
      src/views/work/components/templates/MainContactInfo.vue
  32. 129
      src/views/work/components/templates/ThreeHandlingDetail.vue
  33. 6
      vite.config.ts

2
src/components/FileList.vue

@ -50,7 +50,7 @@
@click="filePreview(item)"
>
<icon :name="getIconName(item.type)" :size="24" />
<span>{{ item.orgiinFilename }}</span>
<span>{{ item.fileName }}</span>
</section>
</div>
</el-scrollbar>

5
src/components/Upload.vue

@ -25,6 +25,7 @@
<el-progress type="circle" :percentage="uploadPercentage" :width="80" />
</div>
</div>
<div style="color: #999;font-size: 12px">{{ tips }}</div>
</div>
</template>
<script setup>
@ -40,6 +41,10 @@ const props = defineProps({
accept: {
type: String,
default: "image/*,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/pdf,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,audio/mpeg,audio/mp4a-latm,video/*,.rar,.zip",
},
tips: {
type: String,
default: "附件大小不超过1G,视频类型附件请上传核心视频。"
}
});

116
src/layout/components/Aside.vue

@ -1,60 +1,41 @@
<template>
<aside class="relative" :collapse="asideCollapse">
<nav>
<a
class="pointer relative menu"
v-for="(route, index) in routes"
:key="route.name"
@click="handleMenuClick(route, index)"
>
<div class="menu-item" :active="active === index">
<section class="flex v-center">
<icon :name="route.meta.icon" :size="50" />
<span>{{ route.meta.title }}</span>
</section>
<el-button link size="small" v-if="route.children?.length">
<template #icon>
<icon name="el-icon-ArrowDownBold" :expand="route.meta.isExpand" />
</template>
</el-button>
</div>
<div
class="second-menu"
v-if="
route.children?.length &&
(asideCollapse ||
(!asideCollapse && route.meta.isExpand))
"
>
<div class="second-menu-container">
<div
v-for="(item, index) in route.children"
:key="index"
>
<a
:key="item.name"
v-if="!item.meta.hidden"
@click.stop="
router.push({
name: item.name,
})
"
class="flex v-center"
>
<span v-if="!item.meta.hidden"
>{{ item.meta.title }}
</span>
</a>
<el-scrollbar height="100%">
<nav>
<a class="pointer relative menu" v-for="(route, index) in routes" :key="route.name"
@click="handleMenuClick(route, index)">
<div class="menu-item" :active="active === index">
<section class="flex v-center">
<icon :name="route.meta.icon" :size="50" />
<span>{{ route.meta.title }}</span>
</section>
<el-button link size="small" v-if="route.children?.length">
<template #icon>
<icon name="el-icon-ArrowDownBold" :expand="route.meta.isExpand" />
</template>
</el-button>
</div>
<div class="second-menu" v-if="route.children?.length &&
(asideCollapse ||
(!asideCollapse && route.meta.isExpand))
">
<div class="second-menu-container">
<div v-for="(item, index) in route.children" :key="index">
<a :key="item.name" v-if="!item.meta.hidden" @click.stop="
router.push({
name: item.name,
})
" class="flex v-center">
<span v-if="!item.meta.hidden">{{ item.meta.title }}
</span>
</a>
</div>
</div>
</div>
</div>
</a>
</nav>
<button
class="flex center v-center pointer expand-btn"
@click="handleAsideCollapse"
>
</a>
</nav>
</el-scrollbar>
<button class="flex center v-center pointer expand-btn" @click="handleAsideCollapse">
<icon name="local-icon-expand" :size="58" />
</button>
</aside>
@ -115,13 +96,16 @@ aside {
width: var(--aside-width);
height: calc(100vh - var(--header-height));
transition: all 0.6s;
nav {
font-size: 18px;
color: #858fd4;
i {
font-size: 24px !important;
transition: width height 0.6s;
}
.menu-item {
gap: 20px;
height: 56px;
@ -129,34 +113,43 @@ aside {
display: flex;
justify-content: space-between;
transition: all 0.6s;
&:hover,
&[active="true"] {
background-color: #22339a;
color: #fff;
}
section {
gap: 16px;
}
.el-button {
color: #656fac;
.el-icon {
transition: .3s;
transform: rotate(-90deg);
&[expand=true] {
transform: rotate(0);
}
}
}
}
.second-menu {
.second-menu-container {
max-height: 504px;
overflow: auto;
&::-webkit-scrollbar {
width: 8px;
}
&::-webkit-scrollbar-thumb {
border-radius: 6px; /* 滚动条滑块圆角 */
border-radius: 6px;
/* 滚动条滑块圆角 */
}
}
@ -166,6 +159,7 @@ aside {
background-color: #0a113b;
box-shadow: inset 0px -1px 0px 0px rgba(17, 28, 91, 1);
white-space: nowrap;
&:hover {
color: #fff;
}
@ -173,6 +167,7 @@ aside {
}
}
}
.expand-btn {
width: 58px;
height: 58px;
@ -184,39 +179,48 @@ aside {
border: none;
transition: all 0.6s;
}
&[collapse="true"] {
.expand-btn {
transform: rotate(180deg);
}
nav {
i {
font-size: 54px !important;
}
a.menu {
height: 116px;
color: #858fd4;
text-align: center;
&:hover {
.second-menu {
display: block;
}
}
.menu-item {
height: 120px;
justify-content: center;
&:hover,
&[active="true"] {
background: #22339a;
color: #fff;
}
section {
flex-direction: column;
justify-content: center;
}
.el-button {
display: none;
}
}
.second-menu {
position: absolute;
right: 8px;
@ -230,6 +234,7 @@ aside {
padding: 10px 0;
display: none;
z-index: 999;
&::before {
content: "";
position: absolute;
@ -240,9 +245,11 @@ aside {
height: 18px;
transform: translate(-50%, -50%) rotate(45deg);
}
&::-webkit-scrollbar-thumb {
background-color: #eee;
}
a {
display: flex;
padding: 12px;
@ -253,6 +260,7 @@ aside {
background-color: #fff;
box-shadow: none;
height: 32px;
&:hover {
font-weight: 700;
}

8
src/layout/components/NoticeMessage.vue

@ -1,11 +1,7 @@
<template>
<div class="notice flex gap v-center" @click="gotoNotice()">
<el-badge :value="total" v-if="total">
<icon name="el-icon-BellFilled" :size="32" />
</el-badge>
<icon name="el-icon-BellFilled" :size="32" v-else />
<div class="ml-20">{{ notice.content }}</div>
<icon name="el-icon-BellFilled" :size="32" />
<div class="ml-20">{{ }}</div>
<audio src="/mp3/todo.mp3" ref="todoAudioRef"></audio>
<audio loop ref="newMailAudioRef">

2
src/main.ts

@ -11,11 +11,9 @@ import './permission'
import './style/index.scss'
// 注册图标
import 'virtual:svg-icons-register'
import print from 'vue3-print-nb'
createApp(App)
.use(router)
.use(store)
.use(install)
.use(print)
.mount('#app')

2
src/permission.ts

@ -53,9 +53,11 @@ router.beforeEach(async (to, from, next) => {
}
tabsStore.setRouteName(routeName!)
INDEX_ROUTE.redirect = { name: routeName }
// 动态添加index路由
router.addRoute(INDEX_ROUTE)
console.log(routes)
routes.forEach((route: any) => {
// https 则不插入
if (isExternal(route.path)) {

32
src/views/data/data.vue

@ -123,23 +123,23 @@
</template>
</el-table-column>
<el-table-column
prop="resolvedNum"
label="解决数"
align="center"
prop="satisfiedNum"
sortable
label="满意数"
align="center"
/>
<el-table-column
prop="resolvedRateStr"
label="解决率"
align="center"
prop="satisfiedRateStr"
sortable
label="满意率"
align="center"
>
<template #header>
<div>
<span class="mr-4">解决</span>
<span class="mr-4">满意</span>
<el-tooltip
effect="dark"
content="解决率 = 解决数 / 已办结数"
content="满意率 = 满意数 / 已办结数"
raw-content
placement="top"
>
@ -153,23 +153,23 @@
</template>
</el-table-column>
<el-table-column
prop="satisfiedNum"
sortable
label="满意数"
prop="resolvedNum"
label="解决数"
align="center"
sortable
/>
<el-table-column
prop="satisfiedRateStr"
sortable
label="满意率"
prop="resolvedRateStr"
label="解决率"
align="center"
sortable
>
<template #header>
<div>
<span class="mr-4">满意</span>
<span class="mr-4">解决</span>
<el-tooltip
effect="dark"
content="满意率 = 满意数 / 已办结数"
content="解决率 = 解决数 / 已办结数"
raw-content
placement="top"
>

2
src/views/data/report.vue

@ -81,7 +81,7 @@
@current-change="getList"
:current-page="query.current"
:page-sizes="[10, 20, 50]"
:page-size="query.size"
v-model:page-size="query.size"
v-model:current-page="query.current"
:total="total"
layout="total, sizes, prev, pager, next"

2
src/views/data/timeout.vue

@ -87,7 +87,7 @@
@current-change="getList"
:current-page="query.current"
:page-sizes="[10, 20, 50]"
:page-size="query.size"
v-model:page-size="query.size"
v-model:current-page="query.current"
:total="total"
layout="total, sizes, prev, pager, next"

3
src/views/datascreen/index.vue

@ -1060,7 +1060,8 @@ const changsMap = () => {
echarts.registerMap("map", chinaJSON as any);
let myMap = echarts.init(map.value);
//
myMap.setOption({
myMap.setOption(
{
geo: {
// registerMap''
map: "map",

189
src/views/duty/index.vue

@ -1,8 +1,17 @@
<template>
<div class="index-lists">
<el-card class="!border-none" shadow="never">
<el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
<el-form-item label="警号" prop="holidayName" style="width: 180px;">
<el-form
ref="formRef"
class="mb-[-16px]"
:model="queryParams"
:inline="true"
>
<el-form-item
label="警号"
prop="holidayName"
style="width: 180px"
>
<el-input class="w-[280px]" v-model="queryParams.empNo" />
</el-form-item>
<el-form-item label="机构名称" prop="holidayName">
@ -22,7 +31,7 @@
}"
check-strictly
placeholder="请选择机构名称"
style="width: 180px;"
style="width: 180px"
/>
</el-form-item>
@ -32,7 +41,7 @@
clearable
v-model="queryParams.deptType"
placeholder="请选择机构类型"
style="width: 180px;"
style="width: 180px"
>
<el-option
v-for="(item, index) in optionsData.deptTypes.lists"
@ -43,7 +52,10 @@
</el-select>
</el-form-item>
<el-form-item label="值班人员" prop="holidayName">
<el-input class="w-[280px]" v-model="queryParams.policeName" />
<el-input
class="w-[280px]"
v-model="queryParams.policeName"
/>
</el-form-item>
<el-form-item label="手机号" prop="holidayName">
<el-input class="w-[280px]" v-model="queryParams.mobile" />
@ -53,29 +65,52 @@
class="flex-1 !flex"
v-model="queryParams.searchTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">
<template #icon><icon name="el-icon-Search" /></template>
查询</el-button>
<template #icon
><icon name="el-icon-Search"
/></template>
查询</el-button
>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<div>
<el-button v-perms="['duty:add']" type="primary" @click="handleAdd()">
<div class="flex gap v-center">
<el-button
v-perms="['duty:add']"
type="primary"
@click="handleAdd()"
>
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-upload
:action="`${VITE_API_URL}/api/duty/import`"
:headers="{ Admin: getToken() }"
multiple
:before-upload="beforeUpload"
@success="handleSuccess"
@error="handleError"
:show-file-list="false"
accept="application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
>
<el-button
v-perms="['duty:add']"
type="primary"
>导入</el-button
>
</el-upload>
<a :href="`${VITE_API_URL}/api/file/download/template/值班表模板.xlsx`" target="_blank" class="link">值班表模板 下载</a>
</div>
<el-table
class="mt-4"
@ -84,12 +119,32 @@
:data="pager.lists"
>
<el-table-column label="警号" prop="empNo" min-width="100" />
<el-table-column label="机构名称" prop="departName" min-width="100" />
<el-table-column label="机构类别" prop="typeName" min-width="100" />
<el-table-column label="值班人员" prop="policeName" min-width="100" />
<el-table-column
label="机构名称"
prop="departName"
min-width="100"
/>
<el-table-column
label="机构类别"
prop="typeName"
min-width="100"
/>
<el-table-column
label="值班人员"
prop="policeName"
min-width="100"
/>
<el-table-column label="手机号" prop="mobile" min-width="100" />
<el-table-column label="值班开始日期" prop="startTime" min-width="100" />
<el-table-column label="值班结束日期" prop="endTime" min-width="100" />
<el-table-column
label="值班开始日期"
prop="startTime"
min-width="100"
/>
<el-table-column
label="值班结束日期"
prop="endTime"
min-width="100"
/>
<el-table-column label="操作" width="120" fixed="right">
<template #default="{ row }">
<el-button
@ -122,68 +177,88 @@
@close="showEdit = false"
/>
</div>
<LodingMessage :show="importLoading" message="值班数据导入中..." />
</template>
<script lang="ts" setup name="duty">
import { dutyDelete, dutyLists } from '@/api/duty'
import { usePaging } from '@/hooks/usePaging'
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import { useDictOptions } from '@/hooks/useDictOptions'
import { deptLists } from '@/api/org/department'
import { dictDataLists } from '@/api/setting/dict'
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
const showEdit = ref(false)
import { dutyDelete, dutyLists } from "@/api/duty";
import { usePaging } from "@/hooks/usePaging";
import feedback from "@/utils/feedback";
import EditPopup from "./edit.vue";
import { useDictOptions } from "@/hooks/useDictOptions";
import { deptLists } from "@/api/org/department";
import { dictDataLists } from "@/api/setting/dict";
import { getToken } from "@/utils/auth";
const { VITE_API_URL } = process.env;
const editRef = shallowRef<InstanceType<typeof EditPopup>>();
const showEdit = ref(false);
const queryParams = reactive({
searchTime: '',
departName: '',
policeName: '',
mobile: '',
empNo: '',
deptType: '',
})
searchTime: "",
departName: "",
policeName: "",
mobile: "",
empNo: "",
deptType: "",
});
const { pager, getLists, resetPage, resetParams } = usePaging({
fetchFun: dutyLists,
params: queryParams
})
params: queryParams,
});
const { optionsData } = useDictOptions<{
deptTypes: any[],
dept: any[]
deptTypes: any[];
dept: any[];
}>({
deptTypes: {
api: dictDataLists,
params: {
dictType: 'dept_type'
}
dictType: "dept_type",
},
},
dept: {
api: deptLists
api: deptLists,
},
})
});
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
showEdit.value = true;
await nextTick();
editRef.value?.open("add");
};
const handleEdit = async (data: any,id:number) => {
showEdit.value = true
await nextTick()
const handleEdit = async (data: any, id: number) => {
showEdit.value = true;
await nextTick();
console.log(data);
editRef.value?.open('edit')
editRef.value?.getDetail(data)
}
editRef.value?.open("edit");
editRef.value?.getDetail(data);
};
const handleDelete = async (id: number) => {
await feedback.confirm('确定要删除?')
await dutyDelete({ id })
feedback.msgSuccess('删除成功')
getLists()
await feedback.confirm("确定要删除?");
await dutyDelete({ id });
feedback.msgSuccess("删除成功");
getLists();
};
getLists();
const importLoading = ref(false)
function beforeUpload() {
importLoading.value = true
}
function handleSuccess(data) {
importLoading.value = false
feedback.msgSuccess(data.msg)
getLists();
}
getLists()
function handleError(data) {
importLoading.value = false
feedback.msgSuccess(data.msg)
}
</script>

1
src/views/home/components/Duty.vue

@ -1,6 +1,5 @@
<template>
<h1>今日值班</h1>
<el-tabs v-model="activeName">
<el-scrollbar style="height: 350px;">
<el-tab-pane label="市局专班" name="sj">

2
src/views/reportpolice/hot.vue

@ -215,7 +215,7 @@
@current-change="getList"
:current-page="query.current"
:page-sizes="[10, 20, 50]"
:page-size="query.size"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total,sizes, prev, pager, next, jumper"
:total="totalSize.total"

24
src/views/reportpolice/report.vue

@ -28,7 +28,15 @@
</el-col>
<el-col :span="6">
<el-form-item label="报警类型">
<el-input v-model="query.type" placeholder="请输入" clearable />
<el-select
v-model="query.type"
placeholder="请选择报警类型"
clearable
filterable
>
<el-option label="110接警" value="110接警" />
<el-option label="自接警" value="自接警" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
@ -42,19 +50,11 @@
</el-col>
<el-col :span="6">
<el-form-item label="接警性质">
<el-select
<el-input
v-model="query.nature"
placeholder="请选择层级"
placeholder="请输入接警性质"
clearable
filterable
>
<el-option
v-for="item in optionsData.nature"
:key="item.id"
:label="item.labelName"
:value="item.labelName"
/>
</el-select>
/>
</el-form-item>
</el-col>
<el-col :span="6">

10
src/views/work/Dissatisfied.vue

@ -12,7 +12,7 @@
</el-col>
<el-col :span="6">
<el-form-item label="信件来源">
<el-select v-model="query.source" placeholder="" clearable st filterable>
<el-select v-model="query.source" placeholder="请选择" clearable st filterable>
<el-option v-for="item in dictData.mail_source" :key="item.value" :label="item.name"
:value="item.value" />
</el-select>
@ -32,7 +32,7 @@
</el-col>
<el-col :span="6">
<el-form-item label="信件等级">
<el-select v-model="query.mailLevel" placeholder="" clearable st>
<el-select v-model="query.mailLevel" placeholder="请选择" clearable st>
<el-option v-for="item in dictData.mail_level" :key="item.value" :label="item.name"
:value="item.value" />
</el-select>
@ -48,7 +48,7 @@
</el-col>
<el-col :span="6">
<el-form-item label="信件状态">
<el-select v-model="query.mailState" placeholder="" clearable st>
<el-select v-model="query.mailState" placeholder="请选择" clearable st>
<el-option v-for="item in dictData.mail_state" :key="item.value" :label="item.name"
:value="item.value" />
</el-select>
@ -141,14 +141,14 @@
</div>
<div class="flex mt-4 end">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page="query.current" :page-sizes="[10, 15, 20, 40, 50]" :page-size="query.size"
:current-page="query.current" :page-sizes="[10, 15, 20, 40, 50]" v-model:page-size="query.size"
layout="total,sizes, prev, pager, next, jumper" :total="totalSize.total">
</el-pagination>
</div>
</main>
</div>
<MailDialog v-model:show="showModel" :mail-id="activeMailId" :disabled="true" @update="getList" />
<MailDialog v-model:show="showModel" :mail-id="activeMailId" :disabled="true" />
<LaunchAppeal v-model:show="showAppeal" :mail-id="activeMailId" @update="getList" />
<AppealProgress v-model:show="showAppealProgress" :mail-id="activeMailId" @update="getList" />
<OverruleReason v-model:show="showOverruleReason" :mail-id="activeMailId" @update="getList" />

2
src/views/work/Done.vue

@ -240,7 +240,7 @@
@current-change="getList"
:current-page="query.current"
:page-sizes="[10, 20, 50]"
:page-size="query.size"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="totalSize.total"

2
src/views/work/Fav.vue

@ -108,7 +108,7 @@
</div>
<div class="flex mt-4 end">
<el-pagination @size-change="getList" @current-change="getList" :current-page="query.current"
:page-sizes="[10, 20, 50]" :page-size="query.size" v-model:current-page="query.current"
:page-sizes="[10, 20, 50]" v-model:page-size="query.size" v-model:current-page="query.current"
:total="totalSize.total">
</el-pagination>
</div>

12
src/views/work/NewQuery.vue

@ -208,6 +208,16 @@
:value="item.key"
/>
</el-select>
<el-select
size="small"
style="width: 160px"
placeholder="是否一把手接访"
v-model="query.interviewIsLeader"
clearable
>
<el-option label="是" :value="true" />
<el-option label="否" :value="false" />
</el-select>
</div>
</div>
</el-form>
@ -329,7 +339,7 @@
@current-change="getList"
:current-page="query.current"
:page-sizes="[10, 20, 50]"
:page-size="query.size"
v-model:page-size="query.size"
v-model:current-page="query.current"
:total="total"
layout="total, sizes, prev, pager, next"

2
src/views/work/Notice.vue

@ -71,7 +71,7 @@
@current-change="getList"
:current-page="query.current"
:page-sizes="[10, 20, 50]"
:page-size="query.size"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total,sizes, prev, pager, next, jumper"
:total="totalSize.total"

62
src/views/work/Query.vue

@ -39,8 +39,8 @@
<el-row>
<el-col :span="6">
<el-form-item label="信件分类">
<el-tree-select v-model="query.mailCategory" :data="mailStore.mailCategorys" check-strictly placeholder="请选择信件分类"
clearable filterable />
<el-tree-select v-model="query.mailCategory" :data="mailStore.mailCategorys" check-strictly
placeholder="请选择信件分类" clearable filterable />
</el-form-item>
</el-col>
<el-col :span="6">
@ -59,7 +59,7 @@
<el-col :span="6">
<el-form-item label="信件统计">
<el-select v-model="query.countMails" placeholder="请选择统计方式" clearable>
<el-option label="来信数" value="1" />
<el-option label="有效来信数" value="1" />
<el-option label="已办结件" value="2" />
<el-option label="满意件" value="3" />
<el-option label="已解决件" value="4" />
@ -146,7 +146,8 @@
<el-col :span="6">
<el-form-item label="是否属实" prop="verifyIsTrue">
<el-select v-model="query.verifyIsTrue" placeholder="请选择是否属实" clearable>
<el-option v-for="item in dictData.verify_is_true" :key="item.name" :label="item.name" :value="item.value" />
<el-option v-for="item in dictData.verify_is_true" :key="item.name" :label="item.name"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
@ -163,6 +164,14 @@
<el-input v-model="query.returnReason" placeholder="请输入退回意见" clearable />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="是否一把手接访" prop="interviewIsLeader">
<el-select v-model="query.interviewIsLeader">
<el-option label="是" :value="true" />
<el-option label="否" :value="false" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<div style="display: flex; justify-content: space-between; margin-bottom: 20px;">
<div>
@ -172,7 +181,9 @@
</div>
<div>
<el-button type="primary" @click="getList">
<template #icon><icon name="el-icon-Search" /></template>
<template #icon>
<icon name="el-icon-Search" />
</template>
查询</el-button>
<el-button @click="reset">重置</el-button>
<el-button type="primary" text @click="collapse = !collapse">
@ -198,11 +209,12 @@
<el-table-column label="信件来源" align="center" width="100" show-overflow-tooltip>
<template #default="{ row }">
<span>{{
getDictLable(dictData.mail_source, row.source)
}}</span>
getDictLable(dictData.mail_source, row.source)
}}</span>
</template>
</el-table-column>
<el-table-column prop="mailCategory" label="信件分类" show-overflow-tooltip width="120" align="center" />
<el-table-column prop="mailCategory" label="信件分类" show-overflow-tooltip width="120"
align="center" />
<el-table-column prop="contactName" label="姓名" align="center" width="80" />
<el-table-column prop="contactPhone" label="联系电话" width="120" align="center" />
<el-table-column prop="content" label="信件内容" show-overflow-tooltip align="center" min-width="90" />
@ -244,9 +256,12 @@
<el-table-column label="操作" width="164" fixed="right">
<template #default="{ row }">
<el-button type="primary" link @click="handleMail(row.id)" size="small">详情</el-button>
<el-button type="primary" link @click="handleMailLabel(row.id)" size="small" v-show="!IsdeleteMail(row)">标签</el-button>
<el-button type="primary" link @click="handleTodoByChange(row.id)" v-show="handleMailCategory(row)" size="small">转为待办</el-button>
<el-button type="danger" link @click="handleDelete(row.id)" v-show="IsdeleteMail(row)" size="small">删除</el-button>
<el-button type="primary" link @click="handleMailLabel(row.id)" size="small"
v-show="!IsdeleteMail(row)">标签</el-button>
<el-button type="primary" link @click="handleTodoByChange(row.id)"
v-show="handleMailCategory(row)" size="small">转为待办</el-button>
<el-button type="danger" link @click="handleDelete(row.id)" v-show="IsdeleteMail(row)"
size="small">删除</el-button>
</template>
</el-table-column>
</el-table>
@ -259,7 +274,7 @@
</div>
<div>
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page="query.current" :page-sizes="[10, 15, 20, 40, 50]" :page-size="query.size"
:current-page="query.current" :page-sizes="[10, 15, 20, 40, 50]" v-model:page-size="query.size"
layout="total, sizes, prev, pager, next" :total="totalSize.total">
</el-pagination>
</div>
@ -295,7 +310,7 @@ import axios from 'axios'
import { useRouterParamsStore } from "@/stores/modules/routerParams";
import { useRoute } from "vue-router";
import feedback from "@/utils/feedback";
import {deleteMail} from "@/api/mail";
import { deleteMail } from "@/api/mail";
const rowKey = "id";
const loading = ref(false)
@ -378,9 +393,9 @@ const exportLedger = async () => {
await feedback.confirm('是否导出当前筛选条件的所有信件?');
exportLoading.value = true
const data = query.value
if(data.flowKey)
if (data.flowKey)
data.flowKey = data.flowKey.join(',')
if(data.mailLabels)
if (data.mailLabels)
data.mailLabels = data.mailLabels.join(',')
axios.post('/lan-api/api/work/exportLedger', data, {
headers: {
@ -429,6 +444,10 @@ const handleCurrentChange = (page: any) => {
refreshCheckAll()
}
watch(() => useRouterParams.params, () => {
getList()
})
function getList() {
if (loadingOnce.value) {
//
@ -476,6 +495,11 @@ function getList() {
query.value.countMails = useRouterParams.params.countMails
useRouterParams.removeParams()
}
if (useRouterParams.params.contactField && useRouterParams.params.contactFieldValue) {
query.value.contactField = useRouterParams.params.contactField
query.value.contactFieldValue = useRouterParams.params.contactFieldValue
useRouterParams.removeParams()
}
loading.value = true
let source = ""
if (query.value.mailLabels) {
@ -538,17 +562,17 @@ const checkMail = () => {
}
const handleDelete = async (mailId: any) => {
if(mailId == ""||mailId == null){
if (mailId == "" || mailId == null) {
return;
}
await feedback.confirm("确定要删除?");
await deleteMail({id:mailId});
await deleteMail({ id: mailId });
feedback.msgSuccess("删除成功");
getList()
};
const IsdeleteMail = (row: any) => {
const allowChangeList = [null,'first_sign', 'first_distribute']
const allowChangeList = [null, 'first_sign', 'first_distribute']
return allowChangeList.includes(row.flowKey)
}
@ -560,7 +584,7 @@ const handleTodoByChange = (mailId: any) => {
}
const handleMailCategory = (row: any) => {
const allowChangeList = ['终止类', '无效类']
return allowChangeList.includes(row.mailCategory)
return allowChangeList.includes(row.mailFirstCategory)
}
const collapse = ref(true)

2
src/views/work/Sms.vue

@ -75,7 +75,7 @@
@current-change="getList"
:current-page="query.current"
:page-sizes="[10, 20, 50]"
:page-size="query.size"
v-model:page-size="query.size"
v-model:current-page="query.current"
:total="total"
layout="total, sizes, prev, pager, next"

2
src/views/work/Todo.vue

@ -260,7 +260,7 @@
@current-change="getList"
:current-page="query.current"
:page-sizes="[10, 20, 50]"
:page-size="query.size"
v-model:page-size="query.size"
v-model:current-page="query.current"
:total="totalSize.total"
layout="total, sizes, prev, pager, next"

1
src/views/work/components/AddMail.vue

@ -174,7 +174,6 @@
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, reactive } from "vue";
import type { FormInstance, FormRules } from "element-plus";
import { useDictOptions } from "@/hooks/useDictOptions";
import { listSecond } from "@/api/org/department";

2
src/views/work/components/AppealProgress.vue

@ -1,6 +1,6 @@
<template>
<el-dialog v-model="visible" width="1100px" top="4vh" class="dialog-header-nopadding" align-center
style="--el-dialog-padding-primary: 10px">
style="--el-dialog-padding-primary: 10px" :lock-scroll="false">
<template #header="" style="display: flex;align-items: center;justify-content: space-between;">
<div class="dialog-header">
<span class="dialog-title">不满意信件申诉处理</span>

2
src/views/work/components/HandleAppeal.vue

@ -1,6 +1,6 @@
<template>
<el-dialog v-model="visible" width="1100px" top="4vh" class="dialog-header-nopadding" align-center
style="--el-dialog-padding-primary: 10px">
style="--el-dialog-padding-primary: 10px" :lock-scroll="false">
<template #header="" style="display: flex;align-items: center;justify-content: space-between;">
<div class="dialog-header">
<span class="dialog-title">不满意信件申诉处理</span>

2
src/views/work/components/LaunchAppeal.vue

@ -1,6 +1,6 @@
<template>
<el-dialog v-model="visible" width="50vw" top="4vh" class="dialog-header-nopadding" align-center
style="--el-dialog-padding-primary: 10px">
style="--el-dialog-padding-primary: 10px" :lock-scroll="false">
<template #header="" style="display: flex;align-items: center;justify-content: space-between;">
<div class="dialog-header">
<span class="dialog-title">不满意信件申诉</span>

34
src/views/work/components/MailDialog.vue

@ -6,6 +6,7 @@
top="2vh"
class="dialog-header-nopadding"
style="--el-dialog-padding-primary: 10px; margin-bottom: 2vh"
:lock-scroll="false"
>
<template #header="{ close, titleId, titleClass }">
<header class="flex between v-center dialog-header">
@ -218,7 +219,7 @@
"
:mailReturns="mailReturns"
/>
<MainContactInfo @refresh="getDetail(); emits('update')" />
<MainContactInfo @refresh="getDetail(); emits('update')" @close="visible = false" />
<template v-if="webComponents.indexOf('Comments') > -1">
<Comments :approvals="approvals" />
</template>
@ -234,10 +235,18 @@
:mailId="mailId"
/>
</template>
<div class="card-info mb-4 mb-8" v-if="mail.mailFirstCategory === '感谢信类'">
<div class="flex mb-8">
<div class="col" style="width: 33%">
<label>感谢单位</label>
<span>{{ mail.secondDeptName }}{{ mail.threeDeptName }}</span>
</div>
</div>
</div>
<div class="card-info mb-4" v-if="mail.firstDistributeInfo?.mainDept?.name">
<div class="flex mb-8">
<div class="col" style="width: 33%">
<label>二级主责单位</label>
<label style="width: 86px" class="text-right">二级主责单位</label>
<span>{{ mail.firstDistributeInfo?.mainDept?.name }}</span>
</div>
<div class="col" style="width: 33%" v-if="mail.firstDistributeInfo?.secondDept1?.name">
@ -249,15 +258,19 @@
<span>{{ mail.firstDistributeInfo?.secondDept2?.name }}</span>
</div>
</div>
<div class="col" v-if="mail.firstDistributeComment">
<label>下发意见</label>
<div class="col mb-8" v-if="mail.firstDistributeComment">
<label style="width: 86px" class="text-right">市局下发意见</label>
<span>{{ mail.firstDistributeComment }}</span>
</div>
<div class="col" v-if="mail.firstDistributeFiles">
<label style="width: 86px" class="text-right">附件</label>
<file-list :files="JSON.parse(mail.firstDistributeFiles)" />
</div>
</div>
<div class="card-info mb-4" v-if="mail.secondDistributeInfo?.mainDept?.name">
<div class="flex mb-8">
<div class="col" style="width: 33%">
<label>三级主责单位</label>
<label style="width: 86px" class="text-right">三级主责单位</label>
<span>{{ mail.secondDistributeInfo?.mainDept?.name }}</span>
</div>
<div class="col" style="width: 33%" v-if="mail.secondDistributeInfo?.secondDept1?.name">
@ -270,9 +283,13 @@
</div>
</div>
<div class="col" v-if="mail.secondDistributeComment">
<label>下发意见</label>
<label style="width: 86px" class="text-right">二级下发意见</label>
<span>{{ mail.secondDistributeComment }}</span>
</div>
<div class="col" v-if="mail.secondDistributeFiles">
<label style="width: 86px" class="text-right">附件</label>
<file-list :files="JSON.parse(mail.secondDistributeFiles)" />
</div>
</div>
<template
v-if="
@ -637,6 +654,9 @@ watch(() => props.disabled, (val) => {
const visible = ref(props.show);
watch(visible, (val) => {
emits("update:show", val);
if (val) {
getDetail()
}
});
watch(
() => props.show,
@ -968,7 +988,7 @@ function handleCategoryChange(data, node) {
function handleUpdateMailCategory() {
updateMailCategory(form).then(() => {
mailCategoryEditable.value = false
feedback.msgSuccee('修改成功')
feedback.msgSuccess('修改成功')
getDetail()
})
}

2
src/views/work/components/OverruleReason.vue

@ -1,6 +1,6 @@
<template>
<el-dialog v-model="visible" width="1100px" top="4vh" class="dialog-header-nopadding" align-center
style="--el-dialog-padding-primary: 10px">
style="--el-dialog-padding-primary: 10px" :lock-scroll="false">
<template #header="" style="display: flex;align-items: center;justify-content: space-between;">
<div class="dialog-header">
<span class="dialog-title">不满意信件申诉处理</span>

74
src/views/work/components/templates/DeptSelectForm.vue

@ -1,18 +1,65 @@
<template>
<div>
<div class="tips flex v-center" v-if="workType !== 'secondary' && mail.flowKey === 'first_distribute' && mailNlp?.secondDeptId">
<icon name="el-icon-Warning" color="#162582" size="24" class="mr-8" />
<div
class="tips flex v-center"
v-if="
workType !== 'secondary' &&
mail.flowKey === 'first_distribute' &&
mailNlp?.secondDeptId
"
>
<icon
name="el-icon-Warning"
color="#162582"
size="24"
class="mr-8"
/>
<span>根据系统判断该信件的办理单位为</span>
<span class="ml-8 mr-10 primary" @click="form.mainDeptId = mailNlp.secondDeptId">{{ mailNlp.secondDeptName }}</span>
<span
class="ml-8 mr-10 primary"
@click="form.mainDeptId = mailNlp.secondDeptId"
>{{ mailNlp.secondDeptName }}</span
>
<span>系统判定仅供参考请仔细核查</span>
<el-button type="primary" plain size="small" class="ml-10" @click="form.mainDeptId = mailNlp.secondDeptId">立即使用</el-button>
<el-button
type="primary"
plain
size="small"
class="ml-10"
@click="form.mainDeptId = mailNlp.secondDeptId"
>立即使用</el-button
>
</div>
<div class="tips flex v-center" v-if="workType !== 'secondary' && mail.flowKey === 'second_distribute' && mailNlp?.threeDeptId && mail.secondDeptId === mailNlp.secondDeptId">
<icon name="el-icon-Warning" color="#162582" size="24" class="mr-8" />
<div
class="tips flex v-center"
v-if="
workType !== 'secondary' &&
mail.flowKey === 'second_distribute' &&
mailNlp?.threeDeptId &&
mail.secondDeptId === mailNlp.secondDeptId
"
>
<icon
name="el-icon-Warning"
color="#162582"
size="24"
class="mr-8"
/>
<span>根据系统判断该信件的办理单位为</span>
<span class="ml-8 mr-20 primary" @click="form.mainDeptId = mailNlp.threeDeptId">{{ mailNlp.threeDeptName }}</span>
<span
class="ml-8 mr-20 primary"
@click="form.mainDeptId = mailNlp.threeDeptId"
>{{ mailNlp.threeDeptName }}</span
>
<span>系统判定仅供参考请仔细核查</span>
<el-button type="primary" plain size="small" class="ml-10" @click="form.mainDeptId = mailNlp.threeDeptId">立即使用</el-button>
<el-button
type="primary"
plain
size="small"
class="ml-10"
@click="form.mainDeptId = mailNlp.threeDeptId"
>立即使用</el-button
>
</div>
<h2>办理单位</h2>
<el-form :label-width="150" :model="form" :rules="rules" ref="formRef">
@ -153,6 +200,11 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="下发意见(附件)">
<Upload v-model="form.files" tips="" />
</el-form-item>
</el-row>
</template>
</el-form>
</div>
@ -178,8 +230,8 @@ const form = ref({
mainDeptLevel: mail.value.mainDeptLevel,
});
//
if (mail.value.flowKey === 'second_distribute') {
form.value.mainDeptLevel = form.value.mainDeptLevel || 1
if (mail.value.flowKey === "second_distribute") {
form.value.mainDeptLevel = form.value.mainDeptLevel || 1;
}
const formRef = ref(null);
const rules = ref({
@ -252,7 +304,7 @@ defineExpose({
}
.tips {
padding: 12px 16px;
border: 1px solid #96A3F4;
border: 1px solid #96a3f4;
.primary {
color: var(--primary-color);
font-weight: 700;

12
src/views/work/components/templates/MailTypeForm.vue

@ -16,9 +16,9 @@
</el-form-item>
</div>
<div style="width: 50%">
<el-form-item label="信件等级" prop="mailLevel" v-if="form.mailCategory !== '感谢信类' &&
form.mailCategory !== '无效类' &&
form.mailCategory !== '终止类'
<el-form-item label="信件等级" prop="mailLevel" v-if="form.mailFirstCategory !== '感谢信类' &&
form.mailFirstCategory !== '无效类' &&
form.mailFirstCategory !== '终止类'
">
<el-select v-model="form.mailLevel" placeholder="" clearable>
<el-option v-for="item in dictData.mail_level" :key="item.value" :label="item.name"
@ -41,12 +41,12 @@
</div>
</el-radio-group>
</el-form-item>
<el-form-item label="判定理由" prop="invalidationReason" v-if="form.mailCategory === '无效类' ||
form.mailCategory === '终止类'
<el-form-item label="判定理由" prop="invalidationReason" v-if="form.mailFirstCategory === '无效类' ||
form.mailFirstCategory === '终止类'
">
<el-input type="textarea" placeholder="请输入判定理由" v-model="form.invalidationReason" />
</el-form-item>
<el-form-item label="相关单位" v-if="form.mailCategory === '感谢信类'">
<el-form-item label="相关单位" v-if="form.mailFirstCategory === '感谢信类'">
<div class="flex gap" style="width: 100%">
<el-select v-model="form.secondDeptId" placeholder="请选择二级单位" filterable clearable
style="width: 50%" @change="handleChangeDept">

27
src/views/work/components/templates/MainContactInfo.vue

@ -121,7 +121,11 @@
<span>{{ mail.caseNumber }}</span>
</div>
<div class="col" v-if="mail.involvedDeptName">
<label>被投诉/涉及单位</label>
<label>{{
mail.mailFirstCategory === "感谢信类"
? "感谢单位"
: "被投诉/涉及单位"
}}</label>
<span>{{ mail.involvedDeptName }}</span>
</div>
</div>
@ -178,6 +182,11 @@
</div>
</div>
</el-scrollbar>
<div class="flex center mt-10">
<el-button type="primary" round size="large" @click="openMailQuery"
>跳转至信件查询</el-button
>
</div>
</el-dialog>
<MailMerga v-model:show="mergeShow" />
@ -189,8 +198,11 @@ const { dictData } = useDictData(["mail_source", "mail_state"]);
import { updateContactInfo } from "@/api/mail";
import { getDictLable } from "@/utils/util";
import feedback from "@/utils/feedback";
import { useRouterParamsStore } from "@/stores/modules/routerParams";
const useRouterParams = useRouterParamsStore();
const emit = defineEmits(["refresh"]);
const emit = defineEmits(["refresh", "close"]);
const mail = inject("mail");
const historys = inject("historys");
const disabled = inject("disabled");
@ -215,6 +227,17 @@ function sumbit() {
}
const mergeShow = ref(false);
const router = useRouter();
function openMailQuery() {
historysVisible.value = false;
emit("close");
useRouterParams.setParams({
contactField: "phone",
contactFieldValue: historys.value[0].contactPhone,
});
router.push("/work/query");
}
</script>
<style lang="scss" scoped>
.card {

129
src/views/work/components/templates/ThreeHandlingDetail.vue

@ -1,121 +1,44 @@
<template>
<el-collapse v-model="activeNames">
<el-collapse-item
title="举报/投诉人基本情况"
name="1"
v-if="mail.verifyReportedPolices?.length"
>
<div
class="flex"
v-for="(item, index) in mail.verifyReportedPolices"
:key="item.empNo"
>
<el-collapse-item title="领导接访情况" name="2" v-if="mail.interviewType">
<div class="flex mb-12">
<div class="col">
<label>被举报人{{ index + 1 }}</label>
<span>{{ item.name }}</span>
<label>主单位签收时长</label>
<span>{{ formatTimeText(mail.mainDeptSignTime) }}</span>
</div>
<div class="col">
<label>警号</label>
<span>{{ item.empNo }}</span>
</div>
<div class="col" v-if="item.gender">
<label>性别</label>
<span>{{ item.gender }}</span>
</div>
<div class="col" v-if="item.birthday">
<label>出生年月</label>
<span>{{ item.birthday }}</span>
<label>主单位联系群众时长</label>
<span>{{ formatTimeText(mail.contactDuration) }}</span>
</div>
</div>
</el-collapse-item>
<el-collapse-item title="联系群众/领导接访情况" name="2" v-if="mail.contactPoliceName">
<div class="flex mb-12" v-if="mail.contactPoliceName">
<div class="col" v-if="mail.mainDeptSignTime">
<label>主单位签收时长</label>
<span :danger="mail.mainDeptSignTime > 600">{{ formatTimeText(mail.mainDeptSignTime) }}</span>
<div class="flex mb-12">
<div class="col">
<label>接访形式</label>
<span>{{ mail.interviewType }}</span>
</div>
<div class="col">
<label>联系民警</label>
<span>{{ mail.contactPoliceName }}</span>
<label>是否一把手接访</label>
<span>{{ mail.interviewIsLeader ? "是" : "否" }}</span>
</div>
<div class="col">
<label>
<el-tooltip
content="联系时长 = 联系时间 - 二级机构下发时间"
placement="top-start"
:raw-content="true"
>
<div class="flex v-center">
<span class="mr-4">主单位联系群众时长</span>
<icon
name="el-icon-QuestionFilled"
:size="16"
/>
</div>
</el-tooltip>
</label>
<span :danger="mail.contactDuration > 1800">{{ formatTimeText(mail.contactDuration) }}</span>
<label>接访领导</label>
<span>{{ mail.interviewPoliceName }}</span>
</div>
</div>
<template v-if="mail.interviewType">
<div class="flex mb-12">
<div class="col">
<label>接访形式</label>
<span>{{ mail.interviewType }}</span>
</div>
<div class="col">
<label>是否一把手接访</label>
<span>{{ mail.interviewIsLeader ? "是" : "否" }}</span>
</div>
<div class="col">
<label>接访领导</label>
<span>{{ mail.interviewPoliceName }}</span>
</div>
</div>
<div class="flex mb-12">
<div class="col" style="width: 100%">
<label>接访情况</label>
<el-input
type="textarea"
v-model="interviewDetails"
v-if="interviewDetailsEditable"
/>
<div class="content" v-else>{{ mail.interviewDetails }}</div>
</div>
</div>
<div class="flex end" v-if="!disabled">
<div v-if="interviewDetailsEditable">
<el-button
size="small"
@click="interviewDetailsEditable = false"
>取消</el-button
>
<el-button
size="small"
type="primary"
@click="sumbitInterviewDetails"
>提交</el-button
>
</div>
<el-button
type="primary"
size="small"
plain
@click="interviewDetailsEditable = true"
v-else
>修改接访情况</el-button
>
<div class="flex mb-12">
<div class="col" style="width: 100%">
<label>接访情况</label>
<span>{{ mail.interviewDetails }}</span>
</div>
<div class="flex">
<div class="col" style="width: 100%">
<label>接访附件</label>
<span>
<FileList :files="mail.interviewAttachments" />
</span>
</div>
</div>
<div class="flex">
<div class="col">
<label>接访附件</label>
<span>
<FileList :files="mail.interviewAttachments" />
</span>
</div>
</template>
</div>
</el-collapse-item>
<el-collapse-item
title="核查办理情况"

6
vite.config.ts

@ -21,12 +21,12 @@ export default ({ mode }) => {
},
server: {
host: '0.0.0.0',
port: 5172,
port: 5173,
proxy: {
'/lan-api': {
//
// https://mailbox.biutag.com/lan-api/
// http://127.0.0.1:8082
target: 'https://mailbox.biutag.com/lan-api/',
target: 'http://127.0.0.1:8082',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/lan-api/, '')
}

Loading…
Cancel
Save