Files
zhgh_whcp/target/classes/views/platform/bpm/processDefine/index.html
T
2026-01-08 14:58:16 +08:00

370 lines
18 KiB
HTML

<!--#
layout("/layouts/platform.html"){
#-->
<style>
.flowchart-example-container {
width: 800px;
height: 400px;
background: white;
border: 1px solid #bbb;
margin-bottom: 10px;
}
</style>
<div id="app" v-cloak>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="名称">
<el-input placeholder="请输入名称" v-model="pageForm.displayName"></el-input>
</search-item>
<search-item label="编码">
<el-input placeholder="请输入编码" v-model="pageForm.name"></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool>
<el-button size="mini" icon="el-icon-plus" type="primary" @click="openAdd">新增</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" border style="width: 100%" row-key="id">
<el-table-column label="序号" width="50" type="index" :index="indexMethod"></el-table-column>
<el-table-column label="名称" prop="name"></el-table-column>
<el-table-column label="编码" prop="code"></el-table-column>
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-link size="mini" type="primary" @click="$refs.processViewerRef.onOpen(scope.row)">查看</el-link>
<el-link size="mini" type="primary" @click="openEdit(scope.row)">编辑</el-link>
<el-link size="mini" type="primary" @click="openNodeConfig(scope.row.id)">配置</el-link>
<el-link size="mini" type="danger" @click="doDelete(scope.row.id)">删除</el-link>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<el-dialog title="流程定义" width="30%" :close-on-click-modal="false" :visible.sync="dialogVisible">
<el-form :model="formData" ref="form" label-width="80px">
<el-form-item label="名称" prop="name" :rules="{required: true, message: '名称不能为空', trigger: 'blur'}">
<el-input v-model="formData.name" placeholder="名称"></el-input>
</el-form-item>
<el-form-item label="编码" prop="code" :rules="{required: true, message: '编码不能为空', trigger: 'blur'}">
<el-input v-model="formData.code" placeholder="编码"></el-input>
</el-form-item>
<el-form-item label="URL" prop="url" :rules="{required: true, message: 'URL不能为空', trigger: 'blur'}">
<el-input v-model="formData.url" placeholder="URL"></el-input>
</el-form-item>
<el-form-item label="H5URL" prop="h5url" :rules="{required: false, message: 'H5URL不能为空', trigger: 'blur'}">
<el-input v-model="formData.h5url" placeholder="H5URL"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doSubmit">确 定</el-button>
</div>
</el-dialog>
<el-dialog title="节点配置" width="80%" :close-on-click-modal="false" :visible.sync="nodeDialogVisible">
<el-form :model="nodeFormData" ref="nodeForm" label-width="120px" size="small">
<el-form-item label="节点配置" prop="nodeDefine">
<el-table :data="nodeFormData.nodes">
<el-table-column label="名称" prop="nodeName" fixed="left" min-width="180">
<template slot-scope="{row}">
<el-input v-model="row.nodeName" max="20" clearable></el-input>
</template>
</el-table-column>
<el-table-column label="编码" prop="nodeCode" width="100px">
<template slot-scope="{row}">
<el-input v-model="row.nodeCode" max="20" clearable></el-input>
</template>
</el-table-column>
<el-table-column label="节点类型" prop="nodeType" width="100px">
<template slot-scope="{row}">
<el-select v-model="row.nodeType" clearable>
<el-option value="START" label="开始"></el-option>
<el-option value="TASK" label="任务"></el-option>
<el-option value="BACK" label="退回"></el-option>
<el-option value="END" label="结束"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="完成类型" prop="nodeApprovalType" width="130px">
<template slot-scope="{row}">
<el-select v-model="row.nodeApprovalType" clearable>
<el-option value="NODE_APPLY" label="申请" v-if="row.nodeType==='START'"></el-option>
<el-option value="NODE_PENDING" label="待审批" v-if="row.nodeType==='TASK'"></el-option>
<el-option value="NODE_PASS" label="审批通过" v-if="row.nodeType==='END'"></el-option>
<el-option value="NODE_REJECT" label="审批拒绝" v-if="row.nodeType==='END'"></el-option>
<el-option value="NODE_BACK" label="审批退回" v-if="row.nodeType==='BACK'"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="参与类型" prop="nodePerformType" width="100px">
<template slot-scope="{row}">
<el-select v-model="row.nodePerformType" clearable v-if="['TASK','START','BACK'].includes(row.nodeType)">
<el-option value="ORDINARY" label="普通"></el-option>
<el-option value="COUNTERSIGN" label="会签" v-if="row.nodeType==='TASK'"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="通过下个节点" prop="passNextNodeId">
<template slot-scope="{row}">
<el-select v-model="row.passNextNodeId" clearable v-if="['TASK','START'].includes(row.nodeType)">
<el-option :value="item.id" :label="item.nodeName" :key="item.id" v-for="item in nodeFormData.nodes"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="拒绝下个节点" prop="rejectNextNodeId">
<template slot-scope="{row}">
<el-select v-model="row.rejectNextNodeId" clearable v-if="row.nodeType==='TASK'" :disabled="row.nodeType!=='TASK'">
<el-option :value="item.id" :label="item.nodeName" :key="item.id" v-for="item in nodeFormData.nodes"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="退回下个节点" prop="backNextNodeId">
<template slot-scope="{row}">
<el-select v-model="row.backNextNodeId" clearable v-if="row.nodeType==='TASK'" :disabled="row.nodeType!=='TASK'">
<el-option :value="item.id" :label="item.nodeName" :key="item.id" v-for="item in nodeFormData.nodes"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="动态决策表达式" prop="dynamicDecisions">
<template slot-scope="{row}">
<el-link type="primary" @click="openDynamicDecision(row)">点击配置</el-link>
</template>
</el-table-column>
<el-table-column label="更多配置" prop="moreConfig">
<template slot-scope="{row}">
<el-link type="primary" @click="openMoreConfig(row)">更多配置</el-link>
</template>
</el-table-column>
<el-table-column width="140px" fixed="right">
<template #header>
<el-button size="mini" icon="el-icon-plus" type="primary" @click="addNewNode">添加</el-button>
</template>
<template slot-scope="scope">
<el-link size="mini" type="danger" @click="nodeFormData.nodes.splice(scope.$index,1)">删除</el-link>
<el-link size="mini" type="primary" @click="upNode(scope.$index)" :disabled="scope.$index===0">上移</el-link>
<el-link
size="mini"
type="primary"
@click="downNode(scope.$index)"
:disabled="scope.$index===nodeFormData.nodes.length-1"
>
下移
</el-link>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
<!-- <el-button type="primary" @click="refreshNode">刷新</el-button>-->
<div slot="footer">
<el-button @click="nodeDialogVisible=false">取消</el-button>
<el-button type="primary" @click="doSubmitNodes">确定</el-button>
</div>
</el-dialog>
<el-dialog :title="dynamicDecisionNodeTitle" width="50%" :close-on-click-modal="false" :visible.sync="dynamicDecisionNodeDialogVisible">
<el-form :model="dynamicDecisionNodeFormData" ref="dynamicDecisionNodeForm" label-width="80px">
<el-table :data="dynamicDecisionNodeFormData.dynamicDecisions">
<el-table-column label="条件" prop="condition">
<template slot-scope="{row}">
<el-input v-model="row.condition" clearable></el-input>
</template>
</el-table-column>
<el-table-column label="说明" prop="desc">
<template slot-scope="{row}">
<el-input v-model="row.desc" clearable></el-input>
</template>
</el-table-column>
<el-table-column label="下个节点" prop="toNodeId">
<template slot-scope="{row}">
<el-select v-model="row.toNodeId" clearable>
<el-option :value="item.id" :label="item.nodeName" :key="item.id" v-for="item in nodeFormData.nodes"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-button size="mini" icon="el-icon-plus" type="primary" @click="dynamicDecisionNodeFormData.dynamicDecisions.push({})">
添加
</el-button>
</template>
<template slot-scope="scope">
<el-link size="mini" type="danger" @click="dynamicDecisionNodeFormData.dynamicDecisions.splice(scope.$index,1)">删除</el-link>
</template>
</el-table-column>
</el-table>
</el-form>
</el-dialog>
<el-dialog title="更多配置" width="50%" :close-on-click-modal="false" :visible.sync="moreConfigDialogVisible">
<el-form :model="moreConfigFormData" label-width="150px">
<el-form-item label="电脑端审核地址" prop="url" :rules="[{required:true,message:'请输入电脑端审核地址',trigger:['blur','change']}]">
<el-input v-model="moreConfigFormData.url" clearable placeholder="请输入电脑端审核地址"></el-input>
</el-form-item>
<el-form-item label="移动端审核地址">
<el-input v-model="moreConfigFormData.h5url" clearable placeholder="请输入移动端审核地址"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="moreConfigDialogVisible=false">取消</el-button>
<el-button type="primary" @click="doSubmitMoreConfig">确定</el-button>
</div>
</el-dialog>
<!-- <div id="chart_container">-->
<!-- <div class="flowchart-example-container" id="flowchartworkspace"></div>-->
<!-- </div>-->
</div>
<script nonce="${cspNonce!}">
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
dialogVisible: false,
nodeApprovalTypeOptions: [],
formData: {},
nodeDialogVisible: false,
nodeFormData: {
id: null,
nodes: []
},
dynamicDecisionNodeDialogVisible: false,
dynamicDecisionNodeFormData: {},
moreConfigDialogVisible: false,
moreConfigFormData: {}
}
},
computed: {
dynamicDecisionNodeTitle() {
return this.dynamicDecisionNodeFormData.nodeName
}
},
methods: {
openAdd() {
this.dialogVisible = true
this.formData = {}
},
openEdit(row) {
this.dialogVisible = true
this.formData = { ...row }
},
doSubmit() {
this.$refs.form.validate((valid) => {
if (valid) {
this.$axios
.post("/platform/bpm/processDefine/" + (this.formData.id ? "update" : "insert"), {
define: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.dialogVisible = false
this.doSearch()
}
})
}
})
},
doDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/platform/bpm/processDefine/delete", { id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
openNodeConfig(id) {
this.nodeFormData.id = id
this.nodeDialogVisible = true
this.$axios.post("/platform/bpm/processDefine/nodes", { id }).then((res) => {
if (res.code === 0) {
this.nodeFormData.nodes = res.data
}
})
},
addNewNode() {
this.$axios
.post("/platform/bpm/processDefine/generateNodeId", {
ids: JSON.stringify(this.nodeFormData.nodes.map((item) => item.id))
})
.then((res) => {
if (res.code === 0) {
this.nodeFormData.nodes.push({
id: res.data
})
}
})
},
openDynamicDecision(row) {
this.dynamicDecisionNodeFormData = row
if (!this.dynamicDecisionNodeFormData.dynamicDecisions) {
this.dynamicDecisionNodeFormData.dynamicDecisions = []
}
this.dynamicDecisionNodeDialogVisible = true
},
doSubmitNodes() {
this.$axios
.post("/platform/bpm/processDefine/updateSubmitNodes", {
define: JSON.stringify(this.nodeFormData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
},
openMoreConfig(row) {
this.moreConfigFormData = { ...row }
console.log(this.moreConfigFormData)
this.moreConfigDialogVisible = true
},
doSubmitMoreConfig() {
this.nodeFormData.nodes.forEach((item) => {
if (item.id === this.moreConfigFormData.id) {
item.url = this.moreConfigFormData.url
item.h5url = this.moreConfigFormData.h5url
}
})
this.moreConfigDialogVisible = false
},
//上移node
upNode(index) {
this.nodeFormData.nodes.splice(index - 1, 0, this.nodeFormData.nodes.splice(index, 1)[0])
},
downNode(index) {
this.nodeFormData.nodes.splice(index + 1, 0, this.nodeFormData.nodes.splice(index, 1)[0])
},
refreshNode() {}
},
mounted() {},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->