Commit 9f3b8ca8 authored by 赵啸非's avatar 赵啸非

工作流添加websocket相关

parent b41bafcd
...@@ -44,6 +44,12 @@ ...@@ -44,6 +44,12 @@
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
......
...@@ -89,7 +89,7 @@ public class FlowTaskPdu implements Serializable { ...@@ -89,7 +89,7 @@ public class FlowTaskPdu implements Serializable {
private String candidate; private String candidate;
@ApiModelProperty("任务创建时间") @ApiModelProperty("任务创建时间")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime; private Date createTime;
@ApiModelProperty("任务完成时间") @ApiModelProperty("任务完成时间")
...@@ -110,4 +110,7 @@ public class FlowTaskPdu implements Serializable { ...@@ -110,4 +110,7 @@ public class FlowTaskPdu implements Serializable {
@ApiModelProperty("审批组") @ApiModelProperty("审批组")
private List<String> candidateGroups; private List<String> candidateGroups;
@ApiModelProperty("租户Id")
private String tenantId;
} }
...@@ -48,4 +48,7 @@ public class FlowTaskVoPdu implements Serializable { ...@@ -48,4 +48,7 @@ public class FlowTaskVoPdu implements Serializable {
@ApiModelProperty("审批组") @ApiModelProperty("审批组")
private List<String> candidateGroups; private List<String> candidateGroups;
@ApiModelProperty("租户Id")
private String tenantId;
} }
package com.mortals.xhx.common.pdu.flow; package com.mortals.xhx.common.pdu.flow;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
...@@ -7,8 +8,19 @@ import java.io.Serializable; ...@@ -7,8 +8,19 @@ import java.io.Serializable;
@Data @Data
public class FlowUserTaskPdu implements Serializable { public class FlowUserTaskPdu implements Serializable {
/**
* 用户id
*/
private String id; private String id;
/**
* 用户名称
*/
private String name; private String name;
/**
* 租户Id
*/
private String tenantId;
} }
...@@ -28,7 +28,9 @@ public interface IApiFlowDefinitionFeign extends IFeign { ...@@ -28,7 +28,9 @@ public interface IApiFlowDefinitionFeign extends IFeign {
* @return * @return
*/ */
@PostMapping("/flowable/def/list") @PostMapping("/flowable/def/list")
ApiRespPdu<Result<FlowProcDefPdu>> list(@RequestParam(value = "userId") String userId,@RequestBody PageInfo pageInfo); ApiRespPdu<Result<FlowProcDefPdu>> list(@RequestParam(value = "userId") String userId,
@RequestParam(value = "tenantId") String tenantId,
@RequestBody PageInfo pageInfo);
/** /**
* 保存流程设计器内的xml文件 * 保存流程设计器内的xml文件
...@@ -41,7 +43,8 @@ public interface IApiFlowDefinitionFeign extends IFeign { ...@@ -41,7 +43,8 @@ public interface IApiFlowDefinitionFeign extends IFeign {
@PostMapping("/flowable/def/save") @PostMapping("/flowable/def/save")
ApiRespPdu<String> save(@RequestParam(required = false) String name, ApiRespPdu<String> save(@RequestParam(required = false) String name,
@RequestParam(required = false) String category, @RequestParam(required = false) String category,
@RequestParam(required = false) String bpmnXml); @RequestParam(required = false) String bpmnXml,
@RequestParam(required = false) String tenantId);
/** /**
* 启动流程 * 启动流程
...@@ -55,6 +58,7 @@ public interface IApiFlowDefinitionFeign extends IFeign { ...@@ -55,6 +58,7 @@ public interface IApiFlowDefinitionFeign extends IFeign {
*/ */
@PostMapping("/flowable/def/start") @PostMapping("/flowable/def/start")
ApiRespPdu<String> start(@RequestParam(value = "procDefId") String procDefId, ApiRespPdu<String> start(@RequestParam(value = "procDefId") String procDefId,
@RequestParam(value = "tenantId") String tenantId,
@RequestParam(value = "userId") String userId, @RequestParam(value = "userId") String userId,
@RequestParam(value = "dataKey") String dataKey, @RequestParam(value = "dataKey") String dataKey,
@RequestBody Map<String, Object> variables); @RequestBody Map<String, Object> variables);
...@@ -68,7 +72,8 @@ public interface IApiFlowDefinitionFeign extends IFeign { ...@@ -68,7 +72,8 @@ public interface IApiFlowDefinitionFeign extends IFeign {
*/ */
@PostMapping(value = "/flowable/def/updateState") @PostMapping(value = "/flowable/def/updateState")
ApiRespPdu<String> updateState(@RequestParam Integer state, ApiRespPdu<String> updateState(@RequestParam Integer state,
@RequestParam String deployId); @RequestParam String deployId,
@RequestParam String tenantId);
/** /**
* 删除流程 * 删除流程
......
...@@ -32,7 +32,9 @@ public interface IApiFlowTaskFeign extends IFeign { ...@@ -32,7 +32,9 @@ public interface IApiFlowTaskFeign extends IFeign {
* @return * @return
*/ */
@PostMapping("/flowable/task/myProcess") @PostMapping("/flowable/task/myProcess")
ApiRespPdu<Result<FlowTaskPdu>> myProcess(@RequestParam(value = "userId") String userId,@RequestBody PageInfo pageInfo); ApiRespPdu<Result<FlowTaskPdu>> myProcess(@RequestParam(value = "userId") String userId,
@RequestParam(value = "tenantId") String tenantId,
@RequestBody PageInfo pageInfo);
/** /**
...@@ -65,6 +67,7 @@ public interface IApiFlowTaskFeign extends IFeign { ...@@ -65,6 +67,7 @@ public interface IApiFlowTaskFeign extends IFeign {
*/ */
@PostMapping("/flowable/task/todoList") @PostMapping("/flowable/task/todoList")
ApiRespPdu<Result<FlowTaskPdu>> todoList(@RequestParam(value = "userId") String userId, ApiRespPdu<Result<FlowTaskPdu>> todoList(@RequestParam(value = "userId") String userId,
@RequestParam(value = "tenantId") String tenantId,
@RequestBody PageInfo pageInfo); @RequestBody PageInfo pageInfo);
...@@ -78,6 +81,7 @@ public interface IApiFlowTaskFeign extends IFeign { ...@@ -78,6 +81,7 @@ public interface IApiFlowTaskFeign extends IFeign {
*/ */
@PostMapping("/flowable/task/finishedList") @PostMapping("/flowable/task/finishedList")
ApiRespPdu<Result<FlowTaskPdu>> finishedList(@RequestParam(value = "userId") String userId, ApiRespPdu<Result<FlowTaskPdu>> finishedList(@RequestParam(value = "userId") String userId,
@RequestParam(value = "tenantId") String tenantId,
@RequestBody PageInfo pageInfo); @RequestBody PageInfo pageInfo);
...@@ -89,7 +93,7 @@ public interface IApiFlowTaskFeign extends IFeign { ...@@ -89,7 +93,7 @@ public interface IApiFlowTaskFeign extends IFeign {
* @return * @return
*/ */
@PostMapping("/flowable/task/flowRecord") @PostMapping("/flowable/task/flowRecord")
ApiRespPdu<List<FlowTaskPdu>> flowRecord(@RequestParam(required = false) String procInsId , ApiRespPdu<List<FlowTaskPdu>> flowRecord(@RequestParam(required = false) String procInsId,
@RequestParam(required = false) String deployId); @RequestParam(required = false) String deployId);
/** /**
......
/*
package com.mortals.coops.tools.message.service;
import org.springframework.messaging.MessageChannel;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
*/
/**
* 发送消息到消息中间件
*
* @author karlhoo
*//*
@Validated
public interface IMessageService {
*/
/**
* 向指定通道发送消息
*
* @param messageChannel
* @param message
* @return true: 成功
*//*
boolean sendMessage(@NotNull(message = "messageChannel不能为null") MessageChannel messageChannel, @NotBlank(message = "message不能为空") String message);
*/
/**
* 向指定通道发送消息(带messageKey)
*
* @param messageChannel
* @param message
* @param messageKey
* @return true: 成功
*//*
boolean sendMessage(@NotNull(message = "messageChannel不能为null") MessageChannel messageChannel, @NotBlank(message = "message不能为空") String message, String messageKey);
}
*/
//package com.mortals.coops.tools.message.service.impl;
//
//import com.mortals.coops.tools.message.service.IMessageService;
//import lombok.extern.apachecommons.CommonsLog;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
//import org.springframework.kafka.support.KafkaHeaders;
//import org.springframework.messaging.Message;
//import org.springframework.messaging.MessageChannel;
//import org.springframework.messaging.support.MessageBuilder;
//import org.springframework.stereotype.Service;
//
///**
// * @author karlhoo
// */
//
//@CommonsLog
//@Service
//@ConditionalOnProperty("spring.cloud.stream.kafka.binder.brokers")
//public class DefaultMessageServiceImpl implements IMessageService {
// @Override
// public boolean sendMessage(MessageChannel messageChannel, String message) {
// return sendMessage(messageChannel, message, null);
// }
//
// @Override
// public boolean sendMessage(MessageChannel messageChannel, String message, String messageKey) {
// return sendMessage(messageChannel, MessageBuilder.withPayload(message).setHeader(KafkaHeaders.MESSAGE_KEY, messageKey == null ? messageKey : messageKey.getBytes()).build());
// }
//
// private boolean sendMessage(MessageChannel messageChannel, Message message) {
// try {
// return messageChannel.send(message);
// } catch (Exception e) {
// log.error(String.format("提交消息出错 messageChannel: %s, message: %s", messageChannel.toString(), message.getPayload()), e);
// return false;
// }
// }
//}
//
...@@ -23,11 +23,13 @@ ...@@ -23,11 +23,13 @@
"js-beautify": "1.13.0", "js-beautify": "1.13.0",
"js-cookie": "2.2.1", "js-cookie": "2.2.1",
"jsencrypt": "3.0.0-rc.1", "jsencrypt": "3.0.0-rc.1",
"json-bigint": "^0.3.0",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"quill": "1.3.7", "quill": "1.3.7",
"screenfull": "5.0.2", "screenfull": "5.0.2",
"sockjs-client": "^1.5.1",
"sortablejs": "1.10.2", "sortablejs": "1.10.2",
"json-bigint": "^0.3.0", "stompjs": "^2.3.3",
"v-charts": "^1.17.10", "v-charts": "^1.17.10",
"vkbeautify": "^0.99.3", "vkbeautify": "^0.99.3",
"vue": "^2.6.14", "vue": "^2.6.14",
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> <link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>哎欧梯智能-产品生产周期管理PLM</title> <title>工作流管理平台</title>
<link rel="stylesheet" href="https://unpkg.com/element-ui@2.13.2/lib/theme-chalk/index.css"> <link rel="stylesheet" href="https://unpkg.com/element-ui@2.13.2/lib/theme-chalk/index.css">
</head> </head>
<body> <body>
......
...@@ -22,11 +22,6 @@ export function getProcessVariables(taskId) { ...@@ -22,11 +22,6 @@ export function getProcessVariables(taskId) {
// 激活/挂起流程 // 激活/挂起流程
export function updateState(params) { export function updateState(params) {
return normalCallPost('/flowable/definition/updateState', params) return normalCallPost('/flowable/definition/updateState', params)
// return request({
// url: '/flowable/definition/updateState',
// method: 'put',
// params: params
// })
} }
// 指定流程办理人员列表 // 指定流程办理人员列表
...@@ -39,8 +34,9 @@ export function userList(query) { ...@@ -39,8 +34,9 @@ export function userList(query) {
// }) // })
} }
// 指定流程办理组列表 // 指定流程办理组列表(由角色确定)
export function roleList(query) { export function roleList(query) {
return normalCallPost('/role/list', query)
// return request({ // return request({
// url: '/flowable/definition/roleList', // url: '/flowable/definition/roleList',
// method: 'get', // method: 'get',
...@@ -90,6 +86,8 @@ export function updateDeployment(data) { ...@@ -90,6 +86,8 @@ export function updateDeployment(data) {
// 删除流程定义 // 删除流程定义
export function delDeployment(query) { export function delDeployment(query) {
// /{id:[formId]}
return normalCallPost('/flowable/definition/deleteDefinition', {deployId:[query.deployId]})
// return request({ // return request({
// url: '/flowable/definition/delete/', // url: '/flowable/definition/delete/',
// method: 'delete', // method: 'delete',
...@@ -99,6 +97,7 @@ export function delDeployment(query) { ...@@ -99,6 +97,7 @@ export function delDeployment(query) {
// 导出流程定义 // 导出流程定义
export function exportDeployment(query) { export function exportDeployment(query) {
return normalCallPost('/flowable/definition/export', query)
// return request({ // return request({
// url: '/system/deployment/export', // url: '/system/deployment/export',
// method: 'get', // method: 'get',
......
...@@ -4,7 +4,7 @@ import {normalCallPost} from '@/assets/utils/index'; ...@@ -4,7 +4,7 @@ import {normalCallPost} from '@/assets/utils/index';
// 查询已办任务列表 // 查询已办任务列表
export function finishedList(query) { export function finishedList(query) {
return normalCallPost('/flowable/definition/list', query) return normalCallPost('/task/finish/list', query)
// return request({ // return request({
// url: '/flowable/task/finishedList', // url: '/flowable/task/finishedList',
...@@ -26,6 +26,7 @@ export function flowRecord(query) { ...@@ -26,6 +26,7 @@ export function flowRecord(query) {
// 撤回任务 // 撤回任务
export function revokeProcess(data) { export function revokeProcess(data) {
return normalCallPost('/task/process/revokeProcess', query)
// return request({ // return request({
// url: '/flowable/task/revokeProcess', // url: '/flowable/task/revokeProcess',
// method: 'post', // method: 'post',
......
...@@ -61,6 +61,10 @@ export function addDeployForm(data) { ...@@ -61,6 +61,10 @@ export function addDeployForm(data) {
// 导出流程表单 // 导出流程表单
export function exportForm(query) { export function exportForm(query) {
return normalCallPost(
"/form/export",
query
)
// return request({ // return request({
// url: '/flowable/form/export', // url: '/flowable/form/export',
// method: 'get', // method: 'get',
......
import {normalCallPost} from '@/assets/utils/index'; import {normalCallPost} from '@/assets/utils/index';
// 查询待办任务列表
export function todoList(query) {
// return request({
// url: '/flowable/task/todoList',
// method: 'get',
// params: query
// })
}
// 完成任务 // 完成任务
export function complete(data) { export function complete(data) {
return normalCallPost('/task/process/complete', data) return normalCallPost('/task/process/complete', data)
// return request({
// url: '/flowable/task/complete',
// method: 'post',
// data: data
// })
} }
// 委派任务 // 委派任务
export function delegate(data) { export function delegate(data) {
return normalCallPost('/task/process/delegate', data)
// return request({ // return request({
// url: '/flowable/task/delegate', // url: '/flowable/task/delegate',
// method: 'post', // method: 'post',
...@@ -30,6 +19,7 @@ export function delegate(data) { ...@@ -30,6 +19,7 @@ export function delegate(data) {
// 退回任务 // 退回任务
export function returnTask(data) { export function returnTask(data) {
return normalCallPost('/task/process/return', data)
// return request({ // return request({
// url: '/flowable/task/return', // url: '/flowable/task/return',
// method: 'post', // method: 'post',
...@@ -39,15 +29,13 @@ export function returnTask(data) { ...@@ -39,15 +29,13 @@ export function returnTask(data) {
// 驳回任务 // 驳回任务
export function rejectTask(data) { export function rejectTask(data) {
// return request({ return normalCallPost('/task/process/reject', data)
// url: '/flowable/task/reject',
// method: 'post',
// data: data
// })
} }
// 可退回任务列表 // 可退回任务列表
export function returnList(data) { export function returnList(data) {
return normalCallPost('/task/process/returnList', data)
// return request({ // return request({
// url: '/flowable/task/returnList', // url: '/flowable/task/returnList',
// method: 'post', // method: 'post',
......
...@@ -20,11 +20,12 @@ export class TreeCache extends Cache { ...@@ -20,11 +20,12 @@ export class TreeCache extends Cache {
} }
async getData() { async getData() {
const result = await super.getData(); const result = await super.getData();
const data = result.map(i=>{ const data = result.map(item=>{
if(!i.parentId) { //console.log(i)
i.parentId = -1; if(!item.parentId) {
item.parentId = -1;
} }
return i; return item;
}); });
return this.cache.data = data; return this.cache.data = data;
} }
...@@ -69,7 +70,7 @@ export class TreeCache extends Cache { ...@@ -69,7 +70,7 @@ export class TreeCache extends Cache {
export const treeCache = new TreeCache('/area/list', 6000); export const treeCache = new TreeCache('/data/area/list', 6000);
/** /**
* 获取父级节点的id列表 * 获取父级节点的id列表
...@@ -136,6 +137,7 @@ export function getParentName(id, list, arr, name) { ...@@ -136,6 +137,7 @@ export function getParentName(id, list, arr, name) {
*/ */
export function buildTree(pid, list) { export function buildTree(pid, list) {
const data = list.filter(i=>pid == i.parentId); const data = list.filter(i=>pid == i.parentId);
return data.length ? data.map(i=>{ return data.length ? data.map(i=>{
return { return {
value: i.id, value: i.id,
......
...@@ -152,7 +152,7 @@ export default { ...@@ -152,7 +152,7 @@ export default {
label: '指定人员', label: '指定人员',
allowCreate: true, allowCreate: true,
filterable: true, filterable: true,
dic: { data: _this.users, label: 'nickName', value: 'userId' }, dic: { data: _this.users, label: 'realName', value: 'id' },
show: !!_this.showConfig.assignee && _this.formData.userType === 'assignee' show: !!_this.showConfig.assignee && _this.formData.userType === 'assignee'
}, },
{ {
...@@ -162,7 +162,7 @@ export default { ...@@ -162,7 +162,7 @@ export default {
multiple: true, multiple: true,
allowCreate: true, allowCreate: true,
filterable: true, filterable: true,
dic: { data: _this.users, label: 'nickName', value: 'userId' }, dic: { data: _this.users, label: 'realName', value: 'id' },
show: !!_this.showConfig.candidateUsers && _this.formData.userType === 'candidateUsers' show: !!_this.showConfig.candidateUsers && _this.formData.userType === 'candidateUsers'
}, },
{ {
......
...@@ -36,12 +36,14 @@ const router = new Router({ ...@@ -36,12 +36,14 @@ const router = new Router({
builder('tool/build/index', 'tool/build/index'),//表单设计器 builder('tool/build/index', 'tool/build/index'),//表单设计器
builder('flowable/task/record/index', 'flowable/task/record/index'),//流程申请 builder('flowable/task/record/index', 'flowable/task/record/index'),//流程申请
...restBuilder('task/process', 'flowable/task/process'), //我的流程 ...restBuilder('task/process', 'flowable/task/process'), //我的流程
...restBuilder('task/todo', 'flowable/task/todo'), //代办列表 ...restBuilder('task/todo', 'flowable/task/todo'), //代办列表
...restBuilder('task/finish', 'flowable/task/finished'), //已办列表
...restBuilder('device', 'device'), // 设备管理-连接历史 ...restBuilder('device', 'device'), // 设备管理-连接历史
//在此添加业务模块 //在此添加业务模块
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
style="margin-left: 10px" style="margin-left: 10px"
icon="el-icon-tickets" icon="el-icon-tickets"
size="mini" size="mini"
disabled
@click="handleExport" @click="handleExport"
>导出</el-button >导出</el-button
> >
...@@ -65,6 +66,22 @@ ...@@ -65,6 +66,22 @@
提示:仅允许导入“bpmn20.xml”格式文件! 提示:仅允许导入“bpmn20.xml”格式文件!
</div> </div>
</el-upload> </el-upload>
<el-form-item
label="区域"
prop="parentId"
>
<el-cascader
@change='treeSelected'
:options="treeData"
change-on-select
v-model="selectedTreeID"
></el-cascader>
</el-form-item>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitFileForm">确 定</el-button> <el-button type="primary" @click="submitFileForm">确 定</el-button>
<el-button @click="upload.open = false">取 消</el-button> <el-button @click="upload.open = false">取 消</el-button>
...@@ -78,7 +95,7 @@ ...@@ -78,7 +95,7 @@
width="70%" width="70%"
append-to-body append-to-body
> >
<el-image :src="readImage.src"></el-image> <!-- <el-image :src="readImage.src"></el-image> -->
<flow :xmlData="xmlData" /> <flow :xmlData="xmlData" />
</el-dialog> </el-dialog>
...@@ -115,6 +132,7 @@ ...@@ -115,6 +132,7 @@
</template> </template>
<script> <script>
import { treeCache } from "@/assets/utils/tree";
import { import {
listDefinition, listDefinition,
updateState, updateState,
...@@ -148,6 +166,7 @@ export default { ...@@ -148,6 +166,7 @@ export default {
// }); // });
// }, // },
// 取消按钮 // 取消按钮
cancel() { cancel() {
this.open = false; this.open = false;
this.reset(); this.reset();
...@@ -186,25 +205,17 @@ export default { ...@@ -186,25 +205,17 @@ export default {
}); });
}, },
/** 流程图查看 */ /** 流程图查看 */
handleReadImage(deploymentId) { handleReadImage(row) {
console.log("流程图查看"); console.log("流程图查看");
this.$post("/flowable/definition/readImage", {
deployId: deploymentId,
}).then(({ data }) => {
this.readImage.title = "流程图"; this.readImage.title = "流程图";
this.readImage.open = true; this.readImage.open = true;
this.readImage.src = data.src;
// this.data = data.result;
});
// this.readImage.src = process.env.VUE_APP_BASE_API + "/flowable/definition/readImage/" + deploymentId; // this.readImage.src = process.env.VUE_APP_BASE_API + "/flowable/definition/readImage/" + deploymentId;
// 发送请求,获取xml // 发送请求,获取xml
// readXml(deploymentId).then(res =>{ readXml(row.deploymentId).then(res =>{
// this.xmlData = res.data this.xmlData = res.data
// }) })
}, },
/** 表单查看 */ /** 表单查看 */
handleForm(formId) { handleForm(formId) {
...@@ -216,6 +227,14 @@ export default { ...@@ -216,6 +227,14 @@ export default {
this.formConf = JSON.parse(res.data.entity.formContent); this.formConf = JSON.parse(res.data.entity.formContent);
}); });
}, },
readXml(row) {
definitionStart(row.id).then((res) => {
this.msgSuccess(res.msg);
});
},
/** 启动流程 */ /** 启动流程 */
handleDefinitionStart(row) { handleDefinitionStart(row) {
console.log("启动流程"); console.log("启动流程");
...@@ -276,7 +295,7 @@ export default { ...@@ -276,7 +295,7 @@ export default {
state: state state: state
} }
updateState(params).then(res => { updateState(params).then(res => {
this.message.success("修改成功"); this.$message.success("更新成功!");
this.getData(); this.getData();
}); });
}, },
...@@ -324,8 +343,9 @@ export default { ...@@ -324,8 +343,9 @@ export default {
}).then(function() { }).then(function() {
return delDeployment(params); return delDeployment(params);
}).then(() => { }).then(() => {
this.getList(); this.$message.success("删除成功");
this.msgSuccess("删除成功"); this.getData();
}) })
}, },
/** 导出按钮操作 */ /** 导出按钮操作 */
...@@ -348,20 +368,20 @@ export default { ...@@ -348,20 +368,20 @@ export default {
}, },
// 文件上传中处理 // 文件上传中处理
handleFileUploadProgress(event, file, fileList) { handleFileUploadProgress(event, file, fileList) {
//this.upload.isUploading = true; this.upload.isUploading = true;
}, },
// 文件上传成功处理 // 文件上传成功处理
handleFileSuccess(response, file, fileList) { handleFileSuccess(response, file, fileList) {
// this.upload.open = false; this.upload.open = false;
// this.upload.isUploading = false; this.upload.isUploading = false;
// this.$refs.upload.clearFiles(); this.$refs.upload.clearFiles();
// this.$message(response.msg); this.$message.success(response.msg);
// this.getList(); this.getData();
}, },
// 提交上传文件 // 提交上传文件
submitFileForm() { submitFileForm() {
console.log("上传附件"); console.log("上传附件");
// this.$refs.upload.submit(); this.$refs.upload.submit();
}, },
}, },
data() { data() {
...@@ -407,8 +427,8 @@ export default { ...@@ -407,8 +427,8 @@ export default {
// 设置上传的请求头部 // 设置上传的请求头部
// headers: { Authorization: "Bearer " + getToken() }, // headers: { Authorization: "Bearer " + getToken() },
// 上传的地址 // 上传的地址
//url: process.env.VUE_APP_BASE_API + "/flowable/definition/import" url: "/m/flowable/definition/upload",
url: "",
}, },
// 查询参数 // 查询参数
queryParams: { queryParams: {
...@@ -465,7 +485,19 @@ export default { ...@@ -465,7 +485,19 @@ export default {
{ {
prop: "name", prop: "name",
label: "流程名称", label: "流程名称(流程图)",
formatter: row => {
return (
<el-button
type="text"
onClick={() => {
this.handleReadImage(row);
}}
>
{row.name}
</el-button>
)
}
}, },
{ {
...@@ -482,7 +514,7 @@ export default { ...@@ -482,7 +514,7 @@ export default {
<el-button <el-button
type="text" type="text"
onClick={() => { onClick={() => {
this.handleReadImage(row.deploymentId); this.handleForm(row.formId);
}} }}
> >
{row.formName} {row.formName}
......
<template> <template>
<div>
<div> <Breadcrumb slot="breadcrumb" :list="breadcrumbList"></Breadcrumb>
<Breadcrumb slot='breadcrumb' :list='breadcrumbList'></Breadcrumb>
<bpmn-modeler <bpmn-modeler
ref="refNode" ref="refNode"
:xml="xml" :xml="xml"
...@@ -14,7 +13,12 @@ ...@@ -14,7 +13,12 @@
@dataType="dataType" @dataType="dataType"
/> />
<!--在线查看xml--> <!--在线查看xml-->
<el-dialog :title="xmlTitle" :visible.sync="xmlOpen" width="60%" append-to-body> <el-dialog
:title="xmlTitle"
:visible.sync="xmlOpen"
width="60%"
append-to-body
>
<div> <div>
<pre v-highlight> <pre v-highlight>
<code class="xml"> <code class="xml">
...@@ -28,43 +32,54 @@ ...@@ -28,43 +32,54 @@
<script> <script>
//import form from "@/assets/mixins/form"; //import form from "@/assets/mixins/form";
import table from "@/assets/mixins/table"; import table from "@/assets/mixins/table";
import {readXml, roleList, saveXml, userList} from "@/api/flowable/definition"; import {
import bpmnModeler from '@/components/Process/index' readXml,
import vkbeautify from 'vkbeautify' roleList,
import Hljs from 'highlight.js' saveXml,
import 'highlight.js/styles/atom-one-dark.css' userList,
} from "@/api/flowable/definition";
import bpmnModeler from "@/components/Process/index";
import vkbeautify from "vkbeautify";
import Hljs from "highlight.js";
import "highlight.js/styles/atom-one-dark.css";
export default { export default {
name: "Model", name: "Model",
// mixins: [form], // mixins: [form],
components: { components: {
bpmnModeler, bpmnModeler,
vkbeautify vkbeautify,
}, },
// 自定义指令 // 自定义指令
directives: { directives: {
highlight:(el) => { highlight: (el) => {
let blocks = el.querySelectorAll('pre code'); let blocks = el.querySelectorAll("pre code");
blocks.forEach((block) => { blocks.forEach((block) => {
Hljs.highlightBlock(block) Hljs.highlightBlock(block);
}) });
} },
}, },
data() { data() {
return { return {
breadcrumbList:[{name:'测试1'},{name:'测试2'}], breadcrumbList: [
{ name: "流程管理", path: "" },
{ name: "流程定义", path: "/flowable/definition/list" },
{ name: "流程", path: "" },
],
xml: "", // 后端查询到的xml xml: "", // 后端查询到的xml
modeler:"", modeler: "",
xmlOpen: false, xmlOpen: false,
xmlTitle: '', xmlTitle: "",
xmlContent: '', xmlContent: "",
users: [], users: [],
groups: [], groups: [],
categorys: [], categorys: [
{ dictLabel: "测试分类一", dictValue: "测试分类一" },
{ dictLabel: "测试分类二", dictValue: "测试分类二" },
],
}; };
}, },
created () { created() {
const deployId = this.$route.query && this.$route.query.deployId; const deployId = this.$route.query && this.$route.query.deployId;
// 查询流程xml // 查询流程xml
if (deployId) { if (deployId) {
...@@ -72,22 +87,22 @@ export default { ...@@ -72,22 +87,22 @@ export default {
this.getModelDetail(deployId); this.getModelDetail(deployId);
} }
console.log("新增"); console.log("新增");
// this.getDicts("sys_process_category").then(res => { // this.getDicts("processCategory").then(res => {
// console.log(res);
// this.categorys = res.data; // this.categorys = res.data;
// }); // });
// this.getDataList() this.getDataList();
}, },
methods: { methods: {
/** xml 文件 */ /** xml 文件 */
getModelDetail(deployId) { getModelDetail(deployId) {
console.log("发送请求,获取xml"); console.log("发送请求,获取xml");
// 发送请求,获取xml // 发送请求,获取xml
readXml(deployId).then(res =>{ readXml(deployId).then((res) => {
console.log(res); // console.log(res);
this.xml = res.data; this.xml = res.data;
this.modeler = res.data this.modeler = res.data;
}) });
}, },
/** 保存xml */ /** 保存xml */
save(data) { save(data) {
...@@ -95,15 +110,14 @@ export default { ...@@ -95,15 +110,14 @@ export default {
const params = { const params = {
name: data.process.name, name: data.process.name,
category: data.process.category, category: data.process.category,
xml: data.xml xml: data.xml,
} };
saveXml(params).then(res => { saveXml(params).then((res) => {
this.$message.success(res.msg); this.$message.success(res.msg);
// 关闭当前标签页并返回上个页面 // 关闭当前标签页并返回上个页面
this.$store.dispatch("tagsView/delView", this.$route); this.$store.dispatch("tagsView/delView", this.$route);
this.$router.go(-1) this.$router.go(-1);
}) });
}, },
/** 指定流程办理人员列表 */ /** 指定流程办理人员列表 */
getDataList() { getDataList() {
...@@ -112,50 +126,62 @@ export default { ...@@ -112,50 +126,62 @@ export default {
// const params = { // const params = {
// //
// } // }
// userList().then(res =>{ userList().then((res) => {
// res.data.forEach(val =>{ console.log("userList", res);
res.data.result.forEach((item) => {
let arr = { realName: item.realName, id: item.id+""};
this.users.push(arr);
// val.userId = val.userId.toString(); // val.userId = val.userId.toString();
// }) });
// this.users = res.data; //this.users = res.data.result;
// let arr = {nickName: "流程发起人", userId: "${INITIATOR}"} let arr = { realName: "流程发起人", id: "${INITIATOR}" };
// this.users.push(arr) this.users.push(arr);
// });
// roleList().then(res =>{ console.log("users:"+this.users);
// res.data.forEach(val =>{
// val.roleId = val.roleId.toString(); });
// }) roleList().then(res =>{
res.data.result.forEach(item =>{
let arr = { roleName: item.name, roleId: item.id.toString()};
this.groups.push(arr);
})
// this.groups = res.data; // this.groups = res.data;
// }); });
}, },
/** 展示xml */ /** 展示xml */
showXML(data){ showXML(data) {
console.log("展示xml"); console.log("展示xml");
this.xmlTitle = 'xml查看'; this.xmlTitle = "xml查看";
this.xmlOpen = true; this.xmlOpen = true;
debugger //debugger
this.xmlContent = vkbeautify.xml(data); this.xmlContent = vkbeautify.xml(data);
}, },
/** 获取数据类型 */ /** 获取数据类型 */
dataType(data){ dataType(data) {
console.log("获取数据类型"); console.log("获取数据类型", data);
this.users = []; this.users = [];
this.groups = []; this.groups = [];
if (data) { if (data) {
if (data.dataType === 'dynamic') { if (data.dataType === "dynamic") {
if (data.userType === 'assignee') { if (data.userType === "assignee") {
this.users = [{nickName: "${INITIATOR}", userId: "${INITIATOR}"}, this.users = [
{nickName: "#{approval}", userId: "#{approval}"} { realName: "${INITIATOR}", id: "${INITIATOR}" },
] { realName: "#{approval}", id: "#{approval}" },
} else if (data.userType === 'candidateUsers') { ];
this.users = [ {nickName: "#{approval}", userId: "#{approval}"}] } else if (data.userType === "candidateUsers") {
this.users = [
{ realName: "#{approval}", id: "#{approval}" },
];
} else { } else {
this.groups = [{roleName: "#{approval}", roleId: "#{approval}"}] this.groups = [{ roleName: "#{approval}", roleId: "#{approval}" }];
} }
} else { } else {
this.getDataList() this.getDataList();
}
} }
} }
}, },
},
}; };
</script> </script>
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
<el-table-column label="流程名称" align="center" prop="name" /> <el-table-column label="流程名称" align="center" prop="name" />
<el-table-column label="流程版本" align="center"> <el-table-column label="流程版本" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag size="medium">v{{ scope.row.version }}</el-tag> <el-tag size="medium">{{ scope.row.version }}</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="流程分类" align="center" prop="category" /> <el-table-column label="流程分类" align="center" prop="category" />
...@@ -344,8 +344,9 @@ export default { ...@@ -344,8 +344,9 @@ export default {
}, },
{ {
prop: "assignee", prop: "assigneeName",
label: "办理人", label: "办理人",
formatter:this.formatter
}, },
{ {
......
...@@ -29,9 +29,9 @@ ...@@ -29,9 +29,9 @@
<el-select style="width: 50%" v-model="assignee" @change="handleCheckChange" :multiple="taskForm.multiple" placeholder="请选择"> <el-select style="width: 50%" v-model="assignee" @change="handleCheckChange" :multiple="taskForm.multiple" placeholder="请选择">
<el-option <el-option
v-for="item in userDataList" v-for="item in userDataList"
:key="item.userId" :key="item.loginName"
:label="item.nickName" :label="item.realName"
:value="item.userId"> :value="item.loginName">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -86,7 +86,7 @@ ...@@ -86,7 +86,7 @@
<el-card :body-style="{ padding: '10px' }"> <el-card :body-style="{ padding: '10px' }">
<label v-if="item.assigneeName" style="font-weight: normal;margin-right: 30px;">实际办理: {{item.assigneeName}} <el-tag type="info" size="mini">{{item.deptName}}</el-tag></label> <label v-if="item.assigneeName" style="font-weight: normal;margin-right: 30px;">实际办理: {{item.assigneeName}} <el-tag type="info" size="mini">{{item.deptName}}</el-tag></label>
<label v-if="item.candidate" style="font-weight: normal;margin-right: 30px;">候选办理: {{item.candidate}}</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 style="font-weight: normal">接收时间: </label><label style="color:#8a909c;font-weight: normal">{{formatterDate(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.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> <label v-if="item.duration" style="margin-left: 30px;font-weight: normal">耗时: </label><label style="color:#8a909c;font-weight: normal">{{item.duration}}</label>
...@@ -220,6 +220,25 @@ export default { ...@@ -220,6 +220,25 @@ export default {
// }, 1000) // }, 1000)
}, },
methods: { methods: {
formatterDate(time) {
let date = new Date(Number(time));
let Y = date.getFullYear() + '-';
let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
let D = this.panLeft(date.getDate()) + ' ';
let h = this.panLeft(date.getHours()) + ':';
let m = this.panLeft(date.getMinutes()) + ':';
let s = this.panLeft(date.getSeconds());
return Y+M+D+h+m+s;
},
panLeft(num){
return num < 10 ? '0'+num : num;
},
/** xml 文件 */ /** xml 文件 */
getModelDetail(deployId) { getModelDetail(deployId) {
// 发送请求,获取xml // 发送请求,获取xml
...@@ -274,7 +293,6 @@ export default { ...@@ -274,7 +293,6 @@ export default {
this.formConfOpen = true this.formConfOpen = true
} }
}).catch(res => { }).catch(res => {
console.log(2222);
this.goBack(); this.goBack();
}) })
}, },
......
...@@ -90,6 +90,7 @@ export default { ...@@ -90,6 +90,7 @@ export default {
return form; return form;
}, },
treeSelected(val) { treeSelected(val) {
console.log(val);
this.form.parentId = val.slice().pop(); this.form.parentId = val.slice().pop();
} }
}, },
......
...@@ -4,40 +4,237 @@ ...@@ -4,40 +4,237 @@
:model="form" :model="form"
:loading="loading" :loading="loading"
:rules="rules" :rules="rules"
size='small' size="small"
label-width='100px' label-width="100px"
ref="form" ref="form"
> >
<el-row> <el-row>
<Field label="参数名称" prop="name" v-model="form.name"/> <Field label="参数名称" prop="name" v-model="form.name" />
<Field label="一级组织" prop="firstOrganize" v-model="form.firstOrganize"/> <Field
<Field label="二级组织" prop="secondOrganize" v-model="form.secondOrganize"/> label="一级组织"
<Field label="参数有效状态" prop="validStatus" v-model="form.validStatus" :enumData='dict.validStatus' type='select' /> prop="firstOrganize"
<Field label="参数修改状态" prop="modStatus" v-model="form.modStatus" :enumData='dict.modStatus' type='select' /> v-model="form.firstOrganize"
<Field label="展现类型" prop="displayType" v-model="form.displayType" :enumData='dict.displayType' type='select' /> />
<Field label="参数键" prop="paramKey" v-model="form.paramKey" :span='24'/> <Field
<Field label="参数值" prop="paramValue" v-model="form.paramValue" :span='24'/> label="二级组织"
<Field label="备注" prop="remark" v-model="form.remark" :span='24'/> prop="secondOrganize"
v-model="form.secondOrganize"
/>
<Field
label="参数有效状态"
prop="validStatus"
v-model="form.validStatus"
:enumData="dict.validStatus"
type="select"
/>
<Field
label="参数修改状态"
prop="modStatus"
v-model="form.modStatus"
:enumData="dict.modStatus"
type="select"
/>
<Field
label="展现类型"
prop="displayType"
v-model="form.displayType"
:enumData="dict.displayType"
type="select"
/>
<Field
label="参数键"
prop="paramKey"
v-model="form.paramKey"
:span="24"
/>
<Field
label="参数值"
prop="paramValue"
v-model="form.paramValue"
:span="24"
/>
<Field label="备注" prop="remark" v-model="form.remark" :span="24" />
<el-col :span="12">
<el-form-item label="区域" prop="parentId">
<el-cascader
@change="treeSelected"
@active-item-change="handleAreaChange"
:options="treeData"
change-on-select
v-model="selectedTreeID"
></el-cascader>
</el-form-item>
</el-col>
</el-row> </el-row>
<form-buttons @submit='submitForm'/> <form-buttons @submit="submitForm" />
</el-form> </el-form>
</layout-form> </layout-form>
</template> </template>
<script> <script>
import form from '@/assets/mixins/form'; import form from "@/assets/mixins/form";
export default { export default {
mixins: [form], mixins: [form],
data() { async created() {
this.$post("/data/area/list", { "query.id": 1431 }, {})
.then((res) => {
const data = res.data.result.map((i) => {
console.log(i);
return { return {
toString: ['validStatus', 'modStatus', 'displayType'], value: i.id,
rules: { label: i.areaName,
name: [{ required: true, message: '请输入参数名称', trigger: 'blur' },], level: i.areaLevel,
paramKey: [{ required: true, message: '请输入参数键', trigger: 'blur' },], children: [],
paramValue: [{ required: true, message: '请输入参数值', trigger: 'blur' },], };
});
console.log(data);
this.treeData = data;
// for (let area of this.areaData) {
// if (val[0] === area.id) {
// area.childList = res.data.area;
// break;
// }
// }
})
.catch((error) => {
this.$message.error(error.message);
});
//this.treeData = await treeCache.getTree();
//this.form.parentId = this.query.pid;
}, },
methods: {
afterRender() {},
beforeSubmit(form) {
form.parentId = this.selectedTreeID.slice().pop();
return form;
},
treeSelected(val) {
console.log(val);
let id=val.slice().pop();
console.log(id);
this.$post("/data/area/view", { "id": [val.slice().pop()] }, {}).then((res) => {
console.log(res);
let areaCode=res.entity.areaCode;
console.log("areaCode:"+areaCode);
})
.catch((error) => {
this.$message.error(error.message);
});
this.form.parentId = val.slice().pop();
},
handleAreaChange(val) {
this.loading = true;
if (val.length <= 1) {
this.$post("/data/area/list", { "query.parentAreaId": val[0] }, {})
.then((res) => {
console.log(res);
for (let area of this.treeData) {
if (val[0] === area.value) {
const data = res.data.result.map((i) => {
return {
value: i.id,
label: i.areaName,
level: i.areaLevel,
children: [],
};
});
area.children = data;
break;
}
}
})
.catch((error) => {
this.$message.error(error.message);
});
} else if (val.length <= 2) {
this.$post("/data/area/list", { "query.parentAreaId": val[1] }, {})
.then((res) => {
for (let area of this.treeData) {
if (val[0] === area.value) {
for (let temp of area.children) {
if (val[1] === temp.value) {
const data = res.data.result.map((i) => {
return {
value: i.id,
label: i.areaName,
level: i.areaLevel,
children: [],
};
});
temp.children = data;
break;
} }
} }
} }
}
})
.catch((error) => {
this.$message.error(error.message);
});
} else if (val.length <= 3) {
this.$post("/data/area/list", { "query.parentAreaId": val[2] }, {})
.then((res) => {
for (let area of this.treeData) {
if (val[0] === area.value) {
for (let temp of area.children) {
if (val[1] === temp.value) {
for (let temp1 of temp.children) {
if (val[2] === temp1.value) {
const data = res.data.result.map((i) => {
return {
value: i.id,
label: i.areaName,
level: i.areaLevel,
};
});
temp1.children = data;
break;
}
}
}
}
}
}
})
.catch((error) => {
this.$message.error(error.message);
});
}
this.loading = false;
},
},
data() {
return {
treeData: [],
selectedTreeID: [],
toString: ["validStatus", "modStatus", "displayType"],
rules: {
name: [{ required: true, message: "请输入参数名称", trigger: "blur" }],
paramKey: [
{ required: true, message: "请输入参数键", trigger: "blur" },
],
paramValue: [
{ required: true, message: "请输入参数值", trigger: "blur" },
],
},
};
},
};
</script> </script>
...@@ -8,8 +8,15 @@ ...@@ -8,8 +8,15 @@
label-width='120px' label-width='120px'
ref="form" ref="form"
> >
<el-row> <el-row>
<Field label="任务名称" prop="name" v-model="form.name"/> <Field label="任务名称" prop="name" v-model="form.name"/>
<Field label="关键字" prop="taskKey" v-model="form.taskKey"/> <Field label="关键字" prop="taskKey" v-model="form.taskKey"/>
<Field label="执行服务" prop="excuteService" v-model="form.excuteService" :enumData='dict.excuteService' type='select' /> <Field label="执行服务" prop="excuteService" v-model="form.excuteService" :enumData='dict.excuteService' type='select' />
......
<template> <template>
<div class="page"> <div class="page">
<LayoutTable :data='tableData' :config='tableConfig' notAdd notDel /> <LayoutTable :data='tableData' :config='tableConfig' notDel />
<el-dialog title="用户已分配的角色" :visible.sync="role.visible"> <el-dialog title="用户已分配的角色" :visible.sync="role.visible">
<el-form :model="role.form"> <el-form :model="role.form">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
ref="form" ref="form"
> >
<el-row> <el-row>
<Field label="登录名称" prop="loginName" v-model="form.loginName" disabled/> <Field label="登录名称" prop="loginName" v-model="form.loginName" />
<Field label="登录密码" prop="loginPwd" v-model="form.loginPwd" v-if='pageInfo.type === "add"' /> <Field label="登录密码" prop="loginPwd" v-model="form.loginPwd" v-if='pageInfo.type === "add"' />
<Field label="用户昵称" prop="realName" v-model="form.realName" /> <Field label="用户昵称" prop="realName" v-model="form.realName" />
<Field label="手机号码" prop="mobile" v-model="form.mobile" /> <Field label="手机号码" prop="mobile" v-model="form.mobile" />
......
...@@ -524,7 +524,7 @@ export default { ...@@ -524,7 +524,7 @@ export default {
...this.formConf ...this.formConf
} }
console.log("表单JSON:",JSON.stringify(this.formData)); //console.log("表单JSON:",JSON.stringify(this.formData));
this.form.formContent = JSON.stringify(this.formData); this.form.formContent = JSON.stringify(this.formData);
this.formOpen = true; this.formOpen = true;
this.formTitle = "添加表单"; this.formTitle = "添加表单";
......
...@@ -2183,6 +2183,13 @@ buffer@^5.4.3: ...@@ -2183,6 +2183,13 @@ buffer@^5.4.3:
base64-js "^1.3.1" base64-js "^1.3.1"
ieee754 "^1.1.13" ieee754 "^1.1.13"
bufferutil@^4.0.1:
version "4.0.3"
resolved "https://registry.npm.taobao.org/bufferutil/download/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b"
integrity sha1-ZnJLdWvtI818KMTTBteZT5lDzGs=
dependencies:
node-gyp-build "^4.2.0"
builtin-status-codes@^3.0.0: builtin-status-codes@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.nlark.com/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" resolved "https://registry.nlark.com/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
...@@ -3173,6 +3180,14 @@ cyclist@^1.0.1: ...@@ -3173,6 +3180,14 @@ cyclist@^1.0.1:
resolved "https://registry.nlark.com/cyclist/download/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" resolved "https://registry.nlark.com/cyclist/download/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
d@1, d@^1.0.1:
version "1.0.1"
resolved "https://registry.nlark.com/d/download/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
integrity sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=
dependencies:
es5-ext "^0.10.50"
type "^1.0.1"
dashdash@^1.12.0: dashdash@^1.12.0:
version "1.14.1" version "1.14.1"
resolved "https://registry.nlark.com/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" resolved "https://registry.nlark.com/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
...@@ -3746,6 +3761,32 @@ es-to-primitive@^1.2.1: ...@@ -3746,6 +3761,32 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1" is-date-object "^1.0.1"
is-symbol "^1.0.2" is-symbol "^1.0.2"
es5-ext@^0.10.35, es5-ext@^0.10.50:
version "0.10.53"
resolved "https://registry.nlark.com/es5-ext/download/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1"
integrity sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE=
dependencies:
es6-iterator "~2.0.3"
es6-symbol "~3.1.3"
next-tick "~1.0.0"
es6-iterator@~2.0.3:
version "2.0.3"
resolved "https://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
dependencies:
d "1"
es5-ext "^0.10.35"
es6-symbol "^3.1.1"
es6-symbol@^3.1.1, es6-symbol@~3.1.3:
version "3.1.3"
resolved "https://registry.nlark.com/es6-symbol/download/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
integrity sha1-utXTwbzawoJp9MszHkMceKxwXRg=
dependencies:
d "^1.0.1"
ext "^1.1.2"
escalade@^3.1.1: escalade@^3.1.1:
version "3.1.1" version "3.1.1"
resolved "https://registry.nlark.com/escalade/download/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" resolved "https://registry.nlark.com/escalade/download/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
...@@ -4056,6 +4097,13 @@ express@^4.16.3, express@^4.17.1: ...@@ -4056,6 +4097,13 @@ express@^4.16.3, express@^4.17.1:
utils-merge "1.0.1" utils-merge "1.0.1"
vary "~1.1.2" vary "~1.1.2"
ext@^1.1.2:
version "1.4.0"
resolved "https://registry.nlark.com/ext/download/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244"
integrity sha1-ia56BxWPedNVF4gpBDJAd+Q3kkQ=
dependencies:
type "^2.0.0"
extend-shallow@^2.0.1: extend-shallow@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" resolved "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
...@@ -5458,7 +5506,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: ...@@ -5458,7 +5506,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
dependencies: dependencies:
has-symbols "^1.0.2" has-symbols "^1.0.2"
is-typedarray@~1.0.0: is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.nlark.com/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" resolved "https://registry.nlark.com/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
...@@ -6479,6 +6527,11 @@ neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: ...@@ -6479,6 +6527,11 @@ neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2:
resolved "https://registry.nlark.com/neo-async/download/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" resolved "https://registry.nlark.com/neo-async/download/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha1-tKr7k+OustgXTKU88WOrfXMIMF8= integrity sha1-tKr7k+OustgXTKU88WOrfXMIMF8=
next-tick@~1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/next-tick/download/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
nice-try@^1.0.4: nice-try@^1.0.4:
version "1.0.5" version "1.0.5"
resolved "https://registry.nlark.com/nice-try/download/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" resolved "https://registry.nlark.com/nice-try/download/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
...@@ -6496,6 +6549,11 @@ node-forge@^0.10.0: ...@@ -6496,6 +6549,11 @@ node-forge@^0.10.0:
resolved "https://registry.nlark.com/node-forge/download/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" resolved "https://registry.nlark.com/node-forge/download/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
integrity sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M= integrity sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M=
node-gyp-build@^4.2.0:
version "4.2.3"
resolved "https://registry.npm.taobao.org/node-gyp-build/download/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739"
integrity sha1-zmJ3+FODX3GIKe+0fbIPPk2cRzk=
node-gyp@^7.1.0: node-gyp@^7.1.0:
version "7.1.2" version "7.1.2"
resolved "https://registry.nlark.com/node-gyp/download/node-gyp-7.1.2.tgz?cache=0&sync_timestamp=1622168177958&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-gyp%2Fdownload%2Fnode-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" resolved "https://registry.nlark.com/node-gyp/download/node-gyp-7.1.2.tgz?cache=0&sync_timestamp=1622168177958&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-gyp%2Fdownload%2Fnode-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae"
...@@ -8559,9 +8617,9 @@ snapdragon@^0.8.1: ...@@ -8559,9 +8617,9 @@ snapdragon@^0.8.1:
source-map-resolve "^0.5.0" source-map-resolve "^0.5.0"
use "^3.1.0" use "^3.1.0"
sockjs-client@^1.5.0: sockjs-client@^1.5.0, sockjs-client@^1.5.1:
version "1.5.1" version "1.5.1"
resolved "https://registry.nlark.com/sockjs-client/download/sockjs-client-1.5.1.tgz#256908f6d5adfb94dabbdbd02c66362cca0f9ea6" resolved "https://registry.npm.taobao.org/sockjs-client/download/sockjs-client-1.5.1.tgz?cache=0&sync_timestamp=1616686625852&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsockjs-client%2Fdownload%2Fsockjs-client-1.5.1.tgz#256908f6d5adfb94dabbdbd02c66362cca0f9ea6"
integrity sha1-JWkI9tWt+5Tau9vQLGY2LMoPnqY= integrity sha1-JWkI9tWt+5Tau9vQLGY2LMoPnqY=
dependencies: dependencies:
debug "^3.2.6" debug "^3.2.6"
...@@ -8769,6 +8827,13 @@ stdout-stream@^1.4.0: ...@@ -8769,6 +8827,13 @@ stdout-stream@^1.4.0:
dependencies: dependencies:
readable-stream "^2.0.1" readable-stream "^2.0.1"
stompjs@^2.3.3:
version "2.3.3"
resolved "https://registry.npm.taobao.org/stompjs/download/stompjs-2.3.3.tgz#34178ac7bb8ee294cc5d554ad8b50f7f5459fd8e"
integrity sha1-NBeKx7uO4pTMXVVK2LUPf1RZ/Y4=
optionalDependencies:
websocket latest
stream-browserify@^2.0.1: stream-browserify@^2.0.1:
version "2.0.2" version "2.0.2"
resolved "https://registry.nlark.com/stream-browserify/download/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" resolved "https://registry.nlark.com/stream-browserify/download/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
...@@ -9348,6 +9413,23 @@ type-is@~1.6.17, type-is@~1.6.18: ...@@ -9348,6 +9413,23 @@ type-is@~1.6.17, type-is@~1.6.18:
media-typer "0.3.0" media-typer "0.3.0"
mime-types "~2.1.24" mime-types "~2.1.24"
type@^1.0.1:
version "1.2.0"
resolved "https://registry.nlark.com/type/download/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
integrity sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A=
type@^2.0.0:
version "2.5.0"
resolved "https://registry.nlark.com/type/download/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d"
integrity sha1-Ci54wud5B7JSq+XymMGwHGPw2z0=
typedarray-to-buffer@^3.1.5:
version "3.1.5"
resolved "https://registry.npm.taobao.org/typedarray-to-buffer/download/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
integrity sha1-qX7nqf9CaRufeD/xvFES/j/KkIA=
dependencies:
is-typedarray "^1.0.0"
typedarray@^0.0.6: typedarray@^0.0.6:
version "0.0.6" version "0.0.6"
resolved "https://registry.nlark.com/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" resolved "https://registry.nlark.com/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
...@@ -9522,6 +9604,13 @@ use@^3.1.0: ...@@ -9522,6 +9604,13 @@ use@^3.1.0:
resolved "https://registry.nlark.com/use/download/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" resolved "https://registry.nlark.com/use/download/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
integrity sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8= integrity sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=
utf-8-validate@^5.0.2:
version "5.0.5"
resolved "https://registry.nlark.com/utf-8-validate/download/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1"
integrity sha1-3TLC6CxyAC3J8C62e6Z2H0NFbKE=
dependencies:
node-gyp-build "^4.2.0"
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.nlark.com/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" resolved "https://registry.nlark.com/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
...@@ -9903,6 +9992,18 @@ websocket-extensions@>=0.1.1: ...@@ -9903,6 +9992,18 @@ websocket-extensions@>=0.1.1:
resolved "https://registry.nlark.com/websocket-extensions/download/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" resolved "https://registry.nlark.com/websocket-extensions/download/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
integrity sha1-f4RzvIOd/YdgituV1+sHUhFXikI= integrity sha1-f4RzvIOd/YdgituV1+sHUhFXikI=
websocket@latest:
version "1.0.34"
resolved "https://registry.npm.taobao.org/websocket/download/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"
integrity sha1-K9wmAsCL8sgiU7cwZVwO99yrMRE=
dependencies:
bufferutil "^4.0.1"
debug "^2.2.0"
es5-ext "^0.10.50"
typedarray-to-buffer "^3.1.5"
utf-8-validate "^5.0.2"
yaeti "^0.0.6"
which-boxed-primitive@^1.0.2: which-boxed-primitive@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.nlark.com/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" resolved "https://registry.nlark.com/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
...@@ -10026,6 +10127,11 @@ y18n@^5.0.5: ...@@ -10026,6 +10127,11 @@ y18n@^5.0.5:
resolved "https://registry.nlark.com/y18n/download/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" resolved "https://registry.nlark.com/y18n/download/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
integrity sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU= integrity sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=
yaeti@^0.0.6:
version "0.0.6"
resolved "https://registry.npm.taobao.org/yaeti/download/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
yallist@^2.1.2: yallist@^2.1.2:
version "2.1.2" version "2.1.2"
resolved "https://registry.nlark.com/yallist/download/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" resolved "https://registry.nlark.com/yallist/download/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
......
...@@ -61,6 +61,12 @@ ...@@ -61,6 +61,12 @@
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.5.2</version>
</dependency>
</dependencies> </dependencies>
......
package com.mortals.xhx; package com.mortals.xhx;
import com.mortals.framework.springcloud.boot.BaseWebApplication; import com.mortals.framework.springcloud.boot.BaseWebApplication;
import com.mortals.xhx.utils.stream.messaging.ProcessTaskSink;
import com.mortals.xhx.utils.stream.messaging.ProcessTaskSource;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.context.annotation.ImportResource; import org.springframework.context.annotation.ImportResource;
//import springfox.documentation.swagger2.annotations.EnableSwagger2; //import springfox.documentation.swagger2.annotations.EnableSwagger2;
...@@ -12,6 +15,7 @@ import org.springframework.context.annotation.ImportResource; ...@@ -12,6 +15,7 @@ import org.springframework.context.annotation.ImportResource;
@SpringBootApplication(scanBasePackages = {"com.mortals"}) @SpringBootApplication(scanBasePackages = {"com.mortals"})
@ServletComponentScan("com.mortals") @ServletComponentScan("com.mortals")
@ImportResource(locations = {"classpath:config/spring-config.xml"}) @ImportResource(locations = {"classpath:config/spring-config.xml"})
@EnableBinding({ProcessTaskSink.class})
public class ManagerApplication extends BaseWebApplication { public class ManagerApplication extends BaseWebApplication {
public static void main(String[] args) { public static void main(String[] args) {
......
package com.mortals.xhx.base.framework.annotation;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中,jvm加载class文件之后,仍存在
@Target(ElementType.METHOD) //注解添加的位置
@Documented
public @interface LogPrint {
String description() default "";
}
\ No newline at end of file
package com.mortals.xhx.base.framework.aspect;
import com.alibaba.fastjson.JSONObject;
import com.mortals.xhx.base.framework.annotation.LogPrint;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
@Aspect
@Component
@Profile({"dev", "test"}) //一般生产环境不允许日志打印参数
@Slf4j
public class LogPrintAspect {
/**
* 换行符
*/
private static final String LINE_SEPARATOR = System.lineSeparator();
/**
* 以自定义 @LogPrint 注解为切点
*/
//@Pointcut("@annotation(com.*.*.config.annotation.LogPrint)")
@Pointcut("execution(public * com.mortals.xhx..*Controller.*(..))")
public void logPrint() {
}
/**
* 在切点之前织入
*
* @param joinPoint
* @throws Throwable
*/
@Before("logPrint()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 开始打印请求日志
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 获取 @WebLog 注解的描述信息
String methodDescription = getAspectLogDescription(joinPoint);
// 打印请求相关参数
log.info("========================================== Start ==========================================");
// 打印请求 url
log.info("URL : {}", request.getRequestURL().toString());
// 打印描述信息
log.info("Description : {}", methodDescription);
// 打印 Http method
log.info("HTTP Method : {}", request.getMethod());
// 打印调用 controller 的全路径以及执行方法
log.info("Class Method : {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName());
// 打印请求的 IP
log.info("IP : {}", request.getRemoteAddr());
// 打印请求入参
log.info("Request Args : {}", getParams(joinPoint));
}
/**
* 在切点之后织入
*
* @throws Throwable
*/
@After("logPrint()")
public void doAfter() throws Throwable {
// 接口结束后换行,方便分割查看
log.info("=========================================== End ===========================================" + LINE_SEPARATOR);
}
/**
* 环绕
*
* @param proceedingJoinPoint
* @return
* @throws Throwable
*/
@Around("logPrint()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = proceedingJoinPoint.proceed();
// 打印出参
log.info("Response Args : {}", JSONObject.toJSONString(result));
// 执行耗时
log.info("Time-Consuming : {} ms", System.currentTimeMillis() - startTime);
return result;
}
/**
* 获取切面注解的描述
*
* @param joinPoint 切点
* @return 描述信息
* @throws Exception
*/
public String getAspectLogDescription(JoinPoint joinPoint)
throws Exception {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
StringBuilder description = new StringBuilder("");
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
description.append(method.getAnnotation(LogPrint.class).description());
break;
}
}
}
return description.toString();
}
private String getParams(JoinPoint joinPoint) {
String params = "";
if (joinPoint.getArgs() != null && joinPoint.getArgs().length > 0) {
for (int i = 0; i < joinPoint.getArgs().length; i++) {
Object arg = joinPoint.getArgs()[i];
if ((arg instanceof HttpServletResponse) || (arg instanceof HttpServletRequest)
|| (arg instanceof MultipartFile) || (arg instanceof MultipartFile[])) {
continue;
}
try {
params += JSONObject.toJSONString(joinPoint.getArgs()[i]);
} catch (Exception e1) {
log.error(e1.getMessage());
}
}
}
return params;
}
}
...@@ -62,28 +62,8 @@ public class OperlogAspect extends FileLogServiceImpl implements ILogService { ...@@ -62,28 +62,8 @@ public class OperlogAspect extends FileLogServiceImpl implements ILogService {
} else { } else {
logger.info("args={}", joinPoint.getArgs()); logger.info("args={}", joinPoint.getArgs());
} }
// logger.info("url={}", request.getRequestURL());
//
// // method
// logger.info("method={}", request.getMethod());
//
// // ip
// logger.info("ip={}", request.getRemoteAddr());
//
// // 类方法
// logger.info("class_method={}",
// joinPoint.getSignature().getDeclaringTypeName() + "." +
// joinPoint.getSignature().getName());
//
// // 参数
// logger.info("args={}", joinPoint.getArgs());
} }
// @After("sign()")
// public void doAfter() {
// logger.info("222222222222");
// }
@AfterReturning(returning = "object", pointcut = "accessLog()") @AfterReturning(returning = "object", pointcut = "accessLog()")
public void doAfterReturning(Object object) { public void doAfterReturning(Object object) {
......
...@@ -5,6 +5,7 @@ import java.util.Set; ...@@ -5,6 +5,7 @@ import java.util.Set;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
...@@ -30,6 +31,14 @@ public class InterceptorConfig { ...@@ -30,6 +31,14 @@ public class InterceptorConfig {
@Value("${application.auth.uncheckUrl}") @Value("${application.auth.uncheckUrl}")
private String uncheckAuthUrl; private String uncheckAuthUrl;
/**
* 工作流租户id
*/
@Value("${application.workflow.tenantId}")
@Getter
private String tenantId;
private Set<String> uncheckLoginUrls = new HashSet<>(); private Set<String> uncheckLoginUrls = new HashSet<>();
private Set<String> uncheckAuthUrls = new HashSet<>(); private Set<String> uncheckAuthUrls = new HashSet<>();
......
package com.mortals.xhx.base.framework.ws;
import com.mortals.xhx.base.framework.ws.websocket.WebSocketHandler;
import com.mortals.xhx.base.framework.ws.websocket.WebSocketShakeInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket // 开启 Spring WebSocket
public class WebSocketConfiguration implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(this.webSocketHandler(), "/ws") // 配置处理器
.addInterceptors(new WebSocketShakeInterceptor()) // 配置拦截器
.setAllowedOrigins("*"); // 解决跨域问题
}
@Bean
public WebSocketHandler webSocketHandler() {
return new WebSocketHandler();
}
@Bean
public WebSocketShakeInterceptor webSocketShakeInterceptor() {
return new WebSocketShakeInterceptor();
}
}
package com.mortals.xhx.base.framework.ws.handler;
import com.alibaba.fastjson.JSON;
import com.mortals.xhx.base.framework.ws.message.AuthRequest;
import com.mortals.xhx.base.framework.ws.message.AuthResponse;
import com.mortals.xhx.base.framework.ws.message.UserJoinNoticeRequest;
import com.mortals.xhx.base.framework.ws.util.WebSocketUtil;
import lombok.extern.apachecommons.CommonsLog;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.socket.WebSocketSession;
@Component
@CommonsLog
public class AuthMessageHandler implements MessageHandler<AuthRequest> {
@Override
public void execute(WebSocketSession session, AuthRequest message) {
log.info("receive message:"+ JSON.toJSONString(message));
// 如果未传递 accessToken
if (StringUtils.isEmpty(message.getAccessToken())) {
WebSocketUtil.send(session, AuthResponse.TYPE,
new AuthResponse().setCode(1).setMessage("认证 accessToken 未传入"));
return;
}
// 添加到 WebSocketUtil 中
WebSocketUtil.addSession(session, message.getAccessToken()); // 考虑到代码简化,我们先直接使用 accessToken 作为 User
// 判断是否认证成功。这里,假装直接成功
WebSocketUtil.send(session, AuthResponse.TYPE, new AuthResponse().setCode(0));
// 通知所有人,某个人加入了。这个是可选逻辑,仅仅是为了演示
// WebSocketUtil.broadcast(UserJoinNoticeRequest.TYPE,
// new UserJoinNoticeRequest().setNickname(message.getAccessToken())); // 考虑到代码简化,我们先直接使用 accessToken 作为 User
//
}
@Override
public String getType() {
return AuthRequest.TYPE;
}
}
package com.mortals.xhx.base.framework.ws.handler;
import com.mortals.xhx.base.framework.ws.message.Message;
import org.springframework.web.socket.WebSocketSession;
/**
* 消息处理器接口
*/
public interface MessageHandler<T extends Message> {
/**
* 执行处理消息
*
* @param session 会话
* @param message 消息
*/
void execute(WebSocketSession session, T message);
/**
* @return 消息类型,即每个 Message 实现类上的 TYPE 静态字段
*/
String getType();
}
package com.mortals.xhx.base.framework.ws.handler;
import com.mortals.xhx.base.framework.ws.message.SendResponse;
import com.mortals.xhx.base.framework.ws.message.SendToAllRequest;
import com.mortals.xhx.base.framework.ws.message.SendToUserRequest;
import com.mortals.xhx.base.framework.ws.util.WebSocketUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;
@Component
public class SendToAllHandler implements MessageHandler<SendToAllRequest> {
@Override
public void execute(WebSocketSession session, SendToAllRequest message) {
// 这里,假装直接成功
SendResponse sendResponse = new SendResponse().setMsgId(message.getMsgId()).setCode(0);
WebSocketUtil.send(session, SendResponse.TYPE, sendResponse);
// 创建转发的消息
SendToUserRequest sendToUserRequest = new SendToUserRequest().setMsgId(message.getMsgId())
.setContent(message.getContent());
// 广播发送
WebSocketUtil.broadcast(SendToUserRequest.TYPE, sendToUserRequest);
}
@Override
public String getType() {
return SendToAllRequest.TYPE;
}
}
package com.mortals.xhx.base.framework.ws.handler;
import com.mortals.xhx.base.framework.ws.message.SendResponse;
import com.mortals.xhx.base.framework.ws.message.SendToOneRequest;
import com.mortals.xhx.base.framework.ws.message.SendToUserRequest;
import com.mortals.xhx.base.framework.ws.util.WebSocketUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;
@Component
public class SendToOneHandler implements MessageHandler<SendToOneRequest> {
@Override
public void execute(WebSocketSession session, SendToOneRequest message) {
// 这里,假装直接成功
SendResponse sendResponse = new SendResponse().setMsgId(message.getMsgId()).setCode(0);
WebSocketUtil.send(session, SendResponse.TYPE, sendResponse);
// 创建转发的消息
SendToUserRequest sendToUserRequest = new SendToUserRequest().setMsgId(message.getMsgId())
.setContent(message.getContent());
// 广播发送
WebSocketUtil.send(message.getToUser(), SendToUserRequest.TYPE, sendToUserRequest);
}
@Override
public String getType() {
return SendToOneRequest.TYPE;
}
}
package com.mortals.xhx.base.framework.ws.message;
/**
* 用户认证请求
*/
public class AuthRequest implements Message {
public static final String TYPE = "AUTH_REQUEST";
/**
* 认证 Token
*/
private String accessToken;
public String getAccessToken() {
return accessToken;
}
public AuthRequest setAccessToken(String accessToken) {
this.accessToken = accessToken;
return this;
}
}
package com.mortals.xhx.base.framework.ws.message;
/**
* 用户认证响应
*/
public class AuthResponse implements Message {
public static final String TYPE = "AUTH_RESPONSE";
/**
* 响应状态码
*/
private Integer code;
/**
* 响应提示
*/
private String message;
public Integer getCode() {
return code;
}
public AuthResponse setCode(Integer code) {
this.code = code;
return this;
}
public String getMessage() {
return message;
}
public AuthResponse setMessage(String message) {
this.message = message;
return this;
}
}
package com.mortals.xhx.base.framework.ws.message;
/**
* 基础消息体
*/
public interface Message {
}
package com.mortals.xhx.base.framework.ws.message;
/**
* 发送消息响应结果的 Message
*/
public class SendResponse implements Message {
public static final String TYPE = "SEND_RESPONSE";
/**
* 消息编号
*/
private String msgId;
/**
* 响应状态码
*/
private Integer code;
/**
* 响应提示
*/
private String message;
public String getMsgId() {
return msgId;
}
public SendResponse setMsgId(String msgId) {
this.msgId = msgId;
return this;
}
public Integer getCode() {
return code;
}
public SendResponse setCode(Integer code) {
this.code = code;
return this;
}
public String getMessage() {
return message;
}
public SendResponse setMessage(String message) {
this.message = message;
return this;
}
}
package com.mortals.xhx.base.framework.ws.message;
/**
* 发送给所有人的群聊消息的 Message
*/
public class SendToAllRequest implements Message {
public static final String TYPE = "SEND_TO_ALL_REQUEST";
/**
* 消息编号
*/
private String msgId;
/**
* 内容
*/
private String content;
public String getContent() {
return content;
}
public SendToAllRequest setContent(String content) {
this.content = content;
return this;
}
public String getMsgId() {
return msgId;
}
public SendToAllRequest setMsgId(String msgId) {
this.msgId = msgId;
return this;
}
}
package com.mortals.xhx.base.framework.ws.message;
/**
* 发送给指定人的私聊消息的 Message
*/
public class SendToOneRequest implements Message {
public static final String TYPE = "SEND_TO_ONE_REQUEST";
/**
* 发送给的用户
*/
private String toUser;
/**
* 消息编号
*/
private String msgId;
/**
* 内容
*/
private String content;
public String getToUser() {
return toUser;
}
public SendToOneRequest setToUser(String toUser) {
this.toUser = toUser;
return this;
}
public String getMsgId() {
return msgId;
}
public SendToOneRequest setMsgId(String msgId) {
this.msgId = msgId;
return this;
}
public String getContent() {
return content;
}
public SendToOneRequest setContent(String content) {
this.content = content;
return this;
}
}
package com.mortals.xhx.base.framework.ws.message;
/**
* 发送消息给一个用户的 Message
*/
public class SendToUserRequest implements Message {
public static final String TYPE = "SEND_TO_USER_REQUEST";
/**
* 消息编号
*/
private String msgId;
/**
* 内容
*/
private String content;
public String getMsgId() {
return msgId;
}
public SendToUserRequest setMsgId(String msgId) {
this.msgId = msgId;
return this;
}
public String getContent() {
return content;
}
public SendToUserRequest setContent(String content) {
this.content = content;
return this;
}
}
package com.mortals.xhx.base.framework.ws.message;
/**
* 用户加入群聊的通知 Message
*/
public class UserJoinNoticeRequest implements Message {
public static final String TYPE = "USER_JOIN_NOTICE_REQUEST";
/**
* 昵称
*/
private String nickname;
public String getNickname() {
return nickname;
}
public UserJoinNoticeRequest setNickname(String nickname) {
this.nickname = nickname;
return this;
}
}
package com.mortals.xhx.base.framework.ws.util;
import com.alibaba.fastjson.JSONObject;
import com.mortals.xhx.base.framework.ws.message.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* WebSocket 工具类,提供客户端连接的管理等功能
*/
public class WebSocketUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketUtil.class);
// ========== 会话相关 ==========
/**
* Session 与用户的映射
*/
private static final Map<WebSocketSession, String> SESSION_USER_MAP = new ConcurrentHashMap<>();
/**
* 用户与 Session 的映射
*/
private static final Map<String, WebSocketSession> USER_SESSION_MAP = new ConcurrentHashMap<>();
/**
* 添加 Session 。在这个方法中,会添加用户和 Session 之间的映射
*
* @param session Session
* @param user 用户
*/
public static void addSession(WebSocketSession session, String user) {
// 更新 USER_SESSION_MAP
USER_SESSION_MAP.put(user, session);
// 更新 SESSION_USER_MAP
SESSION_USER_MAP.put(session, user);
}
/**
* 移除 Session 。
*
* @param session Session
*/
public static void removeSession(WebSocketSession session) {
// 从 SESSION_USER_MAP 中移除
String user = SESSION_USER_MAP.remove(session);
// 从 USER_SESSION_MAP 中移除
if (user != null && user.length() > 0) {
USER_SESSION_MAP.remove(user);
}
}
// ========== 消息相关 ==========
/**
* 广播发送消息给所有在线用户
*
* @param type 消息类型
* @param message 消息体
* @param <T> 消息类型
*/
public static <T extends Message> void broadcast(String type, T message) {
// 创建消息
TextMessage textMessage = buildTextMessage(type, message);
// 遍历 SESSION_USER_MAP ,进行逐个发送
for (WebSocketSession session : SESSION_USER_MAP.keySet()) {
sendTextMessage(session, textMessage);
}
}
/**
* 发送消息给单个用户的 Session
*
* @param session Session
* @param type 消息类型
* @param message 消息体
* @param <T> 消息类型
*/
public static <T extends Message> void send(WebSocketSession session, String type, T message) {
// 创建消息
TextMessage textMessage = buildTextMessage(type, message);
// 遍历给单个 Session ,进行逐个发送
sendTextMessage(session, textMessage);
}
/**
* 发送消息给指定用户
*
* @param user 指定用户
* @param type 消息类型
* @param message 消息体
* @param <T> 消息类型
* @return 发送是否成功你那个
*/
public static <T extends Message> boolean send(String user, String type, T message) {
// 获得用户对应的 Session
WebSocketSession session = USER_SESSION_MAP.get(user);
if (session == null) {
LOGGER.error("[send][user({}) 不存在对应的 session]", user);
return false;
}
// 发送消息
send(session, type, message);
return true;
}
/**
* 构建完整的消息
*
* @param type 消息类型
* @param message 消息体
* @param <T> 消息类型
* @return 消息
*/
private static <T extends Message> TextMessage buildTextMessage(String type, T message) {
JSONObject messageObject = new JSONObject();
messageObject.put("type", type);
messageObject.put("body", message);
return new TextMessage(messageObject.toString());
}
/**
* 真正发送消息
*
* @param session Session
* @param textMessage 消息
*/
private static void sendTextMessage(WebSocketSession session, TextMessage textMessage) {
if (session == null) {
LOGGER.error("[sendTextMessage][session 为 null]");
return;
}
try {
session.sendMessage(textMessage);
} catch (IOException e) {
LOGGER.error("[sendTextMessage][session({}) 发送消息{}) 发生异常",
session, textMessage, e);
}
}
}
package com.mortals.xhx.base.framework.ws.websocket;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mortals.xhx.base.framework.ws.handler.MessageHandler;
import com.mortals.xhx.base.framework.ws.message.AuthRequest;
import com.mortals.xhx.base.framework.ws.message.Message;
import com.mortals.xhx.base.framework.ws.util.WebSocketUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.framework.AopProxyUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class WebSocketHandler extends TextWebSocketHandler implements InitializingBean {
private Logger logger = LoggerFactory.getLogger(getClass());
/**
* 消息类型与 MessageHandler 的映射
*
* 无需设置成静态变量
*/
private final Map<String, MessageHandler> HANDLERS = new HashMap<>();
@Autowired
private ApplicationContext applicationContext;
@Override // 对应 open 事件
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
logger.info("[afterConnectionEstablished][session({}) 接入]", session);
// 解析 accessToken
String accessToken = (String) session.getAttributes().get("accessToken");
// 创建 AuthRequest 消息类型
AuthRequest authRequest = new AuthRequest().setAccessToken(accessToken);
// 获得消息处理器
MessageHandler<AuthRequest> messageHandler = HANDLERS.get(AuthRequest.TYPE);
if (messageHandler == null) {
logger.error("[onOpen][认证消息类型,不存在消息处理器]");
return;
}
messageHandler.execute(session, authRequest);
}
@Override // 对应 message 事件
public void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception {
logger.info("[handleMessage][session({}) 接收到一条消息({})]", session, textMessage); // 生产环境下,请设置成 debug 级别
try {
// 获得消息类型
JSONObject jsonMessage = JSON.parseObject(textMessage.getPayload());
String messageType = jsonMessage.getString("type");
// 获得消息处理器
MessageHandler messageHandler = HANDLERS.get(messageType);
if (messageHandler == null) {
logger.error("[onMessage][消息类型({}) 不存在消息处理器]", messageType);
return;
}
// 解析消息
Class<? extends Message> messageClass = this.getMessageClass(messageHandler);
// 处理消息
Message messageObj = JSON.parseObject(jsonMessage.getString("body"), messageClass);
messageHandler.execute(session, messageObj);
} catch (Throwable throwable) {
logger.info("[onMessage][session({}) message({}) 发生异常]", session, throwable);
}
}
@Override // 对应 close 事件
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
logger.info("[afterConnectionClosed][session({}) 连接关闭。关闭原因是({})}]", session, status);
WebSocketUtil.removeSession(session);
}
@Override // 对应 error 事件
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
logger.info("[handleTransportError][session({}) 发生异常]", session, exception);
}
@Override
public void afterPropertiesSet() throws Exception {
// 通过 ApplicationContext 获得所有 MessageHandler Bean
applicationContext.getBeansOfType(MessageHandler.class).values() // 获得所有 MessageHandler Bean
.forEach(messageHandler -> HANDLERS.put(messageHandler.getType(), messageHandler)); // 添加到 handlers 中
logger.info("[afterPropertiesSet][消息处理器数量:{}]", HANDLERS.size());
}
private Class<? extends Message> getMessageClass(MessageHandler handler) {
// 获得 Bean 对应的 Class 类名。因为有可能被 AOP 代理过。
Class<?> targetClass = AopProxyUtils.ultimateTargetClass(handler);
// 获得接口的 Type 数组
Type[] interfaces = targetClass.getGenericInterfaces();
Class<?> superclass = targetClass.getSuperclass();
while ((Objects.isNull(interfaces) || 0 == interfaces.length) && Objects.nonNull(superclass)) { // 此处,是以父类的接口为准
interfaces = superclass.getGenericInterfaces();
superclass = targetClass.getSuperclass();
}
if (Objects.nonNull(interfaces)) {
// 遍历 interfaces 数组
for (Type type : interfaces) {
// 要求 type 是泛型参数
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
// 要求是 MessageHandler 接口
if (Objects.equals(parameterizedType.getRawType(), MessageHandler.class)) {
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
// 取首个元素
if (Objects.nonNull(actualTypeArguments) && actualTypeArguments.length > 0) {
return (Class<Message>) actualTypeArguments[0];
} else {
throw new IllegalStateException(String.format("类型(%s) 获得不到消息类型", handler));
}
}
}
}
}
throw new IllegalStateException(String.format("类型(%s) 获得不到消息类型", handler));
}
public static void main(String[] args) {
WebSocketHandler webSocketHandler = new WebSocketHandler();
}
}
package com.mortals.xhx.base.framework.ws.websocket;
import lombok.extern.apachecommons.CommonsLog;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import java.util.Map;
/**
* 自定义 HttpSessionHandshakeInterceptor 拦截器
*
* 因为 WebSocketSession 无法获得 ws 地址上的请求参数,所以只好通过该拦截器,获得 accessToken 请求参数,设置到 attributes 中
*/
@CommonsLog
public class WebSocketShakeInterceptor extends HttpSessionHandshakeInterceptor {
@Override // 拦截 Handshake 事件
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
// 获得 accessToken
if (request instanceof ServletServerHttpRequest) {
ServletServerHttpRequest serverRequest = (ServletServerHttpRequest) request;
attributes.put("accessToken", serverRequest.getServletRequest().getParameter("accessToken"));
}
// 调用父方法,继续执行逻辑
return super.beforeHandshake(request, response, wsHandler, attributes);
}
public static void main(String[] args) {
WebSocketShakeInterceptor webSocketShakeInterceptor = new WebSocketShakeInterceptor();
}
}
...@@ -70,9 +70,9 @@ public class AreaController extends BaseCRUDJsonMappingController<AreaService, A ...@@ -70,9 +70,9 @@ public class AreaController extends BaseCRUDJsonMappingController<AreaService, A
if (form.getQuery().getStatus() == null) { if (form.getQuery().getStatus() == null) {
form.getQuery().setStatus(YesNo.YES.getValue()); form.getQuery().setStatus(YesNo.YES.getValue());
} }
// if(StringUtils.isEmpty(form.getQuery().getName())){ if(StringUtils.isEmpty(form.getQuery().getName())){
// form.getQuery().setLevel(AreaLevelEnum.PROVINCE.getValue()); form.getQuery().setLevel(AreaLevelEnum.PROVINCE.getValue());
// } }
return super.list(request, response, form); return super.list(request, response, form);
}catch(Exception e){ }catch(Exception e){
log.error("查询区域信息列表错误",e); log.error("查询区域信息列表错误",e);
......
...@@ -41,7 +41,7 @@ public class RequestDispatchController { ...@@ -41,7 +41,7 @@ public class RequestDispatchController {
ApiRespPdu<String> respPdu = new ApiRespPdu<>(); ApiRespPdu<String> respPdu = new ApiRespPdu<>();
try { try {
String xml = IoUtil.readUtf8(multipartFile.getInputStream()); String xml = IoUtil.readUtf8(multipartFile.getInputStream());
respPdu = apiFlowDefinitionFeign.save("test", "请假", xml); respPdu = apiFlowDefinitionFeign.save("test", "请假", xml,"test");
} catch (Exception e) { } catch (Exception e) {
log.error("error", e); log.error("error", e);
......
package com.mortals.xhx.module.data.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.data.model.DataAreaEntity;
/**
* <p>Title: 地区表</p>
* <p>Description: DataAreaDao DAO接口 </p>
* @author
* @version 1.0.0
*/
public interface DataAreaDao extends ICRUDDao<DataAreaEntity,Long>{
}
package com.mortals.xhx.module.data.dao.ibatis;
import org.springframework.stereotype.Repository;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import com.mortals.xhx.module.data.dao.DataAreaDao;
import com.mortals.xhx.module.data.model.DataAreaEntity;
/**
* <p>Title: 地区表</p>
* <p>Description: DataAreaDaoImpl DAO接口 </p>
* @author
* @version 1.0.0
*/
@Repository("dataAreaDao")
public class DataAreaDaoImpl extends BaseCRUDDaoMybatis<DataAreaEntity,Long> implements DataAreaDao {
}
package com.mortals.xhx.module.data.model;
import com.mortals.framework.model.BaseEntityLong;
/**
*
* Description:DataArea
* date: 2021-8-10 13:57:03
*/
public class DataAreaEntity extends BaseEntityLong{
private static final long serialVersionUID = 1628575023251L;
/**
* 地区名称
*/
private String areaName;
/**
* 地区简称
*/
private String areaSimpleName;
/**
* 上级地区ID
*/
private String parentAreaId;
/**
* 行政区域代码 行政区域代码
*/
private String areaCode;
/**
* 删除标识
*/
private String deleteFlag;
/**
* 创建人
*/
private String creatorId;
/**
* 创建人名称
*/
private String creatorName;
/**
* 创建时间
*/
private String createTimes;
/**
* 更新时间
*/
private String updateTimes;
/**
* 1省级,2市级,3区县级,4乡镇级,5村
*/
private String areaLevel;
/**
* 排序
*/
private String sortKey;
/**
* 地区层级编码
*/
private String areaLevelCode;
/**
* 临时使用确认地区层级
*/
private String submitAreaLevel;
/**
* 是否特殊区域:0.否,1.是
*/
private String isSpecial;
/**
* 行政区域描述
*/
private String areaDesc;
public DataAreaEntity(){
}
/**
* 获取 地区名称
* @return areaName
*/
public String getAreaName() {
return this.areaName;
}
/**
* 设置 地区名称
* @param areaName
*/
public void setAreaName(String areaName) {
this.areaName = areaName;
}
/**
* 获取 地区简称
* @return areaSimpleName
*/
public String getAreaSimpleName() {
return this.areaSimpleName;
}
/**
* 设置 地区简称
* @param areaSimpleName
*/
public void setAreaSimpleName(String areaSimpleName) {
this.areaSimpleName = areaSimpleName;
}
/**
* 获取 上级地区ID
* @return parentAreaId
*/
public String getParentAreaId() {
return this.parentAreaId;
}
/**
* 设置 上级地区ID
* @param parentAreaId
*/
public void setParentAreaId(String parentAreaId) {
this.parentAreaId = parentAreaId;
}
/**
* 获取 行政区域代码 行政区域代码
* @return areaCode
*/
public String getAreaCode() {
return this.areaCode;
}
/**
* 设置 行政区域代码 行政区域代码
* @param areaCode
*/
public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}
/**
* 获取 删除标识
* @return deleteFlag
*/
public String getDeleteFlag() {
return this.deleteFlag;
}
/**
* 设置 删除标识
* @param deleteFlag
*/
public void setDeleteFlag(String deleteFlag) {
this.deleteFlag = deleteFlag;
}
/**
* 获取 创建人
* @return creatorId
*/
public String getCreatorId() {
return this.creatorId;
}
/**
* 设置 创建人
* @param creatorId
*/
public void setCreatorId(String creatorId) {
this.creatorId = creatorId;
}
/**
* 获取 创建人名称
* @return creatorName
*/
public String getCreatorName() {
return this.creatorName;
}
/**
* 设置 创建人名称
* @param creatorName
*/
public void setCreatorName(String creatorName) {
this.creatorName = creatorName;
}
/**
* 获取 创建时间
* @return createTimes
*/
public String getCreateTimes() {
return this.createTimes;
}
/**
* 设置 创建时间
* @param createTimes
*/
public void setCreateTimes(String createTimes) {
this.createTimes = createTimes;
}
/**
* 获取 更新时间
* @return updateTimes
*/
public String getUpdateTimes() {
return this.updateTimes;
}
/**
* 设置 更新时间
* @param updateTimes
*/
public void setUpdateTimes(String updateTimes) {
this.updateTimes = updateTimes;
}
/**
* 获取 1省级,2市级,3区县级,4乡镇级,5村
* @return areaLevel
*/
public String getAreaLevel() {
return this.areaLevel;
}
/**
* 设置 1省级,2市级,3区县级,4乡镇级,5村
* @param areaLevel
*/
public void setAreaLevel(String areaLevel) {
this.areaLevel = areaLevel;
}
/**
* 获取 排序
* @return sortKey
*/
public String getSortKey() {
return this.sortKey;
}
/**
* 设置 排序
* @param sortKey
*/
public void setSortKey(String sortKey) {
this.sortKey = sortKey;
}
/**
* 获取 地区层级编码
* @return areaLevelCode
*/
public String getAreaLevelCode() {
return this.areaLevelCode;
}
/**
* 设置 地区层级编码
* @param areaLevelCode
*/
public void setAreaLevelCode(String areaLevelCode) {
this.areaLevelCode = areaLevelCode;
}
/**
* 获取 临时使用确认地区层级
* @return submitAreaLevel
*/
public String getSubmitAreaLevel() {
return this.submitAreaLevel;
}
/**
* 设置 临时使用确认地区层级
* @param submitAreaLevel
*/
public void setSubmitAreaLevel(String submitAreaLevel) {
this.submitAreaLevel = submitAreaLevel;
}
/**
* 获取 是否特殊区域:0.否,1.是
* @return isSpecial
*/
public String getIsSpecial() {
return this.isSpecial;
}
/**
* 设置 是否特殊区域:0.否,1.是
* @param isSpecial
*/
public void setIsSpecial(String isSpecial) {
this.isSpecial = isSpecial;
}
/**
* 获取 行政区域描述
* @return areaDesc
*/
public String getAreaDesc() {
return this.areaDesc;
}
/**
* 设置 行政区域描述
* @param areaDesc
*/
public void setAreaDesc(String areaDesc) {
this.areaDesc = areaDesc;
}
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj instanceof DataAreaEntity) {
DataAreaEntity tmp = (DataAreaEntity) obj;
if (this.getId().longValue() == tmp.getId().longValue()) {
return true;
}
}
return false;
}
public String toString(){
StringBuilder sb = new StringBuilder("");
sb
.append(",id:").append(getId())
.append(",areaName:").append(getAreaName())
.append(",areaSimpleName:").append(getAreaSimpleName())
.append(",parentAreaId:").append(getParentAreaId())
.append(",areaCode:").append(getAreaCode())
.append(",deleteFlag:").append(getDeleteFlag())
.append(",creatorId:").append(getCreatorId())
.append(",creatorName:").append(getCreatorName())
.append(",createTimes:").append(getCreateTimes())
.append(",updateTimes:").append(getUpdateTimes())
.append(",areaLevel:").append(getAreaLevel())
.append(",sortKey:").append(getSortKey())
.append(",areaLevelCode:").append(getAreaLevelCode())
.append(",submitAreaLevel:").append(getSubmitAreaLevel())
.append(",isSpecial:").append(getIsSpecial())
.append(",areaDesc:").append(getAreaDesc())
;
return sb.toString();
}
public void initAttrValue(){
this.areaName = null;
this.areaSimpleName = null;
this.parentAreaId = null;
this.areaCode = null;
this.deleteFlag = null;
this.creatorId = null;
this.creatorName = null;
this.createTimes = null;
this.updateTimes = null;
this.areaLevel = null;
this.sortKey = null;
this.areaLevelCode = null;
this.submitAreaLevel = null;
this.isSpecial = null;
this.areaDesc = null;
}
}
\ No newline at end of file
package com.mortals.xhx.module.data.model;
import java.util.List;
/**
*
* Description:DataArea
* date: 2021-8-10 13:57:03
*/
public class DataAreaQuery extends DataAreaEntity{
private static final long serialVersionUID = 1628575023258L;
/** 主键ID */
private List<String> idList;
/** 地区名称 */
private List<String> areaNameList;
/** 地区简称 */
private List<String> areaSimpleNameList;
/** 上级地区ID */
private List<String> parentAreaIdList;
/** 行政区域代码 行政区域代码 */
private List<String> areaCodeList;
/** 删除标识 */
private List<String> deleteFlagList;
/** 创建人 */
private List<String> creatorIdList;
/** 创建人名称 */
private List<String> creatorNameList;
/** 创建时间 */
private List<String> createTimesList;
/** 更新时间 */
private List<String> updateTimesList;
/** 1省级,2市级,3区县级,4乡镇级,5村 */
private List<String> areaLevelList;
/** 排序 */
private List<String> sortKeyList;
/** 地区层级编码 */
private List<String> areaLevelCodeList;
/** 临时使用确认地区层级 */
private List<String> submitAreaLevelList;
/** 是否特殊区域:0.否,1.是 */
private List<String> isSpecialList;
/** 行政区域描述 */
private List<String> areaDescList;
/** OR条件集合,列表项之间是OR,项内容之间是AND,如:(list[0].1 and list[0].2) or (list[1].3 and list[1].4) */
private List<DataAreaQuery> orConditionList;
/** AND条件集合,列表项之间是AND,项内容之间是OR,如:(list[0].1 or list[0].2) and (list[1].3 or list[1].4) */
private List<DataAreaQuery> andConditionList;
public DataAreaQuery(){
}
/**
* 获取 主键ID
* @return idList
*/
public List<String> getIdList(){
return this.idList;
}
/**
* 设置 主键ID
* @param idList
*/
public void setIdList(List<String> idList){
this.idList = idList;
}
/**
* 获取 地区名称
* @return areaNameList
*/
public List<String> getAreaNameList(){
return this.areaNameList;
}
/**
* 设置 地区名称
* @param areaNameList
*/
public void setAreaNameList(List<String> areaNameList){
this.areaNameList = areaNameList;
}
/**
* 获取 地区简称
* @return areaSimpleNameList
*/
public List<String> getAreaSimpleNameList(){
return this.areaSimpleNameList;
}
/**
* 设置 地区简称
* @param areaSimpleNameList
*/
public void setAreaSimpleNameList(List<String> areaSimpleNameList){
this.areaSimpleNameList = areaSimpleNameList;
}
/**
* 获取 上级地区ID
* @return parentAreaIdList
*/
public List<String> getParentAreaIdList(){
return this.parentAreaIdList;
}
/**
* 设置 上级地区ID
* @param parentAreaIdList
*/
public void setParentAreaIdList(List<String> parentAreaIdList){
this.parentAreaIdList = parentAreaIdList;
}
/**
* 获取 行政区域代码 行政区域代码
* @return areaCodeList
*/
public List<String> getAreaCodeList(){
return this.areaCodeList;
}
/**
* 设置 行政区域代码 行政区域代码
* @param areaCodeList
*/
public void setAreaCodeList(List<String> areaCodeList){
this.areaCodeList = areaCodeList;
}
/**
* 获取 删除标识
* @return deleteFlagList
*/
public List<String> getDeleteFlagList(){
return this.deleteFlagList;
}
/**
* 设置 删除标识
* @param deleteFlagList
*/
public void setDeleteFlagList(List<String> deleteFlagList){
this.deleteFlagList = deleteFlagList;
}
/**
* 获取 创建人
* @return creatorIdList
*/
public List<String> getCreatorIdList(){
return this.creatorIdList;
}
/**
* 设置 创建人
* @param creatorIdList
*/
public void setCreatorIdList(List<String> creatorIdList){
this.creatorIdList = creatorIdList;
}
/**
* 获取 创建人名称
* @return creatorNameList
*/
public List<String> getCreatorNameList(){
return this.creatorNameList;
}
/**
* 设置 创建人名称
* @param creatorNameList
*/
public void setCreatorNameList(List<String> creatorNameList){
this.creatorNameList = creatorNameList;
}
/**
* 获取 创建时间
* @return createTimesList
*/
public List<String> getCreateTimesList(){
return this.createTimesList;
}
/**
* 设置 创建时间
* @param createTimesList
*/
public void setCreateTimesList(List<String> createTimesList){
this.createTimesList = createTimesList;
}
/**
* 获取 更新时间
* @return updateTimesList
*/
public List<String> getUpdateTimesList(){
return this.updateTimesList;
}
/**
* 设置 更新时间
* @param updateTimesList
*/
public void setUpdateTimesList(List<String> updateTimesList){
this.updateTimesList = updateTimesList;
}
/**
* 获取 1省级,2市级,3区县级,4乡镇级,5村
* @return areaLevelList
*/
public List<String> getAreaLevelList(){
return this.areaLevelList;
}
/**
* 设置 1省级,2市级,3区县级,4乡镇级,5村
* @param areaLevelList
*/
public void setAreaLevelList(List<String> areaLevelList){
this.areaLevelList = areaLevelList;
}
/**
* 获取 排序
* @return sortKeyList
*/
public List<String> getSortKeyList(){
return this.sortKeyList;
}
/**
* 设置 排序
* @param sortKeyList
*/
public void setSortKeyList(List<String> sortKeyList){
this.sortKeyList = sortKeyList;
}
/**
* 获取 地区层级编码
* @return areaLevelCodeList
*/
public List<String> getAreaLevelCodeList(){
return this.areaLevelCodeList;
}
/**
* 设置 地区层级编码
* @param areaLevelCodeList
*/
public void setAreaLevelCodeList(List<String> areaLevelCodeList){
this.areaLevelCodeList = areaLevelCodeList;
}
/**
* 获取 临时使用确认地区层级
* @return submitAreaLevelList
*/
public List<String> getSubmitAreaLevelList(){
return this.submitAreaLevelList;
}
/**
* 设置 临时使用确认地区层级
* @param submitAreaLevelList
*/
public void setSubmitAreaLevelList(List<String> submitAreaLevelList){
this.submitAreaLevelList = submitAreaLevelList;
}
/**
* 获取 是否特殊区域:0.否,1.是
* @return isSpecialList
*/
public List<String> getIsSpecialList(){
return this.isSpecialList;
}
/**
* 设置 是否特殊区域:0.否,1.是
* @param isSpecialList
*/
public void setIsSpecialList(List<String> isSpecialList){
this.isSpecialList = isSpecialList;
}
/**
* 获取 行政区域描述
* @return areaDescList
*/
public List<String> getAreaDescList(){
return this.areaDescList;
}
/**
* 设置 行政区域描述
* @param areaDescList
*/
public void setAreaDescList(List<String> areaDescList){
this.areaDescList = areaDescList;
}
/**
* 获取 OR条件集合,列表项之间是OR,项内容之间是AND,如:(list[0].1 and list[0].2) or (list[1].3 and list[1].4)
* @return orConditionList
*/
public List<DataAreaQuery> getOrConditionList(){
return this.orConditionList;
}
/**
* 设置 OR条件集合,列表项之间是OR,项内容之间是AND,如:(list[0].1 and list[0].2) or (list[1].3 and list[1].4)
* @param orConditionList
*/
public void setOrConditionList(List<DataAreaQuery> orConditionList){
this.orConditionList = orConditionList;
}
/**
* 获取 AND条件集合,列表项之间是AND,项内容之间是OR,如:(list[0].1 or list[0].2) and (list[1].3 or list[1].4)
* @return andConditionList
*/
public List<DataAreaQuery> getAndConditionList(){
return this.andConditionList;
}
/**
* 设置 AND条件集合,列表项之间是AND,项内容之间是OR,如:(list[0].1 or list[0].2) and (list[1].3 or list[1].4)
* @param andConditionList
*/
public void setAndConditionList(List<DataAreaQuery> andConditionList){
this.andConditionList = andConditionList;
}
}
\ No newline at end of file
package com.mortals.xhx.module.data.service;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.data.model.DataAreaEntity;
/**
* <p>Title: 地区表</p>
* <p>Description: DataAreaService service接口 </p>
* <p>Copyright: Copyright &reg; </p>
* @version 1.0.0
*/
public interface DataAreaService extends ICRUDService<DataAreaEntity,Long>{
}
\ No newline at end of file
package com.mortals.xhx.module.data.service.impl;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.xhx.module.data.dao.DataAreaDao;
import com.mortals.xhx.module.data.model.DataAreaEntity;
import com.mortals.xhx.module.data.service.DataAreaService;
/**
* <p>Title: 地区表</p>
* <p>Description: DataAreaService service接口 </p>
* <p>Copyright: Copyright &reg; </p>
* @version 1.0.0
*/
@Service("dataAreaService")
public class DataAreaServiceImpl extends AbstractCRUDServiceImpl<DataAreaDao, DataAreaEntity, Long> implements DataAreaService {
}
\ No newline at end of file
package com.mortals.xhx.module.data.web;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.xhx.base.system.area.web.AreaForm;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.mortals.framework.web.BaseCRUDJsonMappingController;
import com.mortals.xhx.module.data.model.DataAreaEntity;
import com.mortals.xhx.module.data.service.DataAreaService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* <p>Title: 地区表</p>
* <p>Description: DataAreaController </p>
* <p>Copyright: Copyright &reg; </p>
* <p>Company: </p>
* @author zxfei
* @version 1.0.0
*/
@RestController
@RequestMapping("data/area")
public class DataAreaController extends BaseCRUDJsonMappingController<DataAreaService,DataAreaForm,DataAreaEntity,Long> {
public DataAreaController(){
super.setFormClass(DataAreaForm.class);
super.setModuleDesc("地区表");
}
// @Override
// protected int doListAfter(HttpServletRequest request, HttpServletResponse response, DataAreaForm form, Map<String, Object> model, Context context) throws AppException {
//
// List<DataAreaEntity> result = (List<DataAreaEntity>) model.get("result");
// List<HashMap<String, String>> collect = result.parallelStream().map(item -> {
// HashMap<String, String> map = new HashMap<>();
//
// map.put("id", item.getId().toString());
// map.put("name", item.getAreaName());
// map.put("parentId", item.getParentAreaId());
// map.put("code", item.getAreaCode());
// map.put("level", item.getAreaLevel());
// return map;
//
// }).collect(Collectors.toList());
// model.put("result",collect);
//
// return super.doListAfter(request, response, form, model, context);
// }
public static void main(String[] args) {
AreaForm areaForm = new AreaForm();
areaForm.getEntity().setId(1L);
System.out.println(JSON.toJSONString(areaForm));
}
}
\ No newline at end of file
package com.mortals.xhx.module.data.web;
import com.mortals.framework.web.BaseCRUDFormLong;
import com.mortals.xhx.module.data.model.DataAreaEntity;
import com.mortals.xhx.module.data.model.DataAreaQuery;
/**
* <p>Title: 地区表</p>
* <p>Description: DataAreaForm </p>
* @author
* @version 1.0.0
*/
public class DataAreaForm extends BaseCRUDFormLong<DataAreaEntity> {
private DataAreaEntity dataarea = new DataAreaEntity();
private DataAreaQuery query = new DataAreaQuery();
public DataAreaForm(){
}
@Override
public DataAreaEntity getEntity() {
return dataarea;
}
public DataAreaEntity getDataArea() {
return dataarea;
}
public void setDataArea(DataAreaEntity dataarea) {
this.dataarea = dataarea;
}
@Override
public DataAreaQuery getQuery() {
return query;
}
public void setQuery(DataAreaQuery query) {
this.query = query;
}
}
\ No newline at end of file
...@@ -5,6 +5,7 @@ import com.mortals.framework.model.PageInfo; ...@@ -5,6 +5,7 @@ import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result; import com.mortals.framework.model.Result;
import com.mortals.framework.service.ICRUDService; import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.common.pdu.api.ApiRespPdu; import com.mortals.xhx.common.pdu.api.ApiRespPdu;
import com.mortals.xhx.common.pdu.flow.DefinitionVoPdu;
import com.mortals.xhx.common.pdu.flow.FlowProcDefPdu; import com.mortals.xhx.common.pdu.flow.FlowProcDefPdu;
import com.mortals.xhx.common.pdu.flow.FlowSaveXmlPdu; import com.mortals.xhx.common.pdu.flow.FlowSaveXmlPdu;
import com.mortals.xhx.module.flowable.model.FlowableDefinitionEntity; import com.mortals.xhx.module.flowable.model.FlowableDefinitionEntity;
...@@ -31,8 +32,12 @@ public interface FlowableDefinitionService extends ICRUDService<FlowableDefiniti ...@@ -31,8 +32,12 @@ public interface FlowableDefinitionService extends ICRUDService<FlowableDefiniti
String readXml(String deployId); String readXml(String deployId);
String saveXml(FlowSaveXmlPdu flowSaveXmlPdu); String saveXml(FlowSaveXmlPdu flowSaveXmlPdu,Context context);
String start(String procDefId, String data, Context context); String start(String procDefId, String data, Context context);
String updateState(DefinitionVoPdu definitionVoPdu,Context context);
String deleteDefinition(DefinitionVoPdu definitionVoPdu,Context context);
} }
\ No newline at end of file
...@@ -5,8 +5,10 @@ import com.mortals.framework.exception.AppException; ...@@ -5,8 +5,10 @@ import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo; import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result; import com.mortals.framework.model.Result;
import com.mortals.xhx.base.framework.config.InterceptorConfig;
import com.mortals.xhx.common.code.YesNoEnum; import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.common.pdu.api.ApiRespPdu; import com.mortals.xhx.common.pdu.api.ApiRespPdu;
import com.mortals.xhx.common.pdu.flow.DefinitionVoPdu;
import com.mortals.xhx.common.pdu.flow.FlowProcDefPdu; import com.mortals.xhx.common.pdu.flow.FlowProcDefPdu;
import com.mortals.xhx.common.pdu.flow.FlowSaveXmlPdu; import com.mortals.xhx.common.pdu.flow.FlowSaveXmlPdu;
import com.mortals.xhx.common.utils.BeanUtil; import com.mortals.xhx.common.utils.BeanUtil;
...@@ -49,6 +51,8 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa ...@@ -49,6 +51,8 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa
private FormService formService; private FormService formService;
@Autowired @Autowired
private IApiFlowDefinitionFeign apiFlowDefinitionFeign; private IApiFlowDefinitionFeign apiFlowDefinitionFeign;
@Autowired
private InterceptorConfig config;
@Override @Override
public Result<FlowableDefinitionEntity> getDefinList(FlowableDefinitionQuery query, PageInfo pageInfo, Context context) { public Result<FlowableDefinitionEntity> getDefinList(FlowableDefinitionQuery query, PageInfo pageInfo, Context context) {
...@@ -58,8 +62,7 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa ...@@ -58,8 +62,7 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa
if (!ObjectUtils.isEmpty(query)) { if (!ObjectUtils.isEmpty(query)) {
BeanUtils.copyProperties(query, flowProcDefPdu, BeanUtil.getNullPropertyNames(query)); BeanUtils.copyProperties(query, flowProcDefPdu, BeanUtil.getNullPropertyNames(query));
} }
ApiRespPdu<Result<FlowProcDefPdu>> resp = apiFlowDefinitionFeign.list(context.getUser().getId().toString(),config.getTenantId(),pageInfo);
ApiRespPdu<Result<FlowProcDefPdu>> resp = apiFlowDefinitionFeign.list(context.getUser().getLoginName(), pageInfo);
if (YesNoEnum.NO.getValue() == resp.getCode()) { if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("获取流程定义列表异常:" + resp.getMsg()); log.error("获取流程定义列表异常:" + resp.getMsg());
throw new AppException("获取流程定义列表异常:" + resp.getMsg()); throw new AppException("获取流程定义列表异常:" + resp.getMsg());
...@@ -129,9 +132,9 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa ...@@ -129,9 +132,9 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa
} }
@Override @Override
public String saveXml(FlowSaveXmlPdu flowSaveXmlPdu) { public String saveXml(FlowSaveXmlPdu flowSaveXmlPdu,Context context) {
try { try {
ApiRespPdu<String> resp = apiFlowDefinitionFeign.save(flowSaveXmlPdu.getName(), flowSaveXmlPdu.getCategory(), flowSaveXmlPdu.getXml()); ApiRespPdu<String> resp = apiFlowDefinitionFeign.save(flowSaveXmlPdu.getName(), flowSaveXmlPdu.getCategory(), flowSaveXmlPdu.getXml(),config.getTenantId());
if (YesNoEnum.NO.getValue() == resp.getCode()) { if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("保存流程XML异常:" + resp.getMsg()); log.error("保存流程XML异常:" + resp.getMsg());
throw new AppException("保存流程XML异常:" + resp.getMsg()); throw new AppException("保存流程XML异常:" + resp.getMsg());
...@@ -152,9 +155,9 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa ...@@ -152,9 +155,9 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa
Map<String, Object> variables = mapper.readValue(data, Map.class); Map<String, Object> variables = mapper.readValue(data, Map.class);
// Map<String, Object> variables = new HashMap<>(); // Map<String, Object> variables = new HashMap<>();
// variables.put("data", data); // variables.put("data", data);
String busiKey = "test"; String busiKey = "busiKey";
try { try {
ApiRespPdu<String> resp = apiFlowDefinitionFeign.start(procDefId, context.getUser().getLoginName(), busiKey, variables); ApiRespPdu<String> resp = apiFlowDefinitionFeign.start(procDefId, config.getTenantId(),context.getUser().getId().toString(), busiKey, variables);
if (YesNoEnum.NO.getValue() == resp.getCode()) { if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("流程实例化异常:" + resp.getMsg()); log.error("流程实例化异常:" + resp.getMsg());
throw new AppException("流程实例化异常:" + resp.getMsg()); throw new AppException("流程实例化异常:" + resp.getMsg());
...@@ -165,4 +168,34 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa ...@@ -165,4 +168,34 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa
throw new AppException("流程实例化异常:" + e.getMessage()); throw new AppException("流程实例化异常:" + e.getMessage());
} }
} }
@Override
public String updateState(DefinitionVoPdu definitionVoPdu, Context context) {
try {
ApiRespPdu<String> resp = apiFlowDefinitionFeign.updateState(definitionVoPdu.getState(),definitionVoPdu.getDeployId(),config.getTenantId());
if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("流程挂起/激活异常:" + resp.getMsg());
throw new AppException("流程挂起/激活异常:" + resp.getMsg());
}
return resp.getData();
} catch (Exception e) {
log.error("流程挂起/激活异常", e);
throw new AppException("流程挂起/激活异常:" + e.getMessage());
}
}
@Override
public String deleteDefinition(DefinitionVoPdu definitionVoPdu, Context context) {
try {
ApiRespPdu<String> resp = apiFlowDefinitionFeign.delete(definitionVoPdu.getDeployId());
if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("删除流程异常:" + resp.getMsg());
throw new AppException("删除流程异常异常:" + resp.getMsg());
}
return resp.getData();
} catch (Exception e) {
log.error("删除流程异常异常", e);
throw new AppException(e.getMessage());
}
}
} }
\ No newline at end of file
...@@ -2,6 +2,7 @@ package com.mortals.xhx.module.flowable.web; ...@@ -2,6 +2,7 @@ package com.mortals.xhx.module.flowable.web;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.codec.Base64; import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.HashUtil; import cn.hutool.core.util.HashUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.common.IBaseEnum; import com.mortals.framework.common.IBaseEnum;
...@@ -12,6 +13,7 @@ import com.mortals.framework.web.BaseCRUDJsonController; ...@@ -12,6 +13,7 @@ import com.mortals.framework.web.BaseCRUDJsonController;
import com.mortals.framework.web.BaseCRUDMappingController; import com.mortals.framework.web.BaseCRUDMappingController;
import com.mortals.xhx.base.system.upload.service.UploadService; import com.mortals.xhx.base.system.upload.service.UploadService;
import com.mortals.xhx.common.code.FlowStateType; import com.mortals.xhx.common.code.FlowStateType;
import com.mortals.xhx.common.pdu.flow.DefinitionVoPdu;
import com.mortals.xhx.common.pdu.flow.FlowSaveXmlPdu; import com.mortals.xhx.common.pdu.flow.FlowSaveXmlPdu;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -19,6 +21,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -19,6 +21,7 @@ import org.springframework.web.bind.annotation.*;
import com.mortals.framework.web.BaseCRUDJsonMappingController; import com.mortals.framework.web.BaseCRUDJsonMappingController;
import com.mortals.xhx.module.flowable.model.FlowableDefinitionEntity; import com.mortals.xhx.module.flowable.model.FlowableDefinitionEntity;
import com.mortals.xhx.module.flowable.service.FlowableDefinitionService; import com.mortals.xhx.module.flowable.service.FlowableDefinitionService;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
...@@ -63,14 +66,14 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController< ...@@ -63,14 +66,14 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
int code = VALUE_RESULT_SUCCESS; int code = VALUE_RESULT_SUCCESS;
String busiDesc = "查询" + this.getModuleDesc(); String busiDesc = "查询" + this.getModuleDesc();
try { try {
Result<FlowableDefinitionEntity> result = this.service.getDefinList(form.getQuery(),form.getPageInfo(), getContext()); Result<FlowableDefinitionEntity> result = this.service.getDefinList(form.getQuery(), form.getPageInfo(), getContext());
this.init(request, response, form, model, getContext()); this.init(request, response, form, model, getContext());
model.put("result", result.getList()); model.put("result", result.getList());
model.put("pageInfo", result.getPageInfo()); model.put("pageInfo", result.getPageInfo());
model.putAll(form.getModel()); model.putAll(form.getModel());
this.recordSysLog(request, busiDesc + " 【成功】"); this.recordSysLog(request, busiDesc + " 【成功】");
} catch (Exception e) { } catch (Exception e) {
log.error("查询流程列表异常",e); log.error("查询流程列表异常", e);
this.doException(request, busiDesc, model, e); this.doException(request, busiDesc, model, e);
code = VALUE_RESULT_FAILURE; code = VALUE_RESULT_FAILURE;
} }
...@@ -82,13 +85,11 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController< ...@@ -82,13 +85,11 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
} }
/** /**
* 读取流程图片 * 读取流程图片
*/ */
@PostMapping(value = "readImage") @PostMapping(value = "readImage")
public String readImage(@ApiParam(value = "流程定义id")@RequestParam(value = "deployId") String deployId) { public String readImage(@ApiParam(value = "流程定义id") @RequestParam(value = "deployId") String deployId) {
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
OutputStream os = null; OutputStream os = null;
BufferedImage image = null; BufferedImage image = null;
...@@ -112,9 +113,9 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController< ...@@ -112,9 +113,9 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
* 读取流程XML * 读取流程XML
*/ */
@PostMapping(value = "readXml") @PostMapping(value = "readXml")
public String readXml(@ApiParam(value = "流程定义id")@RequestParam(value = "deployId") String deployId) { public String readXml(@ApiParam(value = "流程定义id") @RequestParam(value = "deployId") String deployId) {
log.info("readXml,deployId:"+deployId); log.info("readXml,deployId:" + deployId);
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
try { try {
String Xml = this.getService().readXml(deployId); String Xml = this.getService().readXml(deployId);
...@@ -132,14 +133,13 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController< ...@@ -132,14 +133,13 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
* 保存流程XML * 保存流程XML
*/ */
@PostMapping(value = "saveXml") @PostMapping(value = "saveXml")
public String saveXml(@ApiParam(value = "流程定义类")@RequestParam Map map) { public String saveXml(@ApiParam(value = "流程定义类") @RequestParam Map map) {
FlowSaveXmlPdu flowSaveXmlPdu = BeanUtil.fillBeanWithMap(map, new FlowSaveXmlPdu(), false); FlowSaveXmlPdu flowSaveXmlPdu = BeanUtil.fillBeanWithMap(map, new FlowSaveXmlPdu(), false);
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
try { try {
String definId = this.getService().saveXml(flowSaveXmlPdu); String definId = this.getService().saveXml(flowSaveXmlPdu, getContext());
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS); ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, "保存模型XML成功,definitionId:"+definId); ret.put(KEY_RESULT_MSG, "保存模型XML成功,definitionId:" + definId);
} catch (Exception e) { } catch (Exception e) {
log.error("保存XML异常", e); log.error("保存XML异常", e);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE); ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
...@@ -149,19 +149,18 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController< ...@@ -149,19 +149,18 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
} }
/** /**
* 启动流程定义的实例 * 启动流程定义的实例
*/ */
@PostMapping(value = "start") @PostMapping(value = "start")
public String start(@ApiParam(value = "流程定义id")@RequestParam(value = "procDefId") String procDefId, public String start(@ApiParam(value = "流程定义id") @RequestParam(value = "procDefId") String procDefId,
@ApiParam(value = "流程定义类")@RequestParam(value = "data") String data) { @ApiParam(value = "流程定义类") @RequestParam(value = "data") String data) {
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
try { try {
String proInstanceId = this.getService().start(procDefId,data,getContext()); String proInstanceId = this.getService().start(procDefId, data, getContext());
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS); ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, "部署流程实例成功,proInstanceId:"+proInstanceId); ret.put(KEY_RESULT_MSG, "部署流程实例成功,proInstanceId:" + proInstanceId);
} catch (Exception e) { } catch (Exception e) {
log.error("部署流程实例异常", e); log.error("部署流程实例异常", e);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE); ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
...@@ -170,4 +169,74 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController< ...@@ -170,4 +169,74 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
return ret.toJSONString(); return ret.toJSONString();
} }
/**
* 激活/挂起流程
*/
@PostMapping(value = "updateState")
public String updateState(@ApiParam(value = "流程定义实体类") DefinitionVoPdu definitionVoPdu) {
JSONObject ret = new JSONObject();
try {
String proInstanceId = this.getService().updateState(definitionVoPdu, getContext());
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, "挂起/激活流程成功,proInstanceId:" + proInstanceId);
} catch (Exception e) {
log.error("挂起/激活流程异常", e);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
}
return ret.toJSONString();
}
/**
* 删除流程定义
*/
@PostMapping(value = "deleteDefinition")
public String deleteDefinition(@ApiParam(value = "流程定义实体类") DefinitionVoPdu definitionVoPdu) {
JSONObject ret = new JSONObject();
try {
String deplyId = this.getService().deleteDefinition(definitionVoPdu, getContext());
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, "删除流程成功,deplyId:" + deplyId);
} catch (Exception e) {
log.error("删除流程异常", e);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
}
return ret.toJSONString();
}
/**
* 导入附件
*/
@PostMapping(value = "upload")
public String upload(@RequestParam(required = false) String name,
@RequestParam(required = false) String category,
MultipartFile multipartFile) {
JSONObject ret = new JSONObject();
try {
String xml = IoUtil.readUtf8(multipartFile.getInputStream());
FlowSaveXmlPdu flowSaveXmlPdu = new FlowSaveXmlPdu();
flowSaveXmlPdu.setCategory(category);
flowSaveXmlPdu.setName(name);
flowSaveXmlPdu.setXml(xml);
String definId = this.getService().saveXml(flowSaveXmlPdu, getContext());
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, "导入模型XML成功,definitionId:" + definId);
} catch (Exception e) {
log.error("挂起/激活流程异常", e);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
}
return ret.toJSONString();
}
} }
\ No newline at end of file
package com.mortals.xhx.module.task.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.task.model.TaskFinishEntity;
/**
* <p>Title: 工作已办表</p>
* <p>Description: TaskFinishDao DAO接口 </p>
* @author
* @version 1.0.0
*/
public interface TaskFinishDao extends ICRUDDao<TaskFinishEntity,Long>{
}
package com.mortals.xhx.module.task.dao.ibatis;
import org.springframework.stereotype.Repository;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import com.mortals.xhx.module.task.dao.TaskFinishDao;
import com.mortals.xhx.module.task.model.TaskFinishEntity;
/**
* <p>Title: 工作已办表</p>
* <p>Description: TaskFinishDaoImpl DAO接口 </p>
* @author
* @version 1.0.0
*/
@Repository("taskFinishDao")
public class TaskFinishDaoImpl extends BaseCRUDDaoMybatis<TaskFinishEntity,Long> implements TaskFinishDao {
}
package com.mortals.xhx.module.task.model;
import java.util.Date;
import com.mortals.framework.model.BaseEntityLong;
/**
*
* Description:TaskFinish
* date: 2021-8-9 9:22:48
*/
public class TaskFinishEntity extends BaseEntityLong{
private static final long serialVersionUID = 1628472168033L;
/**
* 任务编号
*/
private String taskId;
/**
* 任务节点
*/
private String taskName;
/**
* 流程编号
*/
private String procInsId;
/**
* 流程名称
*/
private String procDefName;
/**
* 流程版本
*/
private String procDefVersion;
/**
* 流程发起人
*/
private String startUserName;
/**
* 流程发起认部门
*/
private String startDeptName;
/**
* 接收时间
*/
private Date createTime;
public TaskFinishEntity(){
}
/**
* 获取 任务编号
* @return taskId
*/
public String getTaskId() {
return this.taskId;
}
/**
* 设置 任务编号
* @param taskId
*/
public void setTaskId(String taskId) {
this.taskId = taskId;
}
/**
* 获取 任务节点
* @return taskName
*/
public String getTaskName() {
return this.taskName;
}
/**
* 设置 任务节点
* @param taskName
*/
public void setTaskName(String taskName) {
this.taskName = taskName;
}
/**
* 获取 流程编号
* @return procInsId
*/
public String getProcInsId() {
return this.procInsId;
}
/**
* 设置 流程编号
* @param procInsId
*/
public void setProcInsId(String procInsId) {
this.procInsId = procInsId;
}
/**
* 获取 流程名称
* @return procDefName
*/
public String getProcDefName() {
return this.procDefName;
}
/**
* 设置 流程名称
* @param procDefName
*/
public void setProcDefName(String procDefName) {
this.procDefName = procDefName;
}
/**
* 获取 流程版本
* @return procDefVersion
*/
public String getProcDefVersion() {
return this.procDefVersion;
}
/**
* 设置 流程版本
* @param procDefVersion
*/
public void setProcDefVersion(String procDefVersion) {
this.procDefVersion = procDefVersion;
}
/**
* 获取 流程发起人
* @return startUserName
*/
public String getStartUserName() {
return this.startUserName;
}
/**
* 设置 流程发起人
* @param startUserName
*/
public void setStartUserName(String startUserName) {
this.startUserName = startUserName;
}
/**
* 获取 流程发起认部门
* @return startDeptName
*/
public String getStartDeptName() {
return this.startDeptName;
}
/**
* 设置 流程发起认部门
* @param startDeptName
*/
public void setStartDeptName(String startDeptName) {
this.startDeptName = startDeptName;
}
/**
* 获取 接收时间
* @return createTime
*/
public Date getCreateTime() {
return this.createTime;
}
/**
* 设置 接收时间
* @param createTime
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj instanceof TaskFinishEntity) {
TaskFinishEntity tmp = (TaskFinishEntity) obj;
if (this.getId().longValue() == tmp.getId().longValue()) {
return true;
}
}
return false;
}
public String toString(){
StringBuilder sb = new StringBuilder("");
sb
.append(",id:").append(getId())
.append(",taskId:").append(getTaskId())
.append(",taskName:").append(getTaskName())
.append(",procInsId:").append(getProcInsId())
.append(",procDefName:").append(getProcDefName())
.append(",procDefVersion:").append(getProcDefVersion())
.append(",startUserName:").append(getStartUserName())
.append(",startDeptName:").append(getStartDeptName())
.append(",createTime:").append(getCreateTime())
;
return sb.toString();
}
public void initAttrValue(){
this.taskId = null;
this.taskName = null;
this.procInsId = null;
this.procDefName = null;
this.procDefVersion = null;
this.startUserName = null;
this.startDeptName = null;
this.createTime = null;
}
}
\ No newline at end of file
package com.mortals.xhx.module.task.model;
import java.util.List;
import java.util.Date;
/**
*
* Description:TaskFinish
* date: 2021-8-9 9:22:48
*/
public class TaskFinishQuery extends TaskFinishEntity{
private static final long serialVersionUID = 1628472168034L;
/** 开始 ID,主键,自增长 */
private Long idStart;
/** 结束 ID,主键,自增长 */
private Long idEnd;
/** 增加 ID,主键,自增长 */
private Long idIncrement;
/** ID,主键,自增长 */
private List <Long> idList;
/** 任务编号 */
private List<String> taskIdList;
/** 任务节点 */
private List<String> taskNameList;
/** 流程编号 */
private List<String> procInsIdList;
/** 流程名称 */
private List<String> procDefNameList;
/** 流程版本 */
private List<String> procDefVersionList;
/** 流程发起人 */
private List<String> startUserNameList;
/** 流程发起认部门 */
private List<String> startDeptNameList;
/** 开始 接收时间 */
private String createTimeStart;
/** 结束 接收时间 */
private String createTimeEnd;
/** OR条件集合,列表项之间是OR,项内容之间是AND,如:(list[0].1 and list[0].2) or (list[1].3 and list[1].4) */
private List<TaskFinishQuery> orConditionList;
/** AND条件集合,列表项之间是AND,项内容之间是OR,如:(list[0].1 or list[0].2) and (list[1].3 or list[1].4) */
private List<TaskFinishQuery> andConditionList;
public TaskFinishQuery(){
}
/**
* 获取 开始 ID,主键,自增长
* @return idStart
*/
public Long getIdStart(){
return this.idStart;
}
/**
* 设置 开始 ID,主键,自增长
* @param idStart
*/
public void setIdStart(Long idStart){
this.idStart = idStart;
}
/**
* 获取 结束 ID,主键,自增长
* @return idEnd
*/
public Long getIdEnd(){
return this.idEnd;
}
/**
* 设置 结束 ID,主键,自增长
* @param idEnd
*/
public void setIdEnd(Long idEnd){
this.idEnd = idEnd;
}
/**
* 获取 增加 ID,主键,自增长
* @return idIncrement
*/
public Long getIdIncrement(){
return this.idIncrement;
}
/**
* 设置 增加 ID,主键,自增长
* @param idIncrement
*/
public void setIdIncrement(Long idIncrement){
this.idIncrement = idIncrement;
}
/**
* 获取 ID,主键,自增长
* @return idList
*/
public List<Long> getIdList(){
return this.idList;
}
/**
* 设置 ID,主键,自增长
* @param idList
*/
public void setIdList(List<Long> idList){
this.idList = idList;
}
/**
* 获取 任务编号
* @return taskIdList
*/
public List<String> getTaskIdList(){
return this.taskIdList;
}
/**
* 设置 任务编号
* @param taskIdList
*/
public void setTaskIdList(List<String> taskIdList){
this.taskIdList = taskIdList;
}
/**
* 获取 任务节点
* @return taskNameList
*/
public List<String> getTaskNameList(){
return this.taskNameList;
}
/**
* 设置 任务节点
* @param taskNameList
*/
public void setTaskNameList(List<String> taskNameList){
this.taskNameList = taskNameList;
}
/**
* 获取 流程编号
* @return procInsIdList
*/
public List<String> getProcInsIdList(){
return this.procInsIdList;
}
/**
* 设置 流程编号
* @param procInsIdList
*/
public void setProcInsIdList(List<String> procInsIdList){
this.procInsIdList = procInsIdList;
}
/**
* 获取 流程名称
* @return procDefNameList
*/
public List<String> getProcDefNameList(){
return this.procDefNameList;
}
/**
* 设置 流程名称
* @param procDefNameList
*/
public void setProcDefNameList(List<String> procDefNameList){
this.procDefNameList = procDefNameList;
}
/**
* 获取 流程版本
* @return procDefVersionList
*/
public List<String> getProcDefVersionList(){
return this.procDefVersionList;
}
/**
* 设置 流程版本
* @param procDefVersionList
*/
public void setProcDefVersionList(List<String> procDefVersionList){
this.procDefVersionList = procDefVersionList;
}
/**
* 获取 流程发起人
* @return startUserNameList
*/
public List<String> getStartUserNameList(){
return this.startUserNameList;
}
/**
* 设置 流程发起人
* @param startUserNameList
*/
public void setStartUserNameList(List<String> startUserNameList){
this.startUserNameList = startUserNameList;
}
/**
* 获取 流程发起认部门
* @return startDeptNameList
*/
public List<String> getStartDeptNameList(){
return this.startDeptNameList;
}
/**
* 设置 流程发起认部门
* @param startDeptNameList
*/
public void setStartDeptNameList(List<String> startDeptNameList){
this.startDeptNameList = startDeptNameList;
}
/**
* 获取 开始 接收时间
* @return createTimeStart
*/
public String getCreateTimeStart(){
return this.createTimeStart;
}
/**
* 设置 开始 接收时间
* @param createTimeStart
*/
public void setCreateTimeStart(String createTimeStart){
this.createTimeStart = createTimeStart;
}
/**
* 获取 结束 接收时间
* @return createTimeEnd
*/
public String getCreateTimeEnd(){
return this.createTimeEnd;
}
/**
* 设置 结束 接收时间
* @param createTimeEnd
*/
public void setCreateTimeEnd(String createTimeEnd){
this.createTimeEnd = createTimeEnd;
}
/**
* 获取 OR条件集合,列表项之间是OR,项内容之间是AND,如:(list[0].1 and list[0].2) or (list[1].3 and list[1].4)
* @return orConditionList
*/
public List<TaskFinishQuery> getOrConditionList(){
return this.orConditionList;
}
/**
* 设置 OR条件集合,列表项之间是OR,项内容之间是AND,如:(list[0].1 and list[0].2) or (list[1].3 and list[1].4)
* @param orConditionList
*/
public void setOrConditionList(List<TaskFinishQuery> orConditionList){
this.orConditionList = orConditionList;
}
/**
* 获取 AND条件集合,列表项之间是AND,项内容之间是OR,如:(list[0].1 or list[0].2) and (list[1].3 or list[1].4)
* @return andConditionList
*/
public List<TaskFinishQuery> getAndConditionList(){
return this.andConditionList;
}
/**
* 设置 AND条件集合,列表项之间是AND,项内容之间是OR,如:(list[0].1 or list[0].2) and (list[1].3 or list[1].4)
* @param andConditionList
*/
public void setAndConditionList(List<TaskFinishQuery> andConditionList){
this.andConditionList = andConditionList;
}
}
\ No newline at end of file
package com.mortals.xhx.module.task.service;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.common.pdu.flow.FlowTaskPdu;
import com.mortals.xhx.module.task.model.TaskFinishEntity;
import com.mortals.xhx.module.task.model.TaskFinishQuery;
import com.mortals.xhx.module.task.model.TaskTodoQuery;
/**
* <p>Title: 工作已办表</p>
* <p>Description: TaskFinishService service接口 </p>
* <p>Copyright: Copyright &reg; </p>
* @version 1.0.0
*/
public interface TaskFinishService extends ICRUDService<TaskFinishEntity,Long>{
Result<FlowTaskPdu> finishList(TaskFinishQuery query, PageInfo pageInfo, Context context);
}
\ No newline at end of file
...@@ -4,10 +4,7 @@ import com.mortals.framework.model.Context; ...@@ -4,10 +4,7 @@ import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo; import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result; import com.mortals.framework.model.Result;
import com.mortals.framework.service.ICRUDService; import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.common.pdu.flow.FlowNextPdu; import com.mortals.xhx.common.pdu.flow.*;
import com.mortals.xhx.common.pdu.flow.FlowTaskPdu;
import com.mortals.xhx.common.pdu.flow.FlowTaskVoPdu;
import com.mortals.xhx.common.pdu.flow.FlowViewerPdu;
import com.mortals.xhx.module.flowable.model.FlowableDefinitionEntity; import com.mortals.xhx.module.flowable.model.FlowableDefinitionEntity;
import com.mortals.xhx.module.task.model.TaskProcessEntity; import com.mortals.xhx.module.task.model.TaskProcessEntity;
import com.mortals.xhx.module.task.model.TaskProcessQuery; import com.mortals.xhx.module.task.model.TaskProcessQuery;
...@@ -55,4 +52,6 @@ public interface TaskProcessService extends ICRUDService<TaskProcessEntity,Long> ...@@ -55,4 +52,6 @@ public interface TaskProcessService extends ICRUDService<TaskProcessEntity,Long>
String delegateTask(FlowTaskVoPdu flowTaskVoPdu, Context context); String delegateTask(FlowTaskVoPdu flowTaskVoPdu, Context context);
String assignTask(FlowTaskVoPdu flowTaskVoPdu, Context context); String assignTask(FlowTaskVoPdu flowTaskVoPdu, Context context);
List<FlowUserTaskPdu> getReturnList(FlowTaskVoPdu flowTaskVoPdu, Context context);
} }
\ No newline at end of file
package com.mortals.xhx.module.task.service.impl;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.framework.util.DateUtils;
import com.mortals.xhx.base.framework.config.InterceptorConfig;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.common.pdu.api.ApiRespPdu;
import com.mortals.xhx.common.pdu.flow.FlowTaskPdu;
import com.mortals.xhx.common.utils.BeanUtil;
import com.mortals.xhx.feign.flowable.IApiFlowTaskFeign;
import com.mortals.xhx.module.data.service.DataAreaService;
import com.mortals.xhx.module.task.model.TaskFinishQuery;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.xhx.module.task.dao.TaskFinishDao;
import com.mortals.xhx.module.task.model.TaskFinishEntity;
import com.mortals.xhx.module.task.service.TaskFinishService;
import org.springframework.util.ObjectUtils;
/**
* <p>Title: 工作已办表</p>
* <p>Description: TaskFinishService service接口 </p>
* <p>Copyright: Copyright &reg; </p>
* @version 1.0.0
*/
@Service("taskFinishService")
public class TaskFinishServiceImpl extends AbstractCRUDServiceImpl<TaskFinishDao, TaskFinishEntity, Long> implements TaskFinishService {
@Autowired
private IApiFlowTaskFeign apiFlowTaskFeign;
@Autowired
private InterceptorConfig config;
@Override
public Result<FlowTaskPdu> finishList(TaskFinishQuery query, PageInfo pageInfo, Context context) {
FlowTaskPdu flowTaskPdu = new FlowTaskPdu();
flowTaskPdu.setUserId(context.getUser().getLoginName());
try {
if (!ObjectUtils.isEmpty(query)) {
BeanUtils.copyProperties(query, flowTaskPdu, BeanUtil.getNullPropertyNames(query));
}
ApiRespPdu<Result<FlowTaskPdu>> resp = apiFlowTaskFeign.finishedList(context.getUser().getId().toString(),config.getTenantId(), pageInfo);
if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("获取已办列表异常:" + resp.getMsg());
throw new AppException("获取已办列表异常:" + resp.getMsg());
}
// if (!ObjectUtils.isEmpty(resp.getData())) {
// List<TaskTodoEntity> collect = resp.getData().getList().stream().map(item -> {
// TaskTodoEntity taskTodoEntity = new TaskTodoEntity();
// BeanUtils.copyProperties(item, taskTodoEntity, BeanUtil.getNullPropertyNames(item));
// taskTodoEntity.setProcDefVersion("v" + item.getProcDefVersion());
//
// return taskTodoEntity;
// }).collect(Collectors.toList());
// result.setList(collect);
// result.setPageInfo(resp.getData().getPageInfo());
// } else {
// result.setList(Collections.emptyList());
// }
return resp.getData();
} catch (Exception e) {
throw new AppException(e.getMessage());
}
}
}
\ No newline at end of file
...@@ -5,6 +5,7 @@ import com.mortals.framework.exception.AppException; ...@@ -5,6 +5,7 @@ import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo; import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result; import com.mortals.framework.model.Result;
import com.mortals.xhx.base.framework.config.InterceptorConfig;
import com.mortals.xhx.common.code.FlowStatusEnum; import com.mortals.xhx.common.code.FlowStatusEnum;
import com.mortals.xhx.common.code.YesNoEnum; import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.common.pdu.api.ApiRespPdu; import com.mortals.xhx.common.pdu.api.ApiRespPdu;
...@@ -50,6 +51,9 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD ...@@ -50,6 +51,9 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD
@Autowired @Autowired
private FormService formService; private FormService formService;
@Autowired
private InterceptorConfig config;
@Override @Override
public Result<TaskProcessEntity> getProcessList(TaskProcessQuery query, PageInfo pageInfo, Context context) { public Result<TaskProcessEntity> getProcessList(TaskProcessQuery query, PageInfo pageInfo, Context context) {
...@@ -60,7 +64,7 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD ...@@ -60,7 +64,7 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD
if (!ObjectUtils.isEmpty(query)) { if (!ObjectUtils.isEmpty(query)) {
BeanUtils.copyProperties(query, flowTaskPdu, BeanUtil.getNullPropertyNames(query)); BeanUtils.copyProperties(query, flowTaskPdu, BeanUtil.getNullPropertyNames(query));
} }
ApiRespPdu<Result<FlowTaskPdu>> resp = apiFlowTaskFeign.myProcess(context.getUser().getLoginName(), pageInfo); ApiRespPdu<Result<FlowTaskPdu>> resp = apiFlowTaskFeign.myProcess(context.getUser().getId().toString(),config.getTenantId(), pageInfo);
if (YesNoEnum.NO.getValue() == resp.getCode()) { if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("获取流程定义列表异常:" + resp.getMsg()); log.error("获取流程定义列表异常:" + resp.getMsg());
throw new AppException("获取流程定义列表异常:" + resp.getMsg()); throw new AppException("获取流程定义列表异常:" + resp.getMsg());
...@@ -93,7 +97,7 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD ...@@ -93,7 +97,7 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD
@Override @Override
public List<FlowViewerPdu> getFlowViewer(String procInsId) { public List<FlowViewerPdu> getFlowViewer(String procInsId) {
List<FlowViewerPdu> flowViewerList = new ArrayList<>(); List<FlowViewerPdu> flowViewerList = null;
try { try {
ApiRespPdu<List<FlowViewerPdu>> resp = iApiFlowInstanceFeign.getFlowViewer(procInsId); ApiRespPdu<List<FlowViewerPdu>> resp = iApiFlowInstanceFeign.getFlowViewer(procInsId);
...@@ -163,12 +167,9 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD ...@@ -163,12 +167,9 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD
} }
// 第一次申请获取初始化表单 // 第一次申请获取初始化表单
if (!ObjectUtils.isEmpty(deployId)) { if (!ObjectUtils.isEmpty(deployId)) {
DeployFormQuery deployFormQuery = new DeployFormQuery(); DeployFormQuery deployFormQuery = new DeployFormQuery();
deployFormQuery.setDeployId(deployId); deployFormQuery.setDeployId(deployId);
FormEntity formEntity = deployFormService.find(deployFormQuery, context).stream().findFirst().map(item -> formService.get(item.getFormId(), context)).orElseGet(() -> null); FormEntity formEntity = deployFormService.find(deployFormQuery, context).stream().findFirst().map(item -> formService.get(item.getFormId(), context)).orElseGet(() -> null);
if (ObjectUtils.isEmpty(formEntity)) { if (ObjectUtils.isEmpty(formEntity)) {
throw new AppException("请先配置流程表单"); throw new AppException("请先配置流程表单");
} }
...@@ -185,7 +186,6 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD ...@@ -185,7 +186,6 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD
@Override @Override
public String stopProcess(FlowTaskVoPdu flowTaskVoPdu, Context context) { public String stopProcess(FlowTaskVoPdu flowTaskVoPdu, Context context) {
try { try {
//FlowTaskPdu flowTaskPdu = JSONObject.parseObject(data, FlowTaskPdu.class);
ApiRespPdu<String> resp = apiFlowTaskFeign.stopProcess(flowTaskVoPdu); ApiRespPdu<String> resp = apiFlowTaskFeign.stopProcess(flowTaskVoPdu);
log.info("取消申请 resp:" + JSONObject.toJSONString(resp)); log.info("取消申请 resp:" + JSONObject.toJSONString(resp));
if (YesNoEnum.NO.getValue() == resp.getCode()) { if (YesNoEnum.NO.getValue() == resp.getCode()) {
...@@ -215,36 +215,121 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD ...@@ -215,36 +215,121 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD
@Override @Override
public String reject(FlowTaskVoPdu flowTaskVoPdu, Context context) { public String reject(FlowTaskVoPdu flowTaskVoPdu, Context context) {
return null; try {
ApiRespPdu<String> resp = apiFlowTaskFeign.reject(flowTaskVoPdu);
log.info("拒绝任务 resp:" + JSONObject.toJSONString(resp));
if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("拒绝任务异常:" + resp.getMsg());
throw new AppException("拒绝异常:" + resp.getMsg());
}
return resp.getData();
} catch (Exception e) {
throw new AppException(e.getMessage());
}
} }
@Override @Override
public String taskReturn(FlowTaskVoPdu flowTaskVoPdu, Context context) { public String taskReturn(FlowTaskVoPdu flowTaskVoPdu, Context context) {
return null; try {
ApiRespPdu<String> resp = apiFlowTaskFeign.taskReturn(flowTaskVoPdu);
log.info("回退任务 resp:" + JSONObject.toJSONString(resp));
if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("回退任务异常:" + resp.getMsg());
throw new AppException("回退任务异常:" + resp.getMsg());
}
return resp.getData();
} catch (Exception e) {
throw new AppException(e.getMessage());
}
} }
@Override @Override
public String delete(FlowTaskVoPdu flowTaskVoPdu, Context context) { public String delete(FlowTaskVoPdu flowTaskVoPdu, Context context) {
return null; try {
ApiRespPdu<String> resp = apiFlowTaskFeign.delete(flowTaskVoPdu);
log.info("取消任务 resp:" + JSONObject.toJSONString(resp));
if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("取消任务异常:" + resp.getMsg());
throw new AppException("取消异常:" + resp.getMsg());
}
return resp.getData();
} catch (Exception e) {
throw new AppException(e.getMessage());
}
} }
@Override @Override
public String claim(FlowTaskVoPdu flowTaskVoPdu, Context context) { public String claim(FlowTaskVoPdu flowTaskVoPdu, Context context) {
return null; try {
ApiRespPdu<String> resp = apiFlowTaskFeign.claim(flowTaskVoPdu);
log.info("签收任务 resp:" + JSONObject.toJSONString(resp));
if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("签收任务异常:" + resp.getMsg());
throw new AppException("签收异常:" + resp.getMsg());
}
return resp.getData();
} catch (Exception e) {
throw new AppException(e.getMessage());
}
} }
@Override @Override
public String unClaim(FlowTaskVoPdu flowTaskVoPdu, Context context) { public String unClaim(FlowTaskVoPdu flowTaskVoPdu, Context context) {
return null; try {
ApiRespPdu<String> resp = apiFlowTaskFeign.unClaim(flowTaskVoPdu);
log.info("拒绝签收任务 resp:" + JSONObject.toJSONString(resp));
if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("拒绝签收任务异常:" + resp.getMsg());
throw new AppException("拒绝签收异常:" + resp.getMsg());
}
return resp.getData();
} catch (Exception e) {
throw new AppException(e.getMessage());
}
} }
@Override @Override
public String delegateTask(FlowTaskVoPdu flowTaskVoPdu, Context context) { public String delegateTask(FlowTaskVoPdu flowTaskVoPdu, Context context) {
return null; try {
ApiRespPdu<String> resp = apiFlowTaskFeign.delegateTask(flowTaskVoPdu);
log.info("委派任务 resp:" + JSONObject.toJSONString(resp));
if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("委派任务异常:" + resp.getMsg());
throw new AppException("委派异常:" + resp.getMsg());
}
return resp.getData();
} catch (Exception e) {
throw new AppException(e.getMessage());
}
} }
@Override @Override
public String assignTask(FlowTaskVoPdu flowTaskVoPdu, Context context) { public String assignTask(FlowTaskVoPdu flowTaskVoPdu, Context context) {
return null; try {
ApiRespPdu<String> resp = apiFlowTaskFeign.assignTask(flowTaskVoPdu);
log.info("转办任务 resp:" + JSONObject.toJSONString(resp));
if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("转办任务异常:" + resp.getMsg());
throw new AppException("转办异常:" + resp.getMsg());
}
return resp.getData();
} catch (Exception e) {
throw new AppException(e.getMessage());
}
}
@Override
public List<FlowUserTaskPdu> getReturnList(FlowTaskVoPdu flowTaskVoPdu, Context context) {
try {
ApiRespPdu<List<FlowUserTaskPdu>> resp = apiFlowTaskFeign.findReturnTaskList(flowTaskVoPdu);
log.info("获取所有可回退的节点 resp:" + JSONObject.toJSONString(resp));
if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("获取所有可回退的节点异常:" + resp.getMsg());
throw new AppException("拒获取所有可回退的节点异常:" + resp.getMsg());
}
return resp.getData();
} catch (Exception e) {
throw new AppException(e.getMessage());
}
} }
} }
\ No newline at end of file
...@@ -4,6 +4,7 @@ import com.mortals.framework.exception.AppException; ...@@ -4,6 +4,7 @@ import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo; import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result; import com.mortals.framework.model.Result;
import com.mortals.xhx.base.framework.config.InterceptorConfig;
import com.mortals.xhx.common.code.FlowStatusEnum; import com.mortals.xhx.common.code.FlowStatusEnum;
import com.mortals.xhx.common.code.YesNoEnum; import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.common.pdu.api.ApiRespPdu; import com.mortals.xhx.common.pdu.api.ApiRespPdu;
...@@ -47,6 +48,8 @@ public class TaskTodoServiceImpl extends AbstractCRUDServiceImpl<TaskTodoDao, Ta ...@@ -47,6 +48,8 @@ public class TaskTodoServiceImpl extends AbstractCRUDServiceImpl<TaskTodoDao, Ta
private DeployFormService deployFormService; private DeployFormService deployFormService;
@Autowired @Autowired
private FormService formService; private FormService formService;
@Autowired
private InterceptorConfig config;
@Override @Override
...@@ -58,25 +61,11 @@ public class TaskTodoServiceImpl extends AbstractCRUDServiceImpl<TaskTodoDao, Ta ...@@ -58,25 +61,11 @@ public class TaskTodoServiceImpl extends AbstractCRUDServiceImpl<TaskTodoDao, Ta
if (!ObjectUtils.isEmpty(query)) { if (!ObjectUtils.isEmpty(query)) {
BeanUtils.copyProperties(query, flowTaskPdu, BeanUtil.getNullPropertyNames(query)); BeanUtils.copyProperties(query, flowTaskPdu, BeanUtil.getNullPropertyNames(query));
} }
ApiRespPdu<Result<FlowTaskPdu>> resp = apiFlowTaskFeign.todoList(context.getUser().getLoginName(), pageInfo); ApiRespPdu<Result<FlowTaskPdu>> resp = apiFlowTaskFeign.todoList(context.getUser().getId().toString(),config.getTenantId(), pageInfo);
if (YesNoEnum.NO.getValue() == resp.getCode()) { if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("获取代办列表异常:" + resp.getMsg()); log.error("获取代办列表异常:" + resp.getMsg());
throw new AppException("获取代办列表异常:" + resp.getMsg()); throw new AppException("获取代办列表异常:" + resp.getMsg());
} }
// if (!ObjectUtils.isEmpty(resp.getData())) {
// List<TaskTodoEntity> collect = resp.getData().getList().stream().map(item -> {
// TaskTodoEntity taskTodoEntity = new TaskTodoEntity();
// BeanUtils.copyProperties(item, taskTodoEntity, BeanUtil.getNullPropertyNames(item));
// taskTodoEntity.setProcDefVersion("v" + item.getProcDefVersion());
//
// return taskTodoEntity;
// }).collect(Collectors.toList());
// result.setList(collect);
// result.setPageInfo(resp.getData().getPageInfo());
// } else {
// result.setList(Collections.emptyList());
// }
return resp.getData(); return resp.getData();
} catch (Exception e) { } catch (Exception e) {
throw new AppException("获取代办列表异常:" + e.getMessage()); throw new AppException("获取代办列表异常:" + e.getMessage());
......
package com.mortals.xhx.module.task.web;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.model.Result;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.mortals.framework.web.BaseCRUDJsonMappingController;
import com.mortals.xhx.module.task.model.TaskFinishEntity;
import com.mortals.xhx.module.task.service.TaskFinishService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/**
* <p>Title: 工作已办表</p>
* <p>Description: TaskFinishController </p>
* <p>Copyright: Copyright &reg; </p>
* <p>Company: </p>
*
* @author zxfei
* @version 1.0.0
*/
@RestController
@RequestMapping("task/finish")
public class TaskFinishController extends BaseCRUDJsonMappingController<TaskFinishService, TaskFinishForm, TaskFinishEntity, Long> {
public TaskFinishController() {
super.setFormClass(TaskFinishForm.class);
super.setModuleDesc("工作已办表");
}
/**
* 查询已办列表
*/
@PostMapping(value = "list")
public String list(HttpServletRequest request, HttpServletResponse response, TaskFinishForm form) {
Map<String, Object> model = new HashMap();
JSONObject ret = new JSONObject();
int code = VALUE_RESULT_SUCCESS;
String busiDesc = "查询" + this.getModuleDesc();
try {
Result result = this.service.finishList(form.getQuery(), form.getPageInfo(), getContext());
this.init(request, response, form, model, getContext());
model.put("result", result.getList());
model.put("pageInfo", result.getPageInfo());
model.putAll(form.getModel());
this.recordSysLog(request, busiDesc + " 【成功】");
} catch (Exception e) {
log.error("查询已办列表异常", e);
this.doException(request, busiDesc, model, e);
code = VALUE_RESULT_FAILURE;
}
ret.put("code", code);
ret.put("query", form.getQuery());
ret.put("data", model);
return ret.toJSONString();
}
}
\ No newline at end of file
package com.mortals.xhx.module.task.web;
import com.mortals.framework.web.BaseCRUDFormLong;
import com.mortals.xhx.module.task.model.TaskFinishEntity;
import com.mortals.xhx.module.task.model.TaskFinishQuery;
/**
* <p>Title: 工作已办表</p>
* <p>Description: TaskFinishForm </p>
* @author
* @version 1.0.0
*/
public class TaskFinishForm extends BaseCRUDFormLong<TaskFinishEntity> {
private TaskFinishEntity taskfinish = new TaskFinishEntity();
private TaskFinishQuery query = new TaskFinishQuery();
public TaskFinishForm(){
}
@Override
public TaskFinishEntity getEntity() {
return taskfinish;
}
public TaskFinishEntity getTaskFinish() {
return taskfinish;
}
public void setTaskFinish(TaskFinishEntity taskfinish) {
this.taskfinish = taskfinish;
}
@Override
public TaskFinishQuery getQuery() {
return query;
}
public void setQuery(TaskFinishQuery query) {
this.query = query;
}
}
\ No newline at end of file
...@@ -4,14 +4,14 @@ import com.alibaba.fastjson.JSONObject; ...@@ -4,14 +4,14 @@ import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.common.IBaseEnum; import com.mortals.framework.common.IBaseEnum;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
import com.mortals.framework.model.Result; import com.mortals.framework.model.Result;
import com.mortals.xhx.base.system.user.model.UserQuery;
import com.mortals.xhx.base.system.user.service.UserService;
import com.mortals.xhx.common.code.FlowStateType; import com.mortals.xhx.common.code.FlowStateType;
import com.mortals.xhx.common.code.FlowStatusEnum; import com.mortals.xhx.common.code.FlowStatusEnum;
import com.mortals.xhx.common.pdu.flow.FlowNextPdu; import com.mortals.xhx.common.pdu.flow.*;
import com.mortals.xhx.common.pdu.flow.FlowTaskPdu;
import com.mortals.xhx.common.pdu.flow.FlowTaskVoPdu;
import com.mortals.xhx.common.pdu.flow.FlowViewerPdu;
import com.mortals.xhx.module.flowable.web.FlowableDefinitionForm; import com.mortals.xhx.module.flowable.web.FlowableDefinitionForm;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -27,6 +27,7 @@ import java.util.Collections; ...@@ -27,6 +27,7 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
...@@ -42,6 +43,9 @@ import java.util.Map; ...@@ -42,6 +43,9 @@ import java.util.Map;
@RequestMapping("task/process") @RequestMapping("task/process")
public class TaskProcessController extends BaseCRUDJsonMappingController<TaskProcessService, TaskProcessForm, TaskProcessEntity, Long> { public class TaskProcessController extends BaseCRUDJsonMappingController<TaskProcessService, TaskProcessForm, TaskProcessEntity, Long> {
@Autowired
private UserService userService;
public TaskProcessController() { public TaskProcessController() {
super.setFormClass(TaskProcessForm.class); super.setFormClass(TaskProcessForm.class);
super.setModuleDesc("流程实例表"); super.setModuleDesc("流程实例表");
...@@ -50,6 +54,9 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro ...@@ -50,6 +54,9 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
@Override @Override
protected void init(HttpServletRequest request, HttpServletResponse response, TaskProcessForm form, Map<String, Object> model, Context context) { protected void init(HttpServletRequest request, HttpServletResponse response, TaskProcessForm form, Map<String, Object> model, Context context) {
this.addDict(model, "flowStatus", IBaseEnum.getEnumMap(FlowStatusEnum.class)); this.addDict(model, "flowStatus", IBaseEnum.getEnumMap(FlowStatusEnum.class));
this.addDict(model, "assigneeName",userService.find(new UserQuery(), getContext()).stream()
.collect(Collectors.toMap(x -> x.getId().toString(), y -> y.getRealName(), (o, n) -> n)));
} }
/** /**
...@@ -158,7 +165,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro ...@@ -158,7 +165,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
* 获取下一个节点 * 获取下一个节点
*/ */
@PostMapping(value = "nextFlowNode") @PostMapping(value = "nextFlowNode")
public String nextFlowNode( @ApiParam(value = "任务数据类")@RequestParam(value = "data") String data) { public String nextFlowNode(@ApiParam(value = "任务数据类") @RequestParam(value = "data") String data) {
log.info("receive nextFlowNode map:" + JSONObject.toJSONString(data)); log.info("receive nextFlowNode map:" + JSONObject.toJSONString(data));
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
try { try {
...@@ -177,7 +184,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro ...@@ -177,7 +184,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
* 取消申请 * 取消申请
*/ */
@PostMapping(value = "stopProcess") @PostMapping(value = "stopProcess")
public String stopProcess( @ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) { public String stopProcess(@ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
try { try {
this.getService().stopProcess(flowTaskVoPdu, getContext()); this.getService().stopProcess(flowTaskVoPdu, getContext());
...@@ -195,7 +202,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro ...@@ -195,7 +202,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
* 审核 * 审核
*/ */
@PostMapping(value = "complete") @PostMapping(value = "complete")
public String complete( @ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) { public String complete(@ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
try { try {
this.getService().complete(flowTaskVoPdu, getContext()); this.getService().complete(flowTaskVoPdu, getContext());
...@@ -213,7 +220,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro ...@@ -213,7 +220,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
* 委派任务 * 委派任务
*/ */
@PostMapping(value = "delegate") @PostMapping(value = "delegate")
public String delegate( @ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) { public String delegate(@ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
try { try {
this.getService().delegateTask(flowTaskVoPdu, getContext()); this.getService().delegateTask(flowTaskVoPdu, getContext());
...@@ -231,7 +238,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro ...@@ -231,7 +238,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
* 退回任务 * 退回任务
*/ */
@PostMapping(value = "return") @PostMapping(value = "return")
public String taskRreturn( @ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) { public String taskRreturn(@ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
try { try {
this.getService().taskReturn(flowTaskVoPdu, getContext()); this.getService().taskReturn(flowTaskVoPdu, getContext());
...@@ -245,14 +252,34 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro ...@@ -245,14 +252,34 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
return ret.toJSONString(); return ret.toJSONString();
} }
/**
* 退回任务
*/
@PostMapping(value = "returnList")
public String returnList(@ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
JSONObject ret = new JSONObject();
try {
List<FlowUserTaskPdu> returnList = this.getService().getReturnList(flowTaskVoPdu, getContext());
ret.put(KEY_RESULT_DATA, returnList);
ret.put(KEY_RESULT_MSG, "退回任务成功!");
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
} catch (Exception e) {
log.error("退回任务异常", e);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
}
return ret.toJSONString();
}
/** /**
* 驳回任务 * 驳回任务
*/ */
@PostMapping(value = "reject") @PostMapping(value = "reject")
public String rejectTask( @ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) { public String rejectTask(@ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
try { try {
this.getService().reject(flowTaskVoPdu, getContext()); this.getService().reject(flowTaskVoPdu, getContext());
ret.put(KEY_RESULT_MSG, "驳回成功!"); ret.put(KEY_RESULT_MSG, "驳回成功!");
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS); ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
} catch (Exception e) { } catch (Exception e) {
......
package com.mortals.xhx.module.task.web; package com.mortals.xhx.module.task.web;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.common.IBaseEnum;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.Result; import com.mortals.framework.model.Result;
import com.mortals.xhx.base.system.user.model.UserQuery;
import com.mortals.xhx.base.system.user.service.UserService;
import com.mortals.xhx.common.code.FlowStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -13,6 +19,7 @@ import javax.servlet.http.HttpServletRequest; ...@@ -13,6 +19,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
...@@ -27,11 +34,20 @@ import java.util.Map; ...@@ -27,11 +34,20 @@ import java.util.Map;
@RequestMapping("task/todo") @RequestMapping("task/todo")
public class TaskTodoController extends BaseCRUDJsonMappingController<TaskTodoService,TaskTodoForm,TaskTodoEntity,Long> { public class TaskTodoController extends BaseCRUDJsonMappingController<TaskTodoService,TaskTodoForm,TaskTodoEntity,Long> {
@Autowired
private UserService userService;
public TaskTodoController(){ public TaskTodoController(){
super.setFormClass(TaskTodoForm.class); super.setFormClass(TaskTodoForm.class);
super.setModuleDesc("工作代办表"); super.setModuleDesc("工作代办表");
} }
@Override
protected void init(HttpServletRequest request, HttpServletResponse response, TaskTodoForm form, Map<String, Object> model, Context context) {
this.addDict(model, "startUserName",userService.find(new UserQuery(), getContext()).stream()
.collect(Collectors.toMap(x -> x.getId().toString(), y -> y.getRealName(), (o, n) -> n)));
}
/** /**
* 查询代办列表 * 查询代办列表
......
package com.mortals.xhx.stream;
import com.alibaba.fastjson.JSON;
import com.mortals.xhx.base.framework.config.InterceptorConfig;
import com.mortals.xhx.common.pdu.flow.FlowTaskNotifyPdu;
import com.mortals.xhx.utils.stream.messaging.ProcessTaskSink;
import lombok.extern.apachecommons.CommonsLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.stereotype.Component;
/**
* @author karlhoo
*/
@CommonsLog
@Component
public class TaskProcessStreamListener {
@Autowired
private InterceptorConfig interceptorConfig;
/**
* 接收流程管理器任务
*/
@StreamListener(ProcessTaskSink.INPUT)
public void receiveTask(FlowTaskNotifyPdu task) {
log.info("comsumer message processTask:"+ JSON.toJSONString(task));
if(interceptorConfig.getTenantId().equals(task.getTenantId())){
log.info("本节点代办任务通知事件");
// TODO 通过websocket刷新页面消息
}
}
}
...@@ -30,6 +30,7 @@ mybatis: ...@@ -30,6 +30,7 @@ mybatis:
application: application:
auth: auth:
unloginUrl: /refresh,/error,/login/login,/login/index,/login/logout,/securitycode/createCode,/test*,/api/asset/*,/api/*,/swagger-ui* unloginUrl: /refresh,/error,/login/login,/login/index,/login/logout,/securitycode/createCode,/test*,/api/asset/*,/api/*,/ws/*,/swagger-ui*
uncheckUrl: /refresh,/error,/login/login,/login/index,/login/logout,/securitycode/createCode,/test*,/api/asset/*,/api/*,/swagger-ui* uncheckUrl: /refresh,/error,/login/login,/login/index,/login/logout,/securitycode/createCode,/test*,/api/asset/*,/api/*,/ws/*,/swagger-ui*
workflow:
tenantId: ${spring.application.name}
...@@ -2,6 +2,7 @@ package com.mortals.flowable; ...@@ -2,6 +2,7 @@ package com.mortals.flowable;
import com.mortals.framework.springcloud.boot.BaseWebApplication; import com.mortals.framework.springcloud.boot.BaseWebApplication;
import com.mortals.xhx.utils.stream.messaging.ProcessTaskSource;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
...@@ -9,23 +10,16 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; ...@@ -9,23 +10,16 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource; import org.springframework.context.annotation.ImportResource;
//@Import(value={GlobalExceptionHandler.class,
// // 引入修改的配置
// ApplicationConfiguration.class,
// AppDispatcherServletConfiguration.class,
// // 引入 DatabaseConfiguration 表更新转换
// DatabaseConfiguration.class
// // 引入 DatabaseConfiguration 表更新转换
// //DatabaseAutoConfiguration.class
//})
@EnableFeignClients @EnableFeignClients
@ComponentScan(basePackages = {"com.mortals.*"}) @ComponentScan(basePackages = {"com.mortals.*"})
@MapperScan("com.mortals.*.dao") @MapperScan("com.mortals.*.dao")
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class, SecurityFilterAutoConfiguration.class}) @SpringBootApplication(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class, SecurityFilterAutoConfiguration.class})
@ImportResource(locations = {"classpath:config/spring-config.xml"}) @ImportResource(locations = {"classpath:config/spring-config.xml"})
@EnableBinding({ProcessTaskSource.class})
public class WorkFlowApplication extends BaseWebApplication { public class WorkFlowApplication extends BaseWebApplication {
public static void main(String[] args) { public static void main(String[] args) {
......
package com.mortals.flowable.common.config;
import com.mortals.flowable.listener.ProcessInstanceCompleteListener;
import com.mortals.flowable.listener.ProcessInstanceStartListener;
import com.mortals.flowable.listener.TaskCreateListener;
import lombok.extern.apachecommons.CommonsLog;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType;
import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.impl.event.logger.handler.ProcessInstanceStartedEventHandler;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
/**
* 全局监听配置 ContextRefreshedEvent在类被初始化之后触发
*/
@Configuration
@CommonsLog
public class FlowableGlobListenerConfig implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private SpringProcessEngineConfiguration configuration;
@Autowired
private ProcessInstanceCompleteListener processInstanceCompleteListener;
@Autowired
private ProcessInstanceStartListener processInstanceStartListener;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskCreateListener taskCreateListener;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
FlowableEventDispatcher dispatcher = configuration.getEventDispatcher();
// 任务创建全局监听-待办消息发送
runtimeService.addEventListener(taskCreateListener, FlowableEngineEventType.TASK_CREATED);
//任务完成全局监听
// dispatcher.addEventListener(activityCompleteListener, FlowableEngineEventType.TASK_CREATED);
runtimeService.addEventListener(processInstanceStartListener, FlowableEngineEventType.PROCESS_STARTED);
runtimeService.addEventListener(processInstanceCompleteListener, FlowableEngineEventType.PROCESS_COMPLETED);
log.info("全局监听配置");
}
}
package com.mortals.flowable.common.config;
import com.google.common.collect.Maps;
import com.mortals.flowable.listener.ProcessEndListener;
import org.flowable.common.engine.api.delegate.event.FlowableEventListener;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.flowable.spring.boot.EngineConfigurationConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* @author: zxfei
* @date: 2021/8/10 0:30
* @description:
**/
//@Configuration
public class FlowableListenerConfig {
// flowable监听级别参照 {@link FlowableEngineEventType} org.flowable.common.engine.api.delegate.event
/**
* 任务节点前置监听
*/
private static final String FLOWABLE_TASK_NODE_REAR_LISTENER = "TASK_COMPLETED";
private static final String FLOWABLE_TASK_NODE_BEFORE_LISTENER = "TASK_COMPLETED";
// 自己建立监听类实现FlowableEventListener接口
/**
* 任务节点前置监听
*/
private final ProcessEndListener taskBeforeListener;
@Autowired
public FlowableListenerConfig(ProcessEndListener taskBeforeListener) {
this.taskBeforeListener = taskBeforeListener;
}
/**
* 将自定义监听器纳入flowable监听
*
* @param
* @return org.flowable.spring.boot.EngineConfigurationConfigurer<org.flowable.spring.SpringProcessEngineConfiguration>
* @author: Lu Yang
* @date: 2019/5/4 21:05
*/
@Bean
public EngineConfigurationConfigurer<SpringProcessEngineConfiguration> globalListenerConfigurer() {
return engineConfiguration -> {
engineConfiguration.setTypedEventListeners(this.customFlowableListeners());
};
}
private Map<String, List<FlowableEventListener>> customFlowableListeners() {
Map<String, List<FlowableEventListener>> listenerMap = Maps.newHashMap();
listenerMap.put(FLOWABLE_TASK_NODE_BEFORE_LISTENER, new ArrayList<>(Collections.singletonList(getTaskBeforeListener())));
return listenerMap;
}
public ProcessEndListener getTaskBeforeListener() {
return taskBeforeListener;
}
}
package com.mortals.flowable.listener;
import com.alibaba.fastjson.JSON;
import lombok.extern.apachecommons.CommonsLog;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEventListener;
import org.flowable.common.engine.impl.event.FlowableEntityEventImpl;
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author: zxfei
* @date: 2021/8/10 0:24
* @description: 全局监听器
**/
//@Component
@CommonsLog
public class ProcessEndListener implements FlowableEventListener {
// @Autowired
// FlowableService flowableService;
@Override
public void onEvent(FlowableEvent event) {
// 当前节点任务实体,
// TaskEntity taskEntity = (TaskEntity) ((FlowableEntityEventImpl) event).getEntity();
//String taskId = taskEntity.getId();
log.info("event taskEntity taskId:");
// String curActId = flowableService.getNodeId(taskId);
// String procDefId = ProcUtils.getProcessDefinitionByTaskId(taskEntity.getId()).getId();
// Process process = ProcessDefinitionUtil.getProcess(procDefId);
// //遍历整个process,找到endEventId是什么,与当前taskId作对比
// List<FlowElement> flowElements = (List<FlowElement>) process.getFlowElements();
// for (FlowElement flowElement : flowElements) {
// if (flowElement instanceof SequenceFlow) {
// SequenceFlow flow = (SequenceFlow) flowElement;
// FlowElement sourceFlowElement = flow.getSourceFlowElement();
// FlowElement targetFlowElement = flow.getTargetFlowElement();
// //如果当前边的下一个节点是endEvent,那么获取当前边
// if(targetFlowElement instanceof EndEvent && sourceFlowElement.getId().equals(curActId))
// {
// System.out.println("下一个是结束节点!!");
// }
// }
// }
}
@Override
public boolean isFailOnException() {
return false;
}
@Override
public boolean isFireOnTransactionLifecycleEvent() {
return false;
}
@Override
public String getOnTransaction() {
return null;
}
}
package com.mortals.flowable.listener;
import lombok.extern.apachecommons.CommonsLog;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.engine.FormService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @author: zxfei
* @date: 2021/8/10 7:23
* @description:
**/
@Component
@CommonsLog
public class ProcessInstanceCompleteListener extends AbstractFlowableEngineEventListener {
@Autowired
private TaskService taskService;
@Autowired
private FormService formService;
@Autowired
private RuntimeService runtimeService;
@Override
protected void processCompleted(FlowableEngineEntityEvent event) {
log.info("进入流程结束监听器……");
String processInstanceId = event.getProcessInstanceId();
Map<String, Object> variables = runtimeService.getVariables(processInstanceId);
Map<String, Object> startForm = (Map<String, Object>) variables.get("startForm");
// Form form = formService..getById(new Long((String) startForm.get("formId")));
log.info("variables: "+variables);
log.info("startForm: "+startForm);
//System.out.println("form: " + form);
super.processCompleted(event);
}
@Override
protected void taskCompleted(FlowableEngineEntityEvent event) {
log.info("进入taskCompleted监听器……");
super.taskCompleted(event);
}
@Override
public void onEvent(FlowableEvent flowableEvent) {
log.info("进入taskCompleted监听器--onEvent……");
super.onEvent(flowableEvent);
}
}
\ No newline at end of file
package com.mortals.flowable.listener;
import lombok.extern.apachecommons.CommonsLog;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.engine.FormService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener;
import org.flowable.engine.delegate.event.FlowableProcessStartedEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @author: zxfei
* @date: 2021/8/10 7:23
* @description:
**/
@Component
@CommonsLog
public class ProcessInstanceStartListener extends AbstractFlowableEngineEventListener {
@Autowired
private TaskService taskService;
@Autowired
private FormService formService;
@Autowired
private RuntimeService runtimeService;
@Override
protected void processStarted(FlowableProcessStartedEvent event) {
log.info("流程开始监听器……");
super.processStarted(event);
}
@Override
protected void taskCompleted(FlowableEngineEntityEvent event) {
log.info("进入taskCompleted监听器……");
super.taskCompleted(event);
}
@Override
public void onEvent(FlowableEvent flowableEvent) {
log.info("进入taskCompleted监听器--onEvent……");
super.onEvent(flowableEvent);
}
}
\ No newline at end of file
package com.mortals.flowable.listener;
import com.alibaba.fastjson.JSON;
import com.mortals.xhx.common.pdu.flow.FlowTaskNotifyPdu;
import com.mortals.xhx.utils.stream.messaging.ProcessTaskSource;
import com.mortals.xhx.utils.stream.service.IMessageService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEventListener;
import org.flowable.common.engine.impl.event.FlowableEntityEventImpl;
import org.flowable.engine.TaskService;
import org.flowable.identitylink.api.IdentityLink;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* 全局监听-工作流待办消息提醒
*
* @author azhuzhu
*/
@Slf4j
@Component
@RequiredArgsConstructor
@EnableBinding(ProcessTaskSource.class)
public class TaskCreateListener implements FlowableEventListener {
@Autowired
private final TaskService taskService;
@Autowired
@SuppressWarnings("all")
private IMessageService messageService;
@Autowired
@SuppressWarnings("all")
private ProcessTaskSource processTaskSource;
@Override
public void onEvent(FlowableEvent flowableEvent) {
log.info("任务创建事件全局监听!");
TaskEntity taskEntity = (TaskEntity) ((FlowableEntityEventImpl) flowableEvent).getEntity();
String taskId = taskEntity.getId();
List<IdentityLink> idList = taskService.getIdentityLinksForTask(taskId);
if (CollectionUtils.isEmpty(idList)) {
log.info("idList is null!");
return;
}
List<String> userNameList = new ArrayList<>();
// 获取接收人,此处从Identity获取,实际情况会更复杂
idList.forEach(identityLink -> {
if (StringUtils.isNotBlank(identityLink.getUserId())) {
userNameList.add(identityLink.getUserId());
}
});
if (CollectionUtils.isNotEmpty(userNameList)) {
// TODO: kafka发送提醒消息
String tenantId = taskEntity.getTenantId();
log.info(String.format("userNameList:%s,tenantId:%s", JSON.toJSONString(userNameList),tenantId));
FlowTaskNotifyPdu flowTaskNotifyPdu = new FlowTaskNotifyPdu();
flowTaskNotifyPdu.setUserNameList(userNameList);
flowTaskNotifyPdu.setTaskId(taskEntity.getId());
flowTaskNotifyPdu.setTaskName(taskEntity.getName());
flowTaskNotifyPdu.setTenantId(tenantId);
log.info("发送代办任务消息:"+JSON.toJSONString(flowTaskNotifyPdu));
messageService.sendMessage(processTaskSource.output(), JSON.toJSONString(flowTaskNotifyPdu));
}
}
@Override
public boolean isFailOnException() {
return false;
}
@Override
public boolean isFireOnTransactionLifecycleEvent() {
return false;
}
@Override
public String getOnTransaction() {
return null;
}
}
...@@ -42,7 +42,7 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IAp ...@@ -42,7 +42,7 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IAp
private static final String BPMN_FILE_SUFFIX = ".bpmn"; private static final String BPMN_FILE_SUFFIX = ".bpmn";
@Override @Override
public ApiRespPdu<Result<FlowProcDefPdu>> list(String userId, PageInfo pageInfo) { public ApiRespPdu<Result<FlowProcDefPdu>> list(String userId,String tenantId, PageInfo pageInfo) {
log.info(String.format("查询流程列表 userId:%s,PageInfo:%s", JSON.toJSONString(userId), JSON.toJSONString(pageInfo))); log.info(String.format("查询流程列表 userId:%s,PageInfo:%s", JSON.toJSONString(userId), JSON.toJSONString(pageInfo)));
ApiRespPdu<Result<FlowProcDefPdu>> rsp = new ApiRespPdu<>(); ApiRespPdu<Result<FlowProcDefPdu>> rsp = new ApiRespPdu<>();
...@@ -51,6 +51,7 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IAp ...@@ -51,6 +51,7 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IAp
// 流程定义列表数据查询 // 流程定义列表数据查询
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery() ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery()
.processDefinitionTenantId(tenantId)
.orderByProcessDefinitionId().desc(); .orderByProcessDefinitionId().desc();
Long totalCount = processDefinitionQuery.count(); Long totalCount = processDefinitionQuery.count();
pageInfo.setTotalResult(totalCount.intValue()); pageInfo.setTotalResult(totalCount.intValue());
...@@ -80,13 +81,13 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IAp ...@@ -80,13 +81,13 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IAp
} }
@Override @Override
public ApiRespPdu<String> save(String name, String category, String bpmnXml) { public ApiRespPdu<String> save(String name, String category, String bpmnXml,String tenantId) {
log.info(String.format("保存bpmnXml!name:%s,category:%s", name, category)); log.info(String.format("保存bpmnXml!name:%s,category:%s", name, category));
ApiRespPdu<String> rsp = new ApiRespPdu<>(); ApiRespPdu<String> rsp = new ApiRespPdu<>();
rsp.setCode(YesNoEnum.YES.getValue()); rsp.setCode(YesNoEnum.YES.getValue());
try { try {
Deployment deploy = repositoryService.createDeployment().addString(name + BPMN_FILE_SUFFIX, bpmnXml).name(name).category(category).deploy(); Deployment deploy = repositoryService.createDeployment().addString(name + BPMN_FILE_SUFFIX, bpmnXml).name(name).category(category).tenantId(tenantId).deploy();
ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult(); ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
repositoryService.setProcessDefinitionCategory(definition.getId(), category); repositoryService.setProcessDefinitionCategory(definition.getId(), category);
...@@ -101,12 +102,13 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IAp ...@@ -101,12 +102,13 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IAp
} }
@Override @Override
public ApiRespPdu<String> start(String deployId, String userId, String dataKey, Map<String, Object> variables) { public ApiRespPdu<String> start(String deployId,String tenantId, String userId, String dataKey, Map<String, Object> variables) {
log.info(String.format("启动!deployId:%s,userId:%s,dataKey:%s,variables:%s", deployId, userId, dataKey, JSON.toJSONString(variables))); log.info(String.format("流程实例启动!deployId:%s,userId:%s,dataKey:%s,variables:%s", deployId, userId, dataKey, JSON.toJSONString(variables)));
ApiRespPdu<String> rsp = new ApiRespPdu<>(); ApiRespPdu<String> rsp = new ApiRespPdu<>();
rsp.setCode(YesNoEnum.YES.getValue()); rsp.setCode(YesNoEnum.YES.getValue());
try { try {
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(deployId) ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(deployId)
.processDefinitionTenantId(tenantId)
.latestVersion().singleResult(); .latestVersion().singleResult();
if (!ObjectUtils.isEmpty(processDefinition) && processDefinition.isSuspended()) { if (!ObjectUtils.isEmpty(processDefinition) && processDefinition.isSuspended()) {
rsp.setCode(YesNoEnum.NO.getValue()); rsp.setCode(YesNoEnum.NO.getValue());
...@@ -139,14 +141,12 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IAp ...@@ -139,14 +141,12 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IAp
} }
@Override @Override
public ApiRespPdu<String> updateState(Integer state, String deployId) { public ApiRespPdu<String> updateState(Integer state, String deployId,String tenantId) {
log.info(String.format("激活或挂起流程定义!deployId:%s,state:%s", deployId, state)); log.info(String.format("激活或挂起流程定义!deployId:%s,state:%s", deployId, state));
ApiRespPdu<String> rsp = new ApiRespPdu<>(); ApiRespPdu<String> rsp = new ApiRespPdu<>();
rsp.setCode(YesNoEnum.YES.getValue()); rsp.setCode(YesNoEnum.YES.getValue());
try { try {
ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(deployId).singleResult(); ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().processDefinitionTenantId(tenantId).deploymentId(deployId).singleResult();
// 激活 // 激活
if (state == 1) { if (state == 1) {
repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); repositoryService.activateProcessDefinitionById(procDef.getId(), true, null);
......
...@@ -55,7 +55,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -55,7 +55,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
@Override @Override
public ApiRespPdu<Result<FlowTaskPdu>> myProcess(String userId, PageInfo pageInfo) { public ApiRespPdu<Result<FlowTaskPdu>> myProcess(String userId,String tenantId, PageInfo pageInfo) {
log.info(String.format("查询我的流程列表!query userId:%s,PageInfo:%s", JSON.toJSONString(userId), JSON.toJSONString(pageInfo))); log.info(String.format("查询我的流程列表!query userId:%s,PageInfo:%s", JSON.toJSONString(userId), JSON.toJSONString(pageInfo)));
ApiRespPdu<Result<FlowTaskPdu>> rsp = new ApiRespPdu<>(); ApiRespPdu<Result<FlowTaskPdu>> rsp = new ApiRespPdu<>();
Result<FlowTaskPdu> result = new Result<>(); Result<FlowTaskPdu> result = new Result<>();
...@@ -63,6 +63,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -63,6 +63,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
try { try {
List<HistoricProcessInstance> historicProcessInstances = historyService.createHistoricProcessInstanceQuery() List<HistoricProcessInstance> historicProcessInstances = historyService.createHistoricProcessInstanceQuery()
.startedBy(userId) .startedBy(userId)
.processInstanceTenantId(tenantId)
.orderByProcessInstanceStartTime() .orderByProcessInstanceStartTime()
.desc() .desc()
.listPage(pageInfo.getCurrPage() - 1, pageInfo.getPrePageResult()); .listPage(pageInfo.getCurrPage() - 1, pageInfo.getPrePageResult());
...@@ -85,6 +86,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -85,6 +86,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
// 流程定义信息 // 流程定义信息
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(hisIns.getProcessDefinitionId()) .processDefinitionId(hisIns.getProcessDefinitionId())
.processDefinitionTenantId(tenantId)
.singleResult(); .singleResult();
flowTask.setDeployId(pd.getDeploymentId()); flowTask.setDeployId(pd.getDeploymentId());
flowTask.setProcDefName(pd.getName()); flowTask.setProcDefName(pd.getName());
...@@ -127,7 +129,9 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -127,7 +129,9 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
} }
} else { } else {
List<HistoricTaskInstance> historicTaskInstance = historyService.createHistoricTaskInstanceQuery().processInstanceId(hisIns.getId()).orderByHistoricTaskInstanceEndTime().desc().list(); List<HistoricTaskInstance> historicTaskInstance = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(hisIns.getId())
.orderByHistoricTaskInstanceEndTime().desc().list();
flowTask.setTaskId(historicTaskInstance.get(0).getId()); flowTask.setTaskId(historicTaskInstance.get(0).getId());
} }
flowList.add(flowTask); flowList.add(flowTask);
...@@ -253,16 +257,17 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -253,16 +257,17 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
} }
@Override @Override
public ApiRespPdu<Result<FlowTaskPdu>> todoList(String userId, PageInfo pageInfo) { public ApiRespPdu<Result<FlowTaskPdu>> todoList(String userId,String tenantId, PageInfo pageInfo) {
log.info(String.format("查询我的代办列表!query userId:%s,PageInfo:%s", JSON.toJSONString(userId), JSON.toJSONString(pageInfo))); log.info(String.format("查询我的代办列表!query userId:%s,tenantId:%s,PageInfo:%s", JSON.toJSONString(userId),tenantId, JSON.toJSONString(pageInfo)));
ApiRespPdu<Result<FlowTaskPdu>> rsp = new ApiRespPdu<>(); ApiRespPdu<Result<FlowTaskPdu>> rsp = new ApiRespPdu<>();
Result<FlowTaskPdu> result = new Result<>(); Result<FlowTaskPdu> result = new Result<>();
rsp.setCode(YesNoEnum.YES.getValue()); rsp.setCode(YesNoEnum.YES.getValue());
try { try {
TaskQuery taskQuery = taskService.createTaskQuery() TaskQuery taskQuery = taskService.createTaskQuery()
.active() .active()
.taskTenantId(tenantId)
.includeProcessVariables() .includeProcessVariables()
// .taskAssignee(userId) .taskAssignee(userId)
.orderByTaskCreateTime().desc(); .orderByTaskCreateTime().desc();
pageInfo.setTotalResult(((Long) taskQuery.count()).intValue()); pageInfo.setTotalResult(((Long) taskQuery.count()).intValue());
...@@ -306,18 +311,17 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -306,18 +311,17 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
} }
@Override @Override
public ApiRespPdu<Result<FlowTaskPdu>> finishedList(String userId, PageInfo pageInfo) { public ApiRespPdu<Result<FlowTaskPdu>> finishedList(String userId,String tenantId, PageInfo pageInfo) {
log.info(String.format("查询我的已办列表!query userId:%s,PageInfo:%s", JSON.toJSONString(userId), JSON.toJSONString(pageInfo))); log.info(String.format("查询我的已办列表!query userId:%s,tenantId:%s,PageInfo:%s", JSON.toJSONString(userId),tenantId, JSON.toJSONString(pageInfo)));
ApiRespPdu<Result<FlowTaskPdu>> rsp = new ApiRespPdu<>(); ApiRespPdu<Result<FlowTaskPdu>> rsp = new ApiRespPdu<>();
Result<FlowTaskPdu> result = new Result<>(); Result<FlowTaskPdu> result = new Result<>();
rsp.setCode(YesNoEnum.YES.getValue()); rsp.setCode(YesNoEnum.YES.getValue());
try { try {
HistoricTaskInstanceQuery taskInstanceQuery = historyService.createHistoricTaskInstanceQuery() HistoricTaskInstanceQuery taskInstanceQuery = historyService.createHistoricTaskInstanceQuery()
.includeProcessVariables() .includeProcessVariables()
.finished() .finished()
.taskAssignee(userId.toString()) .taskTenantId(tenantId)
.taskAssignee(userId)
.orderByHistoricTaskInstanceEndTime() .orderByHistoricTaskInstanceEndTime()
.desc(); .desc();
List<HistoricTaskInstance> historicTaskInstanceList = taskInstanceQuery.listPage(pageInfo.getCurrPage() - 1, pageInfo.getPrePageResult()); List<HistoricTaskInstance> historicTaskInstanceList = taskInstanceQuery.listPage(pageInfo.getCurrPage() - 1, pageInfo.getPrePageResult());
...@@ -337,6 +341,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -337,6 +341,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
// 流程定义信息 // 流程定义信息
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(histTask.getProcessDefinitionId()) .processDefinitionId(histTask.getProcessDefinitionId())
.processDefinitionTenantId(tenantId)
.singleResult(); .singleResult();
flowTask.setDeployId(pd.getDeploymentId()); flowTask.setDeployId(pd.getDeploymentId());
flowTask.setProcDefName(pd.getName()); flowTask.setProcDefName(pd.getName());
...@@ -347,6 +352,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -347,6 +352,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
// 流程发起人信息 // 流程发起人信息
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(histTask.getProcessInstanceId()) .processInstanceId(histTask.getProcessInstanceId())
.processInstanceTenantId(tenantId)
.singleResult(); .singleResult();
flowTask.setStartUserId(historicProcessInstance.getStartUserId()); flowTask.setStartUserId(historicProcessInstance.getStartUserId());
flowTask.setStartUserName(historicProcessInstance.getStartUserId()); flowTask.setStartUserName(historicProcessInstance.getStartUserId());
...@@ -437,7 +443,10 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -437,7 +443,10 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
rsp.setCode(YesNoEnum.YES.getValue()); rsp.setCode(YesNoEnum.YES.getValue());
try { try {
// 流程变量 // 流程变量
HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().finished().taskId(taskId).singleResult(); HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery()
.includeProcessVariables()
.finished()
.taskId(taskId).singleResult();
if (Objects.nonNull(historicTaskInstance)) { if (Objects.nonNull(historicTaskInstance)) {
rsp.setData(historicTaskInstance.getProcessVariables()); rsp.setData(historicTaskInstance.getProcessVariables());
} else { } else {
...@@ -461,7 +470,10 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -461,7 +470,10 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
try { try {
Task task = taskService.createTaskQuery().taskId(flowTaskPdu.getTaskId()).singleResult(); Task task = taskService.createTaskQuery()
.taskId(flowTaskPdu.getTaskId())
// .taskTenantId(flowTaskPdu.getTenantId())
.singleResult();
if (ObjectUtils.isEmpty(task)) { if (ObjectUtils.isEmpty(task)) {
log.error("任务不存在"); log.error("任务不存在");
rsp.setCode(YesNoEnum.NO.getValue()); rsp.setCode(YesNoEnum.NO.getValue());
...@@ -500,8 +512,12 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -500,8 +512,12 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
} }
// 当前任务 task // 当前任务 task
Task task = taskService.createTaskQuery().taskId(flowTaskPdu.getTaskId()).singleResult(); Task task = taskService.createTaskQuery().taskId(flowTaskPdu.getTaskId()).singleResult();
// 获取流程定义信息 // 获取流程定义信息
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(task.getProcessDefinitionId())
.processDefinitionTenantId(task.getTenantId())
.singleResult();
// 获取所有节点信息 // 获取所有节点信息
Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0);
// 获取全部节点列表,包含子节点 // 获取全部节点列表,包含子节点
...@@ -532,7 +548,10 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -532,7 +548,10 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
List<String> parentUserTaskKeyList = new ArrayList<>(); List<String> parentUserTaskKeyList = new ArrayList<>();
parentUserTaskList.forEach(item -> parentUserTaskKeyList.add(item.getId())); parentUserTaskList.forEach(item -> parentUserTaskKeyList.add(item.getId()));
// 获取全部历史节点活动实例,即已经走过的节点历史,数据采用开始时间升序 // 获取全部历史节点活动实例,即已经走过的节点历史,数据采用开始时间升序
List<HistoricTaskInstance> historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery().processInstanceId(task.getProcessInstanceId()).orderByHistoricTaskInstanceStartTime().asc().list(); List<HistoricTaskInstance> historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(task.getProcessInstanceId())
.taskTenantId(task.getTenantId())
.orderByHistoricTaskInstanceStartTime().asc().list();
// 数据清洗,将回滚导致的脏数据清洗掉 // 数据清洗,将回滚导致的脏数据清洗掉
List<String> lastHistoricTaskInstanceList = FlowableUtils.historicTaskInstanceClean(allElements, historicTaskInstanceList); List<String> lastHistoricTaskInstanceList = FlowableUtils.historicTaskInstanceClean(allElements, historicTaskInstanceList);
// 此时历史任务实例为倒序,获取最后走的节点 // 此时历史任务实例为倒序,获取最后走的节点
...@@ -600,8 +619,8 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT ...@@ -600,8 +619,8 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IApiFlowT
if (targetIds.size() > 1) { if (targetIds.size() > 1) {
// 1 对 多任务跳转,currentIds 当前节点(1),targetIds 跳转到的节点(多) // 1 对 多任务跳转,currentIds 当前节点(1),targetIds 跳转到的节点(多)
runtimeService.createChangeActivityStateBuilder() runtimeService.createChangeActivityStateBuilder()
.processInstanceId(task.getProcessInstanceId()). .processInstanceId(task.getProcessInstanceId())
moveSingleActivityIdToActivityIds(currentIds.get(0), targetIds).changeState(); .moveSingleActivityIdToActivityIds(currentIds.get(0), targetIds).changeState();
} }
// 如果父级任务只有一个,因此当前任务可能为网关中的任务 // 如果父级任务只有一个,因此当前任务可能为网关中的任务
if (targetIds.size() == 1) { if (targetIds.size() == 1) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment