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

工作流添加websocket相关

parent b41bafcd
......@@ -44,6 +44,12 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
......
......@@ -89,7 +89,7 @@ public class FlowTaskPdu implements Serializable {
private String candidate;
@ApiModelProperty("任务创建时间")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty("任务完成时间")
......@@ -110,4 +110,7 @@ public class FlowTaskPdu implements Serializable {
@ApiModelProperty("审批组")
private List<String> candidateGroups;
@ApiModelProperty("租户Id")
private String tenantId;
}
......@@ -48,4 +48,7 @@ public class FlowTaskVoPdu implements Serializable {
@ApiModelProperty("审批组")
private List<String> candidateGroups;
@ApiModelProperty("租户Id")
private String tenantId;
}
package com.mortals.xhx.common.pdu.flow;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
......@@ -7,8 +8,19 @@ import java.io.Serializable;
@Data
public class FlowUserTaskPdu implements Serializable {
/**
* 用户id
*/
private String id;
/**
* 用户名称
*/
private String name;
/**
* 租户Id
*/
private String tenantId;
}
......@@ -28,7 +28,9 @@ public interface IApiFlowDefinitionFeign extends IFeign {
* @return
*/
@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文件
......@@ -41,12 +43,13 @@ public interface IApiFlowDefinitionFeign extends IFeign {
@PostMapping("/flowable/def/save")
ApiRespPdu<String> save(@RequestParam(required = false) String name,
@RequestParam(required = false) String category,
@RequestParam(required = false) String bpmnXml);
@RequestParam(required = false) String bpmnXml,
@RequestParam(required = false) String tenantId);
/**
* 启动流程
*
* @param procDefId 部署的流程 Id,来自 ACT_RE_PROCDEF
* @param procDefId 部署的流程 Id,来自 ACT_RE_PROCDEF
* @param userId 业务发起人
* @param dataKey 业务数据 Key,业务键,一般为表单数据的 ID,仅作为表单数据与流程实例关联的依据
* @param variables 变量集合,json对象
......@@ -55,6 +58,7 @@ public interface IApiFlowDefinitionFeign extends IFeign {
*/
@PostMapping("/flowable/def/start")
ApiRespPdu<String> start(@RequestParam(value = "procDefId") String procDefId,
@RequestParam(value = "tenantId") String tenantId,
@RequestParam(value = "userId") String userId,
@RequestParam(value = "dataKey") String dataKey,
@RequestBody Map<String, Object> variables);
......@@ -68,7 +72,8 @@ public interface IApiFlowDefinitionFeign extends IFeign {
*/
@PostMapping(value = "/flowable/def/updateState")
ApiRespPdu<String> updateState(@RequestParam Integer state,
@RequestParam String deployId);
@RequestParam String deployId,
@RequestParam String tenantId);
/**
* 删除流程
......
......@@ -32,7 +32,9 @@ public interface IApiFlowTaskFeign extends IFeign {
* @return
*/
@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 {
*/
@PostMapping("/flowable/task/todoList")
ApiRespPdu<Result<FlowTaskPdu>> todoList(@RequestParam(value = "userId") String userId,
@RequestParam(value = "tenantId") String tenantId,
@RequestBody PageInfo pageInfo);
......@@ -78,6 +81,7 @@ public interface IApiFlowTaskFeign extends IFeign {
*/
@PostMapping("/flowable/task/finishedList")
ApiRespPdu<Result<FlowTaskPdu>> finishedList(@RequestParam(value = "userId") String userId,
@RequestParam(value = "tenantId") String tenantId,
@RequestBody PageInfo pageInfo);
......@@ -89,7 +93,7 @@ public interface IApiFlowTaskFeign extends IFeign {
* @return
*/
@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);
/**
......
/*
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 @@
"js-beautify": "1.13.0",
"js-cookie": "2.2.1",
"jsencrypt": "3.0.0-rc.1",
"json-bigint": "^0.3.0",
"nprogress": "0.2.0",
"quill": "1.3.7",
"screenfull": "5.0.2",
"sockjs-client": "^1.5.1",
"sortablejs": "1.10.2",
"json-bigint": "^0.3.0",
"stompjs": "^2.3.3",
"v-charts": "^1.17.10",
"vkbeautify": "^0.99.3",
"vue": "^2.6.14",
......
......@@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<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">
</head>
<body>
......
......@@ -22,11 +22,6 @@ export function getProcessVariables(taskId) {
// 激活/挂起流程
export function 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) {
// })
}
// 指定流程办理组列表
// 指定流程办理组列表(由角色确定)
export function roleList(query) {
return normalCallPost('/role/list', query)
// return request({
// url: '/flowable/definition/roleList',
// method: 'get',
......@@ -89,7 +85,9 @@ export function updateDeployment(data) {
// 删除流程定义
export function delDeployment(query) {
// /{id:[formId]}
return normalCallPost('/flowable/definition/deleteDefinition', {deployId:[query.deployId]})
// return request({
// url: '/flowable/definition/delete/',
// method: 'delete',
......@@ -99,6 +97,7 @@ export function delDeployment(query) {
// 导出流程定义
export function exportDeployment(query) {
return normalCallPost('/flowable/definition/export', query)
// return request({
// url: '/system/deployment/export',
// method: 'get',
......
......@@ -4,7 +4,7 @@ import {normalCallPost} from '@/assets/utils/index';
// 查询已办任务列表
export function finishedList(query) {
return normalCallPost('/flowable/definition/list', query)
return normalCallPost('/task/finish/list', query)
// return request({
// url: '/flowable/task/finishedList',
......@@ -26,6 +26,7 @@ export function flowRecord(query) {
// 撤回任务
export function revokeProcess(data) {
return normalCallPost('/task/process/revokeProcess', query)
// return request({
// url: '/flowable/task/revokeProcess',
// method: 'post',
......
......@@ -61,6 +61,10 @@ export function addDeployForm(data) {
// 导出流程表单
export function exportForm(query) {
return normalCallPost(
"/form/export",
query
)
// return request({
// url: '/flowable/form/export',
// method: 'get',
......
import {normalCallPost} from '@/assets/utils/index';
// 查询待办任务列表
export function todoList(query) {
// return request({
// url: '/flowable/task/todoList',
// method: 'get',
// params: query
// })
}
// 完成任务
export function complete(data) {
return normalCallPost('/task/process/complete', data)
// return request({
// url: '/flowable/task/complete',
// method: 'post',
// data: data
// })
}
// 委派任务
export function delegate(data) {
return normalCallPost('/task/process/delegate', data)
// return request({
// url: '/flowable/task/delegate',
// method: 'post',
......@@ -30,6 +19,7 @@ export function delegate(data) {
// 退回任务
export function returnTask(data) {
return normalCallPost('/task/process/return', data)
// return request({
// url: '/flowable/task/return',
// method: 'post',
......@@ -39,15 +29,13 @@ export function returnTask(data) {
// 驳回任务
export function rejectTask(data) {
// return request({
// url: '/flowable/task/reject',
// method: 'post',
// data: data
// })
return normalCallPost('/task/process/reject', data)
}
// 可退回任务列表
export function returnList(data) {
return normalCallPost('/task/process/returnList', data)
// return request({
// url: '/flowable/task/returnList',
// method: 'post',
......
......@@ -20,11 +20,12 @@ export class TreeCache extends Cache {
}
async getData() {
const result = await super.getData();
const data = result.map(i=>{
if(!i.parentId) {
i.parentId = -1;
const data = result.map(item=>{
//console.log(i)
if(!item.parentId) {
item.parentId = -1;
}
return i;
return item;
});
return this.cache.data = data;
}
......@@ -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列表
......@@ -136,6 +137,7 @@ export function getParentName(id, list, arr, name) {
*/
export function buildTree(pid, list) {
const data = list.filter(i=>pid == i.parentId);
return data.length ? data.map(i=>{
return {
value: i.id,
......
......@@ -152,7 +152,7 @@ export default {
label: '指定人员',
allowCreate: 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'
},
{
......@@ -162,7 +162,7 @@ export default {
multiple: true,
allowCreate: 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'
},
{
......
......@@ -36,12 +36,14 @@ const router = new Router({
builder('tool/build/index', 'tool/build/index'),//表单设计器
builder('flowable/task/record/index', 'flowable/task/record/index'),//流程申请
...restBuilder('task/process', 'flowable/task/process'), //我的流程
...restBuilder('task/todo', 'flowable/task/todo'), //代办列表
...restBuilder('task/finish', 'flowable/task/finished'), //已办列表
...restBuilder('device', 'device'), // 设备管理-连接历史
//在此添加业务模块
......
......@@ -25,6 +25,7 @@
style="margin-left: 10px"
icon="el-icon-tickets"
size="mini"
disabled
@click="handleExport"
>导出</el-button
>
......@@ -65,6 +66,22 @@
提示:仅允许导入“bpmn20.xml”格式文件!
</div>
</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">
<el-button type="primary" @click="submitFileForm">确 定</el-button>
<el-button @click="upload.open = false">取 消</el-button>
......@@ -78,7 +95,7 @@
width="70%"
append-to-body
>
<el-image :src="readImage.src"></el-image>
<!-- <el-image :src="readImage.src"></el-image> -->
<flow :xmlData="xmlData" />
</el-dialog>
......@@ -115,6 +132,7 @@
</template>
<script>
import { treeCache } from "@/assets/utils/tree";
import {
listDefinition,
updateState,
......@@ -148,6 +166,7 @@ export default {
// });
// },
// 取消按钮
cancel() {
this.open = false;
this.reset();
......@@ -186,25 +205,17 @@ export default {
});
},
/** 流程图查看 */
handleReadImage(deploymentId) {
handleReadImage(row) {
console.log("流程图查看");
this.$post("/flowable/definition/readImage", {
deployId: deploymentId,
}).then(({ data }) => {
this.readImage.title = "流程图";
this.readImage.open = true;
this.readImage.src = data.src;
// this.data = data.result;
});
this.readImage.title = "流程图";
this.readImage.open = true;
// this.readImage.src = process.env.VUE_APP_BASE_API + "/flowable/definition/readImage/" + deploymentId;
// 发送请求,获取xml
// readXml(deploymentId).then(res =>{
// this.xmlData = res.data
// })
// 发送请求,获取xml
readXml(row.deploymentId).then(res =>{
this.xmlData = res.data
})
},
/** 表单查看 */
handleForm(formId) {
......@@ -216,6 +227,14 @@ export default {
this.formConf = JSON.parse(res.data.entity.formContent);
});
},
readXml(row) {
definitionStart(row.id).then((res) => {
this.msgSuccess(res.msg);
});
},
/** 启动流程 */
handleDefinitionStart(row) {
console.log("启动流程");
......@@ -276,7 +295,7 @@ export default {
state: state
}
updateState(params).then(res => {
this.message.success("修改成功");
this.$message.success("更新成功!");
this.getData();
});
},
......@@ -324,8 +343,9 @@ export default {
}).then(function() {
return delDeployment(params);
}).then(() => {
this.getList();
this.msgSuccess("删除成功");
this.$message.success("删除成功");
this.getData();
})
},
/** 导出按钮操作 */
......@@ -348,20 +368,20 @@ export default {
},
// 文件上传中处理
handleFileUploadProgress(event, file, fileList) {
//this.upload.isUploading = true;
this.upload.isUploading = true;
},
// 文件上传成功处理
handleFileSuccess(response, file, fileList) {
// this.upload.open = false;
// this.upload.isUploading = false;
// this.$refs.upload.clearFiles();
// this.$message(response.msg);
// this.getList();
this.upload.open = false;
this.upload.isUploading = false;
this.$refs.upload.clearFiles();
this.$message.success(response.msg);
this.getData();
},
// 提交上传文件
submitFileForm() {
console.log("上传附件");
// this.$refs.upload.submit();
this.$refs.upload.submit();
},
},
data() {
......@@ -407,8 +427,8 @@ export default {
// 设置上传的请求头部
// headers: { Authorization: "Bearer " + getToken() },
// 上传的地址
//url: process.env.VUE_APP_BASE_API + "/flowable/definition/import"
url: "",
url: "/m/flowable/definition/upload",
},
// 查询参数
queryParams: {
......@@ -465,7 +485,19 @@ export default {
{
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 {
<el-button
type="text"
onClick={() => {
this.handleReadImage(row.deploymentId);
this.handleForm(row.formId);
}}
>
{row.formName}
......
<template>
<div>
<Breadcrumb slot='breadcrumb' :list='breadcrumbList'></Breadcrumb>
<div>
<Breadcrumb slot="breadcrumb" :list="breadcrumbList"></Breadcrumb>
<bpmn-modeler
ref="refNode"
:xml="xml"
......@@ -14,7 +13,12 @@
@dataType="dataType"
/>
<!--在线查看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>
<pre v-highlight>
<code class="xml">
......@@ -23,48 +27,59 @@
</pre>
</div>
</el-dialog>
</div>
</div>
</template>
<script>
//import form from "@/assets/mixins/form";
import table from "@/assets/mixins/table";
import {readXml, roleList, saveXml, 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'
import {
readXml,
roleList,
saveXml,
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 {
name: "Model",
// mixins: [form],
// mixins: [form],
components: {
bpmnModeler,
vkbeautify
vkbeautify,
},
// 自定义指令
directives: {
highlight:(el) => {
let blocks = el.querySelectorAll('pre code');
highlight: (el) => {
let blocks = el.querySelectorAll("pre code");
blocks.forEach((block) => {
Hljs.highlightBlock(block)
})
}
Hljs.highlightBlock(block);
});
},
},
data() {
return {
breadcrumbList:[{name:'测试1'},{name:'测试2'}],
breadcrumbList: [
{ name: "流程管理", path: "" },
{ name: "流程定义", path: "/flowable/definition/list" },
{ name: "流程", path: "" },
],
xml: "", // 后端查询到的xml
modeler:"",
modeler: "",
xmlOpen: false,
xmlTitle: '',
xmlContent: '',
xmlTitle: "",
xmlContent: "",
users: [],
groups: [],
categorys: [],
categorys: [
{ dictLabel: "测试分类一", dictValue: "测试分类一" },
{ dictLabel: "测试分类二", dictValue: "测试分类二" },
],
};
},
created () {
created() {
const deployId = this.$route.query && this.$route.query.deployId;
// 查询流程xml
if (deployId) {
......@@ -72,22 +87,22 @@ export default {
this.getModelDetail(deployId);
}
console.log("新增");
// this.getDicts("sys_process_category").then(res => {
// this.getDicts("processCategory").then(res => {
// console.log(res);
// this.categorys = res.data;
// });
// this.getDataList()
this.getDataList();
},
methods: {
/** xml 文件 */
getModelDetail(deployId) {
console.log("发送请求,获取xml");
// 发送请求,获取xml
readXml(deployId).then(res =>{
console.log(res);
// 发送请求,获取xml
readXml(deployId).then((res) => {
// console.log(res);
this.xml = res.data;
this.modeler = res.data
})
this.modeler = res.data;
});
},
/** 保存xml */
save(data) {
......@@ -95,15 +110,14 @@ export default {
const params = {
name: data.process.name,
category: data.process.category,
xml: data.xml
}
saveXml(params).then(res => {
xml: data.xml,
};
saveXml(params).then((res) => {
this.$message.success(res.msg);
// 关闭当前标签页并返回上个页面
this.$store.dispatch("tagsView/delView", this.$route);
this.$router.go(-1)
})
this.$router.go(-1);
});
},
/** 指定流程办理人员列表 */
getDataList() {
......@@ -112,50 +126,62 @@ export default {
// const params = {
//
// }
// userList().then(res =>{
// res.data.forEach(val =>{
// val.userId = val.userId.toString();
// })
// this.users = res.data;
// let arr = {nickName: "流程发起人", userId: "${INITIATOR}"}
// this.users.push(arr)
// });
// roleList().then(res =>{
// res.data.forEach(val =>{
// val.roleId = val.roleId.toString();
// })
// this.groups = res.data;
// });
userList().then((res) => {
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();
});
//this.users = res.data.result;
let arr = { realName: "流程发起人", id: "${INITIATOR}" };
this.users.push(arr);
console.log("users:"+this.users);
});
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;
});
},
/** 展示xml */
showXML(data){
showXML(data) {
console.log("展示xml");
this.xmlTitle = 'xml查看';
this.xmlTitle = "xml查看";
this.xmlOpen = true;
debugger
//debugger
this.xmlContent = vkbeautify.xml(data);
},
/** 获取数据类型 */
dataType(data){
console.log("获取数据类型");
dataType(data) {
console.log("获取数据类型", data);
this.users = [];
this.groups = [];
if (data) {
if (data.dataType === 'dynamic') {
if (data.userType === 'assignee') {
this.users = [{nickName: "${INITIATOR}", userId: "${INITIATOR}"},
{nickName: "#{approval}", userId: "#{approval}"}
]
} else if (data.userType === 'candidateUsers') {
this.users = [ {nickName: "#{approval}", userId: "#{approval}"}]
if (data.dataType === "dynamic") {
if (data.userType === "assignee") {
this.users = [
{ realName: "${INITIATOR}", id: "${INITIATOR}" },
{ realName: "#{approval}", id: "#{approval}" },
];
} else if (data.userType === "candidateUsers") {
this.users = [
{ realName: "#{approval}", id: "#{approval}" },
];
} else {
this.groups = [{roleName: "#{approval}", roleId: "#{approval}"}]
this.groups = [{ roleName: "#{approval}", roleId: "#{approval}" }];
}
} else {
this.getDataList()
this.getDataList();
}
}
}
},
},
};
</script>
......@@ -32,7 +32,7 @@
<el-table-column label="流程名称" align="center" prop="name" />
<el-table-column label="流程版本" align="center">
<template slot-scope="scope">
<el-tag size="medium">v{{ scope.row.version }}</el-tag>
<el-tag size="medium">{{ scope.row.version }}</el-tag>
</template>
</el-table-column>
<el-table-column label="流程分类" align="center" prop="category" />
......@@ -344,8 +344,9 @@ export default {
},
{
prop: "assignee",
prop: "assigneeName",
label: "办理人",
formatter:this.formatter
},
{
......
......@@ -29,9 +29,9 @@
<el-select style="width: 50%" v-model="assignee" @change="handleCheckChange" :multiple="taskForm.multiple" placeholder="请选择">
<el-option
v-for="item in userDataList"
:key="item.userId"
:label="item.nickName"
:value="item.userId">
:key="item.loginName"
:label="item.realName"
:value="item.loginName">
</el-option>
</el-select>
</el-form-item>
......@@ -86,7 +86,7 @@
<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.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.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 {
// }, 1000)
},
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 文件 */
getModelDetail(deployId) {
// 发送请求,获取xml
......@@ -274,7 +293,6 @@ export default {
this.formConfOpen = true
}
}).catch(res => {
console.log(2222);
this.goBack();
})
},
......
......@@ -90,6 +90,7 @@ export default {
return form;
},
treeSelected(val) {
console.log(val);
this.form.parentId = val.slice().pop();
}
},
......
<template>
<layout-form>
<el-form
:model="form"
:loading="loading"
:rules="rules"
size='small'
label-width='100px'
ref="form"
:model="form"
:loading="loading"
:rules="rules"
size="small"
label-width="100px"
ref="form"
>
<el-row>
<Field label="参数名称" prop="name" v-model="form.name"/>
<Field label="一级组织" prop="firstOrganize" v-model="form.firstOrganize"/>
<Field label="二级组织" 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'/>
<Field label="参数名称" prop="name" v-model="form.name" />
<Field
label="一级组织"
prop="firstOrganize"
v-model="form.firstOrganize"
/>
<Field
label="二级组织"
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>
<form-buttons @submit='submitForm'/>
<form-buttons @submit="submitForm" />
</el-form>
</layout-form>
</template>
<script>
import form from '@/assets/mixins/form';
import form from "@/assets/mixins/form";
export default {
mixins: [form],
async created() {
this.$post("/data/area/list", { "query.id": 1431 }, {})
.then((res) => {
const data = res.data.result.map((i) => {
console.log(i);
return {
value: i.id,
label: i.areaName,
level: i.areaLevel,
children: [],
};
});
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 {
toString: ['validStatus', 'modStatus', 'displayType'],
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' },],
name: [{ required: true, message: "请输入参数名称", trigger: "blur" }],
paramKey: [
{ required: true, message: "请输入参数键", trigger: "blur" },
],
paramValue: [
{ required: true, message: "请输入参数值", trigger: "blur" },
],
},
}
}
}
};
},
};
</script>
......@@ -8,8 +8,15 @@
label-width='120px'
ref="form"
>
<el-row>
<Field label="任务名称" prop="name" v-model="form.name"/>
<Field label="关键字" prop="taskKey" v-model="form.taskKey"/>
<Field label="执行服务" prop="excuteService" v-model="form.excuteService" :enumData='dict.excuteService' type='select' />
......
<template>
<div class="page">
<LayoutTable :data='tableData' :config='tableConfig' notAdd notDel />
<LayoutTable :data='tableData' :config='tableConfig' notDel />
<el-dialog title="用户已分配的角色" :visible.sync="role.visible">
<el-form :model="role.form">
......
......@@ -10,7 +10,7 @@
ref="form"
>
<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="realName" v-model="form.realName" />
<Field label="手机号码" prop="mobile" v-model="form.mobile" />
......
......@@ -524,7 +524,7 @@ export default {
...this.formConf
}
console.log("表单JSON:",JSON.stringify(this.formData));
//console.log("表单JSON:",JSON.stringify(this.formData));
this.form.formContent = JSON.stringify(this.formData);
this.formOpen = true;
this.formTitle = "添加表单";
......
......@@ -2183,6 +2183,13 @@ buffer@^5.4.3:
base64-js "^1.3.1"
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:
version "3.0.0"
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:
resolved "https://registry.nlark.com/cyclist/download/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
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:
version "1.14.1"
resolved "https://registry.nlark.com/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
......@@ -3746,6 +3761,32 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1"
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:
version "3.1.1"
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:
utils-merge "1.0.1"
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:
version "2.0.1"
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:
dependencies:
has-symbols "^1.0.2"
is-typedarray@~1.0.0:
is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.nlark.com/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
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:
resolved "https://registry.nlark.com/neo-async/download/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
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:
version "1.0.5"
resolved "https://registry.nlark.com/nice-try/download/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
......@@ -6496,6 +6549,11 @@ node-forge@^0.10.0:
resolved "https://registry.nlark.com/node-forge/download/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
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:
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"
......@@ -8559,9 +8617,9 @@ snapdragon@^0.8.1:
source-map-resolve "^0.5.0"
use "^3.1.0"
sockjs-client@^1.5.0:
sockjs-client@^1.5.0, sockjs-client@^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=
dependencies:
debug "^3.2.6"
......@@ -8769,6 +8827,13 @@ stdout-stream@^1.4.0:
dependencies:
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:
version "2.0.2"
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:
media-typer "0.3.0"
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:
version "0.0.6"
resolved "https://registry.nlark.com/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
......@@ -9522,6 +9604,13 @@ use@^3.1.0:
resolved "https://registry.nlark.com/use/download/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
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:
version "1.0.2"
resolved "https://registry.nlark.com/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
......@@ -9903,6 +9992,18 @@ websocket-extensions@>=0.1.1:
resolved "https://registry.nlark.com/websocket-extensions/download/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
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:
version "1.0.2"
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:
resolved "https://registry.nlark.com/y18n/download/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
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:
version "2.1.2"
resolved "https://registry.nlark.com/yallist/download/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
......
......@@ -61,6 +61,12 @@
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.5.2</version>
</dependency>
</dependencies>
......
package com.mortals.xhx;
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.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.context.annotation.ImportResource;
//import springfox.documentation.swagger2.annotations.EnableSwagger2;
......@@ -12,6 +15,7 @@ import org.springframework.context.annotation.ImportResource;
@SpringBootApplication(scanBasePackages = {"com.mortals"})
@ServletComponentScan("com.mortals")
@ImportResource(locations = {"classpath:config/spring-config.xml"})
@EnableBinding({ProcessTaskSink.class})
public class ManagerApplication extends BaseWebApplication {
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 {
} else {
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()")
public void doAfterReturning(Object object) {
......
......@@ -5,6 +5,7 @@ import java.util.Set;
import javax.annotation.PostConstruct;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
......@@ -30,6 +31,14 @@ public class InterceptorConfig {
@Value("${application.auth.uncheckUrl}")
private String uncheckAuthUrl;
/**
* 工作流租户id
*/
@Value("${application.workflow.tenantId}")
@Getter
private String tenantId;
private Set<String> uncheckLoginUrls = 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
if (form.getQuery().getStatus() == null) {
form.getQuery().setStatus(YesNo.YES.getValue());
}
// if(StringUtils.isEmpty(form.getQuery().getName())){
// form.getQuery().setLevel(AreaLevelEnum.PROVINCE.getValue());
// }
if(StringUtils.isEmpty(form.getQuery().getName())){
form.getQuery().setLevel(AreaLevelEnum.PROVINCE.getValue());
}
return super.list(request, response, form);
}catch(Exception e){
log.error("查询区域信息列表错误",e);
......
......@@ -32,7 +32,7 @@ public class UploadController extends BaseController {
private UploadService uploadService;
@RequestMapping(value = "upload")
public String doFileUpload(HttpServletRequest request, HttpServletResponse response, UploadForm form) {
public String doFileUpload(HttpServletRequest request, HttpServletResponse response, UploadForm form) {
Map<String, Object> model = new HashMap<>();
String jsonStr = "";
try {
......
......@@ -41,7 +41,7 @@ public class RequestDispatchController {
ApiRespPdu<String> respPdu = new ApiRespPdu<>();
try {
String xml = IoUtil.readUtf8(multipartFile.getInputStream());
respPdu = apiFlowDefinitionFeign.save("test", "请假", xml);
respPdu = apiFlowDefinitionFeign.save("test", "请假", xml,"test");
} catch (Exception 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;
import com.mortals.framework.model.Result;
import com.mortals.framework.service.ICRUDService;
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.FlowSaveXmlPdu;
import com.mortals.xhx.module.flowable.model.FlowableDefinitionEntity;
......@@ -31,8 +32,12 @@ public interface FlowableDefinitionService extends ICRUDService<FlowableDefiniti
String readXml(String deployId);
String saveXml(FlowSaveXmlPdu flowSaveXmlPdu);
String saveXml(FlowSaveXmlPdu flowSaveXmlPdu,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;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo;
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.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.FlowSaveXmlPdu;
import com.mortals.xhx.common.utils.BeanUtil;
......@@ -49,6 +51,8 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa
private FormService formService;
@Autowired
private IApiFlowDefinitionFeign apiFlowDefinitionFeign;
@Autowired
private InterceptorConfig config;
@Override
public Result<FlowableDefinitionEntity> getDefinList(FlowableDefinitionQuery query, PageInfo pageInfo, Context context) {
......@@ -58,8 +62,7 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa
if (!ObjectUtils.isEmpty(query)) {
BeanUtils.copyProperties(query, flowProcDefPdu, BeanUtil.getNullPropertyNames(query));
}
ApiRespPdu<Result<FlowProcDefPdu>> resp = apiFlowDefinitionFeign.list(context.getUser().getLoginName(), pageInfo);
ApiRespPdu<Result<FlowProcDefPdu>> resp = apiFlowDefinitionFeign.list(context.getUser().getId().toString(),config.getTenantId(),pageInfo);
if (YesNoEnum.NO.getValue() == resp.getCode()) {
log.error("获取流程定义列表异常:" + resp.getMsg());
throw new AppException("获取流程定义列表异常:" + resp.getMsg());
......@@ -129,9 +132,9 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa
}
@Override
public String saveXml(FlowSaveXmlPdu flowSaveXmlPdu) {
public String saveXml(FlowSaveXmlPdu flowSaveXmlPdu,Context context) {
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()) {
log.error("保存流程XML异常:" + resp.getMsg());
throw new AppException("保存流程XML异常:" + resp.getMsg());
......@@ -152,9 +155,9 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa
Map<String, Object> variables = mapper.readValue(data, Map.class);
// Map<String, Object> variables = new HashMap<>();
// variables.put("data", data);
String busiKey = "test";
String busiKey = "busiKey";
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()) {
log.error("流程实例化异常:" + resp.getMsg());
throw new AppException("流程实例化异常:" + resp.getMsg());
......@@ -165,4 +168,34 @@ public class FlowableDefinitionServiceImpl extends AbstractCRUDServiceImpl<Flowa
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;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.HashUtil;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.common.IBaseEnum;
......@@ -12,6 +13,7 @@ import com.mortals.framework.web.BaseCRUDJsonController;
import com.mortals.framework.web.BaseCRUDMappingController;
import com.mortals.xhx.base.system.upload.service.UploadService;
import com.mortals.xhx.common.code.FlowStateType;
import com.mortals.xhx.common.pdu.flow.DefinitionVoPdu;
import com.mortals.xhx.common.pdu.flow.FlowSaveXmlPdu;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -19,6 +21,7 @@ import org.springframework.web.bind.annotation.*;
import com.mortals.framework.web.BaseCRUDJsonMappingController;
import com.mortals.xhx.module.flowable.model.FlowableDefinitionEntity;
import com.mortals.xhx.module.flowable.service.FlowableDefinitionService;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
......@@ -63,14 +66,14 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
int code = VALUE_RESULT_SUCCESS;
String busiDesc = "查询" + this.getModuleDesc();
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());
model.put("result", result.getList());
model.put("pageInfo", result.getPageInfo());
model.putAll(form.getModel());
this.recordSysLog(request, busiDesc + " 【成功】");
} catch (Exception e) {
log.error("查询流程列表异常",e);
log.error("查询流程列表异常", e);
this.doException(request, busiDesc, model, e);
code = VALUE_RESULT_FAILURE;
}
......@@ -82,13 +85,11 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
}
/**
* 读取流程图片
*/
@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();
OutputStream os = null;
BufferedImage image = null;
......@@ -97,7 +98,7 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
byte[] bytes = Base64.decode(base64);
// uploadService.saveFileUpload()
// uploadService.saveFileUpload()
jsonObject.put("src", VALUE_RESULT_SUCCESS);
jsonObject.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
} catch (Exception e) {
......@@ -112,9 +113,9 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
* 读取流程XML
*/
@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();
try {
String Xml = this.getService().readXml(deployId);
......@@ -132,14 +133,13 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
* 保存流程XML
*/
@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);
JSONObject ret = new JSONObject();
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_MSG, "保存模型XML成功,definitionId:"+definId);
ret.put(KEY_RESULT_MSG, "保存模型XML成功,definitionId:" + definId);
} catch (Exception e) {
log.error("保存XML异常", e);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
......@@ -149,19 +149,18 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
}
/**
* 启动流程定义的实例
*/
@PostMapping(value = "start")
public String start(@ApiParam(value = "流程定义id")@RequestParam(value = "procDefId") String procDefId,
@ApiParam(value = "流程定义类")@RequestParam(value = "data") String data) {
public String start(@ApiParam(value = "流程定义id") @RequestParam(value = "procDefId") String procDefId,
@ApiParam(value = "流程定义类") @RequestParam(value = "data") String data) {
JSONObject ret = new JSONObject();
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_MSG, "部署流程实例成功,proInstanceId:"+proInstanceId);
ret.put(KEY_RESULT_MSG, "部署流程实例成功,proInstanceId:" + proInstanceId);
} catch (Exception e) {
log.error("部署流程实例异常", e);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
......@@ -170,4 +169,74 @@ public class FlowableDefinitionController extends BaseCRUDJsonMappingController<
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;
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.FlowNextPdu;
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.common.pdu.flow.*;
import com.mortals.xhx.module.flowable.model.FlowableDefinitionEntity;
import com.mortals.xhx.module.task.model.TaskProcessEntity;
import com.mortals.xhx.module.task.model.TaskProcessQuery;
......@@ -55,4 +52,6 @@ public interface TaskProcessService extends ICRUDService<TaskProcessEntity,Long>
String delegateTask(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;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo;
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.YesNoEnum;
import com.mortals.xhx.common.pdu.api.ApiRespPdu;
......@@ -50,6 +51,9 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD
@Autowired
private FormService formService;
@Autowired
private InterceptorConfig config;
@Override
public Result<TaskProcessEntity> getProcessList(TaskProcessQuery query, PageInfo pageInfo, Context context) {
......@@ -60,7 +64,7 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD
if (!ObjectUtils.isEmpty(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()) {
log.error("获取流程定义列表异常:" + resp.getMsg());
throw new AppException("获取流程定义列表异常:" + resp.getMsg());
......@@ -93,7 +97,7 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD
@Override
public List<FlowViewerPdu> getFlowViewer(String procInsId) {
List<FlowViewerPdu> flowViewerList = new ArrayList<>();
List<FlowViewerPdu> flowViewerList = null;
try {
ApiRespPdu<List<FlowViewerPdu>> resp = iApiFlowInstanceFeign.getFlowViewer(procInsId);
......@@ -163,12 +167,9 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD
}
// 第一次申请获取初始化表单
if (!ObjectUtils.isEmpty(deployId)) {
DeployFormQuery deployFormQuery = new DeployFormQuery();
deployFormQuery.setDeployId(deployId);
FormEntity formEntity = deployFormService.find(deployFormQuery, context).stream().findFirst().map(item -> formService.get(item.getFormId(), context)).orElseGet(() -> null);
if (ObjectUtils.isEmpty(formEntity)) {
throw new AppException("请先配置流程表单");
}
......@@ -185,7 +186,6 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD
@Override
public String stopProcess(FlowTaskVoPdu flowTaskVoPdu, Context context) {
try {
//FlowTaskPdu flowTaskPdu = JSONObject.parseObject(data, FlowTaskPdu.class);
ApiRespPdu<String> resp = apiFlowTaskFeign.stopProcess(flowTaskVoPdu);
log.info("取消申请 resp:" + JSONObject.toJSONString(resp));
if (YesNoEnum.NO.getValue() == resp.getCode()) {
......@@ -215,36 +215,121 @@ public class TaskProcessServiceImpl extends AbstractCRUDServiceImpl<TaskProcessD
@Override
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
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
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
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
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
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
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;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo;
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.YesNoEnum;
import com.mortals.xhx.common.pdu.api.ApiRespPdu;
......@@ -47,6 +48,8 @@ public class TaskTodoServiceImpl extends AbstractCRUDServiceImpl<TaskTodoDao, Ta
private DeployFormService deployFormService;
@Autowired
private FormService formService;
@Autowired
private InterceptorConfig config;
@Override
......@@ -58,25 +61,11 @@ public class TaskTodoServiceImpl extends AbstractCRUDServiceImpl<TaskTodoDao, Ta
if (!ObjectUtils.isEmpty(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()) {
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());
......
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;
import com.mortals.framework.common.IBaseEnum;
import com.mortals.framework.model.Context;
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.FlowStatusEnum;
import com.mortals.xhx.common.pdu.flow.FlowNextPdu;
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.common.pdu.flow.*;
import com.mortals.xhx.module.flowable.web.FlowableDefinitionForm;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -27,6 +27,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
......@@ -42,6 +43,9 @@ import java.util.Map;
@RequestMapping("task/process")
public class TaskProcessController extends BaseCRUDJsonMappingController<TaskProcessService, TaskProcessForm, TaskProcessEntity, Long> {
@Autowired
private UserService userService;
public TaskProcessController() {
super.setFormClass(TaskProcessForm.class);
super.setModuleDesc("流程实例表");
......@@ -50,6 +54,9 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
@Override
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, "assigneeName",userService.find(new UserQuery(), getContext()).stream()
.collect(Collectors.toMap(x -> x.getId().toString(), y -> y.getRealName(), (o, n) -> n)));
}
/**
......@@ -112,8 +119,8 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
*/
@PostMapping(value = "flowRecord")
public String flowRecord(HttpServletRequest request, HttpServletResponse response,
@ApiParam(value = "流程实例id") @RequestParam(value = "procInsId", required = false) String procInsId,
@ApiParam(value = "流程定义id") @RequestParam(value = "deployId", required = false) String deployId) {
@ApiParam(value = "流程实例id") @RequestParam(value = "procInsId", required = false) String procInsId,
@ApiParam(value = "流程定义id") @RequestParam(value = "deployId", required = false) String deployId) {
log.info("receive flowRecord,procInsId:" + procInsId + " deployId:" + deployId);
Map<String, Object> model = new HashMap();
......@@ -121,7 +128,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
int code = VALUE_RESULT_SUCCESS;
String busiDesc = "查询" + this.getModuleDesc();
try {
Map<String, Object> record = this.service.flowRecord(procInsId, deployId, getContext());
Map<String, Object> record = this.service.flowRecord(procInsId, deployId, getContext());
ret.put(KEY_RESULT_DATA, record);
this.recordSysLog(request, busiDesc + " 【成功】");
} catch (Exception e) {
......@@ -158,7 +165,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
* 获取下一个节点
*/
@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));
JSONObject ret = new JSONObject();
try {
......@@ -177,7 +184,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
* 取消申请
*/
@PostMapping(value = "stopProcess")
public String stopProcess( @ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
public String stopProcess(@ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
JSONObject ret = new JSONObject();
try {
this.getService().stopProcess(flowTaskVoPdu, getContext());
......@@ -195,7 +202,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
* 审核
*/
@PostMapping(value = "complete")
public String complete( @ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
public String complete(@ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
JSONObject ret = new JSONObject();
try {
this.getService().complete(flowTaskVoPdu, getContext());
......@@ -213,7 +220,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
* 委派任务
*/
@PostMapping(value = "delegate")
public String delegate( @ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
public String delegate(@ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
JSONObject ret = new JSONObject();
try {
this.getService().delegateTask(flowTaskVoPdu, getContext());
......@@ -231,7 +238,7 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
* 退回任务
*/
@PostMapping(value = "return")
public String taskRreturn( @ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
public String taskRreturn(@ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
JSONObject ret = new JSONObject();
try {
this.getService().taskReturn(flowTaskVoPdu, getContext());
......@@ -245,14 +252,34 @@ public class TaskProcessController extends BaseCRUDJsonMappingController<TaskPro
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")
public String rejectTask( @ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
public String rejectTask(@ApiParam(value = "任务数据类") FlowTaskVoPdu flowTaskVoPdu) {
JSONObject ret = new JSONObject();
try {
this.getService().reject(flowTaskVoPdu, getContext());
ret.put(KEY_RESULT_MSG, "驳回成功!");
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
} catch (Exception e) {
......
package com.mortals.xhx.module.task.web;
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.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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -13,6 +19,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
/**
......@@ -27,11 +34,20 @@ import java.util.Map;
@RequestMapping("task/todo")
public class TaskTodoController extends BaseCRUDJsonMappingController<TaskTodoService,TaskTodoForm,TaskTodoEntity,Long> {
@Autowired
private UserService userService;
public TaskTodoController(){
super.setFormClass(TaskTodoForm.class);
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:
application:
auth:
unloginUrl: /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/*,/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/*,/ws/*,/swagger-ui*
workflow:
tenantId: ${spring.application.name}
......@@ -2,6 +2,7 @@ package com.mortals.flowable;
import com.mortals.framework.springcloud.boot.BaseWebApplication;
import com.mortals.xhx.utils.stream.messaging.ProcessTaskSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
......@@ -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.SecurityFilterAutoConfiguration;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;
//@Import(value={GlobalExceptionHandler.class,
// // 引入修改的配置
// ApplicationConfiguration.class,
// AppDispatcherServletConfiguration.class,
// // 引入 DatabaseConfiguration 表更新转换
// DatabaseConfiguration.class
// // 引入 DatabaseConfiguration 表更新转换
// //DatabaseAutoConfiguration.class
//})
@EnableFeignClients
@ComponentScan(basePackages = {"com.mortals.*"})
@MapperScan("com.mortals.*.dao")
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class, SecurityFilterAutoConfiguration.class})
@ImportResource(locations = {"classpath:config/spring-config.xml"})
@EnableBinding({ProcessTaskSource.class})
public class WorkFlowApplication extends BaseWebApplication {
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;
}
}
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