This commit is contained in:
吴红兵
2025-12-02 10:37:49 +08:00
commit 1f645dad3e
1183 changed files with 147673 additions and 0 deletions

View File

@@ -0,0 +1,98 @@
/**
* 业务公共处理类
* @author luolin
*/
import {validateNull} from "/@/utils/validate";
import {deepClone} from "/@/utils/other";
// 校验是否为对象或数组
export function validateObjArr(objArr) {
return objArr instanceof Array || objArr instanceof Object;
}
// 处理克隆
export function handleClone(_this, form: any, ...keys?: string[]) {
if (_this.operType !== 'add' && _this.operType !== 'copy') return
if (!form) form = _this.form
setPropsNull(form, 'code', 'status', 'finishTime', 'createUser', 'createTime', 'updateUser', 'updateTime')
// 自定义清空字段
setPropsNull(form, ...keys)
return form
}
// 处理克隆提交前
export function handleCloneSubmit(_this, row?: any, callback?: Function) {
if (_this.operType !== 'add' && _this.operType !== 'copy') return
if (!row) row = _this.form
row = handleClone(_this, row)
setPropsNull(row, 'id', 'flowInstId')
if (callback) callback(row)
}
// 设置属性值null
// @ts-ignore
export function setPropsNull(form: any, ...keys?: string[]) {
if (arguments.length < 2) return
let args = Array.prototype.slice.call(arguments)
for (let i = 1; i < args.length; i++) {
form[args[i]] = null
}
}
// 统一设置属性值
// @ts-ignore
export function setPropsValue(form: any, value: any, ...keys?: string[]) {
if (arguments.length < 3) return
let args = Array.prototype.slice.call(arguments)
for (let i = 2; i < args.length; i++) {
form[args[i]] = value
}
}
// 重置表单数据
// @ts-ignore
export function setPropsNullValue(form: any, data: any, ...keys?: string[]) {
if (arguments.length < 3) {
keys = Object.keys(form)
}
setPropsNull(form, ...keys)
if (validateNull(data)) return
setPropsDataValue(form, data, keys)
}
// 设置属性为data值
// @ts-ignore
export function setPropsDataValue(form, data, keys?: string[]) {
if (arguments.length < 3) {
let keys = Object.keys(data);
for (let i = 2; i < keys.length; i++) {
if (!validateNull(data[keys[i]])) form[keys[i]] = data[keys[i]]
}
return
}
let args = Array.prototype.slice.call(arguments)
// 第三个参数是否为数组
if (args[2] instanceof Array) {
args[2].forEach(key => {
if (!validateNull(data[key])) {
// 防止相同引用
if (validateObjArr(data[key])) form[key] = deepClone(data[key])
else form[key] = data[key]
}
})
} else {
for (let i = 2; i < args.length; i++) {
if (!validateNull(data[args[i]])) form[args[i]] = data[args[i]]
}
}
}
// 设置Crud queryForm
export function setCrudQueryForm(_this, ...params?) {
if (arguments.length < 2) return
let args = Array.prototype.slice.call(arguments)
// 单个修改
for (let i = 1; i < args.length; i++) {
_this.queryForm[args[i].prop] = args[i].value
}
}

View File

@@ -0,0 +1,782 @@
/**
* 字典属性常量
* @author luolin
*/
let paramValTypes = [{
label: '表单字段',
value: '0',
}, {
label: 'SpEL表达式',
value: '1',
}, {
label: '固定值',
value: '2',
}]
let jobTypes = [{
label: '人员',
value: '0',
labelEn: 'User'
}, {
label: '角色',
value: '1',
labelEn: 'Role'
}, {
label: '岗位',
value: '2',
labelEn: 'Post'
}, {
label: '部门',
value: '3',
labelEn: 'Dept'
}]
let methods = [{
label: '当开启任务时',
value: 'startJob'
}, {
label: '当完成任务时',
value: 'completeJob'
}, {
label: '当开启下一步任务时',
value: 'startNextJob'
}, {
label: '当开启节点时',
value: 'startNode'
}, {
label: '当完成节点时',
value: 'completeNode'
}, {
label: '当开启下一步节点时',
value: 'startNextNode'
}, {
label: '当任务跳转时',
value: 'anyJump'
}, {
label: '当任务被跳转时',
value: 'anyJumped'
}, {
label: '当任务驳回时',
value: 'reject'
}, {
label: '当任务被驳回时',
value: 'rejected'
}, {
label: '当需分配参与者时',
value: 'distPerson'
}, {
label: '退回首节点时',
value: 'backFirst'
}, {
label: '退回上一步时',
value: 'backPre'
}]
export let DIC_PROP = {
YES_OR_NO: [{
label: '否',
value: '0',
labelEn: 'No'
}, {
label: '是',
value: '1',
labelEn: 'Yes'
}],
YES_OR_NO_BOOL: [{
label: '否',
value: false,
labelEn: 'No'
}, {
label: '是',
value: true,
labelEn: 'Yes'
}],
YES_OR_NO_NUM: [{
label: '否',
value: 0,
labelEn: 'No'
}, {
label: '是',
value: 1,
labelEn: 'Yes'
}],
DELEGATE_STATUS: [{
label: '暂存',
value: '-1',
labelEn: 'Temp'
}, {
label: '启用',
value: '0',
labelEn: 'Enable'
}, {
label: '停用',
value: '1',
labelEn: 'Disable'
}],
TEMP_STATUS: [{
label: '暂存',
value: '-1',
labelEn: 'Temp'
}, {
label: '作废',
value: '0',
labelEn: 'Invalid'
}, {
label: '发布',
value: '1',
labelEn: 'Publish'
}],
ORDER_STATUS: [{
label: '撤回',
value: '-2'
}, {
label: '暂存',
value: '-1'
}, {
label: '运行中',
value: '0'
}, {
label: '完成',
value: '1'
}, {
label: '作废',
value: '2'
}, {
label: '终止',
value: '3'
}],
HANDOVER_TYPE: [{
label: '任务交接',
value: '-1'
}, {
label: '可自定义更多',
value: '0'
}],
HANDOVER_REASON: [{
label: '日常交接',
value: '-1'
}, {
label: '晋升',
value: '0'
}, {
label: '转岗',
value: '1'
}, {
label: '离职',
value: '2'
}, {
label: '平调',
value: '3'
}],
HANDOVER_STATUS: [{
label: '撤回',
value: '-2'
}, {
label: '未交接',
value: '-1'
}, {
label: '交接中',
value: '0'
}, {
label: '已交接',
value: '1'
}, {
label: '作废',
value: '2'
}, {
label: '终止',
value: '3'
}],
NODE_TYPE: [
{
label: '开始节点',
value: '-1'
}, {
label: '串行节点',
value: '0'
}, {
label: '并行节点',
value: '1'
}, {
label: '结束节点',
value: '2'
}, {
label: '虚拟节点',
value: '3'
}, {
label: '横向泳道',
value: '8'
}, {
label: '纵向泳道',
value: '9'
}
],
LINK_TYPE: [
{
label: '节点到节点',
value: '0'
}, {
label: '节点到任务',
value: '1'
}
],
FLOW_METHOD_TYPE: [{
label: '发起人本人',
value: '0'
}, {
label: '单级部门主管',
value: '1'
}, {
label: '多级部门主管',
value: '2'
}, {
label: '指定部门主管',
value: '3'
}, {
label: '表单内人员',
value: '4'
}, {
label: '可自定义更多',
value: '-1'
}],
JOB_MSG_TYPE: [{
label: '个人任务',
value: '0'
}, {
label: '组任务',
value: '1'
}],
JOB_USER_TYPE: jobTypes,
JOB_USER_NONE_TYPE: [{
label: '无',
value: '-1',
labelEn: 'None'
},
...jobTypes
],
NODE_APPROVE_METHOD: [{
label: '会签(需所有节点通过)',
value: '1'
}, {
label: '或签(一个节点通过即可)',
value: '2'
}, {
label: '依次审批(按顺序依次通过)',
value: '3'
}],
APPROVE_METHOD: [{
label: '会签(需所有审批人同意)',
value: '1'
}, {
label: '或签(一名审批人同意即可)',
value: '2'
}, {
label: '依次审批(按顺序依次审批)',
value: '3'
}, {
label: '票签(自定义完成比率%)',
value: '4'
}],
SIGNATURE_TYPE: [{
label: '前加签',
value: '1',
labelEn: 'Before Signature'
}, {
label: '后加签',
value: '2',
labelEn: 'After Signature'
}, {
label: '加并签',
value: '3',
labelEn: 'Sign Together'
}],
NODE_SEQUENTIAL_TYPE: [{
label: '在当前节点之前审批',
value: '1'
}, {
label: '在当前节点之后审批',
value: '2'
}, {
label: '与当前节点同时审批',
value: '3'
}],
NODE_SIGNATURE_TYPE: [{
label: '前加节点',
value: '1'
}, {
label: '后加节点',
value: '2'
}, {
label: '加并节点',
value: '3'
}],
BELONG_TYPE: [{
label: '普通任务',
value: '0',
labelEn: 'Common Task'
}, {
label: '抄送任务',
value: '1',
labelEn: 'Copy Task'
}, {
label: '传阅任务',
value: '2',
labelEn: 'Pass task'
}],
JOB_BTNS: [{
label: '同意',
value: '0',
labelEn: 'Agree'
}, {
label: '前加节点',
value: '13',
labelEn: 'Before Node'
}, {
label: '后加节点',
value: '14',
labelEn: 'After Node'
}, {
label: '加并节点',
value: '15',
labelEn: 'Node Together'
}, {
label: '前加签',
value: '5',
labelEn: 'Before Signature'
}, {
label: '后加签',
value: '6',
labelEn: 'After Signature'
}, {
label: '加并签',
value: '7',
labelEn: 'Sign Together'
}, {
label: '退回首节点',
value: '1',
labelEn: 'Back First'
}, {
label: '退回上一步',
value: '10',
labelEn: 'Back Pre'
}, {
label: '任意跳转',
value: '8',
labelEn: 'Any Jump'
}, {
label: '任意驳回',
value: '2',
labelEn: 'Any Reject'
}, {
label: '抄送任务',
value: '11',
labelEn: 'Carbon Copy'
}, {
label: '传阅任务',
value: '12',
labelEn: 'Pass Read'
}, {
label: '下一办理人',
value: '3',
labelEn: 'Next Handler'
}, {
label: '转办任务',
value: '17',
labelEn: 'Turn Job'
}, {
label: '终止流程',
value: '18',
labelEn: 'Terminate'
}, {
label: '提前结束',
value: '9',
labelEn: 'Early End'
}, {
label: '作废流程',
value: '4',
labelEn: 'Invalid'
}, {
label: '分配参与者',
value: '-9',
labelEn: 'Dist Person'
}],
ROUTE_ACTIONS: [{
label: '暂停当前节点',
value: '-4',
labelEn: 'STop Current Node'
}, {
label: '开启下一节点',
value: '8',
labelEn: 'Start Next Node'
}, {
label: '通过',
value: '0',
labelEn: 'Agree'
}, {
label: '驳回到其他节点',
value: '2',
labelEn: 'Reject To Node'
}, {
label: '退回首节点',
value: '1',
labelEn: 'Back First'
}, {
label: '退回上一步',
value: '10',
labelEn: 'Back Pre'
}, {
label: '终止流程',
value: '18',
labelEn: 'Terminate'
}, {
label: '提前结束',
value: '9',
labelEn: 'Early End'
}, {
label: '可自定义更多',
value: '_define_',
labelEn: '_define_'
}],
MSG_TYPE: [{
label: '个人消息',
value: '0'
}, {
label: '群消息',
value: '1'
}],
NODE_STATUS: [{
label: '未开始',
value: '-1',
labelEn: 'No Start'
}, {
label: '办理中',
value: '0',
labelEn: 'Running'
}, {
label: '完成',
value: '1',
labelEn: 'Complete'
}, {
label: '驳回中',
value: '2',
labelEn: 'Rejecting'
}, {
label: '跳过',
value: '3',
labelEn: 'Skip'
}, {
label: '被驳回',
value: '9',
labelEn: 'Rejected'
}],
REJECT_STATUS: [{
label: '驳回中',
value: '0'
}, {
label: '结束',
value: '1'
}],
REJECT_TYPE: [{
label: '依次返回',
value: '0'
}, {
label: '直接返回',
value: '1'
}],
OPERATOR: [{
label: '等于',
value: '0'
}, {
label: '不等于',
value: '1'
}, {
label: '大于',
value: '2'
}, {
label: '大于等于',
value: '3'
}, {
label: '小于',
value: '4'
}, {
label: '小于等于',
value: '5'
}, {
label: '包含',
value: '6'
}, {
label: '不包含',
value: '7'
}],
VAL_TYPE: [{
label: '普通模式',
value: '-2'
}, {
label: '分配模式',
value: '-1'
}, {
label: '简单模式',
value: '0'
}, {
label: 'SpEL模式',// 针对人员为固定模式
value: '1'
}, {
label: '专业模式',
value: '2'
}, {
label: 'Http模式',
value: '3'
}],
NOTICE_STATUS: [{
label: '发起',
value: '-1'
}, {
label: '办理中',
value: '0'
}, {
label: '完成',
value: '1'
}],
TODO_JOB_STATUS: [{
label: '未开始',
value: '-1'
}, {
label: '办理中',
value: '0'
}, {
label: '驳回中',
value: '2'
}, {
label: '被驳回',
value: '9'
}],
FLOW_STATUS: [{
label: '撤回',
value: '-2',
labelEn: 'Recall'
}, {
label: '发起',
value: '-1',
labelEn: 'Initiate'
}, {
label: '运行中',
value: '0',
labelEn: 'Running'
}, {
label: '完结',
value: '1',
labelEn: 'End'
}, {
label: '作废',
value: '2',
labelEn: 'Invalid'
}, {
label: '终止',
value: '3',
labelEn: 'Terminate'
}],
NODE_METHODS: methods,
FLOW_METHODS: [{
label: '当流程发起时',
value: 'initiate'
}, {
label: '当流程完成时',
value: 'finish'
}, {
label: '当流程被撤回时',
value: 'recall'
}, {
label: '当流程被重发时',
value: 'reset'
}, {
label: '当流程被终止时',
value: 'terminate'
}, {
label: '当流程被作废时',
value: 'invalid'
}, {
label: '当流程被恢复时',
value: 'recover'
}, ...methods],
CLAZZ_TYPE: [{
label: '节点事件',
value: '0'
}, {
label: '全局事件',
value: '1'
}],
COLUMN_TYPE: [
{
label: "varchar",
value: "varchar"
},{
label: "bigint",
value: "bigint"
},{
label: "int",
value: "int"
},{
label: "double",
value: "double"
},{
label: "timestamp",
value: "timestamp"
},{
label: "date",
value: "date"
},{
label: "float",
value: "float"
},{
label: "bit",
value: "bit"
}
],
LOCK_FLAG: [{
label: '有效',
value: '0'
}, {
label: '锁定',
value: '9'
}],
DATABASE_TYPE: [{
label: 'MySQL数据库',
value: 'MySQL'
}, {
label: '达梦数据库',
value: 'DM'
}],
FORM_TYPE: [{
label: '设计表单',
value: '0'
}, {
label: '系统表单',
value: '1'
}],
FORM_DATA_TYPE: [{
label: '字段定义',
value: '0'
}, {
label: '权限配置',
value: '1'
}, {
label: '打印设计',
value: '2'
}],
FORM_PERM_TYPE: [{
label: '隐藏',
value: '-1'
}, {
label: '只读',
value: '0'
}, {
label: '可编辑',
value: '1'
}],
ALL_FORM_PERM_TYPE: [{
label: '全部只读',
value: '0'
}, {
label: '全部可编辑',
value: '1'
}],
PARAM_RULE_TYPE: [{
label: '人员规则',
value: '0'
}, {
label: '条件规则',
value: '1'
}, {
label: '父子流程',
value: '2'
}, {
label: '监听事件',
value: '3'
}, {
label: '查询/更新表单Http参数',
value: '4'
}, {
label: '保存子流程表单Http接口',
value: '5'
}, {
label: '更新子流程表单Http接口',
value: '6'
}, {
label: '更新父流程表单Http接口',
value: '7'
}, {
label: '节点路由',
value: '8'
}],
OR_OR_AND: [{
label: '或',
value: '0',
}, {
label: '且',
value: '1',
}],
PARAM_FROM: [{
label: '请求头',
value: '0',
}, {
label: '传参',
value: '1',
}, {
label: '回参',
value: '2',
}],
PARAM_VAL_TYPE: paramValTypes,
SYS_PARAM_VAL_TYPE: [{
label: '系统字段',
value: '0',
}, ...paramValTypes.slice(1)
],
HTTP_METHODS: [{
label: 'GET',
value: 'GET',
}, {
label: 'POST',
value: 'POST',
}, {
label: 'PUT',
value: 'PUT',
}, {
label: 'DELETE',
value: 'DELETE',
}],
PARAM_TYPES: [{
label: 'json',
value: '0',
}, {
label: 'form',
value: '1',
}],
PREDICT_OPTIONS: [{
label: '预测参与者',
value: 1,
}, {
label: '预测监听事件',
value: 2,
}, {
label: '预测节点路由',
value: 4,
}, {
label: '预测子流程',
value: 8
}, {
label: '预测审批过程',
value: 16,
}, {
label: '预测非自动流转',
value: 32,
}, {
label: '预测流程轨迹',
value: 0,
disabled: true
}, {
label: '预测连线条件',
value: 0,
disabled: true
}],
}

255
src/flow/support/extend.ts Normal file
View File

@@ -0,0 +1,255 @@
import {RouteRecordRaw} from "vue-router";
import {flowConfig} from "/@/flow/designer/config/flow-config";
import {Session} from "/@/utils/storage";
import {locationHash, vueKeySys} from "/@/api/order/order-key-vue";
import {useUserInfo} from "/@/stores/userInfo";
import {validateNull} from "/@/utils/validate";
import {getToDoneDetail} from "/@/api/jsonflow/hi-job";
import * as doJob from "/@/api/jsonflow/do-job";
import {DIC_PROP} from "/@/flow/support/dict-prop";
import {paramsFilter} from "/@/flow";
// 移动端path
export const vueAppKeyHash = {
flowview: 'jsonflow/flow-design/view'
, jobview: 'order/run-application/view'
, jobinitiate: 'order/flow-application/initiate'
, jobinitagain: 'order/run-application/initiate'
, jobform: 'order/run-application/flow'
}
export async function initJobDataByApp($route, props) {
let appdata = flowConfig.mobileConfig.mobilePrefix
let app = !validateNull($route.query[appdata]);
if (!app) return
let split = $route.query[appdata].split('-');
let query = {orderId: split[1], id: split[2], flowInstId: split[3], runNodeId: split[4], elTabId: split[5], hiJob: split[6] === 'Y'}
if (query.hiJob) {
await handleToDoneDetail(query, props, '1')
} else {
await handleTodoDetail(query, props)
}
props.currJob.hiJob = query.hiJob
props.currElTab.id = query.elTabId
}
export async function handleTodoDetail(row, data, isView?, isRead?, $message?, getDataList?) {
let query = Object.assign({}, row, {order: null, elTabs: null});
query = paramsFilter(query)
await doJob.getTodoDetail(query).then(response => {
if ($message) data.currJob = response.data
// 兼容移动端
else Object.assign(data.currJob, response.data);
if (isRead !== '1' && isView !== '1' && DIC_PROP.NODE_STATUS[2].value === data.currJob.status) {
if ($message) {
$message.warning('当前任务已被其他办理人审批')
getDataList();
}
} else {
if (isView !== '1') {
if (isRead === '1') data.currJob.hiJob = true
doJob.isRead(data.currJob).then(() => {
row.isRead = '1'
// 独立标签都需执行
if (isRead === '1') getDataList();
})
} else data.currJob.hiJob = true
}
})
}
const channel = new BroadcastChannel('currJob_channel');
export async function handleFlowPreview($router, row, isView?, isRead?, $message?, flowJob?, getDataList?) {
channel.onmessage = (event) => {
flowJob.delJobLen();
// getDataList();
};
row.isHiJob = '0'
windowOpenFlow($router, row, isView, isRead)
}
function windowOpenFlow($router, row, isView?, isRead?, isApp?, isForm?) {
let query = { id: row.id, flowInstId: row.flowInstId, isHiJob: row.isHiJob, isView, isRead, isApp, isForm }
$router.push({
name: dynamicRoutesFlow[0].name,
query: query
})
/*const routeUrl = $router.resolve({
path: dynamicRoutesFlow[0].path,
query: query,
});
window.open(routeUrl.href, '_blank');*/
}
export async function handleToDoneDetail(row, data, isApp?, isForm?) {
let query = Object.assign({}, row, {order: null, elTabs: null});
query = paramsFilter(query)
await getToDoneDetail(query).then(response => {
// 兼容移动端
if (isApp === '1') {
Object.assign(data.currJob, response.data);
return
}
data.currJob = response.data
if (isForm === '1') {
let elTabs = data.currJob.elTabs;
data.currJob.elTabs = elTabs.filter(f => vueKeySys.sysPaths.includes(f.path))
// 判断是否只配置表单
if (validateNull(data.currJob.elTabs)) data.currJob.elTabs = elTabs
}
// 历史查看标识
data.currJob.hiJob = true
})
}
export async function openFlowPreview($router, row, isForm?) {
row.isHiJob = '1'
windowOpenFlow($router, row, null, null, null, isForm)
}
export async function replaceRouterRoute(route, router) {
// 兼容移动端
let appPath = '', appdata = flowConfig.mobileConfig.mobilePrefix;
// 防止重复进入
if (route.fullPath.indexOf('?' + appdata + '=') !== -1) {
return
}
let index = route.fullPath.indexOf(appdata);
if (index !== -1) {
let last = route.fullPath.indexOf("-");
if (route.fullPath.indexOf('?' + appdata + '=') !== -1) last = route.fullPath.indexOf("?");
appPath = route.fullPath.substring(route.fullPath.indexOf("/") + 1, last);
router.currentRoute.value.name = "flowRoutes." + appPath
let fullPath = route.fullPath.replace('-', '?');
fullPath = fullPath.replace('-', '=');
fullPath = fullPath.replace(appPath, vueAppKeyHash[appPath]);
let split = fullPath.split('=')[1].split('-');
// 存储token 信息
if (split[0].indexOf('_') !== -1) {
// 判断是否微服务版本
let tokenTenant = split[0].replace('_', '-').split('-')
Session.set('tenantId', tokenTenant[0]);
Session.set('token', tokenTenant[1].replaceAll('_', '-'));
} else {
Session.set('token', split[0]);
}
// 触发初始化用户信息 pinia
await useUserInfo().setUserInfos();
await router.replace(fullPath);
}
}
export async function replaceRouterThirdRoute(route, router) {
let fullPath = route.fullPath;
// 防止重复进入
if (fullPath.indexOf('tokenLoaded') !== -1) {
// 防止刷新后无用户信息
await useUserInfo().setUserInfos();
return
}
// 三方系统单点
if (fullPath.indexOf('token') !== -1) {
Session.clear()
fullPath = fullPath.replace('token', 'tokenLoaded');
// 存储token 信息
Session.set('tenantId', route.query.tenantId);
Session.set('token', route.query.token);
} else {
fullPath = route.fullPath + '&tokenLoaded=1';
}
// 必须获取用户信息
await useUserInfo().setUserInfos();
router.currentRoute.value.name = "staticRoutes.handleoajob"
await router.replace(fullPath);
}
export function initJsonFlowViewByApp($route, props) {
let appdata = flowConfig.mobileConfig.mobilePrefix
let app = !validateNull($route.query[appdata]);
if (app) {
let split = $route.query[appdata].split('-');
let query = {defFlowId: split[1], flowInstId: split[2] === 'undefined' ? '' : split[2]}
Object.assign(props.currJob, query);
}
}
export function windowLocationHrefParam(hash, param = '') {
return window.location.href = window.location.origin + window.location.pathname + locationHash[hash] + param
}
export function windowLocationHref(hash) {
window.location.href = window.location.origin + window.location.pathname + hash
}
/**
* 定义静态路由(默认路由)
*/
export const staticRoutesFlow: Array<RouteRecordRaw> = [
{
path: '/jsonflow/flow-design/view',
name: 'flowRoutes.flowview',
component: () => import('/@/views/jsonflow/flow-design/view.vue'),
meta: {
isAuth: false,
},
},
{
path: '/order/run-application/view',
name: 'flowRoutes.jobview',
component: () => import('/@/views/order/run-application/view.vue'),
meta: {
isAuth: false,
},
},
{
path: '/order/flow-application/initiate',
name: 'flowRoutes.jobinitiate',
component: () => import('/@/views/order/flow-application/initiate.vue'),
meta: {
isAuth: false,
},
},
{
path: '/order/run-application/initiate',
name: 'flowRoutes.jobinitagain',
component: () => import('/@/views/order/run-application/initiate.vue'),
meta: {
isAuth: false,
},
},
{
path: '/order/run-application/flow',
name: 'flowRoutes.jobform',
component: () => import('/@/views/order/run-application/flow.vue'),
meta: {
isAuth: false,
},
}
];
/**
* 定义静态路由(默认路由)
* 前端添加路由,请在此处加
*/
export const dynamicRoutesFlow: Array<RouteRecordRaw> = [
{
path: '/flow/components/handle-job/handle',
name: 'flowRoutes.handlejob',
component: () => import('/@/flow/components/handle-job/handle.vue'),
meta: {
isKeepAlive: false,
isHide: true,
},
},
{
path: '/jsonflow/flow-design/index',
name: 'flowRoutes.flowdesign',
component: () => import('/@/views/jsonflow/flow-design/index.vue'),
meta: {
isKeepAlive: false,
isHide: true,
},
},
];

View File

@@ -0,0 +1,85 @@
/**
* 字段属性常量
* @author luolin
*/
const varKeyVal = {
sys: '#sys.',
flow: '#flow.',
order: '#order.',
form: '#form.',
user: '#user.',
var: '#var.',
dist: '#dist.',
}
export let PROP_CONST = {
COMMON: {
flowInstId: 'flowInstId',
code: 'code',
userUserPrefix: 'USER_',
userRolePrefix: 'ROLE_',
userPostPrefix: 'POST_',
userDeptPrefix: 'DEPT_',
tableName: 'order_run_application',
},
FORM_DESIGN: {
// 注意相反的!
subForm: 'group',
group: 'subForm',
fcRow: 'fcRow',
tableForm: 'tableForm',
fcTable: 'fcTable',
elTabs: 'elTabs',
elCollapse: 'elCollapse',
elCard: 'elCard',
},
TEXT_DESC: {
condSpELExplain: "当选择SpEL模式时, SpEL表达式必须符合SpEL格式, #anyKey表示表单的字段 ( 默认#form.前缀 ), 例如0<#days && #days>=3 ( 加前缀#var.anyKey表示从流程条件中取值#user.anyKey表示从当前用户中取值 )",
condUserExplain: "1、SpEL上下文表达式 ( 常用于发起时可确定的参与者值 ), #anyKey表示表单的字段 ( 默认#form.前缀 ), 例如#userId ( 加前缀#var.anyKey表示从流程条件中取值#user.anyKey表示从当前用户中取值 )",
condMethodExplain1: "采用函数表达式 ( 以下两种方式均支持自定义任意扩展 ), 返回值为字符串 1 ( 满足 ) 或 0 ( 不满足 ), 满足您复杂条件的场景 :",
condMethodExplain2: "1、SpEL上下文表达式, #anyKey表示表单的字段 ( 默认#form.前缀 ), 例如#isGoEnd ( 加前缀#var.anyKey表示从流程条件中取值#user.anyKey表示从当前用户中取值 )",
condMethodExplain3: '2、SpringBean函数表达式, 如某个Bean对象的beanName为bean取值#bean.anyMethod(), 带参数格式#bean.anyMethod(String#admin,SysUser#{"username": "admin"},SysRole#NULL)',
condMethodExplain4: '备注:函数表达式 ( 参数支持SpEL上下文表达式且需带前缀如Long#form.userId ), 参数格式为#bean.anyMethod(参数类型#参数值), 多个参数逗号分割。类型为复杂对象时参数值为Json格式',
condMethodExplain5: '字段可包含参与者类型、参与者ID、参与者任务名称、参与者任务排序( 只有ID值时参与者类型默认人员参与者ID是人员ID )',
condMethodExplain6: '返回值要求请参考路由指定动作接口的入参',
},
HANDOVER_FLOW: {
userKey: {
create_user:'create_user'
,receive_user:'receive_user'
,curr_dept_manager:'curr_dept_manager'
}
},
LOAD_USER_ROLE: [
{key: "users", type: "jobType", typeVal: "0", field: 'roleId'}, {key: "roles", type: "jobType", typeVal: "1", field: 'roleId'},
{key: "posts", type: "jobType", typeVal: "2", field: 'roleId'}, {key: "depts", type: "jobType", typeVal: "3", field: 'roleId'}
],
SYS_FIELDS: [
// 用 order 简化报表打印回显
{prefix: varKeyVal.order, prop:"flowInstId", label:"流程实例ID", valueKey: "id", showKey: "flowName"}
,{prefix: varKeyVal.order, prop:"flowKey", label:"流程业务KEY"}
,{prefix: varKeyVal.order, prop:"createUser", label:"发起人", valueKey: "userId", showKey: "name"}
,{prefix: varKeyVal.order, prop:"code", label:"工单编号"}
,{prefix: varKeyVal.order, prop:"status", label:"工单状态"}
,{prefix: varKeyVal.order, prop:"createTime", label:"发起时间"}
,{prefix: varKeyVal.order, prop:"finishTime", label:"完成时间"}
,{prefix: varKeyVal.order, prop:"_define_", label:"可自定义更多"}
],
VAR_KEY_VAL: {
route: '#route.',
routeName: '路由规则',
person: '#person.',
personName: '审批规则',
link: '#link.',
// 取值来源
order: varKeyVal.order,
form: varKeyVal.form,
user: varKeyVal.user,
var: varKeyVal.var,
dist: varKeyVal.dist,
},
FLOW_METHOD: {
whoseLeader: {name: '发起人本人', userId: varKeyVal.order.replace("#", "") + 'createUser'}
},
}