仿钉钉流程设计器 -会签按通过比例

pull/452/head
jason 2024-06-13 08:24:54 +08:00
parent 632bcb9944
commit cab9553235
2 changed files with 33 additions and 14 deletions

View File

@ -108,7 +108,7 @@ export enum ApproveMethodType {
*/ */
ALL_APPROVE = 2, ALL_APPROVE = 2,
/** /**
* () * ()
*/ */
APPROVE_BY_RATIO = 3, APPROVE_BY_RATIO = 3,
/** /**
@ -218,7 +218,7 @@ NODE_DEFAULT_NAME.set(NodeType.CONDITION_NODE, '条件')
export const APPROVE_METHODS: DictDataVO [] = [ export const APPROVE_METHODS: DictDataVO [] = [
{ label: '单人审批', value: ApproveMethodType.SINGLE_PERSON_APPROVE }, { label: '单人审批', value: ApproveMethodType.SINGLE_PERSON_APPROVE },
{ label: '多人会签(需所有审批人同意)', value: ApproveMethodType.ALL_APPROVE }, { label: '多人会签(需所有审批人同意)', value: ApproveMethodType.ALL_APPROVE },
// { label: '多人会签(按比例投票)', value: ApproveMethodType.APPROVE_BY_RATIO }, { label: '多人会签(按通过比例%)', value: ApproveMethodType.APPROVE_BY_RATIO },
{ label: '多人会签(通过只需一人,拒绝需要全员)', value: ApproveMethodType.ANY_APPROVE_ALL_REJECT }, { label: '多人会签(通过只需一人,拒绝需要全员)', value: ApproveMethodType.ANY_APPROVE_ALL_REJECT },
{ label: '多人或签(一名审批人通过即可)', value: ApproveMethodType.ANY_APPROVE }, { label: '多人或签(一名审批人通过即可)', value: ApproveMethodType.ANY_APPROVE },
{ label: '依次审批(按顺序依次审批)', value: ApproveMethodType.SEQUENTIAL_APPROVE } { label: '依次审批(按顺序依次审批)', value: ApproveMethodType.SEQUENTIAL_APPROVE }

View File

@ -149,7 +149,7 @@
@change="approveMethodChanged" @change="approveMethodChanged"
> >
<div class="flex-col"> <div class="flex-col">
<div v-for="(item, index) in APPROVE_METHODS" :key="index"> <div v-for="(item, index) in APPROVE_METHODS" :key="index" class="flex items-center">
<el-radio <el-radio
:value="item.value" :value="item.value"
:label="item.value" :label="item.value"
@ -160,6 +160,14 @@
> >
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
<el-input-number
v-model="currentNode.attributes.approveRatio"
:min="10"
:max="99"
:step="10"
size="small"
v-if="item.value === ApproveMethodType.APPROVE_BY_RATIO && currentNode.attributes.approveMethod === ApproveMethodType.APPROVE_BY_RATIO"
/>
</div> </div>
</div> </div>
</el-radio-group> </el-radio-group>
@ -175,6 +183,7 @@
:label="item.label" :label="item.label"
:disabled="rejectHandlerOptionDisabled(item.value)" :disabled="rejectHandlerOptionDisabled(item.value)"
/> />
</div> </div>
</div> </div>
</el-radio-group> </el-radio-group>
@ -512,6 +521,7 @@ const changedCandidateUsers = () => {
currentNode.value.attributes?.candidateStrategy === CandidateStrategy.USER currentNode.value.attributes?.candidateStrategy === CandidateStrategy.USER
) { ) {
currentNode.value.attributes.approveMethod = ApproveMethodType.SINGLE_PERSON_APPROVE currentNode.value.attributes.approveMethod = ApproveMethodType.SINGLE_PERSON_APPROVE
currentNode.value.attributes.rejectHandler.type = RejectHandlerType.FINISH_PROCESS
notAllowedMultiApprovers.value = true notAllowedMultiApprovers.value = true
} else { } else {
notAllowedMultiApprovers.value = false notAllowedMultiApprovers.value = false
@ -530,26 +540,35 @@ const blurEvent = () => {
currentNode.value.name || (NODE_DEFAULT_NAME.get(NodeType.USER_TASK_NODE) as string) currentNode.value.name || (NODE_DEFAULT_NAME.get(NodeType.USER_TASK_NODE) as string)
} }
const approveMethodChanged = () => { const approveMethodChanged = () => {
const approveMethod = currentNode.value.attributes?.approveMethod const approveMethod = currentNode.value.attributes?.approveMethod
if (approveMethod === ApproveMethodType.ANY_APPROVE_ALL_REJECT || approveMethod === ApproveMethodType.APPROVE_BY_RATIO) { if ( approveMethod === ApproveMethodType.ANY_APPROVE_ALL_REJECT || approveMethod === ApproveMethodType.APPROVE_BY_RATIO) {
currentNode.value.attributes.rejectHandler.type =RejectHandlerType.FINISH_PROCESS_BY_REJECT_RATIO currentNode.value.attributes.rejectHandler.type =
RejectHandlerType.FINISH_PROCESS_BY_REJECT_RATIO
} else { } else {
currentNode.value.attributes.rejectHandler.type = RejectHandlerType.FINISH_PROCESS currentNode.value.attributes.rejectHandler.type = RejectHandlerType.FINISH_PROCESS
} }
if (approveMethod === ApproveMethodType.APPROVE_BY_RATIO) {
currentNode.value.attributes.approveRatio = 50;
}
} }
const rejectHandlerOptionDisabled = computed(() => { const rejectHandlerOptionDisabled = computed(() => {
return (val: number) => { return (val: number) => {
const approveMethod = currentNode.value.attributes?.approveMethod const approveMethod = currentNode.value.attributes?.approveMethod
if (val === RejectHandlerType.FINISH_PROCESS_BY_REJECT_RATIO && approveMethod !== ApproveMethodType.APPROVE_BY_RATIO if (
&& approveMethod !== ApproveMethodType.ANY_APPROVE_ALL_REJECT) { val === RejectHandlerType.FINISH_PROCESS_BY_REJECT_RATIO &&
return true approveMethod !== ApproveMethodType.APPROVE_BY_RATIO &&
} approveMethod !== ApproveMethodType.ANY_APPROVE_ALL_REJECT
if ( approveMethod === ApproveMethodType.ANY_APPROVE_ALL_REJECT &&
val === RejectHandlerType.FINISH_PROCESS
) { ) {
return true return true
} }
if (
approveMethod === ApproveMethodType.ANY_APPROVE_ALL_REJECT &&
val === RejectHandlerType.FINISH_PROCESS
) {
return true
}
return false return false
} }
}) })