diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowTaskController.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowTaskController.java index 3c15ca2..35fe130 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowTaskController.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowTaskController.java @@ -1,6 +1,8 @@ package com.ruoyi.flowable.controller; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.flowable.domain.dto.FlowTaskDto; import com.ruoyi.flowable.domain.vo.FlowTaskVo; import com.ruoyi.flowable.service.IFlowTaskService; @@ -119,6 +121,21 @@ public class FlowTaskController { return AjaxResult.success(); } + /** + * 认领/签收任务,并完成任务 + * @param flowTaskVo + * @return + */ + @ApiOperation(value = "认领/签收任务,并完成任务") + @PostMapping(value = "/claimAndComplete") + public AjaxResult claimAndComplete(@RequestBody FlowTaskVo flowTaskVo) { + SysUser sysUser = SecurityUtils.getLoginUser().getUser(); + flowTaskVo.setUserId(sysUser.getUserId().toString()); + flowTaskService.claim(flowTaskVo); + flowTaskService.complete(flowTaskVo); + return AjaxResult.success(); + } + @ApiOperation(value = "取消认领/签收任务") @PostMapping(value = "/unClaim") public AjaxResult unClaim(@RequestBody FlowTaskVo flowTaskVo) { diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java index 5097af0..652b549 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java @@ -740,21 +740,30 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask } map.put("flowList", hisFlowList); // // 查询当前任务是否完成 -// List taskList = taskService.createTaskQuery().processInstanceId(procInsId).list(); -// if (CollectionUtils.isNotEmpty(taskList)) { -// map.put("finished", true); -// } else { -// map.put("finished", false); -// } - } - // 第一次申请获取初始化表单 - if (StringUtils.isNotBlank(procInsId)) { + List taskList = taskService.createTaskQuery().processInstanceId(procInsId).list(); + if (CollectionUtils.isNotEmpty(taskList)) { + map.put("finished", true); + } else { + map.put("finished", false); + } + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() - .processInstanceId(procInsId) - .includeProcessVariables() - .singleResult(); - map.put("form", processInstance.getProcessVariables()); + .processInstanceId(procInsId) + .includeProcessVariables() + .singleResult(); + if (Objects.nonNull(processInstance)) { + map.put("form", processInstance.getProcessVariables()); + } else { + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(procInsId) + .includeProcessVariables() + .singleResult(); + Optional.of(historicProcessInstance) + .ifPresent(e -> map.put("form", historicProcessInstance.getProcessVariables())); + + } } + return AjaxResult.success(map); } diff --git a/ruoyi-ui/package-lock.json b/ruoyi-ui/package-lock.json index 539bac7..c2d2181 100644 --- a/ruoyi-ui/package-lock.json +++ b/ruoyi-ui/package-lock.json @@ -1731,6 +1731,15 @@ "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=", "dev": true }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, "cacache": { "version": "13.0.1", "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1616431125500&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz", @@ -1775,6 +1784,43 @@ "minimist": "^1.2.5" } }, + "portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "requires": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + } + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1593529658602&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", @@ -2380,13 +2426,9 @@ "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npm.taobao.org/async/download/async-2.6.3.tgz", - "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" }, "async-each": { "version": "1.0.3", @@ -9404,33 +9446,40 @@ } }, "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.28.tgz?cache=0&sync_timestamp=1596018197667&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fportfinder%2Fdownload%2Fportfinder-1.0.28.tgz", - "integrity": "sha1-Z8RiKFK9U3TdHdkA93n1NGL6x3g=", - "dev": true, + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz", + "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==", "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" }, "dependencies": { "debug": { - "version": "3.2.7", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.7.tgz?cache=0&sync_timestamp=1607566571506&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.2.7.tgz", - "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", - "dev": true, + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz", - "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", - "dev": true, + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -13299,6 +13348,15 @@ } } }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1610299285874&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", @@ -13437,6 +13495,21 @@ "path-exists": "^3.0.0" } }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", @@ -13452,6 +13525,28 @@ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, + "portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "requires": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz?cache=0&sync_timestamp=1615717425931&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz", diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index 53e612a..9947c2d 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -40,6 +40,7 @@ "axios": "0.24.0", "clipboard": "2.0.8", "core-js": "3.25.3", + "diagram-js": "^5.0.0", "echarts": "5.4.0", "element-ui": "2.15.10", "file-saver": "2.0.5", @@ -49,18 +50,18 @@ "js-cookie": "3.0.1", "jsencrypt": "3.0.0-rc.1", "nprogress": "0.2.0", + "portfinder": "^1.0.21", "quill": "1.3.7", "screenfull": "5.0.2", "sortablejs": "1.10.2", + "vkbeautify": "^0.99.3", "vue": "2.6.12", "vue-count-to": "1.0.13", "vue-cropper": "0.5.5", "vue-router": "3.4.9", "vuedraggable": "2.24.3", "vuex": "3.6.0", - "workflow-bpmn-modeler": "^0.2.8", - "diagram-js": "^5.0.0", - "vkbeautify": "^0.99.3" + "workflow-bpmn-modeler": "^0.2.8" }, "devDependencies": { "@vue/cli-plugin-babel": "4.4.6", @@ -88,5 +89,8 @@ "browserslist": [ "> 1%", "last 2 versions" - ] + ], + "resolutions": { + "@vue/cli-service/portfinder": "1.0.21" + } } diff --git a/ruoyi-ui/src/api/flowable/process.js b/ruoyi-ui/src/api/flowable/process.js index effce34..18f908e 100644 --- a/ruoyi-ui/src/api/flowable/process.js +++ b/ruoyi-ui/src/api/flowable/process.js @@ -18,6 +18,14 @@ export function complete(data) { data: data }) } +// 完成任务 +export function claimAndComplete(data) { + return request({ + url: '/flowable/task/claimAndComplete', + method: 'post', + data: data + }) +} // 取消申请 export function stopProcess(data) { diff --git a/ruoyi-ui/src/views/flowable/oa-project-flow.vue b/ruoyi-ui/src/views/flowable/oa-project-flow.vue index c6bf6a9..159256c 100644 --- a/ruoyi-ui/src/views/flowable/oa-project-flow.vue +++ b/ruoyi-ui/src/views/flowable/oa-project-flow.vue @@ -133,8 +133,8 @@ export default { /** 启动流程 */ startFlow(){ definitionStart(this.oaProjectFlowId, JSON.stringify(this.form)).then(res => { - this.msgSuccess(res.msg).then(() => this.$router.push('/task/process')); - + this.msgSuccess(res.msg); + this.$router.push('/task/process') }) }, /** 获取最新流程id */ getLatestIdByKey(){ diff --git a/ruoyi-ui/src/views/flowable/task/finished/index.vue b/ruoyi-ui/src/views/flowable/task/finished/index.vue index 899c65e..596d8da 100644 --- a/ruoyi-ui/src/views/flowable/task/finished/index.vue +++ b/ruoyi-ui/src/views/flowable/task/finished/index.vue @@ -52,14 +52,14 @@ - - - - - - - - + + + + + diff --git a/ruoyi-ui/src/views/flowable/task/record/index.vue b/ruoyi-ui/src/views/flowable/task/record/index.vue index 1df9a7f..9d5d708 100644 --- a/ruoyi-ui/src/views/flowable/task/record/index.vue +++ b/ruoyi-ui/src/views/flowable/task/record/index.vue @@ -71,7 +71,7 @@
- +
+
+ 提交 +
@@ -178,12 +181,12 @@ - - - - - - + +
+ 流程图 +
+ +
@@ -328,6 +331,7 @@ export default { }, // 遮罩层 loading: true, + applyIsRevoked: false, flowRecordList: [], // 流程流转数据 formConfCopy: {}, src: null, @@ -362,6 +366,7 @@ export default { issue: '', solution: '', }, + fileList: [], projectList: [], returnTaskList: [], // 回退列表数据 finished: 'false', @@ -492,6 +497,11 @@ export default { console.log("this.form ", this.form) if (this.taskForm.executionId === undefined) { this.formConfOpen = true + if (this.flowRecordList && this.flowRecordList.length !== 0) { + console.log("this.flowRecordList[0]", this.flowRecordList[0]) + this.applyIsRevoked = this.flowRecordList[0].taskName === '提交汇报'; + console.log("applyIsRevoked", this.applyIsRevoked) + } } // } }).catch(res => { @@ -559,6 +569,15 @@ export default { this.completeOpen = true; this.completeTitle = "审批流程"; this.getTreeselect(); + }, /** 确认并提交任务选择 */ + handleClaimAndComplete() { + this.taskForm.comment = '提交任务'; + this.taskForm.vars= JSON.stringify(this.form) + this.taskForm.taskId= this.flowRecordList[0].taskId + complete(this.taskForm).then(response => { + this.msgSuccess(response.msg); + this.goBack(); + }); }, /** 审批任务 */ taskComplete() { @@ -689,6 +708,12 @@ export default { this.taskForm.sendUserShow = true; this.returnTaskList = []; }, + handleRemove(file, fileList) { + console.log(file, fileList); + }, + handlePreview(file) { + console.log(file); + } } };