Browse Source

首页、签收流程

master
wxc 2 years ago
parent
commit
4950cc39e5
  1. 5
      src/api/home.ts
  2. 8
      src/api/perms/admin.ts
  3. 0
      src/assets/icons/approval.svg
  4. 0
      src/assets/icons/contact_writer.svg
  5. 0
      src/assets/icons/extension.svg
  6. 0
      src/assets/icons/interview_writer.svg
  7. 0
      src/assets/icons/un_sign.svg
  8. 0
      src/assets/icons/verify.svg
  9. 5
      src/components/MailCategorySelect.vue
  10. 86
      src/components/Upload.vue
  11. 2
      src/layout/components/Header.vue
  12. 9
      src/style/public.scss
  13. 13
      src/utils/util.ts
  14. 43
      src/views/home/components/Daily.vue
  15. 83
      src/views/home/components/Duty.vue
  16. 85
      src/views/home/components/MailTable.vue
  17. 14
      src/views/home/components/Overall.vue
  18. 34
      src/views/work/Todo.vue
  19. 30
      src/views/work/components/MailDialog.vue
  20. 17
      src/views/work/components/templates/InterviewWriterFrom.vue
  21. 48
      src/views/work/components/templates/MailApprovalDetail.vue
  22. 22
      src/views/work/components/templates/MailTypeForm.vue
  23. 18
      src/views/work/components/templates/VerifyForm.vue

5
src/api/home.ts

@ -0,0 +1,5 @@
import request from '@/utils/request'
export function getMailOverall() {
return request.get({ url: '/home/mail/overall'})
}

8
src/api/perms/admin.ts

@ -37,8 +37,12 @@ export function adminStatus(params: any) {
return request.post({ url: '/system/admin/disable', params })
}
// 管理员删除
// 领导列表(正职)
export function getLeaderList() {
return request.get({ url: '/system/admin/leader/list'})
}
// 领导列表(副职)
export function getDeputyList() {
return request.get({ url: '/system/admin/leader/list'})
}

0
src/assets/icons/ic_banjieshenpi.svg → src/assets/icons/approval.svg

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

0
src/assets/icons/ic_lianxiqunzhong.svg → src/assets/icons/contact_writer.svg

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

0
src/assets/icons/ic_shenqingyanqi.svg → src/assets/icons/extension.svg

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

0
src/assets/icons/ic_qunzhongjiefang.svg → src/assets/icons/interview_writer.svg

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

0
src/assets/icons/ic_qianshou.svg → src/assets/icons/un_sign.svg

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

0
src/assets/icons/ic_zhengzaibanli.svg → src/assets/icons/verify.svg

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

5
src/components/MailCategorySelect.vue

@ -4,16 +4,18 @@
:data="mailStore.mailCategorys"
filterable
@current-change="handleCategoryChange"
placeholder="请选择信件分类"
/>
</template>
<script setup>
import useMailStore from "@/stores/modules/mail";
const mailStore = useMailStore();
//
mailStore.getMailCategorys();
const val = ref('');
defineProps({
const props = defineProps({
value: {
type: String,
default: ''
@ -23,6 +25,7 @@ defineProps({
const emit = defineEmits(['update:value', 'change'])
const handleCategoryChange = (data, node) => {
emit('update:value', data.label)
emit('change', data, node)
}
</script>

86
src/components/Upload.vue

@ -0,0 +1,86 @@
<template>
<div>
<el-upload
:action="`${VITE_API_URL}/api/file/upload`"
:headers="{ Admin: getToken() }"
multiple
@before-upload="beforeUpload"
@success="handleSuccess"
:show-file-list="false"
>
<el-button
>上传
<template #icon>
<icon name="el-icon-Upload" />
</template>
</el-button>
</el-upload>
<div class="flex wrap img-box mt-10">
<template v-for="(item, index) in files" :key="index">
<div class="releative">
<img
:src="`${VITE_API_URL}/api/file/stream/${item.filepath}`"
/>
<a class="close-btn" @click="remove(index)">
<icon name="el-icon-CircleCloseFilled" :size="20" />
</a>
</div>
</template>
</div>
</div>
</template>
<script setup>
import { getToken } from "@/utils/auth";
const { VITE_API_URL } = process.env;
const props = defineProps({
value: {
type: Array,
default: () => [],
},
});
const emit = defineEmits(["update:value"]);
const files = ref([]);
function beforeUpload() {}
function handleSuccess(data, file) {
if (data.code !== 200) {
return;
}
files.value.push({
filepath: data.data.filepath,
orgiinFilename: file.name,
type: file.raw.type,
});
emit("update:value", files.value);
}
function remove(index) {
files.value.splice(index, 1);
emit("update:value", files.value);
}
</script>
<style lang="scss" scoped>
.img-box {
img {
width: 80px;
height: 80px;
}
.close-btn {
position: absolute;
top: -10px;
right: -10px;
display: block;
border-radius: 50%;
height: 20px;
&:hover {
color: red;
cursor: pointer;
}
}
}
</style>

2
src/layout/components/Header.vue

@ -12,7 +12,7 @@
<div class="flex v-center gap-16">
<section class="flex gap">
<icon name="el-icon-UserFilled" :size="29" color="#586EFF" />
<span>{{ userStore.userInfo.roleName }}</span>
<span>{{ userStore.userInfo.deptName + ' ' + userStore.userInfo.name }}</span>
</section>
<el-button type="primary" @click="logout" style="">退出
<template #icon><icon name="local-icon-logout" color="#586EFF" /></template>

9
src/style/public.scss

@ -3,6 +3,7 @@ body {
font-size: 14px;
margin: 0;
overflow: hidden;
color: #333;
}
p {
@ -139,7 +140,9 @@ body {
.mr-10 {
margin-right: 10px;
}
.mr-18 {
margin-right: 18px;
}
.mr-20 {
margin-right: 20px;
}
@ -154,7 +157,9 @@ body {
.mt-10 {
margin-top: 10px;
}
.mt-16 {
margin-top: 16px;
}
.mt-20 {
margin-top: 20px;
}

13
src/utils/util.ts

@ -206,5 +206,18 @@ export const getDictLable = (dictArr: any[], value: string) => {
if (!value) {
return ''
}
if (!dictArr || !dictArr.length) {
return ''
}
return dictArr.filter(item => item.value === value)[0].name
}
export function getFlowTagType(flowKey) {
if (flowKey === 'first_sign' || flowKey === 'second_sign' || flowKey === 'three_sign') {
return 'danger'
}
if (flowKey === 'first_distribute' || flowKey === 'second_distribute') {
return 'success'
}
return ''
}

43
src/views/home/components/Daily.vue

@ -1,33 +1,56 @@
<template>
<div>
<div class="mt-16">
<h1>今日统计</h1>
</div>
<div class="flex wrap box">
<section
class="flex column v-center item"
v-for="i in Array.from({ length: 4 })"
>
<section class="flex column v-center item">
<div class="number">18</div>
<span>今日来信</span>
</section>
<section class="flex column v-center item">
<div class="number">14</div>
<span>今日办结</span>
</section>
<section class="flex column v-center item">
<div class="number">100</div>
<span>累计来信</span>
</section>
<section class="flex column v-center item">
<div class="number">22</div>
<span>累计办结</span>
</section>
<section class="flex column v-center item">
<div class="number" style="color: var(--primary-color)">38</div>
<span>累计感谢信</span>
</section>
</div>
</template>
<script setup>
</script>
<style lang="scss" scoped>
.box {
box-shadow: 0px -1px 0px 0px rgba(22,37,130,1);
background: #F7F8FB;
box-shadow: 0px -1px 0px 0px rgba(22, 37, 130, 1);
background: #f7f8fb;
}
.item {
--number-font-color: var(--primary-color);
width: 50%;
padding: 12px 0;
&:nth-child(3),
&:nth-child(4),
&:nth-child(5) {
width: 33.33%;
.number {
--number-font-color: #999;
}
span {
font-size: 16px;
}
}
.number {
font-size: 38px;
font-weight: bold;
color: #162582;
color: var(--number-font-color);
}
span {
font-size: 20px;

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

@ -2,34 +2,91 @@
<h1>今日值班</h1>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="市局专班" name="todo">
<div class="flex item between" v-for="item in duty.dutySjList" :key="item.id">
<div>{{ item.departName }}</div>
<div class="primary">
<span class="mr-18">{{ item.policeName }}</span>
<span>{{ item.mobile }}</span>
</div>
</div>
<el-empty v-if="!duty.dutySjList.length"></el-empty>
</el-tab-pane>
<el-tab-pane label="分县市局" name="due">
<div class="flex item between" v-for="item in duty.dutyFjList" :key="item.id">
<div>{{ item.departName }}</div>
<div class="primary">
<span class="mr-18">{{ item.policeName }}</span>
<span>{{ item.mobile }}</span>
</div>
</div>
<el-empty v-if="!duty.dutyFjList.length"></el-empty>
</el-tab-pane>
<el-tab-pane label="支队" name="supervise">
<div class="flex item between" v-for="item in duty.dutyZdList" :key="item.id">
<div>{{ item.departName }}</div>
<div class="primary">
<span class="mr-18">{{ item.policeName }}</span>
<span>{{ item.mobile }}</span>
</div>
</div>
<el-empty v-if="!duty.dutyZdList.length"></el-empty>
</el-tab-pane>
<el-tab-pane label="部委组警校" name="highSensitivity">
<div class="flex item between" v-for="item in duty.dutyBwList" :key="item.id">
<div>{{ item.departName }}</div>
<div class="primary">
<span class="mr-18">{{ item.policeName }}</span>
<span>{{ item.mobile }}</span>
</div>
</div>
<el-empty v-if="!duty.dutyBwList.length"></el-empty>
</el-tab-pane>
<el-tab-pane label="分县市局" name="due">Config</el-tab-pane>
<el-tab-pane label="支队" name="supervise">Role</el-tab-pane>
<el-tab-pane label="部委组警校" name="highSensitivity">Task</el-tab-pane>
</el-tabs>
</template>
<script setup>
import { dutyDay } from '@/api/datascreen'
const duty = ref({
dutySjList: [],
dutyFjList: [],
dutyZdList: [],
dutyBwList: [],
})
dutyDay().then(data => {
duty.value = data
})
</script>
<style lang="scss" scoped>
.item {
height: 60px;
line-height: 60px;
box-shadow: inset 0px -1px 0px 0px #E8EBFF;
color: #999;
padding: 0 16px;
.primary {
color: #000;
}
}
.el-tabs {
--el-font-size-base: 18px;
--el-text-color-primary: #999;
:deep() {
.el-tabs__header {
margin: 0;
.el-tabs__nav {
padding-bottom: 12px;
.el-tabs__item {
font-weight: 700;
}
padding-bottom: 16px;
.el-tabs__item {
font-weight: 700;
}
}
}
.el-tabs__active-bar {
.el-tabs__active-bar {
height: 4px;
}
.el-tabs__item {
--el-font-size-base: 18px;
--el-text-color-primary: #999;
}
}
}
</style>

85
src/views/home/components/MailTable.vue

@ -2,6 +2,55 @@
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="我的待办" name="todo">
<el-table :data="todos" style="width: 100%" stripe>
<el-table-column
prop="mailTime"
label="来信时间"
align="center"
width="180"
/>
<el-table-column
prop="contactName"
label="姓名"
align="center"
width="120"
/>
<el-table-column
prop="contactPhone"
label="联系电话"
width="120"
/>
<el-table-column
prop="content"
label="信件内容"
show-overflow-tooltip
/>
<el-table-column prop="mailState" label="信件状态">
<template #default="{ row }">
<span>{{
getDictLable(dictData.mail_state, row.mailState)
}}</span>
</template>
</el-table-column>
<el-table-column label="流程节点">
<template #default="{ row }">
<el-tag :type="getFlowTagType(row.flowKey)" v-if="row.flowBeforeName">{{ row.flowBeforeName }}</el-tag>
<el-tag type="danger" v-else>未签收</el-tag>
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleMail(row.mailId)"
>立即处理</el-button
>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="即将到期" name="due">
<el-table :data="superviseTodos" style="width: 100%" stripe>
<el-table-column
prop="mailTime"
label="来信时间"
@ -29,7 +78,13 @@
label="信件内容"
show-overflow-tooltip
/>
<el-table-column prop="mailState" label="信件状态" />
<el-table-column prop="mailState" label="信件状态">
<template #default="{ row }">
<span>{{
getDictLable(dictData.mail_state, row.mailState)
}}</span>
</template>
</el-table-column>
<el-table-column label="流程节点">
<template #default="{ row }"> </template>
</el-table-column>
@ -45,7 +100,6 @@
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="即将到期" name="due">即将到期</el-tab-pane>
<el-tab-pane label="督办信件" name="supervise">
<el-table :data="superviseTodos" style="width: 100%" stripe>
<el-table-column
@ -75,7 +129,13 @@
label="信件内容"
show-overflow-tooltip
/>
<el-table-column prop="mailState" label="信件状态" />
<el-table-column prop="mailState" label="信件状态">
<template #default="{ row }">
<span>{{
getDictLable(dictData.mail_state, row.mailState)
}}</span>
</template>
</el-table-column>
<el-table-column label="流程节点">
<template #default="{ row }"> </template>
</el-table-column>
@ -120,7 +180,13 @@
label="信件内容"
show-overflow-tooltip
/>
<el-table-column prop="mailState" label="信件状态" />
<el-table-column prop="mailState" label="信件状态">
<template #default="{ row }">
<span>{{
getDictLable(dictData.mail_state, row.mailState)
}}</span>
</template>
</el-table-column>
<el-table-column label="流程节点">
<template #default="{ row }"> </template>
</el-table-column>
@ -138,12 +204,20 @@
</el-tab-pane>
</el-tabs>
<MailDialog v-model:show="showModel" :mail-id="activeMailId" @update="getList" />
<MailDialog
v-model:show="showModel"
:mail-id="activeMailId"
@update="getList"
/>
</template>
<script setup>
import MailDialog from "@/views/work/components/MailDialog.vue";
import { useDictData } from "@/hooks/useDictOptions";
import { getTodos } from "@/api/work";
import { getDictLable, getFlowTagType } from "@/utils/util";
const { dictData } = useDictData(["mail_state"]);
const activeName = ref("todo");
@ -197,7 +271,6 @@ function handleMail(mailId) {
showModel.value = true;
activeMailId.value = mailId;
}
</script>
<style lang="scss" scoped>
.el-tabs {

14
src/views/home/components/Overall.vue

@ -1,17 +1,23 @@
<template>
<el-row :gutter="20">
<el-col :span="4" v-for="i in Array.from({ length: 6 })">
<el-col :span="4" v-for="(item, index) in totals" :key="index">
<section class="flex column v-center item">
<div>
<icon name="local-icon-ic_banjieshenpi" :size="87" />
<icon :name="`local-icon-${item.icon}`" :size="87" />
</div>
<div class="number">16</div>
<span class="text">联系群众</span>
<div class="number">{{ item.total }}</div>
<span class="text">{{ item.name }}</span>
</section>
</el-col>
</el-row>
</template>
<script setup>
import { getMailOverall } from '@/api/home'
const totals = ref([])
getMailOverall().then(data => {
totals.value = data
})
</script>
<style lang="scss" scoped>
.item {

34
src/views/work/Todo.vue

@ -189,14 +189,19 @@
<el-table-column label="流程节点">
<template #default="{ row }">
<el-tag :type="getFlowTagType(row.flowKey)" v-if="row.flowBeforeName">{{ row.flowBeforeName }}</el-tag>
<el-tag type="danger" v-else>未签收</el-tag>
</template>
</el-table-column>
<el-table-column label="流程限时">
<template #default="{ row }">
<div v-if="row.flowLimitedRemainingTime" :class="row.flowLimitedRemainingTime > 0 ? 'success' : 'error'">
<span class="mr-8">{{ row.flowLimitedRemainingTime > 0 ? '剩余' : '超时' }}</span>
<div v-if="row.flowLimitedRemainingTime > 0" class="success">
<span class="mr-4">剩余</span>
<span class="text">{{ formatTimeText(row.flowLimitedRemainingTime) }}</span>
</div>
<div v-if="row.flowLimitedRemainingTime < 0" class="error">
<span class="mr-4">超时</span>
<span class="text">{{ formatTimeText(-row.flowLimitedRemainingTime) }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="操作">
@ -223,7 +228,7 @@ import { getTodos } from "@/api/work";
import { getMailFlowDetail } from "@/api/mail";
import { useDictData } from "@/hooks/useDictOptions";
import useMailStore from "@/stores/modules/mail";
import { formatTimeText, getDictLable } from "@/utils/util";
import { formatTimeText, getDictLable, getFlowTagType } from "@/utils/util";
const mailStore = useMailStore();
mailStore.getMailCategorys();
@ -260,15 +265,7 @@ function reset() {
getList()
function getFlowTagType(flowKey) {
if (flowKey === 'first_sign' || flowKey === 'second_sign' || flowKey === 'three_sign') {
return 'danger'
}
if (flowKey === 'first_distribute' || flowKey === 'second_distribute') {
return 'success'
}
return ''
}
</script>
<style lang="scss" scoped>
.table-container {
@ -276,5 +273,18 @@ function getFlowTagType(flowKey) {
}
.success .text {
color: #128009;
padding: 0 8px;
height: 24px;
line-height: 24px;
text-align: center;
}
.error {
background-color: #FF0000;
color: #fff;
padding: 0 8px;
height: 24px;
line-height: 24px;
border-radius: 20px;
text-align: center;
}
</style>

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

@ -56,7 +56,7 @@
</div>
</header>
</template>
<main>
<main v-loading="loading">
<el-row :gutter="20" style="height: 100%">
<el-col :span="5" style="height: 100%">
<div
@ -97,7 +97,7 @@
style="padding-bottom: 20px"
>
<label>信件等级</label>
<span>{{ getMailLevel(dictData.mail_level, mail.mailLevel) }}</span>
<span>{{ getDictLable(dictData.mail_level, mail.mailLevel) }}</span>
</div>
</div>
<div class="flow">
@ -237,7 +237,7 @@
</main>
<footer class="flex between">
<div></div>
<div v-if="!disabled">
<div v-if="!disabled && !completionBtnFlag">
<el-button
v-for="action in actions"
:key="action.key"
@ -248,6 +248,7 @@
>{{ action.btnLabel }}</el-button
>
</div>
<el-button type="primary" size="large" v-if="completionBtnFlag">认定办结</el-button>
</footer>
</el-dialog>
@ -297,7 +298,7 @@ import { getMailFlowDetail, flowNext } from "@/api/mail";
import { addFav, delFav } from "@/api/work/fav";
import { useDictData } from "@/hooks/useDictOptions";
import feedback from "@/utils/feedback";
import { timeDiffSeconds, formatTimeText } from "@/utils/util";
import { timeDiffSeconds, formatTimeText, getDictLable } from "@/utils/util";
const { dictData } = useDictData(["mail_level"]);
@ -306,6 +307,8 @@ const deptSelectFormRef = ref();
const contactWriterFromRef = ref();
const interviewWriterFromRef = ref();
const verifyFormRef = ref();
const loading = ref(true)
const mail = ref({});
const flows = ref([]);
const flowNode = ref({});
@ -381,8 +384,10 @@ watch(
let timer;
function getDetail() {
loading.value = true
//
getMailFlowDetail(props.mailId).then((data) => {
loading.value = false
mail.value = data.mail;
flows.value = data.flows;
isFav.value = data.isFav;
@ -462,12 +467,22 @@ watch(flowRemainingTime, (val) => {
)}</span><span>小时</span>`;
});
const requestBody = ref({});
const requestData = ref({});
const messageRef = ref();
const approvedShow = ref(false);
const completionShow = ref(false);
const countersignShow = ref(false);
//
const completionBtnFlag = ref(false)
//
watch(() => requestData.value.mailFirstCategory, () => {
if (requestData.value.mailFirstCategory === "无效类" || requestData.value.mailFirstCategory === "终止类") {
completionBtnFlag.value = true
} else {
completionBtnFlag.value = false
}
})
async function handleAction(key) {
if (!key) {
return;
@ -507,13 +522,14 @@ async function handleAction(key) {
completeShow.value = true;
return;
}
requestBody.value = {
const requestBody = {
mailId: props.mailId,
nextActionKey: key,
flowKey: flowNode.value.key,
data: requestData.value,
};
flowNext(requestBody.value).then(() => {
loading.value = true
flowNext(requestBody).then(() => {
//
emits("update");
if (

17
src/views/work/components/templates/InterviewWriterFrom.vue

@ -44,20 +44,7 @@
<el-row>
<el-col :span="12">
<el-form-item label="上传佐证" prop="interviewAttachments">
<el-upload
v-model:file-list="fileList"
:action="`${VITE_API_URL}/api/file/upload`"
:headers="{'Admin': getToken()}"
multiple
>
<el-button
>上传
<template #icon>
<icon name="el-icon-Upload" />
</template>
</el-button>
</el-upload>
<Upload />
</el-form-item>
</el-col>
<el-col :span="12">
@ -76,7 +63,7 @@ import { getToken } from "@/utils/auth";
import { useDictData } from "@/hooks/useDictOptions";
const { VITE_API_URL } = process.env;
const { dictData } = useDictData(["interview_type"]);
const form = ref({});

48
src/views/work/components/templates/MailApprovalDetail.vue

@ -1,6 +1,6 @@
<template>
<el-collapse>
<el-collapse-item title="举报人/投诉人基本情况">
<el-collapse v-model="activeNames">
<el-collapse-item title="来信人基本情况" name="1">
<div class="flex">
<div class="col">
<label>姓名</label>
@ -20,7 +20,7 @@
</div>
</div>
</el-collapse-item>
<el-collapse-item title="举报/投诉对象基本情况">
<el-collapse-item title="举报/投诉对象基本情况" name="2" v-if="mail.verifyReportedPolices.length">
<div class="flex" v-for="item in mail.verifyReportedPolices" :key="item.empNo">
<div class="col">
<label>被举报对象1</label>
@ -40,28 +40,28 @@
</div>
</div>
</el-collapse-item>
<el-collapse-item title="举报/投诉反应主要问题">
<el-collapse-item title="来信反应主要问题" name="3">
<div class="content">{{ mail.content }}</div>
</el-collapse-item>
<el-collapse-item title="领导接访情况">
<el-collapse-item title="领导接访情况" name="4">
<div class="flex mb-10">
<div class="col">
<label>主单位签收时长</label>
<span>{{ mail.mailTime }}</span>
<span>{{ }}</span>
</div>
<div class="col">
<label>主单位联系群众时长</label>
<span>{{ mail.source }}</span>
<span>{{ }}</span>
</div>
</div>
<div class="flex mb-10">
<div class="col">
<label>接访形式</label>
<span>{{ mail.interviewType }}</span>
<span>{{ getDictLable(dictData.interview_type, mail.interviewType) }}</span>
</div>
<div class="col">
<label>是否一把手接访</label>
<span>{{ mail.interviewIsLeader }}</span>
<span>{{ mail.interviewIsLeader ? '是' : '否' }}</span>
</div>
<div class="col">
<label>接访领导</label>
@ -75,15 +75,15 @@
</div>
</div>
</el-collapse-item>
<el-collapse-item title="核查办理情况">
<el-collapse-item title="核查办理情况" name="5">
<div class="flex mb-10">
<div class="col">
<label>是否属实</label>
<span>{{ mail.verifyIsTrue }}</span>
<span>{{ getDictLable(dictData.verifyIsTrue, mail.interviewType) }}</span>
</div>
<div class="col">
<label>是否需要问责</label>
<span>{{ mail.verifyNeedAccountability }}</span>
<span>{{ mail.verifyNeedAccountability ? '是':'否' }}</span>
</div>
</div>
<div class="flex mb-10">
@ -99,52 +99,58 @@
</div>
</div>
</el-collapse-item>
<el-collapse-item title="整改问责情况">
<el-collapse-item title="整改问责情况" name="6">
<div class="flex">
<div class="col">
<label>责任追究</label>
<span v-for="(item, index) in mail.verifyPunish" :key="index">{{ item }}</span>
<span v-for="(item, index) in mail.verifyPunish" :key="index">{{ getDictLable(dictData.verify_punish, item) }}</span>
</div>
</div>
</el-collapse-item>
<el-collapse-item title="结果反馈情况">
<el-collapse-item title="结果反馈情况" name="7">
<div class="flex mb-10">
<div class="col">
<label>群众反应事项解决情况</label>
<span>{{ mail.verifyIsResolved }}</span>
<span>{{ mail.verifyIsResolved ? '已解决' : '' }}</span>
</div>
<div class="col">
<label>办理反馈情况</label>
<span>{{ mail.source }}</span>
<span>{{ getDictLable(dictData.satisfaction_status, mail.verifyFeedback) }}</span>
</div>
</div>
<div class="flex">
<div class="col">
<label>回访人姓名</label>
<span>{{ mail.source }}</span>
<span>{{ mail.verifyFollowupPolice?.name }}</span>
</div>
<div class="col">
<label>回访人电话</label>
<span>{{ mail.source }}</span>
<span>{{ mail.verifyFollowupPolice?.phone }}</span>
</div>
<div class="col">
<label>回访人警号</label>
<span>{{ mail.source }}</span>
<span>{{ mail.verifyFollowupPolice?.empNo }}</span>
</div>
</div>
</el-collapse-item>
<el-collapse-item title="办结佐证材料">
<el-collapse-item title="办结佐证材料" name="8">
<div></div>
</el-collapse-item>
</el-collapse>
</template>
<script setup>
import { getDictLable } from "@/utils/util";
import { useDictData } from "@/hooks/useDictOptions";
const { dictData } = useDictData(["interview_type", "satisfaction_status", "verify_is_true", "verify_punish"]);
defineProps({
mail: {
type: Object,
default: () => ({}),
},
});
const activeNames = ref(['1', "2", "3", "4", "5", "6", "7", "8"])
</script>
<style lang="scss" scoped>
.el-collapse-item {

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

@ -5,11 +5,9 @@
<div class="flex gap-20">
<div style="width: 50%">
<el-form-item label="信件分类" prop="mailCategoryId">
<el-tree-select
<mail-category-select
v-model="form.mailCategoryName"
:data="mailStore.mailCategorys"
filterable
@current-change="handleCategoryChange"
@change="handleCategoryChange"
/>
</el-form-item>
</div>
@ -30,7 +28,7 @@
</el-form-item>
</div>
</div>
<el-form-item label="处理流程" prop="flowType" v-if="simpleFlowFlag">
<el-form-item label="处理流程" prop="simpleFlowFlag" v-if="simpleFlowShow">
<el-radio-group v-model="form.simpleFlowFlag" class="ml-4">
<div>
<el-radio :label="false" size="large">正常流程</el-radio>
@ -46,15 +44,12 @@
</div>
</template>
<script setup>
import useMailStore from "@/stores/modules/mail";
import { useDictData } from "@/hooks/useDictOptions";
import { useDictData } from "@/hooks/useDictOptions";
const { dictData } = useDictData(["mail_level"]);
const form = ref({});
const formRef = ref();
const flowTypeShow = ref(false);
const simpleFlowShow = ref(false);
const rules = {
mailCategory: [
@ -103,9 +98,12 @@ function handleCategoryChange(data, node) {
form.value.mailSecondCategory = node.parent.data.label;
form.value.mailThreeCategory = data.label;
}
if (form.value.mailFirstCategory === "咨询类" || form.value.mailFirstCategory === "简易类") {
flowTypeShow.value = true
if (form.value.mailFirstCategory === "工作建议类" || form.value.mailFirstCategory === "咨询求助类") {
simpleFlowShow.value = true
} else {
simpleFlowShow.value = false
}
emits("update:data", form.value);
}
function validate() {

18
src/views/work/components/templates/VerifyForm.vue

@ -17,9 +17,7 @@
<el-row>
<el-form-item label="是否属实" prop="verifyIsTrue">
<el-radio-group v-model="form.verifyIsTrue">
<el-radio label="1" size="large">属实</el-radio>
<el-radio label="2" size="large">基本属实</el-radio>
<el-radio label="3" size="large">不属实</el-radio>
<el-radio v-for="item in dictData.verify_is_true" :key="item.name" :label="item.value" size="large">{{ item.name }}</el-radio>
</el-radio-group>
</el-form-item>
</el-row>
@ -96,8 +94,8 @@
<el-row>
<el-form-item label="是否需要问责" prop="verifyNeedAccountability">
<el-radio-group v-model="form.verifyNeedAccountability">
<el-radio label="1" size="large"></el-radio>
<el-radio label="2" size="large"></el-radio>
<el-radio :label="true" size="large"></el-radio>
<el-radio :label="false" size="large"></el-radio>
</el-radio-group>
</el-form-item>
</el-row>
@ -116,17 +114,15 @@
<el-row>
<el-form-item label="群众反应事项解决情况" prop="verifyIsResolved">
<el-radio-group v-model="form.verifyIsResolved">
<el-radio label="1" size="large">已解决</el-radio>
<el-radio label="2" size="large">未解决</el-radio>
<el-radio :label="true" size="large">已解决</el-radio>
<el-radio :label="false" size="large">未解决</el-radio>
</el-radio-group>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="办理反馈情况" prop="verifyFeedback">
<el-radio-group v-model="form.verifyFeedback">
<el-radio label="1" size="large">满意</el-radio>
<el-radio label="2" size="large">基本满意</el-radio>
<el-radio label="2" size="large">不满意</el-radio>
<el-radio v-for="item in dictData.satisfaction_status" :key="item.name" :label="item.value" size="large">{{ item.name }}</el-radio>
</el-radio-group>
</el-form-item>
</el-row>
@ -190,7 +186,7 @@ import { listByThree } from "@/api/org/department";
import { allLists } from "@/api/perms/admin";
import { getToken } from "@/utils/auth";
const { VITE_API_URL } = process.env;
const { dictData } = useDictData(["verify_problem", "verify_punish"]);
const { dictData } = useDictData(["verify_problem", "verify_punish", "satisfaction_status", "verify_is_true"]);
const threeDepts = ref([]);
const polices = ref([]);

Loading…
Cancel
Save