You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

181 lines
4.1 KiB

1 year ago
<template>
<div>
<vxe-modal
:value="visible"
show-footer
:z-index="zIndex"
title="转办"
show-zoom
show-confirm-button
:width="640"
:height="540"
@input="e => $emit('update:visible',e)"
1 year ago
>
<div>
<div class="steps">
<el-steps :space="120" finish-status="success" align-center>
<el-step
:title="node.name"
status="finish"
:icon="isLastNode ? 'el-icon-check' : 'el-icon-edit'"
1 year ago
></el-step>
<el-step
v-if="!isLastNode"
1 year ago
title="流转到下一节点"
icon="el-icon-right"
status="wait"
></el-step>
</el-steps>
</div>
<el-divider></el-divider>
<template v-if="!isLastNode">
<div class="next-nodes">
<div class="next-nodes__label">下一节点</div>
1 year ago
<div>
<el-radio-group v-model="form.next_node_id" @change="pickUsers = node2Users.get(form.next_node_id)">
<el-radio v-for="node in node.nextNodes" :label="node.id">{{ node.name }}</el-radio>
</el-radio-group>
</div>
1 year ago
</div>
<el-divider></el-divider>
1 year ago
<div class="users">
<div class="users__label">承办人员</div>
1 year ago
<div>
<el-radio-group v-model="form.user_id">
<div v-for="group in pickUsers" :key="group.id">
<div class="group-name">{{ group.name }}</div>
<el-radio v-for="user in group.users" :label="user.id">{{ user.name }}</el-radio>
</div>
</el-radio-group>
</div>
1 year ago
</div>
</template>
1 year ago
</div>
<span slot="footer" class="dialog-footer">
1 year ago
<el-button type="primary" @click="submit"
>{{ isLastNode ? '结束流程' : '确 定'}}</el-button
1 year ago
>
</span>
</vxe-modal>
1 year ago
</div>
</template>
<script>
1 year ago
import { getNextNodeUsers, assign } from "@/api/flow";
import { PopupManager } from 'element-ui/lib/utils/popup'
1 year ago
export default {
props: {
visible: {
type: Boolean,
default: false,
required: true
},
config: Object,
result: {
type: Object,
required: true
},
1 year ago
},
data() {
return {
zIndex: PopupManager.nextZIndex(),
1 year ago
form: {
cc_users: [],
user_id: "",
next_node_id: "",
},
1 year ago
node2Users: new Map(),
pickUsers: [],
1 year ago
};
},
methods: {
async getNextNodesUsers() {
try {
1 year ago
const nodeIds = this.node?.nextNodes?.map(node => node.id);
const res = await Promise.all(nodeIds.map(nodeId => getNextNodeUsers({
1 year ago
id: this.result.id,
1 year ago
next_node_id: nodeId,
1 year ago
},false)));
1 year ago
res.forEach((group, index) => {
this.node2Users.set(nodeIds[index], group.users)
})
1 year ago
} catch (err) {
console.error(err)
}
1 year ago
},
async submit() {
try {
if(this.isLastNode) {
await assign(this.result.id)
} else {
await assign(this.result.id, this.form)
}
this.$router.push("/flow/list/handled");
1 year ago
} catch(err) {
}
1 year ago
}
},
computed: {
title() {
return this.config?.customModel?.name + '流转'
},
node() {
return this.config?.currentNode || {};
},
isLastNode() {
return this.node?.category === 'end'
}
1 year ago
},
watch: {
1 year ago
visible(newVal) {
if(newVal) {
this.zIndex = PopupManager.nextZIndex()
if(this.node && this.node.nextNodes && this.node.nextNodes?.length > 0 && !this.isLastNode) {
1 year ago
this.getNextNodesUsers()
}
}
1 year ago
}
1 year ago
},
created() {}
};
</script>
<style scoped lang="scss">
.next-nodes,.users {
display: flex;
&__label {
flex-basis: 100px;
font-weight: 600;
color: #666;
}
1 year ago
.group-name {
font-weight: 600;
font-size: 13px;
color: #98a6ad;
line-height: 2;
}
}
.dialog-footer {
display: flex;
justify-content: center;
1 year ago
}
::v-deep .steps {
display: flex;
justify-content: center;
}
1 year ago
</style>