From 4baab5450927601a674c0e71a2776c7a1f43ac03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=A6=8D?= <1455167345@qq.com> Date: Tue, 26 Mar 2024 16:42:25 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=81=8C=E7=BA=A7=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E6=A0=91=E7=9A=84=E5=BD=A2=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E8=8A=82=E7=82=B9=E4=B8=80=E4=BA=9B=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=B0=81=E8=A3=85=E3=80=82=E8=8A=82=E7=82=B9=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=8D=A2=E6=88=90pinia=E5=AD=98=E5=82=A8=E3=80=82?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=AF=86=E7=A0=81=E5=8A=A0=E5=AF=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/api/demo/model/systemModel.ts | 13 +- src/api/demo/system.ts | 26 +- src/components/FlowDiagram/index.vue | 119 ++++ src/components/FlowDiagram/plugins/auth.js | 60 ++ src/components/FlowDiagram/plugins/cache.js | 77 +++ .../FlowDiagram/plugins/download.js | 65 +++ src/components/FlowDiagram/plugins/index.js | 20 + src/components/FlowDiagram/plugins/modal.js | 83 +++ .../package/designer/ProcessDesigner.vue | 208 +++++++ .../plugins/package/designer/index.ts | 7 + .../package/designer/plugins/defaultEmpty.ts | 27 + .../plugins/translate/customTranslate.ts | 9 + .../package/designer/plugins/translate/zh.ts | 253 +++++++++ .../plugins/package/highlight/index.js | 5 + .../FlowDiagram/plugins/package/index.js | 7 + .../plugins/package/penal/PropertiesPanel.vue | 111 ++++ .../package/penal/base/ElementBaseInfo.vue | 76 +++ .../penal/flow-condition/FlowCondition.vue | 142 +++++ .../package/penal/form/ElementForm.vue | 390 +++++++++++++ .../plugins/package/penal/index.js | 7 + .../penal/listeners/ElementListeners.vue | 296 ++++++++++ .../penal/listeners/UserTaskListeners.vue | 319 +++++++++++ .../package/penal/listeners/template.js | 178 ++++++ .../package/penal/listeners/utilSelf.js | 62 +++ .../multi-instance/ElementMultiInstance.vue | 192 +++++++ .../penal/other/ElementOtherConfig.vue | 59 ++ .../penal/properties/ElementProperties.vue | 134 +++++ .../penal/signal-message/SignalAndMessage.vue | 104 ++++ .../package/penal/task/ElementTask.vue | 74 +++ .../task/task-components/ReceiveTask.vue | 97 ++++ .../penal/task/task-components/ScriptTask.vue | 85 +++ .../task/task-components/ServiceTask.vue | 86 +++ .../penal/task/task-components/UserTask.vue | 525 ++++++++++++++++++ .../package/theme/flow-element-variables.scss | 63 +++ .../plugins/package/theme/index.scss | 171 ++++++ .../package/theme/process-designer.scss | 153 +++++ .../plugins/package/theme/process-panel.scss | 110 ++++ .../FlowDiagram/plugins/package/utils.js | 69 +++ src/components/FlowDiagram/plugins/tab.js | 71 +++ src/components/ProcessDesigner/index.vue | 57 +- .../package/designer/ProcessDesigner.vue | 140 +---- .../package/penal/PropertiesPanel.vue | 462 ++++++++------- .../package/penal/auth/index.vue | 72 ++- .../package/penal/endEvent/index.vue | 23 +- .../package/penal/exclusiveGateway/index.vue | 138 +++-- .../exclusiveGateway/src/conditionFormula.vue | 57 +- .../exclusiveGateway/src/conditionSql.vue | 32 +- .../package/penal/inclusiveGateway/index.vue | 347 ++++++------ .../package/penal/myline/index.vue | 93 +--- .../package/penal/parallelGateway/index.vue | 134 ++--- .../package/penal/shcemeInfo/index.vue | 30 +- .../package/penal/startEvent/index.vue | 104 +--- .../package/penal/subprocess/index.vue | 73 +-- .../package/penal/userTask/index.vue | 327 ++++++----- .../penal/userTask/src/auditorLevel.vue | 28 +- .../penal/userTask/src/auditorNode.vue | 134 +++-- .../package/penal/userTask/src/auditorSql.vue | 209 +++---- src/components/SelectAccount/DeptTree.vue | 9 +- src/components/SelectAccount/index.vue | 6 + src/components/SelectPos/DeptTree.vue | 36 ++ src/components/SelectPos/account.data.ts | 48 ++ src/components/SelectPos/index.vue | 115 ++-- src/components/SelectTable/index.vue | 27 +- src/store/modules/flow.ts | 50 ++ src/store/modules/user.ts | 3 +- src/views/demo/system/account/DeptTree.vue | 9 +- src/views/demo/workflow/scheme/index.vue | 6 +- src/views/demo/workflow/scheme/preview.vue | 5 +- 69 files changed, 6026 insertions(+), 1302 deletions(-) create mode 100644 src/components/FlowDiagram/index.vue create mode 100644 src/components/FlowDiagram/plugins/auth.js create mode 100644 src/components/FlowDiagram/plugins/cache.js create mode 100644 src/components/FlowDiagram/plugins/download.js create mode 100644 src/components/FlowDiagram/plugins/index.js create mode 100644 src/components/FlowDiagram/plugins/modal.js create mode 100644 src/components/FlowDiagram/plugins/package/designer/ProcessDesigner.vue create mode 100644 src/components/FlowDiagram/plugins/package/designer/index.ts create mode 100644 src/components/FlowDiagram/plugins/package/designer/plugins/defaultEmpty.ts create mode 100644 src/components/FlowDiagram/plugins/package/designer/plugins/translate/customTranslate.ts create mode 100644 src/components/FlowDiagram/plugins/package/designer/plugins/translate/zh.ts create mode 100644 src/components/FlowDiagram/plugins/package/highlight/index.js create mode 100644 src/components/FlowDiagram/plugins/package/index.js create mode 100644 src/components/FlowDiagram/plugins/package/penal/PropertiesPanel.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/base/ElementBaseInfo.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/flow-condition/FlowCondition.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/form/ElementForm.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/index.js create mode 100644 src/components/FlowDiagram/plugins/package/penal/listeners/ElementListeners.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/listeners/UserTaskListeners.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/listeners/template.js create mode 100644 src/components/FlowDiagram/plugins/package/penal/listeners/utilSelf.js create mode 100644 src/components/FlowDiagram/plugins/package/penal/multi-instance/ElementMultiInstance.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/other/ElementOtherConfig.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/properties/ElementProperties.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/signal-message/SignalAndMessage.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/task/ElementTask.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/task/task-components/ReceiveTask.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/task/task-components/ScriptTask.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/task/task-components/ServiceTask.vue create mode 100644 src/components/FlowDiagram/plugins/package/penal/task/task-components/UserTask.vue create mode 100644 src/components/FlowDiagram/plugins/package/theme/flow-element-variables.scss create mode 100644 src/components/FlowDiagram/plugins/package/theme/index.scss create mode 100644 src/components/FlowDiagram/plugins/package/theme/process-designer.scss create mode 100644 src/components/FlowDiagram/plugins/package/theme/process-panel.scss create mode 100644 src/components/FlowDiagram/plugins/package/utils.js create mode 100644 src/components/FlowDiagram/plugins/tab.js create mode 100644 src/components/SelectPos/DeptTree.vue create mode 100644 src/components/SelectPos/account.data.ts create mode 100644 src/store/modules/flow.ts diff --git a/package.json b/package.json index eff83b9..7f641b2 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "echarts": "^5.4.3", "exceljs": "^4.4.0", "highlight.js": "^11.9.0", + "js-md5": "^0.8.3", "lodash": "^4.17.21", "lodash-es": "^4.17.21", "mars3d": "^3.7.0", diff --git a/src/api/demo/model/systemModel.ts b/src/api/demo/model/systemModel.ts index 1faa1a0..df538e9 100644 --- a/src/api/demo/model/systemModel.ts +++ b/src/api/demo/model/systemModel.ts @@ -60,11 +60,14 @@ export interface RoleListItem { orderNo: string; createTime: string; } -export interface addDept{ - name:string, - parentId:string, - parentName:string, - status:number +export interface addDept { + name: string, + parentId: string, + parentName: string, + status: number +} +export interface PositionByOrgParams { + orgid: string } /** diff --git a/src/api/demo/system.ts b/src/api/demo/system.ts index 7b5dd40..4fd1353 100644 --- a/src/api/demo/system.ts +++ b/src/api/demo/system.ts @@ -5,7 +5,7 @@ import { RoleParams, RolePageParams, MenuListGetResultModel, - MenuDetailGetResultModel, + PositionByOrgParams, DeptListGetResultModel, AccountListGetResultModel, RolePageListGetResultModel, @@ -44,13 +44,15 @@ enum Api { OrgPosGroup = '/api/Orgs/OrgPosGroup', UserRoles = '/api/Users/UserRoles', OrgPositonTree = '/api/Orgs/OrgPositonTree', - UserOrgs ='/api/Users/UserOrgs', - AssignModule='/api/Roles/AssignModule', - LoadForRole='/api/Modules/LoadForRole', - LoadByRole='/api/Users/LoadByRole', + UserOrgs = '/api/Users/UserOrgs', + AssignModule = '/api/Roles/AssignModule', + LoadForRole = '/api/Modules/LoadForRole', + LoadByRole = '/api/Users/LoadByRole', IsAccountExist = '/system/accountExist', setRoleStatus = '/system/setRoleStatus', GetAllRoleList = '/system/getAllRoleList', + LoadPositionByOrg = '/api/SysPosition/LoadPositionByOrg', + LoadDataBaseLinkTree = '/api/SysDatabaseLink/LoadDataBaseLinkTree', } export const getPositionsTree = (params: AccountParams) => @@ -74,10 +76,10 @@ export const getOrgList = (params?: DeptListItem) => export const getOrgPositonTree = (params?: DeptListItem) => defHttp.get({ url: Api.OrgPositonTree, params }); - export const loadForRole = (params?: DeptListItem) => +export const loadForRole = (params?: DeptListItem) => defHttp.get({ url: Api.LoadForRole, params }); - - export const loadByRole = (params?: DeptListItem) => + +export const loadByRole = (params?: DeptListItem) => defHttp.get({ url: Api.LoadByRole, params }); export function addAccount(params) { @@ -269,3 +271,11 @@ export const setRoleStatus = (id: number, status: string) => export const isAccountExist = (account: string) => defHttp.post({ url: Api.IsAccountExist, params: { account } }, { errorMessageMode: 'none' }); + +export const getLoadPositionByOrg = (params?: PositionByOrgParams) => + defHttp.get({ url: Api.LoadPositionByOrg, params }); + +export const getLoadDataBaseLinkTree = (params) => + defHttp.get({ url: Api.LoadDataBaseLinkTree, params }); + + diff --git a/src/components/FlowDiagram/index.vue b/src/components/FlowDiagram/index.vue new file mode 100644 index 0000000..fa0e201 --- /dev/null +++ b/src/components/FlowDiagram/index.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/src/components/FlowDiagram/plugins/auth.js b/src/components/FlowDiagram/plugins/auth.js new file mode 100644 index 0000000..6c6bc24 --- /dev/null +++ b/src/components/FlowDiagram/plugins/auth.js @@ -0,0 +1,60 @@ +import store from '@/store' + +function authPermission(permission) { + const all_permission = "*:*:*"; + const permissions = store.getters && store.getters.permissions + if (permission && permission.length > 0) { + return permissions.some(v => { + return all_permission === v || v === permission + }) + } else { + return false + } +} + +function authRole(role) { + const super_admin = "admin"; + const roles = store.getters && store.getters.roles + if (role && role.length > 0) { + return roles.some(v => { + return super_admin === v || v === role + }) + } else { + return false + } +} + +export default { + // 验证用户是否具备某权限 + hasPermi(permission) { + return authPermission(permission); + }, + // 验证用户是否含有指定权限,只需包含其中一个 + hasPermiOr(permissions) { + return permissions.some(item => { + return authPermission(item) + }) + }, + // 验证用户是否含有指定权限,必须全部拥有 + hasPermiAnd(permissions) { + return permissions.every(item => { + return authPermission(item) + }) + }, + // 验证用户是否具备某角色 + hasRole(role) { + return authRole(role); + }, + // 验证用户是否含有指定角色,只需包含其中一个 + hasRoleOr(roles) { + return roles.some(item => { + return authRole(item) + }) + }, + // 验证用户是否含有指定角色,必须全部拥有 + hasRoleAnd(roles) { + return roles.every(item => { + return authRole(item) + }) + } +} diff --git a/src/components/FlowDiagram/plugins/cache.js b/src/components/FlowDiagram/plugins/cache.js new file mode 100644 index 0000000..6b5c00b --- /dev/null +++ b/src/components/FlowDiagram/plugins/cache.js @@ -0,0 +1,77 @@ +const sessionCache = { + set (key, value) { + if (!sessionStorage) { + return + } + if (key != null && value != null) { + sessionStorage.setItem(key, value) + } + }, + get (key) { + if (!sessionStorage) { + return null + } + if (key == null) { + return null + } + return sessionStorage.getItem(key) + }, + setJSON (key, jsonValue) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)) + } + }, + getJSON (key) { + const value = this.get(key) + if (value != null) { + return JSON.parse(value) + } + }, + remove (key) { + sessionStorage.removeItem(key); + } +} +const localCache = { + set (key, value) { + if (!localStorage) { + return + } + if (key != null && value != null) { + localStorage.setItem(key, value) + } + }, + get (key) { + if (!localStorage) { + return null + } + if (key == null) { + return null + } + return localStorage.getItem(key) + }, + setJSON (key, jsonValue) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)) + } + }, + getJSON (key) { + const value = this.get(key) + if (value != null) { + return JSON.parse(value) + } + }, + remove (key) { + localStorage.removeItem(key); + } +} + +export default { + /** + * 会话级缓存 + */ + session: sessionCache, + /** + * 本地缓存 + */ + local: localCache +} diff --git a/src/components/FlowDiagram/plugins/download.js b/src/components/FlowDiagram/plugins/download.js new file mode 100644 index 0000000..b27702f --- /dev/null +++ b/src/components/FlowDiagram/plugins/download.js @@ -0,0 +1,65 @@ +import axios from 'axios' +import {Loading, Message} from 'element-ui' +import { saveAs } from 'file-saver' +import { getToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { blobValidate } from "@/utils/ruoyi"; + +const baseURL = process.env.VUE_APP_BASE_API +let downloadLoadingInstance; + +export default { + oss(ossId) { + var url = baseURL + '/system/oss/download/' + ossId + downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res) => { + const isBlob = blobValidate(res.data); + if (isBlob) { + const blob = new Blob([res.data], { type: 'application/octet-stream' }) + this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) + } else { + this.printErrMsg(res.data); + } + downloadLoadingInstance.close(); + }).catch((r) => { + console.error(r) + Message.error('下载文件出现错误,请联系管理员!') + downloadLoadingInstance.close(); + }) + }, + zip(url, name) { + var url = baseURL + url + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { + 'Authorization': 'Bearer ' + getToken(), + 'datasource': localStorage.getItem("dataName") + } + }).then((res) => { + const isBlob = blobValidate(res.data); + if (isBlob) { + const blob = new Blob([res.data], { type: 'application/zip' }) + this.saveAs(blob, name) + } else { + this.printErrMsg(res.data); + } + }) + }, + saveAs(text, name, opts) { + saveAs(text, name, opts); + }, + async printErrMsg(data) { + const resText = await data.text(); + const rspObj = JSON.parse(resText); + const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] + Message.error(errMsg); + } +} + diff --git a/src/components/FlowDiagram/plugins/index.js b/src/components/FlowDiagram/plugins/index.js new file mode 100644 index 0000000..d000f2d --- /dev/null +++ b/src/components/FlowDiagram/plugins/index.js @@ -0,0 +1,20 @@ +import tab from './tab' +import auth from './auth' +import cache from './cache' +import modal from './modal' +import download from './download' + +export default { + install(Vue) { + // 页签操作 + Vue.prototype.$tab = tab + // 认证对象 + Vue.prototype.$auth = auth + // 缓存对象 + Vue.prototype.$cache = cache + // 模态框对象 + Vue.prototype.$modal = modal + // 下载文件 + Vue.prototype.$download = download + } +} diff --git a/src/components/FlowDiagram/plugins/modal.js b/src/components/FlowDiagram/plugins/modal.js new file mode 100644 index 0000000..b37ca14 --- /dev/null +++ b/src/components/FlowDiagram/plugins/modal.js @@ -0,0 +1,83 @@ +import { Message, MessageBox, Notification, Loading } from 'element-ui' + +let loadingInstance; + +export default { + // 消息提示 + msg(content) { + Message.info(content) + }, + // 错误消息 + msgError(content) { + Message.error(content) + }, + // 成功消息 + msgSuccess(content) { + Message.success(content) + }, + // 警告消息 + msgWarning(content) { + Message.warning(content) + }, + // 弹出提示 + alert(content) { + MessageBox.alert(content, "系统提示") + }, + // 错误提示 + alertError(content) { + MessageBox.alert(content, "系统提示", { type: 'error' }) + }, + // 成功提示 + alertSuccess(content) { + MessageBox.alert(content, "系统提示", { type: 'success' }) + }, + // 警告提示 + alertWarning(content) { + MessageBox.alert(content, "系统提示", { type: 'warning' }) + }, + // 通知提示 + notify(content) { + Notification.info(content) + }, + // 错误通知 + notifyError(content) { + Notification.error(content); + }, + // 成功通知 + notifySuccess(content) { + Notification.success(content) + }, + // 警告通知 + notifyWarning(content) { + Notification.warning(content) + }, + // 确认窗体 + confirm(content) { + return MessageBox.confirm(content, "系统提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: "warning", + }) + }, + // 提交内容 + prompt(content) { + return MessageBox.prompt(content, "系统提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: "warning", + }) + }, + // 打开遮罩层 + loading(content) { + loadingInstance = Loading.service({ + lock: true, + text: content, + spinner: "el-icon-loading", + background: "rgba(0, 0, 0, 0.7)", + }) + }, + // 关闭遮罩层 + closeLoading() { + loadingInstance.close(); + } +} diff --git a/src/components/FlowDiagram/plugins/package/designer/ProcessDesigner.vue b/src/components/FlowDiagram/plugins/package/designer/ProcessDesigner.vue new file mode 100644 index 0000000..cefa73c --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/designer/ProcessDesigner.vue @@ -0,0 +1,208 @@ + + + \ No newline at end of file diff --git a/src/components/FlowDiagram/plugins/package/designer/index.ts b/src/components/FlowDiagram/plugins/package/designer/index.ts new file mode 100644 index 0000000..0566ee9 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/designer/index.ts @@ -0,0 +1,7 @@ +import BpmnProcessDesigner from "./ProcessDesigner.vue"; + +BpmnProcessDesigner.install = function(Vue) { + Vue.component(BpmnProcessDesigner.name, BpmnProcessDesigner); +}; + +export default BpmnProcessDesigner; diff --git a/src/components/FlowDiagram/plugins/package/designer/plugins/defaultEmpty.ts b/src/components/FlowDiagram/plugins/package/designer/plugins/defaultEmpty.ts new file mode 100644 index 0000000..9ec1df1 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/designer/plugins/defaultEmpty.ts @@ -0,0 +1,27 @@ +export default (key, name, type) => { + if (!type) type = "camunda"; + const TYPE_TARGET = { + activiti: "http://activiti.org/bpmn", + camunda: "http://bpmn.io/schema/bpmn", + flowable: "http://flowable.org/bpmn" + }; + return ` + + + + + + + + + + `; +}; diff --git a/src/components/FlowDiagram/plugins/package/designer/plugins/translate/customTranslate.ts b/src/components/FlowDiagram/plugins/package/designer/plugins/translate/customTranslate.ts new file mode 100644 index 0000000..5ed03d5 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/designer/plugins/translate/customTranslate.ts @@ -0,0 +1,9 @@ +import translations from './zh.ts' + +export default function customTranslate(template, replacements) { + replacements = replacements || {} + template = translations[template] || template + return template.replace(/{([^}]+)}/g, function (_, key) { + return replacements[key] || '{' + key + '}' + }) +} diff --git a/src/components/FlowDiagram/plugins/package/designer/plugins/translate/zh.ts b/src/components/FlowDiagram/plugins/package/designer/plugins/translate/zh.ts new file mode 100644 index 0000000..9927cb4 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/designer/plugins/translate/zh.ts @@ -0,0 +1,253 @@ +export default { + "Activate hand tool": "激活抓手工具", + "Activate lasso tool": "激活套索工具", + "Activate create/remove space tool": "激活创建/删除空间工具", + "Activate global connect tool": "激活全局连接工具", + "Create start event": "创建开始事件", + "Create end event": "创建结束事件", + "Create task": "创建任务", + "Create user task": "创建用户任务", + "Create gateway": "创建网关", + "Create data object reference": "创建数据对象", + "Create data store reference": "创建数据存储", + "Create group": "创建分组", + "Create intermediate/boundary event": "创建中间/边界事件", + "Create expanded sub-process": "创建扩展子过程", + "Create pool/participant": "创建池/参与者", + "Change element": "修改类型", + "Delete": "移除", + "Append end event": "追加结束事件", + "Append gateway": "追加网关", + "Append task": "追加任务", + "Append intermediate/boundary event": "追加中间抛出事件/边界事件", + "Add text annotation": "添加 text annotation", + "Connect using association": "使用关联连接", + "Connect to other element": "消息关联", + "Start event": "开始事件", + "End event": "结束事件", + "Message intermediate catch event": "消息中间捕获事件", + "Message intermediate throw event": "消息中间抛出事件", + "Timer intermediate catch event": "定时中间捕获事件", + "Escalation intermediate throw event": "升级中间抛出事件", + "Conditional intermediate catch event": "条件中间捕获事件", + "Link intermediate catch event": "链接中间捕获事件", + "Link intermediate throw event": "链接中间抛出事件", + "Compensation intermediate throw event": "补偿中间抛出事件", + "Signal intermediate catch event": "信号中间捕获事件", + "Signal intermediate throw event": "信号中间抛出事件", + "User task": "用户任务", + "Service task": "服务任务", + "Send task": "发送任务", + "Receive task": "、接收任务", + "Manual task": "手动任务", + "Business rule task": "业务规则任务", + "Script task": "脚本任务", + "Call activity": "调用活动", + "Sub-process (collapsed)": "子流程(已折叠)", + "Sub-process (expanded)": "子流程(扩大)", + "Intermediate throw event": "中间抛出事件", + "Message start event": "消息开始事件", + "Timer start event": "定时开始事件", + "Conditional start event": "条件开始事件", + "Signal start event": "信号开始事件", + "Exclusive gateway":"排他网关", + "Parallel gateway":"并行网关", + "Inclusive gateway":"包容网关", + "Complex gateway":"复杂网关", + "Event-based gateway":"事件网关", + "Message end event":"消息结束事件", + "Escalation end event":"升级结束事件", + "Error end event":"错误结束事件", + "Compensation end event":"补偿结束事件", + "Signal end event":"信号结束事件", + "Terminate end event":"终止结束事件", + + + + + + "Process": "业务流程", + "Append EndEvent": "追加结束事件", + "Append Gateway": "追加网关", + "Append Task": "追加任务", + "Append Intermediate/Boundary Event": "追加中间抛出事件/边界事件", + "Activate the global connect tool": "激活全局连接工具", + "Append {type}": "添加 {type}", + "Add Lane above": "在上面添加道", + "Divide into two Lanes": "分割成两个道", + "Divide into three Lanes": "分割成三个道", + "Add Lane below": "在下面添加道", + "Append compensation activity": "追加补偿活动", + "Change type": "修改类型", + "Connect using Association": "使用关联连接", + "Connect using Sequence/MessageFlow or Association": "使用顺序/消息流或者关联连接", + "Connect using DataInputAssociation": "使用数据输入关联连接", + "Remove": "移除", + "Activate the hand tool": "激活抓手工具", + "Activate the lasso tool": "激活套索工具", + "Activate the create/remove space tool": "激活创建/删除空间工具", + "Create expanded SubProcess": "创建扩展子过程", + "Create IntermediateThrowEvent/BoundaryEvent": "创建中间抛出事件/边界事件", + "Create Pool/Participant": "创建池/参与者", + "Parallel Multi Instance": "并行多重事件", + "Sequential Multi Instance": "时序多重事件", + "DataObjectReference": "数据对象参考", + "DataStoreReference": "数据存储参考", + "Loop": "循环", + "Ad-hoc": "即席", + "Create {type}": "创建 {type}", + "Create StartEvent": "创建开始事件", + "Create EndEvent": "创建结束事件", + "Create Task": "创建任务", + "Create User Task": "创建用户任务", + "Create Gateway": "创建网关", + "Create DataObjectReference": "创建数据对象", + "Create DataStoreReference": "创建数据存储", + "Create Group": "创建分组", + "Create Intermediate/Boundary Event": "创建中间/边界事件", + "Message Start Event": "消息开始事件", + "Timer Start Event": "定时开始事件", + "Conditional Start Event": "条件开始事件", + "Signal Start Event": "信号开始事件", + "Error Start Event": "错误开始事件", + "Escalation Start Event": "升级开始事件", + "Compensation Start Event": "补偿开始事件", + "Message Start Event (non-interrupting)": "消息开始事件(非中断)", + "Timer Start Event (non-interrupting)": "定时开始事件(非中断)", + "Conditional Start Event (non-interrupting)": "条件开始事件(非中断)", + "Signal Start Event (non-interrupting)": "信号开始事件(非中断)", + "Escalation Start Event (non-interrupting)": "升级开始事件(非中断)", + "Message Intermediate Catch Event": "消息中间捕获事件", + "Message Intermediate Throw Event": "消息中间抛出事件", + "Timer Intermediate Catch Event": "定时中间捕获事件", + "Escalation Intermediate Throw Event": "升级中间抛出事件", + "Conditional Intermediate Catch Event": "条件中间捕获事件", + "Link Intermediate Catch Event": "链接中间捕获事件", + "Link Intermediate Throw Event": "链接中间抛出事件", + "Compensation Intermediate Throw Event": "补偿中间抛出事件", + "Signal Intermediate Catch Event": "信号中间捕获事件", + "Signal Intermediate Throw Event": "信号中间抛出事件", + "Collapsed Pool": "折叠池", + "Expanded Pool": "展开池", + "no parent for {element} in {parent}": "在{parent}里,{element}没有父类", + "no shape type specified": "没有指定的形状类型", + "flow elements must be children of pools/participants": "流元素必须是池/参与者的子类", + "out of bounds release": "out of bounds release", + "more than {count} child lanes": "子道大于{count} ", + "element required": "元素不能为空", + "diagram not part of bpmn:Definitions": "流程图不符合bpmn规范", + "no diagram to display": "没有可展示的流程图", + "no process or collaboration to display": "没有可展示的流程/协作", + "element {element} referenced by {referenced}#{property} not yet drawn": + "由{referenced}#{property}引用的{element}元素仍未绘制", + "already rendered {element}": "{element} 已被渲染", + "failed to import {element}": "导入{element}失败", + "Id": "编号", + "Name": "名称", + "General": "常规", + "Details": "详情", + "Message Name": "消息名称", + "Message": "消息", + "Initiator": "创建者", + "Asynchronous Continuations": "持续异步", + "Asynchronous Before": "异步前", + "Asynchronous After": "异步后", + "Job Configuration": "工作配置", + "Exclusive": "排除", + "Job Priority": "工作优先级", + "Retry Time Cycle": "重试时间周期", + "Documentation": "文档", + "Element Documentation": "元素文档", + "History Configuration": "历史配置", + "History Time To Live": "历史的生存时间", + "Forms": "表单", + "Form Key": "表单key", + "Form Fields": "表单字段", + "Business Key": "业务key", + "Form Field": "表单字段", + "ID": "编号", + "Type": "类型", + "Label": "名称", + "Default Value": "默认值", + "Default Flow": "默认流转路径", + "Conditional Flow": "条件流转路径", + "Sequence Flow": "普通流转路径", + "Validation": "校验", + "Add Constraint": "添加约束", + "Config": "配置", + "Properties": "属性", + "Add Property": "添加属性", + "Value": "值", + "Listeners": "监听器", + "Execution Listener": "执行监听", + "Event Type": "事件类型", + "Listener Type": "监听器类型", + "Java Class": "Java类", + "Expression": "表达式", + "Must provide a value": "必须提供一个值", + "Delegate Expression": "代理表达式", + "Script": "脚本", + "Script Format": "脚本格式", + "Script Type": "脚本类型", + "Inline Script": "内联脚本", + "External Script": "外部脚本", + "Resource": "资源", + "Field Injection": "字段注入", + "Extensions": "扩展", + "Input/Output": "输入/输出", + "Input Parameters": "输入参数", + "Output Parameters": "输出参数", + "Parameters": "参数", + "Output Parameter": "输出参数", + "Timer Definition Type": "定时器定义类型", + "Timer Definition": "定时器定义", + "Date": "日期", + "Duration": "持续", + "Cycle": "循环", + "Signal": "信号", + "Signal Name": "信号名称", + "Escalation": "升级", + "Error": "错误", + "Link Name": "链接名称", + "Condition": "条件名称", + "Variable Name": "变量名称", + "Variable Event": "变量事件", + "Specify more than one variable change event as a comma separated list.": "多个变量事件以逗号隔开", + "Wait for Completion": "等待完成", + "Activity Ref": "活动参考", + "Version Tag": "版本标签", + "Executable": "可执行文件", + "External Task Configuration": "扩展任务配置", + "Task Priority": "任务优先级", + "External": "外部", + "Connector": "连接器", + "Must configure Connector": "必须配置连接器", + "Connector Id": "连接器编号", + "Implementation": "实现方式", + "Field Injections": "字段注入", + "Fields": "字段", + "Result Variable": "结果变量", + "Topic": "主题", + "Configure Connector": "配置连接器", + "Input Parameter": "输入参数", + "Assignee": "代理人", + "Candidate Users": "候选用户", + "Candidate Groups": "候选组", + "Due Date": "到期时间", + "Follow Up Date": "跟踪日期", + "Priority": "优先级", + "The follow up date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)": + "跟踪日期必须符合EL表达式,如: ${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00", + "The due date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)": + "跟踪日期必须符合EL表达式,如: ${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00", + "Variables": "变量", + "Candidate Starter Configuration": "候选人起动器配置", + "Candidate Starter Groups": "候选人起动器组", + "This maps to the process definition key.": "这映射到流程定义键。", + "Candidate Starter Users": "候选人起动器的用户", + "Specify more than one user as a comma separated list.": "指定多个用户作为逗号分隔的列表。", + "Tasklist Configuration": "Tasklist配置", + "Startable": "启动", + "Specify more than one group as a comma separated list.": "指定多个组作为逗号分隔的列表。", + "Execution listeners": "执行监听器" +}; diff --git a/src/components/FlowDiagram/plugins/package/highlight/index.js b/src/components/FlowDiagram/plugins/package/highlight/index.js new file mode 100644 index 0000000..bff9211 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/highlight/index.js @@ -0,0 +1,5 @@ +const hljs = require("highlight.js/lib/core"); +hljs.registerLanguage("xml", require("highlight.js/lib/languages/xml")); +hljs.registerLanguage("json", require("highlight.js/lib/languages/json")); + +module.exports = hljs; diff --git a/src/components/FlowDiagram/plugins/package/index.js b/src/components/FlowDiagram/plugins/package/index.js new file mode 100644 index 0000000..d076cdd --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/index.js @@ -0,0 +1,7 @@ +import BpmnProcessDesigner from "./designer"; +import BmpnProcessPenal from "./penal"; + +export { + BpmnProcessDesigner, + BmpnProcessPenal +} diff --git a/src/components/FlowDiagram/plugins/package/penal/PropertiesPanel.vue b/src/components/FlowDiagram/plugins/package/penal/PropertiesPanel.vue new file mode 100644 index 0000000..afd5835 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/PropertiesPanel.vue @@ -0,0 +1,111 @@ + + \ No newline at end of file diff --git a/src/components/FlowDiagram/plugins/package/penal/base/ElementBaseInfo.vue b/src/components/FlowDiagram/plugins/package/penal/base/ElementBaseInfo.vue new file mode 100644 index 0000000..303d59d --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/base/ElementBaseInfo.vue @@ -0,0 +1,76 @@ + + diff --git a/src/components/FlowDiagram/plugins/package/penal/flow-condition/FlowCondition.vue b/src/components/FlowDiagram/plugins/package/penal/flow-condition/FlowCondition.vue new file mode 100644 index 0000000..94cf823 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/flow-condition/FlowCondition.vue @@ -0,0 +1,142 @@ + + + diff --git a/src/components/FlowDiagram/plugins/package/penal/form/ElementForm.vue b/src/components/FlowDiagram/plugins/package/penal/form/ElementForm.vue new file mode 100644 index 0000000..d15fd5e --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/form/ElementForm.vue @@ -0,0 +1,390 @@ + + + diff --git a/src/components/FlowDiagram/plugins/package/penal/index.js b/src/components/FlowDiagram/plugins/package/penal/index.js new file mode 100644 index 0000000..9b398b2 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/index.js @@ -0,0 +1,7 @@ +import BpmnPropertiesPanel from "./PropertiesPanel.vue"; + +BpmnPropertiesPanel.install = function(Vue) { + Vue.component(BpmnPropertiesPanel.name, BpmnPropertiesPanel); +}; + +export default BpmnPropertiesPanel; diff --git a/src/components/FlowDiagram/plugins/package/penal/listeners/ElementListeners.vue b/src/components/FlowDiagram/plugins/package/penal/listeners/ElementListeners.vue new file mode 100644 index 0000000..16f5099 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/listeners/ElementListeners.vue @@ -0,0 +1,296 @@ + + diff --git a/src/components/FlowDiagram/plugins/package/penal/listeners/UserTaskListeners.vue b/src/components/FlowDiagram/plugins/package/penal/listeners/UserTaskListeners.vue new file mode 100644 index 0000000..c113af9 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/listeners/UserTaskListeners.vue @@ -0,0 +1,319 @@ + + diff --git a/src/components/FlowDiagram/plugins/package/penal/listeners/template.js b/src/components/FlowDiagram/plugins/package/penal/listeners/template.js new file mode 100644 index 0000000..455b70d --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/listeners/template.js @@ -0,0 +1,178 @@ +export const template = isTaskListener => { + return ` +
+ + + + + + + + +
+ 添加监听器 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + ${ + isTaskListener + ? "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + : "" + } + + +

+ 注入字段: + 添加字段 +

+ + + + + + + + + + +
+ 取 消 + 保 存 +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ `; +}; diff --git a/src/components/FlowDiagram/plugins/package/penal/listeners/utilSelf.js b/src/components/FlowDiagram/plugins/package/penal/listeners/utilSelf.js new file mode 100644 index 0000000..efd13ec --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/listeners/utilSelf.js @@ -0,0 +1,62 @@ +// 初始化表单数据 +export function initListenerForm(listener) { + let self = { + ...listener + }; + if (listener.script) { + self = { + ...listener, + ...listener.script, + scriptType: listener.script.resource ? "externalScript" : "inlineScript" + }; + } + if (listener.event === "timeout" && listener.eventDefinitions) { + if (listener.eventDefinitions.length) { + let k = ""; + for (let key in listener.eventDefinitions[0]) { + console.log(listener.eventDefinitions, key); + if (key.indexOf("time") !== -1) { + k = key; + self.eventDefinitionType = key.replace("time", "").toLowerCase(); + } + } + console.log(k); + self.eventTimeDefinitions = listener.eventDefinitions[0][k].body; + } + } + return self; +} + +export function initListenerType(listener) { + let listenerType; + if (listener.class) listenerType = "classListener"; + if (listener.expression) listenerType = "expressionListener"; + if (listener.delegateExpression) listenerType = "delegateExpressionListener"; + if (listener.script) listenerType = "scriptListener"; + return { + ...JSON.parse(JSON.stringify(listener)), + ...(listener.script ?? {}), + listenerType: listenerType + }; +} + +export const listenerType = { + classListener: "Java 类", + expressionListener: "表达式", + delegateExpressionListener: "代理表达式", + scriptListener: "脚本" +}; + +export const eventType = { + create: "创建", + assignment: "指派", + complete: "完成", + delete: "删除", + update: "更新", + timeout: "超时" +}; + +export const fieldType = { + string: "字符串", + expression: "表达式" +}; diff --git a/src/components/FlowDiagram/plugins/package/penal/multi-instance/ElementMultiInstance.vue b/src/components/FlowDiagram/plugins/package/penal/multi-instance/ElementMultiInstance.vue new file mode 100644 index 0000000..7d57f50 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/multi-instance/ElementMultiInstance.vue @@ -0,0 +1,192 @@ + + + diff --git a/src/components/FlowDiagram/plugins/package/penal/other/ElementOtherConfig.vue b/src/components/FlowDiagram/plugins/package/penal/other/ElementOtherConfig.vue new file mode 100644 index 0000000..a4427b2 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/other/ElementOtherConfig.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/FlowDiagram/plugins/package/penal/properties/ElementProperties.vue b/src/components/FlowDiagram/plugins/package/penal/properties/ElementProperties.vue new file mode 100644 index 0000000..edd9a36 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/properties/ElementProperties.vue @@ -0,0 +1,134 @@ + + + diff --git a/src/components/FlowDiagram/plugins/package/penal/signal-message/SignalAndMessage.vue b/src/components/FlowDiagram/plugins/package/penal/signal-message/SignalAndMessage.vue new file mode 100644 index 0000000..7ea59f6 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/signal-message/SignalAndMessage.vue @@ -0,0 +1,104 @@ + + diff --git a/src/components/FlowDiagram/plugins/package/penal/task/ElementTask.vue b/src/components/FlowDiagram/plugins/package/penal/task/ElementTask.vue new file mode 100644 index 0000000..efb4f49 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/task/ElementTask.vue @@ -0,0 +1,74 @@ + + + diff --git a/src/components/FlowDiagram/plugins/package/penal/task/task-components/ReceiveTask.vue b/src/components/FlowDiagram/plugins/package/penal/task/task-components/ReceiveTask.vue new file mode 100644 index 0000000..282f238 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/task/task-components/ReceiveTask.vue @@ -0,0 +1,97 @@ + + + diff --git a/src/components/FlowDiagram/plugins/package/penal/task/task-components/ScriptTask.vue b/src/components/FlowDiagram/plugins/package/penal/task/task-components/ScriptTask.vue new file mode 100644 index 0000000..34ed9fd --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/task/task-components/ScriptTask.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/components/FlowDiagram/plugins/package/penal/task/task-components/ServiceTask.vue b/src/components/FlowDiagram/plugins/package/penal/task/task-components/ServiceTask.vue new file mode 100644 index 0000000..213cad5 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/task/task-components/ServiceTask.vue @@ -0,0 +1,86 @@ + + + diff --git a/src/components/FlowDiagram/plugins/package/penal/task/task-components/UserTask.vue b/src/components/FlowDiagram/plugins/package/penal/task/task-components/UserTask.vue new file mode 100644 index 0000000..a059589 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/penal/task/task-components/UserTask.vue @@ -0,0 +1,525 @@ + + + + + diff --git a/src/components/FlowDiagram/plugins/package/theme/flow-element-variables.scss b/src/components/FlowDiagram/plugins/package/theme/flow-element-variables.scss new file mode 100644 index 0000000..a54b6e0 --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/theme/flow-element-variables.scss @@ -0,0 +1,63 @@ +/* 改变主题色变量 */ +// $--color-primary: #1890ff; +// $--color-danger: #ff4d4f; + +/* 改变 icon 字体路径变量,必需 */ + +.process-drawer .el-drawer__header { + padding: 16px 16px 8px 16px; + margin: 0; + line-height: 24px; + font-size: 18px; + color: #303133; + box-sizing: border-box; + border-bottom: 1px solid #e8e8e8; +} + +div[class^="el-drawer"]:focus, +span:focus { + outline: none; +} + +.process-drawer .el-drawer__body { + box-sizing: border-box; + padding: 16px; + width: 100%; + overflow-y: auto; +} + +.process-design { + .el-table td, + .el-table th { + color: #333; + } + + .el-dialog__header { + padding: 16px 16px 8px 16px; + box-sizing: border-box; + border-bottom: 1px solid #e8e8e8; + } + .el-dialog__body { + padding: 16px; + max-height: 80vh; + box-sizing: border-box; + overflow-y: auto; + } + .el-dialog__footer { + padding: 16px; + box-sizing: border-box; + border-top: 1px solid #e8e8e8; + } + .el-dialog__close { + font-weight: 600; + } + .el-select { + width: 100%; + } + .el-divider:not(.el-divider--horizontal) { + margin: 0 8px ; + } + .el-divider.el-divider--horizontal { + margin: 16px 0; + } +} diff --git a/src/components/FlowDiagram/plugins/package/theme/index.scss b/src/components/FlowDiagram/plugins/package/theme/index.scss new file mode 100644 index 0000000..571f07b --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/theme/index.scss @@ -0,0 +1,171 @@ +@import "./flow-element-variables.scss"; +@import "bpmn-js-token-simulation/assets/css/bpmn-js-token-simulation.css"; +// @import "bpmn-js-token-simulation/assets/css/font-awesome.min.css"; +// @import "bpmn-js-token-simulation/assets/css/normalize.css"; +@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 "./process-designer.scss"; +@import "./process-panel.scss"; + +$success-color: #4eb819; +$primary-color: #409EFF; +$warning-color: #E6A23C; +$danger-color: #F56C6C; +$cancel-color: #909399; + +.process-viewer { + position: relative; + border: 1px solid #EFEFEF; + background: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHBhdHRlcm4gaWQ9ImEiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZD0iTTAgMTBoNDBNMTAgMHY0ME0wIDIwaDQwTTIwIDB2NDBNMCAzMGg0ME0zMCAwdjQwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlMGUwZTAiIG9wYWNpdHk9Ii4yIi8+PHBhdGggZD0iTTQwIDBIMHY0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZTBlMGUwIi8+PC9wYXR0ZXJuPjwvZGVmcz48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2EpIi8+PC9zdmc+') repeat!important; + + .success-arrow { + fill: $success-color; + stroke: $success-color; + } + + .success-conditional { + fill: white; + stroke: $success-color; + } + + .fail-arrow { + fill: $warning-color; + stroke: $warning-color; + } + + .fail-conditional { + fill: white; + stroke: $warning-color; + } + + .success.djs-connection { + .djs-visual path { + stroke: $success-color!important; + marker-end: url(#sequenceflow-end-white-success)!important; + } + } + + .success.djs-connection.condition-expression { + .djs-visual path { + marker-start: url(#conditional-flow-marker-white-success)!important; + } + } + + .success.djs-shape { + .djs-visual rect { + stroke: $success-color!important; + fill: $success-color!important; + fill-opacity: 0.15!important; + } + + .djs-visual polygon { + stroke: $success-color!important; + } + + .djs-visual path:nth-child(2) { + stroke: $success-color!important; + fill: $success-color!important; + } + + .djs-visual circle { + stroke: $success-color!important; + fill: $success-color!important; + fill-opacity: 0.15!important; + } + } + + .primary.djs-shape { + .djs-visual rect { + stroke: $primary-color!important; + fill: $primary-color!important; + fill-opacity: 0.15!important; + } + + .djs-visual polygon { + stroke: $primary-color!important; + } + + .djs-visual circle { + stroke: $primary-color!important; + fill: $primary-color!important; + fill-opacity: 0.15!important; + } + } + + .warning.djs-connection { + .djs-visual path { + stroke: $warning-color!important; + marker-end: url(#sequenceflow-end-white-fail)!important; + } + } + + .warning.djs-connection.condition-expression { + .djs-visual path { + marker-start: url(#conditional-flow-marker-white-fail)!important; + } + } + + .warning.djs-shape { + .djs-visual rect { + stroke: $warning-color!important; + fill: $warning-color!important; + fill-opacity: 0.15!important; + } + + .djs-visual polygon { + stroke: $warning-color!important; + } + + .djs-visual path:nth-child(2) { + stroke: $warning-color!important; + fill: $warning-color!important; + } + + .djs-visual circle { + stroke: $warning-color!important; + fill: $warning-color!important; + fill-opacity: 0.15!important; + } + } + + .danger.djs-shape { + .djs-visual rect { + stroke: $danger-color!important; + fill: $danger-color!important; + fill-opacity: 0.15!important; + } + + .djs-visual polygon { + stroke: $danger-color!important; + } + + .djs-visual circle { + stroke: $danger-color!important; + fill: $danger-color!important; + fill-opacity: 0.15!important; + } + } + + .cancel.djs-shape { + .djs-visual rect { + stroke: $cancel-color!important; + fill: $cancel-color!important; + fill-opacity: 0.15!important; + } + + .djs-visual polygon { + stroke: $cancel-color!important; + } + + .djs-visual circle { + stroke: $cancel-color!important; + fill: $cancel-color!important; + fill-opacity: 0.15!important; + } + } +} + +.process-viewer .djs-tooltip-container, .process-viewer .djs-overlay-container, .process-viewer .djs-palette { + display: none; +} diff --git a/src/components/FlowDiagram/plugins/package/theme/process-designer.scss b/src/components/FlowDiagram/plugins/package/theme/process-designer.scss new file mode 100644 index 0000000..bfd13ee --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/theme/process-designer.scss @@ -0,0 +1,153 @@ +// 边框被 token-simulation 样式覆盖了 +.djs-palette { + background: var(--palette-background-color); + border: solid 1px var(--palette-border-color) !important; + border-radius: 2px; +} + +.my-process-designer { + padding: 5px 0 10px 10px; + display: flex; + flex-direction: column; + width: 70%; + height: 100%; + box-sizing: border-box; + .my-process-designer__header { + width: 100%; + min-height: 36px; + .el-button { + text-align: center; + } + .el-button-group { + margin: 4px; + } + .el-tooltip__popper { + .el-button { + width: 100%; + text-align: left; + padding-left: 8px; + padding-right: 8px; + } + .el-button:hover { + background: rgba(64, 158, 255, 0.8); + color: #ffffff; + } + } + .align { + position: relative; + i { + &:after { + content: "|"; + position: absolute; + transform: rotate(90deg) translate(200%, 60%); + } + } + } + .align.align-left i { + transform: rotate(90deg); + } + .align.align-right i { + transform: rotate(-90deg); + } + .align.align-top i { + transform: rotate(180deg); + } + .align.align-bottom i { + transform: rotate(0deg); + } + .align.align-center i { + transform: rotate(90deg); + &:after { + transform: rotate(90deg) translate(0, 60%); + } + } + .align.align-middle i { + transform: rotate(0deg); + &:after { + transform: rotate(90deg) translate(0, 60%); + } + } + } + .my-process-designer__container { + display: inline-flex; + width: 100%; + flex: 1; + .my-process-designer__canvas { + flex: 1; + height: 100%; + position: relative; + background: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHBhdHRlcm4gaWQ9ImEiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZD0iTTAgMTBoNDBNMTAgMHY0ME0wIDIwaDQwTTIwIDB2NDBNMCAzMGg0ME0zMCAwdjQwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlMGUwZTAiIG9wYWNpdHk9Ii4yIi8+PHBhdGggZD0iTTQwIDBIMHY0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZTBlMGUwIi8+PC9wYXR0ZXJuPjwvZGVmcz48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2EpIi8+PC9zdmc+") + repeat !important; + div.toggle-mode { + display: none; + } + } + .my-process-designer__property-panel { + height: 100%; + overflow: scroll; + overflow-y: auto; + z-index: 10; + * { + box-sizing: border-box; + } + } + svg { + width: 100%; + height: 100%; + min-height: 100%; + overflow: hidden; + } + } +} + +//侧边栏配置 +.djs-palette.open { + .djs-palette-entries { + div[class^="bpmn-icon-"]:before, + div[class*="bpmn-icon-"]:before { + line-height: unset; + } + div.entry { + position: relative; + } + div.entry:hover { + &::after { + width: max-content; + content: attr(title); + vertical-align: text-bottom; + position: absolute; + right: -10px; + top: 0; + bottom: 0; + overflow: hidden; + transform: translateX(100%); + font-size: 0.5em; + display: inline-block; + text-decoration: inherit; + font-variant: normal; + text-transform: none; + background: #fafafa; + box-shadow: 0 0 6px #eeeeee; + border: 1px solid #cccccc; + box-sizing: border-box; + padding: 0 16px; + border-radius: 4px; + z-index: 100; + } + } + } +} +pre { + margin: 0; + height: 100%; + overflow: hidden; + max-height: calc(80vh - 32px); + overflow-y: auto; +} +.hljs { + word-break: break-word; + white-space: pre-wrap; +} +.hljs * { + font-family: Consolas, Monaco, monospace; +} diff --git a/src/components/FlowDiagram/plugins/package/theme/process-panel.scss b/src/components/FlowDiagram/plugins/package/theme/process-panel.scss new file mode 100644 index 0000000..5c7c3df --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/theme/process-panel.scss @@ -0,0 +1,110 @@ +.process-design { + .process-panel__container { + box-sizing: border-box; + padding: 0 8px; + border-left: 1px solid #eeeeee; + box-shadow: 0 0 8px #cccccc; + max-height: 100%; + overflow-y: scroll; + } + .panel-tab__title { + font-weight: 600; + padding: 0 8px; + font-size: 1.1em; + line-height: 1.2em; + i { + margin-right: 8px; + font-size: 1.2em; + } + } + .panel-tab__content { + width: 100%; + box-sizing: border-box; + border-top: 1px solid #eeeeee; + padding: 8px 16px; + .panel-tab__content--title { + display: flex; + justify-content: space-between; + padding-bottom: 8px; + span { + flex: 1; + text-align: left; + } + } + } + .element-property { + width: 100%; + display: flex; + align-items: flex-start; + margin: 8px 0; + .element-property__label { + display: block; + width: 90px; + text-align: right; + overflow: hidden; + padding-right: 12px; + line-height: 32px; + font-size: 14px; + box-sizing: border-box; + } + .element-property__value { + flex: 1; + line-height: 32px; + } + .el-form-item { + width: 100%; + margin-bottom: 0; + padding-bottom: 18px; + } + } + .list-property { + flex-direction: column; + .element-listener-item { + width: 100%; + display: inline-grid; + grid-template-columns: 16px auto 32px 32px; + grid-column-gap: 8px; + } + .element-listener-item + .element-listener-item { + margin-top: 8px; + } + } + .listener-filed__title { + display: inline-flex; + width: 100%; + justify-content: space-between; + align-items: center; + margin-top: 0; + span { + width: 200px; + text-align: left; + font-size: 14px; + } + i { + margin-right: 8px; + } + } + .element-drawer__button { + margin-top: 8px; + width: 100%; + display: inline-flex; + justify-content: space-around; + } + .element-drawer__button > .el-button { + width: 100%; + } + + .el-collapse-item__content { + padding-bottom: 0; + } + .el-input.is-disabled .el-input__inner { + color: #999999; + } + .el-form-item.el-form-item--mini { + margin-bottom: 0; + & + .el-form-item { + margin-top: 16px; + } + } +} + diff --git a/src/components/FlowDiagram/plugins/package/utils.js b/src/components/FlowDiagram/plugins/package/utils.js new file mode 100644 index 0000000..1f1926d --- /dev/null +++ b/src/components/FlowDiagram/plugins/package/utils.js @@ -0,0 +1,69 @@ +// 创建监听器实例 +export function createListenerObject(options, isTask, prefix) { + const listenerObj = Object.create(null); + listenerObj.event = options.event; + // isTask && (listenerObj.id = options.id); // 任务监听器特有的 id 字段 + switch (options.listenerType) { + case "scriptListener": + listenerObj.script = createScriptObject(options, prefix); + break; + case "expressionListener": + listenerObj.expression = options.expression; + break; + case "delegateExpressionListener": + listenerObj.delegateExpression = options.delegateExpression; + break; + default: + listenerObj.class = options.class; + } + // 注入字段 + if (options.fields) { + listenerObj.fields = options.fields.map(field => { + return createFieldObject(field, prefix); + }); + } + // 任务监听器的 定时器 设置 + if (isTask && options.event === "timeout" && !!options.eventDefinitionType) { + const timeDefinition = window.bpmnInstances.moddle.create("bpmn:FormalExpression", { body: options.eventTimeDefinitions }); + const TimerEventDefinition = window.bpmnInstances.moddle.create("bpmn:TimerEventDefinition", { + id: `TimerEventDefinition_${uuid(8)}`, + [`time${options.eventDefinitionType.replace(/^\S/, s => s.toUpperCase())}`]: timeDefinition + }); + listenerObj.eventDefinitions = [TimerEventDefinition]; + } + return window.bpmnInstances.moddle.create(`${prefix}:${isTask ? "TaskListener" : "ExecutionListener"}`, listenerObj); +} + +// 创建 监听器的注入字段 实例 +export function createFieldObject(option, prefix) { + const { name, fieldType, string, expression } = option; + const fieldConfig = fieldType === "string" ? { name, string } : { name, expression }; + return window.bpmnInstances.moddle.create(`${prefix}:Field`, fieldConfig); +} + +// 创建脚本实例 +export function createScriptObject(options, prefix) { + const { scriptType, scriptFormat, value, resource } = options; + const scriptConfig = scriptType === "inlineScript" ? { scriptFormat, value } : { scriptFormat, resource }; + return window.bpmnInstances.moddle.create(`${prefix}:Script`, scriptConfig); +} + +// 更新元素扩展属性 +export function updateElementExtensions(element, extensionList) { + const extensions = window.bpmnInstances.moddle.create("bpmn:ExtensionElements", { + values: extensionList + }); + window.bpmnInstances.modeling.updateProperties(element, { + extensionElements: extensions + }); +} + +// 创建一个id +export function uuid(length = 8, chars) { + let result = ""; + let charsString = chars || "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + for (let i = length; i > 0; --i) { + result += charsString[Math.floor(Math.random() * charsString.length)]; + } + return result; +} diff --git a/src/components/FlowDiagram/plugins/tab.js b/src/components/FlowDiagram/plugins/tab.js new file mode 100644 index 0000000..3d757a3 --- /dev/null +++ b/src/components/FlowDiagram/plugins/tab.js @@ -0,0 +1,71 @@ +import store from '@/store' +import router from '@/router'; + +export default { + // 刷新当前tab页签 + refreshPage(obj) { + const { path, query, matched } = router.currentRoute; + if (obj === undefined) { + matched.forEach((m) => { + if (m.components && m.components.default && m.components.default.name) { + if (!['Layout', 'ParentView'].includes(m.components.default.name)) { + obj = { name: m.components.default.name, path: path, query: query }; + } + } + }); + } + return store.dispatch('tagsView/delCachedView', obj).then(() => { + const { path, query } = obj + router.replace({ + path: '/redirect' + path, + query: query + }) + }) + }, + // 关闭当前tab页签,打开新页签 + closeOpenPage(obj) { + store.dispatch("tagsView/delView", router.currentRoute); + if (obj !== undefined) { + return router.push(obj); + } + }, + // 关闭指定tab页签 + closePage(obj) { + if (obj === undefined) { + return store.dispatch('tagsView/delView', router.currentRoute).then(({ visitedViews }) => { + const latestView = visitedViews.slice(-1)[0] + if (latestView) { + return router.push(latestView.fullPath) + } + return router.push('/'); + }); + } + return store.dispatch('tagsView/delView', obj); + }, + // 关闭所有tab页签 + closeAllPage() { + return store.dispatch('tagsView/delAllViews'); + }, + // 关闭左侧tab页签 + closeLeftPage(obj) { + return store.dispatch('tagsView/delLeftTags', obj || router.currentRoute); + }, + // 关闭右侧tab页签 + closeRightPage(obj) { + return store.dispatch('tagsView/delRightTags', obj || router.currentRoute); + }, + // 关闭其他tab页签 + closeOtherPage(obj) { + return store.dispatch('tagsView/delOthersViews', obj || router.currentRoute); + }, + // 添加tab页签 + openPage(title, url, params) { + var obj = { path: url, meta: { title: title } } + store.dispatch('tagsView/addView', obj); + return router.push({ path: url, query: params }); + }, + // 修改tab页签 + updatePage(obj) { + return store.dispatch('tagsView/updateVisitedView', obj); + } +} diff --git a/src/components/ProcessDesigner/index.vue b/src/components/ProcessDesigner/index.vue index abb9c5d..85d1f47 100644 --- a/src/components/ProcessDesigner/index.vue +++ b/src/components/ProcessDesigner/index.vue @@ -4,35 +4,40 @@ 'element.click', 'connection.added', 'connection.removed', - 'connection.changed' - ]" @connection-added="connectionAdded" @connection-removed="connectionRemoved" + 'connection.changed', + 'shape.removed' + ]" @connection-added="connectionAdded" @connection-removed="connectionRemoved" @shape-removed="shapeRemoved" @connection-changed="connectionChanged" @element-click="elementClick" @init-finished="initModeler" - @event="handlerEvent" @save="onSaveProcess" :schemeCode="props.schemeCode" :pageFlow="props.pageFlow" :pageType="props.pageType"/> + @event="handlerEvent" @save="onSaveProcess" :schemeCode="data.schemeCode" :pageFlow="data.pageFlow" + :pageType="data.pageType" /> - + diff --git a/src/components/ProcessDesigner/package/penal/exclusiveGateway/src/conditionFormula.vue b/src/components/ProcessDesigner/package/penal/exclusiveGateway/src/conditionFormula.vue index bdf32dc..eb6f67f 100644 --- a/src/components/ProcessDesigner/package/penal/exclusiveGateway/src/conditionFormula.vue +++ b/src/components/ProcessDesigner/package/penal/exclusiveGateway/src/conditionFormula.vue @@ -5,17 +5,12 @@ - + - 选择 @@ -37,8 +32,8 @@ - - + + @@ -46,11 +41,13 @@ import { reactive, ref, onMounted } from 'vue' import SelectTable from '@/components/SelectTable/index.vue' import { getTableForms } from '@/api/sys/flowPenal' + import { getLoadDataBaseLinkTree } from '@/api/demo/system'; const labelCol = { span: 5 }; const wrapperCol = { span: 17 }; const formRef = ref < any > () const tableRef = ref < any > () + const sqlOptions =ref([]) const data = reactive({ rules: { @@ -100,6 +97,15 @@ value: '', name: '' }) + async function getSQL(){ + const data = await getLoadDataBaseLinkTree() + data.forEach(element => { + if(element.childNodes == null){ + element.childNodes = [] + } + }); + sqlOptions.value = data + } function handleTableClick() { data.tableOpen = true } @@ -113,13 +119,16 @@ // 选择数据表,把获取表头 async function handleTableChange(table) { var querys = { - dbCode: 'lrsystemdb', + dbCode: formData.value.dbCode, tableNames: table } console.log(querys) const data = await getTableForms(querys) console.log(data); } + function setForm(data){ + formData.value = data + } // 校验表单 function validateForm() { formRef.value @@ -131,20 +140,36 @@ return false }); } - function setForm(data) { - this.formData = this.$deepClone(data); - } function getForm() { return formData.value; } defineExpose({ validateForm, - getForm + getForm, + setForm }) + onMounted(() => { + getSQL() + }); + \ No newline at end of file diff --git a/src/components/ProcessDesigner/package/penal/exclusiveGateway/src/conditionSql.vue b/src/components/ProcessDesigner/package/penal/exclusiveGateway/src/conditionSql.vue index 26c5d89..049f2fe 100644 --- a/src/components/ProcessDesigner/package/penal/exclusiveGateway/src/conditionSql.vue +++ b/src/components/ProcessDesigner/package/penal/exclusiveGateway/src/conditionSql.vue @@ -6,11 +6,8 @@ - - - - - + @@ -20,11 +17,13 @@ \ No newline at end of file diff --git a/src/components/ProcessDesigner/package/penal/myline/index.vue b/src/components/ProcessDesigner/package/penal/myline/index.vue index 1336609..7aac712 100644 --- a/src/components/ProcessDesigner/package/penal/myline/index.vue +++ b/src/components/ProcessDesigner/package/penal/myline/index.vue @@ -18,114 +18,57 @@ \ No newline at end of file diff --git a/src/components/ProcessDesigner/package/penal/shcemeInfo/index.vue b/src/components/ProcessDesigner/package/penal/shcemeInfo/index.vue index 46f206b..8cfb41d 100644 --- a/src/components/ProcessDesigner/package/penal/shcemeInfo/index.vue +++ b/src/components/ProcessDesigner/package/penal/shcemeInfo/index.vue @@ -38,9 +38,8 @@ - - Zone one - Zone two + @@ -74,9 +73,8 @@ - - Zone one - Zone two + @@ -110,9 +108,8 @@ - - Zone one - Zone two + @@ -150,6 +147,8 @@ import type { Rule } from 'ant-design-vue/es/form'; import { IconPicker } from '/@/components/Icon'; import { getLoad } from '@/api/sys/sysDataItemDetail'; + import { getLoadDataBaseLinkTree } from '@/api/demo/system'; + const formRef = ref(); const labelCol = { span: 7 }; const wrapperCol = { span: 17 }; @@ -160,8 +159,9 @@ const data = reactive({ optionsNotOrOk: [{ label: '允许', value: 1 }, { label: '不允许', value: 2 }], optionsType: [], - componentDisabled: props.pageType == 'detail' ? true : false + componentDisabled: props.pageType == 'detail' ? true : false, }) + const sqlOptions =ref([]) let formState = ref({ code: '', @@ -212,6 +212,15 @@ { required: true, message: '请选择颜色' } ], }; + async function getSQL(){ + const data = await getLoadDataBaseLinkTree() + data.forEach(element => { + if(element.childNodes == null){ + element.childNodes = [] + } + }); + sqlOptions.value = data + } async function fetch() { let list = await getLoad({ code: 'FlowSort' }); data.optionsType = list @@ -241,6 +250,7 @@ }) onMounted(() => { fetch(); + getSQL() }); + \ No newline at end of file diff --git a/src/components/ProcessDesigner/package/penal/userTask/src/auditorLevel.vue b/src/components/ProcessDesigner/package/penal/userTask/src/auditorLevel.vue index ad43670..4aaaf35 100644 --- a/src/components/ProcessDesigner/package/penal/userTask/src/auditorLevel.vue +++ b/src/components/ProcessDesigner/package/penal/userTask/src/auditorLevel.vue @@ -3,14 +3,16 @@ - + \ No newline at end of file diff --git a/src/components/ProcessDesigner/package/penal/userTask/src/auditorNode.vue b/src/components/ProcessDesigner/package/penal/userTask/src/auditorNode.vue index 45a21fe..6ba7b9c 100644 --- a/src/components/ProcessDesigner/package/penal/userTask/src/auditorNode.vue +++ b/src/components/ProcessDesigner/package/penal/userTask/src/auditorNode.vue @@ -1,56 +1,88 @@ - \ No newline at end of file + function handleChange(val, option) { + data.formData.name = option.name + } + function validateForm() { + formRef.value + .validate() + .then(async (values) => { + return true + }) + .catch(async (error) => { + return false + }); + } + function getForm() { + let rows = data.formData + console.log(rows) + return rows + } + defineExpose({ + getForm, + validateForm + }) + + \ No newline at end of file diff --git a/src/components/ProcessDesigner/package/penal/userTask/src/auditorSql.vue b/src/components/ProcessDesigner/package/penal/userTask/src/auditorSql.vue index 65ff680..c62510f 100644 --- a/src/components/ProcessDesigner/package/penal/userTask/src/auditorSql.vue +++ b/src/components/ProcessDesigner/package/penal/userTask/src/auditorSql.vue @@ -1,104 +1,117 @@ - \ No newline at end of file + function tableHandleOk() { + console.log(tableRef.value.getRow()) + const obj = tableRef.value.getRow() + formData.value.table = obj[0].name + handleTableChange(obj[0].name) + data.tableOpen = false + } + // 选择数据表,把获取表头 + async function handleTableChange(table) { + var querys = { + dbCode: 'lrsystemdb', + tableNames: table + } + console.log(querys) + const data = await getTableForms(querys) + console.log(data); + } + // 校验表单 + function validateForm() { + formRef.value + .validate() + .then(async (values) => { + return true + }) + .catch(async (error) => { + return false + }); + } + function setForm(data) { + this.formData = this.$deepClone(data); + } + function getForm() { + return formData.value; + } + + defineExpose({ + validateForm, + getForm + }) + + \ No newline at end of file diff --git a/src/components/SelectAccount/DeptTree.vue b/src/components/SelectAccount/DeptTree.vue index d3e83d7..ae3b8ce 100644 --- a/src/components/SelectAccount/DeptTree.vue +++ b/src/components/SelectAccount/DeptTree.vue @@ -1,12 +1,12 @@ \ No newline at end of file diff --git a/src/components/SelectPos/account.data.ts b/src/components/SelectPos/account.data.ts new file mode 100644 index 0000000..7f76a73 --- /dev/null +++ b/src/components/SelectPos/account.data.ts @@ -0,0 +1,48 @@ +import { getAllRoleList, isAccountExist } from '@/api/demo/system'; +import { BasicColumn, FormSchema } from '@/components/Table'; + +/** + * transform mock data + * { + * 0: '华东分部', + * '0-0': '华东分部-研发部' + * '0-1': '华东分部-市场部', + * ... + * } + */ +export const columns: BasicColumn[] = [ + { + title: '用户名', + dataIndex: 'account', + width: 120, + }, + { + title: '昵称', + dataIndex: 'name', + width: 120, + }, + { + title: '所属部门', + dataIndex: 'organizations', + // customRender: ({ value }) => { + // return deptMap[value]; + // }, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'account', + label: '用户名', + component: 'Input', + colProps: { span: 8 }, + }, + { + field: 'nickname', + label: '昵称', + component: 'Input', + colProps: { span: 8 }, + }, +]; + + diff --git a/src/components/SelectPos/index.vue b/src/components/SelectPos/index.vue index b9d4817..7869d9c 100644 --- a/src/components/SelectPos/index.vue +++ b/src/components/SelectPos/index.vue @@ -1,68 +1,58 @@ \ No newline at end of file + + \ No newline at end of file diff --git a/src/components/SelectTable/index.vue b/src/components/SelectTable/index.vue index f5811e9..52d3741 100644 --- a/src/components/SelectTable/index.vue +++ b/src/components/SelectTable/index.vue @@ -1,17 +1,28 @@ \ No newline at end of file + + \ No newline at end of file diff --git a/src/store/modules/flow.ts b/src/store/modules/flow.ts new file mode 100644 index 0000000..04f6ca7 --- /dev/null +++ b/src/store/modules/flow.ts @@ -0,0 +1,50 @@ + +import { defineStore } from 'pinia'; + + +export const flowStore = defineStore({ + id: 'flow', + state: () => ({ + flowWfData: [], + }), + getters: { + getWfData(state) { + return state.flowWfData; + }, + + }, + actions: { + // 获取单个节点的数据 + getWfDataNode(id){ + var currentIndex = (this.flowWfData || []).findIndex((element) => element.id === id); + if(currentIndex == -1){ + return null + }else{ + return this.flowWfData[currentIndex] + } + }, + // 添加单个节点的数据 + setWfDataNode(data) { + let flowWfData = this.flowWfData + var currentIndex = (flowWfData || []).findIndex((element) => element.id === data.id); + if(currentIndex == -1){ + this.flowWfData.push(data) + } + }, + // 全覆盖,供更新和详情使用 + setWfDataAll(list){ + this.flowWfData=list + }, + // 修改单个节点的某项数据 + updataWfDataNode(id,key,value){ + let flowWfData = this.flowWfData + var currentIndex = (flowWfData || []).findIndex((element) => element.id === id); + this.flowWfData[currentIndex][key] = value + }, + deleteWfData(data) { + let flowWfData = this.flowWfData + var currentIndex = (flowWfData || []).findIndex((element) => element.id === data.id); + this.flowWfData.splice(currentIndex,1) + } + }, +}); diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index a9f8754..7369a88 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -16,6 +16,7 @@ import { RouteRecordRaw } from 'vue-router'; import { PAGE_NOT_FOUND_ROUTE } from '@/router/routes/basic'; import { isArray } from '@/utils/is'; import { h } from 'vue'; +import md5 from 'js-md5' interface UserState { userInfo: Nullable; @@ -90,8 +91,8 @@ export const useUserStore = defineStore({ ): Promise { try { const { goHome = true, mode, ...loginParams } = params; + loginParams.password = md5(loginParams.password) const data = await loginApi(loginParams, mode); - console.log(data) const { token } = data; // save token diff --git a/src/views/demo/system/account/DeptTree.vue b/src/views/demo/system/account/DeptTree.vue index 8c88f08..ae3b8ce 100644 --- a/src/views/demo/system/account/DeptTree.vue +++ b/src/views/demo/system/account/DeptTree.vue @@ -1,12 +1,12 @@