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>宸查�夋嫨 <a style='font-weight: 600'>{{ + selectedRowKeys.length }}</a>椤� + <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