Browse Source

BUG修复

master
wxc 2 years ago
parent
commit
3c9d80b246
  1. 8
      src/api/mail.ts
  2. 28
      src/components/DeptTreeSelect.vue
  3. 24
      src/components/FileList.vue
  4. 6
      src/layout/components/Header.vue
  5. 2
      src/style/public.scss
  6. 35
      src/utils/util.ts
  7. 8
      src/views/Login.vue
  8. 32
      src/views/datascreen/assets/css/index.css
  9. 1312
      src/views/datascreen/countyData.vue
  10. 1544
      src/views/datascreen/index.vue
  11. 35
      src/views/home/components/Daily.vue
  12. 25
      src/views/home/components/DataStatistics.vue
  13. 57
      src/views/home/components/MailTable.vue
  14. 2
      src/views/home/components/Overall.vue
  15. 32
      src/views/permission/admin/index.vue
  16. 20
      src/views/work/Dissatisfied.vue
  17. 19
      src/views/work/Done.vue
  18. 7
      src/views/work/Fav.vue
  19. 61
      src/views/work/Query.vue
  20. 20
      src/views/work/Todo.vue
  21. 5
      src/views/work/components/AppealProgress.vue
  22. 37
      src/views/work/components/ApplicationCompleted.vue
  23. 10
      src/views/work/components/ApplyExtension.vue
  24. 2
      src/views/work/components/ConfirmedCompletion.vue
  25. 3
      src/views/work/components/HandleAppeal.vue
  26. 2
      src/views/work/components/HandleOverrule.vue
  27. 52
      src/views/work/components/InitiateCountersign.vue
  28. 2
      src/views/work/components/LaunchAppeal.vue
  29. 26
      src/views/work/components/MailDialog.vue
  30. 5
      src/views/work/components/OverruleReason.vue
  31. 20
      src/views/work/components/templates/CoHandlingDetail.vue
  32. 4
      src/views/work/components/templates/Comments.vue
  33. 26
      src/views/work/components/templates/DeptSelectForm.vue
  34. 27
      src/views/work/components/templates/MailApprovalDetail.vue
  35. 87
      src/views/work/components/templates/MainContactInfo.vue
  36. 25
      src/views/work/components/templates/ThreeHandling.vue
  37. 153
      src/views/work/components/templates/ThreeHandlingDetail.vue

8
src/api/mail.ts

@ -24,6 +24,14 @@ export function addCoHandling(body) {
return request.post({ url: '/mail/coHandling/add', body}) return request.post({ url: '/mail/coHandling/add', body})
} }
export function updateMailHandleDetail(body) {
return request.put({ url: '/mail/handleDetail', body})
}
export function updateContactInfo(body) {
return request.put({ url: '/mail/contactInfo', body})
}
export function deleteMail(body) { export function deleteMail(body) {
return request.post({ url: '/mail/delete', body}) return request.post({ url: '/mail/delete', body})
} }

28
src/components/DeptTreeSelect.vue

@ -0,0 +1,28 @@
<template>
<el-tree-select
:data="optionsData.dept"
clearable
node-key="id"
filterable
:props="{ value: 'id', label: 'name'}"
placeholder="请选择部门"
:default-expanded-keys="getExpandedKeys()"
/>
</template>
<script setup>
import { deptLists } from '@/api/org/department'
import { useDictOptions } from "@/hooks/useDictOptions";
const { optionsData } = useDictOptions({
dept: {
api: deptLists
}
});
const getExpandedKeys = () => {
if (optionsData.dept.length && optionsData.dept[0].children && optionsData.dept[0].children.length > 0) {
return [optionsData.dept[0].id]
}
return [];
}
</script>
<style lang="scss" scoped>
</style>

24
src/components/FileList.vue

@ -276,9 +276,22 @@ function mousemove(event) {
if (!moveFlag) { if (!moveFlag) {
return; return;
} }
if (rotate.value % 360 === 0) {
translateX.value += event.clientX - initialX; translateX.value += event.clientX - initialX;
console.log("x", translateX.value);
translateY.value += event.clientY - initialY; translateY.value += event.clientY - initialY;
}
if (rotate.value === 90) {
translateY.value -= event.clientX - initialX;
translateX.value += event.clientY - initialY;
}
if (rotate.value === 180) {
translateX.value -= event.clientX - initialX;
translateY.value -= event.clientY - initialY;
}
if (rotate.value === 270) {
translateY.value += event.clientX - initialX;
translateX.value -= event.clientY - initialY;
}
initialX = event.clientX; initialX = event.clientX;
initialY = event.clientY; initialY = event.clientY;
} }
@ -288,13 +301,20 @@ function mouseup(event) {
} }
function rotateLeft() { function rotateLeft() {
if (rotate.value === 360) {
rotate.value = 0;
} else {
rotate.value += 90; rotate.value += 90;
console.log(rotate.value); }
} }
function rotateRight() { function rotateRight() {
if (rotate.value === 0) {
rotate.value = 270;
} else {
rotate.value -= 90; rotate.value -= 90;
} }
}
function getIconName(filetype) { function getIconName(filetype) {
if (!filetype) { if (!filetype) {

6
src/layout/components/Header.vue

@ -15,7 +15,7 @@
<ul class="userinfo-dropdown" v-if="dropdownShow"> <ul class="userinfo-dropdown" v-if="dropdownShow">
<li class="flex gap v-center" @click="supportShow = true"> <li class="flex gap v-center" @click="supportShow = true">
<icon name="el-icon-Star" :size="22" /> <icon name="el-icon-Star" :size="22" />
<span>服务支持</span> <span>技术支持</span>
</li> </li>
<li class="flex gap v-center" @click="handleEdit"> <li class="flex gap v-center" @click="handleEdit">
<icon name="el-icon-Lock" :size="22" /> <icon name="el-icon-Lock" :size="22" />
@ -35,8 +35,8 @@
<img src="/imgs/support1.png" alt="" /> <img src="/imgs/support1.png" alt="" />
</header> </header>
<div class="support-content" @click.stop> <div class="support-content" @click.stop>
<p>业务服务热线0731 - 82587735周巍警官 </p> <p>业务服务热线18163608038周巍警官 </p>
<p>技术服务热线13787166867李经理 18867391894 杨姣</p> <p>技术服务热线18867391894 杨姣 13787166867李镇洋</p>
</div> </div>
</div> </div>
</div> </div>

2
src/style/public.scss

@ -279,13 +279,13 @@ svg+span {
.col { .col {
display: flex; display: flex;
gap: 16px;
&.short { &.short {
width: 140px; width: 140px;
} }
label { label {
margin-right: 18px;
color: #888; color: #888;
} }

35
src/utils/util.ts

@ -371,3 +371,38 @@ export function getAppealDept(handlingDept) {
}); });
} }
} }
export function browse() {
var browser = {};
var userAgent = navigator.userAgent.toLowerCase();
var s;
(s = userAgent.match(/msie ([\d.]+)/)) ? browser.ie = s[1] : (s = userAgent.match(/firefox\/([\d.]+)/)) ? browser.firefox = s[1] : (s = userAgent.match(/chrome\/([\d.]+)/)) ? browser.chrome = s[1] : (s = userAgent.match(/opera.([\d.]+)/)) ? browser.opera = s[1] : (s = userAgent.match(/version\/([\d.]+).*safari/)) ? browser.safari = s[1] : 0;
var version = "";
if (browser.ie) {
version = 'IE ' + browser.ie;
}
else {
if (browser.firefox) {
version = 'firefox ' + browser.firefox;
}
else {
if (browser.chrome) {
version = 'chrome ' + browser.chrome;
}
else {
if (browser.opera) {
version = 'opera ' + browser.opera;
}
else {
if (browser.safari) {
version = 'safari ' + browser.safari;
}
else {
version = '未知浏览器';
}
}
}
}
}
return version;
}

8
src/views/Login.vue

@ -76,6 +76,9 @@
数字证书登录 数字证书登录
</el-button> </el-button>
</el-form> </el-form>
<div class="flex end mt-16">
<a target="_blank" href="/download/109.0.5414.120_chrome_installer_64.exe" style="color: var(--primary-color); text-decoration: none;">浏览器下载</a>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -85,6 +88,7 @@ import cache from "@/utils/cache";
import { ACCOUNT_KEY } from "@/enums/cacheEnums"; import { ACCOUNT_KEY } from "@/enums/cacheEnums";
import { PageEnum } from "@/enums/pageEnum"; import { PageEnum } from "@/enums/pageEnum";
import useUserStore from "@/stores/modules/user"; import useUserStore from "@/stores/modules/user";
import { browse } from "@/utils/util";
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
@ -154,6 +158,10 @@ function saveUsername(username) {
function getUsername() { function getUsername() {
return localStorage.getItem('username'); return localStorage.getItem('username');
} }
const browseVersion = browse();
console.log('浏览器版本:', browseVersion)
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.wrapper { .wrapper {

32
src/views/datascreen/assets/css/index.css

@ -238,7 +238,7 @@ a:active {
.pmbar span{ background: linear-gradient(to right,#14b6ff,#9cefff); display: inline-block; .pmbar span{ background: linear-gradient(to right,#14b6ff,#9cefff); display: inline-block;
vertical-align: middle; height: 10px; } vertical-align: middle; height: 10px; }
.pmbar i{ line-height: 20px; font-style: normal; padding-left: 2px; font-family: PingFang-SC-Regular; .pmbar i{ line-height: 20px; font-style: normal; padding-left: 2px;
font-size: 12px; font-size: 12px;
color: #FFFFFF; color: #FFFFFF;
text-align: right; text-align: right;
@ -432,7 +432,6 @@ a:active {
font-weight: 400; font-weight: 400;
} }
.ratesum i{ .ratesum i{
font-family: PingFang-SC-Medium;
font-size: 10px; font-size: 10px;
color: #09C700; color: #09C700;
text-align: right; text-align: right;
@ -444,28 +443,6 @@ a:active {
font-size: 10px; font-size: 10px;
margin-left: 10px; margin-left: 10px;
font-weight: 500; font-weight: 500;
font-family: PingFang-SC-Medium;
}
ul.h100 li:nth-of-type(-n+3) .ratebar span {
background-image: linear-gradient(270deg, #63E700 0%, #19674C 100%);
}
ul.h100 li:nth-of-type(n+4):nth-of-type(-n+6) .ratebar span {
background-image: linear-gradient(270deg, #FFB90E 0%, #71501D 99%);
}
ul.h100 li:nth-of-type(n+6) .ratebar span {
background-image: linear-gradient(270deg, #FB002D 0%, #822232 97%);
}
ul.h100 li:nth-of-type(-n+4) .pmbar span {
background-image: linear-gradient(270deg, #FB002D 0%, #822232 97%);
}
ul.h100 li:nth-of-type(n+4):nth-of-type(-n+6) .pmbar span {
background-image: linear-gradient(270deg, #FFB90E 0%, #71501D 99%);
}
ul.h100 li:nth-of-type(n+6) .pmbar span {
background-image: linear-gradient(270deg, #63E700 0%, #19674C 100%);
} }
.trendOptions{ .trendOptions{
@ -613,3 +590,10 @@ ul.h100 li:nth-of-type(n+6) .pmbar span {
background: linear-gradient(180deg, #010457 0%, #031577 100%); background: linear-gradient(180deg, #010457 0%, #031577 100%);
} }
} }
.el-popover.custom-popover-style {
background-color: var(--primary-color);
border-color: var(--primary-color);
color: #fff;
--el-popover-title-text-color: #fff;
}

1312
src/views/datascreen/countyData.vue

File diff suppressed because it is too large Load Diff

1544
src/views/datascreen/index.vue

File diff suppressed because it is too large Load Diff

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

@ -3,7 +3,7 @@
<h1>今日统计</h1> <h1>今日统计</h1>
</div> </div>
<div class="flex wrap box"> <div class="flex wrap box">
<section class="flex column v-center item pointer" @click="goMailQuery"> <section class="flex column v-center item pointer" @click="goMailQuery('mailToday')">
<div class="number">{{ daily.mailToday }}</div> <div class="number">{{ daily.mailToday }}</div>
<span>今日来信</span> <span>今日来信</span>
</section> </section>
@ -11,15 +11,15 @@
<div class="number">{{ daily.completedToday }}</div> <div class="number">{{ daily.completedToday }}</div>
<span>今日办结</span> <span>今日办结</span>
</section> </section>
<section class="flex column v-center item pointer"> <section class="flex column v-center item pointer" @click="goMailQuery('mailTotal')">
<div class="number">{{ daily.mailTotal }}</div> <div class="number">{{ daily.mailTotal }}</div>
<span>累计来信</span> <span>累计来信</span>
</section> </section>
<section class="flex column v-center item pointer"> <section class="flex column v-center item pointer" @click="goMailQuery('completedTotal')">
<div class="number">{{ daily.completedTotal }}</div> <div class="number">{{ daily.completedTotal }}</div>
<span>累计办结</span> <span>累计办结</span>
</section> </section>
<section class="flex column v-center item pointer" @click="goThanks"> <section class="flex column v-center item pointer" @click="goMailQuery('thankTotal')">
<div class="number" style="color: var(--primary-color)"> <div class="number" style="color: var(--primary-color)">
{{ daily.thankTotal }} {{ daily.thankTotal }}
</div> </div>
@ -31,6 +31,7 @@
import { getMailDaily } from "@/api/home"; import { getMailDaily } from "@/api/home";
import emitter from "@/utils/bus"; import emitter from "@/utils/bus";
import { useRouterParamsStore } from '@/stores/modules/routerParams' import { useRouterParamsStore } from '@/stores/modules/routerParams'
import moment from 'moment'
const router = useRouter(); const router = useRouter();
const daily = ref({}); const daily = ref({});
@ -47,13 +48,31 @@ emitter.on('notice',()=>{
getData() getData()
}) })
function goMailQuery() { function goMailQuery(key) {
router.push("/work/query"); if (key === 'mailToday') {
routerParams.setParams({
mailTime: [moment().format('YYYY-MM-DD') + ' 00:00:00', moment().format('YYYY-MM-DD') + ' 23:59:59']
})
} }
const goThanks = () => { if (key === 'completedToday') {
routerParams.setParams({
mailTime: [moment().format('YYYY-MM-DD') + ' 00:00:00', moment().format('YYYY-MM-DD') + ' 23:59:59']
})
}
if (key === 'mailTotal') {
}
if (key === 'completedTotal') {
routerParams.setParams({
mailState: 'completion'
})
}
if (key === 'thankTotal') {
routerParams.setMailCategory(49) routerParams.setMailCategory(49)
}
router.push("/work/query"); router.push("/work/query");
}; }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.box { .box {

25
src/views/home/components/DataStatistics.vue

@ -12,7 +12,13 @@
> >
<label>{{ item.name }}</label> <label>{{ item.name }}</label>
<div class="bar-box"> <div class="bar-box">
<div :style="{ width: item.rate, background: getColor(item.ratenumber) }" class="bar"> <div
:style="{
width: item.rate,
background: getColor(item.ratenumber),
}"
class="bar"
>
<span>{{ item.rate }}</span> <span>{{ item.rate }}</span>
</div> </div>
</div> </div>
@ -29,7 +35,13 @@
> >
<label>{{ item.name }}</label> <label>{{ item.name }}</label>
<div class="bar-box"> <div class="bar-box">
<div :style="{ width: item.rate, background: getColor(item.ratenumber) }" class="bar"> <div
:style="{
width: item.rate,
background: getColor(item.ratenumber),
}"
class="bar"
>
<span>{{ item.rate }}</span> <span>{{ item.rate }}</span>
</div> </div>
</div> </div>
@ -49,7 +61,7 @@
<div <div
:style="{ :style="{
width: item.rate, width: item.rate,
background: getColor(item.ratenumber) background: getColor(item.ratenumber),
}" }"
class="bar" class="bar"
> >
@ -59,6 +71,7 @@
</div> </div>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<h1 style="margin-top: 20px">近15日来信趋势</h1> <h1 style="margin-top: 20px">近15日来信趋势</h1>
<div> <div>
@ -105,13 +118,9 @@ const options = ref({
lineStyle: { lineStyle: {
color: "#0D4AFF", color: "#0D4AFF",
}, },
itemStyle: {
label: { label: {
show: true, show: true,
textStyle: { color: "#162582"
color: "#162582",
},
},
}, },
areaStyle: { areaStyle: {
color: "#C8E4FB", color: "#C8E4FB",

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

@ -2,10 +2,9 @@
<el-tabs v-model="activeName"> <el-tabs v-model="activeName">
<el-tab-pane label="我的待办" name="todo"> <el-tab-pane label="我的待办" name="todo">
<TabsTable :data="todos" @update="todoList" /> <TabsTable :data="todos" @update="todoList" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="即将到期" name="due"> <el-tab-pane label="即将到期" name="due">
<el-table :data="superviseTodos" style="width: 100%" stripe> <el-table style="width: 100%" stripe>
<el-table-column <el-table-column
prop="mailTime" prop="mailTime"
label="来信时间" label="来信时间"
@ -149,7 +148,7 @@
</el-table> </el-table>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="我的收藏" name="fav"> <el-tab-pane label="我的收藏" name="fav">
<el-table :data="highTodos" style="width: 100%" stripe> <el-table :data="favs" style="width: 100%" stripe>
<el-table-column <el-table-column
prop="mailTime" prop="mailTime"
label="来信时间" label="来信时间"
@ -167,40 +166,44 @@
label="联系电话" label="联系电话"
width="120" width="120"
/> />
<el-table-column
prop="contactIdCard"
label="身份证号"
width="120"
/>
<el-table-column <el-table-column
prop="content" prop="content"
label="信件内容" label="信件内容"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column prop="mailState" label="信件状态"> <el-table-column prop="mailState" label="信件状态" align="center">
<template #default="{ row }"> <template #default="{ row }">
<span>{{ <span>{{
getDictLable(dictData.mail_state, row.mailState) getDictLable(dictData.mail_state, row.mailState)
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="流程节点"> <el-table-column prop="threeDeptName" label="办理单位" width="120" align="center" />
<template #default="{ row }"> </template> <el-table-column label="操作" fixed="right" align="center">
</el-table-column>
<el-table-column label="操作">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="handleMailDetail(row)">详情</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
<MailDialog
v-model:show="showModel"
:mail-id="activeMailId"
:work-id="activeWorkId"
:work-type="activeWorkType"
:disabled="disabled"
/>
</template> </template>
<script setup> <script setup>
import TabsTable from "./TabsTable.vue"; import TabsTable from "./TabsTable.vue";
import MailDialog from "@/views/work/components/MailDialog.vue";
import { useDictData } from "@/hooks/useDictOptions"; import { useDictData } from "@/hooks/useDictOptions";
import { getTodos } from "@/api/work"; import { getTodos } from "@/api/work";
import { listFav } from "@/api/work/fav";
import { getDictLable, getFlowTagType } from "@/utils/util"; import { getDictLable, getFlowTagType } from "@/utils/util";
const { dictData } = useDictData(["mail_state"]); const { dictData } = useDictData(["mail_state"]);
@ -222,11 +225,15 @@ watch(activeName, (val) => {
if (val === "high") { if (val === "high") {
highTodoList(); highTodoList();
} }
if (val === "fav") {
getFavList();
}
}); });
const todos = ref([]); const todos = ref([]);
const superviseTodos = ref([]); const superviseTodos = ref([]);
const highTodos = ref([]); const highTodos = ref([]);
const favs = ref([]);
const showModel = ref(false); const showModel = ref(false);
todoList(); todoList();
@ -243,7 +250,7 @@ function superviseTodoList() {
getTodos({ getTodos({
size: 8, size: 8,
current: 1, current: 1,
mailLevel: "superintend", mailLevel: "督办信件",
}).then((data) => { }).then((data) => {
superviseTodos.value = data.records; superviseTodos.value = data.records;
}); });
@ -253,21 +260,37 @@ function highTodoList() {
getTodos({ getTodos({
size:8, size:8,
current: 1, current: 1,
mailLevel: "high_sensitivity", mailLevel: "高敏信件",
}).then((data) => { }).then((data) => {
highTodos.value = data.records; highTodos.value = data.records;
}); });
} }
function getFavList() {
listFav().then(data => {
favs.value = data.records;
})
}
const activeMailId = ref(""); const activeMailId = ref("");
const activeWorkId = ref(0); const activeWorkId = ref();
const activeWorkType = ref(""); const activeWorkType = ref("");
const disabled = ref(false)
function handleMail(row) { function handleMail(row) {
showModel.value = true; showModel.value = true;
activeMailId.value = row.mailId; activeMailId.value = row.mailId;
activeWorkId.value = row.id; activeWorkId.value = row.id;
activeWorkType.value = row.workType; activeWorkType.value = row.workType;
disabled.value = false
}
function handleMailDetail(row) {
showModel.value = true;
activeMailId.value = row.mailId;
activeWorkId.value = null;
activeWorkType.value = null;
disabled.value = true
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

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

@ -65,7 +65,7 @@ function goMailQuery(item) {
queryCon.value.signDeptId = userStore.userInfo.dataDeptId queryCon.value.signDeptId = userStore.userInfo.dataDeptId
break; break;
case 'approval': case 'approval':
queryCon.value.flowKey = 'three_leader_approval,second_deputy_approval,second_leader_approval,second_reporting,first_approval,countersign' queryCon.value.flowKey = 'three_leader_approval,second_approval,second_deputy_approval,second_leader_approval,second_reporting,first_approval,countersign'
queryCon.value.signDeptId = userStore.userInfo.dataDeptId queryCon.value.signDeptId = userStore.userInfo.dataDeptId
break; break;
default: default:

32
src/views/permission/admin/index.vue

@ -52,22 +52,7 @@
</el-form-item> </el-form-item>
<el-form-item label="部门"> <el-form-item label="部门">
<el-tree-select <DeptTreeSelect v-model="formData.deptId" check-strictly style="width: 200px" />
class="flex-1"
v-model="formData.deptId"
:data="optionsData.dept"
clearable
node-key="id"
filterable
check-strictly
:props="{
value: 'id',
label: 'name'
}"
placeholder="请选择部门"
style="width: 200px"
:default-expanded-keys="getExpandedKeys()"
/>
</el-form-item> </el-form-item>
<div> <div>
<el-button type="primary" @click="resetPage" <el-button type="primary" @click="resetPage"
@ -191,7 +176,6 @@ import { usePaging } from "@/hooks/usePaging";
import feedback from "@/utils/feedback"; import feedback from "@/utils/feedback";
import EditPopup from "./edit.vue"; import EditPopup from "./edit.vue";
import { postAll } from "@/api/org/post"; import { postAll } from "@/api/org/post";
import { deptLists } from "@/api/org/department";
import { timeFormat } from "@/utils/util"; import { timeFormat } from "@/utils/util";
const editRef = shallowRef<InstanceType<typeof EditPopup>>(); const editRef = shallowRef<InstanceType<typeof EditPopup>>();
@ -245,26 +229,14 @@ const handleDelete = async (id: number) => {
const { optionsData } = useDictOptions<{ const { optionsData } = useDictOptions<{
role: any[]; role: any[];
post: any[]; post: any[];
dept: any[];
}>({ }>({
role: { role: {
api: roleAll, api: roleAll,
}, },
post: { post: {
api: postAll, api: postAll,
},
dept: {
api: deptLists,
},
})
const getExpandedKeys = () => {
if (optionsData.dept.length && optionsData.dept[0].children && optionsData.dept[0].children.length > 0) {
return [optionsData.dept[0].id]
}
return [];
} }
})
onMounted(() => { onMounted(() => {
getLists(); getLists();
}); });

20
src/views/work/Dissatisfied.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="container"> <div class="container">
<header> <header>
<el-form :model="form" :label-width="120"> <el-form :label-width="120">
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="来信时间"> <el-form-item label="来信时间">
@ -56,14 +56,7 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="办理单位"> <el-form-item label="办理单位">
<el-tree-select class="flex-1" v-model="query.deptId" :data="optionsData.dept" clearable <DeptTreeSelect v-model="query.deptId" />
node-key="id" filterable :props="{
value: 'id',
label: 'name',
disabled(data: any) {
return !!data.isStop
}
}" check-strictly placeholder="请选择上级部门" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@ -175,8 +168,6 @@ import { getDissatisfied } from "@/api/work";
import { ref, reactive, watchEffect } from "vue"; import { ref, reactive, watchEffect } from "vue";
import { useDictData } from "@/hooks/useDictOptions"; import { useDictData } from "@/hooks/useDictOptions";
import { getDictLable, getFlowTagType, getAppealType, getAppealDept, getAppealName } from "@/utils/util"; import { getDictLable, getFlowTagType, getAppealType, getAppealDept, getAppealName } from "@/utils/util";
import { useDictOptions } from '@/hooks/useDictOptions'
import { deptLists } from '@/api/org/department'
const mailStore = useMailStore(); const mailStore = useMailStore();
mailStore.getMailCategorys(); mailStore.getMailCategorys();
@ -246,13 +237,6 @@ const handleMailTimeQuery = (val: any) => {
delete query.value.mailTimeEnd delete query.value.mailTimeEnd
} }
} }
const { optionsData } = useDictOptions<{
dept: any[]
}>({
dept: {
api: deptLists
}
})
const launchAppeal = (mailId: any) => { const launchAppeal = (mailId: any) => {
showAppeal.value = true; showAppeal.value = true;

19
src/views/work/Done.vue

@ -56,14 +56,7 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="办理单位"> <el-form-item label="办理单位">
<el-tree-select class="flex-1" v-model="query.deptId" :data="optionsData.dept" clearable <DeptTreeSelect v-model="query.deptId" />
node-key="id" filterable :props="{
value: 'id',
label: 'name',
disabled(data: any) {
return !!data.isStop
}
}" check-strictly placeholder="请选择上级部门" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@ -166,7 +159,6 @@ import { onMounted, onUnmounted } from 'vue'
import useMailStore from "@/stores/modules/mail"; import useMailStore from "@/stores/modules/mail";
import { getDictLable, formatTimeText, getFlowTagType } from "@/utils/util"; import { getDictLable, formatTimeText, getFlowTagType } from "@/utils/util";
import { ref, reactive, watchEffect } from "vue"; import { ref, reactive, watchEffect } from "vue";
import { deptLists } from '@/api/org/department'
import { getFlowNodes } from '@/api/org/flowNode' import { getFlowNodes } from '@/api/org/flowNode'
const mailStore = useMailStore(); const mailStore = useMailStore();
mailStore.getMailCategorys(); mailStore.getMailCategorys();
@ -186,12 +178,9 @@ const showModel = ref(false);
const activeMailId = ref(""); const activeMailId = ref("");
const activeWorkId = ref(0) const activeWorkId = ref(0)
const { optionsData } = useDictOptions<{ const { optionsData } = useDictOptions<{
dept: any[],
flowNodes: any[] flowNodes: any[]
}>({ }>({
dept: {
api: deptLists
},
flowNodes: { flowNodes: {
api: getFlowNodes api: getFlowNodes
} }
@ -242,10 +231,6 @@ function handleMailTimeQuery(val) {
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.success { .success {

7
src/views/work/Fav.vue

@ -91,13 +91,6 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="threeDeptName" label="办理单位" width="120" align="center" /> <el-table-column prop="threeDeptName" label="办理单位" width="120" align="center" />
<el-table-column label="流程节点" align="center">
<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="信件等级" width="100" align="center"> <el-table-column label="信件等级" width="100" align="center">
<template #default="{ row }"> <template #default="{ row }">
<mail-level :value="row.mailLevel" :list="dictData.mail_level" /> <mail-level :value="row.mailLevel" :list="dictData.mail_level" />

61
src/views/work/Query.vue

@ -7,12 +7,12 @@
<el-form-item label="来信时间"> <el-form-item label="来信时间">
<el-date-picker v-model="query.mailTime" value-format="YYYY-MM-DD HH:mm:ss" <el-date-picker v-model="query.mailTime" value-format="YYYY-MM-DD HH:mm:ss"
type="datetimerange" format="YYYY-MM-DD HH:mm:ss" range-separator="~" type="datetimerange" format="YYYY-MM-DD HH:mm:ss" range-separator="~"
start-placeholder="开始日期" end-placeholder="结束日期" @change="handleMailTimeQuery" /> start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="信件来源"> <el-form-item label="信件来源">
<el-select v-model="query.source" placeholder="" clearable filterable> <el-select v-model="query.source" placeholder="请选择信件来源" clearable filterable>
<el-option v-for="item in dictData.mail_source" :key="item.value" :label="item.name" <el-option v-for="item in dictData.mail_source" :key="item.value" :label="item.name"
:value="item.value" /> :value="item.value" />
</el-select> </el-select>
@ -32,7 +32,7 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="信件等级"> <el-form-item label="信件等级">
<el-select v-model="query.mailLevel" placeholder="" clearable> <el-select v-model="query.mailLevel" placeholder="请选择信件等级" clearable>
<el-option v-for="item in dictData.mail_level" :key="item.value" :label="item.name" <el-option v-for="item in dictData.mail_level" :key="item.value" :label="item.name"
:value="item.value" /> :value="item.value" />
</el-select> </el-select>
@ -42,13 +42,13 @@
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="信件分类"> <el-form-item label="信件分类">
<el-tree-select v-model="query.mailCategory" :data="mailStore.mailCategorys" check-strictly <el-tree-select v-model="query.mailCategory" :data="mailStore.mailCategorys" check-strictly placeholder="请选择信件分类"
clearable filterable /> clearable filterable />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="信件状态"> <el-form-item label="信件状态">
<el-select v-model="query.mailState" placeholder="" clearable> <el-select v-model="query.mailState" placeholder="请选择信件状态" clearable>
<el-option v-for="item in dictData.mail_state" :key="item.value" :label="item.name" <el-option v-for="item in dictData.mail_state" :key="item.value" :label="item.name"
:value="item.value" /> :value="item.value" />
</el-select> </el-select>
@ -56,19 +56,12 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="办理单位"> <el-form-item label="办理单位">
<el-tree-select class="flex-1" v-model="query.deptId" :data="optionsData.dept" clearable <DeptTreeSelect v-model="query.deptId" />
node-key="id" filterable :props="{
value: 'id',
label: 'name',
disabled(data: any) {
return !!data.isStop
}
}" check-strictly placeholder="请选择上级部门" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="流程阶段"> <el-form-item label="流程阶段">
<el-select v-model="query.flowKey" placeholder="" clearable multiple collapse-tags="true" <el-select v-model="query.flowKey" placeholder="请选择流程阶段" clearable multiple collapse-tags
filterable> filterable>
<el-option v-for="item in optionsData.flowNodes" :key="item.key" :label="item.fullName" <el-option v-for="item in optionsData.flowNodes" :key="item.key" :label="item.fullName"
:value="item.key" /> :value="item.key" />
@ -129,7 +122,7 @@
@selection-change="handleSelectionChange" :row-key="rowKey"> @selection-change="handleSelectionChange" :row-key="rowKey">
<el-table-column type="selection" width="30" :reserve-selection="true" /> <el-table-column type="selection" width="30" :reserve-selection="true" />
<el-table-column prop="mailTime" label="来信时间" align="center" width="160" /> <el-table-column prop="mailTime" label="来信时间" align="center" width="160" />
<el-table-column label="信件来源" align="center" width="90"> <el-table-column label="信件来源" align="center" width="100">
<template #default="{ row }"> <template #default="{ row }">
<span>{{ <span>{{
dictData.mail_source.filter( dictData.mail_source.filter(
@ -230,7 +223,6 @@ import { useDictOptions } from '@/hooks/useDictOptions'
import { deptLists } from '@/api/org/department' import { deptLists } from '@/api/org/department'
import { labelLists } from '@/api/org/label' import { labelLists } from '@/api/org/label'
import { getFlowNodes } from '@/api/org/flowNode' import { getFlowNodes } from '@/api/org/flowNode'
import { ref, reactive, watch, onMounted, onUnmounted, nextTick } from "vue";
import { ElMessage, ElTable } from "element-plus"; import { ElMessage, ElTable } from "element-plus";
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import axios from 'axios' import axios from 'axios'
@ -279,6 +271,7 @@ const updateCountdown = (second: number) => {
}; };
onMounted(() => { onMounted(() => {
timeClock = setInterval(updateCountdown, 1000) timeClock = setInterval(updateCountdown, 1000)
getList()
}) })
onUnmounted(() => { onUnmounted(() => {
clearInterval(timeClock); clearInterval(timeClock);
@ -313,13 +306,18 @@ watch(() => route.path, () => {
query.value.mailCategory = useRouterParams.params.mailCategory query.value.mailCategory = useRouterParams.params.mailCategory
else else
delete query.value.mailCategory delete query.value.mailCategory
console.log('mailTimeStart', useRouterParams.params.mailTimeStart)
if (useRouterParams.params.mailTimeStart) {
query.value.mailTimeStart = useRouterParams.params.mailTimeStart
}
if (useRouterParams.params.mailTimeEnd) {
query.value.mailTimeEnd = useRouterParams.params.mailTimeEnd
}
getList() getList()
useRouterParams.removeParams() useRouterParams.removeParams()
} }
}) })
const checkAll = ref(false); const checkAll = ref(false);
const isCheckAll = ref(false); const isCheckAll = ref(false);
const selectedCount = ref(0); const selectedCount = ref(0);
@ -393,7 +391,6 @@ const exportLedger = () => {
}); });
} }
const form = ref([]); const form = ref([]);
const showModel = ref(false); const showModel = ref(false);
const activeMailId = ref(""); const activeMailId = ref("");
@ -445,7 +442,12 @@ function getList() {
else else
delete query.value.mailCategory delete query.value.mailCategory
} }
if (useRouterParams.params.mailTime) {
query.value.mailTime = useRouterParams.params.mailTime
}
if (useRouterParams.params.mailState) {
query.value.mailState = useRouterParams.params.mailState
}
loading.value = true loading.value = true
let source = "" let source = ""
if (query.value.mailLabels) { if (query.value.mailLabels) {
@ -459,6 +461,13 @@ function getList() {
} }
query.value.mailLabels = strLabels query.value.mailLabels = strLabels
} }
if (query.value.mailTime) {
query.value.mailTimeStart = query.value.mailTime[0];
query.value.mailTimeEnd = query.value.mailTime[1];
} else {
delete query.value.mailTimeStart
delete query.value.mailTimeEnd
}
getMails(query.value).then((data: any) => { getMails(query.value).then((data: any) => {
console.log("data", data) console.log("data", data)
form.value = data.records; form.value = data.records;
@ -499,15 +508,6 @@ const checkMail = () => {
showCheck.value = true showCheck.value = true
console.log("checkMail", solveCheckBox.value) console.log("checkMail", solveCheckBox.value)
} }
const handleMailTimeQuery = (val: any) => {
if (val) {
query.value.mailTimeStart = val[0];
query.value.mailTimeEnd = val[1];
} else {
delete query.value.mailTimeStart
delete query.value.mailTimeEnd
}
}
const handleDelete = async (mailId: any) => { const handleDelete = async (mailId: any) => {
if(mailId == ""||mailId == null){ if(mailId == ""||mailId == null){
@ -531,13 +531,10 @@ const handleTodoByChange = (mailId: any) => {
activeMailId.value = mailId activeMailId.value = mailId
} }
const handleMailCategory = (row: any) => { const handleMailCategory = (row: any) => {
const allowChangeList = ['终止类', '无效类'] const allowChangeList = ['终止类', '无效类']
return allowChangeList.includes(row.mailCategory) return allowChangeList.includes(row.mailCategory)
} }
getList()
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

20
src/views/work/Todo.vue

@ -26,7 +26,7 @@
<el-option label="身份证" value="idCard" /> <el-option label="身份证" value="idCard" />
<el-option label="联系电话" value="phone" /> <el-option label="联系电话" value="phone" />
</el-select> </el-select>
<el-input v-model="query.contactFieldValue" placeholder="请输入" clearable /> <el-input v-model="query.contactFieldValue" placeholder="请输入关键字" clearable />
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -56,19 +56,12 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="办理单位"> <el-form-item label="办理单位">
<el-tree-select class="flex-1" v-model="query.deptId" :data="optionsData.dept" clearable <DeptTreeSelect v-model="query.deptId" />
node-key="id" filterable :props="{
value: 'id',
label: 'name',
disabled(data: any) {
return !!data.isStop
}
}" check-strictly placeholder="请选择上级部门" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="流程阶段"> <el-form-item label="流程阶段">
<el-select v-model="query.flowKey" placeholder="" clearable multiple :collapse-tags="true"> <el-select v-model="query.flowKey" placeholder="请选择流程阶段" clearable multiple :collapse-tags="true">
<el-option v-for="item in optionsData.flowNodes" :key="item.key" :label="item.fullName" <el-option v-for="item in optionsData.flowNodes" :key="item.key" :label="item.fullName"
:value="item.key" /> :value="item.key" />
</el-select> </el-select>
@ -175,6 +168,7 @@ const { dictData } = useDictData(["mail_source", "mail_level", "mail_state"]);
const query = ref({ const query = ref({
size: 10, size: 10,
current: 1, current: 1,
contactField: 'name'
}); });
const totalSize = reactive({ const totalSize = reactive({
total: 0, total: 0,
@ -232,7 +226,11 @@ function getList() {
function reset() { function reset() {
query.value = {}; query.value = {
size: 10,
current: 1,
contactField: 'name'
};
getList(); getList();
} }

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

@ -96,7 +96,6 @@ const handleSubmit = () => {
margin-left: 20px; margin-left: 20px;
height: 22px; height: 22px;
font-size: 16px; font-size: 16px;
font-family: PingFangSC, PingFang SC;
font-weight: 400; font-weight: 400;
color: #FFFFFF; color: #FFFFFF;
line-height: 22px; line-height: 22px;
@ -111,7 +110,6 @@ const handleSubmit = () => {
width: 80px; width: 80px;
height: 22px; height: 22px;
font-size: 20px; font-size: 20px;
font-family: PingFang-SC, PingFang-SC;
font-weight: bold; font-weight: bold;
color: #333333; color: #333333;
line-height: 22px; line-height: 22px;
@ -121,7 +119,6 @@ const handleSubmit = () => {
width: 100%; width: 100%;
height: 22px; height: 22px;
font-size: 20px; font-size: 20px;
font-family: PingFang-SC, PingFang-SC;
font-weight: bold; font-weight: bold;
color: #162582; color: #162582;
line-height: 22px; line-height: 22px;
@ -139,8 +136,6 @@ const handleSubmit = () => {
display: block; display: block;
background-color: #FAFBFF; background-color: #FAFBFF;
margin: 20px; margin: 20px;
font-family: PingFangSC, PingFang SC;
font-weight: 400; font-weight: 400;
font-size: 16px; font-size: 16px;
color: #333333; color: #333333;

37
src/views/work/components/ApplicationCompleted.vue

@ -8,7 +8,14 @@
:rules="rules" :rules="rules"
ref="formRef" ref="formRef"
> >
<el-form-item prop="completeMethod" v-if="mail.mailFirstCategory === '工作建议类' || mail.mailFirstCategory === '咨询求助类' || mail.returnOperate === 'revise'"> <el-form-item
prop="completeMethod"
v-if="
mail.mailFirstCategory === '工作建议类' ||
mail.mailFirstCategory === '咨询求助类' ||
mail.returnOperate === 'revise'
"
>
<el-radio-group v-model="form.completeMethod" style=""> <el-radio-group v-model="form.completeMethod" style="">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
@ -38,7 +45,12 @@
<div style="margin-bottom: 60px"> <div style="margin-bottom: 60px">
<template v-if="form.completeMethod === 'offline'"> <template v-if="form.completeMethod === 'offline'">
<p v-if="mail.mailFirstCategory === '工作建议类' || mail.mailFirstCategory === '咨询求助类'"> <p
v-if="
mail.mailFirstCategory === '工作建议类' ||
mail.mailFirstCategory === '咨询求助类'
"
>
针对咨询/建议类信件无需走三长审批流程经由 针对咨询/建议类信件无需走三长审批流程经由
</p> </p>
<p v-else-if="mail.returnOperate === 'revise'"> <p v-else-if="mail.returnOperate === 'revise'">
@ -53,12 +65,8 @@
<h3>三级机构专班 二级机构专班 市局专班</h3> <h3>三级机构专班 二级机构专班 市局专班</h3>
<p style="margin-bottom: 40px">逐级上报即可</p> <p style="margin-bottom: 40px">逐级上报即可</p>
<el-form-item label="呈报上级,选择对应的二级机构专班"> <el-form-item label="呈报上级,选择对应的二级机构专班">
<span>{{ mail.secondDeptName }}</span> <span style="font-weight: 700;">{{ mail.secondDeptName }}</span>
</el-form-item> </el-form-item>
<p style="margin-top: 20px"><el-icon :size="15" color="#FFDD55">
<Warning />
</el-icon>,访
</p>
</template> </template>
<template v-else> <template v-else>
<p> <p>
@ -76,11 +84,18 @@
style="width: 400px" style="width: 400px"
/> />
</el-form-item> </el-form-item>
<p style="margin-top: 20px"><el-icon :size="15" color="#FFDD55">
<Warning />
</el-icon>,访
</p>
</template> </template>
<p class="flex v-center">
<icon
name="el-icon-WarningFilled"
:size="18"
color="#FFA900"
class="mr-4"
/>
<span
>提示提交办结后,系统会向群众发送满意度回访短信</span
>
</p>
</div> </div>
</el-form> </el-form>
</div> </div>

10
src/views/work/components/ApplyExtension.vue

@ -16,13 +16,9 @@
ref="formRef" ref="formRef"
class="mb-40" class="mb-40"
> >
<el-form-item label="延期时长" prop="extensionDays"> <el-form-item label="延期时长(1~26天)" prop="extensionDays">
<el-select v-model="form.extensionDays" placeholder="请选择延期时长" style="width: 200px"> <el-input type="number" placeholder="请输入延期时长" v-model="form.extensionDays" style="width: 200px" min="1" max="26" />
<el-option label="1天" value="1"></el-option> <span class="ml-8"></span>
<el-option label="3天" value="3"></el-option>
<el-option label="10天" value="10"></el-option>
<el-option label="20天" value="20"></el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="延期理由" prop="extensionReason"> <el-form-item label="延期理由" prop="extensionReason">
<el-input <el-input

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

@ -99,7 +99,7 @@
</el-form-item> </el-form-item>
<el-divider /> <el-divider />
<h2>认定办结意见*</h2> <h2>认定办结意见<span style="color: red">*</span></h2>
<el-form-item <el-form-item
prop="completionComment" prop="completionComment"
class="mb-40 label-position-top" class="mb-40 label-position-top"

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

@ -112,7 +112,6 @@ const handleApprovedSubmit = () => {
margin-left: 20px; margin-left: 20px;
height: 22px; height: 22px;
font-size: 16px; font-size: 16px;
font-family: PingFangSC, PingFang SC;
font-weight: 400; font-weight: 400;
color: #FFFFFF; color: #FFFFFF;
line-height: 22px; line-height: 22px;
@ -127,7 +126,6 @@ const handleApprovedSubmit = () => {
width: 80px; width: 80px;
height: 22px; height: 22px;
font-size: 20px; font-size: 20px;
font-family: PingFang-SC, PingFang-SC;
font-weight: bold; font-weight: bold;
color: #333333; color: #333333;
line-height: 22px; line-height: 22px;
@ -137,7 +135,6 @@ const handleApprovedSubmit = () => {
width: 100%; width: 100%;
height: 22px; height: 22px;
font-size: 20px; font-size: 20px;
font-family: PingFang-SC, PingFang-SC;
font-weight: bold; font-weight: bold;
color: #162582; color: #162582;
line-height: 22px; line-height: 22px;

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

@ -102,7 +102,6 @@ const handleSubmit = async () => {
margin-left: 20px; margin-left: 20px;
height: 22px; height: 22px;
font-size: 16px; font-size: 16px;
font-family: PingFangSC, PingFang SC;
font-weight: 400; font-weight: 400;
color: #FFFFFF; color: #FFFFFF;
line-height: 22px; line-height: 22px;
@ -117,7 +116,6 @@ const handleSubmit = async () => {
width: 100%; width: 100%;
height: 22px; height: 22px;
font-size: 20px; font-size: 20px;
font-family: PingFang-SC, PingFang-SC;
font-weight: bold; font-weight: bold;
color: #333333; color: #333333;
line-height: 22px; line-height: 22px;

52
src/views/work/components/InitiateCountersign.vue

@ -1,5 +1,5 @@
<template> <template>
<el-dialog v-model="visible" width="55vw" title="发起部门会签"> <el-dialog width="55vw" title="发起部门会签">
<el-form <el-form
:model="form" :model="form"
:rules="rules" :rules="rules"
@ -34,11 +34,7 @@
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
:disabled=" :disabled="isDisabled(item.id)"
mail.secondDeptId === item.id ||
mail.threeDeptId === item.id ||
countersignDeptIds.indexOf(item.id) > -1
"
></el-option> ></el-option>
</el-select> </el-select>
<el-button <el-button
@ -65,7 +61,6 @@
<script setup> <script setup>
import { listCountersign } from "@/api/org/department"; import { listCountersign } from "@/api/org/department";
const visible = ref(false);
const form = reactive({}); const form = reactive({});
const rules = { const rules = {
countersignRequirement: [ countersignRequirement: [
@ -91,23 +86,17 @@ listCountersign().then((data) => {
const countersignDeptIds = ref([]); const countersignDeptIds = ref([]);
const props = defineProps({ const props = defineProps({
show: {
type: Boolean,
default: false,
},
data: { data: {
type: Object, type: Object,
default: {}, default: {},
}, }
mail: {
type: Object,
default: {},
},
}); });
const mail = inject('mail');
const selectLeaderVisible = ref(false); const selectLeaderVisible = ref(false);
watch( watch(
() => props.mail.id, () => mail.value.id,
(val) => { (val) => {
formRef.value?.resetFields(); formRef.value?.resetFields();
countersignDeptIds.value = []; countersignDeptIds.value = [];
@ -122,16 +111,7 @@ watch(
} }
); );
const emits = defineEmits(["update:show", "update:data", "submit"]); const emits = defineEmits(["update:data", "submit", "close"]);
watch(visible, (val) => {
emits("update:show", val);
});
watch(
() => props.show,
(val) => {
visible.value = val;
}
);
function handleChange() { function handleChange() {
const arr = countersignDeptIds.value.filter(item => item); const arr = countersignDeptIds.value.filter(item => item);
@ -154,10 +134,26 @@ function submit() {
const data = { ...props.data, ...form }; const data = { ...props.data, ...form };
emits("update:data", data); emits("update:data", data);
emits("submit", "countersign"); emits("submit", "countersign");
visible.value = false; emits("close");
} }
}); });
} }
// id
const deptIds = computed(() => {
const arr = [];
arr.push(mail.value.firstDistributeInfo?.mainDept?.id);
arr.push(mail.value.firstDistributeInfo?.secondDeptId1?.id);
arr.push(mail.value.firstDistributeInfo?.secondDeptId2?.id);
arr.push(mail.value.secondDistributeInfo?.mainDept?.id);
arr.push(mail.value.secondDistributeInfo?.secondDeptId1?.id);
arr.push(mail.value.secondDistributeInfo?.secondDeptId2?.id);
arr.push(...countersignDeptIds.value)
return arr;
});
function isDisabled(id) {
return deptIds.value.indexOf(id) > -1;
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
h2 { h2 {

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

@ -118,7 +118,6 @@ const handleSubmit = async () => {
margin-left: 20px; margin-left: 20px;
height: 22px; height: 22px;
font-size: 16px; font-size: 16px;
font-family: PingFangSC, PingFang SC;
font-weight: 400; font-weight: 400;
color: #FFFFFF; color: #FFFFFF;
line-height: 22px; line-height: 22px;
@ -133,7 +132,6 @@ const handleSubmit = async () => {
width: 80px; width: 80px;
height: 22px; height: 22px;
font-size: 20px; font-size: 20px;
font-family: PingFang-SC, PingFang-SC;
font-weight: bold; font-weight: bold;
color: #333333; color: #333333;
line-height: 22px; line-height: 22px;

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

@ -217,7 +217,7 @@
<template <template
v-if="webComponents.indexOf('MainContactInfo') > -1" v-if="webComponents.indexOf('MainContactInfo') > -1"
> >
<MainContactInfo :mail="mail" /> <MainContactInfo @refresh="getDetail(); emits('update')" />
</template> </template>
<template <template
@ -246,7 +246,7 @@
<span>{{ mail.firstDistributeInfo?.secondDept2?.name }}</span> <span>{{ mail.firstDistributeInfo?.secondDept2?.name }}</span>
</div> </div>
</div> </div>
<div class="card-info flex" v-if="mail.secondDistributeInfo?.mainDept?.name"> <div class="card-info flex mb-4" v-if="mail.secondDistributeInfo?.mainDept?.name">
<div class="col" style="width: 33%"> <div class="col" style="width: 33%">
<label>主责单位</label> <label>主责单位</label>
<span>{{ mail.secondDistributeInfo?.mainDept?.name }}</span> <span>{{ mail.secondDistributeInfo?.mainDept?.name }}</span>
@ -269,12 +269,7 @@
<DeptSelectForm <DeptSelectForm
ref="deptSelectFormRef" ref="deptSelectFormRef"
v-model:data="requestData" v-model:data="requestData"
:secondaryResponsibleFlag="
mail.secondaryResponsibleFlag
"
:flowKey="flowNode.key" :flowKey="flowNode.key"
:mail="mail"
:workType="workType"
/> />
</template> </template>
<ExtensionDetail <ExtensionDetail
@ -300,7 +295,7 @@
workType === 'co_handling') workType === 'co_handling')
" "
/> />
<ThreeHandlingDetail v-else :mail="mail" /> <ThreeHandlingDetail @refresh="getDetail" v-else />
</template> </template>
<template <template
v-if=" v-if="
@ -311,6 +306,7 @@
<MailApprovalDetail <MailApprovalDetail
:mail="mail" :mail="mail"
v-model:data="requestData" v-model:data="requestData"
@refresh="getDetail"
/> />
</template> </template>
@ -454,10 +450,10 @@
@submit="(key) => handleAction(key)" @submit="(key) => handleAction(key)"
/> />
<InitiateCountersign <InitiateCountersign
v-model:show="countersignShow" v-model="countersignShow"
v-model:data="requestData" v-model:data="requestData"
:mail="mail"
@submit="(key) => handleAction(key)" @submit="(key) => handleAction(key)"
@close="countersignShow = false"
/> />
<MailReturn <MailReturn
@ -586,6 +582,10 @@ const props = defineProps({
}); });
const emits = defineEmits(["update:show", "update"]); const emits = defineEmits(["update:show", "update"]);
provide('disabled', props.disabled);
provide('workType', props.workType);
provide('mail', mail);
const visible = ref(props.show); const visible = ref(props.show);
watch(visible, (val) => { watch(visible, (val) => {
emits("update:show", val); emits("update:show", val);
@ -786,7 +786,6 @@ async function handleAction(key) {
}) })
.catch(() => { .catch(() => {
loading.value = false; loading.value = false;
emits("update");
}); });
} }
@ -1025,7 +1024,7 @@ footer {
color: var(--primary-color); color: var(--primary-color);
} }
.content { .content {
font-size: 16px; font-size: 15px;
padding: 8px; padding: 8px;
color: #333; color: #333;
white-space: pre-wrap; white-space: pre-wrap;
@ -1047,5 +1046,8 @@ footer {
border: 1px solid rgba(195, 202, 245, 1); border: 1px solid rgba(195, 202, 245, 1);
padding: 12px 20px; padding: 12px 20px;
} }
span[danger="true"] {
color: var(--danger-color);
}
} }
</style> </style>

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

@ -116,7 +116,6 @@ const reSubmit = () => {
margin-left: 20px; margin-left: 20px;
height: 22px; height: 22px;
font-size: 16px; font-size: 16px;
font-family: PingFangSC, PingFang SC;
font-weight: 400; font-weight: 400;
color: #FFFFFF; color: #FFFFFF;
line-height: 22px; line-height: 22px;
@ -131,7 +130,6 @@ const reSubmit = () => {
width: 80px; width: 80px;
height: 22px; height: 22px;
font-size: 20px; font-size: 20px;
font-family: PingFang-SC, PingFang-SC;
font-weight: bold; font-weight: bold;
color: #333333; color: #333333;
line-height: 22px; line-height: 22px;
@ -141,7 +139,6 @@ const reSubmit = () => {
width: 100%; width: 100%;
height: 22px; height: 22px;
font-size: 20px; font-size: 20px;
font-family: PingFang-SC, PingFang-SC;
font-weight: bold; font-weight: bold;
color: #162582; color: #162582;
line-height: 22px; line-height: 22px;
@ -159,8 +156,6 @@ const reSubmit = () => {
display: block; display: block;
background-color: #FAFBFF; background-color: #FAFBFF;
margin: 20px; margin: 20px;
font-family: PingFangSC, PingFang SC;
font-weight: 400; font-weight: 400;
font-size: 16px; font-size: 16px;
color: #333333; color: #333333;

20
src/views/work/components/templates/CoHandlingDetail.vue

@ -1,15 +1,27 @@
<template> <template>
<h2>协办核查</h2> <h2>协办核查</h2>
<div class="flex"> <div v-for="item in mail.coHandlings" :key="item.id">
<div class="col mb-12">
<label>次责单位</label>
<span>{{ item.deptName }}</span>
</div>
<div class="col mb-12">
<label>核查情况</label>
<div class="content">{{ item.verifyDetails }}</div>
</div>
<div class="col"> <div class="col">
<label for="核查情况"></label> <label>附件</label>
<div class="content"></div> <FileList :files="JSON.parse(item.verifyAttachments)" />
</div> </div>
</div> </div>
</template> </template>
<script setup> <script setup>
const mail = inject("mail");
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
label {
width: 144px;
text-align: right;
}
</style> </style>

4
src/views/work/components/templates/Comments.vue

@ -23,7 +23,7 @@
/> />
<div class="icon" v-else></div> <div class="icon" v-else></div>
</div> </div>
<h1 class="text-center mb-20"> <h1 class="text-center mb-16">
<span v-if="item.returnFlag" style="color: #FF0606">退回整改</span> <span v-if="item.returnFlag" style="color: #FF0606">退回整改</span>
<span v-else>{{ item.approved ? "审批通过" : "待审批" }}</span> <span v-else>{{ item.approved ? "审批通过" : "待审批" }}</span>
</h1> </h1>
@ -32,7 +32,7 @@
</h2> </h2>
<div v-if="item.approved" :danger="item.returnFlag" style="padding: 8px"> <div v-if="item.approved" :danger="item.returnFlag" style="padding: 8px">
<h3>审批意见</h3> <h3>审批意见</h3>
<p>{{ item.comment }}</p> <p style="font-weight: 700;">{{ item.comment }}</p>
<h4 class="text-right">{{ item.createTime }}</h4> <h4 class="text-right">{{ item.createTime }}</h4>
</div> </div>
</div> </div>

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

@ -6,7 +6,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
:label=" :label="
secondaryResponsibleFlag ? '下发单位' : '主责单位' mail.secondaryResponsibleFlag ? '下发单位' : '主责单位'
" "
prop="mainDeptId" prop="mainDeptId"
> >
@ -64,7 +64,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<template v-if="!secondaryResponsibleFlag"> <template v-if="!mail.secondaryResponsibleFlag">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="次责单位1"> <el-form-item label="次责单位1">
@ -125,24 +125,14 @@ const props = defineProps({
flowKey: { flowKey: {
type: String, type: String,
default: "first_distribute", default: "first_distribute",
}, }
//
secondaryResponsibleFlag: {
type: Boolean,
default: false,
},
mail: {
type: Object,
default: {},
},
workType: {
type: String,
default: '',
},
}); });
const mail = inject('mail');
const workType = inject('workType');
const form = ref({ const form = ref({
mainDeptLevel: props.mail.mainDeptLevel, mainDeptLevel: mail.value.mainDeptLevel,
}); });
const formRef = ref(null); const formRef = ref(null);
const rules = ref({ const rules = ref({
@ -153,7 +143,7 @@ const rules = ref({
}, },
], ],
}); });
if (props.mail.flowKey === "second_distribute") { if (mail.value.flowKey === "second_distribute") {
rules.value = { rules.value = {
mainDeptId: [ mainDeptId: [
{ {

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

@ -1,4 +1,5 @@
<template> <template>
<div>
<el-collapse v-model="activeNames"> <el-collapse v-model="activeNames">
<el-collapse-item title="来信人基本情况" name="1"> <el-collapse-item title="来信人基本情况" name="1">
<div class="flex"> <div class="flex">
@ -6,11 +7,11 @@
<label>姓名</label> <label>姓名</label>
<span>{{ mail.contactName }}</span> <span>{{ mail.contactName }}</span>
</div> </div>
<div class="col"> <div class="col" v-if="mail.contactSex">
<label>性别</label> <label>性别</label>
<span>{{ mail.contactSex === "M" ? "男" : "女" }}</span> <span>{{ mail.contactSex === "M" ? "男" : "女" }}</span>
</div> </div>
<div class="col"> <div class="col" v-if="mail.contactIdCard">
<label>证件号码</label> <label>证件号码</label>
<span>{{ mail.contactIdCard }}</span> <span>{{ mail.contactIdCard }}</span>
</div> </div>
@ -23,23 +24,27 @@
<el-collapse-item title="来信反映主要问题" name="2"> <el-collapse-item title="来信反映主要问题" name="2">
<div class="content">{{ mail.content }}</div> <div class="content">{{ mail.content }}</div>
<div style="margin: 2px"> <div style="margin: 2px">
<FileList :files="mail.attachments" v-if="mail.attachments && mail.attachments.length" /> <FileList
:files="mail.attachments"
v-if="mail.attachments && mail.attachments.length"
/>
</div> </div>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
<ThreeHandlingDetail :mail="mail" /> <ThreeHandlingDetail @refresh="emit('refresh')"/>
<CoHandlingDetail v-if="mail.coHandlings.length"/>
</div>
</template> </template>
<script setup> <script setup>
import ThreeHandlingDetail from "./ThreeHandlingDetail.vue"; import ThreeHandlingDetail from "./ThreeHandlingDetail.vue";
import CoHandlingDetail from "./CoHandlingDetail.vue";
import { formatTimeText } from "@/utils/util"; import { formatTimeText } from "@/utils/util";
defineProps({ const mail = inject('mail');
mail: {
type: Object, const emit = defineEmits(["refresh"]);
default: () => ({}),
},
});
const activeNames = ref(["1", "2"]); const activeNames = ref(["1", "2"]);
</script> </script>
@ -55,6 +60,4 @@ const activeNames = ref(["1", "2"]);
text-align: right; text-align: right;
} }
} }
</style> </style>

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

@ -16,22 +16,63 @@
<div class="flex"> <div class="flex">
<div class="col short"> <div class="col short">
<label>姓名</label> <label>姓名</label>
<span>{{ mail.contactName }}</span> <el-input
v-model="form.contactName"
v-if="contactEditable"
size="small"
/>
<span v-else>{{ mail.contactName }}</span>
</div> </div>
<div class="col short" v-if="mail.contactSex"> <div class="col short">
<label>性别</label> <label>性别</label>
<span>{{ mail.contactSex === "M" ? "男" : "女" }}</span> <el-select v-model="form.contactSex" placeholder="请选择性别" v-if="contactEditable" size="small" style="width: 120px">
<el-option label="男" value="M"></el-option>
<el-option label="女" value="F"></el-option>
</el-select>
<span v-else>{{
mail.contactSex === "M"
? "男"
: mail.contactSex === "F"
? "女"
: "未知"
}}</span>
</div> </div>
<div class="col"> <div class="col">
<label>证件号码</label> <label>证件号码</label>
<span>{{ mail.contactIdCard }}</span> <el-input v-model="form.contactIdCard"
v-if="contactEditable"
size="small"
/>
<span v-else>{{ mail.contactIdCard }}</span>
</div> </div>
<div class="col"> <div class="col">
<label>联系电话</label> <label>联系电话</label>
<span>{{ mail.contactPhone }}</span> <el-input v-model="form.contactPhone"
v-if="contactEditable"
size="small"
/>
<span v-else>{{ mail.contactPhone }}</span>
</div>
</div> </div>
<div class="flex end mt-10" v-if="!disabled">
<div v-if="contactEditable">
<el-button size="small" @click="contactEditable = false"
>取消</el-button
>
<el-button size="small" type="primary" @click="sumbit"
>提交</el-button
>
</div> </div>
<h2>信件内容</h2> <el-button
type="primary"
size="small"
plain
@click="contactEditable = true"
v-else
>修改联系人信息</el-button
>
</div>
<h2 style="margin-top: 0;">信件内容</h2>
<div class="flex"> <div class="flex">
<div class="col" v-if="mail.caseNumber"> <div class="col" v-if="mail.caseNumber">
<label>案件编号</label> <label>案件编号</label>
@ -51,16 +92,32 @@
</template> </template>
<script setup> <script setup>
import { useDictData } from "@/hooks/useDictOptions"; import { useDictData } from "@/hooks/useDictOptions";
import { getDictLable } from "@/utils/util";
const { dictData } = useDictData(["mail_source"]); const { dictData } = useDictData(["mail_source"]);
const { VITE_API_URL } = process.env; import { updateContactInfo } from '@/api/mail'
import { getDictLable } from "@/utils/util";
import feedback from "@/utils/feedback";
defineProps({ const emit = defineEmits(['refresh'])
mail: { const mail = inject("mail");
type: Object, const disabled = inject("disabled");
default: () => ({}), const contactEditable = ref(false);
}, const form = reactive({
contactName: mail.value.contactName,
contactSex: mail.value.contactSex,
contactIdCard: mail.value.contactIdCard,
contactPhone: mail.value.contactPhone,
}); });
function sumbit() {
updateContactInfo({
mailId: mail.value.id,
...form
}).then(() => {
contactEditable.value = false
emit('refresh')
feedback.msgSuccess('更新成功')
})
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.card { .card {
@ -74,5 +131,9 @@ defineProps({
} }
.col { .col {
width: 25%; width: 25%;
line-height: 24px;
}
.el-input {
width: 200px;
} }
</style> </style>

25
src/views/work/components/templates/ThreeHandling.vue

@ -1,5 +1,5 @@
<template> <template>
<div class="flex between mb-20 card-info"> <div class="flex between mb-10 card-info">
<div class="flex gap-20"> <div class="flex gap-20">
<div <div
class="flex gap v-center" class="flex gap v-center"
@ -41,7 +41,7 @@
<police-select v-model:data="form.contactPolice" /> <police-select v-model:data="form.contactPolice" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12" v-if="form.contactPolice?.postTitle">
<el-form-item label="职位"> <el-form-item label="职位">
<span>{{ form.contactPolice?.postTitle }}</span> <span>{{ form.contactPolice?.postTitle }}</span>
</el-form-item> </el-form-item>
@ -60,7 +60,7 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12" v-if="form.contactFlag">
<el-form-item label="联系时间" prop="contactTime"> <el-form-item label="联系时间" prop="contactTime">
<el-date-picker <el-date-picker
type="datetime" type="datetime"
@ -73,18 +73,13 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12" v-if="form.contactDuration">
<el-form-item label="联系时长"> <el-form-item label="联系时长">
<span>{{ formatTimeText(form.contactDuration) }}</span> <span :danger="form.contactDuration > limitedTime">{{ formatTimeText(form.contactDuration) }}</span>
<span <span v-if="form.contactDuration > limitedTime"
v-if="form.contactDuration" danger="true"
:danger="form.contactDuration > limitedTime"
class="ml-4" class="ml-4"
>({{ >(已超时)</span
form.contactDuration > limitedTime
? "已超时"
: "未超时"
}})</span
> >
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -786,10 +781,6 @@ defineExpose({
} }
} }
span[danger="true"] {
color: var(--danger-color);
}
p { p {
margin: 0; margin: 0;
} }

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

@ -28,17 +28,22 @@
</div> </div>
</div> </div>
</el-collapse-item> </el-collapse-item>
<el-collapse-item title="领导接访情况" name="2" v-if="mail.interviewType"> <el-collapse-item title="联系群众/领导接访情况" name="2">
<div class="flex mb-12"> <div class="flex mb-12" v-if="mail.contactPoliceName">
<div class="col"> <div class="col" v-if="mail.mainDeptSignTime">
<label>主单位签收时长</label> <label>主单位签收时长</label>
<span>{{ formatTimeText(mail.mainDeptSignTime) }}</span> <span :dnager="mail.mainDeptSignTime > 600">{{ formatTimeText(mail.mainDeptSignTime) }}</span>
</div>
<div class="col">
<label>联系民警</label>
<span>{{ mail.contactPoliceName }}</span>
</div> </div>
<div class="col"> <div class="col">
<label>主单位联系群众时长</label> <label>主单位联系群众时长</label>
<span>{{ formatTimeText(mail.contactDuration) }}</span> <span :dnager="mail.contactDuration > 1800">{{ formatTimeText(mail.contactDuration) }}</span>
</div> </div>
</div> </div>
<template v-if="mail.interviewType">
<div class="flex mb-12"> <div class="flex mb-12">
<div class="col"> <div class="col">
<label>接访形式</label> <label>接访形式</label>
@ -56,8 +61,36 @@
<div class="flex mb-12"> <div class="flex mb-12">
<div class="col" style="width: 100%"> <div class="col" style="width: 100%">
<label>接访情况</label> <label>接访情况</label>
<span>{{ mail.interviewDetails }}</span> <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> </div>
<el-button
type="primary"
size="small"
plain
@click="interviewDetailsEditable = true"
v-else
>修改接访情况</el-button
>
</div> </div>
<div class="flex"> <div class="flex">
<div class="col" style="width: 100%"> <div class="col" style="width: 100%">
@ -67,8 +100,13 @@
</span> </span>
</div> </div>
</div> </div>
</template>
</el-collapse-item> </el-collapse-item>
<el-collapse-item title="核查办理情况" name="3" v-if="mail.verifyIsTrue !== null"> <el-collapse-item
title="核查办理情况"
name="3"
v-if="mail.verifyIsTrue !== null"
>
<div class="flex mb-12"> <div class="flex mb-12">
<div class="col"> <div class="col">
<label>是否属实</label> <label>是否属实</label>
@ -81,36 +119,77 @@
}}</span> }}</span>
</div> </div>
</div> </div>
<div class="flex mb-12" v-if="mail.verifyProblem && mail.verifyProblem.length"> <div
class="flex mb-12"
v-if="mail.verifyProblem && mail.verifyProblem.length"
>
<div class="col" style="width: 100%"> <div class="col" style="width: 100%">
<label>查证属实问题</label> <label>查证属实问题</label>
<span <span
v-for="(item, index) in mail.verifyProblem" v-for="(item, index) in mail.verifyProblem"
:key="index" class="mr-8" :key="index"
class="mr-8"
>{{ item }}</span >{{ item }}</span
> >
</div> </div>
</div> </div>
<div class="flex mb-12"> <div class="flex mb-12">
<div class="col"> <div class="col" style="width: 100%">
<label>核办结果</label> <label>核办结果</label>
<span>{{ mail.verifyFeedback }}</span> <el-input
type="textarea"
v-model="verifyDetails"
v-if="verifyDetailsEditable"
/>
<div class="content" v-else>{{ mail.verifyDetails }}</div>
</div>
</div>
<div class="flex end" v-if="!disabled">
<div v-if="verifyDetailsEditable">
<el-button
size="small"
@click="verifyDetailsEditable = false"
>取消</el-button
>
<el-button
type="primary"
size="small"
@click="sumbitVerifyDetails"
>提交</el-button
>
</div> </div>
<el-button
type="primary"
size="small"
plain
@click="verifyDetailsEditable = true"
v-else
>修改核办结果</el-button
>
</div> </div>
</el-collapse-item> </el-collapse-item>
<el-collapse-item title="整改问责情况" name="4" v-if="mail.verifyPunish && mail.verifyPunish.length"> <el-collapse-item
title="整改问责情况"
name="4"
v-if="mail.verifyPunish && mail.verifyPunish.length"
>
<div class="flex"> <div class="flex">
<div class="col"> <div class="col">
<label>责任追究</label> <label>责任追究</label>
<span <span
v-for="(item, index) in mail.verifyPunish" v-for="(item, index) in mail.verifyPunish"
:key="index" class="mr-8" :key="index"
class="mr-8"
>{{ item }}</span >{{ item }}</span
> >
</div> </div>
</div> </div>
</el-collapse-item> </el-collapse-item>
<el-collapse-item title="结果反馈情况" name="5" v-if="mail.verifyIsResolved !== null"> <el-collapse-item
title="结果反馈情况"
name="5"
v-if="mail.verifyIsResolved !== null"
>
<div class="flex mb-12"> <div class="flex mb-12">
<div class="col"> <div class="col">
<label>群众反应事项解决情况</label> <label>群众反应事项解决情况</label>
@ -136,7 +215,11 @@
</div> </div>
</div> </div>
</el-collapse-item> </el-collapse-item>
<el-collapse-item title="办结佐证材料" name="6" v-if="mail.verifyAttachments"> <el-collapse-item
title="办结佐证材料"
name="6"
v-if="mail.verifyAttachments"
>
<div style="padding: 3px"> <div style="padding: 3px">
<FileList :files="mail.verifyAttachments || []" /> <FileList :files="mail.verifyAttachments || []" />
</div> </div>
@ -144,15 +227,41 @@
</el-collapse> </el-collapse>
</template> </template>
<script setup> <script setup>
import { updateMailHandleDetail } from "@/api/mail";
import { formatTimeText } from "@/utils/util"; import { formatTimeText } from "@/utils/util";
import feedback from "@/utils/feedback";
const activeNames = ref(["1", "2", "3", "4", "5", "6"]); const activeNames = ref(["1", "2", "3", "4", "5", "6"]);
const props = defineProps({
mail: { const emit = defineEmits(["refresh"]);
type: Object, const disabled = inject("disabled");
default: {}, const mail = inject("mail");
const interviewDetails = ref(mail.value.interviewDetails);
const verifyDetails = ref(mail.value.verifyDetails);
const interviewDetailsEditable = ref(false);
const verifyDetailsEditable = ref(false);
function sumbitInterviewDetails() {
sumbitDetail();
interviewDetailsEditable.value = false;
}
function sumbitVerifyDetails() {
sumbitDetail();
verifyDetailsEditable.value = false;
} }
function sumbitDetail() {
updateMailHandleDetail({
mailId: mail.value.id,
interviewDetails: interviewDetails.value,
verifyDetails: verifyDetails.value,
}).then(() => {
feedback.msgSuccess("修改成功");
emit("refresh");
}); });
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.el-collapse-item { .el-collapse-item {
@ -165,5 +274,11 @@ const props = defineProps({
width: 144px; width: 144px;
text-align: right; text-align: right;
} }
.content {
font-size: 14px;
padding: 0;
max-width: calc(100% - 176px);
} }
}
</style> </style>
Loading…
Cancel
Save