@ -1,54 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询测试单表列表
|
||||
export function listDemo(query) {
|
||||
return request({
|
||||
url: '/demo/demo/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 自定义分页接口
|
||||
export function pageDemo(query) {
|
||||
return request({
|
||||
url: '/demo/demo/page',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询测试单表详细
|
||||
export function getDemo(id) {
|
||||
return request({
|
||||
url: '/demo/demo/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增测试单表
|
||||
export function addDemo(data) {
|
||||
return request({
|
||||
url: '/demo/demo',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改测试单表
|
||||
export function updateDemo(data) {
|
||||
return request({
|
||||
url: '/demo/demo',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除测试单表
|
||||
export function delDemo(id) {
|
||||
return request({
|
||||
url: '/demo/demo/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
@ -1,44 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询请假业务列表
|
||||
export function listLeave(query) {
|
||||
return request({
|
||||
url: '/demo/leave/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询请假业务详细
|
||||
export function getLeave(id) {
|
||||
return request({
|
||||
url: '/demo/leave/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增请假业务
|
||||
export function addLeave(data) {
|
||||
return request({
|
||||
url: '/demo/leave',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改请假业务
|
||||
export function updateLeave(data) {
|
||||
return request({
|
||||
url: '/demo/leave',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除请假业务
|
||||
export function delLeave(id) {
|
||||
return request({
|
||||
url: '/demo/leave/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询测试树表列表
|
||||
export function listTree(query) {
|
||||
return request({
|
||||
url: '/demo/tree/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询测试树表详细
|
||||
export function getTree(id) {
|
||||
return request({
|
||||
url: '/demo/tree/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增测试树表
|
||||
export function addTree(data) {
|
||||
return request({
|
||||
url: '/demo/tree',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改测试树表
|
||||
export function updateTree(data) {
|
||||
return request({
|
||||
url: '/demo/tree',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除测试树表
|
||||
export function delTree(id) {
|
||||
return request({
|
||||
url: '/demo/tree/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询部门列表
|
||||
export function listDept(query) {
|
||||
return request({
|
||||
url: '/system/dept/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询部门列表(排除节点)
|
||||
export function listDeptExcludeChild(deptId) {
|
||||
return request({
|
||||
url: '/system/dept/list/exclude/' + deptId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询部门详细
|
||||
export function getDept(deptId) {
|
||||
return request({
|
||||
url: '/system/dept/' + deptId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增部门
|
||||
export function addDept(data) {
|
||||
return request({
|
||||
url: '/system/dept',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改部门
|
||||
export function updateDept(data) {
|
||||
return request({
|
||||
url: '/system/dept',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除部门
|
||||
export function delDept(deptId) {
|
||||
return request({
|
||||
url: '/system/dept/' + deptId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询机构列表
|
||||
export function listSysOrg(query) {
|
||||
return request({
|
||||
url: '/system/org/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询机构列表(排除节点)
|
||||
export function listSysOrgExcludeChild(orgId) {
|
||||
return request({
|
||||
url: '/system/org/list/exclude/' + orgId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询机构详细
|
||||
export function getSysOrg(orgId) {
|
||||
return request({
|
||||
url: '/system/org/' + orgId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增机构
|
||||
export function addSysOrg(data) {
|
||||
return request({
|
||||
url: '/system/org',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改机构
|
||||
export function updateSysOrg(data) {
|
||||
return request({
|
||||
url: '/system/org',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除机构
|
||||
export function delSysOrg(orgId) {
|
||||
return request({
|
||||
url: '/system/org/' + orgId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
@ -1,119 +1,119 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询角色列表
|
||||
export function listRole(query) {
|
||||
return request({
|
||||
url: '/system/role/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询角色详细
|
||||
export function getRole(roleId) {
|
||||
return request({
|
||||
url: '/system/role/' + roleId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增角色
|
||||
export function addRole(data) {
|
||||
return request({
|
||||
url: '/system/role',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改角色
|
||||
export function updateRole(data) {
|
||||
return request({
|
||||
url: '/system/role',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 角色数据权限
|
||||
export function dataScope(data) {
|
||||
return request({
|
||||
url: '/system/role/dataScope',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 角色状态修改
|
||||
export function changeRoleStatus(roleId, status) {
|
||||
const data = {
|
||||
roleId,
|
||||
status
|
||||
}
|
||||
return request({
|
||||
url: '/system/role/changeStatus',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除角色
|
||||
export function delRole(roleId) {
|
||||
return request({
|
||||
url: '/system/role/' + roleId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询角色已授权用户列表
|
||||
export function allocatedUserList(query) {
|
||||
return request({
|
||||
url: '/system/role/authUser/allocatedList',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询角色未授权用户列表
|
||||
export function unallocatedUserList(query) {
|
||||
return request({
|
||||
url: '/system/role/authUser/unallocatedList',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 取消用户授权角色
|
||||
export function authUserCancel(data) {
|
||||
return request({
|
||||
url: '/system/role/authUser/cancel',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 批量取消用户授权角色
|
||||
export function authUserCancelAll(data) {
|
||||
return request({
|
||||
url: '/system/role/authUser/cancelAll',
|
||||
method: 'put',
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
||||
// 授权用户选择
|
||||
export function authUserSelectAll(data) {
|
||||
return request({
|
||||
url: '/system/role/authUser/selectAll',
|
||||
method: 'put',
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
||||
// 根据角色ID查询部门树结构
|
||||
export function deptTreeSelect(roleId) {
|
||||
return request({
|
||||
url: '/system/role/deptTree/' + roleId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询角色列表
|
||||
export function listRole(query) {
|
||||
return request({
|
||||
url: '/system/role/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询角色详细
|
||||
export function getRole(roleId) {
|
||||
return request({
|
||||
url: '/system/role/' + roleId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增角色
|
||||
export function addRole(data) {
|
||||
return request({
|
||||
url: '/system/role',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改角色
|
||||
export function updateRole(data) {
|
||||
return request({
|
||||
url: '/system/role',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 角色数据权限
|
||||
export function dataScope(data) {
|
||||
return request({
|
||||
url: '/system/role/dataScope',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 角色状态修改
|
||||
export function changeRoleStatus(roleId, status) {
|
||||
const data = {
|
||||
roleId,
|
||||
status
|
||||
}
|
||||
return request({
|
||||
url: '/system/role/changeStatus',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除角色
|
||||
export function delRole(roleId) {
|
||||
return request({
|
||||
url: '/system/role/' + roleId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询角色已授权用户列表
|
||||
export function allocatedUserList(query) {
|
||||
return request({
|
||||
url: '/system/role/authUser/allocatedList',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询角色未授权用户列表
|
||||
export function unallocatedUserList(query) {
|
||||
return request({
|
||||
url: '/system/role/authUser/unallocatedList',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 取消用户授权角色
|
||||
export function authUserCancel(data) {
|
||||
return request({
|
||||
url: '/system/role/authUser/cancel',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 批量取消用户授权角色
|
||||
export function authUserCancelAll(data) {
|
||||
return request({
|
||||
url: '/system/role/authUser/cancelAll',
|
||||
method: 'put',
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
||||
// 授权用户选择
|
||||
export function authUserSelectAll(data) {
|
||||
return request({
|
||||
url: '/system/role/authUser/selectAll',
|
||||
method: 'put',
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
||||
// 根据角色ID查询机构树结构
|
||||
export function sysOrgTreeSelect(roleId) {
|
||||
return request({
|
||||
url: '/system/role/orgTree/' + roleId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
@ -1,31 +0,0 @@
|
||||
import request from "@/utils/request";
|
||||
|
||||
export function add(data) {
|
||||
return request({
|
||||
url: '/workflow/actNodeAssignee',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function del(id) {
|
||||
return request({
|
||||
url: '/workflow/actNodeAssignee/'+id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
export function getInfoSetting(processDefinitionId,nodeId) {
|
||||
return request({
|
||||
url: `/workflow/actNodeAssignee/${processDefinitionId}/${nodeId}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function copy(processDefinitionId,key) {
|
||||
return request({
|
||||
url: `/workflow/actNodeAssignee/copy/${processDefinitionId}/${key}`,
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
|
@ -1,44 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询业务表单列表
|
||||
export function listBusinessForm(query) {
|
||||
return request({
|
||||
url: '/workflow/businessForm/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询业务表单详细
|
||||
export function getBusinessForm(id) {
|
||||
return request({
|
||||
url: '/workflow/businessForm/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增业务表单
|
||||
export function addBusinessForm(data) {
|
||||
return request({
|
||||
url: '/workflow/businessForm',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改业务表单
|
||||
export function updateBusinessForm(data) {
|
||||
return request({
|
||||
url: '/workflow/businessForm',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除业务表单
|
||||
export function delBusinessForm(id) {
|
||||
return request({
|
||||
url: '/workflow/businessForm/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询业务规则列表
|
||||
export function listBusinessRule(query) {
|
||||
return request({
|
||||
url: '/workflow/businessRule/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询业务规则详细
|
||||
export function getBusinessRule(id) {
|
||||
return request({
|
||||
url: '/workflow/businessRule/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增业务规则
|
||||
export function addbusinessRule(data) {
|
||||
return request({
|
||||
url: '/workflow/businessRule',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改业务规则
|
||||
export function updateBusinessRule(data) {
|
||||
return request({
|
||||
url: '/workflow/businessRule',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除业务规则
|
||||
export function delBusinessRule(id) {
|
||||
return request({
|
||||
url: '/workflow/businessRule/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
@ -1,90 +0,0 @@
|
||||
import request from "@/utils/request";
|
||||
/**
|
||||
* 分页查询
|
||||
* @param {条件} query
|
||||
* @returns
|
||||
*/
|
||||
export function list(query) {
|
||||
return request({
|
||||
url: '/workflow/definition/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询
|
||||
* @param {条件} query
|
||||
* @returns
|
||||
*/
|
||||
export function hisList(query) {
|
||||
return request({
|
||||
url: '/workflow/definition/hisList',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {参数} data
|
||||
* @returns
|
||||
*/
|
||||
export function updateProcDefState(data) {
|
||||
return request({
|
||||
url: '/workflow/definition/updateProcDefState',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 按流程部署id删除
|
||||
* @param {流程部署id} deploymentId
|
||||
* @returns
|
||||
*/
|
||||
export function del(deploymentId,definitionId) {
|
||||
return request({
|
||||
url: `/workflow/definition/${deploymentId}/${definitionId}`,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过zip或xml部署流程定义
|
||||
* @returns
|
||||
*/
|
||||
export function deployProcessFile(data) {
|
||||
return request({
|
||||
url: '/workflow/definition/deployByFile',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {流程定义设置} definitionId
|
||||
* @returns
|
||||
*/
|
||||
export function setting(definitionId) {
|
||||
return request({
|
||||
url: '/workflow/definition/setting/'+definitionId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {查看xml} definitionId
|
||||
* @returns
|
||||
*/
|
||||
export function getXml(definitionId) {
|
||||
return request({
|
||||
url: '/workflow/definition/getXml/'+definitionId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,62 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询流程单列表
|
||||
export function listDynamicForm(query) {
|
||||
return request({
|
||||
url: '/workflow/dynamicForm/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询启用流程单列表
|
||||
export function listDynamicFormEnable(query) {
|
||||
return request({
|
||||
url: '/workflow/dynamicForm/enableList',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询流程单详细
|
||||
export function getDynamicForm(id) {
|
||||
return request({
|
||||
url: '/workflow/dynamicForm/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增流程单
|
||||
export function addDynamicForm(data) {
|
||||
return request({
|
||||
url: '/workflow/dynamicForm',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改流程单
|
||||
export function updateDynamicForm(data) {
|
||||
return request({
|
||||
url: '/workflow/dynamicForm',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改流程单
|
||||
export function editForm(data) {
|
||||
return request({
|
||||
url: '/workflow/dynamicForm/editForm',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除流程单
|
||||
export function delDynamicForm(id) {
|
||||
return request({
|
||||
url: '/workflow/dynamicForm/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
@ -1,68 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询消息通知列表
|
||||
export function listMessage(query) {
|
||||
return request({
|
||||
url: '/workflow/message/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 获取个人站内信
|
||||
export function listWaitingMessage() {
|
||||
return request({
|
||||
url: '/workflow/message/waitingMessage',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询消息通知详细
|
||||
export function getMessage(id) {
|
||||
return request({
|
||||
url: '/workflow/message/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增消息通知
|
||||
export function addMessage(data) {
|
||||
return request({
|
||||
url: '/workflow/message',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改消息通知
|
||||
export function updateMessage(data) {
|
||||
return request({
|
||||
url: '/workflow/message',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除消息通知
|
||||
export function delMessage(id) {
|
||||
return request({
|
||||
url: '/workflow/message/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 阅读消息
|
||||
export function readMessage(id) {
|
||||
return request({
|
||||
url: '/workflow/message/readMessage/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 批量阅读消息
|
||||
export function batchReadMessage(id) {
|
||||
return request({
|
||||
url: '/workflow/message/batchReadMessage',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
@ -1,110 +0,0 @@
|
||||
import request from "@/utils/request";
|
||||
/**
|
||||
* 分页查询
|
||||
* @param {条件} query
|
||||
* @returns
|
||||
*/
|
||||
export function list(query) {
|
||||
return request({
|
||||
url: '/workflow/model/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增模型定义
|
||||
* @param {传输的数据}} data
|
||||
* @returns
|
||||
*/
|
||||
export function add(data) {
|
||||
return request({
|
||||
url: '/workflow/model',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 按id删除模型
|
||||
* @param {模型id} id
|
||||
* @returns
|
||||
*/
|
||||
export function del(id) {
|
||||
return request({
|
||||
url: '/workflow/model/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 流程部署
|
||||
* @param {模型id} id
|
||||
* @returns
|
||||
*/
|
||||
export function deploy(id) {
|
||||
return request({
|
||||
url: '/workflow/model/deploy/' + id,
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
/**
|
||||
* 将流程定义转换为模型
|
||||
* @param {流程定义id} processDefinitionId
|
||||
* @returns
|
||||
*/
|
||||
export function convertToModel(processDefinitionId) {
|
||||
return request({
|
||||
url: '/workflow/model/convertToModel/' + processDefinitionId,
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询模型xml
|
||||
* @param {模型id} modelId
|
||||
* @returns
|
||||
*/
|
||||
export function getEditorXml(modelId) {
|
||||
return request({
|
||||
url: `workflow/model/getInfo/${modelId}/xml`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存模型
|
||||
* @param {参数} data
|
||||
* @returns
|
||||
*/
|
||||
export function saveModelXml(data) {
|
||||
return request({
|
||||
url: `workflow/model`,
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export function getModelInfo(modelId) {
|
||||
return request({
|
||||
url: `model/${modelId}/json`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function newModel(data) {
|
||||
return request({
|
||||
url: `model/newModel`,
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function editModelInfo(modelId,data) {
|
||||
return request({
|
||||
url: `/model/${modelId}/save`,
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
@ -1,60 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询流程定义与单配置列表
|
||||
export function listProcessDefSetting(query) {
|
||||
return request({
|
||||
url: '/workflow/processDefSetting/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询流程定义与单配置详细
|
||||
export function getProcessDefSetting(id) {
|
||||
return request({
|
||||
url: '/workflow/processDefSetting/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 按流程定义id查询流程定义与单配置详细
|
||||
export function getProcessDefSettingByDefId(id) {
|
||||
return request({
|
||||
url: '/workflow/processDefSetting/getProcessDefSettingByDefId/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 校验表单是否关联
|
||||
export function checkProcessDefSetting(defId,param,businessType) {
|
||||
return request({
|
||||
url: `/workflow/processDefSetting/checkProcessDefSetting/${defId}/${param}/${businessType}` ,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增流程定义与单配置
|
||||
export function addProcessDefSetting(data) {
|
||||
return request({
|
||||
url: '/workflow/processDefSetting',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改流程定义与单配置
|
||||
export function updateProcessDefSetting(data) {
|
||||
return request({
|
||||
url: '/workflow/processDefSetting',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除流程定义与单配置
|
||||
export function delProcessDefSetting(id) {
|
||||
return request({
|
||||
url: '/workflow/processDefSetting/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
@ -1,92 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export default {
|
||||
// 提交申请 ,启动流程申请
|
||||
startProcessApply(data) {
|
||||
return request({
|
||||
url: '/workflow/processInstance/startWorkFlow',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
},
|
||||
|
||||
// 通过流程实例id查询流程审批记录
|
||||
getHistoryInfoList(processInstId) {
|
||||
return request({
|
||||
url: '/workflow/processInstance/getHistoryInfoList/'+processInstId,
|
||||
method: 'get'
|
||||
})
|
||||
},
|
||||
|
||||
// 通过流程实例id获取历史流程图
|
||||
getHistoryProcessImage(processInstId) {
|
||||
return process.env.VUE_APP_BASE_API+`/workflow/processInstance/getHistoryProcessImage?processInstId=${processInstId}&t=` + Math.random()
|
||||
},
|
||||
|
||||
// 通过业务id查询流程实例
|
||||
getInfoByBusinessKey(businessKey) {
|
||||
return request({
|
||||
url: '/workflow/actBusiness/getInfoByBusinessKey/'+businessKey,
|
||||
method: 'get'
|
||||
})
|
||||
},
|
||||
|
||||
// 查询正在运行的流程实例
|
||||
getProcessInstRunningByPage(query) {
|
||||
return request({
|
||||
url: '/workflow/processInstance/getProcessInstRunningByPage',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
},
|
||||
|
||||
// 挂起或激活流程实例
|
||||
state(data) {
|
||||
return request({
|
||||
url: '/workflow/processInstance/state',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
},
|
||||
|
||||
// 作废流程实例,不会删除历史记录
|
||||
deleteRuntimeProcessInst(processInstId) {
|
||||
return request({
|
||||
url: '/workflow/processInstance/deleteRuntimeProcessInst/'+processInstId,
|
||||
method: 'delete'
|
||||
})
|
||||
},
|
||||
|
||||
// 删除运行中的实例,删除历史记录,删除业务与流程关联信息
|
||||
deleteRuntimeProcessAndHisInst(processInstId) {
|
||||
return request({
|
||||
url: '/workflow/processInstance/deleteRuntimeProcessAndHisInst/'+processInstId,
|
||||
method: 'delete'
|
||||
})
|
||||
},
|
||||
|
||||
// 删除已完成的实例,删除历史记录,删除业务与流程关联信息
|
||||
deleteFinishProcessAndHisInst(processInstId) {
|
||||
return request({
|
||||
url: '/workflow/processInstance/deleteFinishProcessAndHisInst/'+processInstId,
|
||||
method: 'delete'
|
||||
})
|
||||
},
|
||||
|
||||
// 撤销申请
|
||||
cancelProcessApply(processInstanceId) {
|
||||
return request({
|
||||
url: '/workflow/processInstance/cancelProcessApply/'+processInstanceId,
|
||||
method: 'get'
|
||||
})
|
||||
},
|
||||
|
||||
// 查询已完成的流程实例
|
||||
getProcessInstFinishByPage(query) {
|
||||
return request({
|
||||
url: '/workflow/processInstance/getProcessInstFinishByPage',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
}
|
@ -1,151 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export default {
|
||||
|
||||
// 查询当前用户的待办任务
|
||||
getTaskWaitByPage(query) {
|
||||
return request({
|
||||
url: '/workflow/task/getTaskWaitByPage',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
},
|
||||
|
||||
// 查询当前用户的已办任务
|
||||
getTaskFinishByPage(query) {
|
||||
return request({
|
||||
url: '/workflow/task/getTaskFinishByPage',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
},
|
||||
|
||||
// 查询所有用户的待办任务
|
||||
getAllTaskWaitByPage(query) {
|
||||
return request({
|
||||
url: '/workflow/task/getAllTaskWaitByPage',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
},
|
||||
|
||||
// 查询所有用户的已办任务
|
||||
getAllTaskFinishByPage(query) {
|
||||
return request({
|
||||
url: '/workflow/task/getAllTaskFinishByPage',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
},
|
||||
|
||||
// 完成任务
|
||||
completeTask(data) {
|
||||
return request({
|
||||
url: '/workflow/task/completeTask',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
},
|
||||
|
||||
// 获取目标节点(下一个节点)
|
||||
getNextNodeInfo(data) {
|
||||
return request({
|
||||
url: '/workflow/task/getNextNodeInfo',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
},
|
||||
|
||||
// 获取历史任务节点,用于驳回功能
|
||||
getBackNodes(processInstId) {
|
||||
return request({
|
||||
url: '/workflow/task/getBackNodes/'+processInstId,
|
||||
method: 'get'
|
||||
})
|
||||
},
|
||||
|
||||
// 驳回审批
|
||||
backProcess(data) {
|
||||
return request({
|
||||
url: '/workflow/task/backProcess',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
},
|
||||
// 删除执行后的节点
|
||||
deleteByNodeIds(data) {
|
||||
return request({
|
||||
url: '/workflow/task/deleteByNodeIds',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
},
|
||||
// 签收任务
|
||||
claim(taskId) {
|
||||
return request({
|
||||
url: '/workflow/task/claim/'+taskId,
|
||||
method: 'post'
|
||||
})
|
||||
},
|
||||
// 归还任务
|
||||
returnTask(taskId) {
|
||||
return request({
|
||||
url: '/workflow/task/returnTask/'+taskId,
|
||||
method: 'post'
|
||||
})
|
||||
},
|
||||
// 委托任务
|
||||
delegateTask(data) {
|
||||
return request({
|
||||
url: '/workflow/task/delegateTask',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
},
|
||||
// 转办任务
|
||||
transmitTask(data) {
|
||||
return request({
|
||||
url: '/workflow/task/transmitTask',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
},
|
||||
// 会签任务加签
|
||||
addMultiInstanceExecution(data) {
|
||||
return request({
|
||||
url: '/workflow/task/addMultiInstanceExecution',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
},
|
||||
// 会签任务减签
|
||||
deleteMultiInstanceExecution(data) {
|
||||
return request({
|
||||
url: '/workflow/task/deleteMultiInstanceExecution',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
},
|
||||
// 会签任务减签
|
||||
updateAssignee(data) {
|
||||
return request({
|
||||
url: '/workflow/task/updateAssignee',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
},
|
||||
//查询流程变量
|
||||
getProcessInstVariable(taskId) {
|
||||
return request({
|
||||
url: '/workflow/task/getProcessInstVariable/'+taskId,
|
||||
method: 'get'
|
||||
})
|
||||
},
|
||||
//修改审批意见
|
||||
editComment(commentId,comment) {
|
||||
return request({
|
||||
url: `/workflow/task/editComment/${commentId}/${comment}`,
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询工作流接口用户
|
||||
export function getWorkflowUserListByPage(data) {
|
||||
return request({
|
||||
url: '/workflow/user/getWorkflowUserListByPage',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
// 分页查询工作流选择加签人员
|
||||
export function getWorkflowAddMultiListByPage(data) {
|
||||
return request({
|
||||
url: '/workflow/user/getWorkflowAddMultiListByPage',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
Before Width: | Height: | Size: 453 KiB |
Before Width: | Height: | Size: 458 B |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 90 KiB |
Before Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 816 B |
Before Width: | Height: | Size: 776 B |
Before Width: | Height: | Size: 729 B |
Before Width: | Height: | Size: 774 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.0 KiB |
@ -1,68 +0,0 @@
|
||||
/**
|
||||
* 存储流程设计相关参数
|
||||
*/
|
||||
export default class BpmData {
|
||||
constructor() {
|
||||
this.controls = [] // 设计器控件
|
||||
this.init()
|
||||
}
|
||||
|
||||
init() {
|
||||
this.controls = [
|
||||
{
|
||||
action: 'create.start-event',
|
||||
title: '开始'
|
||||
},
|
||||
{
|
||||
action: 'create.intermediate-event',
|
||||
title: '中间'
|
||||
},
|
||||
{
|
||||
action: 'create.end-event',
|
||||
title: '结束'
|
||||
},
|
||||
{
|
||||
action: 'create.exclusive-gateway',
|
||||
title: '网关'
|
||||
},
|
||||
{
|
||||
action: 'create.task',
|
||||
title: '任务'
|
||||
},
|
||||
{
|
||||
action: 'create.user-task',
|
||||
title: '用户任务'
|
||||
},
|
||||
{
|
||||
action: 'create.user-sign-task',
|
||||
title: '会签任务'
|
||||
},
|
||||
{
|
||||
action: 'create.subprocess-expanded',
|
||||
title: '子流程'
|
||||
},
|
||||
{
|
||||
action: 'create.data-object',
|
||||
title: '数据对象'
|
||||
},
|
||||
{
|
||||
action: 'create.data-store',
|
||||
title: '数据存储'
|
||||
},
|
||||
{
|
||||
action: 'create.participant-expanded',
|
||||
title: '扩展流程'
|
||||
},
|
||||
{
|
||||
action: 'create.group',
|
||||
title: '分组'
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
// 获取控件配置信息
|
||||
getControl(action) {
|
||||
const result = this.controls.filter(item => item.action === action)
|
||||
return result[0] || {}
|
||||
}
|
||||
}
|
@ -1,164 +0,0 @@
|
||||
<template>
|
||||
<div ref="propertyPanel" class="property-panel">
|
||||
<div v-if="nodeName" class="node-name">{{ nodeName }}</div>
|
||||
<component
|
||||
:is="getComponent"
|
||||
v-if="element"
|
||||
:element="element"
|
||||
:modeler="modeler"
|
||||
:users="users"
|
||||
:groups="groups"
|
||||
:categorys="categorys"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import taskPanel from './components/nodePanel/task.vue'
|
||||
import startEndPanel from './components/nodePanel/startEnd.vue'
|
||||
import processPanel from './components/nodePanel/process.vue'
|
||||
import sequenceFlowPanel from './components/nodePanel/sequenceFlow.vue'
|
||||
import gatewayPanel from './components/nodePanel/gateway.vue'
|
||||
import { NodeName } from './lang/zh'
|
||||
|
||||
export default {
|
||||
name: 'PropertyPanel',
|
||||
components: { processPanel, taskPanel, startEndPanel, sequenceFlowPanel, gatewayPanel },
|
||||
props: {
|
||||
users: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
groups: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
categorys: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
modeler: {
|
||||
type: Object,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
element: null,
|
||||
form: {
|
||||
id: '',
|
||||
name: '',
|
||||
color: null
|
||||
},
|
||||
roles: [
|
||||
{ value: 'manager', label: '经理' },
|
||||
{ value: 'personnel', label: '人事' },
|
||||
{ value: 'charge', label: '主管' }
|
||||
]
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
getComponent() {
|
||||
const type = this.element?.type
|
||||
if (['bpmn:IntermediateThrowEvent', 'bpmn:StartEvent', 'bpmn:EndEvent'].includes(type)) {
|
||||
return 'startEndPanel'
|
||||
}
|
||||
if ([
|
||||
'bpmn:UserTask',
|
||||
'bpmn:Task',
|
||||
'bpmn:SendTask',
|
||||
'bpmn:ReceiveTask',
|
||||
'bpmn:ManualTask',
|
||||
'bpmn:BusinessRuleTask',
|
||||
'bpmn:ServiceTask',
|
||||
'bpmn:ScriptTask'
|
||||
// 'bpmn:CallActivity',
|
||||
// 'bpmn:SubProcess'
|
||||
].includes(type)) {
|
||||
return 'taskPanel'
|
||||
}
|
||||
if (type === 'bpmn:SequenceFlow') {
|
||||
return 'sequenceFlowPanel'
|
||||
}
|
||||
if ([
|
||||
'bpmn:InclusiveGateway',
|
||||
'bpmn:ExclusiveGateway',
|
||||
'bpmn:ParallelGateway',
|
||||
'bpmn:EventBasedGateway'
|
||||
].includes(type)) {
|
||||
return 'gatewayPanel'
|
||||
}
|
||||
if (type === 'bpmn:Process') {
|
||||
return 'processPanel'
|
||||
}
|
||||
return null
|
||||
},
|
||||
nodeName() {
|
||||
if (this.element) {
|
||||
const bizObj = this.element.businessObject
|
||||
const type = bizObj?.eventDefinitions
|
||||
? bizObj.eventDefinitions[0].$type
|
||||
: bizObj.$type
|
||||
return NodeName[type] || type
|
||||
}
|
||||
return ''
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.handleModeler()
|
||||
},
|
||||
methods: {
|
||||
handleModeler() {
|
||||
this.modeler.on('root.added', e => {
|
||||
if (e.element.type === 'bpmn:Process') {
|
||||
this.element = null
|
||||
this.$nextTick().then(() => {
|
||||
this.element = e.element
|
||||
})
|
||||
}
|
||||
})
|
||||
this.modeler.on('element.click', e => {
|
||||
const { element } = e
|
||||
console.log(element)
|
||||
if (element.type === 'bpmn:Process') {
|
||||
this.element = element
|
||||
}
|
||||
})
|
||||
this.modeler.on('selection.changed', e => {
|
||||
// hack 同类型面板不刷新
|
||||
this.element = null
|
||||
const element = e.newSelection[0]
|
||||
if (element) {
|
||||
this.$nextTick().then(() => {
|
||||
this.element = element
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.property-panel {
|
||||
padding: 20px 20px;
|
||||
// reset element css
|
||||
.el-form--label-top .el-form-item__label {
|
||||
padding: 0;
|
||||
}
|
||||
.el-form-item {
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.tab-table .el-form-item {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.node-name{
|
||||
border-bottom: 1px solid #ccc;
|
||||
padding: 0 0 10px 20px;
|
||||
margin-bottom: 10px;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
color: #444;
|
||||
}
|
||||
}
|
||||
</style>
|
@ -1,20 +0,0 @@
|
||||
import translations from '../lang/zh'
|
||||
|
||||
export default function customTranslate(template, replacements) {
|
||||
replacements = replacements || {}
|
||||
|
||||
// Translate
|
||||
template = translations[template] || template
|
||||
|
||||
// Replace
|
||||
return template.replace(/{([^}]+)}/g, function(_, key) {
|
||||
var str = replacements[key]
|
||||
if (
|
||||
translations[replacements[key]] !== null &&
|
||||
translations[replacements[key]] !== 'undefined'
|
||||
) {
|
||||
str = translations[replacements[key]]
|
||||
}
|
||||
return str || '{' + key + '}'
|
||||
})
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
|
||||
import executionListenerDialog from '../components/nodePanel/property/executionListener'
|
||||
export default {
|
||||
components: {
|
||||
executionListenerDialog
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
executionListenerLength: 0,
|
||||
dialogName: null
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
computedExecutionListenerLength() {
|
||||
this.executionListenerLength = this.element.businessObject.extensionElements?.values?.length ?? 0
|
||||
},
|
||||
finishExecutionListener() {
|
||||
if (this.dialogName === 'executionListenerDialog') {
|
||||
this.computedExecutionListenerLength()
|
||||
}
|
||||
this.dialogName = ''
|
||||
}
|
||||
}
|
||||
}
|
@ -1,70 +0,0 @@
|
||||
import xcrud from 'xcrud'
|
||||
import golbalConfig from 'xcrud/package/common/config'
|
||||
import showConfig from '../flowable/showConfig'
|
||||
golbalConfig.set({
|
||||
input: {
|
||||
// size: 'mini'
|
||||
},
|
||||
select: {
|
||||
// size: 'mini'
|
||||
},
|
||||
colorPicker: {
|
||||
showAlpha: true
|
||||
},
|
||||
xform: {
|
||||
form: {
|
||||
labelWidth: 'auto'
|
||||
// size: 'mini'
|
||||
}
|
||||
}
|
||||
})
|
||||
export default {
|
||||
components: { xForm: xcrud.xForm },
|
||||
props: {
|
||||
modeler: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
element: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
categorys: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'formData.id': function(val) {
|
||||
this.updateProperties({ id: val })
|
||||
},
|
||||
'formData.name': function(val) {
|
||||
this.updateProperties({ name: val })
|
||||
},
|
||||
'formData.documentation': function(val) {
|
||||
if (!val) {
|
||||
this.updateProperties({ documentation: [] })
|
||||
return
|
||||
}
|
||||
const documentationElement = this.modeler.get('moddle').create('bpmn:Documentation', { text: val })
|
||||
this.updateProperties({ documentation: [documentationElement] })
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
updateProperties(properties) {
|
||||
const modeling = this.modeler.get('modeling')
|
||||
modeling.updateProperties(this.element, properties)
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
elementType() {
|
||||
const bizObj = this.element.businessObject
|
||||
return bizObj.eventDefinitions
|
||||
? bizObj.eventDefinitions[0].$type
|
||||
: bizObj.$type
|
||||
},
|
||||
showConfig() {
|
||||
return showConfig[this.elementType] || {}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
import xcrud from 'xcrud'
|
||||
import golbalConfig from 'xcrud/package/common/config'
|
||||
golbalConfig.set({
|
||||
input: {
|
||||
// size: 'mini'
|
||||
},
|
||||
select: {
|
||||
// size: 'mini'
|
||||
},
|
||||
colorPicker: {
|
||||
showAlpha: true
|
||||
},
|
||||
xform: {
|
||||
form: {
|
||||
labelWidth: 'auto'
|
||||
// size: 'mini'
|
||||
}
|
||||
}
|
||||
})
|
||||
export default {
|
||||
components: { xForm: xcrud.xForm }
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
export default class CustomContextPad {
|
||||
constructor(config, contextPad, create, elementFactory, injector, translate) {
|
||||
this.create = create;
|
||||
this.elementFactory = elementFactory;
|
||||
this.translate = translate;
|
||||
|
||||
if (config.autoPlace !== false) {
|
||||
this.autoPlace = injector.get('autoPlace', false);
|
||||
}
|
||||
|
||||
contextPad.registerProvider(this); // 定义这是一个contextPad
|
||||
}
|
||||
|
||||
getContextPadEntries(element) {}
|
||||
}
|
||||
|
||||
CustomContextPad.$inject = [
|
||||
'config',
|
||||
'contextPad',
|
||||
'create',
|
||||
'elementFactory',
|
||||
'injector',
|
||||
'translate'
|
||||
];
|
@ -1,81 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<x-form ref="xForm" v-model="formData" :config="formConfig">
|
||||
<template #executionListener>
|
||||
<el-badge :value="executionListenerLength">
|
||||
<el-button size="small" @click="dialogName = 'executionListenerDialog'">编辑</el-button>
|
||||
</el-badge>
|
||||
</template>
|
||||
</x-form>
|
||||
<executionListenerDialog
|
||||
v-if="dialogName === 'executionListenerDialog'"
|
||||
:element="element"
|
||||
:modeler="modeler"
|
||||
@close="finishExecutionListener"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import mixinPanel from '../../common/mixinPanel'
|
||||
import mixinExecutionListener from '../../common/mixinExecutionListener'
|
||||
import { commonParse } from '../../common/parseElement'
|
||||
export default {
|
||||
mixins: [mixinPanel, mixinExecutionListener],
|
||||
data() {
|
||||
return {
|
||||
formData: {}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
formConfig() {
|
||||
return {
|
||||
inline: false,
|
||||
item: [
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'id',
|
||||
label: '节点 id',
|
||||
rules: [{ required: true, message: 'Id 不能为空' }]
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'name',
|
||||
label: '节点名称'
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'documentation',
|
||||
label: '节点描述'
|
||||
},
|
||||
{
|
||||
xType: 'slot',
|
||||
name: 'executionListener',
|
||||
label: '执行监听器'
|
||||
},
|
||||
{
|
||||
xType: 'switch',
|
||||
name: 'async',
|
||||
label: '异步',
|
||||
activeText: '是',
|
||||
inactiveText: '否'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'formData.async': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:async': val })
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.formData = commonParse(this.element)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
@ -1,113 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<x-form ref="xForm" v-model="formData" :config="formConfig">
|
||||
<template #executionListener>
|
||||
<el-badge :value="executionListenerLength">
|
||||
<el-button size="small" @click="dialogName = 'executionListenerDialog'">编辑</el-button>
|
||||
</el-badge>
|
||||
</template>
|
||||
<template #signal>
|
||||
<el-badge :value="signalLength">
|
||||
<el-button size="small" @click="dialogName = 'signalDialog'">编辑</el-button>
|
||||
</el-badge>
|
||||
</template>
|
||||
</x-form>
|
||||
<executionListenerDialog
|
||||
v-if="dialogName === 'executionListenerDialog'"
|
||||
:element="element"
|
||||
:modeler="modeler"
|
||||
@close="finishExecutionListener"
|
||||
/>
|
||||
<signalDialog
|
||||
v-if="dialogName === 'signalDialog'"
|
||||
:element="element"
|
||||
:modeler="modeler"
|
||||
@close="finishExecutionListener"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import mixinPanel from '../../common/mixinPanel'
|
||||
import mixinExecutionListener from '../../common/mixinExecutionListener'
|
||||
import signalDialog from './property/signal'
|
||||
import { commonParse } from '../../common/parseElement'
|
||||
export default {
|
||||
components: {
|
||||
signalDialog
|
||||
},
|
||||
mixins: [mixinPanel, mixinExecutionListener],
|
||||
data() {
|
||||
return {
|
||||
signalLength: 0,
|
||||
formData: {}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
formConfig() {
|
||||
const _this = this
|
||||
return {
|
||||
inline: false,
|
||||
item: [
|
||||
{
|
||||
xType: 'select',
|
||||
name: 'processCategory',
|
||||
label: '流程分类',
|
||||
dic: { data: _this.categorys, label: 'name', value: 'id' }
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'id',
|
||||
label: '流程标识key',
|
||||
rules: [{ required: true, message: 'Id 不能为空' }]
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'name',
|
||||
label: '流程名称'
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'documentation',
|
||||
label: '节点描述'
|
||||
},
|
||||
{
|
||||
xType: 'slot',
|
||||
name: 'executionListener',
|
||||
label: '执行监听器'
|
||||
},
|
||||
{
|
||||
xType: 'slot',
|
||||
name: 'signal',
|
||||
label: '信号定义'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'formData.processCategory': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:processCategory': val })
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.formData = commonParse(this.element)
|
||||
},
|
||||
methods: {
|
||||
computedSignalLength() {
|
||||
this.signalLength = this.element.businessObject.extensionElements?.values?.length ?? 0
|
||||
},
|
||||
finishSignal() {
|
||||
if (this.dialogName === 'signalDialog') {
|
||||
this.computedSignalLength()
|
||||
}
|
||||
this.dialogName = ''
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
@ -1,97 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-dialog
|
||||
title="监听器参数"
|
||||
:visible.sync="dialogVisible"
|
||||
width="700px"
|
||||
:close-on-click-modal="false"
|
||||
:close-on-press-escape="false"
|
||||
:show-close="false"
|
||||
@closed="$emit('close', formData.paramList)"
|
||||
append-to-body
|
||||
>
|
||||
<x-form ref="xForm" v-model="formData" :config="formConfig" />
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" size="medium" @click="closeDialog">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import mixinXcrud from '../../../common/mixinXcrud'
|
||||
export default {
|
||||
mixins: [mixinXcrud],
|
||||
props: {
|
||||
value: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: true,
|
||||
formData: {
|
||||
paramList: this.value
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
formConfig() {
|
||||
return {
|
||||
inline: false,
|
||||
item: [
|
||||
{
|
||||
xType: 'tabs',
|
||||
tabs: [
|
||||
{
|
||||
label: '监听器参数',
|
||||
name: 'paramList',
|
||||
column: [
|
||||
{
|
||||
label: '类型',
|
||||
name: 'type',
|
||||
width: 180,
|
||||
rules: [{ required: true, message: '请选择', trigger: ['blur', 'change'] }],
|
||||
xType: 'select',
|
||||
dic: [
|
||||
{ label: '字符串', value: 'stringValue' },
|
||||
{ label: '表达式', value: 'expression' }
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '名称',
|
||||
name: 'name',
|
||||
width: 180,
|
||||
rules: [{ required: true, message: '请选择', trigger: ['blur', 'change'] }],
|
||||
xType: 'input'
|
||||
},
|
||||
{
|
||||
label: '值',
|
||||
name: 'value',
|
||||
xType: 'input',
|
||||
rules: [{ required: true, message: '请输入', trigger: ['blur', 'change'] }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
closeDialog() {
|
||||
this.$refs.xForm.validate().then(() => {
|
||||
this.dialogVisible = false
|
||||
}).catch(e => console.error(e))
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.flow-containers .el-badge__content.is-fixed {
|
||||
top: 18px;
|
||||
}
|
||||
</style>
|
@ -1,125 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-dialog
|
||||
title="信号定义"
|
||||
:visible.sync="dialogVisible"
|
||||
width="700px"
|
||||
:close-on-click-modal="false"
|
||||
:close-on-press-escape="false"
|
||||
:show-close="false"
|
||||
@closed="$emit('close')"
|
||||
append-to-body
|
||||
>
|
||||
<x-form ref="xForm" v-model="formData" :config="formConfig" />
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" size="medium" @click="closeDialog">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import mixinPanel from '../../../common/mixinPanel'
|
||||
export default {
|
||||
mixins: [mixinPanel],
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: true,
|
||||
formData: {
|
||||
signal: []
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
formConfig() {
|
||||
// const _this = this
|
||||
return {
|
||||
inline: false,
|
||||
item: [
|
||||
{
|
||||
xType: 'tabs',
|
||||
tabs: [
|
||||
{
|
||||
label: '信号定义',
|
||||
name: 'signal',
|
||||
column: [
|
||||
{
|
||||
label: 'scope',
|
||||
name: 'scope',
|
||||
width: 180,
|
||||
rules: [{ required: true, message: '请选择', trigger: ['blur', 'change'] }],
|
||||
xType: 'select',
|
||||
dic: [
|
||||
{ label: '全局', value: 'start' },
|
||||
{ label: '流程实例', value: 'end' }
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'id',
|
||||
name: 'id',
|
||||
width: 200,
|
||||
rules: [{ required: true, message: '请输入', trigger: ['blur', 'change'] }],
|
||||
xType: 'input'
|
||||
},
|
||||
{
|
||||
label: '名称',
|
||||
name: 'name',
|
||||
xType: 'input',
|
||||
rules: [{ required: true, message: '请输入', trigger: ['blur', 'change'] }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// this.formData.signal = this.element.businessObject.extensionElements?.values.map(item => {
|
||||
// let type
|
||||
// if ('class' in item.$attrs) type = 'class'
|
||||
// if ('expression' in item.$attrs) type = 'expression'
|
||||
// if ('delegateExpression' in item.$attrs) type = 'delegateExpression'
|
||||
// return {
|
||||
// event: item.$attrs.event,
|
||||
// type: type,
|
||||
// className: item.$attrs[type]
|
||||
// }
|
||||
// }) ?? []
|
||||
},
|
||||
methods: {
|
||||
updateElement() {
|
||||
if (this.formData.signal?.length) {
|
||||
let extensionElements = this.element.businessObject.get('extensionElements')
|
||||
if (!extensionElements) {
|
||||
extensionElements = this.modeler.get('moddle').create('bpmn:signal')
|
||||
}
|
||||
const length = extensionElements.get('values').length
|
||||
for (let i = 0; i < length; i++) {
|
||||
// 清除旧值
|
||||
extensionElements.get('values').pop()
|
||||
}
|
||||
this.updateProperties({ extensionElements: extensionElements })
|
||||
} else {
|
||||
const extensionElements = this.element.businessObject[`extensionElements`]
|
||||
if (extensionElements) {
|
||||
extensionElements.values = extensionElements.values?.filter(item => item.$type !== 'flowable:ExecutionListener')
|
||||
}
|
||||
}
|
||||
},
|
||||
closeDialog() {
|
||||
this.$refs.xForm.validate().then(() => {
|
||||
this.updateElement()
|
||||
this.dialogVisible = false
|
||||
}).catch(e => console.error(e))
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.flow-containers .el-badge__content.is-fixed {
|
||||
top: 18px;
|
||||
}
|
||||
</style>
|
@ -1,92 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<x-form ref="xForm" v-model="formData" :config="formConfig">
|
||||
<template #executionListener>
|
||||
<el-badge :value="executionListenerLength">
|
||||
<el-button size="small" @click="dialogName = 'executionListenerDialog'">编辑</el-button>
|
||||
</el-badge>
|
||||
</template>
|
||||
</x-form>
|
||||
<executionListenerDialog
|
||||
v-if="dialogName === 'executionListenerDialog'"
|
||||
:element="element"
|
||||
:modeler="modeler"
|
||||
@close="finishExecutionListener"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import mixinPanel from '../../common/mixinPanel'
|
||||
import mixinExecutionListener from '../../common/mixinExecutionListener'
|
||||
import { commonParse, conditionExpressionParse } from '../../common/parseElement'
|
||||
export default {
|
||||
mixins: [mixinPanel, mixinExecutionListener],
|
||||
data() {
|
||||
return {
|
||||
formData: {}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
formConfig() {
|
||||
return {
|
||||
inline: false,
|
||||
item: [
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'id',
|
||||
label: '节点 id',
|
||||
rules: [{ required: true, message: 'Id 不能为空' }]
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'name',
|
||||
label: '节点名称'
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'documentation',
|
||||
label: '节点描述'
|
||||
},
|
||||
{
|
||||
xType: 'slot',
|
||||
name: 'executionListener',
|
||||
label: '执行监听器'
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'conditionExpression',
|
||||
label: '跳转条件'
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'skipExpression',
|
||||
label: '跳过表达式'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'formData.conditionExpression': function(val) {
|
||||
if (val) {
|
||||
const newCondition = this.modeler.get('moddle').create('bpmn:FormalExpression', { body: val })
|
||||
this.updateProperties({ conditionExpression: newCondition })
|
||||
} else {
|
||||
this.updateProperties({ conditionExpression: null })
|
||||
}
|
||||
},
|
||||
'formData.skipExpression': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:skipExpression': val })
|
||||
}
|
||||
},
|
||||
created() {
|
||||
let cache = commonParse(this.element)
|
||||
cache = conditionExpressionParse(cache)
|
||||
this.formData = cache
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style></style>
|
@ -1,91 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<x-form ref="xForm" v-model="formData" :config="formConfig">
|
||||
<template #executionListener>
|
||||
<el-badge :value="executionListenerLength">
|
||||
<el-button size="small" @click="dialogName = 'executionListenerDialog'">编辑</el-button>
|
||||
</el-badge>
|
||||
</template>
|
||||
</x-form>
|
||||
<executionListenerDialog
|
||||
v-if="dialogName === 'executionListenerDialog'"
|
||||
:element="element"
|
||||
:modeler="modeler"
|
||||
@close="finishExecutionListener"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import mixinPanel from '../../common/mixinPanel'
|
||||
import mixinExecutionListener from '../../common/mixinExecutionListener'
|
||||
import { commonParse } from '../../common/parseElement'
|
||||
export default {
|
||||
mixins: [mixinPanel, mixinExecutionListener],
|
||||
data() {
|
||||
return {
|
||||
formData: {}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
formConfig() {
|
||||
const _this = this
|
||||
return {
|
||||
inline: false,
|
||||
item: [
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'id',
|
||||
label: '节点 id',
|
||||
rules: [{ required: true, message: 'Id 不能为空' }]
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'name',
|
||||
label: '节点名称'
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'documentation',
|
||||
label: '节点描述'
|
||||
},
|
||||
{
|
||||
xType: 'slot',
|
||||
name: 'executionListener',
|
||||
label: '执行监听器'
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'initiator',
|
||||
label: '发起人',
|
||||
show: !!_this.showConfig.initiator
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'formKey',
|
||||
label: '表单标识key',
|
||||
show: !!_this.showConfig.formKey
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'formData.initiator': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:initiator': val })
|
||||
},
|
||||
'formData.formKey': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:formKey': val })
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.formData = commonParse(this.element)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
@ -1,376 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<x-form ref="xForm" v-model="formData" :config="formConfig">
|
||||
<template #executionListener>
|
||||
<el-badge :value="executionListenerLength">
|
||||
<el-button size="small" @click="dialogName = 'executionListenerDialog'">编辑</el-button>
|
||||
</el-badge>
|
||||
</template>
|
||||
<template #taskListener>
|
||||
<el-badge :value="taskListenerLength">
|
||||
<el-button size="small" @click="dialogName = 'taskListenerDialog'">编辑</el-button>
|
||||
</el-badge>
|
||||
</template>
|
||||
<template #multiInstance>
|
||||
<el-badge :is-dot="hasMultiInstance">
|
||||
<el-button size="small" @click="dialogName = 'multiInstanceDialog'">编辑</el-button>
|
||||
</el-badge>
|
||||
</template>
|
||||
</x-form>
|
||||
<executionListenerDialog
|
||||
v-if="dialogName === 'executionListenerDialog'"
|
||||
:element="element"
|
||||
:modeler="modeler"
|
||||
@close="finishExecutionListener"
|
||||
/>
|
||||
<taskListenerDialog
|
||||
v-if="dialogName === 'taskListenerDialog'"
|
||||
:element="element"
|
||||
:modeler="modeler"
|
||||
@close="finishTaskListener"
|
||||
/>
|
||||
<multiInstanceDialog
|
||||
v-if="dialogName === 'multiInstanceDialog'"
|
||||
:element="element"
|
||||
:modeler="modeler"
|
||||
@close="finishMultiInstance"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import mixinPanel from '../../common/mixinPanel'
|
||||
import executionListenerDialog from './property/executionListener'
|
||||
import taskListenerDialog from './property/taskListener'
|
||||
import multiInstanceDialog from './property/multiInstance'
|
||||
import { commonParse, userTaskParse } from '../../common/parseElement'
|
||||
export default {
|
||||
components: {
|
||||
executionListenerDialog,
|
||||
taskListenerDialog,
|
||||
multiInstanceDialog
|
||||
},
|
||||
mixins: [mixinPanel],
|
||||
props: {
|
||||
users: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
groups: {
|
||||
type: Array,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
userTypeOption: [
|
||||
{ label: '指定人员', value: 'assignee' }//,
|
||||
// { label: '候选人员', value: 'candidateUsers' },
|
||||
// { label: '候选组', value: 'candidateGroups' }
|
||||
],
|
||||
dialogName: '',
|
||||
executionListenerLength: 0,
|
||||
taskListenerLength: 0,
|
||||
hasMultiInstance: false,
|
||||
formData: {}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
formConfig() {
|
||||
const _this = this
|
||||
return {
|
||||
inline: false,
|
||||
item: [
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'id',
|
||||
label: '节点 id',
|
||||
rules: [{ required: true, message: 'Id 不能为空' }]
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'name',
|
||||
label: '节点名称'
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'documentation',
|
||||
label: '节点描述'
|
||||
},
|
||||
{
|
||||
xType: 'slot',
|
||||
name: 'executionListener',
|
||||
label: '执行监听器'
|
||||
},
|
||||
{
|
||||
xType: 'slot',
|
||||
name: 'taskListener',
|
||||
label: '任务监听器',
|
||||
show: !!_this.showConfig.taskListener
|
||||
},
|
||||
{
|
||||
xType: 'select',
|
||||
name: 'userType',
|
||||
label: '人员类型',
|
||||
dic: _this.userTypeOption,
|
||||
show: !!_this.showConfig.userType
|
||||
},
|
||||
{
|
||||
xType: 'select',
|
||||
name: 'assignee',
|
||||
label: '指定人员',
|
||||
allowCreate: true,
|
||||
filterable: true,
|
||||
clearable: true,
|
||||
dic: { data: _this.users, label: 'name', value: 'id' },
|
||||
show: !!_this.showConfig.assignee && _this.formData.userType === 'assignee'
|
||||
},
|
||||
{
|
||||
xType: 'select',
|
||||
name: 'candidateUsers',
|
||||
label: '候选人员',
|
||||
multiple: true,
|
||||
allowCreate: true,
|
||||
filterable: true,
|
||||
dic: { data: _this.users, label: 'name', value: 'id' },
|
||||
show: !!_this.showConfig.candidateUsers && _this.formData.userType === 'candidateUsers'
|
||||
},
|
||||
{
|
||||
xType: 'select',
|
||||
name: 'candidateGroups',
|
||||
label: '候选组',
|
||||
multiple: true,
|
||||
allowCreate: true,
|
||||
filterable: true,
|
||||
dic: { data: _this.groups, label: 'name', value: 'id' },
|
||||
show: !!_this.showConfig.candidateGroups && _this.formData.userType === 'candidateGroups'
|
||||
},
|
||||
{
|
||||
xType: 'slot',
|
||||
name: 'multiInstance',
|
||||
label: '多实例'
|
||||
},
|
||||
{
|
||||
xType: 'switch',
|
||||
name: 'async',
|
||||
label: '异步',
|
||||
activeText: '是',
|
||||
inactiveText: '否',
|
||||
show: !!_this.showConfig.async
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'priority',
|
||||
label: '优先级',
|
||||
show: !!_this.showConfig.priority
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'formKey',
|
||||
label: '表单标识key',
|
||||
show: !!_this.showConfig.formKey
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'skipExpression',
|
||||
label: '跳过表达式',
|
||||
show: !!_this.showConfig.skipExpression
|
||||
},
|
||||
{
|
||||
xType: 'switch',
|
||||
name: 'isForCompensation',
|
||||
label: '是否为补偿',
|
||||
activeText: '是',
|
||||
inactiveText: '否',
|
||||
show: !!_this.showConfig.isForCompensation
|
||||
},
|
||||
{
|
||||
xType: 'switch',
|
||||
name: 'triggerable',
|
||||
label: '服务任务可触发',
|
||||
activeText: '是',
|
||||
inactiveText: '否',
|
||||
show: !!_this.showConfig.triggerable
|
||||
},
|
||||
{
|
||||
xType: 'switch',
|
||||
name: 'autoStoreVariables',
|
||||
label: '自动存储变量',
|
||||
activeText: '是',
|
||||
inactiveText: '否',
|
||||
show: !!_this.showConfig.autoStoreVariables
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'ruleVariablesInput',
|
||||
label: '输入变量',
|
||||
show: !!_this.showConfig.ruleVariablesInput
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'rules',
|
||||
label: '规则',
|
||||
show: !!_this.showConfig.rules
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'resultVariable',
|
||||
label: '结果变量',
|
||||
show: !!_this.showConfig.resultVariable
|
||||
},
|
||||
{
|
||||
xType: 'switch',
|
||||
name: 'exclude',
|
||||
label: '排除',
|
||||
activeText: '是',
|
||||
inactiveText: '否',
|
||||
show: !!_this.showConfig.exclude
|
||||
},
|
||||
{
|
||||
xType: 'input',
|
||||
name: 'class',
|
||||
label: '类',
|
||||
show: !!_this.showConfig.class
|
||||
},
|
||||
{
|
||||
xType: 'datePicker',
|
||||
type: 'datetime',
|
||||
name: 'dueDate',
|
||||
label: '到期时间',
|
||||
show: !!_this.showConfig.dueDate
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'formData.userType': function(val, oldVal) {
|
||||
if (oldVal) {
|
||||
const types = ['assignee', 'candidateUsers', 'candidateGroups']
|
||||
types.forEach(type => {
|
||||
delete this.element.businessObject.$attrs[`flowable:${type}`]
|
||||
delete this.formData[type]
|
||||
})
|
||||
}
|
||||
},
|
||||
'formData.assignee': function(val) {
|
||||
if (this.formData.userType !== 'assignee') {
|
||||
delete this.element.businessObject.$attrs[`flowable:assignee`]
|
||||
return
|
||||
}
|
||||
this.updateProperties({ 'flowable:assignee': val })
|
||||
},
|
||||
'formData.candidateUsers': function(val) {
|
||||
if (this.formData.userType !== 'candidateUsers') {
|
||||
delete this.element.businessObject.$attrs[`flowable:candidateUsers`]
|
||||
return
|
||||
}
|
||||
this.updateProperties({ 'flowable:candidateUsers': val?.join(',') })
|
||||
},
|
||||
'formData.candidateGroups': function(val) {
|
||||
if (this.formData.userType !== 'candidateGroups') {
|
||||
delete this.element.businessObject.$attrs[`flowable:candidateGroups`]
|
||||
return
|
||||
}
|
||||
this.updateProperties({ 'flowable:candidateGroups': val?.join(',') })
|
||||
},
|
||||
'formData.async': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:async': true })
|
||||
},
|
||||
'formData.dueDate': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:dueDate': val })
|
||||
},
|
||||
'formData.formKey': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:formKey': val })
|
||||
},
|
||||
'formData.priority': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:priority': val })
|
||||
},
|
||||
'formData.skipExpression': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:skipExpression': val })
|
||||
},
|
||||
'formData.isForCompensation': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'isForCompensation': val })
|
||||
},
|
||||
'formData.triggerable': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:triggerable': val })
|
||||
},
|
||||
'formData.class': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:class': val })
|
||||
},
|
||||
'formData.autoStoreVariables': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:autoStoreVariables': val })
|
||||
},
|
||||
'formData.exclude': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:exclude': val })
|
||||
},
|
||||
'formData.ruleVariablesInput': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:ruleVariablesInput': val })
|
||||
},
|
||||
'formData.rules': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:rules': val })
|
||||
},
|
||||
'formData.resultVariable': function(val) {
|
||||
if (val === '') val = null
|
||||
this.updateProperties({ 'flowable:resultVariable': val })
|
||||
}
|
||||
},
|
||||
created() {
|
||||
let cache = commonParse(this.element)
|
||||
cache = userTaskParse(cache)
|
||||
this.formData = cache
|
||||
this.computedExecutionListenerLength()
|
||||
this.computedTaskListenerLength()
|
||||
this.computedHasMultiInstance()
|
||||
},
|
||||
methods: {
|
||||
computedExecutionListenerLength() {
|
||||
this.executionListenerLength = this.element.businessObject.extensionElements?.values
|
||||
?.filter(item => item.$type === 'flowable:ExecutionListener').length ?? 0
|
||||
},
|
||||
computedTaskListenerLength() {
|
||||
this.taskListenerLength = this.element.businessObject.extensionElements?.values
|
||||
?.filter(item => item.$type === 'flowable:TaskListener').length ?? 0
|
||||
},
|
||||
computedHasMultiInstance() {
|
||||
if (this.element.businessObject.loopCharacteristics) {
|
||||
this.hasMultiInstance = true
|
||||
} else {
|
||||
this.hasMultiInstance = false
|
||||
}
|
||||
},
|
||||
finishExecutionListener() {
|
||||
if (this.dialogName === 'executionListenerDialog') {
|
||||
this.computedExecutionListenerLength()
|
||||
}
|
||||
this.dialogName = ''
|
||||
},
|
||||
finishTaskListener() {
|
||||
if (this.dialogName === 'taskListenerDialog') {
|
||||
this.computedTaskListenerLength()
|
||||
}
|
||||
this.dialogName = ''
|
||||
},
|
||||
finishMultiInstance() {
|
||||
if (this.dialogName === 'multiInstanceDialog') {
|
||||
this.computedHasMultiInstance()
|
||||
}
|
||||
this.dialogName = ''
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style></style>
|
@ -1,24 +0,0 @@
|
||||
|
||||
function randomStr() {
|
||||
return Math.random().toString(36).slice(-8)
|
||||
}
|
||||
|
||||
export default function() {
|
||||
return `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:bioc="http://bpmn.io/schema/bpmn/biocolor/1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" targetNamespace="http://www.flowable.org/processdef">
|
||||
<process id="process_${randomStr()}" name="name_${randomStr()}">
|
||||
<startEvent id="startNode1" name="开始" />
|
||||
</process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_flow">
|
||||
<bpmndi:BPMNPlane id="BPMNPlane_flow" bpmnElement="T-2d89e7a3-ba79-4abd-9f64-ea59621c258c">
|
||||
<bpmndi:BPMNShape id="BPMNShape_startNode1" bpmnElement="startNode1" bioc:stroke="">
|
||||
<omgdc:Bounds x="240" y="200" width="30" height="30" />
|
||||
<bpmndi:BPMNLabel>
|
||||
<omgdc:Bounds x="242" y="237" width="23" height="14" />
|
||||
</bpmndi:BPMNLabel>
|
||||
</bpmndi:BPMNShape>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</definitions>
|
||||
`
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
export default {
|
||||
'bpmn:EndEvent': {},
|
||||
'bpmn:StartEvent': {
|
||||
initiator: true,
|
||||
formKey: true
|
||||
},
|
||||
'bpmn:UserTask': {
|
||||
userType: true,
|
||||
assignee: true,
|
||||
candidateUsers: true,
|
||||
candidateGroups: true,
|
||||
async: true,
|
||||
priority: true,
|
||||
formKey: true,
|
||||
skipExpression: true,
|
||||
dueDate: true,
|
||||
taskListener: true
|
||||
},
|
||||
'bpmn:ServiceTask': {
|
||||
async: true,
|
||||
skipExpression: true,
|
||||
isForCompensation: true,
|
||||
triggerable: true,
|
||||
class: true
|
||||
},
|
||||
'bpmn:ScriptTask': {
|
||||
async: true,
|
||||
isForCompensation: true,
|
||||
autoStoreVariables: true
|
||||
},
|
||||
'bpmn:ManualTask': {
|
||||
async: true,
|
||||
isForCompensation: true
|
||||
},
|
||||
'bpmn:ReceiveTask': {
|
||||
async: true,
|
||||
isForCompensation: true
|
||||
},
|
||||
'bpmn:SendTask': {
|
||||
async: true,
|
||||
isForCompensation: true
|
||||
},
|
||||
'bpmn:BusinessRuleTask': {
|
||||
async: true,
|
||||
isForCompensation: true,
|
||||
ruleVariablesInput: true,
|
||||
rules: true,
|
||||
resultVariable: true,
|
||||
exclude: true
|
||||
}
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
import workflowBpmnModeler from './index.vue'
|
||||
|
||||
workflowBpmnModeler.install = Vue => Vue.component(workflowBpmnModeler.name, workflowBpmnModeler) // 给组件配置install方法
|
||||
|
||||
export default workflowBpmnModeler
|
@ -1,422 +0,0 @@
|
||||
<template>
|
||||
<div v-loading="isView" class="flow-containers" :class="{ 'view-mode': isView }">
|
||||
<el-container style="height: 100%">
|
||||
<el-header style="border-bottom: 1px solid rgb(218 218 218);height: auto;">
|
||||
<div style="display: flex; padding: 10px 0px; justify-content: space-between;">
|
||||
<div>
|
||||
<el-upload action="" :before-upload="openBpmn" style="margin-right: 10px; display:inline-block;">
|
||||
<el-tooltip effect="dark" content="加载xml" placement="bottom">
|
||||
<el-button size="mini" icon="el-icon-folder-opened" />
|
||||
</el-tooltip>
|
||||
</el-upload>
|
||||
<el-tooltip effect="dark" content="新建" placement="bottom">
|
||||
<el-button size="mini" icon="el-icon-circle-plus" @click="newDiagram" />
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" content="自适应屏幕" placement="bottom">
|
||||
<el-button size="mini" icon="el-icon-rank" @click="fitViewport" />
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" content="放大" placement="bottom">
|
||||
<el-button size="mini" icon="el-icon-zoom-in" @click="zoomViewport(true)" />
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" content="缩小" placement="bottom">
|
||||
<el-button size="mini" icon="el-icon-zoom-out" @click="zoomViewport(false)" />
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" content="后退" placement="bottom">
|
||||
<el-button size="mini" icon="el-icon-back" @click="modeler.get('commandStack').undo()" />
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" content="前进" placement="bottom">
|
||||
<el-button size="mini" icon="el-icon-right" @click="modeler.get('commandStack').redo()" />
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<div>
|
||||
<el-button size="mini" icon="el-icon-download" @click="saveXML(true)">下载xml</el-button>
|
||||
<el-button size="mini" icon="el-icon-picture" @click="saveImg('svg', true)">下载svg</el-button>
|
||||
<el-button size="mini" type="primary" @click="save">保存模型</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-header>
|
||||
<el-container style="align-items: stretch">
|
||||
<el-main style="padding: 0;">
|
||||
<div ref="canvas" class="canvas" />
|
||||
</el-main>
|
||||
<el-aside style="width: 400px; min-height: 650px; background-color: #f0f2f5">
|
||||
<panel v-if="modeler" :modeler="modeler" :users="users" :groups="groups" :categorys="categorys" />
|
||||
</el-aside>
|
||||
</el-container>
|
||||
</el-container>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// 汉化
|
||||
import customTranslate from './common/customTranslate'
|
||||
import Modeler from 'bpmn-js/lib/Modeler'
|
||||
import panel from './PropertyPanel'
|
||||
import BpmData from './BpmData'
|
||||
import getInitStr from './flowable/init'
|
||||
// 引入flowable的节点文件
|
||||
import flowableModdle from './flowable/flowable.json'
|
||||
export default {
|
||||
name: 'WorkflowBpmnModeler',
|
||||
components: {
|
||||
panel
|
||||
},
|
||||
props: {
|
||||
xml: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
users: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
},
|
||||
groups: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
},
|
||||
categorys: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
},
|
||||
isView: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
modeler: null,
|
||||
taskList: [],
|
||||
zoom: 1
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
xml: function(val) {
|
||||
if (val) {
|
||||
this.createNewDiagram(val)
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// 生成实例
|
||||
this.modeler = new Modeler({
|
||||
container: this.$refs.canvas,
|
||||
additionalModules: [
|
||||
{
|
||||
translate: ['value', customTranslate]
|
||||
}
|
||||
],
|
||||
moddleExtensions: {
|
||||
flowable: flowableModdle
|
||||
}
|
||||
})
|
||||
// 新增流程定义
|
||||
if (!this.xml) {
|
||||
this.newDiagram()
|
||||
} else {
|
||||
this.createNewDiagram(this.xml)
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
newDiagram() {
|
||||
this.createNewDiagram(getInitStr())
|
||||
},
|
||||
// 让图能自适应屏幕
|
||||
fitViewport() {
|
||||
this.zoom = this.modeler.get('canvas').zoom('fit-viewport')
|
||||
const bbox = document.querySelector('.flow-containers .viewport').getBBox()
|
||||
const currentViewbox = this.modeler.get('canvas').viewbox()
|
||||
const elementMid = {
|
||||
x: bbox.x + bbox.width / 2 - 65,
|
||||
y: bbox.y + bbox.height / 2
|
||||
}
|
||||
this.modeler.get('canvas').viewbox({
|
||||
x: elementMid.x - currentViewbox.width / 2,
|
||||
y: elementMid.y - currentViewbox.height / 2,
|
||||
width: currentViewbox.width,
|
||||
height: currentViewbox.height
|
||||
})
|
||||
this.zoom = bbox.width / currentViewbox.width * 1.8
|
||||
},
|
||||
// 放大缩小
|
||||
zoomViewport(zoomIn = true) {
|
||||
this.zoom = this.modeler.get('canvas').zoom()
|
||||
this.zoom += (zoomIn ? 0.1 : -0.1)
|
||||
this.modeler.get('canvas').zoom(this.zoom)
|
||||
},
|
||||
async createNewDiagram(data) {
|
||||
// 将字符串转换成图显示出来
|
||||
// data = data.replace(/<!\[CDATA\[(.+?)]]>/g, '<![CDATA[$1]]>')
|
||||
data = data.replace(/<!\[CDATA\[(.+?)]]>/g, function(match, str) {
|
||||
return str.replace(/</g, '<')
|
||||
})
|
||||
try {
|
||||
await this.modeler.importXML(data)
|
||||
this.adjustPalette()
|
||||
this.fitViewport()
|
||||
// this.fillColor()
|
||||
} catch (err) {
|
||||
console.error(err.message, err.warnings)
|
||||
}
|
||||
},
|
||||
// 调整左侧工具栏排版
|
||||
adjustPalette() {
|
||||
try {
|
||||
// 获取 bpmn 设计器实例
|
||||
const canvas = this.$refs.canvas
|
||||
const djsPalette = canvas.children[0].children[1].children[4]
|
||||
const djsPalStyle = {
|
||||
width: '130px',
|
||||
padding: '5px',
|
||||
background: 'white',
|
||||
left: '20px',
|
||||
borderRadius: 0
|
||||
}
|
||||
for (var key in djsPalStyle) {
|
||||
djsPalette.style[key] = djsPalStyle[key]
|
||||
}
|
||||
const palette = djsPalette.children[0]
|
||||
const allGroups = palette.children
|
||||
allGroups[0].style['display'] = 'none'
|
||||
// 修改控件样式
|
||||
for (var gKey in allGroups) {
|
||||
const group = allGroups[gKey]
|
||||
for (var cKey in group.children) {
|
||||
const control = group.children[cKey]
|
||||
const controlStyle = {
|
||||
display: 'flex',
|
||||
justifyContent: 'flex-start',
|
||||
alignItems: 'center',
|
||||
width: '100%',
|
||||
padding: '5px'
|
||||
}
|
||||
if (
|
||||
control.className &&
|
||||
control.dataset &&
|
||||
control.className.indexOf('entry') !== -1
|
||||
) {
|
||||
const controlProps = new BpmData().getControl(
|
||||
control.dataset.action
|
||||
)
|
||||
control.innerHTML = `<div style='font-size: 14px;font-weight:500;margin-left:15px;'>${
|
||||
controlProps['title']
|
||||
}</div>`
|
||||
for (var csKey in controlStyle) {
|
||||
control.style[csKey] = controlStyle[csKey]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
},
|
||||
fillColor() {
|
||||
const canvas = this.modeler.get('canvas')
|
||||
this.modeler._definitions.rootElements[0].flowElements.forEach(n => {
|
||||
if (n.$type === 'bpmn:UserTask') {
|
||||
const completeTask = this.taskList.find(m => m.key === n.id) || { completed: true }
|
||||
const todoTask = this.taskList.find(m => !m.completed)
|
||||
const endTask = this.taskList[this.taskList.length - 1]
|
||||
if (completeTask) {
|
||||
canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo')
|
||||
n.outgoing?.forEach(nn => {
|
||||
const targetTask = this.taskList.find(m => m.key === nn.targetRef.id)
|
||||
if (targetTask) {
|
||||
canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||
} else if (nn.targetRef.$type === 'bpmn:ExclusiveGateway') {
|
||||
// canvas.addMarker(nn.id, 'highlight');
|
||||
canvas.addMarker(nn.id, completeTask.completed ? 'highlight' : 'highlight-todo')
|
||||
canvas.addMarker(nn.targetRef.id, completeTask.completed ? 'highlight' : 'highlight-todo')
|
||||
} else if (nn.targetRef.$type === 'bpmn:EndEvent') {
|
||||
if (!todoTask && endTask.key === n.id) {
|
||||
canvas.addMarker(nn.id, 'highlight')
|
||||
canvas.addMarker(nn.targetRef.id, 'highlight')
|
||||
}
|
||||
if (!completeTask.completed) {
|
||||
canvas.addMarker(nn.id, 'highlight-todo')
|
||||
canvas.addMarker(nn.targetRef.id, 'highlight-todo')
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
} else if (n.$type === 'bpmn:ExclusiveGateway') {
|
||||
n.outgoing.forEach(nn => {
|
||||
const targetTask = this.taskList.find(m => m.key === nn.targetRef.id)
|
||||
if (targetTask) {
|
||||
canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||
}
|
||||
})
|
||||
}
|
||||
if (n.$type === 'bpmn:StartEvent') {
|
||||
n.outgoing.forEach(nn => {
|
||||
const completeTask = this.taskList.find(m => m.key === nn.targetRef.id)
|
||||
if (completeTask) {
|
||||
canvas.addMarker(nn.id, 'highlight')
|
||||
canvas.addMarker(n.id, 'highlight')
|
||||
return
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
// 对外 api
|
||||
getProcess() {
|
||||
const element = this.getProcessElement()
|
||||
return {
|
||||
id: element.id,
|
||||
name: element.name,
|
||||
category: element.$attrs['flowable:processCategory']
|
||||
}
|
||||
},
|
||||
getProcessElement() {
|
||||
const rootElements = this.modeler.getDefinitions().rootElements
|
||||
for (let i = 0; i < rootElements.length; i++) {
|
||||
if (rootElements[i].$type === 'bpmn:Process') return rootElements[i]
|
||||
}
|
||||
},
|
||||
async saveXML(download = false) {
|
||||
try {
|
||||
const { xml } = await this.modeler.saveXML({ format: true })
|
||||
if (download) {
|
||||
this.downloadFile(`${this.getProcessElement().name}.bpmn20.xml`, xml, 'application/xml')
|
||||
}
|
||||
return xml
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
async saveImg(type = 'svg', download = false) {
|
||||
try {
|
||||
const { svg } = await this.modeler.saveSVG({ format: true })
|
||||
if (download) {
|
||||
this.downloadFile(this.getProcessElement().name, svg, 'image/svg+xml')
|
||||
}
|
||||
return svg
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
async save() {
|
||||
const process = this.getProcess()
|
||||
const xml = await this.saveXML()
|
||||
const svg = await this.saveImg()
|
||||
const result = { process, xml, svg }
|
||||
this.$emit('save', result)
|
||||
window.parent.postMessage(result, '*')
|
||||
},
|
||||
openBpmn(file) {
|
||||
const reader = new FileReader()
|
||||
reader.readAsText(file, 'utf-8')
|
||||
reader.onload = () => {
|
||||
this.createNewDiagram(reader.result)
|
||||
}
|
||||
return false
|
||||
},
|
||||
downloadFile(filename, data, type) {
|
||||
var a = document.createElement('a')
|
||||
var url = window.URL.createObjectURL(new Blob([data], { type: type }))
|
||||
a.href = url
|
||||
a.download = filename
|
||||
a.click()
|
||||
window.URL.revokeObjectURL(url)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
/*左边工具栏以及编辑节点的样式*/
|
||||
@import "~bpmn-js/dist/assets/diagram-js.css";
|
||||
@import "~bpmn-js/dist/assets/bpmn-font/css/bpmn.css";
|
||||
@import "~bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css";
|
||||
@import "~bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css";
|
||||
.view-mode {
|
||||
.el-header, .el-aside, .djs-palette, .bjs-powered-by {
|
||||
display: none;
|
||||
}
|
||||
.el-loading-mask {
|
||||
background-color: initial;
|
||||
}
|
||||
.el-loading-spinner {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.flow-containers {
|
||||
// background-color: #ffffff;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
.canvas {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.panel {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 50px;
|
||||
width: 300px;
|
||||
}
|
||||
.load {
|
||||
margin-right: 10px;
|
||||
}
|
||||
.el-form-item__label{
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.djs-palette{
|
||||
left: 0px!important;
|
||||
top: 0px;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
.djs-container svg {
|
||||
min-height: 650px;
|
||||
}
|
||||
|
||||
// .highlight.djs-shape .djs-visual > :nth-child(1) {
|
||||
// fill: green !important;
|
||||
// stroke: green !important;
|
||||
// fill-opacity: 0.2 !important;
|
||||
// }
|
||||
// .highlight.djs-shape .djs-visual > :nth-child(2) {
|
||||
// fill: green !important;
|
||||
// }
|
||||
// .highlight.djs-shape .djs-visual > path {
|
||||
// fill: green !important;
|
||||
// fill-opacity: 0.2 !important;
|
||||
// stroke: green !important;
|
||||
// }
|
||||
// .highlight.djs-connection > .djs-visual > path {
|
||||
// stroke: green !important;
|
||||
// }
|
||||
// // .djs-connection > .djs-visual > path {
|
||||
// // stroke: orange !important;
|
||||
// // stroke-dasharray: 4px !important;
|
||||
// // fill-opacity: 0.2 !important;
|
||||
// // }
|
||||
// // .djs-shape .djs-visual > :nth-child(1) {
|
||||
// // fill: orange !important;
|
||||
// // stroke: orange !important;
|
||||
// // stroke-dasharray: 4px !important;
|
||||
// // fill-opacity: 0.2 !important;
|
||||
// // }
|
||||
// .highlight-todo.djs-connection > .djs-visual > path {
|
||||
// stroke: orange !important;
|
||||
// stroke-dasharray: 4px !important;
|
||||
// fill-opacity: 0.2 !important;
|
||||
// }
|
||||
// .highlight-todo.djs-shape .djs-visual > :nth-child(1) {
|
||||
// fill: orange !important;
|
||||
// stroke: orange !important;
|
||||
// stroke-dasharray: 4px !important;
|
||||
// fill-opacity: 0.2 !important;
|
||||
// }
|
||||
// .overlays-div {
|
||||
// font-size: 10px;
|
||||
// color: red;
|
||||
// width: 100px;
|
||||
// top: -20px !important;
|
||||
// }
|
||||
}
|
||||
</style>
|
@ -1,76 +0,0 @@
|
||||
<template>
|
||||
<div class="right-board">
|
||||
<el-tabs v-model="currentTab" class="center-tabs">
|
||||
<el-tab-pane label="属性配置" name="field" />
|
||||
</el-tabs>
|
||||
<div class="field-box">
|
||||
<el-scrollbar class="right-scrollbar">
|
||||
<el-form size="small" label-width="100px" >
|
||||
<div v-for="(item,index) in cmps" :key="index">
|
||||
<component v-if="item.name === activeItem.compType" :getFormId="getFormId" :props="activeItem" :is="item.content"></component>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-scrollbar>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import reg from "./custom/register";
|
||||
|
||||
export default {
|
||||
name:'configPanel',
|
||||
data() {
|
||||
return {
|
||||
currentTab: 'field',
|
||||
cmps:reg,
|
||||
formIdArray:[]
|
||||
}
|
||||
},
|
||||
props:{
|
||||
activeItem: {
|
||||
type: Object,
|
||||
default:function(){
|
||||
return {}
|
||||
}
|
||||
},
|
||||
itemList: {
|
||||
type: Array,
|
||||
default:function(){
|
||||
return []
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.cmps.forEach(c => {
|
||||
c.content = require(`./custom/configs/${c.name}`).default;
|
||||
});
|
||||
},
|
||||
methods:{
|
||||
getFormId(itemId){
|
||||
this.formIdArray = [];
|
||||
Array.from(this.itemList,(item)=>{
|
||||
if(item.compType === 'row'){
|
||||
Array.from(item.columns,(column)=>{
|
||||
Array.from(column.list,(col)=>{
|
||||
if(col._id !== itemId){
|
||||
this.formIdArray.push(col.id);
|
||||
}
|
||||
})
|
||||
})
|
||||
}else{
|
||||
if(item._id !== itemId){
|
||||
this.formIdArray.push(item.id);
|
||||
}
|
||||
}
|
||||
})
|
||||
return this.formIdArray;
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style scoped>
|
||||
.field-box >>> .el-scrollbar__wrap{
|
||||
overflow-x: hidden;
|
||||
}
|
||||
</style>
|
@ -1,55 +0,0 @@
|
||||
<!--后期支持flex布局-->
|
||||
<template>
|
||||
<div v-show="props.compType === 'row'">
|
||||
<el-form-item label="栅格间隔">
|
||||
<el-input-number size="small" v-model="props.gutter" :min="0" :max="100"/>
|
||||
</el-form-item>
|
||||
<el-divider>列配置项</el-divider>
|
||||
<div v-for="(item, index) in props.columns" :key="index" class="select-item">
|
||||
<div class="select-line-icon">
|
||||
<i class="el-icon-s-operation" />
|
||||
</div>
|
||||
<el-input-number
|
||||
size="normal"
|
||||
v-model="item.span"
|
||||
:min="1" :max="24"
|
||||
/>
|
||||
<div class="close-btn select-line-icon" @click="props.columns.splice(index,1)">
|
||||
<i class="el-icon-remove-outline" />
|
||||
</div>
|
||||
</div>
|
||||
<div style="margin-left: 30px;">
|
||||
<el-button
|
||||
style="padding-bottom: 0"
|
||||
icon="el-icon-circle-plus-outline"
|
||||
type="text"
|
||||
@click="handlerAddCol"
|
||||
>
|
||||
添加选项
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
|
||||
export default {
|
||||
name:"rowConfig",
|
||||
props:['props','getFormId'],
|
||||
data(){
|
||||
return {
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
handlerAddCol(){
|
||||
const colIndex = this.props.columns+1;
|
||||
this.props.columns.push({
|
||||
index:colIndex,
|
||||
span:12,
|
||||
list:[]
|
||||
})
|
||||
},
|
||||
},
|
||||
mounted(){
|
||||
}
|
||||
}
|
||||
</script>
|
@ -1,28 +0,0 @@
|
||||
<template>
|
||||
<div v-show="props.compType === 'tdItem'">
|
||||
<el-form-item label="单元格背景">
|
||||
<el-color-picker v-model="props.style.background" :predefine="predefineColors"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="表格宽度(%)">
|
||||
<el-inputNumber class="input" :min="0" :max="100" v-model="props.style.width"/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
/**
|
||||
* input的配置项
|
||||
*/
|
||||
export default {
|
||||
name:"tdItemConfig",
|
||||
props:['props'],
|
||||
data(){
|
||||
return {
|
||||
predefineColors: [
|
||||
'#F6F6F6'
|
||||
]
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
}
|
||||
}
|
||||
</script>
|
@ -1,52 +0,0 @@
|
||||
/**
|
||||
* 表单配置
|
||||
*/
|
||||
const formConf = {
|
||||
version:'1.10',
|
||||
formRef: 'elForm',
|
||||
formModel: 'form',
|
||||
rules: 'rules',
|
||||
size: 'medium',
|
||||
labelPosition: 'right',
|
||||
labelWidth: 80,
|
||||
formRules: 'rules',
|
||||
gutter: 15,
|
||||
disabled: false,
|
||||
dynamicTableAllowed:true
|
||||
};
|
||||
export default formConf;
|
||||
|
||||
//动态表单允许放入的组件
|
||||
export const dynamicTableAllowedItems = [
|
||||
'input',
|
||||
'select',
|
||||
'radio',
|
||||
'checkbox',
|
||||
'Switch',
|
||||
'inputNumber',
|
||||
'textarea',
|
||||
'slider',
|
||||
'rate',
|
||||
'date',
|
||||
'time'
|
||||
];
|
||||
|
||||
//row允许放入的items
|
||||
export const rowAllowedItems = [
|
||||
'input',
|
||||
'input',
|
||||
'select',
|
||||
'radio',
|
||||
'checkbox',
|
||||
'Switch',
|
||||
'inputNumber',
|
||||
'textarea',
|
||||
'slider',
|
||||
'rate',
|
||||
'date',
|
||||
'time'
|
||||
]
|
||||
//table允许放入的items
|
||||
export const tableAllowedItems = [
|
||||
'row','dynamicTable'
|
||||
]
|
@ -1,34 +0,0 @@
|
||||
import {input} from "./items/input";
|
||||
import {select} from "./items/select";
|
||||
import {radio} from "./items/radio";
|
||||
import {checkbox} from "./items/checkbox";
|
||||
import {Switch} from "./items/Switch";
|
||||
import {inputNumber} from "./items/inputNumber";
|
||||
import {textarea} from "./items/textarea";
|
||||
import {slider} from "./items/slider";
|
||||
import {rate} from "./items/rate";
|
||||
import {date} from "./items/date";
|
||||
import {time} from "./items/time";
|
||||
import {editor} from "./items/editor";
|
||||
import {colorPicker} from "./items/colorPicker";
|
||||
import {cascader} from "./items/cascader";
|
||||
import {upload} from "./items/upload";
|
||||
import {dialogList} from "./items/dialogList";
|
||||
|
||||
import {dynamicTable} from "./items/dynamicTable";
|
||||
import {button} from "./items/button";
|
||||
import {divider} from "./items/divider";
|
||||
import {row} from "./items/row";
|
||||
import {table} from "./items/table";
|
||||
|
||||
import {alert} from "./items/alert";
|
||||
import {link} from "./items/link";
|
||||
import {text} from "./items/text";
|
||||
import {barCode} from "./items/barCode";
|
||||
|
||||
export const formItems = [
|
||||
input,select,radio,checkbox,Switch,inputNumber,textarea,slider
|
||||
,rate,date,time,editor,colorPicker,cascader,upload,dialogList,barCode,dynamicTable
|
||||
];
|
||||
export const assistFormItems = [button,divider,alert,link,text];
|
||||
export const layoutFormItems = [row,table];
|
@ -1,36 +0,0 @@
|
||||
/**
|
||||
* 警告
|
||||
*/
|
||||
export let alert = {
|
||||
id:'',
|
||||
_id:'',
|
||||
compType: 'alert',
|
||||
ele: 'el-alert',
|
||||
compName:'警告',
|
||||
compIcon:'alert',
|
||||
//展示表单的模式
|
||||
viewType:'component',
|
||||
config: true,
|
||||
|
||||
form:false, //是否表单组件
|
||||
// 控件左侧label内容
|
||||
showLabel:false,
|
||||
labelWidth: '0',
|
||||
span:24,
|
||||
//标题
|
||||
title:'alert',
|
||||
//主题
|
||||
type:'success',
|
||||
//辅助文字
|
||||
description:'form-designer',
|
||||
//是否可关闭
|
||||
closable:true,
|
||||
//是否居中
|
||||
center:false,
|
||||
//关闭的按钮
|
||||
'close-text':'',
|
||||
//是否显示图标
|
||||
'show-icon':false,
|
||||
//主题 light/dark
|
||||
effect:'light'
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
/**
|
||||
* 警告
|
||||
*/
|
||||
export let barCode = {
|
||||
id:'',
|
||||
_id:'',
|
||||
compType: 'barCode',
|
||||
ele: 'fancy-bar-code',
|
||||
compName:'条码',
|
||||
compIcon:'barcode',
|
||||
//展示表单的模式
|
||||
viewType:'component',
|
||||
config: true,
|
||||
|
||||
form:true, //是否表单组件
|
||||
// 控件左侧label内容
|
||||
showLabel:false,
|
||||
labelWidth: '0',
|
||||
label:'条形码',
|
||||
span:24,
|
||||
value:'formDesigner',
|
||||
format:'CODE128',
|
||||
lineColor:'#000',
|
||||
background:'#fff',
|
||||
width:5,
|
||||
height:30,
|
||||
fontSize:12,
|
||||
displayValue:true
|
||||
}
|
||||
|
@ -1,21 +0,0 @@
|
||||
/**
|
||||
* 分割线
|
||||
*/
|
||||
export let divider = {
|
||||
id:'',
|
||||
_id:'',
|
||||
compType: 'divider',
|
||||
ele: 'el-divider',
|
||||
compName:'分割线',
|
||||
compIcon:'divider',
|
||||
//展示表单的模式
|
||||
viewType:'component',
|
||||
config: true,
|
||||
form:false,
|
||||
//内容坐标 left|center|right
|
||||
'content-position':'left',
|
||||
text:'',
|
||||
// 控件左侧label内容
|
||||
showLabel:false,
|
||||
labelWidth: '0'
|
||||
}
|