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.
519 lines
20 KiB
519 lines
20 KiB
<template>
|
|
<div class="customer-css">
|
|
<!-- 查询区域 - rqrq -->
|
|
<el-form :inline="true" label-position="top" label-width="100px" style="margin-top: 0px;">
|
|
<el-row>
|
|
<el-col :span="24">
|
|
<el-form-item label="单据号:">
|
|
<el-input v-model="searchData.applyNo" style="width: 150px"></el-input>
|
|
</el-form-item>
|
|
<el-form-item label="单据类型:">
|
|
<el-select v-model="searchData.orderType" style="width: 130px" clearable>
|
|
<el-option label="全部" value=""></el-option>
|
|
<el-option label="产品资料" value="产品资料"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="流程状态:">
|
|
<el-select v-model="searchData.status" style="width: 130px" clearable>
|
|
<el-option label="全部" value=""></el-option>
|
|
<el-option label="运行中" value="RUNNING"></el-option>
|
|
<el-option label="已完成" value="COMPLETED"></el-option>
|
|
<el-option label="已终止" value="TERMINATED"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label=" ">
|
|
<el-button class="customer-bun-min" type="primary" @click="getInstanceList">查询</el-button>
|
|
<el-button type="primary" @click="openAddDialog">新增测试</el-button>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
</el-form>
|
|
|
|
<!-- 上表:流程实例列表 -->
|
|
<div style="font-weight: bold; margin-bottom: 5px;">流程实例列表</div>
|
|
<el-table
|
|
:height="height1"
|
|
:data="instanceList"
|
|
border
|
|
ref="instanceTable"
|
|
highlight-current-row
|
|
@row-click="selectInstance"
|
|
v-loading="instanceLoading"
|
|
style="width: 100%;">
|
|
<el-table-column prop="applyNo" label="单据号" min-width="150" header-align="center" align="center"></el-table-column>
|
|
<el-table-column prop="orderType" label="单据类型" min-width="100" header-align="center" align="center"></el-table-column>
|
|
<el-table-column prop="flowName" label="流程名称" min-width="150" header-align="center" align="left"></el-table-column>
|
|
<el-table-column prop="currentNodeName" label="当前节点" min-width="120" header-align="center" align="center"></el-table-column>
|
|
<el-table-column prop="status" label="状态" min-width="80" header-align="center" align="center">
|
|
<template slot-scope="scope">
|
|
<span :style="{ color: getStatusColor(scope.row.status) }">{{ getStatusText(scope.row.status) }}</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="startTime" label="开始时间" min-width="150" header-align="center" align="center"></el-table-column>
|
|
<el-table-column prop="applicant" label="申请人" min-width="100" header-align="center" align="center"></el-table-column>
|
|
<el-table-column fixed="right" header-align="center" align="center" width="100" label="操作">
|
|
<template slot-scope="scope">
|
|
<a type="text" v-if="scope.row.status === 'COMPLETED' || scope.row.status === 'TERMINATED'" size="small" @click="handleRestart(scope.row)">重新审批</a>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
|
|
<el-pagination
|
|
style="margin-top: 5px"
|
|
@size-change="instanceSizeChange"
|
|
@current-change="instancePageChange"
|
|
:current-page="instancePageIndex"
|
|
:page-sizes="[20, 50, 100, 200]"
|
|
:page-size="instancePageSize"
|
|
:total="instanceTotal"
|
|
layout="total, sizes, prev, pager, next, jumper">
|
|
</el-pagination>
|
|
|
|
<!-- 下表:节点实例列表 -->
|
|
<div style="font-weight: bold; margin: 10px 0 5px 0;">节点审批记录</div>
|
|
<el-table
|
|
:height="height2"
|
|
:data="nodeInstanceList"
|
|
border
|
|
ref="nodeTable"
|
|
highlight-current-row
|
|
v-loading="nodeLoading"
|
|
style="width: 100%;">
|
|
<el-table-column prop="nodeOrder" label="序号" width="60" header-align="center" align="center"></el-table-column>
|
|
<el-table-column prop="nodeName" label="节点名称" min-width="100" header-align="center" align="center"></el-table-column>
|
|
<el-table-column prop="departmentName" label="审批部门" min-width="100" header-align="center" align="center">
|
|
<template slot-scope="scope">{{ scope.row.departmentName || '-' }}</template>
|
|
</el-table-column>
|
|
<el-table-column prop="assigneeName" label="审批人" min-width="80" header-align="center" align="center"></el-table-column>
|
|
<el-table-column prop="attemptNo" label="次数" width="60" header-align="center" align="center"></el-table-column>
|
|
<el-table-column prop="approveType" label="审批类型" min-width="100" header-align="center" align="center">
|
|
<template slot-scope="scope">
|
|
<span v-if="scope.row.approveType === 'SINGLE'">单人审批</span>
|
|
<span v-else-if="scope.row.approveType === 'ALL'">会签</span>
|
|
<span v-else-if="scope.row.approveType === 'ANY'">或签</span>
|
|
<span v-else>{{ scope.row.approveType }}</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="status" label="状态" min-width="80" header-align="center" align="center">
|
|
<template slot-scope="scope">
|
|
<span :style="{ color: getNodeStatusColor(scope.row.status) }">{{ getNodeStatusText(scope.row.status) }}</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="comment" label="审批意见" min-width="150" header-align="center" align="left" show-overflow-tooltip></el-table-column>
|
|
<el-table-column prop="completeTime" label="完成时间" min-width="150" header-align="center" align="center">
|
|
<template slot-scope="scope">{{ scope.row.completeTime || '-' }}</template>
|
|
</el-table-column>
|
|
<el-table-column fixed="right" header-align="center" align="center" width="100" label="操作">
|
|
<template slot-scope="scope">
|
|
<a type="text" size="small" @click="openApproveDialog(scope.row)">审批</a>
|
|
<!-- <el-button v-if="scope.row.status === 'PENDING'" size="mini" type="text" @click="openApproveDialog(scope.row)">审批</el-button>-->
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
|
|
<!-- 新增测试对话框 - rqrq -->
|
|
<el-dialog
|
|
title="新增审批流程(测试)"
|
|
:visible.sync="addDialogVisible"
|
|
width="500px"
|
|
:close-on-click-modal="false"
|
|
v-drag>
|
|
<el-form :model="addFormData" :rules="addFormRules" ref="addFormRef" label-position="top">
|
|
<el-form-item label="工厂编码" prop="site">
|
|
<el-input v-model="addFormData.site" placeholder="请输入工厂编码"></el-input>
|
|
</el-form-item>
|
|
<el-form-item label="单据号" prop="applyNo">
|
|
<el-input v-model="addFormData.applyNo" placeholder="请输入单据号"></el-input>
|
|
</el-form-item>
|
|
<el-form-item label="单据类型" prop="orderType">
|
|
<el-select v-model="addFormData.orderType" style="width: 100%" placeholder="请选择单据类型">
|
|
<el-option label="产品资料" value="产品资料"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="流程编码" prop="flowCode">
|
|
<el-input v-model="addFormData.flowCode" placeholder="请输入流程编码"></el-input>
|
|
</el-form-item>
|
|
</el-form>
|
|
<span slot="footer" class="dialog-footer">
|
|
<el-button type="primary" @click="submitAddForm" :loading="addLoading">{{ addLoading ? '创建中...' : '创建' }}</el-button>
|
|
<el-button @click="addDialogVisible = false" :disabled="addLoading">取消</el-button>
|
|
</span>
|
|
</el-dialog>
|
|
|
|
<!-- 审批对话框 - rqrq -->
|
|
<el-dialog
|
|
title="审批"
|
|
:visible.sync="approveDialogVisible"
|
|
width="550px"
|
|
:close-on-click-modal="false"
|
|
v-drag>
|
|
<el-form :model="approveData" label-position="top">
|
|
<el-row :gutter="20">
|
|
<el-col :span="12">
|
|
<el-form-item label="单据号">
|
|
<el-input v-model="approveData.applyNo" disabled></el-input>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="12">
|
|
<el-form-item label="当前节点">
|
|
<el-input v-model="approveData.nodeName" disabled></el-input>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
<el-row :gutter="20">
|
|
<el-col :span="12">
|
|
<el-form-item label="审批部门">
|
|
<el-input v-model="approveData.departmentName" disabled></el-input>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="12">
|
|
<el-form-item label="审批人">
|
|
<el-input v-model="approveData.assigneeName" disabled></el-input>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
<el-form-item label="审批意见">
|
|
<el-input type="textarea" v-model="approveData.comment" :rows="3" placeholder="请输入审批意见"></el-input>
|
|
</el-form-item>
|
|
</el-form>
|
|
<el-footer style="height:40px;margin-top: 60px;text-align:center">
|
|
|
|
<el-button type="success" @click="submitApprove('APPROVED')" :loading="approveLoading">同意</el-button>
|
|
<el-button type="danger" @click="submitApprove('REJECTED')" :loading="approveLoading">驳回</el-button>
|
|
<el-button type="info" @click="openFlowPreview">流程预览</el-button>
|
|
<el-button @click="approveDialogVisible = false" :disabled="approveLoading">取消</el-button>
|
|
|
|
</el-footer>
|
|
</el-dialog>
|
|
|
|
<!-- 流程预览对话框 - rqrq -->
|
|
<el-dialog
|
|
title="流程预览"
|
|
:visible.sync="previewDialogVisible"
|
|
width="700px"
|
|
:close-on-click-modal="false"
|
|
append-to-body
|
|
v-drag>
|
|
<div style="margin-bottom: 15px;">
|
|
<span style="font-weight: bold;">流程名称:</span>{{ previewData.flowName }}
|
|
<span style="margin-left: 20px; font-weight: bold;">流程编码:</span>{{ previewData.flowCode }}
|
|
<span style="margin-left: 20px; font-weight: bold;">版本:</span>{{ previewData.flowVersion }}
|
|
</div>
|
|
<el-table :data="previewData.nodeList" border style="width: 100%;">
|
|
<el-table-column prop="nodeOrder" label="顺序" width="60" header-align="center" align="center">
|
|
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
|
|
</el-table-column>
|
|
<el-table-column prop="nodeCode" label="节点编码" min-width="100" header-align="center" align="center"></el-table-column>
|
|
<el-table-column prop="nodeName" label="节点名称" min-width="120" header-align="center" align="center"></el-table-column>
|
|
<el-table-column prop="nodeType" label="节点类型" min-width="80" header-align="center" align="center">
|
|
<template slot-scope="scope">
|
|
<span v-if="scope.row.nodeType === 'START'" style="color: #67C23A">开始</span>
|
|
<span v-else-if="scope.row.nodeType === 'END'" style="color: #F56C6C">结束</span>
|
|
<span v-else style="color: #409EFF">审批</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="approveType" label="审批类型" min-width="100" header-align="center" align="center">
|
|
<template slot-scope="scope">
|
|
<span v-if="scope.row.approveType === 'SINGLE'">单人审批</span>
|
|
<span v-else-if="scope.row.approveType === 'ALL'">会签</span>
|
|
<span v-else-if="scope.row.approveType === 'ANY'">或签</span>
|
|
<span v-else>-</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="departmentName" label="审批部门" min-width="120" header-align="center" align="center">
|
|
<template slot-scope="scope">{{ scope.row.departmentName || '-' }}</template>
|
|
</el-table-column>
|
|
<el-table-column prop="approverNames" label="审批人" min-width="150" header-align="center" align="left">
|
|
<template slot-scope="scope">{{ scope.row.approverNames || '-' }}</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<span slot="footer" class="dialog-footer">
|
|
<el-button type="primary" @click="previewDialogVisible = false">关闭</el-button>
|
|
</span>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import {
|
|
searchInstanceList,
|
|
searchNodeInstanceList,
|
|
createFlowInstance,
|
|
approveNodeInstance,
|
|
getFlowPreview,
|
|
restartFlowInstance
|
|
} from '@/api/workFlow/workFlow.js'
|
|
|
|
export default {
|
|
data() {
|
|
return {
|
|
height1: 200,
|
|
height2: 200,
|
|
// 流程实例
|
|
instanceLoading: false,
|
|
instanceList: [],
|
|
instancePageIndex: 1,
|
|
instancePageSize: 20,
|
|
instanceTotal: 0,
|
|
currentInstance: null,
|
|
searchData: {
|
|
site: this.$store.state.user.site,
|
|
applyNo: '',
|
|
orderType: '',
|
|
status: ''
|
|
},
|
|
// 节点实例
|
|
nodeLoading: false,
|
|
nodeInstanceList: [],
|
|
// 当前登录用户
|
|
currentUser: this.$store.state.user.username,
|
|
// 新增对话框
|
|
addDialogVisible: false,
|
|
addLoading: false,
|
|
addFormData: {
|
|
site: this.$store.state.user.site,
|
|
applyNo: '',
|
|
orderType: '产品资料',
|
|
flowCode: ''
|
|
},
|
|
addFormRules: {
|
|
site: [{ required: true, message: '请输入工厂编码', trigger: 'blur' }],
|
|
applyNo: [{ required: true, message: '请输入单据号', trigger: 'blur' }],
|
|
orderType: [{ required: true, message: '请选择单据类型', trigger: 'change' }],
|
|
flowCode: [{ required: true, message: '请输入流程编码', trigger: 'blur' }]
|
|
},
|
|
// 审批对话框
|
|
approveDialogVisible: false,
|
|
approveLoading: false,
|
|
approveData: {
|
|
applyNo: '',
|
|
nodeCode: '',
|
|
nodeName: '',
|
|
departmentName: '', // 审批部门 - rqrq
|
|
assigneeName: '',
|
|
site: '',
|
|
orderType: '',
|
|
comment: '',
|
|
flowCode: '',
|
|
flowVersion: null
|
|
},
|
|
// 流程预览
|
|
previewDialogVisible: false,
|
|
previewData: {
|
|
flowCode: '',
|
|
flowName: '',
|
|
flowVersion: '',
|
|
nodeList: []
|
|
}
|
|
}
|
|
},
|
|
mounted() {
|
|
this.$nextTick(() => {
|
|
this.height1 = (window.innerHeight - 250) / 2
|
|
this.height2 = (window.innerHeight - 250) / 2
|
|
})
|
|
this.getInstanceList()
|
|
},
|
|
methods: {
|
|
// 获取流程实例列表
|
|
getInstanceList() {
|
|
this.instanceLoading = true
|
|
const params = {
|
|
...this.searchData,
|
|
limit: this.instancePageSize,
|
|
page: this.instancePageIndex
|
|
}
|
|
searchInstanceList(params).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
this.instanceList = data.page.list
|
|
this.instanceTotal = data.page.totalCount
|
|
}
|
|
this.instanceLoading = false
|
|
})
|
|
},
|
|
instanceSizeChange(val) {
|
|
this.instancePageSize = val
|
|
this.instancePageIndex = 1
|
|
this.getInstanceList()
|
|
},
|
|
instancePageChange(val) {
|
|
this.instancePageIndex = val
|
|
this.getInstanceList()
|
|
},
|
|
// 选中流程实例
|
|
selectInstance(row) {
|
|
this.currentInstance = row
|
|
this.getNodeInstanceList()
|
|
},
|
|
// 获取节点实例列表
|
|
getNodeInstanceList() {
|
|
if (!this.currentInstance) {
|
|
this.nodeInstanceList = []
|
|
return
|
|
}
|
|
this.nodeLoading = true
|
|
searchNodeInstanceList({
|
|
applyNo: this.currentInstance.applyNo,
|
|
site: this.currentInstance.site,
|
|
orderType: this.currentInstance.orderType
|
|
}).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
this.nodeInstanceList = data.rows
|
|
}
|
|
this.nodeLoading = false
|
|
})
|
|
},
|
|
// 状态颜色
|
|
getStatusColor(status) {
|
|
switch (status) {
|
|
case 'RUNNING': return '#409EFF'
|
|
case 'COMPLETED': return '#67C23A'
|
|
case 'TERMINATED': return '#F56C6C'
|
|
default: return '#909399'
|
|
}
|
|
},
|
|
getStatusText(status) {
|
|
switch (status) {
|
|
case 'RUNNING': return '运行中'
|
|
case 'COMPLETED': return '已完成'
|
|
case 'TERMINATED': return '已终止'
|
|
default: return status
|
|
}
|
|
},
|
|
getNodeStatusColor(status) {
|
|
switch (status) {
|
|
case 'PENDING': return '#E6A23C'
|
|
case 'APPROVED': return '#67C23A'
|
|
case 'REJECTED': return '#F56C6C'
|
|
case 'SKIPPED': return '#909399'
|
|
default: return '#909399'
|
|
}
|
|
},
|
|
getNodeStatusText(status) {
|
|
switch (status) {
|
|
case 'PENDING': return '待审批'
|
|
case 'APPROVED': return '已通过'
|
|
case 'REJECTED': return '已驳回'
|
|
case 'SKIPPED': return '已跳过'
|
|
default: return status
|
|
}
|
|
},
|
|
// 打开新增对话框
|
|
openAddDialog() {
|
|
this.addFormData = {
|
|
site: this.$store.state.user.site,
|
|
applyNo: '',
|
|
orderType: '产品资料',
|
|
flowCode: ''
|
|
}
|
|
this.addDialogVisible = true
|
|
},
|
|
// 提交新增
|
|
submitAddForm() {
|
|
this.$refs.addFormRef.validate((valid) => {
|
|
if (valid) {
|
|
this.addLoading = true
|
|
createFlowInstance(this.addFormData).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
this.$message.success('流程实例创建成功')
|
|
this.addDialogVisible = false
|
|
this.getInstanceList()
|
|
} else {
|
|
this.$message.error(data.msg || '创建失败')
|
|
}
|
|
}).finally(() => {
|
|
this.addLoading = false
|
|
})
|
|
}
|
|
})
|
|
},
|
|
// 打开审批对话框
|
|
openApproveDialog(row) {
|
|
this.approveData = {
|
|
applyNo: this.currentInstance.applyNo,
|
|
nodeCode: row.nodeCode,
|
|
nodeName: row.nodeName,
|
|
departmentName: row.departmentName || '', // 审批部门 - rqrq
|
|
assigneeName: row.assigneeName,
|
|
site: this.currentInstance.site,
|
|
orderType: this.currentInstance.orderType,
|
|
comment: '',
|
|
flowCode: this.currentInstance.flowCode,
|
|
flowVersion: this.currentInstance.flowVersion
|
|
}
|
|
this.approveDialogVisible = true
|
|
},
|
|
// 提交审批
|
|
submitApprove(action) {
|
|
if (action === 'REJECTED' && !this.approveData.comment) {
|
|
this.$message.warning('驳回时必须填写审批意见')
|
|
return
|
|
}
|
|
this.approveLoading = true
|
|
approveNodeInstance({
|
|
applyNo: this.approveData.applyNo,
|
|
nodeCode: this.approveData.nodeCode,
|
|
site: this.approveData.site,
|
|
orderType: this.approveData.orderType,
|
|
action: action,
|
|
comment: this.approveData.comment
|
|
}).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
this.$message.success(action === 'APPROVED' ? '审批通过成功' : '驳回成功')
|
|
this.approveDialogVisible = false
|
|
this.getInstanceList()
|
|
this.getNodeInstanceList()
|
|
} else {
|
|
this.$message.error(data.msg || '操作失败')
|
|
}
|
|
}).finally(() => {
|
|
this.approveLoading = false
|
|
})
|
|
},
|
|
// 流程预览
|
|
openFlowPreview() {
|
|
getFlowPreview({
|
|
flowCode: this.approveData.flowCode,
|
|
flowVersion: this.approveData.flowVersion,
|
|
site: this.approveData.site
|
|
}).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
this.previewData = data.row
|
|
this.previewDialogVisible = true
|
|
} else {
|
|
this.$message.error(data.msg || '获取流程信息失败')
|
|
}
|
|
})
|
|
},
|
|
// 重新审批 - rqrq
|
|
handleRestart(row) {
|
|
this.$confirm('确定要重新发起审批流程吗?', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
restartFlowInstance({
|
|
applyNo: row.applyNo,
|
|
site: row.site,
|
|
orderType: row.orderType
|
|
}).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
this.$message.success('重新审批成功')
|
|
this.getInstanceList()
|
|
this.nodeInstanceList = []
|
|
this.currentInstance = null
|
|
} else {
|
|
this.$message.error(data.msg || '操作失败')
|
|
}
|
|
})
|
|
}).catch(() => {})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
/deep/ .el-dialog__body {
|
|
padding: 10px 20px;
|
|
}
|
|
</style>
|