|
|
|
|
@ -64,18 +64,23 @@
|
|
|
|
|
ref="leftContainerRef" |
|
|
|
|
> |
|
|
|
|
<div class="timer flex center"> |
|
|
|
|
<el-progress |
|
|
|
|
type="dashboard" |
|
|
|
|
:percentage="percentage" |
|
|
|
|
:stroke-width="16" |
|
|
|
|
:width="210" |
|
|
|
|
color="#2B45E5" |
|
|
|
|
class="timer" |
|
|
|
|
<div |
|
|
|
|
v-if="mail.flowRemainingTime > 0" |
|
|
|
|
><RemainingTime |
|
|
|
|
v-model:time="mail.flowRemainingTime" |
|
|
|
|
/> |
|
|
|
|
</el-progress> |
|
|
|
|
style="height: 210px" |
|
|
|
|
> |
|
|
|
|
<el-progress |
|
|
|
|
type="dashboard" |
|
|
|
|
:percentage="percentage" |
|
|
|
|
:stroke-width="16" |
|
|
|
|
:width="240" |
|
|
|
|
:color="colors" |
|
|
|
|
class="timer" |
|
|
|
|
> |
|
|
|
|
<RemainingTime |
|
|
|
|
v-model:time="mail.flowRemainingTime" |
|
|
|
|
/> |
|
|
|
|
</el-progress> |
|
|
|
|
</div> |
|
|
|
|
<div |
|
|
|
|
v-else |
|
|
|
|
class="error flex column center v-center" |
|
|
|
|
@ -106,12 +111,10 @@
|
|
|
|
|
style="padding-bottom: 20px" |
|
|
|
|
> |
|
|
|
|
<label>信件等级</label> |
|
|
|
|
<span>{{ |
|
|
|
|
getDictLable( |
|
|
|
|
dictData.mail_level, |
|
|
|
|
mail.mailLevel |
|
|
|
|
) |
|
|
|
|
}}</span> |
|
|
|
|
<mail-level |
|
|
|
|
:value="mail.mailLevel" |
|
|
|
|
:list="dictData.mail_level" |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="flow"> |
|
|
|
|
@ -170,6 +173,13 @@
|
|
|
|
|
</el-col> |
|
|
|
|
<el-col :span="19" style="height: 100%"> |
|
|
|
|
<el-scrollbar max-height="100%" class="main-container"> |
|
|
|
|
<template v-if="webComponents.indexOf('Comments') > -1"> |
|
|
|
|
<Comments :approvals="approvals" /> |
|
|
|
|
</template> |
|
|
|
|
<MailReturnDetail |
|
|
|
|
v-if="mailReturns.length" |
|
|
|
|
:mailReturns="mailReturns" |
|
|
|
|
/> |
|
|
|
|
<template |
|
|
|
|
v-if="webComponents.indexOf('MainContactInfo') > -1" |
|
|
|
|
> |
|
|
|
|
@ -240,15 +250,31 @@
|
|
|
|
|
webComponents.indexOf('MailApprovalDetail') > -1 |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
<MailApprovalDetail :mail="mail" /> |
|
|
|
|
<MailApprovalDetail |
|
|
|
|
:mail="mail" |
|
|
|
|
v-model:data="requestData" |
|
|
|
|
/> |
|
|
|
|
</template> |
|
|
|
|
<template v-if="webComponents.indexOf('Comments') > -1"> |
|
|
|
|
<Comments :approvals="approvals" /> |
|
|
|
|
|
|
|
|
|
<template |
|
|
|
|
v-if=" |
|
|
|
|
webComponents.indexOf('CountersignForm') > -1 && |
|
|
|
|
workType === 'dept_countersign' |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
<CountersignForm |
|
|
|
|
v-model:data="requestData" |
|
|
|
|
:mail="mail" |
|
|
|
|
ref="countersignFormRef" |
|
|
|
|
/> |
|
|
|
|
</template> |
|
|
|
|
<template |
|
|
|
|
v-if="webComponents.indexOf('CountersignForm') > -1" |
|
|
|
|
v-if=" |
|
|
|
|
mail.countersigns?.length && |
|
|
|
|
workType !== 'dept_countersign' |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
<CountersignForm /> |
|
|
|
|
<Countersign :mail="mail" /> |
|
|
|
|
</template> |
|
|
|
|
</el-scrollbar> |
|
|
|
|
</el-col> |
|
|
|
|
@ -257,15 +283,29 @@
|
|
|
|
|
<footer class="flex between"> |
|
|
|
|
<div></div> |
|
|
|
|
<div v-if="!disabled && !completionBtnFlag"> |
|
|
|
|
<el-button |
|
|
|
|
v-for="action in actions" |
|
|
|
|
:key="action.key" |
|
|
|
|
:type="action.btnType" |
|
|
|
|
:plain="action.btnPlain" |
|
|
|
|
size="large" |
|
|
|
|
@click="handleAction(action.key)" |
|
|
|
|
>{{ action.btnLabel }}</el-button |
|
|
|
|
> |
|
|
|
|
<template v-for="action in actions" :key="action.key"> |
|
|
|
|
<el-button |
|
|
|
|
:type="action.btnType" |
|
|
|
|
:plain="action.btnPlain" |
|
|
|
|
size="large" |
|
|
|
|
@click="handleAction(action.key)" |
|
|
|
|
v-if=" |
|
|
|
|
action.key !== 'submitCountersign' || |
|
|
|
|
workType === 'dept_countersign' |
|
|
|
|
" |
|
|
|
|
>{{ action.btnLabel }}</el-button |
|
|
|
|
> |
|
|
|
|
<el-button |
|
|
|
|
v-else |
|
|
|
|
size="large" |
|
|
|
|
:disabled=" |
|
|
|
|
mail.countersignCompleted < mail.countersignTotal |
|
|
|
|
" |
|
|
|
|
>会签中{{ |
|
|
|
|
`(${mail.countersignCompleted} / ${mail.countersignTotal})` |
|
|
|
|
}}</el-button |
|
|
|
|
> |
|
|
|
|
</template> |
|
|
|
|
</div> |
|
|
|
|
<el-button type="primary" size="large" v-if="completionBtnFlag" |
|
|
|
|
>认定办结</el-button |
|
|
|
|
@ -299,6 +339,12 @@
|
|
|
|
|
:mail="mail" |
|
|
|
|
@submit="(key) => handleAction(key)" |
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
<MailReturen |
|
|
|
|
v-model:show="returnShow" |
|
|
|
|
v-model:data="requestData" |
|
|
|
|
@submit="(key) => handleAction(key)" |
|
|
|
|
/> |
|
|
|
|
</template> |
|
|
|
|
<script setup> |
|
|
|
|
import MainContactInfo from "./templates/MainContactInfo.vue"; |
|
|
|
|
@ -311,11 +357,14 @@ import VerifyForm from "./templates/VerifyForm.vue";
|
|
|
|
|
import MailApprovalDetail from "./templates/MailApprovalDetail.vue"; |
|
|
|
|
import Comments from "./templates/Comments.vue"; |
|
|
|
|
import CountersignForm from "./templates/CountersignForm.vue"; |
|
|
|
|
import Countersign from "./templates/Countersign.vue"; |
|
|
|
|
|
|
|
|
|
import MailReturnDetail from "./MailReturnDetail.vue"; |
|
|
|
|
import ApplicationCompleted from "./ApplicationCompleted.vue"; |
|
|
|
|
import ReviewComments from "./ReviewComments.vue"; |
|
|
|
|
import ConfirmedCompletion from "./ConfirmedCompletion.vue"; |
|
|
|
|
import InitiateCountersign from "./InitiateCountersign.vue"; |
|
|
|
|
import MailReturen from "./MailReturen.vue"; |
|
|
|
|
|
|
|
|
|
import RemainingTime from "./RemainingTime.vue"; |
|
|
|
|
|
|
|
|
|
@ -332,6 +381,7 @@ const deptSelectFormRef = ref();
|
|
|
|
|
const ContactWriterFormRef = ref(); |
|
|
|
|
const InterviewWriterFormRef = ref(); |
|
|
|
|
const verifyFormRef = ref(); |
|
|
|
|
const countersignFormRef = ref(); |
|
|
|
|
|
|
|
|
|
const loading = ref(true); |
|
|
|
|
const mail = ref({}); |
|
|
|
|
@ -342,6 +392,7 @@ const actions = ref([]);
|
|
|
|
|
const percentage = ref(100); |
|
|
|
|
const percentageLableHtml = ref(""); |
|
|
|
|
const approvals = ref([]); |
|
|
|
|
const mailReturns = ref([]); |
|
|
|
|
|
|
|
|
|
const isFav = ref(false); |
|
|
|
|
const steps = ref([ |
|
|
|
|
@ -389,6 +440,10 @@ const props = defineProps({
|
|
|
|
|
type: Boolean, |
|
|
|
|
default: false, |
|
|
|
|
}, |
|
|
|
|
workType: { |
|
|
|
|
type: String, |
|
|
|
|
default: "processing", |
|
|
|
|
}, |
|
|
|
|
}); |
|
|
|
|
const emits = defineEmits(["update:show", "update"]); |
|
|
|
|
|
|
|
|
|
@ -415,6 +470,8 @@ function getDetail() {
|
|
|
|
|
isFav.value = data.isFav; |
|
|
|
|
flowNode.value = data.flowNode; |
|
|
|
|
approvals.value = data.approvals; |
|
|
|
|
mailReturns.value = data.mailReturns; |
|
|
|
|
console.log("mailReturns", mailReturns.value); |
|
|
|
|
if (data.flowNode.webComponents) { |
|
|
|
|
webComponents.value = data.flowNode.webComponents |
|
|
|
|
.split(",") |
|
|
|
|
@ -444,8 +501,10 @@ const messageRef = ref();
|
|
|
|
|
const approvedShow = ref(false); |
|
|
|
|
const completionShow = ref(false); |
|
|
|
|
const countersignShow = ref(false); |
|
|
|
|
const returnShow = ref(false); |
|
|
|
|
// 办结按钮 |
|
|
|
|
const completionBtnFlag = ref(false); |
|
|
|
|
|
|
|
|
|
// 监听信件类目变化 |
|
|
|
|
watch( |
|
|
|
|
() => requestData.value.mailFirstCategory, |
|
|
|
|
@ -480,20 +539,30 @@ async function handleAction(key) {
|
|
|
|
|
countersignShow.value = true; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
// 信件退回 |
|
|
|
|
if (key === "return") { |
|
|
|
|
returnShow.value = true; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (mailTypeFormRef.value) { |
|
|
|
|
await mailTypeFormRef.value.validate(); |
|
|
|
|
} |
|
|
|
|
if (deptSelectFormRef.value) { |
|
|
|
|
await deptSelectFormRef.value.validate(); |
|
|
|
|
} |
|
|
|
|
if (ContactWriterFormRef.value) { |
|
|
|
|
await ContactWriterFormRef.value.validate(); |
|
|
|
|
} |
|
|
|
|
if (InterviewWriterFormRef.value) { |
|
|
|
|
await InterviewWriterFormRef.value.validate(); |
|
|
|
|
if (key !== "returnSubmit") { |
|
|
|
|
if (deptSelectFormRef.value) { |
|
|
|
|
await deptSelectFormRef.value.validate(); |
|
|
|
|
} |
|
|
|
|
if (ContactWriterFormRef.value) { |
|
|
|
|
await ContactWriterFormRef.value.validate(); |
|
|
|
|
} |
|
|
|
|
if (InterviewWriterFormRef.value) { |
|
|
|
|
await InterviewWriterFormRef.value.validate(); |
|
|
|
|
} |
|
|
|
|
if (verifyFormRef.value) { |
|
|
|
|
await verifyFormRef.value.validate(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (verifyFormRef.value) { |
|
|
|
|
await verifyFormRef.value.validate(); |
|
|
|
|
if (countersignFormRef.value) { |
|
|
|
|
await countersignFormRef.value.validate(); |
|
|
|
|
} |
|
|
|
|
// 申请办结 |
|
|
|
|
if (key === "applicationCompleted") { |
|
|
|
|
@ -511,9 +580,11 @@ async function handleAction(key) {
|
|
|
|
|
// 刷新 |
|
|
|
|
emits("update"); |
|
|
|
|
if ( |
|
|
|
|
flowNode.value.key.indexOf("sign") > -1 || |
|
|
|
|
flowNode.value.key === "contact_writer" || |
|
|
|
|
flowNode.value.key === "interview_writer" |
|
|
|
|
(flowNode.value.key.indexOf("sign") > -1 || |
|
|
|
|
flowNode.value.key === "contact_writer" || |
|
|
|
|
flowNode.value.key === "interview_writer" || |
|
|
|
|
flowNode.value.key === "countersign") && |
|
|
|
|
key !== "returnSubmit" |
|
|
|
|
) { |
|
|
|
|
getDetail(); |
|
|
|
|
if (flowNode.value.key.indexOf("sign") > -1) { |
|
|
|
|
@ -539,6 +610,7 @@ function handleFav() {
|
|
|
|
|
isFav.value = false; |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
watch; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const completeShow = ref(false); |
|
|
|
|
@ -547,6 +619,27 @@ const flowMaxHeight = ref(200);
|
|
|
|
|
const leftContainerRef = ref(); |
|
|
|
|
const mailInfoRef = ref(); |
|
|
|
|
const flowHeaderRef = ref(); |
|
|
|
|
|
|
|
|
|
watch( |
|
|
|
|
() => mail.value.flowRemainingTime, |
|
|
|
|
(val) => { |
|
|
|
|
if (val === 0) { |
|
|
|
|
mail.value.flowRemainingTimePercentage = 0; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (val > 0) { |
|
|
|
|
mail.value.flowRemainingTimePercentage = parseInt( |
|
|
|
|
val / mail.value.flowLimitedTime |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
const colors = [ |
|
|
|
|
{ color: "#F30000", percentage: 30 }, |
|
|
|
|
{ color: "#E56D2B", percentage: 60 }, |
|
|
|
|
{ color: "#2B45E5", percentage: 100 }, |
|
|
|
|
]; |
|
|
|
|
</script> |
|
|
|
|
<style lang="scss" scoped> |
|
|
|
|
.dialog-header { |
|
|
|
|
@ -614,24 +707,6 @@ const flowHeaderRef = ref();
|
|
|
|
|
height: 190px; |
|
|
|
|
width: 100%; |
|
|
|
|
} |
|
|
|
|
div { |
|
|
|
|
font-size: 18px; |
|
|
|
|
vertical-align: bottom; |
|
|
|
|
:deep() { |
|
|
|
|
.error { |
|
|
|
|
font-size: 50px; |
|
|
|
|
color: #ff4242; |
|
|
|
|
} |
|
|
|
|
.large { |
|
|
|
|
font-size: 56px; |
|
|
|
|
color: var(--large-font-color); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
p { |
|
|
|
|
font-size: 14px; |
|
|
|
|
color: #333; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
.flow { |
|
|
|
|
.flow-header { |
|
|
|
|
@ -686,7 +761,7 @@ const flowHeaderRef = ref();
|
|
|
|
|
h1 { |
|
|
|
|
font-size: 24px; |
|
|
|
|
font-weight: 500; |
|
|
|
|
color: #162582; |
|
|
|
|
color: var(--primary-color); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
main { |
|
|
|
|
@ -698,4 +773,33 @@ main {
|
|
|
|
|
footer { |
|
|
|
|
padding: 0 20px; |
|
|
|
|
} |
|
|
|
|
:deep() { |
|
|
|
|
h2 { |
|
|
|
|
font-size: 24px; |
|
|
|
|
font-weight: 500; |
|
|
|
|
color: var(--primary-color); |
|
|
|
|
} |
|
|
|
|
h3 { |
|
|
|
|
font-size: 16px; |
|
|
|
|
font-weight: 500; |
|
|
|
|
color: var(--primary-color); |
|
|
|
|
} |
|
|
|
|
.content { |
|
|
|
|
font-size: 16px; |
|
|
|
|
padding: 12px; |
|
|
|
|
color: #333; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.file-box { |
|
|
|
|
img { |
|
|
|
|
width: 80px; |
|
|
|
|
height: 80px; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
.el-button.is-disabled { |
|
|
|
|
--el-button-disabled-bg-color: #b0b0b0; |
|
|
|
|
--el-button-disabled-border-color: #b0b0b0; |
|
|
|
|
--el-button-disabled-text-color: #fff; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
</style> |