慢直播
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.
 
 
 
 
 

346 lines
11 KiB

<template>
<basic-container>
<avue-affix id="avue-view"
:offset-top="116">
<div class="header">
<avue-title :value="process.processDefinitionName"></avue-title>
</div>
</avue-affix>
<el-tabs v-model="activeName">
<el-tab-pane label="申请信息"
name="first">
<el-card shadow="never">
<div ref="printBody">
<avue-form v-if="option && option.column && option.column.length > 0"
v-model="form"
ref="form"
:option="option">
</avue-form>
</div>
</el-card>
<el-card shadow="never"
style="margin-top: 20px"
v-if="process.status == 'todo'">
<avue-form v-model="examineForm"
ref="examineForm"
:option="examineOption">
</avue-form>
</el-card>
</el-tab-pane>
<el-tab-pane label="流转信息"
name="second">
<el-card shadow="never"
style="margin-top: 5px;">
<el-row type="flex"
class="row-bg">
<el-timeline>
<template v-for="item in flow">
<el-timeline-item v-if="item.historyActivityType != 'sequenceFlow'"
:key="item.id"
:timestamp="item.endTime || item.createTime"
placement="top">
<el-card shadow="never">
<p>{{item.assigneeName}} 在 [{{item.createTime}}] 开始处理 [{{item.historyActivityName}}] 环节</p>
<p v-if="item.historyActivityDurationTime">任务历时 [{{item.historyActivityDurationTime}}]</p>
<p v-if="item.comment">批复意见: [{{item.comment}}]</p>
<p v-if="item.endTime">结束时间: [{{item.endTime}}]</p>
</el-card>
</el-timeline-item>
</template>
</el-timeline>
</el-row>
</el-card>
</el-tab-pane>
<el-tab-pane label="流程跟踪"
name="third">
</el-tab-pane>
</el-tabs>
<template v-if="activeName == 'third'">
<el-card v-if="process && process.xml"
shadow="never"
style="margin-top: 5px;">
<wf-design ref="bpmn"
style="height: 500px;"
:options="bpmnOption"></wf-design>
</el-card>
</template>
<template v-if="process.status == 'todo'">
<div style="height: 120px;"></div>
<el-row class="foot-item avue-affix"
id="avue-view">
<el-button v-if="buttonList.find(b => b.key == 'wf_pass')"
type="success"
size="medium"
v-loading="submitLoading"
@click="handleCompleteTask(true)">通过</el-button>
<el-button v-if="buttonList.find(b => b.key == 'wf_reject')"
type="danger"
size="medium"
v-loading="submitLoading"
@click="handleCompleteTask(false)">驳回</el-button>
<el-button v-if="buttonList.find(b => b.key == 'wf_transfer')"
type="warning"
size="medium"
v-loading="submitLoading"
@click="handleUserSelect('transfer')">转办</el-button>
<el-button v-if="buttonList.find(b => b.key == 'wf_delegate')"
type="warning"
size="medium"
v-loading="submitLoading"
@click="handleUserSelect('delegate')">委托</el-button>
<el-button v-if="buttonList.find(b => b.key == 'wf_print')"
type="warning"
size="medium"
v-loading="submitLoading"
@click="handlePrint()">打印</el-button>
<!-- <el-button type="warning"
size="medium"
v-loading="submitLoading"
@click="handleSelect()">选人</el-button> -->
</el-row>
</template>
<user-select ref="user-select"
:select-type="selectType"
@onClose="handleClose"
@onConfirm="handleConfirm"></user-select>
</basic-container>
</template>
<script>
import { detail, completeTask, transferTask, delegateTask } from '@/api/plugin/workflow/process'
import userSelect from './user-select'
import { mapGetters } from 'vuex'
import Print from '../../util/print'
export default {
components: { userSelect },
computed: {
...mapGetters(['tag', 'userInfo']),
},
watch: {
'$route.params.params': {
handler(val) {
if (val) {
const param = JSON.parse(Buffer.from(val, 'base64').toString())
const { taskId, processInsId } = param
if (taskId && processInsId) this.getDetail(taskId, processInsId)
}
},
immediate: true
}
},
data() {
return {
activeName: 'first',
form: {},
option: {
menuBtn: false,
},
examineForm: {},
examineOption: {
menuBtn: false,
column: [{
label: '批复意见',
prop: 'comment',
type: 'textarea',
span: 24,
}, {
label: '抄送人',
prop: '$copyUser',
placeholder: '请选择 抄送人',
readonly: true,
append: '➕',
span: 24,
event: {
click: () => {
this.$refs['user-select'].visible = true
this.selectType = 'checkbox'
this.userSelectType = 'copy'
}
}
}, {
label: '指定审批人',
prop: '$assignee',
placeholder: '请选择 下一级审批人,如不选择则使用默认处理人,驳回时无效',
readonly: true,
span: 24,
event: {
click: () => {
this.$refs['user-select'].visible = true
this.selectType = 'radio'
this.userSelectType = 'assignee'
}
}
}]
},
process: {},
flow: [],
bpmnOption: {
mode: 'view'
},
vars: [],
submitLoading: false,
buttonList: [],
watermarkText: '', //水印文字
userSelectType: '', // transfer转办 delegate委托
selectType: 'radio'
}
},
created() {
this.watermarkText = this.userInfo.user_name + " " + this.userInfo.real_name
},
methods: {
getDetail(taskId, processInsId) {
detail({ taskId, processInsId }).then(res => {
const { process, form, flow, button } = res.data.data
const { variables, status, xml } = process
let { allForm, taskForm } = form
if (allForm) {
const option = eval('(' + allForm + ')')
option.menuBtn = false
if (status != 'todo') option.detail = true
else {
const arr = []
const vars = []
taskForm.forEach(task => {
const column = option.column.find(c => c.prop == task.id)
if (task.readable && column) {
if (!task.writable) {
column.readonly = true
column.disabled = true
} else vars.push(column.prop)
}
arr.push(column)
})
option.column = arr
this.vars = vars
}
this.option = option
this.form = variables
this.process = process
this.flow = flow
this.buttonList = button
const flows = []
flow.forEach(f => {
const ff = {
id: f.historyActivityId
}
if (f.historyActivityType == 'sequenceFlow') ff.class = "lineWarn"
else ff.class = "nodeWarn"
flows.push(ff)
})
this.bpmnOption = {
mode: 'view',
xml,
flows
}
}
})
},
handleCompleteTask(pass) {
this.submitLoading = true
const { comment, copyUser, assignee } = this.examineForm
if (!pass && !comment) {
this.$message.error("请填写批复意见")
this.submitLoading = false
return
}
this.$refs.form.validate((valid) => {
if (valid) {
const variables = {}
this.vars.forEach(v => {
if (v != 'comment' && this.form[v]) variables[v] = this.form[v]
})
const { taskId, processInstanceId, processDefinitionName } = this.process
const params = {
taskId, processInstanceId, processDefinitionName, pass,
comment, copyUser, assignee, variables
}
completeTask(params).then(() => {
this.$message.success("处理成功")
this.$store.commit('DEL_TAG', this.tag)
this.$router.push("/plugin/workflow/process/todo")
}).catch(() => {
this.submitLoading = false
})
}
})
},
handlePrint() { //打印
// this.watermark({ text: this.watermarkText })
Print(this.$refs.printBody)
},
handleUserSelect(type) { //选人
this.$refs['user-select'].visible = true
this.userSelectType = type
},
handleClose() { //关闭选人
this.$refs['user-select'].visible = false
},
handleConfirm(id, name) { //选人回调
const type = this.userSelectType
const param = {
taskId: this.process.taskId,
assignee: id
}
if (type == 'transfer') {
transferTask(param).then(() => { // 转办
this.$message.success("转办成功")
this.$store.commit('DEL_TAG', this.tag)
this.$router.push("/plugin/workflow/process/todo")
})
} else if (type == 'delegate') { // 委托
delegateTask(param).then(() => {
this.$message.success("委托成功")
this.$store.commit('DEL_TAG', this.tag)
this.$router.push("/plugin/workflow/process/todo")
})
} else if (type == 'copy') { // 抄送
this.examineForm.copyUser = id
this.examineForm.$copyUser = name
} else if (type == 'assignee') { // 指定下一步审批人
this.examineForm.assignee = id
this.examineForm.$assignee = name
}
this.$refs['user-select'].visible = false
},
}
}
</script>
<style lang="scss" scoped>
.header {
width: 100%;
height: 50px;
background: #fff;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 10px 10px 0;
}
.foot-item {
position: fixed;
bottom: 0;
margin-left: -20px;
// right: 0;
z-index: 101;
width: 98%;
height: 66px;
background-color: #fff;
display: flex;
justify-content: center;
align-items: center;
-webkit-transition: 0.3s;
transition: 0.3s;
-webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
</style>