21819 2 years ago
parent
commit
ebc76fe3a6
  1. 4
      src/api/org/department.ts
  2. 4
      src/api/perms/admin.ts
  3. 140
      src/components/FileList.vue
  4. 3
      src/components/PoliceSelect.vue
  5. 32
      src/layout/components/NoticeMessage.vue
  6. 8
      src/utils/socket.ts
  7. 12
      src/views/home/components/DataStatistics.vue
  8. 2
      src/views/work/Done.vue
  9. 2
      src/views/work/Todo.vue
  10. 15
      src/views/work/components/MailDialog.vue
  11. 2
      src/views/work/components/MailReturn.vue
  12. 34
      src/views/work/components/ReviewComments.vue
  13. 2
      src/views/work/components/templates/CoHandling.vue
  14. 35
      src/views/work/components/templates/CoHandlingPoliceEdit.vue
  15. 302
      src/views/work/components/templates/ThreeHandling.vue

4
src/api/org/department.ts

@ -5,6 +5,10 @@ export function deptLists(params?: any) {
return request.get({ url: '/system/dept/list', params })
}
export function deptAll() {
return request.get({ url: '/system/dept/all/tree' })
}
// 添加部门
export function deptAdd(params: any) {
return request.post({ url: '/system/dept/add', params })

4
src/api/perms/admin.ts

@ -58,6 +58,10 @@ export function listByCurrentEmpNo(query) {
return request.get({ url: '/system/admin/listByCurrentEmpNo', query})
}
export function listByCoHanding() {
return request.get({ url: '/system/admin/listByCoHanding'})
}
// 重置密码
export function resetPassword(params: any) {
return request.post({ url: '/system/resetPassword', params })

140
src/components/FileList.vue

@ -52,7 +52,10 @@
<span>{{ item.orgiinFilename }}</span>
</section>
</div>
<div class="file-content flex center v-center" @click="preview = false">
<div
class="file-content flex center v-center"
@click="preview = false"
>
<div
class="img-container flex center"
v-if="activeFile.type.indexOf('image') > -1"
@ -62,6 +65,18 @@
ref="imgRef"
@click.stop
/>
<button
class="rotate-left-btn pointer"
@click.stop="rotateLeft"
>
<icon name="el-icon-Back" :size="28" />
</button>
<button
class="rotate-right-btn pointer"
@click.stop="rotateRight"
>
<icon name="el-icon-Right" :size="28" />
</button>
</div>
<template v-else-if="activeFile.type.indexOf('audio') > -1">
<audio
@ -81,7 +96,9 @@
/>
<div v-else class="error flex column text-center">
<img src="/imgs/error.png" alt="" />
<span class="mb-20">文件预览解析错误如有需要请下载到本地预览</span>
<span class="mb-20"
>文件预览解析错误如有需要请下载到本地预览</span
>
</div>
</template>
<template
@ -93,27 +110,47 @@
<vue-office-excel
:src="`${VITE_API_URL}/api/file/stream/${activeFile.filepath}`"
style="height: 100vh; width: 60vw"
@error="fileRrror = true"
@error="fileRrror = true"
v-if="!fileRrror"
@click.stop
/>
<div v-else class="error flex column text-center">
<img src="/imgs/error.png" alt="" />
<span class="mb-20">文件预览解析错误如有需要请下载到本地预览</span>
<span class="mb-20"
>文件预览解析错误如有需要请下载到本地预览</span
>
</div>
</template>
<template v-else-if="activeFile.type === 'application/pdf'">
<iframe :src="`${VITE_API_URL}/api/file/stream/${activeFile.filepath}`" style="height: 100vh; width: 900px"></iframe>
<iframe
:src="`${VITE_API_URL}/api/file/stream/${activeFile.filepath}`"
style="height: 100vh; width: 900px"
></iframe>
</template>
<div class="file-number" @click.stop>
<span>{{ fileList.indexOf(activeFile) + 1 }} / {{ fileList.length }}</span>
<span
>{{ fileList.indexOf(activeFile) + 1 }} /
{{ fileList.length }}</span
>
</div>
<button class="left-btn pointer" @click.stop="prev()">
<icon name="el-icon-ArrowLeftBold" :size="28" />
</button>
<button class="right-btn pointer" @click.stop="next()">
<icon name="el-icon-ArrowRightBold" :size="28" />
</button>
</div>
<div class="close-btn"></div>
<button class="close-btn pointer" @click="preview = false">
<icon name="el-icon-Close" :size="28" />
</button>
<el-button class="download-btn" @click="download" type="primary" size="large">
<el-button
class="download-btn"
@click="download"
type="primary"
size="large"
>
<template #icon>
<icon name="el-icon-Download" :size="20" />
</template>
@ -157,25 +194,38 @@ const preview = ref(false);
const activeFile = ref({});
const fileRrror = ref(false);
const imgRef = ref();
let scale = 1;
let rotate = 0;
function prev() {
const index = fileList.value.indexOf(activeFile.value);
if (index === 0) {
filePreview(fileList.value[fileList.value.length - 1])
} else {
filePreview(fileList.value[index - 1])
}
}
function next() {
const index = fileList.value.indexOf(activeFile.value);
if (index === fileList.value.length - 1) {
filePreview(fileList.value[0])
} else {
filePreview(fileList.value[index + 1])
}
}
function filePreview(file) {
preview.value = true;
fileRrror.value = false;
activeFile.value = file;
nextTick(() => {
if (imgRef.value) {
scale = 1;
imgRef.value.addEventListener("wheel", function (event) {
if (event.deltaY > 0) {
scale += 0.1;
}
if (event.deltaY < 0 && scale > 0.1) {
scale -= 0.1;
}
imgRef.value.style.transform = `scale(${scale})`;
});
}
});
rotate = 0
imgRef.value.style.transform = `rotate(0deg)`;
}
function rotateLeft() {
imgRef.value.style.transform = `rotate(${(rotate += 90)}deg)`;
}
function rotateRight() {
imgRef.value.style.transform = `rotate(${(rotate -= 90)}deg)`;
}
function getIconName(filetype) {
@ -213,11 +263,13 @@ function download() {
}
function getDocFilepath() {
if (activeFile.value.type === 'application/msword' && activeFile.value.docxFilepath) {
return `${VITE_API_URL}/api/file/stream/${activeFile.value.docxFilepath}`
if (
activeFile.value.type === "application/msword" &&
activeFile.value.docxFilepath
) {
return `${VITE_API_URL}/api/file/stream/${activeFile.value.docxFilepath}`;
}
return `${VITE_API_URL}/api/file/stream/${activeFile.value.filepath}`
return `${VITE_API_URL}/api/file/stream/${activeFile.value.filepath}`;
}
</script>
<style lang="scss" scoped>
@ -321,7 +373,7 @@ function getDocFilepath() {
}
.close-btn {
position: absolute;
top: 8px;
top: 12px;
right: 8px;
background-color: transparent;
border: none;
@ -330,6 +382,40 @@ function getDocFilepath() {
color: red;
}
}
.rotate-left-btn {
position: absolute;
top: 12px;
right: 108px;
background-color: transparent;
border: none;
color: #fff;
}
.rotate-right-btn {
position: absolute;
top: 12px;
right: 68px;
background-color: transparent;
border: none;
color: #fff;
}
.left-btn {
position: absolute;
top: 50%;
left: 0;
transform: translateY(-50%);
background-color: transparent;
border: none;
color: #fff;
}
.right-btn {
position: absolute;
top: 50%;
right: 0;
transform: translateY(-50%);
background-color: transparent;
border: none;
color: #fff;
}
.download-btn {
position: absolute;
bottom: 16px;

3
src/components/PoliceSelect.vue

@ -12,8 +12,7 @@
:key="item.id"
:label="item.name"
:value="item.empNo"
/>
>{{ item.name + ' ' + item.empNo }}</el-option>
</el-select>
</template>
<script setup>

32
src/layout/components/NoticeMessage.vue

@ -12,6 +12,9 @@
</div>
</template>
<script setup>
import {
ElMessageBox
} from 'element-plus'
import NewMailMp3 from '/mp3/new-mail.mp3'
import { initSocket } from "@/utils/socket";
@ -28,28 +31,49 @@ emitter.on("notice", () => {
getNoticeTotal();
todoAudioRef.value.play();
});
emitter.on("workDone", () => {
getNewMailAudioFlag()
});
const total = ref(0);
const notice = ref({});
function getNoticeTotal() {
noticeTotal().then((data) => {
total.value = data.total;
if (data.notice) {
notice.value = data.notice;
} else {
notice.value = {}
}
});
getNewMailAudioFlag()
}
onMounted(() => {
getNoticeTotal();
})
getNoticeTotal();
const newMailAudioRef = ref()
const newMailAudio = ref(false);
watch(newMailAudio, (val) => {
nextTick(() => {
val ? newMailAudioRef.value.play() : newMailAudioRef.value.pause()
console.log(newMailAudioRef.value, val)
if (val && newMailAudioRef.value.paused) {
newMailAudioRef.value.play().then(() => {
}).catch(() => {
console.log("播放失败")
ElMessageBox.confirm('需要获取浏览器的声音播放权限!', '温馨提示', {
confirmButtonText: '确定',
showCancelButton: false,
type: 'warning',
showClose: false,
closeOnClickModal: false
}).then(() => {
newMailAudioRef.value.play()
})
})
} else {
newMailAudioRef.value.pause()
}
})
})

8
src/utils/socket.ts

@ -42,7 +42,13 @@ export const con = () => {
// 设置订阅
stompClient.subscribe(topic,
(res: any) => {
emitter.emit("notice");
console.log('notice', res)
if (res.body === 'todo') {
emitter.emit("notice");
}
if (res.body === 'done') {
emitter.emit("workDone");
}
},
header
);

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

@ -106,12 +106,10 @@ const options = ref({
color: "#0D4AFF",
},
itemStyle: {
normal: {
label: {
show: true,
textStyle: {
color: '#162582'
}
label: {
show: true,
textStyle: {
color: "#162582",
},
},
},
@ -138,7 +136,7 @@ mailTrend({
}
.bar-item {
--bar-height: 15px;
--lable-width: 74PX;
--lable-width: 74px;
line-height: var(--bar-height);
margin-bottom: 10px;
margin-right: 38px;

2
src/views/work/Done.vue

@ -68,7 +68,7 @@
</el-col>
<el-col :span="6">
<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"
:value="item.key" />
</el-select>

2
src/views/work/Todo.vue

@ -68,7 +68,7 @@
</el-col>
<el-col :span="6">
<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"
:value="item.key" />
</el-select>

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

@ -235,10 +235,11 @@
>
<ThreeHandling
v-model:data="requestData"
@update:data="(data) => requestData = data"
:mail="mail"
:limitedTime="flowNode.limitedTime"
ref="threeHandlingRef"
v-if="!disabled && workType === 'processing'"
v-if="!disabled && (workType === 'processing' || workType === 'co_handling')"
/>
<ThreeHandlingDetail
v-else
@ -300,7 +301,7 @@
<footer class="flex between">
<div></div>
<div v-if="!disabled && !completionBtnFlag">
<template v-if="workType === 'processing' || workType === 'co_organizers'">
<template v-if="workType === 'processing' || workType === 'co_handling'">
<template v-for="action in actions" :key="action.key">
<el-button
:type="action.btnType"
@ -605,6 +606,7 @@ const countersignFormRef = ref();
const coHandlingRef = ref();
async function handleAction(key) {
console.log('key', key)
if (!key) {
return;
}
@ -644,9 +646,14 @@ async function handleAction(key) {
if (deptSelectFormRef.value) {
await deptSelectFormRef.value.validate();
}
if (key !== "applyExtensionSubmit" && key !== "verify") {
if (key !== "applyExtensionSubmit") {
if (threeHandlingRef.value) {
await threeHandlingRef.value.validate();
if (key == 'save') {
await threeHandlingRef.value.getData();
} else {
await threeHandlingRef.value.validate();
}
}
}
}

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

@ -75,7 +75,7 @@ watch(() => props.mail.id, () => {
const emits = defineEmits(["update:data", "submit", "close"]);
const flowKeys = ['second_sign', 'second_distribute', 'three_sign']
const flowKeys = ['second_sign', 'second_distribute', 'three_sign', 'contact_writer', 'interview_writer']
function showReturnAttachments() {
return flowKeys.indexOf(props.mail.flowKey) > -1;
}

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

@ -43,38 +43,28 @@ const props = defineProps({
default: {},
},
});
watch(() => props.mail.id, () => {
const selectLeaderVisible = ref(false)
const leaderType = ref('all')
watch(() => props.mail.flowKey + props.mail.id, (val) => {
resetFormData()
formRef.value?.resetFields();
})
const resetFormData = () => {
form.leaderEmpNo = ''
form.approvalComment = ''
if (props.mail.completeMethod === 'online')
formRef.value?.resetFields();
if (props.mail.completeMethod === 'online' && (props.mail.flowKey === 'second_approval' || props.mail.flowKey === 'second_deputy_approval')) {
selectLeaderVisible.value = true
else
} else {
selectLeaderVisible.value = false
}
const selectLeaderVisible = ref(false)
const leaderType = ref('all')
watch(() => props.mail.flowKey, (val) => {
if (val === 'second_approval' || val === 'second_deputy_approval') {
if (props.mail.completeMethod === 'online') {
selectLeaderVisible.value = true
}
leaderType.value = val === 'second_deputy_approval' ? 'leader' : 'deputy'
}
if (val === 'second_approval') {
if (props.mail.flowKey === 'second_approval') {
leaderType.value = 'deputy'
}
if (val === 'second_deputy_approval') {
} else if (props.mail.flowKey === 'second_deputy_approval') {
leaderType.value = 'leader'
} else {
leaderType.value = 'all'
}
})
}
onMounted(() => {
if (props.data) {

2
src/views/work/components/templates/CoHandling.vue

@ -1,5 +1,5 @@
<template>
<h2>查核</h2>
<h2>协办核查</h2>
<el-form ref="formRef" :model="form" :rules="rules" :label-width="140">
<el-form-item label="核查情况" prop="verifyDetails">
<el-input

35
src/views/work/components/templates/CoHandlingPoliceEdit.vue

@ -10,8 +10,10 @@
v-for="(item, index) in polices"
:key="index"
>
<police-select v-model:data="polices[index]" />
<el-button type="primary" plain @click="remove(index)"
<el-select @change="(empNo) => handleChange(empNo, index) " v-model="polices[index].empNo">
<el-option v-for="item in allPolices" :key="item.empNo" :value="item.empNo" :label="item.name" :disabled="polices.some(p => p.empNo === item.empNo)">{{ item.name + ' ' + item.empNo }}</el-option>
</el-select>
<el-button type="danger" plain @click="remove(index)"
>删除</el-button
>
</div>
@ -24,6 +26,8 @@
</el-dialog>
</template>
<script setup>
import { listByCoHanding } from '@/api/perms/admin'
const props = defineProps({
show: {
type: Boolean,
@ -44,8 +48,20 @@ watch(
() => props.show,
(val) => {
visible.value = val;
if (val) {
getCoHandings()
polices.value = [...props.data];
}
}
);
const allPolices = ref([])
function getCoHandings() {
listByCoHanding().then((data) => {
allPolices.value = data
});
}
const polices = ref([]);
function add() {
@ -56,6 +72,10 @@ function remove(index) {
polices.value.splice(index, 1);
}
function handleChange(empNo, index) {
polices.value[index] = allPolices.value.find(item => item.empNo === empNo)
}
function submit() {
const data = polices.value
.filter((item) => item.empNo)
@ -63,16 +83,9 @@ function submit() {
return {
empNo: item.empNo,
name: item.name,
phone: item.phone,
mobile: item.mobile,
};
})
.reduce((prev, curr) => {
// prev id
if (!prev.find((item) => item.empNo === curr.empNo)) {
prev.push(curr);
}
return prev;
}, []);
});
emit("update:data", data);
visible.value = false;
}

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

@ -1,18 +1,33 @@
<template>
<div class="flex between mb-20 card">
<div class="flex gap-20">
<div class="flex gap v-center" v-for="item in data.coHandlingPolices" :key="item.empNo">
<div
class="flex gap v-center"
v-for="item in data.coHandlingPolices"
:key="item.empNo"
>
<icon name="local-icon-police" :size="20" />
<span>{{ item.name }}</span>
<span>{{ item.phone }}</span>
<span>{{ item.empNo }}</span>
<span>{{ item.mobile }}</span>
</div>
</div>
<el-button type="primary" size="small" @click="coHandlingPoliceShow = true">编辑协办民警</el-button>
<el-button
type="primary"
size="small"
@click="coHandlingPoliceShow = true"
>编辑协办民警</el-button
>
</div>
<header class="flex mb-20">
<template v-for="(item, index) in threeSteps" :key="item.index">
<div class="step flex center v-center" :active="activeStep === item.index" :completed="item.index < step"
:diabled="item.index > step" @click="handleChangeTab(item.index)">
<div
class="step flex center v-center"
:active="activeStep === item.index"
:completed="item.index < step"
:diabled="item.index > step"
@click="handleChangeTab(item.index)"
>
<span class="mr-8">{{ index + 1 }}</span>
<span>{{ item.name }}</span>
</div>
@ -36,15 +51,24 @@
<el-col :span="12">
<el-form-item label="是否取得联系" prop="contactFlag">
<el-radio-group v-model="form.contactFlag">
<el-radio :label="true" size="large">取得联系</el-radio>
<el-radio :label="false" 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-col>
<el-col :span="12">
<el-form-item label="联系时间" prop="contactTime">
<el-date-picker type="datetime" v-model="form.contactTime" value-format="YYYY-MM-DD HH:mm:ss"
@change="handleTimeChange" style="width: 100%" />
<el-date-picker
type="datetime"
v-model="form.contactTime"
value-format="YYYY-MM-DD HH:mm:ss"
@change="handleTimeChange"
style="width: 100%"
/>
</el-form-item>
</el-col>
</el-row>
@ -52,11 +76,16 @@
<el-col :span="12">
<el-form-item label="联系时长">
<span>{{ formatTimeText(form.contactDuration) }}</span>
<span v-if="form.contactDuration" :danger="form.contactDuration > limitedTime" class="ml-4">({{
form.contactDuration > limitedTime
? "已超时"
: "未超时"
}})</span>
<span
v-if="form.contactDuration"
:danger="form.contactDuration > limitedTime"
class="ml-4"
>({{
form.contactDuration > limitedTime
? "已超时"
: "未超时"
}})</span
>
</el-form-item>
</el-col>
</el-row>
@ -64,9 +93,16 @@
<template v-if="activeStep === 2">
<el-row>
<el-form-item label="接访形式" prop="interviewType">
<el-select v-model="form.interviewType" style="width: 450px">
<el-option v-for="item in dictData.interview_type" :key="item.value" :label="item.name"
:value="item.value" />
<el-select
v-model="form.interviewType"
style="width: 450px"
>
<el-option
v-for="item in dictData.interview_type"
:key="item.value"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-row>
@ -81,13 +117,26 @@
</el-col>
<el-col :span="12" prop="interviewPoliceEmpNo">
<el-form-item label="接访领导" prop="interviewPoliceEmpNo">
<LeaderSelect v-model="form.interviewPoliceEmpNo" @change="handleSelect" leader-type="all" />
<LeaderSelect
v-model="form.interviewPoliceEmpNo"
@change="handleSelect"
leader-type="all"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="接访情况" prop="interviewDetails" style="width: 100%">
<el-input type="textarea" v-model="form.interviewDetails" :rows="5" style="width: 100%" />
<el-form-item
label="接访情况"
prop="interviewDetails"
style="width: 100%"
>
<el-input
type="textarea"
v-model="form.interviewDetails"
:rows="5"
style="width: 100%"
/>
</el-form-item>
</el-row>
<el-row>
@ -108,73 +157,132 @@
</template>
<template v-if="activeStep === 3">
<el-row>
<el-form-item label="核办结果" prop="verifyDetails" style="width: 100%">
<el-input type="textarea" v-model="form.verifyDetails" :rows="5" style="width: 100%" />
<el-form-item
label="核办结果"
prop="verifyDetails"
style="width: 100%"
>
<el-input
type="textarea"
v-model="form.verifyDetails"
:rows="5"
style="width: 100%"
/>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="是否属实" prop="verifyIsTrue">
<el-radio-group v-model="form.verifyIsTrue">
<el-radio v-for="item in dictData.verify_is_true" :key="item.name" :label="item.value"
size="large">{{ item.name }}</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>
<el-divider />
<div v-if="form.verifyIsTrue === '属实' ||
form.verifyIsTrue === '基本属实'
">
<div
v-if="
form.verifyIsTrue === '属实' ||
form.verifyIsTrue === '基本属实'
"
>
<el-row>
<el-form-item label="被举报人">
<div>
<div class="flex between gap mb-10" v-for="(item, index) in reportedPolices" :key="index">
<el-tree-select v-model="item.deptId" :data="depts" clearable filterable node-key="id"
:props="{
value: 'id',
label: 'name',
}" check-strictly placeholder="请选择部门" @change="handleChangeDept" />
<el-select v-model="item.empNo" style="width: 280px" @change="(val) => handleChangePolice(val, index)
">
<el-option v-for="item in polices" :key="item.id" :value="item.empNo"
:label="item.name"></el-option></el-select>
<div
class="flex between gap mb-10"
v-for="(item, index) in reportedPolices"
:key="index"
>
<el-tree-select
v-model="item.deptId"
:data="depts"
clearable
filterable
node-key="id"
:props="{ value: 'id', label: 'name' }"
check-strictly
placeholder="请选择部门"
@change="handleChangeDept"
:default-expanded-keys="getExpandedKeys()"
/>
<el-select
v-model="item.empNo"
style="width: 280px"
@change="
(val) => handleChangePolice(val, index)
"
filterable
>
<el-option
v-for="item in polices"
:key="item.id"
:value="item.empNo"
:label="item.name"
>{{
item.name + " " + item.empNo
}}</el-option
></el-select
>
<div style="font-size: 12px; min-width: 200px">
<span v-if="item.empNo">
<span class="mr-4">警号</span>
<span class="mr-4">{{
item.empNo
}}</span>
item.empNo
}}</span>
</span>
<span v-if="item.gender">
<span class="mr-4">性别</span>
<span class="mr-4">{{
item.gender
}}</span>
item.gender
}}</span>
</span>
<span v-if="item.birthday">
<span class="mr-4">出生年月</span>
<span>{{ item.birthday }}</span>
</span>
</div>
<el-button type="danger" plain @click="reportedPolices.splice(index, 1)">删除</el-button>
<el-button
type="danger"
plain
@click="reportedPolices.splice(index, 1)"
>删除</el-button
>
</div>
</div>
</el-form-item>
</el-row>
<div class="text-center">
<el-button type="primary" plain @click="reportedPolices.push({})">添加被举报人</el-button>
<el-button
type="primary"
plain
@click="reportedPolices.push({})"
>添加被举报人</el-button
>
</div>
<el-divider />
<el-row>
<el-form-item label="查证属实问题" prop="verifyProblem">
<el-checkbox-group v-model="form.verifyProblem">
<el-checkbox v-for="item in dictData.verify_problem" :key="item.value" :label="item.name"
:value="item.value" />
<el-checkbox
v-for="item in dictData.verify_problem"
:key="item.value"
:label="item.name"
:value="item.value"
/>
</el-checkbox-group>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="是否需要问责" prop="verifyNeedAccountability">
<el-form-item
label="是否需要问责"
prop="verifyNeedAccountability"
>
<el-radio-group v-model="form.verifyNeedAccountability">
<el-radio :label="true" size="large"></el-radio>
<el-radio :label="false" size="large"></el-radio>
@ -184,14 +292,21 @@
<el-row v-if="form.verifyNeedAccountability">
<el-form-item label="责任追究">
<el-checkbox-group v-model="form.verifyPunish">
<el-checkbox v-for="item in dictData.verify_punish" :key="item.value" :label="item.name"
:value="item.value" />
<el-checkbox
v-for="item in dictData.verify_punish"
:key="item.value"
:label="item.name"
:value="item.value"
/>
</el-checkbox-group>
</el-form-item>
</el-row>
</div>
<el-row>
<el-form-item label="群众反应事项解决情况" prop="verifyIsResolved">
<el-form-item
label="群众反应事项解决情况"
prop="verifyIsResolved"
>
<el-radio-group v-model="form.verifyIsResolved">
<el-radio :label="true" size="large">已解决</el-radio>
<el-radio :label="false" size="large">未解决</el-radio>
@ -201,15 +316,25 @@
<el-row>
<el-form-item label="办理反馈情况" prop="verifyFeedback">
<el-radio-group v-model="form.verifyFeedback">
<el-radio v-for="item in dictData.satisfaction_status" :key="item.name" :label="item.value"
size="large">{{ item.name }}</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>
<el-row>
<el-col :span="12">
<el-form-item label="回访人姓名" prop="verifyFollowupPolice">
<police-select v-model:data="form.verifyFollowupPolice" />
<el-form-item
label="回访人姓名"
prop="verifyFollowupPolice"
>
<police-select
v-model:data="form.verifyFollowupPolice"
/>
</el-form-item>
</el-col>
<el-col :span="12">
@ -235,10 +360,18 @@
请上传核查办理报告处理反馈表及相关的法律文件比如受案回执立案决定书不予立案决定书等和佐证材料比如谈话笔录调解协议等
</div>
<div>
<a :href="`${VITE_API_URL}/api/file/download/template/《核查办理报告》.doc`" target="_blank"
class="link">核查办理报告 下载</a>
<a :href="`${VITE_API_URL}/api/file/download/template/《处理反馈表》.doc`" target="_blank"
class="link">处理反馈表 下载</a>
<a
:href="`${VITE_API_URL}/api/file/download/template/《核查办理报告》.doc`"
target="_blank"
class="link"
>核查办理报告 下载</a
>
<a
:href="`${VITE_API_URL}/api/file/download/template/《处理反馈表》.doc`"
target="_blank"
class="link"
>处理反馈表 下载</a
>
</div>
</el-form-item>
</el-col>
@ -246,12 +379,15 @@
</template>
</el-form>
<CoHandlingPoliceEdit v-model:show="coHandlingPoliceShow" v-model:data="data.coHandlingPolices" />
<CoHandlingPoliceEdit
v-model:show="coHandlingPoliceShow"
v-model:data="data.coHandlingPolices"
/>
</template>
<script setup>
import CoHandlingPoliceEdit from "./CoHandlingPoliceEdit.vue";
import { listByThree, deptLists } from "@/api/org/department";
import { listByThree, deptAll } from "@/api/org/department";
import { allLists } from "@/api/perms/admin";
import { timeDiffSeconds, formatTimeText } from "@/utils/util";
@ -425,20 +561,18 @@ watch(
() => props.mail.id,
() => {
formRef.value.resetFields();
initForm()
initForm();
//
resetStep()
resetStep();
}
);
const resetStep = () => {
if (props.mail.flowKey === "interview_writer") {
step.value = 2;
}
else if (props.mail.flowKey === "verify") {
} else if (props.mail.flowKey === "verify") {
step.value = 3;
} else
step.value = 1;
} else step.value = 1;
};
watch(
@ -450,7 +584,9 @@ watch(
watch(
() => props.mail.coHandlingPolices,
(val) => updateCoHandlingPolices
(val) => {
updateCoHandlingPolices()
}
);
if (props.mail.coHandlingPolices) {
@ -458,6 +594,7 @@ if (props.mail.coHandlingPolices) {
}
function updateCoHandlingPolices() {
console.log('updateCoHandlingPolices')
const data = { ...props.data };
data.coHandlingPolices = props.mail.coHandlingPolices;
emits("update:data", data);
@ -479,7 +616,7 @@ const activeStep = computed(() => step.value);
function handleChangeTab(index) {
if (props.mail.flowKey === "verify") {
activeStep.value = index;
step.value = index;
}
}
@ -497,7 +634,7 @@ function handleSelect(empNo, option) {
function getDepts(mail) {
if (mail.mainDeptLevel === 1) {
deptLists().then((data) => {
deptAll().then((data) => {
depts.value = data;
});
}
@ -514,6 +651,16 @@ function getDepts(mail) {
});
}
}
const getExpandedKeys = () => {
if (
depts.value.length &&
depts.value[0].children &&
depts.value[0].children.length > 0
) {
return [depts.value[0].id];
}
return [];
};
const polices = ref([]);
function handleChangeDept(deptId) {
@ -541,7 +688,7 @@ function initForm() {
contactTime: props.mail.contactTime,
contactDuration: props.mail.contactDuration,
// 访
interviewType: props.mail.verifyDetails,
interviewType: props.mail.interviewType,
interviewIsLeader: props.mail.interviewIsLeader,
interviewPoliceEmpNo: props.mail.interviewPoliceEmpNo,
interviewDetails: props.mail.interviewDetails,
@ -582,8 +729,23 @@ function validate() {
});
}
function getData() {
return new Promise((resolve, reject) => {
const verifyReportedPolices = reportedPolices.value.filter(
(item) => item.empNo
);
form.value.verifyReportedPolices = JSON.stringify(
verifyReportedPolices
);
const data = { ...props.data, ...form.value };
emits("update:data", data);
resolve(true);
});
}
defineExpose({
validate,
getData
});
</script>
<style lang="scss" scoped>

Loading…
Cancel
Save