From f9c6088c85ffdab12fb95bcc0aad06200ba21c8c Mon Sep 17 00:00:00 2001
From: cuijian <cuijian@xalxzn.com>
Date: 星期一, 23 六月 2025 16:56:12 +0800
Subject: [PATCH] 系统管理、工作流

---
 src/views/flowable/components/HistoricDetail.vue                                |  343 +++
 src/views/system/modules/SysBusinessCodeRuleModal.vue                           |  138 +
 vue.config.js                                                                   |   12 
 package-lock.json                                                               |  273 +++
 src/views/flowable/api/todo.js                                                  |   65 
 src/views/flowable/components/ActHistoricDetailBtn.vue                          |   53 
 src/views/flowable/workflow/assignFileStream/AssignFileStreamHandle.vue         |  434 +++++
 src/views/flowable/workflow/dispatchFile/DispatchFileHandle.vue                 |  415 ++++
 src/views/flowable/api/definition.js                                            |  134 +
 src/views/flowable/components/ActApplyBtn.vue                                   |   73 
 src/views/flowable/workflow/FlowLedger.vue                                      |  209 ++
 src/views/system/SysParamsList.vue                                              |  214 ++
 src/views/flowable/workflow/assignFileStream/AssignFileStreamXq.vue             |  389 ++++
 src/views/flowable/workflow/FlowTodo.vue                                        |  424 ++++
 src/views/flowable/components/ActHandleBtn.vue                                  |  235 ++
 src/views/flowable/workflow/dispatchFile/DispatchFileBachHandleForm.vue         |  216 ++
 src/views/flowable/mixin/FlowableMixin.js                                       |   68 
 src/views/system/modules/SysParamsModal.vue                                     |  124 +
 src/views/flowable/components/ActCancelBtn.vue                                  |   74 
 src/utils/request.js                                                            |    2 
 .env.development                                                                |    2 
 src/views/flowable/api/process.js                                               |   34 
 package.json                                                                    |    1 
 .env.production                                                                 |    2 
 src/views/flowable/api/finished.js                                              |   37 
 src/views/flowable/workflow/dispatchFile/DispatchFileXq.vue                     |  364 ++++
 src/views/flowable/workflow/FlowCompleted.vue                                   |  182 ++
 src/views/flowable/workflow/dispatchFile/DispatchFileBachHandleStyle#Drawer.vue |   62 
 src/views/system/SysBusinessCodeRuleList.vue                                    |  177 ++
 src/views/flowable/modeler/modelerDesign.vue                                    |  400 ++++
 30 files changed, 5,145 insertions(+), 11 deletions(-)

diff --git a/.env.development b/.env.development
index d6163ba..f7a86b2 100644
--- a/.env.development
+++ b/.env.development
@@ -1,5 +1,5 @@
 NODE_ENV=development
-VUE_APP_API_BASE_URL=http://192.168.124.118:9989
+VUE_APP_API_BASE_URL=http://127.0.0.1:9989/jeecg-boot
 VUE_APP_CAS_BASE_URL=http://cas.example.org:8443/cas
 VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview
 
diff --git a/.env.production b/.env.production
index f0346eb..8215371 100644
--- a/.env.production
+++ b/.env.production
@@ -1,4 +1,4 @@
 NODE_ENV=production
-VUE_APP_API_BASE_URL=http://192.168.124.118:9989
+VUE_APP_API_BASE_URL=http://127.0.0.1:9989
 VUE_APP_CAS_BASE_URL=http://localhost:8888/cas
 VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 91383a6..fb5e155 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1403,6 +1403,56 @@
       "resolved": "https://registry.npmmirror.com/@jeecg/antd-online-mini/-/antd-online-mini-3.4.3-beta2.tgz",
       "integrity": "sha512-uZLjtQG/vAcBsCEysE1HceUyzwiHwU+JlNzvHxNnenNDHeaawZa9CfILUImNFJ5JQVqE5J11QpQNb6i5Boo3Gw=="
     },
+    "@jiaminghi/bezier-curve": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmmirror.com/@jiaminghi/bezier-curve/-/bezier-curve-0.0.9.tgz",
+      "integrity": "sha512-u9xJPOEl6Dri2E9FfmJoGxYQY7vYJkURNX04Vj64tdi535tPrpkuf9Sm0lNr3QTKdHQh0DdNRsaa62FLQNQEEw==",
+      "requires": {
+        "@babel/runtime": "^7.5.5"
+      }
+    },
+    "@jiaminghi/c-render": {
+      "version": "0.4.3",
+      "resolved": "https://registry.npmmirror.com/@jiaminghi/c-render/-/c-render-0.4.3.tgz",
+      "integrity": "sha512-FJfzj5hGj7MLqqqI2D7vEzHKbQ1Ynnn7PJKgzsjXaZpJzTqs2Yw5OSeZnm6l7Qj7jyPAP53lFvEQNH4o4j6s+Q==",
+      "requires": {
+        "@babel/runtime": "^7.5.5",
+        "@jiaminghi/bezier-curve": "*",
+        "@jiaminghi/color": "*",
+        "@jiaminghi/transition": "*"
+      }
+    },
+    "@jiaminghi/charts": {
+      "version": "0.2.18",
+      "resolved": "https://registry.npmmirror.com/@jiaminghi/charts/-/charts-0.2.18.tgz",
+      "integrity": "sha512-K+HXaOOeWG9OOY1VG6M4mBreeeIAPhb9X+khG651AbnwEwL6G2UtcAQ8GWCq6GzhczcLwwhIhuaHqRygwHC0sA==",
+      "requires": {
+        "@babel/runtime": "^7.5.5",
+        "@jiaminghi/c-render": "^0.4.3"
+      }
+    },
+    "@jiaminghi/color": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/@jiaminghi/color/-/color-1.1.3.tgz",
+      "integrity": "sha512-ZY3hdorgODk4OSTbxyXBPxAxHPIVf9rPlKJyK1C1db46a50J0reFKpAvfZG8zMG3lvM60IR7Qawgcu4ZDO3+Hg=="
+    },
+    "@jiaminghi/data-view": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmmirror.com/@jiaminghi/data-view/-/data-view-2.10.0.tgz",
+      "integrity": "sha512-Cud2MTiMcqc5k2KWabR/svuVQmXHANqURo+yj40370/LdI/gyUJ6LG203hWXEnT1nMCeiv/SLVmxv3PXLScCeA==",
+      "requires": {
+        "@babel/runtime": "^7.5.5",
+        "@jiaminghi/charts": "*"
+      }
+    },
+    "@jiaminghi/transition": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmmirror.com/@jiaminghi/transition/-/transition-1.1.11.tgz",
+      "integrity": "sha512-owBggipoHMikDHHDW5Gc7RZYlVuvxHADiU4bxfjBVkHDAmmck+fCkm46n2JzC3j33hWvP9nSCAeh37t6stgWeg==",
+      "requires": {
+        "@babel/runtime": "^7.5.5"
+      }
+    },
     "@mrmlnc/readdir-enhanced": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
@@ -5134,6 +5184,33 @@
       "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
       "dev": true
     },
+    "bpmn-js": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npmmirror.com/bpmn-js/-/bpmn-js-7.5.0.tgz",
+      "integrity": "sha512-0ANaE6Bikg1GmkcvO7RK0MQPX+EKYKBc+q7OWk39/16NcCdNZ/4UiRcCr9n0u1VUCIDsSU/jJ79TIZFnV5CNjw==",
+      "requires": {
+        "bpmn-moddle": "^7.0.4",
+        "css.escape": "^1.5.1",
+        "diagram-js": "^6.8.2",
+        "diagram-js-direct-editing": "^1.6.1",
+        "ids": "^1.0.0",
+        "inherits": "^2.0.4",
+        "min-dash": "^3.5.2",
+        "min-dom": "^3.1.3",
+        "object-refs": "^0.3.0",
+        "tiny-svg": "^2.2.2"
+      }
+    },
+    "bpmn-moddle": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmmirror.com/bpmn-moddle/-/bpmn-moddle-7.1.3.tgz",
+      "integrity": "sha512-ZcBfw0NSOdYTSXFKEn7MOXHItz7VfLZTrFYKO8cK6V8ZzGjCcdiLIOiw7Lctw1PJsihhLiZQS8Htj2xKf+NwCg==",
+      "requires": {
+        "min-dash": "^3.5.2",
+        "moddle": "^5.0.2",
+        "moddle-xml": "^9.0.6"
+      }
+    },
     "brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -6112,6 +6189,11 @@
       "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
       "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
     },
+    "component-event": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/component-event/-/component-event-0.1.4.tgz",
+      "integrity": "sha512-GMwOG8MnUHP1l8DZx1ztFO0SJTFnIzZnBDkXAj8RM2ntV2A6ALlDxgbMY1Fvxlg6WPQ+5IM/a6vg4PEYbjg/Rw=="
+    },
     "component-indexof": {
       "version": "0.0.3",
       "resolved": "https://registry.npmmirror.com/component-indexof/-/component-indexof-0.0.3.tgz",
@@ -6821,6 +6903,11 @@
       "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz",
       "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==",
       "dev": true
+    },
+    "css.escape": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/css.escape/-/css.escape-1.5.1.tgz",
+      "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="
     },
     "cssesc": {
       "version": "3.0.0",
@@ -7735,8 +7822,7 @@
     "deepmerge": {
       "version": "1.5.2",
       "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
-      "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
-      "dev": true
+      "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
     },
     "default-gateway": {
       "version": "5.0.5",
@@ -7988,6 +8074,36 @@
       "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
       "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw=="
     },
+    "diagram-js": {
+      "version": "6.8.2",
+      "resolved": "https://registry.npmmirror.com/diagram-js/-/diagram-js-6.8.2.tgz",
+      "integrity": "sha512-5EKYHjW2mmGsn9/jSenSkm8cScK5sO9eETBRQNIIzgZjxBDJn6eX964L2d7/vrAW9SeuijGUsztL9+NUinSsNg==",
+      "requires": {
+        "css.escape": "^1.5.1",
+        "didi": "^4.0.0",
+        "hammerjs": "^2.0.1",
+        "inherits": "^2.0.1",
+        "min-dash": "^3.5.0",
+        "min-dom": "^3.1.2",
+        "object-refs": "^0.3.0",
+        "path-intersection": "^2.2.0",
+        "tiny-svg": "^2.2.1"
+      }
+    },
+    "diagram-js-direct-editing": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/diagram-js-direct-editing/-/diagram-js-direct-editing-1.8.0.tgz",
+      "integrity": "sha512-B4Xj+PJfgBjbPEzT3uZQEkZI5xHFB0Izc+7BhDFuHidzrEMzQKZrFGdA3PqfWhReHf3dp+iB6Tt11G9eGNjKMw==",
+      "requires": {
+        "min-dash": "^3.5.2",
+        "min-dom": "^3.1.3"
+      }
+    },
+    "didi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/didi/-/didi-4.0.0.tgz",
+      "integrity": "sha512-AzMElh8mCHOPWPCWfGjoJRla31fMXUT6+287W5ef3IPmtuBcyG9+MkFS7uPP6v3t2Cl086KwWfRB9mESa0OsHQ=="
+    },
     "diffie-hellman": {
       "version": "5.0.3",
       "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
@@ -8127,6 +8243,11 @@
         "domelementtype": "1"
       }
     },
+    "domify": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmmirror.com/domify/-/domify-1.4.2.tgz",
+      "integrity": "sha512-m4yreHcUWHBncGVV7U+yQzc12vIlq0jMrtHZ5mW6dQMiL/7skSYNVX9wqKwOtyO9SGCgevrAFEgOCAHmamHTUA=="
+    },
     "domutils": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
@@ -8262,6 +8383,29 @@
       "version": "1.3.495",
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.495.tgz",
       "integrity": "sha512-cIPX+4Y3RH/+SoqYd168Rx//CnjsZSdF3XTUhwMf3dwYuTfvWIgmmy6s1ipptGaOA+scH2Vj57Mc9fqp/ho22Q=="
+    },
+    "element-ui": {
+      "version": "2.15.14",
+      "resolved": "https://registry.npmmirror.com/element-ui/-/element-ui-2.15.14.tgz",
+      "integrity": "sha512-2v9fHL0ZGINotOlRIAJD5YuVB8V7WKxrE9Qy7dXhRipa035+kF7WuU/z+tEmLVPBcJ0zt8mOu1DKpWcVzBK8IA==",
+      "requires": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "deepmerge": "^1.2.0",
+        "normalize-wheel": "^1.0.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "throttle-debounce": "^1.0.1"
+      },
+      "dependencies": {
+        "async-validator": {
+          "version": "1.8.5",
+          "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-1.8.5.tgz",
+          "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
+          "requires": {
+            "babel-runtime": "6.x"
+          }
+        }
+      }
     },
     "elliptic": {
       "version": "6.5.3",
@@ -9975,6 +10119,11 @@
         }
       }
     },
+    "hammerjs": {
+      "version": "2.0.8",
+      "resolved": "https://registry.npmmirror.com/hammerjs/-/hammerjs-2.0.8.tgz",
+      "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ=="
+    },
     "handle-thing": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
@@ -10523,6 +10672,11 @@
         }
       }
     },
+    "ids": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/ids/-/ids-1.0.5.tgz",
+      "integrity": "sha512-XQ0yom/4KWTL29sLG+tyuycy7UmeaM/79GRtSJq6IG9cJGIPeBz5kwDCguie3TwxaMNIc3WtPi0cTa1XYHicpw=="
+    },
     "ieee754": {
       "version": "1.1.13",
       "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
@@ -10621,6 +10775,11 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
       "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
+    },
+    "indexof": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/indexof/-/indexof-0.0.1.tgz",
+      "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg=="
     },
     "infer-owner": {
       "version": "1.0.4",
@@ -11519,6 +11678,11 @@
       "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
       "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
     },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
+    },
     "lodash.defaults": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
@@ -11576,6 +11740,11 @@
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
       "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
+    },
+    "lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
     },
     "lodash.pick": {
       "version": "4.4.0",
@@ -11705,6 +11874,11 @@
       "requires": {
         "object-visit": "^1.0.0"
       }
+    },
+    "matches-selector": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/matches-selector/-/matches-selector-1.2.0.tgz",
+      "integrity": "sha512-c4vLwYWyl+Ji+U43eU/G5FwxWd4ZH0ePUsFs5y0uwD9HUEFBXUQ1zUUan+78IpRD+y4pUfG0nAzNM292K7ItvA=="
     },
     "math-expression-evaluator": {
       "version": "1.2.22",
@@ -12039,6 +12213,23 @@
       "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
       "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
     },
+    "min-dash": {
+      "version": "3.8.1",
+      "resolved": "https://registry.npmmirror.com/min-dash/-/min-dash-3.8.1.tgz",
+      "integrity": "sha512-evumdlmIlg9mbRVPbC4F5FuRhNmcMS5pvuBUbqb1G9v09Ro0ImPEgz5n3khir83lFok1inKqVDjnKEg3GpDxQg=="
+    },
+    "min-dom": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmmirror.com/min-dom/-/min-dom-3.2.1.tgz",
+      "integrity": "sha512-v6YCmnDzxk4rRJntWTUiwggLupPw/8ZSRqUq0PDaBwVZEO/wYzCH4SKVBV+KkEvf3u0XaWHly5JEosPtqRATZA==",
+      "requires": {
+        "component-event": "^0.1.4",
+        "domify": "^1.3.1",
+        "indexof": "0.0.1",
+        "matches-selector": "^1.2.0",
+        "min-dash": "^3.8.1"
+      }
+    },
     "mini-css-extract-plugin": {
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz",
@@ -12174,6 +12365,24 @@
       "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
       "requires": {
         "minimist": "^1.2.5"
+      }
+    },
+    "moddle": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmmirror.com/moddle/-/moddle-5.0.4.tgz",
+      "integrity": "sha512-Kjb+hjuzO+YlojNGxEUXvdhLYTHTtAABDlDcJTtTcn5MbJF9Zkv4I1Fyvp3Ypmfgg1EfHDZ3PsCQTuML9JD6wg==",
+      "requires": {
+        "min-dash": "^3.0.0"
+      }
+    },
+    "moddle-xml": {
+      "version": "9.0.6",
+      "resolved": "https://registry.npmmirror.com/moddle-xml/-/moddle-xml-9.0.6.tgz",
+      "integrity": "sha512-tl0reHpsY/aKlLGhXeFlQWlYAQHFxTkFqC8tq8jXRYpQSnLVw13T6swMaourLd7EXqHdWsc+5ggsB+fEep6xZQ==",
+      "requires": {
+        "min-dash": "^3.5.2",
+        "moddle": "^5.0.2",
+        "saxen": "^8.1.2"
       }
     },
     "moment": {
@@ -12428,6 +12637,11 @@
         "sort-keys": "^1.0.0"
       }
     },
+    "normalize-wheel": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+      "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
+    },
     "npm-run-path": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@@ -12520,6 +12734,11 @@
       "version": "0.9.2",
       "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz",
       "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU="
+    },
+    "object-refs": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/object-refs/-/object-refs-0.3.0.tgz",
+      "integrity": "sha512-eP0ywuoWOaDoiake/6kTJlPJhs+k0qNm4nYRzXLNHj6vh+5M3i9R1epJTdxIPGlhWc4fNRQ7a6XJNCX+/L4FOQ=="
     },
     "object-visit": {
       "version": "1.0.1",
@@ -12921,6 +13140,11 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
       "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+    },
+    "path-intersection": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmmirror.com/path-intersection/-/path-intersection-2.2.1.tgz",
+      "integrity": "sha512-9u8xvMcSfuOiStv9bPdnRJQhGQXLKurew94n4GPQCdH1nj9QKC9ObbNoIpiRq8skiOBxKkt277PgOoFgAt3/rA=="
     },
     "path-is-absolute": {
       "version": "1.0.1",
@@ -15444,6 +15668,11 @@
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
       "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
     },
+    "saxen": {
+      "version": "8.1.2",
+      "resolved": "https://registry.npmmirror.com/saxen/-/saxen-8.1.2.tgz",
+      "integrity": "sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw=="
+    },
     "schema-utils": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
@@ -16654,6 +16883,11 @@
         "neo-async": "^2.6.0"
       }
     },
+    "throttle-debounce": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
+      "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
+    },
     "through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -16697,6 +16931,11 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
       "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+    },
+    "tiny-svg": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmmirror.com/tiny-svg/-/tiny-svg-2.2.4.tgz",
+      "integrity": "sha512-NOi39lBknf4UdDEahNkbEAJnzhu1ZcN2j75IS2vLRmIhsfxdZpTChfLKBcN1ShplVmPIXJAIafk6YY5/Aa80lQ=="
     },
     "tinycolor2": {
       "version": "1.6.0",
@@ -17264,6 +17503,14 @@
       "version": "0.5.4",
       "resolved": "https://registry.npmjs.org/vue-cropper/-/vue-cropper-0.5.4.tgz",
       "integrity": "sha512-9wwHOk1eHdl+nyq2fnIFDeDMjaXPh1dqfY+FdeEGU7Z/cKVOyH0pLrW0/5NH3xnRzqrU3DAQ8LjC/9/eHdvqKA=="
+    },
+    "vue-drag-resize": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmmirror.com/vue-drag-resize/-/vue-drag-resize-1.5.4.tgz",
+      "integrity": "sha512-SR3U7n6TAZEBgP7zw7bR9mjtAlYBjqIoaWTDPz5HXN/nYhOxKSA31aD7p71fmq1jtyt9reAnCx62valNL9ZAcg==",
+      "requires": {
+        "vue-drag-resize": "^1.5.0-rc3"
+      }
     },
     "vue-eslint-parser": {
       "version": "2.0.3",
@@ -18306,6 +18553,17 @@
         "errno": "~0.1.7"
       }
     },
+    "workflow-bpmn-modeler": {
+      "version": "0.2.8",
+      "resolved": "https://registry.npmmirror.com/workflow-bpmn-modeler/-/workflow-bpmn-modeler-0.2.8.tgz",
+      "integrity": "sha512-7Y2+YMx5mFDrpDAMoEK2EMVp5Z4585tYBLuqOxcbB5cdY6Vt1VjE1OBhzcwlFU6MWfpeisMGKbYtlPSHAOzsGg==",
+      "requires": {
+        "bpmn-js": "^7.2.1",
+        "element-ui": "^2.12.0",
+        "vue": "^2.6.10",
+        "xcrud": "0.4.1"
+      }
+    },
     "wrap-ansi": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
@@ -18351,6 +18609,17 @@
         "async-limiter": "~1.0.0"
       }
     },
+    "xcrud": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/xcrud/-/xcrud-0.4.1.tgz",
+      "integrity": "sha512-aUbZZDARyNhbdBqT5nrHsXkYMM3Bo0i8EFvVgEyq444cxvYkqz4I71XWN2bPVhK/axfX4RawmIHjOQTz2v/apw==",
+      "requires": {
+        "element-ui": "^2.13.2",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.merge": "^4.6.2",
+        "vue": "^2.6.11"
+      }
+    },
     "xe-utils": {
       "version": "2.4.8",
       "resolved": "https://registry.npmmirror.com/xe-utils/-/xe-utils-2.4.8.tgz",
diff --git a/package.json b/package.json
index 8b1d652..be06d7c 100644
--- a/package.json
+++ b/package.json
@@ -50,6 +50,7 @@
     "vuex": "^3.1.0",
     "vxe-table": "2.9.13",
     "vxe-table-plugin-antd": "1.8.10",
+    "workflow-bpmn-modeler": "^0.2.8",
     "xe-utils": "2.4.8",
     "xss": "^1.0.13"
   },
diff --git a/src/utils/request.js b/src/utils/request.js
index 2abc6cb..d765367 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -15,7 +15,7 @@
 //console.log("apiBaseUrl= ",apiBaseUrl)
 // 鍒涘缓 axios 瀹炰緥
 const service = axios.create({
-  baseURL: '/api',
+  baseURL: apiBaseUrl,
   // baseURL: apiBaseUrl, // api base_url
   timeout: 500000 // 璇锋眰瓒呮椂鏃堕棿
 })
diff --git a/src/views/flowable/api/definition.js b/src/views/flowable/api/definition.js
new file mode 100644
index 0000000..918fdb2
--- /dev/null
+++ b/src/views/flowable/api/definition.js
@@ -0,0 +1,134 @@
+import {axios as request} from '@/utils/request'
+
+// 鏌ヨ娴佺▼瀹氫箟鍒楄〃
+export function listDefinition(query) {
+  return request({
+    url: '/flowable/definition/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 閮ㄧ讲娴佺▼瀹炰緥
+export function definitionStartByDefId(procDefId,data) {
+  return request({
+    url: '/flowable/definition/startByProcDefId/' + procDefId,
+    method: 'post',
+    data: JSON.stringify(data)
+  })
+}
+// 閮ㄧ讲娴佺▼瀹炰緥
+export function definitionStartByDefKey(procDefKey,data) {
+  return request({
+    url: '/flowable/definition/startByProcDefKey/' + procDefKey,
+    method: 'post',
+    data: JSON.stringify(data)
+  })
+}
+// 閮ㄧ讲娴佺▼瀹炰緥
+export function definitionStartByDataId(dataId,data) {
+  return request({
+    url: '/flowable/definition/startByDataId/' + dataId,
+    method: 'post',
+    data: data
+  })
+}
+
+// 鑾峰彇娴佺▼鍙橀噺
+export function getProcessVariables(taskId) {
+  return request({
+    url: '/flowable/task/processVariables/' + taskId,
+    method: 'get'
+  })
+}
+
+// 婵�娲�/鎸傝捣娴佺▼
+export function updateState(params) {
+  return request({
+    url: '/flowable/definition/updateState',
+    method: 'put',
+    params: params
+  })
+}
+
+// 鎸囧畾娴佺▼鍔炵悊浜哄憳鍒楄〃
+export function userList(query) {
+  return request({
+    url: '/flowable/definition/userList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鎸囧畾娴佺▼鍔炵悊缁勫垪琛�
+export function roleList(query) {
+  return request({
+    url: '/flowable/definition/roleList',
+    method: 'get',
+    params: query
+  })
+}
+// 鎸囧畾娴佺▼鍒嗙被鍒楄〃
+export function categoryList(query) {
+  return request({
+    url: '/flowable/definition/categoryList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 璇诲彇xml鏂囦欢
+export function readXml(deployId) {
+  return request({
+    url: '/flowable/definition/readXml/' + deployId,
+    method: 'get'
+  })
+}
+// 璇诲彇xml鏂囦欢
+export function readXmlByDataId(dataId) {
+  return request({
+    url: '/flowable/definition/readXmlByDataId/' + dataId,
+    method: 'get'
+  })
+}
+// 璇诲彇image鏂囦欢
+export function readImage(deployId) {
+  return request({
+    url: '/flowable/definition/readImage/' + deployId,
+    method: 'get'
+  })
+}
+
+// 璇诲彇image鏂囦欢
+export function getFlowViewer(procInsId) {
+  return request({
+    url: '/flowable/task/flowViewer/' + procInsId,
+    method: 'get'
+  })
+}
+// 璇诲彇image鏂囦欢
+export function getFlowViewerByDataId(dataId) {
+  return request({
+    url: '/flowable/task/flowViewerByDataId/' + dataId,
+    method: 'get'
+  })
+}
+
+// 璇诲彇xml鏂囦欢
+export function saveXml(data) {
+  return request({
+    url: '/flowable/definition/save',
+    method: 'post',
+    data: data
+  })
+}
+
+// 鍒犻櫎娴佺▼瀹氫箟
+export function delDeployment(query) {
+  return request({
+    url: '/flowable/definition/delete/',
+    method: 'delete',
+    params: query
+  })
+}
+
diff --git a/src/views/flowable/api/finished.js b/src/views/flowable/api/finished.js
new file mode 100644
index 0000000..bbab6da
--- /dev/null
+++ b/src/views/flowable/api/finished.js
@@ -0,0 +1,37 @@
+import {axios as request} from '@/utils/request'
+
+// 鏌ヨ宸插姙浠诲姟鍒楄〃
+export function finishedList(query) {
+  return request({
+    url: '/flowable/task/finishedList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 浠诲姟娴佽浆璁板綍
+export function flowRecord(query) {
+  return request({
+    url: '/flowable/task/flowRecord',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鎾ゅ洖浠诲姟
+export function revokeProcess(data) {
+  return request({
+    url: '/flowable/task/revokeProcess',
+    method: 'post',
+    data: data
+  })
+}
+
+// 閮ㄧ讲娴佺▼瀹炰緥
+export function deployStart(deployId) {
+  return request({
+    url: '/flowable/process/startFlow/' + deployId,
+    method: 'get',
+  })
+}
+
diff --git a/src/views/flowable/api/process.js b/src/views/flowable/api/process.js
new file mode 100644
index 0000000..87a3346
--- /dev/null
+++ b/src/views/flowable/api/process.js
@@ -0,0 +1,34 @@
+import {axios as request} from '@/utils/request'
+
+// 鎴戠殑鍙戣捣鐨勬祦绋�
+export function myProcessList(query) {
+  return request({
+    url: '/flowable/task/myProcess',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 鍙栨秷鐢宠
+export function deleteByDataId(dataId,deleteReason) {
+  const data = {
+    dataId:dataId,
+    deleteReason:deleteReason
+  }
+  return request({
+    url: '/flowable/instance/deleteByDataId',
+    method: 'post',
+    params: data
+  })
+}
+
+
+// 閮ㄧ讲娴佺▼瀹炰緥
+export function deployStart(deployId) {
+  return request({
+    url: '/flowable/process/startFlow/' + deployId,
+    method: 'get',
+  })
+}
+
diff --git a/src/views/flowable/api/todo.js b/src/views/flowable/api/todo.js
new file mode 100644
index 0000000..107bb4a
--- /dev/null
+++ b/src/views/flowable/api/todo.js
@@ -0,0 +1,65 @@
+import {axios as request} from '@/utils/request'
+
+// 鏌ヨ寰呭姙浠诲姟鍒楄〃
+export function todoList(query) {
+  return request({
+    url: '/flowable/task/todoList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 瀹屾垚浠诲姟
+export function completeTask(data) {
+  return request({
+    url: '/flowable/task/completeByDateId',
+    method: 'post',
+    data: data
+  })
+}
+
+// 濮旀淳浠诲姟
+export function delegate(data) {
+  return request({
+    url: '/flowable/task/delegate',
+    method: 'post',
+    data: data
+  })
+}
+
+// 閫�鍥炰换鍔�
+export function returnTask(data) {
+  return request({
+    url: '/flowable/task/taskReturnByDataId',
+    method: 'post',
+    data: data
+  })
+}
+
+// 椹冲洖浠诲姟
+export function rejectTask(data) {
+  return request({
+    url: '/flowable/task/taskRejectByDataId',
+    method: 'post',
+    data: data
+  })
+}
+
+// 鍙��鍥炰换鍔″垪琛�
+export function returnList(data) {
+  return request({
+    url: '/flowable/task/findReturnTaskListByDataId',
+    method: 'post',
+    data: data
+  })
+}
+
+// 涓嬩竴鑺傜偣 todo 鐩墠鐩存帴鑷姩鍒嗛厤鍒板�欓�変汉锛屼笉鐢ㄤ富鍔ㄩ�変汉锛屽鏈夐渶瑕佸啀寮�鍙�
+export function getNextFlowNode(data) {
+  return request({
+    url: '/flowable/task/nextFlowNode',
+    method: 'post',
+    data: data
+  })
+}
+
diff --git a/src/views/flowable/components/ActApplyBtn.vue b/src/views/flowable/components/ActApplyBtn.vue
new file mode 100644
index 0000000..7e5a39c
--- /dev/null
+++ b/src/views/flowable/components/ActApplyBtn.vue
@@ -0,0 +1,73 @@
+<style lang="less">
+</style>
+<template>
+  <span>
+      <a-button :loading="submitLoading" :type="btnType" @click="applySubmit()" >{{text}}</a-button>
+  </span>
+</template>
+
+<script>
+  import {definitionStartByDataId} from "@views/flowable/api/definition";
+
+export default {
+    name: 'ActApplyBtn',
+    components: {},
+    props: {
+        btnType: { type: String, default: 'link', required: false },
+        /**/
+        dataId: {
+            type: String,
+            default: '',
+            required: true
+        },
+        variables:{
+          type: Object,
+          default: {},
+        },
+        text: {
+            type: String,
+            default: '鎻愪氦鐢宠',
+            required: false
+        }
+
+    },
+    data() {
+        return {
+            modalVisible: false,
+            submitLoading: false,
+            form: {
+            },
+        };
+    },
+    created() {
+    },
+    watch: {
+    },
+    methods: {
+        applySubmit() {
+            if (this.dataId && this.dataId.length < 1) {
+                this.error = '蹇呴』浼犲叆鍙傛暟dataId';
+                this.$message.error(this.error);
+                return;
+            } else {
+                this.error = '';
+            }
+            this.submitLoading = true;
+            var params = Object.assign({
+                dataId: this.dataId
+            }, this.variables);
+          definitionStartByDataId(this.dataId, params)
+                .then(res => {
+                    if (res.success) {
+                        this.$message.success('鎿嶄綔鎴愬姛');
+                        this.$emit('success');
+                    } else {
+                        this.$message.error(res.message);
+                    }
+                })
+                .finally(() => (this.submitLoading = false));
+        }
+    }
+
+};
+</script>
diff --git a/src/views/flowable/components/ActCancelBtn.vue b/src/views/flowable/components/ActCancelBtn.vue
new file mode 100644
index 0000000..02af66f
--- /dev/null
+++ b/src/views/flowable/components/ActCancelBtn.vue
@@ -0,0 +1,74 @@
+<style lang="less">
+</style>
+<template>
+  <span>
+      <a-button :type="btnType" @click="cancel()" >{{text}}</a-button>
+      <a-modal title="纭鎾ゅ洖" v-model="modalCancelVisible" :mask-closable="false" :width="500">
+            <a-form ref="delForm" v-model="cancelForm" :label-width="70" v-if="modalCancelVisible">
+                <a-form-item label="鎾ゅ洖鍘熷洜" prop="reason">
+                    <a-input type="textarea" v-model="cancelForm.reason" :rows="4" />
+                </a-form-item>
+            </a-form>
+            <div slot="footer">
+                <a-button type="text" @click="modalCancelVisible = false">鍙栨秷</a-button>
+                <a-button type="primary" :disabled="submitLoading" @click="handelSubmitCancel">鎻愪氦</a-button>
+            </div>
+        </a-modal>
+  </span>
+</template>
+
+<script>
+import {deleteByDataId} from "@views/flowable/api/process";
+
+export default {
+    name: 'ActCancelBtn',
+    components: {},
+    props: {
+        btnType: { type: String, default: 'link', required: false },
+        /**/
+        dataId: {
+            type: String,
+            default: '',
+            required: true
+        },
+        text: {
+            type: String,
+            default: '鎾ゅ洖',
+            required: false
+        }
+    },
+    data() {
+        return {
+            modalCancelVisible: false,
+            cancelForm: {
+                reason: ''
+            },
+            submitLoading: false,
+        };
+    },
+    created() {
+    },
+    watch: {
+    },
+    methods: {
+        cancel() {
+            this.modalCancelVisible = true;
+        },
+        handelSubmitCancel() {
+            this.submitLoading = true;
+          deleteByDataId(this.dataId, this.cancelForm.reason)
+                .then(res => {
+                    if (res.success) {
+                        this.$message.success('鎿嶄綔鎴愬姛');
+                        this.modalCancelVisible = false;
+                        this.$emit('success');
+                    } else {
+                        this.$message.error(res.message);
+                    }
+                })
+                .finally(() => (this.submitLoading = false));
+        }
+    }
+
+};
+</script>
diff --git a/src/views/flowable/components/ActHandleBtn.vue b/src/views/flowable/components/ActHandleBtn.vue
new file mode 100644
index 0000000..a820ea6
--- /dev/null
+++ b/src/views/flowable/components/ActHandleBtn.vue
@@ -0,0 +1,235 @@
+<style lang="less">
+</style>
+<template>
+  <span>
+      <a-button :type="btnType" @click="handle()" >{{text}}</a-button>
+      <a-modal :title="modalTaskTitle" v-model="modalTaskVisible" :mask-closable="false" :width="500">
+
+      <div  v-if="modalTaskVisible">
+        <div v-if="type==handleType.reApply">
+          纭鏃犺骞堕噸鏂版彁浜わ紵
+        </div>
+        <a-form ref="form" :model="form" :label-width="85" >
+          <a-form-item v-if="type!==handleType.reApply" label="澶勭悊鎰忚" prop="reason">
+            <a-input type="textarea" v-model="form.comment" :rows="4" />
+          </a-form-item>
+          <div v-show="type==2">
+            <a-form-item label="閫�鍥炶妭鐐�" prop="targetKey" v-if="returnTaskList.length">
+              <a-radio-group v-model="form.targetKey" @change="targetKeyChange">
+                <a-radio-button
+                  v-for="item in returnTaskList"
+                  :key="item.id"
+                  :value="item.id"
+                >{{item.name}}</a-radio-button>
+              </a-radio-group>
+            </a-form-item>
+            <span v-else>鏃犲彲閫�鍥炶妭鐐癸紒</span>
+          </div>
+            <div v-if="form.targetKey !== 'start' && candidateUsers.length">
+                <a-form-item label="涓嬩釜鑺傜偣瀹℃壒鍊欓�変汉">
+                    <a-select
+                        mode="multiple"
+                        v-model="candidateUsersSelecteds"
+                        style="width: 100%"
+                        placeholder="璇烽�夋嫨涓嬩釜鑺傜偣瀹℃壒鍊欓�変汉"
+                    >
+                    <a-select-option v-for="user in candidateUsers" :key="user.username" :value="user.username">
+                        {{user.realname}}
+                    </a-select-option>
+                  </a-select>
+                </a-form-item>
+            </div>
+        </a-form>
+      </div>
+      <div slot="footer">
+        <a-button type="text" @click="modalTaskVisible=false">鍙栨秷</a-button>
+        <a-button type="primary" :loading="submitLoading" @click="handelSubmit">鎻愪氦</a-button>
+      </div>
+    </a-modal>
+  </span>
+</template>
+
+<script>
+  import {completeTask, rejectTask, returnList, returnTask} from "@views/flowable/api/todo";
+
+export default {
+    name: 'ActHandleBtn',
+    components: {},
+    props: {
+        btnType: { type: String, default: 'link', required: false },
+        /* handleType 0閫氳繃 1椹冲洖 2閫�鍥�  */
+        type: {
+            type: String|Number,
+            default: '0',
+            required: true
+        },
+        dataId: {
+            type: String,
+            default: '',
+            required: true
+        },
+      /*娴佺▼鍙橀噺*/
+        variables:{
+          type: Object,
+          default: ()=>{},
+        },
+        candidateUsers:{
+          type: Array,
+          default: ()=>[],
+        },
+        text: {
+            type: String,
+            default: '澶勭悊',
+            required: false
+        }
+    },
+    data() {
+        return {
+          handleType:{
+            // 閫氳繃
+            pass: 0,
+            // 椹冲洖
+            back: 1,
+            // 閫�鍥�
+            return: 2,
+            // 閲嶆柊鎻愪氦
+            reApply: 3
+            },
+            returnTaskList: [],
+            candidateUsersSelecteds:[],
+            modalTaskVisible: false,
+            submitLoading: false,
+            form: {
+              comment:'',
+              targetKey:''
+            },
+            modalTaskTitle: '',
+
+        };
+    },
+    created() {
+    },
+    watch: {
+    },
+    methods: {
+        handle() {
+          this.form.comment = ''
+          this.candidateUsersSelecteds = []
+            if (this.type === this.handleType.delegate) {
+                // this.delegateTask();
+            } else if (this.type === this.handleType.pass) {
+                this.passTask();
+            } else if (this.type === this.handleType.back) {
+                this.backTask();
+            } else if(this.type === this.handleType.return){
+                this.returnTask();
+            } else if(this.type === this.handleType.reApply){
+                this.reApply();
+            }
+            else {
+                this.$message.warn('鏈煡绫诲瀷type锛屽弬瑙� handleType');
+            }
+        },
+        reApply() {
+            const v = this;
+            this.modalTaskTitle = '纭閲嶆柊鎻愪氦';
+            this.modalTaskVisible = true;
+        },
+        passTask() {
+            const v = this;
+            this.modalTaskTitle = '瀹℃壒閫氳繃';
+            this.modalTaskVisible = true;
+        },
+        backTask() {
+          const v = this;
+          this.modalTaskTitle = '瀹℃壒椹冲洖';
+          this.modalTaskVisible = true;
+        },
+        returnTask() {
+            const v = this;
+            this.modalTaskTitle = '瀹℃壒閫�鍥�';
+            this.modalTaskVisible = true;
+            returnList({dataId:this.dataId}).then(res => {
+              this.returnTaskList = res.result||[];
+              // console.log(this.returnTaskList)
+            })
+        },
+
+        handelSubmit() {
+            console.log('鎻愪氦');
+            this.submitLoading = true;
+            var formData = Object.assign({
+                dataId:this.dataId,
+                candidateUsers:this.candidateUsersSelecteds,
+                values:Object.assign({dataId:this.dataId},this.variables)
+            }, this.form);
+            if (this.type==this.handleType.reApply){
+              formData.comment = '閲嶆柊鎻愪氦'
+            }
+            if (!formData.comment){
+              this.$message.error('璇疯緭鍏ュ鎵规剰瑙侊紒');
+              this.submitLoading=false
+              return;
+            }
+            // 鏈変笅涓妭鐐瑰鎵逛汉閫夋嫨锛屼絾鏄湭閫�
+            if (this.candidateUsers.length &&
+              this.candidateUsersSelecteds.length==0 &&
+              this.form.targetKey !== 'start'
+            ){
+              this.$message.error('璇烽�夋嫨涓嬩釜鑺傜偣瀹℃壒浜猴紒');
+              this.submitLoading=false
+              return;
+            }
+            if (this.type == this.handleType.reApply || this.type == this.handleType.pass) {
+                // 閫氳繃
+              completeTask(formData).then(res => {
+                    this.submitLoading = false;
+                    if (res.success) {
+                        this.$message.success('鎿嶄綔鎴愬姛');
+                        this.modalTaskVisible = false;
+                        this.$emit('success');
+                    } else {
+                        this.$message.error('鎿嶄綔澶辫触');
+                    }
+                }).finally(()=>{this.submitLoading=false});
+            } else if (this.type == this.handleType.back) {
+                // 椹冲洖
+                  rejectTask(formData).then(res => {
+                        this.submitLoading = false;
+                        if (res.success) {
+                            this.$message.success('鎿嶄綔鎴愬姛');
+                            this.modalTaskVisible = false;
+                            this.$emit('success');
+                        } else {
+                            this.$message.error('鎿嶄綔澶辫触');
+                        }
+                    }).finally(()=>{this.submitLoading=false});
+
+            } else if (this.type == this.handleType.return){
+              if (!formData.targetKey){
+                this.$message.error('璇烽�夋嫨閫�鍥炶妭鐐癸紒');
+                this.submitLoading=false
+                return;
+              }
+              //閫�鍥�
+              returnTask(formData).then(res => {
+                this.submitLoading = false;
+                if (res.success) {
+                  this.$message.success('鎿嶄綔鎴愬姛');
+                  this.modalTaskVisible = false;
+                  this.$emit('success');
+                } else {
+                  this.$message.error('鎿嶄綔澶辫触');
+                }
+              }).finally(()=>{this.submitLoading=false});
+            }
+        },
+
+        targetKeyChange() {
+            this.candidateUsersSelecteds = []
+            this.$emit('targetKeyChange',this.form.targetKey)
+        }
+    }
+
+};
+</script>
diff --git a/src/views/flowable/components/ActHistoricDetailBtn.vue b/src/views/flowable/components/ActHistoricDetailBtn.vue
new file mode 100644
index 0000000..c4a69f5
--- /dev/null
+++ b/src/views/flowable/components/ActHistoricDetailBtn.vue
@@ -0,0 +1,53 @@
+<style lang="less">
+</style>
+<template>
+  <span>
+      <a-button :type="btnType"  @click="history()" >{{text}}</a-button>
+      <a-modal title="瀹℃壒鍘嗗彶" v-model="modalLsVisible" :mask-closable="true" :width="'80%'" :footer="null">
+          <div v-if="modalLsVisible">
+              <HistoricDetail ref="historicDetail" :data-id="dataId"></HistoricDetail>
+          </div>
+      </a-modal>
+  </span>
+</template>
+
+<script>
+import HistoricDetail from './HistoricDetail';
+export default {
+    name: 'ActHistoricDetailBtn',
+    components: { HistoricDetail },
+    props: {
+        btnType: { type: String, default: 'link', required: false },
+        /**/
+        dataId: {
+            type: String,
+            default: '',
+            required: true
+        },
+        text: {
+            type: String,
+            default: '瀹℃壒鍘嗗彶',
+            required: false
+        }
+    },
+    data() {
+        return {
+            modalLsVisible: false
+        };
+    },
+    created() {
+    },
+    watch: {
+    },
+    methods: {
+        history() {
+            if (!this.dataId) {
+                this.$message.error('娴佺▼瀹炰緥ID涓嶅瓨鍦�');
+                return;
+            }
+            this.modalLsVisible = true;
+        }
+    }
+
+};
+</script>
diff --git a/src/views/flowable/components/HistoricDetail.vue b/src/views/flowable/components/HistoricDetail.vue
new file mode 100644
index 0000000..be707cc
--- /dev/null
+++ b/src/views/flowable/components/HistoricDetail.vue
@@ -0,0 +1,343 @@
+<style lang="less">
+</style>
+<template>
+  <div class="search">
+    <a-card>
+      <p slot="title">
+        <span>娴佺▼鍥�</span>
+      </p>
+      <div :style="{height: svgHeight}" v-if="svgShow">
+        <bpmnModeler class="svg" ref="bpm" :xml="xmlData" :is-view="true"></bpmnModeler>
+      </div>
+    </a-card>
+    <a-card style="margin-top:10px;">
+      <p slot="title">
+        <span>娴佺▼瀹℃壒杩涘害鍘嗗彶</span>
+      </p>
+      <a-row style="position:relative">
+        <div class="block">
+          <a-timeline>
+            <a-timeline-item
+              v-for="(item,index ) in flowRecordList"
+              :key="index"
+              :color="setColor(item.finishTime)"
+            >
+              <p style="font-weight: 700;">{{item.taskName}}
+                <i v-if="!item.finishTime" style="color: orange">(寰呭姙涓�傘�傘��)</i>
+              </p>
+
+              <a-card :body-style="{ padding: '10px' }">
+                <label v-if="item.assigneeName&&item.finishTime" style="font-weight: normal;margin-right: 30px;">瀹為檯鍔炵悊浜猴細 {{item.assigneeName}} <a-tag type="info" size="mini">{{item.deptName}}</a-tag></label>
+                <label v-if="item.candidate" style="font-weight: normal;margin-right: 30px;">鍊欓�夊姙鐞嗕汉锛� {{item.candidate}}</label>
+                <label style="font-weight: normal">鎺ユ敹鏃堕棿锛� </label><label style="color:#8a909c;font-weight: normal">{{item.createTime}}</label>
+                <label v-if="item.finishTime" style="margin-left: 30px;font-weight: normal">鍔炵粨鏃堕棿锛� </label><label style="color:#8a909c;font-weight: normal">{{item.finishTime}}</label>
+                <label v-if="item.duration" style="margin-left: 30px;font-weight: normal">鑰楁椂锛� </label><label style="color:#8a909c;font-weight: normal">{{item.duration}}</label>
+
+                <p  v-if="item.comment">
+<!--  1 姝e父鎰忚  2 閫�鍥炴剰瑙� 3 椹冲洖鎰忚                -->
+                  <a-tag color="green" v-if="item.comment.type === '1'">
+                    <span v-if="item.comment.comment!='閲嶆柊鎻愪氦'">閫氳繃锛�</span>
+                    {{item.comment.comment}}
+                  </a-tag>
+                  <a-tag color="orange" v-if="item.comment.type === '2'">閫�鍥烇細  {{item.comment.comment}}</a-tag>
+                  <a-tag color="red" v-if="item.comment.type === '3'">椹冲洖锛�  {{item.comment.comment}}</a-tag>
+                </p>
+              </a-card>
+            </a-timeline-item>
+          </a-timeline>
+        </div>
+      </a-row>
+    </a-card>
+  </div>
+</template>
+
+<script>
+import {flowRecord} from "@views/flowable/api/finished";
+import {getFlowViewerByDataId, readXmlByDataId} from "@views/flowable/api/definition";
+import bpmnModeler from "workflow-bpmn-modeler";
+
+export default {
+    name: 'HistoricDetail',
+  components: {
+    bpmnModeler,
+  },
+    props: {
+    /**/
+        dataId: {
+            type: String,
+            default: '',
+            required: true
+        },
+
+    },
+    data() {
+        return {
+            taskList:[],
+            flowRecordList: [], // 娴佺▼娴佽浆鏁版嵁
+            formData:{},
+            xmlData:'',
+            type: 0,
+            loading: false, // 琛ㄥ崟鍔犺浇鐘舵��
+            loadingImg: false,
+            data: [],
+            id: '',
+            imgUrl: '',
+            backRoute: '',
+          svgHeight:'',
+          svgShow: true
+        };
+    },
+    created() {
+        this.init();
+    },
+    watch: {
+      dataId: function(newval, oldName) {
+            this.init();
+        }
+    },
+
+    methods: {
+        init() {
+          this.getFlowRecordList()
+          this.getModelDetail()
+        },
+      /** xml 鏂囦欢 */
+      getModelDetail() {
+        // 鍙戦�佽姹傦紝鑾峰彇xml
+        readXmlByDataId(this.dataId).then(res => {
+          this.xmlData = res.result
+          this.getFlowViewer()
+          setTimeout(()=>{
+            this.fitViewport()
+          })
+        })
+      },
+      // 娴佺▼杩涜鎯呭喌
+      getFlowViewer() {
+        getFlowViewerByDataId(this.dataId).then(res => {
+          this.taskList = res.result || []
+          this.fillColor();
+        })
+      },
+      /** 娴佺▼娴佽浆璁板綍 */
+      getFlowRecordList() {
+        const params = {dataId: this.dataId}
+        flowRecord(params).then(res => {
+          // console.log(res)
+          this.flowRecordList = res.result.flowList;
+          this.finishOrder()
+          // 娴佺▼杩囩▼涓笉瀛樺湪鍒濆鍖栬〃鍗� 鐩存帴璇诲彇鐨勬祦绋嬪彉閲忎腑瀛樺偍鐨勮〃鍗曞��
+          if (res.result.formData) {
+            this.formData = res.result.formData;
+          }
+        }).catch(res => {
+          console.log(res)
+        })
+      },
+        //鏁寸悊椤哄簭锛屾妸寰呭姙鏀炬渶涓婇潰锛屽苟涓斿彧鐣欎竴涓紙涓嶇劧浼氱鏃朵細涔憋級
+      finishOrder(){
+        const list = []
+        let noFinish = null
+        for (const flow of this.flowRecordList) {
+          if (flow.finishTime){
+            // 鍔炵粨鐨勮妭鐐瑰悓鏃跺彇鏈夊疄闄呭姙鐞嗕汉鐨勶紝鍥犱负浼氱浼氬皢鎵�鏈夌殑澶氬疄渚嬮兘杩斿洖锛岄渶瑕佽繃婊�
+            if (flow.assigneeId){
+              list.push(flow)
+            }
+          } else {
+            noFinish = flow
+          }
+        }
+        if (noFinish){
+          const find = list.find(obj=>obj.taskDefKey == noFinish.taskDefKey);
+          if (find){
+            noFinish.taskName = '銆愪細绛句腑銆�'+noFinish.taskName
+          }
+          this.flowRecordList = [noFinish,...list];
+        } else {
+          this.flowRecordList = list;
+        }
+
+      },
+        setColor(val) {
+          if (val) {
+            return "#2bc418";
+          } else {
+            return "#b3bdbb";
+          }
+        },
+      fillColor() {
+        const modeler = this.$refs.bpm.modeler;
+        const canvas = modeler.get('canvas')
+        modeler._definitions.rootElements[0].flowElements.forEach(n => {
+          const completeTask = this.taskList.find(m => m.key === n.id)
+          const todoTask = this.taskList.find(m => !m.completed)
+          const endTask = this.taskList[this.taskList.length - 1]
+          //鐢ㄦ埛浠诲姟
+          if (n.$type === 'bpmn:UserTask') {
+            if (completeTask) {
+              canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo')
+              canvas.addMarker(n.id, completeTask.back ? 'highlight-back' : 'highlight-noback')
+              n.outgoing.forEach(nn => {
+                const targetTask = this.taskList.find(m => m.key === nn.targetRef.id)
+                if (targetTask) {
+                  if (todoTask && completeTask.key === todoTask.key && !todoTask.completed){
+                    canvas.addMarker(nn.id, todoTask.completed ? 'highlight' : 'highlight-todo')
+                    canvas.addMarker(nn.targetRef.id, todoTask.completed ? 'highlight' : 'highlight-todo')
+                  }else {
+                    canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                    canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                  }
+                }
+              })
+            }
+          }
+          // 鎺掍粬缃戝叧
+          else if (n.$type === 'bpmn:ExclusiveGateway') {
+            if (completeTask) {
+              canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo')
+              n.outgoing.forEach(nn => {
+                const targetTask = this.taskList.find(m => m.key === nn.targetRef.id)
+                if (targetTask) {
+
+                  canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                  canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                }
+
+              })
+            }
+
+          }
+          // 骞惰缃戝叧
+          else if (n.$type === 'bpmn:ParallelGateway') {
+            if (completeTask) {
+              canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo')
+              n.outgoing.forEach(nn => {
+                debugger
+                const targetTask = this.taskList.find(m => m.key === nn.targetRef.id)
+                if (targetTask) {
+                  canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                  canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                }
+              })
+            }
+          }
+          else if (n.$type === 'bpmn:StartEvent') {
+            n.outgoing.forEach(nn => {
+              const completeTask = this.taskList.find(m => m.key === nn.targetRef.id)
+              if (completeTask) {
+                canvas.addMarker(nn.id, 'highlight')
+                canvas.addMarker(n.id, 'highlight')
+                return
+              }
+            })
+          }
+          else if (n.$type === 'bpmn:EndEvent') {
+            if (endTask.key === n.id && endTask.completed) {
+              canvas.addMarker(n.id, 'highlight')
+              return
+            }
+          }
+        })
+      },
+      // 璁╁浘鑳借嚜閫傚簲灞忓箷
+      fitViewport() {
+        const modeler = this.$refs.bpm.modeler;
+        const canvas = modeler.get('canvas')
+        // this.zoom = this.modeler.get('canvas').zoom('fit-viewport')
+        if (this.svgHeight){
+          document.querySelector('.canvas').style.height = this.svgHeight;
+        }
+        const bbox = document.querySelector('.flow-containers .viewport').getBBox()
+        const currentViewbox = modeler.get('canvas').viewbox()
+        if (!this.svgHeight){
+          this.svgHeight = currentViewbox.inner.height + 'px'
+          this.svgShow = false
+          this.$nextTick(()=>{
+            this.svgShow = true
+          })
+          // this.fitViewport()
+          setTimeout(()=>{
+            this.fitViewport()
+          })
+        }
+
+        const elementMid = {
+          x: bbox.x + bbox.width / 2 - 65,
+          y: bbox.y + bbox.height / 2
+        }
+        // 璋冭妭浣嶇疆
+        modeler.get('canvas').viewbox({
+          x: elementMid.x - currentViewbox.width / 2 + 70,
+          y: elementMid.y - currentViewbox.height/2,
+          width: currentViewbox.width,
+          height: currentViewbox.height
+        })
+        // 璋冭妭澶у皬缂╂斁
+        const zoom = currentViewbox.outer.width /(currentViewbox.inner.width+200)
+        console.log('********',zoom,elementMid,currentViewbox.inner,currentViewbox.outer)
+        // modeler.get('canvas').zoom(zoom)
+
+
+      },
+    }
+
+};
+</script>
+<style lang="less">
+   .highlight.djs-shape .djs-visual > :nth-child(1) {
+     fill: green !important;
+     stroke: green !important;
+     fill-opacity: 0.2 !important;
+   }
+   .highlight.djs-shape .djs-visual > :nth-child(2) {
+     fill: green !important;
+   }
+   .highlight.djs-shape .djs-visual > path {
+     fill: green !important;
+     fill-opacity: 0.2 !important;
+     stroke: green !important;
+   }
+   .highlight.djs-connection > .djs-visual > path {
+     stroke: green !important;
+   }
+   // .djs-connection > .djs-visual > path {
+   //   stroke: orange !important;
+   //   stroke-dasharray: 4px !important;
+   //   fill-opacity: 0.2 !important;
+   // }
+   // .djs-shape .djs-visual > :nth-child(1) {
+   //   fill: orange !important;
+   //   stroke: orange !important;
+   //   stroke-dasharray: 4px !important;
+   //   fill-opacity: 0.2 !important;
+   // }
+   .highlight-todo.djs-connection > .djs-visual > path {
+     stroke: orange !important;
+     stroke-dasharray: 4px !important;
+     fill-opacity: 0.2 !important;
+   }
+   .highlight-todo.djs-shape .djs-visual > :nth-child(1) {
+     fill: orange !important;
+     stroke: orange !important;
+     stroke-dasharray: 4px !important;
+     fill-opacity: 0.2 !important;
+   }
+   .highlight-back.djs-connection > .djs-visual > path {
+     stroke: red !important;
+     stroke-dasharray: 4px !important;
+     fill-opacity: 0.2 !important;
+   }
+   .highlight-back.djs-shape .djs-visual > :nth-child(1) {
+     fill: red !important;
+     stroke: red !important;
+     stroke-dasharray: 4px !important;
+     fill-opacity: 0.2 !important;
+   }
+   .overlays-div {
+     font-size: 10px;
+     color: red;
+     width: 100px;
+     top: -20px !important;
+   }
+</style>
\ No newline at end of file
diff --git a/src/views/flowable/mixin/FlowableMixin.js b/src/views/flowable/mixin/FlowableMixin.js
new file mode 100644
index 0000000..50a76a4
--- /dev/null
+++ b/src/views/flowable/mixin/FlowableMixin.js
@@ -0,0 +1,68 @@
+import Vue from "vue";
+import {USER_INFO} from "@/store/mutation-types";
+
+/**
+ *
+ */
+
+export const FlowableMixin = {
+  data(){
+    return {
+      loginUser:{}
+    }
+  },
+  created() {
+    this.loginUser = Vue.ls.get(USER_INFO);
+  },
+  methods:{
+    // 褰撳墠鏁版嵁鏄惁鍙彁浜�
+    isCanApply(row){
+      // 娌℃湁娴佺▼瀹炰緥鐨勫嵆鍙彁浜�
+      return !Boolean(row.processInstanceId);
+    },
+    // 褰撳墠鏁版嵁鏄惁鍙挙鍥�
+    isCanRecall(row){
+      // 杩涜涓殑娴佺▼&&褰撳墠鑺傜偣涓嶆槸寮�濮嬭妭鐐�&&鐘舵�佷笉鏄�氳繃
+      return Boolean(row.processInstanceId)&&row.taskNameId!=='start'&&row.actStatus!=='瀹℃壒閫氳繃';
+    },
+    // 閲嶆柊鎻愪氦鎸夐挳
+    isCanReApply(row){
+      return row.taskNameId=='start'&&this.isTodoUsers(row);
+    },
+    // 閫氳繃鎸夐挳
+    isCanPass(row){
+      return row.taskNameId!=='start'&& this.isTodoUsers(row);
+    },
+    // 椹冲洖閫�鍥炴寜閽�
+    isCanBacke(row){
+      // 涓嶆槸start鑺傜偣&&鍦ㄥ彲鎿嶄綔浜哄憳鍒楄〃
+      return row.taskNameId!=='start'&&this.isTodoUsers(row);
+    },
+    // 鏌ョ湅瀹℃壒鍘嗗彶鎸夐挳
+    isCanHistoric(row){
+      // 鏈夊疄渚媔d灏辫兘鏌ョ湅
+      return Boolean(row.processInstanceId);
+    },
+    // 褰撳墠鐧诲綍浜烘槸鍚﹀湪澶勭悊浜哄垪琛�
+    isTodoUsers(row){
+      const todoUsers = row.todoUsers;
+      if (todoUsers&&todoUsers.length){
+        const parse = JSON.parse(todoUsers)||[];
+        return parse.includes(this.loginUser.username);
+      }else {
+        return false;
+      }
+    },
+    // 褰撳墠鐧诲綍浜烘槸鍚︽槸澶勭悊杩囩殑浜哄垪琛�
+    isDoneUsers(row){
+      const doneUsers = row.doneUsers;
+      if (doneUsers&&doneUsers.length){
+        const parse = JSON.parse(doneUsers)||[];
+        return parse.includes(this.loginUser.username);
+      }else {
+        return false;
+      }
+    },
+  }
+
+}
\ No newline at end of file
diff --git a/src/views/flowable/modeler/modelerDesign.vue b/src/views/flowable/modeler/modelerDesign.vue
new file mode 100644
index 0000000..673088f
--- /dev/null
+++ b/src/views/flowable/modeler/modelerDesign.vue
@@ -0,0 +1,400 @@
+<template>
+  <div>
+<!--  ==================娴佺▼瀹氫箟鍒楄〃===============  -->
+    <a-card v-if="!xmlFrame.open||xmlView">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="娴佺▼鍚嶇О" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="璇疯緭鍏ュ悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="娴佺▼鍒嗙被" prop="category">
+        <el-select @change="handleQuery" v-model="queryParams.category" placeholder="璇烽�夋嫨娴佺▼鍒嗙被" clearable prop="category">
+          <el-option label="璇烽�夋嫨" value="" />
+          <el-option v-for="category in categorys" :key="category.id" :label="category.name" :value="category.id" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="婵�娲�" prop="active">
+        <el-switch
+          v-model="queryParams.active"
+          active-color="#13ce66"
+          inactive-color="#ff4949"
+          @change="handleQuery"
+        >
+        </el-switch>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+      <el-form-item style="float:right">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleLoadXml"
+        >鏂板娴佺▼瀹氫箟</el-button>
+      </el-form-item>
+    </el-form>
+
+      <el-table
+        v-loading="loading" fit
+        :data="definitionList"
+        row-key="id"
+        border
+        lazy
+        :load="load"
+        :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
+      <el-table-column label="娴佺▼瀹氫箟id" align="center" prop="id" />
+      <el-table-column label="娴佺▼鏍囪瘑Key" align="center" prop="key"  />
+      <el-table-column label="娴佺▼鍒嗙被" align="center" >
+        <template slot-scope="scope">
+            <span>{{ getCategoryName(scope.row.category) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="娴佺▼鍚嶇О" align="center" :show-overflow-tooltip="true">
+        <template slot-scope="scope">
+          <el-button type="text" @click="handleReadImage(scope.row.deploymentId)">
+            <span>{{ scope.row.name }}</span>
+          </el-button>
+        </template>
+      </el-table-column>
+      <el-table-column label="娴佺▼鐗堟湰" align="center">
+        <template slot-scope="scope">
+          <el-tag size="medium" >v{{ scope.row.version }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="鐘舵��" align="center">
+        <template slot-scope="scope">
+          <el-tag type="success" v-if="scope.row.suspensionState === 1">婵�娲�</el-tag>
+          <el-tag type="warning" v-if="scope.row.suspensionState === 2">鎸傝捣</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="閮ㄧ讲鏃堕棿" align="center" prop="deploymentTime" width="180"/>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-dropdown>
+            <span class="el-dropdown-link">
+              鏇村鎿嶄綔<i class="el-icon-arrow-down el-icon--right"></i>
+            </span>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item icon="el-icon-edit-outline" @click.native="handleLoadXml(scope.row)">
+                缂栬緫
+              </el-dropdown-item>
+<!--              <el-dropdown-item icon="el-icon-connection" @click.native="handleAddForm(scope.row)" v-if="scope.row.formId == null">
+                閰嶇疆琛ㄥ崟
+              </el-dropdown-item>-->
+              <el-dropdown-item icon="el-icon-video-pause" @click.native="handleUpdateSuspensionState(scope.row)" v-if="scope.row.suspensionState === 1">
+                鎸傝捣
+              </el-dropdown-item>
+              <el-dropdown-item icon="el-icon-video-play" @click.native="handleUpdateSuspensionState(scope.row)" v-if="scope.row.suspensionState === 2">
+                婵�娲�
+              </el-dropdown-item>
+              <el-dropdown-item icon="el-icon-delete" @click.native="handleDelete(scope.row)" >
+                鍒犻櫎
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      v-show="total>0"
+      :total="total"
+      :current-page.sync="queryParams.pageNum"
+      :page-size.sync="queryParams.pageSize"
+      @size-change="getList"
+      @current-change="getList"
+    />
+    </a-card>
+      <!-- 娴佺▼鍥� -->
+    <a-card v-if="xmlFrame.open&&!xmlView" :title="xmlFrame.title">
+      <a slot="extra" href="#" @click="()=>{xmlFrame.open=false}">杩斿洖</a>
+      <bpmn-modeler
+        v-if="xmlShow"
+        ref="refNode"
+        :xml="xmlData"
+        :users="users"
+        :groups="groups"
+        :categorys="categorys"
+        :is-view="xmlView"
+        @save="save"
+      />
+    </a-card>
+<!--  寮圭獥棰勮  -->
+      <a-modal :title="xmlFrame.title" :visible.sync="xmlView&&xmlFrame.open" :width="xmlFrame.width"
+        :footer="null" closable @cancel="()=>{xmlView=false,xmlFrame.open=false}"
+      >
+        <bpmn-modeler
+          v-if="xmlShow"
+          ref="refNode"
+          :xml="xmlData"
+          :users="users"
+          :groups="groups"
+          :categorys="categorys"
+          :is-view="xmlView"
+          @save="save"
+        />
+      </a-modal>
+
+  </div>
+</template>
+
+<script>
+import bpmnModeler from "workflow-bpmn-modeler";
+import {
+  categoryList,
+  delDeployment,
+  listDefinition,
+  readXml,
+  roleList,
+  saveXml,
+  updateState,
+  userList
+} from "@views/flowable/api/definition";
+
+export default {
+  components: {
+    bpmnModeler,
+  },
+  data() {
+    return {
+      /*===================璁捐鍣ㄥ睘鎬�======================*/
+      users: [],
+      groups: [],
+      categorys: [],
+      /*=================椤甸潰灞炴��===================*/
+      loading: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 娴佺▼瀹氫箟琛ㄦ牸鏁版嵁
+      definitionList: [],
+      allDefinitionList: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        category: null,
+        key: null,
+        tenantId: null,
+        deployTime: null,
+        derivedFrom: null,
+        derivedFromRoot: null,
+        parentDeploymentId: null,
+        engineVersion: null
+      },
+      xmlFrame:{
+        width:'70%',
+        title:'娴佺▼鍥�',
+        open: false,
+        src: "",
+      },
+      // xml
+      xmlData:"",
+      xmlShow: true,
+      xmlView: false,
+
+    };
+  },
+  created() {
+    this.initUserAndRole();
+    this.getList();
+  },
+  methods: {
+    /*===============璁捐鍣�===============*/
+    initUserAndRole(){
+      userList({}).then(res=>{
+        this.users = res.result||[]
+        this.users.map(o=>{
+          o.id = o.username
+          o.name = o.realname
+        })
+      })
+      roleList({}).then(res=>{
+        this.groups = res.result||[]
+        this.groups.map(o=>{
+          o.name = o.roleName
+        })
+      })
+      categoryList({}).then(res=>{
+        this.categorys = res.result||[]
+      })
+    },
+    getModelDetail(deployId) {
+      // 鍙戦�佽姹傦紝鑾峰彇xml
+      readXml(deployId).then(res =>{
+        this.xmlData = res.result;
+      })
+    },
+    getCategoryName(category){
+      let find = this.categorys.find(o=>o.id==category);
+      if (find){
+        return find.name
+      }
+      return ''
+    },
+    /*淇濆瓨娴佺▼瀹氫箟*/
+    save(data) {
+      console.log(data);  // { process: {...}, xml: '...', svg: '...' }
+      const params = {
+        name: data.process.name,
+        category: data.process.category,
+        xml: data.xml
+      }
+      saveXml(params).then(res => {
+        this.$message.success(res.message)
+        // 鍏抽棴褰撳墠鏍囩椤靛苟杩斿洖涓婁釜椤甸潰
+        this.getList()
+        this.xmlFrame.open = false
+      })
+    },
+    /*================椤甸潰===============*/
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.queryParams.suspensionState = this.queryParams.active?1:0;
+      this.getList();
+    },
+    /** 鏌ヨ娴佺▼瀹氫箟鍒楄〃 */
+    getList() {
+      this.loading = true;
+      // 鏈�鏂扮増鏈�
+      const param1 = Object.assign({
+        isLastVersion:1,
+      },this.queryParams)
+      listDefinition(param1).then(response => {
+        this.definitionList = response.result.records;
+        this.total = response.result.total;
+        this.loading = false;
+        for (const definition of this.definitionList) {
+          definition.hasChildren = true
+        }
+      });
+      // // 鎵�鏈�
+      // const param2 = Object.assign({
+      //   isLastVersion:0
+      // },this.queryParams,{
+      //   pageSize: 9999,
+      //   pageNum:1
+      // })
+      // listDefinition(param2).then(response => {
+      //   console.log(response)
+      //   this.allDefinitionList = response.result.records;
+      // });
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    resetForm(formName) {
+      this.$refs[formName].resetFields()
+    },
+    /** 鎵撳紑娴佺▼璁捐寮圭獥椤甸潰 */
+    handleLoadXml(row){
+      if (row&&row.deploymentId){
+        console.log(row.deploymentId)
+        this.handleReadImage(row.deploymentId)
+        this.xmlView = false
+        this.xmlFrame.title = "缂栬緫娴佺▼鍥�";
+      } else {
+        //鏂板
+        this.xmlData = ''
+        this.xmlView = false
+        this.xmlFrame.open = true
+        this.xmlFrame.title = '鏂板娴佺▼'
+        this.xmlShow = false
+        this.$nextTick(()=>{
+          this.xmlShow = true
+        })
+      }
+      this.xmlFrame.width = '90%'
+    },
+    /** 娴佺▼鍥炬煡鐪� */
+    handleReadImage(deploymentId){
+      this.xmlFrame.title = "娴佺▼鍥�";
+      this.xmlFrame.open = true;
+      this.xmlFrame.width = '70%';
+      // this.xmlFrame.src = process.env.VUE_APP_BASE_API + "/flowable/definition/xmlFrame/" + deploymentId;
+      // 鍙戦�佽姹傦紝鑾峰彇xml
+      this.xmlView = true
+      readXml(deploymentId).then(res =>{
+        if (res.success){
+          this.xmlData = res.result
+          /*this.xmlShow = false
+          this.$nextTick(()=>{
+            this.xmlShow = true
+          })*/
+        } else {
+          this.$message.error("鑾峰彇娴佺▼鍥惧け璐ワ紒")
+        }
+      })
+    },
+    // 鎵撳紑涓氬姟琛ㄥ崟
+    handleForm() {
+    },
+    // 閰嶇疆涓氬姟琛ㄥ崟
+    handleAddForm(row) {
+    },
+    /** 鎸傝捣/婵�娲绘祦绋� */
+    handleUpdateSuspensionState(row){
+      let state = 1;
+      if (row.suspensionState === 1) {
+        state = 2
+      }
+      const params = {
+        deployId: row.deploymentId,
+        state: state
+      }
+      updateState(params).then(res => {
+        this.$message.success(res.message);
+        this.getList();
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      // const ids = row.deploymentId || this.ids;
+      const params = {
+        deployId: row.deploymentId
+      }
+      this.$confirm({
+        title:"璀﹀憡",
+        content:'鏄惁纭鍒犻櫎娴佺▼瀹氫箟缂栧彿涓�"' + params.deployId + '"鐨勬暟鎹」?',
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+        onOk:()=>{
+          delDeployment(params).then(res=>{
+            this.getList();
+            if (res.success){
+              this.$message.success('鍒犻櫎鎴愬姛');
+            } else {
+              this.$message.success('鍒犻櫎澶辫触');
+            }
+          })
+        }
+      })
+    },
+    load(tree, treeNode, resolve) {
+      const key = tree.key;
+      const childrens = []
+      for (const one of this.allDefinitionList) {
+        if (one.key==key&&one.id!=tree.id){
+          childrens.push(one)
+        }
+      }
+      console.log(tree, treeNode,this.allDefinitionList,childrens)
+      resolve(childrens)
+    }
+  },
+  computed: {
+    getContainer() {
+      return document.querySelector('#app')
+    }
+  }
+};
+</script>
\ No newline at end of file
diff --git a/src/views/flowable/workflow/FlowCompleted.vue b/src/views/flowable/workflow/FlowCompleted.vue
new file mode 100644
index 0000000..3728186
--- /dev/null
+++ b/src/views/flowable/workflow/FlowCompleted.vue
@@ -0,0 +1,182 @@
+<!--
+ Description: 宸ヤ綔娴�-鎴戠殑宸插姙 List
+ Author: 浣滆�� liuyh
+ Date:   2025-02-27
+-->
+<template>
+  <a-card :bordered="false">
+    <!-- 鏌ヨ鍖哄煙 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="娴佺▼鍒嗙被">
+              <j-dict-select-tag placeholder="璇烽�夋嫨娴佺▼鍒嗙被" v-model="queryParam.category"
+                                 dictCode="flow_type"></j-dict-select-tag>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="10" :lg="11" :md="12" :sm="24">
+            <a-form-item label="鎿嶄綔鏃堕棿">
+              <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
+                      class="query-group-cust"
+                      v-model="queryParam.startTime"></j-date>
+              <span class="query-group-split-cust"></span>
+              <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="璇烽�夋嫨缁撴潫鏃堕棿"
+                      class="query-group-cust"
+                      v-model="queryParam.endTime"></j-date>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <a-button @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- table鍖哄煙-begin -->
+    <div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+            <a @click="handelDetial(record,text)">璇︽儏</a>
+        </span>
+
+      </a-table>
+    </div>
+  </a-card>
+</template>
+
+<script>
+
+import '@/assets/less/TableExpand.less'
+import { mixinDevice } from '@/utils/mixin'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import JDictSelectTag from '@/components/dict/JDictSelectTag.vue'
+
+export default {
+  name: 'NcDeviceCharactersList',
+  mixins: [JeecgListMixin, mixinDevice],
+  components: {
+    JDictSelectTag
+  },
+  data() {
+    return {
+      description: '宸ヤ綔娴�-宸插姙',
+      // 琛ㄥご
+      columns: [
+        {
+          title: '搴忓彿',
+          dataIndex: '',
+          key: 'rowIndex',
+          width: 200,
+          align: 'center',
+          customRender: function(t, r, index) {
+            return parseInt(index) + 1
+          }
+        },
+        {
+          title: '娴佺▼鍒嗙被',
+          align: 'center',
+          dataIndex: 'category_dictText',
+          width: 200
+        },
+        {
+          title: '娴佺▼鍚嶇О',
+          align: 'center',
+          dataIndex: 'procDefName',
+          width: 200
+        },
+        {
+          title: '娴佺▼涓氬姟绠�瑕佹弿杩�',
+          align: 'center',
+          dataIndex: 'description',
+          width: 300
+        },
+        {
+          title: '娴佺▼鍙戣捣浜哄悕绉�',
+          align: 'center',
+          dataIndex: 'startUserName',
+          width: 250
+        },
+        {
+          title: '浠诲姟鍚嶇О',
+          align: 'center',
+          dataIndex: 'taskName',
+          width: 250
+        },
+        {
+          title: '鎿嶄綔鏃堕棿',
+          align: 'center',
+          dataIndex: 'finishTime',
+          width: 300
+        },
+        {
+          title: '鎿嶄綔',
+          dataIndex: 'action',
+          scopedSlots: { customRender: 'action' },
+          align: 'center',
+          width: 200,
+          fixed: 'right'
+        }
+      ],
+      url: {
+        list: '/assign/flow/finishedList'
+      },
+      dictOptions: {},
+      selectShenpiData: {},
+      selectDispatchFileXqData: {},
+      selectWeekMaintenanceData: {},
+      selectInspectionOrderXqData: {},
+      selectRepairOrderData: {},
+      selectOutBoundOrderData: {},
+      selectLossBoundOrderData: {},
+      selectStocktakingBoundOrderData: {}
+    }
+  },
+  created() {
+  },
+  computed: {
+    importExcelUrl: function() {
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
+    }
+  },
+  methods: {
+    handelDetial(item, index) {
+      console.log('鐐瑰嚮浜嗚鎯�')
+      console.log('item----->', item)
+      console.log('index----->', index)
+      let approcesstype = this.splitAprocessType(item.category)
+      console.log('approcesstype--->', approcesstype)
+      switch (approcesstype) {
+        default:
+          alert('娌℃壘鍒拌娴佺▼')
+      }
+    },
+
+    splitAprocessType(title) {
+      let parts = title.split('锛�') // 娉ㄦ剰鍐掑彿鏄叏瑙掑瓧绗︼紝浣跨敤瀵瑰簲鐨勫瓧杩涜鍒嗗壊
+      let result = parts[0]
+      return result
+    },
+  }
+}
+</script>
+<style scoped>
+@import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/flowable/workflow/FlowLedger.vue b/src/views/flowable/workflow/FlowLedger.vue
new file mode 100644
index 0000000..d9d5137
--- /dev/null
+++ b/src/views/flowable/workflow/FlowLedger.vue
@@ -0,0 +1,209 @@
+<!--
+ Description: 宸ヤ綔娴�-鎬诲彴璐� List
+ Author: 浣滆�� liuyh
+ Date:   2025-02-27
+-->
+<template>
+  <a-card :bordered="false">
+    <!-- 鏌ヨ鍖哄煙 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="娴佺▼鍒嗙被">
+              <j-dict-select-tag placeholder="璇烽�夋嫨娴佺▼鍒嗙被" v-model="queryParam.category"
+                                 dictCode="flow_type"></j-dict-select-tag>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="娴佺▼鍚嶇О">
+              <a-input placeholder="璇疯緭鍏ユ祦绋嬪悕绉�" v-model="queryParam.flowName"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="绠�瑕佹弿杩�">
+              <a-input placeholder="璇疯緭鍏ョ畝瑕佹弿杩�" v-model="queryParam.title"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="10" :lg="11" :md="12" :sm="24">
+            <a-form-item label="鎿嶄綔鏃堕棿">
+              <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="璇烽�夋嫨寮�濮嬫椂闂�" class="query-group-cust"
+                      v-model="queryParam.startTime"></j-date>
+              <span class="query-group-split-cust"></span>
+              <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="璇烽�夋嫨缁撴潫鏃堕棿" class="query-group-cust"
+                      v-model="queryParam.endTime"></j-date>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <a-button @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+
+    <!-- table鍖哄煙-begin -->
+    <div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+            <a @click="handelDetail(record,text)">璇︽儏</a>
+        </span>
+      </a-table>
+    </div>
+
+  </a-card>
+</template>
+
+<script>
+
+import '@/assets/less/TableExpand.less'
+import { mixinDevice } from '@/utils/mixin'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import JDictSelectTag from '@/components/dict/JDictSelectTag.vue'
+
+  export default {
+    name: 'FlowLedger',
+    mixins: [JeecgListMixin, mixinDevice],
+    components: {
+      JDictSelectTag
+    },
+    data() {
+      return {
+        description: '娴佺▼绠$悊',
+        // 琛ㄥご
+        columns: [
+          {
+            title: '搴忓彿',
+            dataIndex: '',
+            key: 'rowIndex',
+            align: 'center',
+            customRender: function(t, r, index) {
+              return parseInt(index) + 1
+            }
+          },
+          {
+            title: '娴佺▼鍒嗙被',
+            align: 'center',
+            dataIndex: 'category_dictText',
+            width: 200
+          },
+          {
+            title: '娴佺▼鍚嶇О',
+            align: 'center',
+            dataIndex: 'flowName'
+          },
+          {
+            title: '娴佺▼涓氬姟绠�瑕佹弿杩�',
+            align: 'center',
+            dataIndex: 'description',
+          },
+          {
+            title: '鐢宠浜�',
+            align: 'center',
+            dataIndex: 'proposer_dictText'
+          },
+          {
+            title: '鍓嶉┍鑺傜偣',
+            align: 'center',
+            dataIndex: 'preNode'
+          },
+          {
+            title: '褰撳墠鑺傜偣',
+            align: 'center',
+            dataIndex: 'taskName'
+          },
+          {
+            title: '娴佺▼寮�濮嬫椂闂�',
+            align: 'center',
+            dataIndex: 'startTime'
+          },
+          {
+            title: '娴佺▼缁撴潫鏃堕棿',
+            align: 'center',
+            dataIndex: 'endTime'
+          },
+          {
+            title: '澶勭悊鏃堕暱',
+            align: 'center',
+            dataIndex: 'duration'
+          },
+          {
+            title: '褰撳墠浠诲姟浜�',
+            align: 'center',
+            dataIndex: 'todoUsers_dictText'
+          },
+          {
+            title: '澶勭悊杩囩殑浜�',
+            align: 'center',
+            dataIndex: 'doneUsers_dictText'
+          },
+          {
+            title: '鎿嶄綔',
+            dataIndex: 'action',
+            scopedSlots: { customRender: 'action' },
+            align: 'center',
+            width: 200,
+            fixed: 'right'
+          }
+        ],
+        url: {
+          list: '/assign/flow/list'
+        },
+        dictOptions: {},
+        selectShenpiData: {},
+        selectDispatchFileXqData: {},
+        selectInspectionOrderXqData: {}
+      }
+    },
+    created() {
+    },
+    computed: {
+      importExcelUrl: function() {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
+      }
+    },
+    methods: {
+      handelDetail(item, index) {
+        console.log('鐐瑰嚮浜嗚鎯�')
+        console.log('item----->', item)
+        console.log('index----->', index)
+        let approcesstype = this.splitAprocessType(item.category)
+        console.log('approcesstype--->', approcesstype)
+        switch (approcesstype) {
+          case 'drApproval':
+            item.description=item.description
+            this.handDrDetial(item)
+            break
+          default:
+            alert('娌℃壘鍒拌娴佺▼')
+        }
+      },
+      splitAprocessType(title) {
+        let parts = title.split('锛�') // 娉ㄦ剰鍐掑彿鏄叏瑙掑瓧绗︼紝浣跨敤瀵瑰簲鐨勫瓧杩涜鍒嗗壊
+        let result = parts[0]
+        return result
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/flowable/workflow/FlowTodo.vue b/src/views/flowable/workflow/FlowTodo.vue
new file mode 100644
index 0000000..940b1b5
--- /dev/null
+++ b/src/views/flowable/workflow/FlowTodo.vue
@@ -0,0 +1,424 @@
+<!--
+ Description: 宸ヤ綔娴�-鎴戠殑寰呭姙 List
+ Author: 浣滆�� liuyh
+ Date:   2025-02-27
+-->
+<template>
+  <a-card :bordered='false'>
+    <!-- 鏌ヨ鍖哄煙 -->
+    <div class='table-page-search-wrapper'>
+      <a-form
+        layout='inline'
+        @keyup.enter.native='searchQuery'
+      >
+        <a-row :gutter='24'>
+          <a-col
+            :lg='6'
+            :md='8'
+            :sm='24'
+            :xl='4'
+          >
+            <a-form-item label='娴佺▼鍒嗙被'>
+              <j-dict-select-tag
+                v-model='queryParam.category'
+                dictCode='flow_type'
+                placeholder='璇烽�夋嫨娴佺▼鍒嗙被'
+              ></j-dict-select-tag>
+            </a-form-item>
+          </a-col>
+          <!--<a-col :xl="4" :lg="6" :md="8" :sm="24">-->
+          <!--<a-form-item label="娴佺▼鍚嶇О">-->
+          <!--<a-input placeholder="璇疯緭鍏ユ祦绋嬪悕绉�" v-model="queryParam.flowName"></a-input>-->
+          <!--</a-form-item>-->
+          <!--</a-col>-->
+          <a-col
+            :lg='6'
+            :md='8'
+            :sm='24'
+            :xl='4'
+          >
+            <a-form-item label='褰撳墠鑺傜偣'>
+              <a-input
+                v-model='queryParam.name'
+                placeholder='璇疯緭鍏ュ綋鍓嶈妭鐐圭簿纭煡璇�'
+              ></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col
+            :lg='6'
+            :md='8'
+            :sm='24'
+            :xl='4'
+          >
+            <a-form-item label='绠�瑕佹弿杩�'>
+              <a-input
+                v-model='queryParam.title'
+                placeholder='璇疯緭鍏ョ畝瑕佹弿杩�'
+              ></a-input>
+            </a-form-item>
+          </a-col>
+          <template v-if='toggleSearchStatus'>
+            <a-col
+              :lg='8'
+              :md='12'
+              :sm='24'
+              :xl='8'
+            >
+              <a-form-item label='浠诲姟鏃堕棿鑼冨洿'>
+                <j-date
+                  v-model='queryParam.startTime'
+                  :show-time='false'
+                  class='query-group-cust'
+                  date-format='YYYY-MM-DD HH:mm:ss'
+                  placeholder='璇烽�夋嫨寮�濮嬫椂闂�'
+                ></j-date>
+                <span class='query-group-split-cust'></span>
+                <j-date
+                  v-model='queryParam.endTime'
+                  :show-time='false'
+                  class='query-group-cust'
+                  date-format='YYYY-MM-DD HH:mm:ss'
+                  placeholder='璇烽�夋嫨缁撴潫鏃堕棿'
+                ></j-date>
+              </a-form-item>
+            </a-col>
+          </template>
+
+          <a-col
+            :lg='6'
+            :md='8'
+            :sm='24'
+            :xl='4'
+          >
+            <span
+              class='table-page-search-submitButtons'
+              style='float: left;overflow: hidden;'
+            >
+              <a-button
+                icon='search'
+                type='primary'
+                @click='searchQuery'
+              >鏌ヨ</a-button>
+              <a-button
+                icon='reload'
+                style='margin-left: 8px'
+                @click='searchReset'
+              >閲嶇疆</a-button>
+              <a
+                style='margin-left: 8px'
+                @click='handleToggleSearch'
+              >
+                {{ toggleSearchStatus ? '鏀惰捣' : '灞曞紑' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'" />
+              </a>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class='table-operator'>
+      <a-dropdown v-if='selectedRowKeys.length > 0 '>
+        <a-menu slot='overlay'>
+          <a-menu-item
+            key='1'
+            @click='batchHandle'
+          >
+            <a-icon type='delete' />
+            鎵归噺澶勭悊
+          </a-menu-item>
+        </a-menu>
+        <a-button style='margin-left: 8px'> 鎵归噺鎿嶄綔
+          <a-icon type='down' />
+        </a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table鍖哄煙-begin -->
+    <div>
+      <div
+        class='ant-alert ant-alert-info'
+        style='margin-bottom: 16px;'
+      >
+        <i class='anticon anticon-info-circle ant-alert-icon'></i>宸查�夋嫨&nbsp;<a style='font-weight: 600'>{{
+          selectedRowKeys.length }}</a>椤�&nbsp;&nbsp;
+        <a
+          style='margin-left: 24px'
+          @click='onClearSelected'
+        >娓呯┖</a>
+      </div>
+
+      <a-table
+        ref='table'
+        :columns='columns'
+        :dataSource='dataSource'
+        :loading='loading'
+        :pagination='ipagination'
+        :rowSelection='{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}'
+        :scroll='{x:getTableColumnsTotalWidth,y:465}'
+        bordered
+        rowKey='id'
+        size='middle'
+        @change='handleTableChange'
+      >
+
+        <span
+          slot='action'
+          slot-scope='text, record'
+        >
+          <a @click='handelDetail(record,text)'>鎵ц/瀹℃壒</a>
+        </span>
+
+      </a-table>
+    </div>
+    <AssignFileStreamHandle
+      ref='modalFormApproval'
+      :selectShenpiData='selectShenpiData'
+      @searchReset='searchReset'
+    ></AssignFileStreamHandle>
+    <DispatchFileHandle
+      ref='modalFormDispatchFileXq'
+      :selectShenpiData='selectDispatchFileXqData'
+      @searchReset='searchReset'
+    ></DispatchFileHandle>
+    <DispatchFileBachHandleStyle
+      ref='modalFormDispatchFileBatch'
+      @ok='modalFormOk'
+      @searchReset='searchReset'
+    ></DispatchFileBachHandleStyle>
+ 
+  </a-card>
+</template>
+
+<script>
+
+import '@/assets/less/TableExpand.less'
+import { mixinDevice } from '@/utils/mixin'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import JDictSelectTag from '@/components/dict/JDictSelectTag.vue'
+
+import { getAction } from '@api/manage'
+import AssignFileStreamHandle from '@views/flowable/workflow/assignFileStream/AssignFileStreamHandle.vue'
+import DispatchFileHandle from '@views/flowable/workflow/dispatchFile/DispatchFileHandle.vue'
+import DispatchFileBachHandleStyle from '@views/flowable/workflow/dispatchFile/DispatchFileBachHandleStyle#Drawer.vue'
+
+
+export default {
+  name: 'NcDeviceCharactersList',
+  mixins: [JeecgListMixin, mixinDevice],
+  components: {
+    AssignFileStreamHandle,
+    DispatchFileHandle,
+    DispatchFileBachHandleStyle,
+    JDictSelectTag
+  },
+  data() {
+    return {
+      description: '宸ヤ綔娴�-鎴戠殑寰呭姙',
+      // 琛ㄥご
+      columns: [
+        {
+          title: '搴忓彿',
+          dataIndex: '',
+          key: 'rowIndex',
+          width: 60,
+          align: 'center',
+          customRender: function (t, r, index) {
+            return parseInt(index) + 1
+          }
+        },
+        {
+          title: '娴佺▼鍒嗙被',
+          align: 'center',
+          dataIndex: 'category_dictText',
+          width: 100
+        },
+        {
+          title: '娴佺▼鍚嶇О',
+          align: 'center',
+          dataIndex: 'flowName',
+          width: 200
+        },
+        {
+          title: '娴佺▼涓氬姟绠�瑕佹弿杩�',
+          align: 'center',
+          dataIndex: 'description',
+          width: 350,
+          ellipsis: true
+
+        },
+        {
+          title: '涓婁竴姝ュ鐞嗕汉',
+          align: 'center',
+          dataIndex: 'preNodeAssignee_dictText',
+          width: 150
+        },
+        {
+          title: '鍓嶉┍鑺傜偣',
+          align: 'center',
+          dataIndex: 'preNode',
+          width: 200
+        },
+        {
+          title: '褰撳墠鑺傜偣',
+          align: 'center',
+          dataIndex: 'name',
+          width: 200
+        },
+        {
+          title: '褰撳墠鑺傜偣寮�濮嬫椂闂�',
+          align: 'center',
+          dataIndex: 'createTime',
+          width: 200
+        },
+        {
+          title: '鎿嶄綔',
+          dataIndex: 'action',
+          scopedSlots: { customRender: 'action' },
+          align: 'center',
+          width: 150,
+          fixed: 'right'
+        }
+      ],
+      url: {
+        list: '/assign/flow/toTaskBySelf',
+        isSameNode: '/assign/flow/isSameNode'
+      },
+      dictOptions: {},
+      selectShenpiData: {},
+      selectDispatchFileXqData: {},
+      selectInspectionOrderData: {},
+      selectWeekMaintenanceData: {},
+      selectSecondMaintenanceData: {},
+      selectThirdMaintenanceData: {},
+      selectBachData: {},
+      selectRepairOrderData: {},
+      selectOutBoundOrderData: {},
+      selectLossBoundOrderData: {},
+      selectStocktakingBoundOrderData: {},
+      selectInboundOrderData: {},
+      selectSparePartApplyData: {},
+      selectGuideCardData:{},
+      //涓氬姟淇℃伅ID
+      dataId: undefined
+    }
+  },
+  created() {
+  },
+  computed: {
+    importExcelUrl: function () {
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
+    },
+    getTableColumnsTotalWidth() {
+      return this.columns.reduce((total, item) => total + item.width, 0)
+    }
+  },
+  methods: {
+    loadData(arg) {
+      if (!this.url.list) {
+        this.$message.error('璇疯缃畊rl.list灞炴��!')
+        return
+      }
+      //鍔犺浇鏁版嵁 鑻ヤ紶鍏ュ弬鏁�1鍒欏姞杞界涓�椤电殑鍐呭
+      if (arg === 1) {
+        this.ipagination.current = 1
+      }
+      var params = this.getQueryParams()//鏌ヨ鏉′欢
+      if (!params) {
+        return false
+      }
+      this.loading = true
+      getAction(this.url.list, params).then((res) => {
+        if (res.success) {
+          // console.log(res)
+          //update-begin---author:zhangyafei    Date:20201118  for锛氶�傞厤涓嶅垎椤电殑鏁版嵁鍒楄〃------------
+          this.dataSource = res.result.records || res.result
+          if (res.result.total) {
+            this.ipagination.total = res.result.total
+          } else {
+            this.ipagination.total = 0
+          }
+          if (this.selectedRowKeys.length > 0) this.selectedRowKeys = this.selectionRows = []
+          //update-end---author:zhangyafei    Date:20201118  for锛氶�傞厤涓嶅垎椤电殑鏁版嵁鍒楄〃------------
+        } else {
+          this.$message.warning(res.message)
+        }
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+
+    handelDetail(item, index) {
+      console.log('鐐瑰嚮浜嗚鎯�')
+      console.log('item----->', item)
+      console.log('index----->', index)
+      let processType = this.splitAprocessType(item.category)
+      console.log('processType--->', processType)
+      switch (processType) {
+        case 'drApproval':
+          this.handDrDetial(item)
+          break
+        case 'ggApproval':
+          this.handDispatchFileDetial(item)
+          break
+        default:
+          alert('娌℃壘鍒拌娴佺▼')
+      }
+    },
+
+    batchHandle() {
+      const categorySet = new Set(this.selectionRows.map(item => item.category))
+      const nameSet = new Set(this.selectionRows.map(item => item.name))
+      if (categorySet.size !== 1 || nameSet.size !== 1) {
+        this.$notification.info({
+          message: '娑堟伅',
+          description: '璇烽�夋嫨鍚屼竴娴佺▼鍒嗙被涓嬬殑鍚屼竴褰撳墠鑺傜偣'
+        })
+        return
+      }
+
+      if (categorySet.has('eam_repair')) {
+        this.$notification.info({
+          message: '娑堟伅',
+          description: '璁惧缁翠慨娴佺▼鏃犳硶鎵归噺澶勭悊'
+        })
+        return
+      }
+
+      if (categorySet.has('sbdjApproval')) {
+        this.$refs.inspectionOrderBatchHandleRef.visible = true
+        this.$refs.inspectionOrderBatchHandleRef.title = this.selectionRows[0].name
+        this.$refs.inspectionOrderBatchHandleRef.getAllApproveData(this.selectionRows[0])
+        this.$refs.inspectionOrderBatchHandleRef.getBasicInformation(this.selectionRows[0])
+      } else if (categorySet.has('WEEK_MAINTENANCE')) {
+        this.$refs.weenMaintenanceBatchApprovalModalRef.handleDetail(this.selectionRows[0])
+        this.$refs.weenMaintenanceBatchApprovalModalRef.title = this.selectionRows[0].name
+      }
+    },
+
+    splitAprocessType(title) {
+      let parts = title.split('锛�') // 娉ㄦ剰鍐掑彿鏄叏瑙掑瓧绗︼紝浣跨敤瀵瑰簲鐨勫瓧杩涜鍒嗗壊
+      let result = parts[0]
+      return result
+    },
+
+    handDrDetial(item) {
+      this.selectShenpiData = item
+      this.$refs.modalFormApproval.clearTableSource()
+      this.$refs.modalFormApproval.getAllApproveData(item)
+    },
+
+    handDispatchFileDetial(item) {
+      console.log('item----->', item)
+      this.selectDispatchFileXqData = item
+      this.$refs.modalFormDispatchFileXq.clearTableSource()
+      this.$refs.modalFormDispatchFileXq.getAllApproveData(item)
+    },
+  }
+}
+</script>
+<style scoped>
+@import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/flowable/workflow/assignFileStream/AssignFileStreamHandle.vue b/src/views/flowable/workflow/assignFileStream/AssignFileStreamHandle.vue
new file mode 100644
index 0000000..ed36204
--- /dev/null
+++ b/src/views/flowable/workflow/assignFileStream/AssignFileStreamHandle.vue
@@ -0,0 +1,434 @@
+<!--
+ Description: 宸ヤ綔娴�-鎸囨淳璁惧澶勭悊椤甸潰 List
+ Author: 浣滆�� liuyh
+ Date:   2025-02-27
+-->
+<template>
+  <a-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    :footer="null"
+    @cancel="handCancel"
+  >
+    <a-card :bordered="false">
+      <div>
+        <b>{{ selectShenpiData.description }}</b>
+        <br>
+        <br>
+        <a-tag color="blue">
+          澶勭悊浜� {{ selectShenpiData.assignee }}
+        </a-tag>
+        <a-tag color="blue">
+          鍒涘缓鏃堕棿 {{ selectShenpiData.createTime }}
+        </a-tag>
+        <br>
+        <br>
+        <button @click="fetchAndShowBmp" class="btn-custom">鎵撳紑娴佺▼鍥�</button>
+        <div v-if="imageSrc">
+          <img :src="imageSrc" alt="Fetched Image" />
+        </div>
+        <hr class="shallow-hr">
+      </div>
+      <div>
+        <b>鎸囨淳璇︽儏</b>
+        <br>
+        <a-form :form='form'>
+          <a-spin :spinning="spinning">
+            <a-tabs default-active-key='1' @change='callback'>
+              <a-tab-pane key='1' tab='鍩烘湰淇℃伅'>
+                <a-form-model ref='form' :model='tableRowRecord' :rules='validatorRules'>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='浜у搧鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='productName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.productName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='閮ㄤ欢鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='componentId'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.componentName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='闆朵欢鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='partsName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.partsName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='宸ュ簭鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='processName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.processName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='宸ユ鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='stepName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.stepName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='璁惧鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='deviceName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.deviceName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏁版帶绯荤粺绫诲埆' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='deviceManagementCode'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.deviceManagementCode'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏁版帶绯荤粺绫诲埆' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='deviceManagementName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.deviceManagementName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏂囨。鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='docName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.docName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏂囨。鐗堟湰' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='version'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.version'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                </a-form-model>
+              </a-tab-pane>
+              <a-tab-pane key='2' tab='娴佺▼鑺傜偣'>
+                <a-card>
+                  <a-timeline style="padding:0 1% 0 12%" >
+                    <a-timeline-item color='white' v-for="(item,index1) in hitaskDataSource" :key="index1">
+                      <div class="bottom">
+                        <p>澶勭悊浜猴細{{item.assignee_dictText}}</p>
+                        <p v-if="index1 !==0">澶勭悊鏃堕暱锛歿{item.duration}}</p>
+                        <p v-if="item.name !== '鎻愪氦鐢宠'">澶勭悊绫诲瀷锛歿{item.sequenceFlowName}}</p>
+                        <p v-if="item.description != null">澶勭悊鎰忚锛歿{item.description}}</p>
+                        <div class="left_qiu"><span>{{item.taskName}}</span></div>
+                      </div>
+                    </a-timeline-item>
+                  </a-timeline>
+                </a-card>
+              </a-tab-pane>
+            </a-tabs>
+          </a-spin>
+        </a-form>
+      </div>
+      <div>
+        <hr class="shallow-hr">
+        <br>
+        <b>瀹℃壒璇︽儏</b>
+        <br>
+        <a-form-model ref="form" :model="approveData" :rules="validatorRules" slot="detail">
+          <a-row>
+            <a-col ::span='span'>
+              <a-form-model-item  label="鐢宠浜�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop='applyUser'>
+                <a-input :disabled='coldisabled' v-model='tableRowRecord.applyUser'></a-input>
+              </a-form-model-item >
+            </a-col>
+            <a-col ::span='span'>
+              <a-form-model-item  label="鐢宠鍘熷洜" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="applyReason">
+                <a-textarea :disabled='coldisabled'  v-model="tableRowRecord.applyReason" rows="4" />
+              </a-form-model-item >
+            </a-col>
+            <a-col ::span='span'>
+              <a-form-model-item  label="鐢宠鏃堕棿" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="applyTime">
+                <a-input :disabled='coldisabled' v-model='tableRowRecord.applyTime'></a-input>
+              </a-form-model-item >
+            </a-col>
+<!--            <a-col :span="24">-->
+<!--              <a-form-item label="瀵嗙骇涓�" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
+<!--                <j-dict-select-tag  type='list' v-model='assignFileStream.secretLevel' dictCode='dnc_secret_level' placeholder="璇烽�夋嫨瀵嗙骇"  />-->
+<!--              </a-form-item>-->
+<!--            </a-col>-->
+            <a-col :span="24" class="btxx">
+              <a-form-item label="瀹℃壒鐘舵��" :labelCol="labelCol" :wrapperCol="wrapperCol">
+                <j-dict-select-tag  type='list' v-model='assignFileStream.status' dictCode='dnc_assign_stream_status' placeholder="璇烽�夋嫨瀹℃壒鐘舵��"  />
+              </a-form-item>
+            </a-col>
+            <a-col :span="24" class="btxx">
+              <a-form-model-item  label="瀹℃壒鎰忚" :labelCol="labelCol" :wrapperCol="wrapperCol">
+                <a-textarea v-model="assignFileStream.approveContent" rows="4" placeholder="璇疯緭鍏ュ鎵规剰瑙�"/>
+              </a-form-model-item >
+            </a-col>
+          </a-row>
+          <div class="table-operator" style="text-align: right;">
+            <a-button  @click="handleQueXiaoTask" type="primary" icon="close">鍙栨秷</a-button>
+            <a-button @click="submitForm">鎻� 浜�</a-button>
+          </div>
+        </a-form-model>
+      </div>
+    </a-card>
+
+
+  </a-modal>
+</template>
+
+<script>
+
+import '@assets/less/TableExpand.less'
+import { mixinDevice } from '@/utils/mixin'
+import { getAction, deleteAction, postAction, downFile, httpAction } from '@api/manage'
+export default {
+  name: 'FlowShenPi',
+  mixins: [mixinDevice],
+  props: {
+    selectShenpiData: {
+      type: Object,
+      required: true
+    }
+  },
+
+  data() {
+    return {
+      form: this.$form.createForm(this),
+      span: 12,
+      span1: 8,
+      coldisabled: true,
+      spinning: false,
+      tableRowRecord: {},
+      assignFileStream:{},
+      tableDataSource: [],
+      usageDataSource: [],
+      hitaskDataSource:[],
+      bomForm: {},
+      approveContent:"",
+      imageSrc: null,
+      drawerVisible: true,
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 5 }
+      },
+      wrapperCol: {
+        xs: { span: 30 },
+        sm: { span: 16 }
+      },
+      validatorRules: {
+        version: {
+          rules: [
+            { required: true, message: '璇疯緭鍏ユ枃妗g増鏈�!'},
+          ]
+        },
+        applyUser: {
+          rules: [
+            { required: true, message: '璇烽�夋嫨鐢宠浜�!'},
+          ]
+        },
+        approveContent: {
+          rules: [
+            { required: true, message: '璇疯緭鍏ュ鎵规剰瑙�!'},
+          ]
+        },
+        docName: {
+          rules: [
+            { required: true, message: '璇疯緭鍏ユ枃妗e悕绉�!'},
+          ]
+        },
+        status: {
+          rules: [
+            { required: true, message: '璇烽�夋嫨瀹℃壒鐘舵��!'},
+          ]
+        },
+      },
+      approveData: {},
+      flowData: {},
+      title: '瀹℃壒椤甸潰',
+      width: 1000,
+      visible: false,
+      // 琛ㄥご
+      url: {
+        queryBomDataById: '/nc/activit/selectVoById',
+        diagramView: '/assign/flow/diagramView',
+        queryHisTaskList:'/dncFlow/dispatchFile/queryHisTaskList',
+        approve:"/nc/activit/assign/file/approve",
+      },
+      dictOptions: {},
+      superFieldList: [],
+      workflowSource: []
+    }
+  },
+  created() {
+  },
+  computed: {},
+  methods: {
+    callback() {
+    },
+    handCancel() {
+      this.visible = false
+    },
+    clearTableSource() {
+      this.tableDataSource = []
+      this.usageDataSource = []
+    },
+    fetchAndShowBmp() {
+      console.log('flowData----->', this.flowData)
+      try {
+        let parm = {
+          processDefinitionId: this.flowData.processDefinitionId,
+          processInstanceId:this.flowData.processInstanceId,
+          TaskDefinitionKey:this.flowData.processDefinitionKey
+        }
+        downFile(this.url.diagramView,parm,'get').then((res=>{
+          console.log('Pica------>',res)
+          const urlObject = window.URL.createObjectURL(new Blob([res]))
+          this.imageSrc = urlObject
+        }))
+      } catch (error) {
+        console.error('Error fetching image blob:', error)
+        alert('鏃犳硶鍔犺浇鍥剧墖锛岃绋嶅悗鍐嶈瘯銆�')
+      }
+    },
+    handleQueXiaoTask(){
+      this.visible = false
+      this.routeReload()
+    },
+    submitForm () {
+      const that = this;
+      if (!that.assignFileStream.status==null || that.assignFileStream.status===undefined){
+        this.$message.warning('璇烽�夋嫨瀹℃壒鐘舵�侊紒')
+        return false;
+      }
+      if (!that.assignFileStream.approveContent==null || that.assignFileStream.approveContent===undefined) {
+        this.$message.warning('璇疯緭鍏ュ鎵规剰瑙侊紒')
+        return false;
+      }
+      // 瑙﹀彂琛ㄥ崟楠岃瘉
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          that.confirmLoading = true;
+          let url=this.url.approve
+          let method = 'post';
+          let flowTaskVo = {}
+          flowTaskVo.status=that.assignFileStream.status;
+          flowTaskVo.approveContent =that.assignFileStream.approveContent;
+          flowTaskVo.comment =that.assignFileStream.approveContent;
+          flowTaskVo.secretLevel = that.assignFileStream.secretLevel;
+          flowTaskVo.dataId = this.selectShenpiData.dataId
+          flowTaskVo.taskId = this.selectShenpiData.id
+          flowTaskVo.userId = this.selectShenpiData.assignee
+          flowTaskVo.instanceId = this.selectShenpiData.procInstId
+          flowTaskVo.targetKey = this.selectShenpiData.taskDefKey
+          flowTaskVo.values = this.selectShenpiData.variables
+          flowTaskVo.assignee = this.selectShenpiData.assignee
+          flowTaskVo.secretLevel = that.assignFileStream.secretLevel;
+          console.log("琛ㄥ崟鎻愪氦鏁版嵁",flowTaskVo)
+          httpAction(url,flowTaskVo,method).then((res)=>{
+            if(res.success){
+              that.$message.success(res.message);
+              that.visible = false
+              //鍒锋柊琛ㄦ牸
+              that.$emit('searchReset')
+            }else{
+              that.$message.warning(res.message);
+            }
+          }).finally(() => {
+            that.confirmLoading = false;
+          })
+        }
+
+      })
+    },
+    getAllApproveData(item) {
+      console.log('selectShenpiData----->', this.selectShenpiData)
+      this.flowData = item
+      let param = {
+        'id': item.dataId
+      }
+      let parmhis={
+        'procInstId': item.procInstId
+      }
+      getAction(this.url.queryHisTaskList,parmhis).then(res=>{
+        this.hitaskDataSource=res.result
+        getAction(this.url.queryBomDataById, param).then((res => {
+          if (res.success) {
+            this.tableRowRecord = res.result
+            console.log('this.tableRowRecord----->', this.tableRowRecord)
+          }
+        }))
+      }).finally(
+        this.visible = true,
+        console.log('this.approveData---->', this.approveData)
+      )
+    }
+  }
+}
+</script>
+<style scoped>
+.shallow-hr {
+  border: 0;
+  height: 1px; /* 鍒嗙晫绾跨殑楂樺害 */
+  background-color: rgba(0, 0, 0, 0.1); /* 浣跨敤 RGBA 棰滆壊锛屽苟璁剧疆杈冧綆鐨勯�忔槑搴� */
+  margin: 20px 0; /* 鍒嗙晫绾夸笂涓嬬殑澶栬竟璺� */
+}
+.btn-custom {
+  background-color: #4CAF50; /* 缁胯壊鑳屾櫙 */
+  color: white; /* 鐧借壊鏂囧瓧 */
+  border: none; /* 鏃犺竟妗� */
+  padding: 5px 15px; /* 鍐呰竟璺� */
+  text-align: center; /* 鏂囧瓧灞呬腑 */
+  text-decoration: none; /* 鏃犱笅鍒掔嚎 */
+  display: inline-block; /* 琛屽唴鍧楀厓绱� */
+  font-size: 12px; /* 瀛椾綋澶у皬 */
+  margin: 4px 2px; /* 澶栬竟璺� */
+  cursor: pointer; /* 榧犳爣鎮仠鏃舵樉绀烘墜鍨� */
+  border-radius: 4px; /* 鍦嗚杈规 */
+}
+
+.bold-large-label {
+  font-weight: bold;
+  font-size: 20px; /* 鎴栦綘闇�瑕佺殑浠讳綍澶у皬 */
+}
+.left_qiu{
+  position: absolute;
+  left: -74px;
+  top: 0;
+  width:54px;
+  border-radius: 50%;
+  height:54px;
+  font-size: 13px;
+  margin: auto;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: center;
+  background: #0099ff;
+  transform: translate(0, 0);
+}
+/deep/ .ant-timeline-item-tail{
+  left: -29px !important;
+}
+.left_qiu span{
+  width: 3em;
+  display: block;
+  color: #fff;
+  text-align: center;
+}
+.img{
+  width: 75%;
+}
+
+.wrap{
+  clear: both;
+  width: 100%;
+  display: flex;
+  height: 50px;
+  border: 1px solid #ccc;
+  /* background-color: aqua; */
+}
+.box{
+  width:21%;
+  height:50px;
+  border-right: 1px solid #ccc;
+  line-height: 50px;
+  /* background: red; */
+  text-align:center;
+  margin: auto;
+}
+
+@import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/flowable/workflow/assignFileStream/AssignFileStreamXq.vue b/src/views/flowable/workflow/assignFileStream/AssignFileStreamXq.vue
new file mode 100644
index 0000000..e74754c
--- /dev/null
+++ b/src/views/flowable/workflow/assignFileStream/AssignFileStreamXq.vue
@@ -0,0 +1,389 @@
+<!--
+ Description: 宸ヤ綔娴�-鎸囨淳璁惧璇︽儏椤甸潰 List
+ Author: 浣滆�� liuyh
+ Date:   2025-02-27
+-->
+<template>
+  <a-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    :footer="null"
+    @cancel="handCancel"
+  >
+    <a-card :bordered="false">
+      <div>
+        <b>{{ selectShenpiData.description }}</b>
+        <br>
+        <br>
+        <a-tag color="blue">
+          澶勭悊浜� {{ selectShenpiData.assignee }}
+        </a-tag>
+        <a-tag color="blue">
+          鍒涘缓鏃堕棿 {{ selectShenpiData.createTime }}
+        </a-tag>
+        <br>
+        <br>
+        <button @click="fetchAndShowBmp" class="btn-custom">鎵撳紑娴佺▼鍥�</button>
+        <div v-if="imageSrc">
+          <img :src="imageSrc" alt="Fetched Image" />
+        </div>
+        <hr class="shallow-hr">
+      </div>
+      <div>
+        <b>鎸囨淳璇︽儏</b>
+        <br>
+        <a-form :form='form'>
+          <a-spin :spinning="spinning">
+            <a-tabs default-active-key='1' @change='callback'>
+              <a-tab-pane key='1' tab='鍩烘湰淇℃伅'>
+                <a-form-model ref='form' :model='tableRowRecord' :rules='validatorRules'>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='浜у搧鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='productName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.productName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='閮ㄤ欢鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='componentId'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.componentName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='闆朵欢鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='partsName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.partsName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='宸ュ簭鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='processName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.processName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='宸ユ鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='stepName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.stepName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='璁惧鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='deviceName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.deviceName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏁版帶绯荤粺绫诲埆' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='deviceManagementCode'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.deviceManagementCode'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏁版帶绯荤粺绫诲埆' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='deviceManagementName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.deviceManagementName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏂囨。鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='docName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.docName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏂囨。鐗堟湰' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='version'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.version'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                </a-form-model>
+              </a-tab-pane>
+              <a-tab-pane key='2' tab='娴佺▼鑺傜偣'>
+                <a-card>
+                  <a-timeline style="padding:0 1% 0 12%" >
+                    <a-timeline-item color='white' v-for="(item,index1) in hitaskDataSource" :key="index1">
+                      <div class="bottom">
+                        <p>澶勭悊浜猴細{{item.assignee_dictText}}</p>
+                        <p v-if="index1 !==0">澶勭悊鏃堕暱锛歿{item.duration}}</p>
+                        <p v-if="item.name !== '鎻愪氦鐢宠'">澶勭悊绫诲瀷锛歿{item.sequenceFlowName}}</p>
+                        <p v-if="item.description != null">澶勭悊鎰忚锛歿{item.description}}</p>
+                        <div class="left_qiu"><span>{{item.taskName}}</span></div>
+                      </div>
+                    </a-timeline-item>
+                  </a-timeline>
+                </a-card>
+              </a-tab-pane>
+            </a-tabs>
+          </a-spin>
+        </a-form>
+      </div>
+    </a-card>
+
+
+  </a-modal>
+</template>
+
+<script>
+
+import '@assets/less/TableExpand.less'
+import { mixinDevice } from '@/utils/mixin'
+import { getAction, deleteAction, postAction, downFile, httpAction } from '@api/manage'
+export default {
+  name: 'FlowShenPi',
+  mixins: [mixinDevice],
+  props: {
+    selectShenpiData: {
+      type: Object,
+      required: true
+    }
+  },
+
+  data() {
+    return {
+      form: this.$form.createForm(this),
+      span: 12,
+      span1: 8,
+      coldisabled: true,
+      spinning: false,
+      tableRowRecord: {},
+      assignFileStream:{},
+      tableDataSource: [],
+      usageDataSource: [],
+      hitaskDataSource:[],
+      bomForm: {},
+      approveContent:"",
+      imageSrc: null,
+      drawerVisible: true,
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 5 }
+      },
+      wrapperCol: {
+        xs: { span: 30 },
+        sm: { span: 16 }
+      },
+      validatorRules: {
+        version: {
+          rules: [
+            { required: true, message: '璇疯緭鍏ユ枃妗g増鏈�!'},
+          ]
+        },
+        applyUser: {
+          rules: [
+            { required: true, message: '璇烽�夋嫨鐢宠浜�!'},
+          ]
+        },
+        approveContent: {
+          rules: [
+            { required: true, message: '璇疯緭鍏ュ鎵规剰瑙�!'},
+          ]
+        },
+        docName: {
+          rules: [
+            { required: true, message: '璇疯緭鍏ユ枃妗e悕绉�!'},
+          ]
+        },
+        status: {
+          rules: [
+            { required: true, message: '璇烽�夋嫨瀹℃壒鐘舵��!'},
+          ]
+        },
+      },
+      approveData: {},
+      flowData: {},
+      title: '璇︽儏椤甸潰',
+      width: 1000,
+      visible: false,
+      // 琛ㄥご
+      url: {
+        queryBomDataById: '/nc/activit/selectVoById',
+        diagramView: '/assign/flow/diagramView',
+        queryHisTaskList:'/dncFlow/dispatchFile/queryHisTaskList',
+        approve:"/activit/assign/file/approve",
+      },
+      dictOptions: {},
+      superFieldList: [],
+      workflowSource: []
+    }
+  },
+  created() {
+  },
+  computed: {},
+  methods: {
+    callback() {
+    },
+    handCancel() {
+      this.visible = false
+    },
+    clearTableSource() {
+      this.tableDataSource = []
+      this.usageDataSource = []
+    },
+    fetchAndShowBmp() {
+      console.log('flowData----->', this.flowData)
+      try {
+        let parm = {
+          processDefinitionId: this.flowData.processDefinitionId,
+          processInstanceId:this.flowData.processInstanceId,
+          TaskDefinitionKey:this.flowData.processDefinitionKey
+        }
+        downFile(this.url.diagramView,parm,'get').then((res=>{
+          console.log('Pica------>',res)
+          const urlObject = window.URL.createObjectURL(new Blob([res]))
+          this.imageSrc = urlObject
+        }))
+      } catch (error) {
+        console.error('Error fetching image blob:', error)
+        alert('鏃犳硶鍔犺浇鍥剧墖锛岃绋嶅悗鍐嶈瘯銆�')
+      }
+    },
+    handleQueXiaoTask(){
+      this.visible = false
+      this.routeReload()
+    },
+    submitForm () {
+      const that = this;
+      if (!that.assignFileStream.status==null || that.assignFileStream.status===undefined){
+        this.$message.warning('璇烽�夋嫨瀹℃壒鐘舵�侊紒')
+        return false;
+      }
+      if (!that.assignFileStream.approveContent==null || that.assignFileStream.approveContent===undefined) {
+        this.$message.warning('璇疯緭鍏ュ鎵规剰瑙侊紒')
+        return false;
+      }
+      // 瑙﹀彂琛ㄥ崟楠岃瘉
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          that.confirmLoading = true;
+          let url=this.url.approve
+          let method = 'post';
+          let flowTaskVo = {}
+          flowTaskVo.status=that.assignFileStream.status;
+          flowTaskVo.approveContent =that.assignFileStream.approveContent;
+          flowTaskVo.comment =that.assignFileStream.approveContent;
+          flowTaskVo.secretLevel = that.assignFileStream.secretLevel;
+          flowTaskVo.dataId = this.selectShenpiData.dataId
+          flowTaskVo.taskId = this.selectShenpiData.id
+          flowTaskVo.userId = this.selectShenpiData.assignee
+          flowTaskVo.instanceId = this.selectShenpiData.procInstId
+          flowTaskVo.targetKey = this.selectShenpiData.taskDefKey
+          flowTaskVo.values = this.selectShenpiData.variables
+          flowTaskVo.assignee = this.selectShenpiData.assignee
+          flowTaskVo.secretLevel = that.assignFileStream.secretLevel;
+          console.log("琛ㄥ崟鎻愪氦鏁版嵁",flowTaskVo)
+          httpAction(url,flowTaskVo,method).then((res)=>{
+            if(res.success){
+              that.$message.success(res.message);
+              that.$emit('ok');
+            }else{
+              that.$message.warning(res.message);
+            }
+          }).finally(() => {
+            that.confirmLoading = false;
+          })
+        }
+
+      })
+    },
+    getAllApproveData(item) {
+      console.log('selectShenpiData----->', this.selectShenpiData)
+      console.log('item----->', item)
+      this.flowData = item
+      let param = {
+        'id': item.dataId
+      }
+      let parmhis={
+        'procInstId': item.procInstId
+      }
+      getAction(this.url.queryHisTaskList,parmhis).then(res=>{
+        this.hitaskDataSource=res.result
+        getAction(this.url.queryBomDataById, param).then((res => {
+          if (res.success) {
+            this.tableRowRecord = res.result
+            console.log('this.tableRowRecord----->', this.tableRowRecord)
+          }
+        }))
+      }).finally(
+        this.visible = true,
+        console.log('this.approveData---->', this.approveData)
+      )
+    }
+  }
+}
+</script>
+<style scoped>
+.shallow-hr {
+  border: 0;
+  height: 1px; /* 鍒嗙晫绾跨殑楂樺害 */
+  background-color: rgba(0, 0, 0, 0.1); /* 浣跨敤 RGBA 棰滆壊锛屽苟璁剧疆杈冧綆鐨勯�忔槑搴� */
+  margin: 20px 0; /* 鍒嗙晫绾夸笂涓嬬殑澶栬竟璺� */
+}
+.btn-custom {
+  background-color: #4CAF50; /* 缁胯壊鑳屾櫙 */
+  color: white; /* 鐧借壊鏂囧瓧 */
+  border: none; /* 鏃犺竟妗� */
+  padding: 5px 15px; /* 鍐呰竟璺� */
+  text-align: center; /* 鏂囧瓧灞呬腑 */
+  text-decoration: none; /* 鏃犱笅鍒掔嚎 */
+  display: inline-block; /* 琛屽唴鍧楀厓绱� */
+  font-size: 12px; /* 瀛椾綋澶у皬 */
+  margin: 4px 2px; /* 澶栬竟璺� */
+  cursor: pointer; /* 榧犳爣鎮仠鏃舵樉绀烘墜鍨� */
+  border-radius: 4px; /* 鍦嗚杈规 */
+}
+
+.bold-large-label {
+  font-weight: bold;
+  font-size: 20px; /* 鎴栦綘闇�瑕佺殑浠讳綍澶у皬 */
+}
+.left_qiu{
+  position: absolute;
+  left: -74px;
+  top: 0;
+  width:54px;
+  border-radius: 50%;
+  height:54px;
+  font-size: 13px;
+  margin: auto;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: center;
+  background: #0099ff;
+  transform: translate(0, 0);
+}
+/deep/ .ant-timeline-item-tail{
+  left: -29px !important;
+}
+.left_qiu span{
+  width: 3em;
+  display: block;
+  color: #fff;
+  text-align: center;
+}
+.img{
+  width: 75%;
+}
+
+.wrap{
+  clear: both;
+  width: 100%;
+  display: flex;
+  height: 50px;
+  border: 1px solid #ccc;
+  /* background-color: aqua; */
+}
+.box{
+  width:21%;
+  height:50px;
+  border-right: 1px solid #ccc;
+  line-height: 50px;
+  /* background: red; */
+  text-align:center;
+  margin: auto;
+}
+
+@import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/flowable/workflow/dispatchFile/DispatchFileBachHandleForm.vue b/src/views/flowable/workflow/dispatchFile/DispatchFileBachHandleForm.vue
new file mode 100644
index 0000000..a883bcc
--- /dev/null
+++ b/src/views/flowable/workflow/dispatchFile/DispatchFileBachHandleForm.vue
@@ -0,0 +1,216 @@
+<template>
+	<a-spin :spinning="confirmLoading">
+		<j-form-container >
+			<a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+				<a-row>
+          <a-col :span="24" v-if="selectBachData.taskDefKey ==='task_proofread'" class="btxx">
+            <a-form-model-item  label="澶勭悊绫诲瀷" :labelCol="labelCol" :wrapperCol="wrapperCol" prop='status'>
+              <j-dict-select-tag  type='list' v-model='model.status' dictCode='nc_sq_handle_type_jd' placeholder="璇烽�夋嫨澶勭悊绫诲瀷"  />
+            </a-form-model-item >
+          </a-col>
+          <a-col :span="24" v-if="selectBachData.taskDefKey ==='task_approve' || selectBachData.taskDefKey ==='task_cut' || selectBachData.taskDefKey ==='task_finalize'" class="btxx">
+            <a-form-model-item  label="澶勭悊绫诲瀷" :labelCol="labelCol" :wrapperCol="wrapperCol" prop='status'>
+              <j-dict-select-tag  type='list' v-model='model.status' dictCode='nc_sq_handle_type' placeholder="璇烽�夋嫨澶勭悊绫诲瀷"  />
+            </a-form-model-item >
+          </a-col>
+          <a-col :span="24" class="btxx">
+            <a-form-model-item  label="澶勭悊鎰忚" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-textarea v-model="model.approveContent" rows="4" placeholder="璇疯緭鍏ュ鐞嗘剰瑙�"/>
+            </a-form-model-item >
+          </a-col>
+				</a-row>
+			</a-form-model>
+		</j-form-container>
+	</a-spin>
+</template>
+
+<script>
+	import axios from 'axios';
+	import {
+		httpAction,
+		getAction
+	} from '@/api/manage'
+	import {
+		validateDuplicateValue
+	} from '@/utils/util'
+
+	export default {
+		name: 'ChCfForm',
+		components: {},
+		props: {
+			//琛ㄥ崟绂佺敤
+			disabled: {
+				type: Boolean,
+				default: false,
+				required: false
+			}
+		},
+		data() {
+			return {
+				principalList: [],
+				model: {},
+				labelCol: {
+					xs: {
+						span: 24
+					},
+					sm: {
+						span: 5
+					},
+				},
+				wrapperCol: {
+					xs: {
+						span: 24
+					},
+					sm: {
+						span: 16
+					},
+				},
+				confirmLoading: false,
+				validatorRules: {
+					address: [{
+						required: true,
+						message: '璇烽�夋嫨鍦板潃!'
+					}, ],
+					bt: [{
+						required: true,
+						message: '璇疯緭鍏ユ爣棰�!'
+					}, ],
+				},
+				url: {
+          approvalBatch: "/dncFlow/dispatchFile/approvalBatch",
+				},
+        selectBachData:{}
+			}
+		},
+		computed: {
+			formDisabled() {
+				return this.disabled
+			},
+		},
+		created() {
+			//澶囦唤model鍘熷鍊�
+			this.modelDefault = JSON.parse(JSON.stringify(this.model));
+		},
+		methods: {
+			handleChange(e) {
+				console.log(e);
+				let sss = e.split('||||')
+				console.log(sss);
+				this.model.jd = sss[0]
+				this.model.address = sss[1]
+				console.log(sss)
+			},
+			handleSearch(e) {
+				if (e === '') {
+					return
+				}
+				const that = this;
+				axios.get('/s-api/api/index/lsdz?input=' + e)
+					.then(response => {
+						that.principalList = []
+						console.log(that.principalList)
+						for (var i = 0; i < response.data.data.length; i++) {
+							that.principalList.push({
+								value: response.data.data[i].inputValueId + '||||' + response.data.data[i].setout,
+								label: response.data.data[i].setout,
+							});
+						}
+						// that.principalList = response.data.data
+						console.log(that.principalList, '8888'); // 杈撳嚭杩斿洖鐨勬暟鎹�
+					})
+					.catch(error => {
+						console.error(error); // 澶勭悊閿欒鎯呭喌
+					});
+			},
+			add() {
+				this.edit(this.modelDefault);
+			},
+			edit(record) {
+				this.selectBachData=record
+				this.visible = true;
+			},
+      submitForm () {
+        const that = this;
+        if (that.selectBachData.taskDefKey ==='task_prepare'){
+          // 瑙﹀彂琛ㄥ崟楠岃瘉-閲嶆柊鍚姩
+          this.$refs.form.validate(valid => {
+            if (valid) {
+              that.confirmLoading = true;
+              let url=this.url.approvalBatch;
+              let method = 'post';
+              let flowTaskVo = {}
+              flowTaskVo.comment =this.model.approveContent;
+              flowTaskVo.taskIds=that.selectBachData.taskIds
+              flowTaskVo.targetKey=that.selectBachData.taskDefKey
+              console.log("琛ㄥ崟鎻愪氦鏁版嵁",flowTaskVo)
+              httpAction(url,flowTaskVo,method).then((res)=>{
+                if(res.success){
+                  that.$message.success(res.message);
+                  that.valid = false
+                  //鍒锋柊琛ㄦ牸
+                  that.$emit('searchReset')
+                }else{
+                  that.$message.warning(res.message);
+                }
+              }).finally(() => {
+                that.confirmLoading = false;
+              })
+            }
+          })
+          //璺冲嚭鏂规硶
+          return false;
+        }else {
+          if (!that.model.status==null || that.model.status===undefined){
+            this.$message.warning('璇烽�夋嫨澶勭悊绫诲瀷锛�')
+            return false;
+          }
+        }
+        if (!that.model.approveContent==null || that.model.approveContent===undefined) {
+          this.$message.warning('璇疯緭鍏ュ鐞嗘剰瑙侊紒')
+          return false;
+        }
+        // 瑙﹀彂琛ㄥ崟楠岃瘉
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let url=this.url.approvalBatch
+            let method = 'post';
+            let handle =this.model.status === '1';
+            let flowTaskVo = {}
+            switch (that.selectBachData.taskDefKey){
+              case "task_approve":
+                flowTaskVo.ratify=handle;
+                break;
+              case "task_cut":
+                flowTaskVo.cut=handle;
+                break;
+              case "task_finalize":
+                flowTaskVo.stereotype=handle;
+                break;
+            }
+            if (that.selectBachData.taskDefKey ==='task_proofread'){
+              flowTaskVo.proofreadStatus =that.model.status;
+            }
+            flowTaskVo.comment =that.model.approveContent;
+            flowTaskVo.taskIds=that.selectBachData.taskIds
+            flowTaskVo.targetKey=that.selectBachData.taskDefKey
+            console.log("琛ㄥ崟鎻愪氦鏁版嵁",flowTaskVo)
+            httpAction(url,flowTaskVo,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.valid = false
+                that.close();
+                //鍒锋柊琛ㄦ牸
+                that.$emit('ok')
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+        })
+      },
+		}
+	}
+</script>
\ No newline at end of file
diff --git "a/src/views/flowable/workflow/dispatchFile/DispatchFileBachHandleStyle\043Drawer.vue" "b/src/views/flowable/workflow/dispatchFile/DispatchFileBachHandleStyle\043Drawer.vue"
new file mode 100644
index 0000000..c3bfc8a
--- /dev/null
+++ "b/src/views/flowable/workflow/dispatchFile/DispatchFileBachHandleStyle\043Drawer.vue"
@@ -0,0 +1,62 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="鍏抽棴">
+    <DispatchFileBachHandleForm ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></DispatchFileBachHandleForm>
+  </j-modal>
+
+
+</template>
+<script>
+
+  import DispatchFileBachHandleForm from './DispatchFileBachHandleForm.vue'
+
+  export default {
+    name: 'DispatchFileBachHandleStyle',
+    components: {
+      DispatchFileBachHandleForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        });
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
\ No newline at end of file
diff --git a/src/views/flowable/workflow/dispatchFile/DispatchFileHandle.vue b/src/views/flowable/workflow/dispatchFile/DispatchFileHandle.vue
new file mode 100644
index 0000000..72c510b
--- /dev/null
+++ b/src/views/flowable/workflow/dispatchFile/DispatchFileHandle.vue
@@ -0,0 +1,415 @@
+<!--
+ Description: 宸ヤ綔娴�-NC瀹$澶勭悊椤甸潰 List
+ Author: 浣滆�� liuyh
+ Date:   2025-02-27
+-->
+<template>
+  <a-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    :footer="null"
+    @cancel="handCancel"
+  >
+    <a-card :bordered="false">
+      <div>
+        <b>{{ selectShenpiData.description }}</b>
+        <br>
+        <br>
+        <a-tag color="blue">
+          褰撳墠澶勭悊浜� {{ selectShenpiData.assignee_dictText }}
+        </a-tag>
+        <a-tag color="blue">
+          浠诲姟鍒涘缓鏃堕棿 {{ selectShenpiData.createTime }}
+        </a-tag>
+        <br>
+        <br>
+        <button @click="fetchAndShowBmp" class="btn-custom">鎵撳紑娴佺▼鍥�</button>
+        <div v-if="imageSrc">
+          <img :src="imageSrc" alt="Fetched Image" />
+        </div>
+        <hr class="shallow-hr">
+      </div>
+      <div>
+        <b>瀹$璇︽儏</b>
+        <br>
+        <a-form :form='form'>
+          <a-spin :spinning="spinning">
+            <a-tabs default-active-key='1' @change='callback'>
+              <a-tab-pane key='1' tab='鍩烘湰淇℃伅'>
+                <a-form-model ref='form' :model='tableRowRecord' :rules='validatorRules'>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏂囨。鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='docName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.docName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏂囨。鐗堟湰' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='publishVersion'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.publishVersion'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏂囨。鍚庣紑' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='docSuffix'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.docSuffix'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='绯荤粺鎸囧畾鐗堟湰' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='componentId'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.componentName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鍑哄簱鐘舵��' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='pullStatus_dictText'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.pullStatus_dictText'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鍑哄簱浜�' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='pullUser_dictText'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.pullUser_dictText'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                </a-form-model>
+              </a-tab-pane>
+              <a-tab-pane key='2' tab='娴佺▼鑺傜偣'>
+                <a-card>
+                  <a-timeline style="padding:0 1% 0 12%" >
+                    <a-timeline-item color='white' v-for="(item,index1) in hitaskDataSource" :key="index1">
+                      <div class="bottom">
+                        <p>澶勭悊浜猴細{{item.assignee_dictText}}</p>
+                        <p v-if="index1 !==0">澶勭悊鏃堕暱锛歿{item.duration}}</p>
+                        <p v-if="item.name !== '鎻愪氦鐢宠'">澶勭悊绫诲瀷锛歿{item.sequenceFlowName}}</p>
+                        <p v-if="item.description != null">澶勭悊鎰忚锛歿{item.description}}</p>
+                        <div class="left_qiu"><span>{{item.taskName}}</span></div>
+                      </div>
+                    </a-timeline-item>
+                  </a-timeline>
+                </a-card>
+              </a-tab-pane>
+            </a-tabs>
+          </a-spin>
+        </a-form>
+      </div>
+      <div>
+        <hr class="shallow-hr">
+        <br>
+        <b>瀹℃壒璇︽儏</b>
+        <br>
+        <a-form-model ref="form" :model="approveData" :rules="validatorRules" slot="detail">
+          <a-row>
+            <a-col ::span='span' v-if="selectShenpiData.taskDefKey ==='task_proofread'" class="btxx">
+              <a-form-model-item  label="澶勭悊绫诲瀷" :labelCol="labelCol" :wrapperCol="wrapperCol" prop='status'>
+                <j-dict-select-tag  type='list' v-model='assignFileStream.status' dictCode='nc_sq_handle_type_jd' placeholder="璇烽�夋嫨澶勭悊绫诲瀷"  />
+              </a-form-model-item >
+            </a-col>
+            <a-col ::span='span' v-if="selectShenpiData.taskDefKey ==='task_approve' || selectShenpiData.taskDefKey ==='task_cut' || selectShenpiData.taskDefKey ==='task_finalize'" class="btxx">
+              <a-form-model-item  label="澶勭悊绫诲瀷" :labelCol="labelCol" :wrapperCol="wrapperCol" prop='status'>
+                <j-dict-select-tag  type='list' v-model='assignFileStream.status' dictCode='nc_sq_handle_type' placeholder="璇烽�夋嫨澶勭悊绫诲瀷"  />
+              </a-form-model-item >
+            </a-col>
+            <a-col :span="24" class="btxx">
+              <a-form-model-item  label="澶勭悊鎰忚" :labelCol="labelCol" :wrapperCol="wrapperCol">
+                <a-textarea v-model="assignFileStream.approveContent" rows="4" placeholder="璇疯緭鍏ュ鐞嗘剰瑙�"/>
+              </a-form-model-item >
+            </a-col>
+          </a-row>
+          <div class="table-operator" style="text-align: right;">
+            <a-button  @click="handleQueXiaoTask" type="primary" icon="close">鍙栨秷</a-button>
+            <a-button @click="submitForm">鎻� 浜�</a-button>
+          </div>
+        </a-form-model>
+      </div>
+    </a-card>
+
+
+  </a-modal>
+</template>
+
+<script>
+
+import '@assets/less/TableExpand.less'
+import { mixinDevice } from '@/utils/mixin'
+import { getAction, deleteAction, postAction, downFile, httpAction } from '@api/manage'
+export default {
+  name: 'FlowShenPi',
+  mixins: [mixinDevice],
+  props: {
+    selectShenpiData: {
+      type: Object,
+      required: true
+    }
+  },
+
+  data() {
+    return {
+      form: this.$form.createForm(this),
+      span: 12,
+      span1: 8,
+      coldisabled: true,
+      spinning: false,
+      tableRowRecord: {},
+      assignFileStream:{},
+      tableDataSource: [],
+      usageDataSource: [],
+      hitaskDataSource:[],
+      bomForm: {},
+      approveContent:"",
+      imageSrc: null,
+      drawerVisible: true,
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 5 }
+      },
+      wrapperCol: {
+        xs: { span: 30 },
+        sm: { span: 16 }
+      },
+      validatorRules: {
+        status: {
+          rules: [
+            { required: true, message: '璇烽�夋嫨瀹℃壒鐘舵��!'},
+          ]
+        },
+      },
+      approveData: {},
+      flowData: {},
+      title: '璇︽儏椤甸潰',
+      width: 1000,
+      visible: false,
+      // 琛ㄥご
+      url: {
+        queryBomDataById: '/dncFlow/dispatchFile/selectVoById',
+        diagramView: '/assign/flow/diagramView',
+        queryHisTaskList:'/dncFlow/dispatchFile/queryHisTaskList',
+        approve:"/dncFlow/dispatchFile/approval",
+        saveDispatchFile:"/dncFlow/dispatchFile/saveDispatchFile"
+      },
+      dictOptions: {},
+      superFieldList: [],
+      workflowSource: []
+    }
+  },
+  created() {
+  },
+  computed: {},
+  methods: {
+    callback() {
+    },
+    handCancel() {
+      this.visible = false
+    },
+    clearTableSource() {
+      this.tableDataSource = []
+      this.usageDataSource = []
+    },
+    fetchAndShowBmp() {
+      console.log('flowData----->', this.flowData)
+      try {
+        let parm = {
+          processDefinitionId: this.flowData.processDefinitionId,
+          processInstanceId:this.flowData.processInstanceId,
+          TaskDefinitionKey:this.flowData.processDefinitionKey
+        }
+        downFile(this.url.diagramView,parm,'get').then((res=>{
+          console.log('Pica------>',res)
+          const urlObject = window.URL.createObjectURL(new Blob([res]))
+          this.imageSrc = urlObject
+        }))
+      } catch (error) {
+        console.error('Error fetching image blob:', error)
+        alert('鏃犳硶鍔犺浇鍥剧墖锛岃绋嶅悗鍐嶈瘯銆�')
+      }
+    },
+    handleQueXiaoTask(){
+      this.visible = false
+      this.routeReload()
+    },
+    submitForm () {
+      const that = this;
+      if (that.selectShenpiData.taskDefKey ==='task_prepare'){
+        // 瑙﹀彂琛ㄥ崟楠岃瘉-閲嶆柊鍚姩
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let url=this.url.saveDispatchFile;
+            let method = 'post';
+            let flowTaskVo = {}
+            flowTaskVo.comment =that.assignFileStream.approveContent;
+            flowTaskVo.dataId = this.selectShenpiData.dataId
+            flowTaskVo.instanceId = this.selectShenpiData.procInstId
+            flowTaskVo.taskId = this.selectShenpiData.id
+            console.log("琛ㄥ崟鎻愪氦鏁版嵁",flowTaskVo)
+            httpAction(url,flowTaskVo,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.visible = false
+                //鍒锋柊琛ㄦ牸
+                that.$emit('searchReset')
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+        })
+        //璺冲嚭鏂规硶
+        return false;
+      }else {
+        if (!that.assignFileStream.status==null || that.assignFileStream.status===undefined){
+          this.$message.warning('璇烽�夋嫨澶勭悊绫诲瀷锛�')
+          return false;
+        }
+      }
+      if (!that.assignFileStream.approveContent==null || that.assignFileStream.approveContent===undefined) {
+        this.$message.warning('璇疯緭鍏ュ鐞嗘剰瑙侊紒')
+        return false;
+      }
+      // 瑙﹀彂琛ㄥ崟楠岃瘉
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          that.confirmLoading = true;
+          let url=this.url.approve
+          let method = 'post';
+          let handle =that.assignFileStream.status === '1';
+          let flowTaskVo = {}
+          switch (that.selectShenpiData.taskDefKey){
+            case "task_approve":
+              flowTaskVo.ratify=handle;
+              break;
+            case "task_cut":
+              flowTaskVo.cut=handle;
+              break;
+            case "task_finalize":
+              flowTaskVo.stereotype=handle;
+              break;
+          }
+          if (that.selectShenpiData.taskDefKey ==='task_proofread'){
+            flowTaskVo.proofreadStatus =that.assignFileStream.status;
+          }
+          flowTaskVo.comment =that.assignFileStream.approveContent;
+          flowTaskVo.dataId = this.selectShenpiData.dataId
+          flowTaskVo.taskId = this.selectShenpiData.id
+          flowTaskVo.userId = this.selectShenpiData.assignee
+          flowTaskVo.instanceId = this.selectShenpiData.procInstId
+          flowTaskVo.values = this.selectShenpiData.variables
+          console.log("琛ㄥ崟鎻愪氦鏁版嵁",flowTaskVo)
+          httpAction(url,flowTaskVo,method).then((res)=>{
+            if(res.success){
+              that.$message.success(res.message);
+              that.visible = false
+              //鍒锋柊琛ㄦ牸
+              that.$emit('searchReset')
+            }else{
+              that.$message.warning(res.message);
+            }
+          }).finally(() => {
+            that.confirmLoading = false;
+          })
+        }
+      })
+    },
+    getAllApproveData(item) {
+      console.log('selectShenpiData----->', this.selectShenpiData)
+      this.flowData = item
+      let param = {
+        'id': item.dataId
+      }
+      let parmhis={
+        'procInstId': item.procInstId
+      }
+      getAction(this.url.queryHisTaskList,parmhis).then(res=>{
+        this.hitaskDataSource=res.result
+        getAction(this.url.queryBomDataById, param).then((res => {
+          if (res.success) {
+            this.tableRowRecord = res.result[0]
+            console.log('this.tableRowRecord----->', this.tableRowRecord[0])
+          }
+        }))
+      }).finally(
+        this.visible = true,
+        console.log('this.approveData---->', this.approveData)
+      )
+    }
+  }
+}
+</script>
+<style scoped>
+.shallow-hr {
+  border: 0;
+  height: 1px; /* 鍒嗙晫绾跨殑楂樺害 */
+  background-color: rgba(0, 0, 0, 0.1); /* 浣跨敤 RGBA 棰滆壊锛屽苟璁剧疆杈冧綆鐨勯�忔槑搴� */
+  margin: 20px 0; /* 鍒嗙晫绾夸笂涓嬬殑澶栬竟璺� */
+}
+.btn-custom {
+  background-color: #4CAF50; /* 缁胯壊鑳屾櫙 */
+  color: white; /* 鐧借壊鏂囧瓧 */
+  border: none; /* 鏃犺竟妗� */
+  padding: 5px 15px; /* 鍐呰竟璺� */
+  text-align: center; /* 鏂囧瓧灞呬腑 */
+  text-decoration: none; /* 鏃犱笅鍒掔嚎 */
+  display: inline-block; /* 琛屽唴鍧楀厓绱� */
+  font-size: 12px; /* 瀛椾綋澶у皬 */
+  margin: 4px 2px; /* 澶栬竟璺� */
+  cursor: pointer; /* 榧犳爣鎮仠鏃舵樉绀烘墜鍨� */
+  border-radius: 4px; /* 鍦嗚杈规 */
+}
+
+.bold-large-label {
+  font-weight: bold;
+  font-size: 20px; /* 鎴栦綘闇�瑕佺殑浠讳綍澶у皬 */
+}
+.left_qiu{
+  position: absolute;
+  left: -74px;
+  top: 0;
+  width:54px;
+  border-radius: 50%;
+  height:54px;
+  font-size: 13px;
+  margin: auto;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: center;
+  background: #0099ff;
+  transform: translate(0, 0);
+}
+/deep/ .ant-timeline-item-tail{
+  left: -29px !important;
+}
+.left_qiu span{
+  width: 3em;
+  display: block;
+  color: #fff;
+  text-align: center;
+}
+.img{
+  width: 75%;
+}
+
+.wrap{
+  clear: both;
+  width: 100%;
+  display: flex;
+  height: 50px;
+  border: 1px solid #ccc;
+  /* background-color: aqua; */
+}
+.box{
+  width:21%;
+  height:50px;
+  border-right: 1px solid #ccc;
+  line-height: 50px;
+  /* background: red; */
+  text-align:center;
+  margin: auto;
+}
+
+@import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/flowable/workflow/dispatchFile/DispatchFileXq.vue b/src/views/flowable/workflow/dispatchFile/DispatchFileXq.vue
new file mode 100644
index 0000000..f0f148b
--- /dev/null
+++ b/src/views/flowable/workflow/dispatchFile/DispatchFileXq.vue
@@ -0,0 +1,364 @@
+<!--
+ Description: 宸ヤ綔娴�-NC瀹$璇︽儏椤甸潰 List
+ Author: 浣滆�� liuyh
+ Date:   2025-02-27
+-->
+<template>
+  <a-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    :footer="null"
+    @cancel="handCancel"
+  >
+    <a-card :bordered="false">
+      <div>
+        <b>{{ selectShenpiData.description }}</b>
+        <br>
+        <br>
+        <a-tag color="blue">
+          褰撳墠澶勭悊浜� {{ selectShenpiData.assignee_dictText }}
+        </a-tag>
+        <a-tag color="blue">
+          褰撳墠浠诲姟鍒涘缓鏃堕棿 {{ selectShenpiData.createTime }}
+        </a-tag>
+        <br>
+        <br>
+        <button @click="fetchAndShowBmp" class="btn-custom">鎵撳紑娴佺▼鍥�</button>
+        <div v-if="imageSrc">
+          <img :src="imageSrc" alt="Fetched Image" />
+        </div>
+        <hr class="shallow-hr">
+      </div>
+      <div>
+        <b>瀹$璇︽儏</b>
+        <br>
+        <a-form :form='form'>
+          <a-spin :spinning="spinning">
+            <a-tabs default-active-key='1' @change='callback'>
+              <a-tab-pane key='1' tab='鍩烘湰淇℃伅'>
+                <a-form-model ref='form' :model='tableRowRecord' :rules='validatorRules'>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏂囨。鍚嶇О' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='docName'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.docName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏂囨。鐗堟湰' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='publishVersion'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.publishVersion'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鏂囨。鍚庣紑' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='docSuffix'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.docSuffix'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='绯荤粺鎸囧畾鐗堟湰' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='componentId'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.componentName'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鍑哄簱鐘舵��' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='pullStatus_dictText'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.pullStatus_dictText'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span='span'>
+                      <a-form-model-item label='鍑哄簱浜�' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='pullUser_dictText'>
+                        <a-input :disabled='coldisabled' v-model='tableRowRecord.pullUser_dictText'></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                </a-form-model>
+              </a-tab-pane>
+              <a-tab-pane key='2' tab='娴佺▼鑺傜偣'>
+                <a-card>
+                  <a-timeline style="padding:0 1% 0 12%" >
+                    <a-timeline-item color='white' v-for="(item,index1) in hitaskDataSource" :key="index1">
+                      <div class="bottom">
+                        <p>澶勭悊浜猴細{{item.assignee_dictText}}</p>
+                        <p v-if="index1 !==0">澶勭悊鏃堕暱锛歿{item.duration}}</p>
+                        <p v-if="item.name !== '鎻愪氦鐢宠'">澶勭悊绫诲瀷锛歿{item.sequenceFlowName}}</p>
+                        <p v-if="item.description != null">澶勭悊鎰忚锛歿{item.description}}</p>
+                        <div class="left_qiu"><span>{{item.taskName}}</span></div>
+                      </div>
+                    </a-timeline-item>
+                  </a-timeline>
+                </a-card>
+              </a-tab-pane>
+            </a-tabs>
+          </a-spin>
+        </a-form>
+      </div>
+    </a-card>
+
+
+  </a-modal>
+</template>
+
+<script>
+
+import '@assets/less/TableExpand.less'
+import { mixinDevice } from '@/utils/mixin'
+import { getAction, deleteAction, postAction, downFile, httpAction } from '@api/manage'
+export default {
+  name: 'FlowShenPi',
+  mixins: [mixinDevice],
+  props: {
+    selectShenpiData: {
+      type: Object,
+      required: true
+    }
+  },
+
+  data() {
+    return {
+      form: this.$form.createForm(this),
+      span: 12,
+      span1: 8,
+      coldisabled: true,
+      spinning: false,
+      tableRowRecord: {},
+      assignFileStream:{},
+      tableDataSource: [],
+      usageDataSource: [],
+      hitaskDataSource:[],
+      bomForm: {},
+      approveContent:"",
+      imageSrc: null,
+      drawerVisible: true,
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 5 }
+      },
+      wrapperCol: {
+        xs: { span: 30 },
+        sm: { span: 16 }
+      },
+      validatorRules: {
+        version: {
+          rules: [
+            { required: true, message: '璇疯緭鍏ユ枃妗g増鏈�!'},
+          ]
+        },
+        applyUser: {
+          rules: [
+            { required: true, message: '璇烽�夋嫨鐢宠浜�!'},
+          ]
+        },
+        approveContent: {
+          rules: [
+            { required: true, message: '璇疯緭鍏ュ鎵规剰瑙�!'},
+          ]
+        },
+        docName: {
+          rules: [
+            { required: true, message: '璇疯緭鍏ユ枃妗e悕绉�!'},
+          ]
+        },
+        status: {
+          rules: [
+            { required: true, message: '璇烽�夋嫨瀹℃壒鐘舵��!'},
+          ]
+        },
+      },
+      approveData: {},
+      flowData: {},
+      title: '璇︽儏椤甸潰',
+      width: 1000,
+      visible: false,
+      // 琛ㄥご
+      url: {
+        queryBomDataById: '/dncFlow/dispatchFile/selectVoById',
+        diagramView: '/assign/flow/diagramView',
+        queryHisTaskList:'/dncFlow/dispatchFile/queryHisTaskList',
+        approve:"/activit/assign/file/approve",
+      },
+      dictOptions: {},
+      superFieldList: [],
+      workflowSource: []
+    }
+  },
+  created() {
+  },
+  computed: {},
+  methods: {
+    callback() {
+    },
+    handCancel() {
+      this.visible = false
+    },
+    clearTableSource() {
+      this.tableDataSource = []
+      this.usageDataSource = []
+    },
+    fetchAndShowBmp() {
+      console.log('flowData----->', this.flowData)
+      try {
+        let parm = {
+          processDefinitionId: this.flowData.processDefinitionId,
+          processInstanceId:this.flowData.processInstanceId,
+          TaskDefinitionKey:this.flowData.processDefinitionKey
+        }
+        downFile(this.url.diagramView,parm,'get').then((res=>{
+          console.log('Pica------>',res)
+          const urlObject = window.URL.createObjectURL(new Blob([res]))
+          this.imageSrc = urlObject
+        }))
+      } catch (error) {
+        console.error('Error fetching image blob:', error)
+        alert('鏃犳硶鍔犺浇鍥剧墖锛岃绋嶅悗鍐嶈瘯銆�')
+      }
+    },
+    handleQueXiaoTask(){
+      this.visible = false
+      this.routeReload()
+    },
+    submitForm () {
+      const that = this;
+      if (!that.assignFileStream.status==null || that.assignFileStream.status===undefined){
+        this.$message.warning('璇烽�夋嫨瀹℃壒鐘舵�侊紒')
+        return false;
+      }
+      if (!that.assignFileStream.approveContent==null || that.assignFileStream.approveContent===undefined) {
+        this.$message.warning('璇疯緭鍏ュ鎵规剰瑙侊紒')
+        return false;
+      }
+      // 瑙﹀彂琛ㄥ崟楠岃瘉
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          that.confirmLoading = true;
+          let url=this.url.approve
+          let method = 'post';
+          let flowTaskVo = {}
+          flowTaskVo.status=that.assignFileStream.status;
+          flowTaskVo.approveContent =that.assignFileStream.approveContent;
+          flowTaskVo.comment =that.assignFileStream.approveContent;
+          flowTaskVo.secretLevel = that.assignFileStream.secretLevel;
+          flowTaskVo.dataId = this.selectShenpiData.dataId
+          flowTaskVo.taskId = this.selectShenpiData.id
+          flowTaskVo.userId = this.selectShenpiData.assignee
+          flowTaskVo.instanceId = this.selectShenpiData.procInstId
+          flowTaskVo.targetKey = this.selectShenpiData.taskDefKey
+          flowTaskVo.values = this.selectShenpiData.variables
+          flowTaskVo.assignee = this.selectShenpiData.assignee
+          flowTaskVo.secretLevel = that.assignFileStream.secretLevel;
+          console.log("琛ㄥ崟鎻愪氦鏁版嵁",flowTaskVo)
+          httpAction(url,flowTaskVo,method).then((res)=>{
+            if(res.success){
+              that.$message.success(res.message);
+              that.$emit('ok');
+            }else{
+              that.$message.warning(res.message);
+            }
+          }).finally(() => {
+            that.confirmLoading = false;
+          })
+        }
+
+      })
+    },
+    getAllApproveData(item) {
+      console.log('selectShenpiData----->', this.selectShenpiData)
+      this.flowData = item
+      let param = {
+        'id': item.dataId
+      }
+      let parmhis={
+        'procInstId': item.procInstId
+      }
+      getAction(this.url.queryHisTaskList,parmhis).then(res=>{
+        this.hitaskDataSource=res.result
+        getAction(this.url.queryBomDataById, param).then((res => {
+          if (res.success) {
+            this.tableRowRecord = res.result[0]
+            console.log('this.tableRowRecord----->', this.tableRowRecord[0])
+          }
+        }))
+      }).finally(
+        this.visible = true,
+        console.log('this.approveData---->', this.approveData)
+      )
+    }
+  }
+}
+</script>
+<style scoped>
+.shallow-hr {
+  border: 0;
+  height: 1px; /* 鍒嗙晫绾跨殑楂樺害 */
+  background-color: rgba(0, 0, 0, 0.1); /* 浣跨敤 RGBA 棰滆壊锛屽苟璁剧疆杈冧綆鐨勯�忔槑搴� */
+  margin: 20px 0; /* 鍒嗙晫绾夸笂涓嬬殑澶栬竟璺� */
+}
+.btn-custom {
+  background-color: #4CAF50; /* 缁胯壊鑳屾櫙 */
+  color: white; /* 鐧借壊鏂囧瓧 */
+  border: none; /* 鏃犺竟妗� */
+  padding: 5px 15px; /* 鍐呰竟璺� */
+  text-align: center; /* 鏂囧瓧灞呬腑 */
+  text-decoration: none; /* 鏃犱笅鍒掔嚎 */
+  display: inline-block; /* 琛屽唴鍧楀厓绱� */
+  font-size: 12px; /* 瀛椾綋澶у皬 */
+  margin: 4px 2px; /* 澶栬竟璺� */
+  cursor: pointer; /* 榧犳爣鎮仠鏃舵樉绀烘墜鍨� */
+  border-radius: 4px; /* 鍦嗚杈规 */
+}
+
+.bold-large-label {
+  font-weight: bold;
+  font-size: 20px; /* 鎴栦綘闇�瑕佺殑浠讳綍澶у皬 */
+}
+.left_qiu{
+  position: absolute;
+  left: -74px;
+  top: 0;
+  width:54px;
+  border-radius: 50%;
+  height:54px;
+  font-size: 13px;
+  margin: auto;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: center;
+  background: #0099ff;
+  transform: translate(0, 0);
+}
+/deep/ .ant-timeline-item-tail{
+  left: -29px !important;
+}
+.left_qiu span{
+  width: 3em;
+  display: block;
+  color: #fff;
+  text-align: center;
+}
+.img{
+  width: 75%;
+}
+
+.wrap{
+  clear: both;
+  width: 100%;
+  display: flex;
+  height: 50px;
+  border: 1px solid #ccc;
+  /* background-color: aqua; */
+}
+.box{
+  width:21%;
+  height:50px;
+  border-right: 1px solid #ccc;
+  line-height: 50px;
+  /* background: red; */
+  text-align:center;
+  margin: auto;
+}
+
+@import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/system/SysBusinessCodeRuleList.vue b/src/views/system/SysBusinessCodeRuleList.vue
new file mode 100644
index 0000000..df1b693
--- /dev/null
+++ b/src/views/system/SysBusinessCodeRuleList.vue
@@ -0,0 +1,177 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 鏌ヨ鍖哄煙 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="涓氬姟鍚嶇О">
+              <j-input placeholder="璇疯緭鍏ヤ笟鍔″悕绉�" v-model="queryParam.businessName"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="涓氬姟缂栫爜">
+              <j-input placeholder="璇疯緭鍏ヤ笟鍔$紪鐮�" v-model="queryParam.businessCode"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="缂栫爜鍓嶇紑">
+              <j-input placeholder="璇疯緭鍏ョ紪鐮佸墠缂�" v-model="queryParam.prefix"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <a-button type="info" @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">鏂板</a-button>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel">
+            <a-icon type="delete" />
+            鍒犻櫎
+          </a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 鎵归噺鎿嶄綔
+          <a-icon type="down" />
+        </a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table鍖哄煙-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 宸查�夋嫨 <a
+        style="font-weight: 600">{{ selectedRowKeys.length }}</a>椤�
+        <a style="margin-left: 24px" @click="onClearSelected">娓呯┖</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        class="j-table-force-nowrap"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">缂栬緫</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">鏇村 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="纭畾鍒犻櫎鍚�?" @confirm="() => handleDelete(record.id)">
+                  <a>鍒犻櫎</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table鍖哄煙-end -->
+
+    <!-- 琛ㄥ崟鍖哄煙 -->
+    <sysBusinessCodeRule-modal ref="modalForm" @ok="modalFormOk"></sysBusinessCodeRule-modal>
+  </a-card>
+</template>
+
+<script>
+import '@/assets/less/TableExpand.less'
+import SysBusinessCodeRuleModal from './modules/SysBusinessCodeRuleModal'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+export default {
+  name: 'SysBusinessCodeRuleList',
+  mixins: [JeecgListMixin],
+  components: {
+    SysBusinessCodeRuleModal
+  },
+  data() {
+    return {
+      description: '涓氬姟缂栫爜瑙勫垯绠$悊椤甸潰',
+      // 琛ㄥご
+      columns: [
+        {
+          title: '#',
+          dataIndex: '',
+          key: 'rowIndex',
+          width: 60,
+          align: 'center',
+          customRender: function(t, r, index) {
+            return parseInt(index) + 1
+          }
+        },
+        {
+          title: '涓氬姟鍚嶇О',
+          align: 'center',
+          dataIndex: 'businessName'
+        },
+        {
+          title: '涓氬姟缂栫爜',
+          align: 'center',
+          dataIndex: 'businessCode'
+        },
+        {
+          title: '缂栫爜鍓嶇紑',
+          align: 'center',
+          dataIndex: 'prefix'
+        },
+        {
+          title: '骞翠唤缂栫爜鏍煎紡',
+          align: 'center',
+          dataIndex: 'yearFormat'
+        },
+        {
+          title: '鏈堜唤缂栫爜鏍煎紡',
+          align: 'center',
+          dataIndex: 'monthFormat'
+        },
+        {
+          title: '澶╃紪鐮佹牸寮�',
+          align: 'center',
+          dataIndex: 'dayFormat'
+        },
+        {
+          title: '搴忓彿闀垮害',
+          align: 'center',
+          dataIndex: 'seqLength'
+        },
+        {
+          title: '鎿嶄綔',
+          dataIndex: 'action',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      url: {
+        list: '/sys/sysBusinessCodeRule/list',
+        delete: '/sys/sysBusinessCodeRule/delete',
+        deleteBatch: '/sys/sysBusinessCodeRule/deleteBatch',
+      }
+    }
+  },
+  computed: {
+  },
+  methods: {}
+}
+</script>
+<style scoped>
+@import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/system/SysParamsList.vue b/src/views/system/SysParamsList.vue
new file mode 100644
index 0000000..d066a27
--- /dev/null
+++ b/src/views/system/SysParamsList.vue
@@ -0,0 +1,214 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 鏌ヨ鍖哄煙 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鍙傛暟鍚嶇О">
+              <a-input placeholder="璇疯緭鍏ュ弬鏁板悕绉�" v-model="queryParam.settingName"/>
+            </a-form-item>
+          </a-col>
+
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <!-- <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">鏂板</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('绯荤粺鍙傛暟琛�')">瀵煎嚭</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">瀵煎叆</a-button>
+      </a-upload>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>鍒犻櫎</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 鎵归噺鎿嶄綔 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div> -->
+
+    <!-- table鍖哄煙-begin -->
+    <div>
+      <!-- <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 宸查�夋嫨 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>椤�
+        <a style="margin-left: 24px" @click="onClearSelected">娓呯┖</a>
+      </div> -->
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+        <span slot="rowIndex" slot-scope="text, record, index">
+          {{(ipagination.current-1)*ipagination.pageSize+index+1}}
+        </span>
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">鏃犲浘鐗�</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">鏃犳枃浠�</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="uploadFile(text)">
+            涓嬭浇
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+         <a @click="handleEdit(record)">缂栬緫</a>
+
+         <!--   <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">鏇村 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="纭畾鍒犻櫎鍚�?" @confirm="() => handleDelete(record.id)">
+                  <a>鍒犻櫎</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown> -->
+          <template>
+        <!-- <div v-if="record.settingValue=='OPEN'">
+          <a-switch @click="edit(record)" checked-children="寮�" un-checked-children="鍏�" default-checked />
+        </div>
+        <div v-else>
+          <a-switch @click="edit(record)" checked-children="寮�" un-checked-children="鍏�"  />
+        </div> -->
+      </template>
+        </span>
+
+        <!-- 瀛楃涓茶秴闀挎埅鍙栫渷鐣ュ彿鏄剧ず-->
+        <span slot="settingValue" slot-scope="text">
+          <j-ellipsis :value="text"/>
+        </span>
+      </a-table>
+    </div>
+
+    <sysParams-modal ref="modalForm" @ok="modalFormOk"></sysParams-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { httpAction } from '@/api/manage'
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import SysParamsModal from './modules/SysParamsModal'
+  import JDictSelectTag from '../../components/dict/JDictSelectTag.vue'
+
+  export default {
+    name: "SysParamsList",
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      JDictSelectTag,
+      SysParamsModal,
+    },
+    data () {
+      return {
+        description: '绯荤粺鍙傛暟琛ㄧ鐞嗛〉闈�',
+        // 琛ㄥご
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            scopedSlots: { customRender: 'rowIndex' }
+          },
+          {
+            title:'鍙傛暟鍚嶇О',
+            align:"center",
+            dataIndex: 'settingName'
+          },
+          {
+            title:'鍙傛暟閿�',
+            align:"center",
+            dataIndex: 'settingKey'
+          },
+          {
+            title:'鍙傛暟鍊�',
+            align:"center",
+            dataIndex: 'settingValue',
+            key: 'settingValue',
+            scopedSlots: { customRender: 'settingValue' }
+          },
+          {
+            title:'澶囨敞',
+            align:"center",
+            dataIndex: 'remark'
+          },
+          {
+            title: '鎿嶄綔',
+            dataIndex: 'action',
+            align:"center",
+            // fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/system/sysParams/list",
+          delete: "/system/sysParams/delete",
+          deleteBatch: "/system/sysParams/deleteBatch",
+          exportXlsUrl: "/system/sysParams/exportXls",
+          importExcelUrl: "system/sysParams/importExcel",
+          edit: "/system/sysParams/edit",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      initDictConfig(){
+      },
+      edit(sysParams) {
+        if(sysParams.settingValue == "CLOSE"){
+          sysParams.settingValue = "OPEN";
+        }else{
+          sysParams.settingValue = "CLOSE";
+        }
+      const that = this;
+        httpAction("/system/sysParams/edit",sysParams,'put').then((res)=>{
+        if(res.success){
+        }else{
+          that.$message.warning(res.message);
+        }
+      }).finally(() => {
+        that.confirmLoading = false;
+      })
+    },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/system/modules/SysBusinessCodeRuleModal.vue b/src/views/system/modules/SysBusinessCodeRuleModal.vue
new file mode 100644
index 0000000..af61492
--- /dev/null
+++ b/src/views/system/modules/SysBusinessCodeRuleModal.vue
@@ -0,0 +1,138 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    switchFullscreen
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="鍏抽棴">
+
+    <a-spin :spinning="confirmLoading">
+      <a-form-model ref="form" :model="model" :rules="validatorRules">
+        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="businessName" label="涓氬姟鍚嶇О">
+          <a-input placeholder="璇疯緭鍏ヤ笟鍔″悕绉�" v-model="model.businessName" />
+        </a-form-model-item>
+        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="businessCode" label="涓氬姟缂栫爜">
+          <a-input placeholder="璇疯緭鍏ヤ笟鍔$紪鐮�" v-model="model.businessCode" :disabled="editable" />
+        </a-form-model-item>
+        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="prefix" label="缂栫爜鍓嶇紑">
+          <a-input placeholder="璇疯緭鍏ョ紪鐮佸墠缂�" v-model="model.prefix" />
+        </a-form-model-item>
+        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="yearFormat" label="骞翠唤缂栫爜鏍煎紡">
+          <a-input placeholder="鍙傝�冩棩鏈熷勾浠界紪鐮佹牸寮�" v-model="model.yearFormat" />
+        </a-form-model-item>
+        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="monthFormat" label="鏈堜唤缂栫爜鏍煎紡">
+          <a-input placeholder="鍙傝�冩棩鏈熸湀浠界紪鐮佹牸寮�" v-model="model.monthFormat" />
+        </a-form-model-item>
+        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dayFormat" label="澶╃紪鐮佹牸寮�">
+          <a-input placeholder="鍙傝�冩棩鏈熷ぉ鐨勭紪鐮佹牸寮�" v-model="model.dayFormat" />
+        </a-form-model-item>
+        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="seqLength" label="搴忓彿闀垮害">
+          <a-input-number v-model="model.seqLength" :min="1" :max="10" :precision="0" />
+        </a-form-model-item>
+      </a-form-model>
+    </a-spin>
+  </j-modal>
+</template>
+
+<script>
+import { httpAction } from '@/api/manage'
+import { validateDuplicateValue } from '@/utils/util'
+
+export default {
+  name: 'SysBusinessCodeRuleModal',
+  data() {
+    return {
+      title: '鎿嶄綔',
+      visible: false,
+      editable: false,
+      model: {},
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 5 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 16 }
+      },
+      confirmLoading: false,
+      validatorRules: {
+        businessName: [
+          { required: true, message: '璇疯緭鍏ヤ笟鍔″悕绉�!' }
+        ],
+        businessCode: [
+          { required: true, message: '璇疯緭鍏ヤ笟鍔$紪鐮�!' },
+          { validator: (rule, value, callback) => validateDuplicateValue('sys_business_code_rule', 'business_code', value, this.model.id, callback) }
+        ],
+        seqLength: [
+          { required: true, message: '璇疯緭鍏ュ簭鍙烽暱搴�!' }
+        ]
+      },
+      url: {
+        add: '/sys/sysBusinessCodeRule/add',
+        edit: '/sys/sysBusinessCodeRule/edit'
+      }
+    }
+  },
+  created() {
+  },
+  methods: {
+    add() {
+      this.model = {};
+      this.model.seqLength = 4;
+      this.editable = false;
+      this.visible = true
+    },
+    edit(record) {
+      this.editable = true;
+      this.model = Object.assign({}, record)
+      this.visible = true
+    },
+    close() {
+      this.$emit('close')
+      this.visible = false
+      this.$refs.form.clearValidate()
+    },
+    handleOk() {
+      const that = this
+      // 瑙﹀彂琛ㄥ崟楠岃瘉
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          that.confirmLoading = true
+          let httpurl = ''
+          let method = ''
+          if (!this.model.id) {
+            httpurl += this.url.add
+            method = 'post'
+          } else {
+            httpurl += this.url.edit
+            method = 'put'
+          }
+          httpAction(httpurl, this.model, method).then((res) => {
+            if (res.success) {
+              that.$message.success(res.message)
+              that.$emit('ok')
+            } else {
+              that.$message.warning(res.message)
+            }
+          }).finally(() => {
+            that.confirmLoading = false
+            that.close()
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    handleCancel() {
+      this.close()
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/system/modules/SysParamsModal.vue b/src/views/system/modules/SysParamsModal.vue
new file mode 100644
index 0000000..aacd358
--- /dev/null
+++ b/src/views/system/modules/SysParamsModal.vue
@@ -0,0 +1,124 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    switchFullscreen
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="鍏抽棴">
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+
+        <a-form-item label="鍙傛暟閿�" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input disabled v-decorator="['settingKey']" placeholder="璇疯緭鍏ュ弬鏁伴敭"></a-input>
+        </a-form-item>
+        <a-form-item label="鍙傛暟鍊�" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="['settingValue']" placeholder="璇疯緭鍏ュ弬鏁板��"></a-input>
+        </a-form-item>
+        <a-form-item label="澶囨敞" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-textarea disabled v-decorator="['remark']" rows="4" placeholder="璇疯緭鍏ュ娉�"/>
+        </a-form-item>
+
+      </a-form>
+    </a-spin>
+  </j-modal>
+</template>
+
+<script>
+
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import { validateDuplicateValue } from '@/utils/util'
+
+
+  export default {
+    name: "SysParamsModal",
+    components: { 
+    },
+    data () {
+      return {
+        form: this.$form.createForm(this),
+        title:"鎿嶄綔",
+        width:800,
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+        },
+        url: {
+          add: "/system/sysParams/add",
+          edit: "/system/sysParams/edit",
+        }
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'settingKey','settingValue','remark'))
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 瑙﹀彂琛ㄥ崟楠岃瘉
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            console.log("琛ㄥ崟鎻愪氦鏁版嵁",formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+          }
+         
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+      popupCallback(row){
+        this.form.setFieldsValue(pick(row,'settingKey','settingValue','remark'))
+      },
+
+      
+    }
+  }
+</script>
\ No newline at end of file
diff --git a/vue.config.js b/vue.config.js
index 6b63aa1..ca3ba06 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -107,13 +107,13 @@
        },*/
       /* 娉ㄦ剰锛歫eecgboot鍓嶇鍋氫簡鏀归�狅紝姝ゅ涓嶉渶瑕侀厤缃法鍩熷拰鍚庡彴鎺ュ彛锛堝彧闇�瑕佹敼.env鐩稿叧閰嶇疆鏂囦欢鍗冲彲锛�
           issues/3462 寰堝浜烘澶勫仛浜嗛厤缃紝瀵艰嚧鍒锋柊鍓嶇404闂锛岃涓�瀹氭敞鎰�*/
-      '/api': {
-        target: 'http://192.168.124.118:9989',
+      '/jeecg-boot': {
+        target: 'http://localhost:9989',
         ws: false,
-        changeOrigin: true,
-        pathRewrite: {
-          '^/api': ''
-        }
+        changeOrigin: true
+        // pathRewrite: {
+        //   '^/api': ''
+        // }
       }
     }
   },

--
Gitblit v1.9.3