diff --git a/README.md b/README.md index 4096297..51dd6ed 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ![Vite](https://img.shields.io/badge/Vite-3.2.5-646CFF?style=flat-square&logo=vite) ![Pinia](https://img.shields.io/badge/Pinia-2.0.23-FFD93D?style=flat-square) -一个基于 Vue 3 + TypeScript + Arco Design 的现代化租赁管理系统 +一个基于 Vue 3 + TypeScript + Arco Design 的现代化租赁管理系统 diff --git a/package.json b/package.json index f6c85f1..c4dd83a 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,10 @@ "dependencies": { "@arco-design/web-vue": "^2.57.0", "@onlyoffice/document-editor-vue": "^1.6.1", + "@vue-flow/background": "^1.3.2", + "@vue-flow/core": "^1.47.0", + "@vue-flow/controls": "^1.1.3", + "@vue-flow/minimap": "^1.5.4", "@vueuse/core": "^9.3.0", "arco-design-pro-vue": "^2.7.3", "axios": "^0.24.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 609777a..3040740 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,6 +19,18 @@ importers: '@onlyoffice/document-editor-vue': specifier: ^1.6.1 version: 1.6.1(vue@3.5.22(typescript@4.9.5)) + '@vue-flow/background': + specifier: ^1.3.2 + version: 1.3.2(@vue-flow/core@1.48.0(vue@3.5.22(typescript@4.9.5)))(vue@3.5.22(typescript@4.9.5)) + '@vue-flow/controls': + specifier: ^1.1.3 + version: 1.1.3(@vue-flow/core@1.48.0(vue@3.5.22(typescript@4.9.5)))(vue@3.5.22(typescript@4.9.5)) + '@vue-flow/core': + specifier: ^1.47.0 + version: 1.48.0(vue@3.5.22(typescript@4.9.5)) + '@vue-flow/minimap': + specifier: ^1.5.4 + version: 1.5.4(@vue-flow/core@1.48.0(vue@3.5.22(typescript@4.9.5)))(vue@3.5.22(typescript@4.9.5)) '@vueuse/core': specifier: ^9.3.0 version: 9.13.0(vue@3.5.22(typescript@4.9.5)) @@ -809,6 +821,9 @@ packages: '@types/web-bluetooth@0.0.16': resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@typescript-eslint/eslint-plugin@8.46.0': resolution: {integrity: sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -997,6 +1012,29 @@ packages: '@volar/typescript@1.11.1': resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + '@vue-flow/background@1.3.2': + resolution: {integrity: sha512-eJPhDcLj1wEo45bBoqTXw1uhl0yK2RaQGnEINqvvBsAFKh/camHJd5NPmOdS1w+M9lggc9igUewxaEd3iCQX2w==} + peerDependencies: + '@vue-flow/core': ^1.23.0 + vue: ^3.3.0 + + '@vue-flow/controls@1.1.3': + resolution: {integrity: sha512-XCf+G+jCvaWURdFlZmOjifZGw3XMhN5hHlfMGkWh9xot+9nH9gdTZtn+ldIJKtarg3B21iyHU8JjKDhYcB6JMw==} + peerDependencies: + '@vue-flow/core': ^1.23.0 + vue: ^3.3.0 + + '@vue-flow/core@1.48.0': + resolution: {integrity: sha512-keW9HGaEZEe4SKYtrzp5E+qSGJ5/z+9i2yRDtCr3o72IUnS0Ns1qQNsIbGGz0ygpKzg6LdtbVLWeYAvl3dzLQA==} + peerDependencies: + vue: ^3.3.0 + + '@vue-flow/minimap@1.5.4': + resolution: {integrity: sha512-l4C+XTAXnRxsRpUdN7cAVFBennC1sVRzq4bDSpVK+ag7tdMczAnhFYGgbLkUw3v3sY6gokyWwMl8CDonp8eB2g==} + peerDependencies: + '@vue-flow/core': ^1.23.0 + vue: ^3.3.0 + '@vue/babel-helper-vue-transform-on@1.5.0': resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} @@ -1062,12 +1100,21 @@ packages: '@vue/shared@3.5.22': resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} + '@vueuse/core@10.11.1': + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + '@vueuse/core@9.13.0': resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + '@vueuse/metadata@10.11.1': + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + '@vueuse/metadata@9.13.0': resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + '@vueuse/shared@10.11.1': + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + '@vueuse/shared@9.13.0': resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} @@ -1553,6 +1600,44 @@ packages: engines: {node: '>=10'} hasBin: true + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} @@ -5374,6 +5459,8 @@ snapshots: '@types/web-bluetooth@0.0.16': {} + '@types/web-bluetooth@0.0.20': {} + '@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -5556,6 +5643,34 @@ snapshots: '@volar/language-core': 1.11.1 path-browserify: 1.0.1 + '@vue-flow/background@1.3.2(@vue-flow/core@1.48.0(vue@3.5.22(typescript@4.9.5)))(vue@3.5.22(typescript@4.9.5))': + dependencies: + '@vue-flow/core': 1.48.0(vue@3.5.22(typescript@4.9.5)) + vue: 3.5.22(typescript@4.9.5) + + '@vue-flow/controls@1.1.3(@vue-flow/core@1.48.0(vue@3.5.22(typescript@4.9.5)))(vue@3.5.22(typescript@4.9.5))': + dependencies: + '@vue-flow/core': 1.48.0(vue@3.5.22(typescript@4.9.5)) + vue: 3.5.22(typescript@4.9.5) + + '@vue-flow/core@1.48.0(vue@3.5.22(typescript@4.9.5))': + dependencies: + '@vueuse/core': 10.11.1(vue@3.5.22(typescript@4.9.5)) + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + vue: 3.5.22(typescript@4.9.5) + transitivePeerDependencies: + - '@vue/composition-api' + + '@vue-flow/minimap@1.5.4(@vue-flow/core@1.48.0(vue@3.5.22(typescript@4.9.5)))(vue@3.5.22(typescript@4.9.5))': + dependencies: + '@vue-flow/core': 1.48.0(vue@3.5.22(typescript@4.9.5)) + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + vue: 3.5.22(typescript@4.9.5) + '@vue/babel-helper-vue-transform-on@1.5.0': {} '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.4)': @@ -5673,6 +5788,16 @@ snapshots: '@vue/shared@3.5.22': {} + '@vueuse/core@10.11.1(vue@3.5.22(typescript@4.9.5))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.5.22(typescript@4.9.5)) + vue-demi: 0.14.10(vue@3.5.22(typescript@4.9.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@vueuse/core@9.13.0(vue@3.5.22(typescript@4.9.5))': dependencies: '@types/web-bluetooth': 0.0.16 @@ -5683,8 +5808,17 @@ snapshots: - '@vue/composition-api' - vue + '@vueuse/metadata@10.11.1': {} + '@vueuse/metadata@9.13.0': {} + '@vueuse/shared@10.11.1(vue@3.5.22(typescript@4.9.5))': + dependencies: + vue-demi: 0.14.10(vue@3.5.22(typescript@4.9.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@vueuse/shared@9.13.0(vue@3.5.22(typescript@4.9.5))': dependencies: vue-demi: 0.14.10(vue@3.5.22(typescript@4.9.5)) @@ -6227,6 +6361,42 @@ snapshots: bin-build: 3.0.0 bin-wrapper: bin-wrapper-china@0.1.0 + d3-color@3.1.0: {} + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-ease@3.0.1: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-selection@3.0.0: {} + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dargs@7.0.0: {} data-view-buffer@1.0.2: diff --git a/src/api/common.ts b/src/api/common.ts index 05332bb..687603a 100644 --- a/src/api/common.ts +++ b/src/api/common.ts @@ -76,3 +76,11 @@ export function getBanksList(keyword: string): Promise { export function getDeptProjectListFromDeptId(id: number): Promise { return axios.get(`common/getDeptProjectList?departmentId=${id}`); } +// 审批流类型列表 +export function getWorkflowsTypeList(): Promise { + return axios.get(`common/getWorkflowsTypeList`); +} +// 公共接口-用户列表 +export function getCommonUserList(): Promise { + return axios.get(`common/getUserList`); +} diff --git a/src/api/setting.ts b/src/api/setting.ts index b36d885..2752052 100644 --- a/src/api/setting.ts +++ b/src/api/setting.ts @@ -548,3 +548,23 @@ export function getContractTags( export function getWorkflowsList(type: number): Promise { return axios.get(`workflows/getList?type=${type}`); } +// 创建流程 +export function createWorkflows(params: any): Promise { + return axios.post(`workflows/create`, params); +} +// 保存流程 +export function saveWorkflows(params: any): Promise { + return axios.post(`workflows/save`, params); +} +// 审批流详情 +export function getWorkflowsDetail(id: number): Promise { + return axios.get(`workflows/getDetail?id=${id}`); +} +// 审批流启用禁用 +export function toggleWorkflowsDisable(params: any): Promise { + return axios.post('workflows/disable', params); +} +// 删除审批流 +export function delWorkflows(id: number): Promise { + return axios.get(`workflows/del?id=${id}`); +} diff --git a/src/types/vue-flow.d.ts b/src/types/vue-flow.d.ts new file mode 100644 index 0000000..07394a6 --- /dev/null +++ b/src/types/vue-flow.d.ts @@ -0,0 +1,61 @@ +declare module '@vue-flow/core' { + import type { Component } from 'vue'; + + export type Position = 'left' | 'right' | 'top' | 'bottom'; + export interface XYPosition { + x: number; + y: number; + } + + export interface Node { + id: string; + position: XYPosition; + data?: Data; + type?: string; + style?: Record; + class?: string; + width?: number; + height?: number; + sourcePosition?: Position; + targetPosition?: Position; + draggable?: boolean; + connectable?: boolean; + } + + export interface Edge { + id: string; + source: string; + target: string; + type?: string; + animated?: boolean; + data?: Data; + style?: Record; + } + + export const VueFlow: Component; + export const Background: Component; + export const MiniMap: Component; + export const Handle: Component; + export const Position: { + Left: 'left'; + Right: 'right'; + Top: 'top'; + Bottom: 'bottom'; + }; + export function useVueFlow(): any; +} + +declare module '@vue-flow/controls' { + import type { Component } from 'vue'; + export const Controls: Component; +} + +declare module '@vue-flow/minimap' { + import type { Component } from 'vue'; + export const MiniMap: Component; +} + +declare module '@vue-flow/background' { + import type { Component } from 'vue'; + export const Background: Component; +} diff --git a/src/views/setting/system/process-settings/components/NodeConfigPanel.vue b/src/views/setting/system/process-settings/components/NodeConfigPanel.vue new file mode 100644 index 0000000..4145e7a --- /dev/null +++ b/src/views/setting/system/process-settings/components/NodeConfigPanel.vue @@ -0,0 +1,551 @@ + + + + + diff --git a/src/views/setting/system/process-settings/components/add-approval.vue b/src/views/setting/system/process-settings/components/add-approval.vue new file mode 100644 index 0000000..68141e9 --- /dev/null +++ b/src/views/setting/system/process-settings/components/add-approval.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/src/views/setting/system/process-settings/components/custom-nodes/ApproverNode.vue b/src/views/setting/system/process-settings/components/custom-nodes/ApproverNode.vue new file mode 100644 index 0000000..6442680 --- /dev/null +++ b/src/views/setting/system/process-settings/components/custom-nodes/ApproverNode.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/src/views/setting/system/process-settings/components/custom-nodes/CcNode.vue b/src/views/setting/system/process-settings/components/custom-nodes/CcNode.vue new file mode 100644 index 0000000..f53e8c8 --- /dev/null +++ b/src/views/setting/system/process-settings/components/custom-nodes/CcNode.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/src/views/setting/system/process-settings/components/custom-nodes/ConditionNode.vue b/src/views/setting/system/process-settings/components/custom-nodes/ConditionNode.vue new file mode 100644 index 0000000..b417c6c --- /dev/null +++ b/src/views/setting/system/process-settings/components/custom-nodes/ConditionNode.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/src/views/setting/system/process-settings/components/custom-nodes/EndNode.vue b/src/views/setting/system/process-settings/components/custom-nodes/EndNode.vue new file mode 100644 index 0000000..301021d --- /dev/null +++ b/src/views/setting/system/process-settings/components/custom-nodes/EndNode.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/src/views/setting/system/process-settings/components/custom-nodes/StartNode.vue b/src/views/setting/system/process-settings/components/custom-nodes/StartNode.vue new file mode 100644 index 0000000..6c8dff1 --- /dev/null +++ b/src/views/setting/system/process-settings/components/custom-nodes/StartNode.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/src/views/setting/system/process-settings/index.vue b/src/views/setting/system/process-settings/index.vue index 91f238d..2241c57 100644 --- a/src/views/setting/system/process-settings/index.vue +++ b/src/views/setting/system/process-settings/index.vue @@ -4,63 +4,1526 @@
-
-
    -
  • 新增审批流程
  • -
  • {{ - item.name - }}
  • +
    +
      +
    • + 新增审批流程 +
    • +
    • + {{ workflowItem.name }} + + {{ workflowItem.statusStr }} +
    - asdasdsa +
    +
    + {{ currentApproval.name }} +
    +
    + {{ currentApproval.statusStr }} + + 编辑描述 + + + + 删除 + + 保存 +
    +
    +
    +
    +
    + 适用范围 + + +
    +
    + 备注:{{ + currentApproval.remark || '-' + }} +
    +
    +
    最后更新:{{ currentApproval.updatedAt || '-' }}
    +
    +
    +
    + + + + + + + +
    +
    +

    拖拽节点到画布创建流程

    +
    + 审批人 +
    +
    + 抄送 +
    +
    + 条件 +
    +
    +
+ + + + +
- + + +