提交 9457bcbd authored 作者: whydesc's avatar whydesc

--工作流实现分支

上级 c9689b4d
......@@ -12,7 +12,8 @@
import {ref, watch} from "vue";
// import formCreate from "@form-create/ant-design-vue";
// import { default as formCreate } from '@form-create/ant-design-vue'
import * as formCreate from '@form-create/ant-design-vue'
//import * as formCreate from '@form-create/ant-design-vue'
import formCreate from '@form-create/ant-design-vue';
const option = ref([]);
const rule = ref([]);
......
......@@ -10,9 +10,9 @@
<script setup>
import {ref, watch} from "vue";
//import formCreate from "@form-create/ant-design-vue";
import formCreate from "@form-create/ant-design-vue";
// import { default as formCreate } from '@form-create/ant-design-vue'
import * as formCreate from '@form-create/ant-design-vue'
//import * as formCreate from '@form-create/ant-design-vue'
const option = ref([]);
const rule = ref([]);
......
......@@ -24,11 +24,26 @@
</a-button>
</a-space>
</div>
<div class="action-right">
<div class="next-node-info">
<span class="next-node-label">下一节点:</span>
<a-tag color="blue" class="next-node-tag">
<a-select
v-model:value="nextNodeNameSele"
placeholder="请选择下一个节点"
style="width: 100%"
@change="handleChange"
v-if="shownextNodeNameSele"
>
<a-select-option
v-for="item in tableOptions"
:key="item.id"
:value="item.value"
>
{{ item.name }}
</a-select-option>
</a-select>
<a-tag color="blue" class="next-node-tag" v-if="shownextNodeNametext">
{{ nextNodeName || '等待确定下一节点' }}
</a-tag>
</div>
......@@ -225,11 +240,22 @@
const loadingFlowChart = ref(false);
const formKey = ref(0);
const showApprovalUi = ref(true);
const flowData = ref<any>({});
const flowRecordList = ref<any[]>([]);
const nextNodeName = ref('');
const nextNode = ref<any>(null);
const nextNodenum = ref(0);
const tableOptions = ref([]);
const nextNodeNameSele = ref('');
const nextNodeNameSelevue = ref(0);
const shownextNodeNameSele = ref(true);
const shownextNodeNametext = ref(false);
const res0 = ref();
const res1 = ref();
const res3 = ref();
const taskForm = reactive({
returnTaskShow: false,
......@@ -366,6 +392,8 @@
}
let { taskId } = taskForm;
if (!taskId) {
// try to resolve taskId by business id from workFlowData
const dataId = workFlowData.value?.dataId || workFlowData.value?.id || workFlowData.value?.businessId;
......@@ -389,6 +417,7 @@
const resData = await flowTaskForm({ taskId });
const { flowForm = {} } = resData;
formTp.value = flowForm.formTp;
if (flowForm.formTp == '1') {
await refCruInnerForm.value.iniData(flowForm);
} else {
......@@ -484,19 +513,29 @@
comment: '',
values: {},
};
//找到选择的下一步节点
if(nextNodenum.value>1){
submitData.values['userTaskid'] = nextNodeNameSelevue.value;
}
if (!showApprovalUi.value) {
await complete(submitData);
emit('callback');
return false;
}
const formData = await validate();
Object.assign(submitData, formData);
submitData.comment = submitData.comment || '';
if (!isFixed.value) {
//alert("dd"+isFixed.value);
// if (!isFixed.value) {
//alert("dd"+userType.value);
if (userType.value === 'user') {
submitData.values['approval'] = formData.checkSendUser;
submitData.values['approvalType'] = 'user';
if (formData.checkSendUser) {
submitData.values['approval'] = formData.checkSendUser;
submitData.values['approvalType'] = 'user';
......@@ -505,8 +544,8 @@
submitData.values['approval'] = formData.checkSendRole;
submitData.values['approvalType'] = 'role';
}
}
// }
console.log("执行发送 ",submitData);
// 执行发送
const result = await complete(submitData);
......@@ -539,6 +578,56 @@
console.log('流程图加载完成');
};
const handleChange = (value: string) => {
console.log(`selected ${value}`);
nextNodeNameSelevue.value=value;
console.log(" nextNodeNameSelevue.value ",nextNodeNameSelevue.value);
if(value==0){
ChangeSelectNodeAfter(res0);
}
if(value==1){
ChangeSelectNodeAfter(res1);
}
if(value==2){
ChangeSelectNodeAfter(res2);
}
};
function ChangeSelectNodeAfter(res) {
isFixed.value = res.dataType == 'fixed' ? true : false;
if (isFixed.value && !isApproval.value) {
showApprovalUi.value;
}
nextNode.value = res;
nextNodeName.value = res.userTask?.name || '';
//alert(""+res.dataType);
if (res.type === 'role') {
removeSchemaByFiled('checkSendUser');
if (res.dataType === 'fixed' && res.userTask?.candidateGroups) {
setFieldsValue({
checkSendRole: res.userTask.candidateGroups,
});
}
} else {
removeSchemaByFiled('checkSendRole');
if (res.dataType === 'fixed' && res.userTask?.assignee) {
setFieldsValue({
checkSendUser: res.userTask.assignee,
});
}
}
}
const iniData = async (data: any) => {
try {
// 设置工作流数据
......@@ -563,38 +652,61 @@
}
if (taskForm.taskId) {
const res = await getNextFlowNode({ taskId: taskForm.taskId });
if (res == null) {
const reslist = await getNextFlowNode({ taskId: taskForm.taskId });
console.log("getNextFlowNode reslist ",reslist);
if (reslist == null) {
nextNodeName.value = '结束';
removeSchemaByFiled('checkSendRole');
removeSchemaByFiled('checkSendUser');
showApprovalUi.value = isApproval.value;
shownextNodeNameSele.value =false;
shownextNodeNametext.value =true;
return false;
}
isFixed.value = res.dataType == 'fixed' ? true : false;
if (isFixed.value && !isApproval.value) {
showApprovalUi.value;
}
nextNode.value = res;
nextNodeName.value = res.userTask?.name || '';
if (res.type === 'role') {
removeSchemaByFiled('checkSendUser');
if (res.dataType === 'fixed' && res.userTask?.candidateGroups) {
setFieldsValue({
checkSendRole: res.userTask.candidateGroups,
}else{
shownextNodeNameSele.value =true;
shownextNodeNametext.value =false;
nextNodenum.value=reslist.length;
//why工作流修改
// 使用 for 循环赋值
for (let i = 0; i <reslist.length; i++) {
let resb = reslist[i];
tableOptions.value.push({
id: `${i}`,
name: `${resb.userTask.name}`,
value: `${i}`
});
}
} else {
removeSchemaByFiled('checkSendRole');
if (res.dataType === 'fixed' && res.userTask?.assignee) {
setFieldsValue({
checkSendUser: res.userTask.assignee,
});
}
}
nextNodeNameSele.value = tableOptions.value[0].name;
// tableOptions.value = res.userTaskList;
const res = reslist[0]; // 获取第一行数据
console.log("res ",res);
ChangeSelectNodeAfter(res);
if(reslist.length==1){
res0.value = reslist[0];
}
if(reslist.length==2){
res0.value = reslist[0];
res1.value = reslist[1];
}
if(reslist.length==3){
res0.value = reslist[0];
res1.value = reslist[1];
res2.value = reslist[2];
}
}
}
// 加载流转记录
......
......@@ -16,6 +16,10 @@ public class FlowNextDto implements Serializable {
* 节点对象
*/
private UserTask userTask;
/**
* 待办节点对象 why工作流修改
*/
private List<UserTask> userTaskList;
/**
* 待办人员
*/
......
......@@ -18,4 +18,5 @@ public class FlowTaskVo {
private String assignee;
private List<String> candidateUsers;
private List<String> candidateGroups;
private String userTaskid;
}
......@@ -35,6 +35,104 @@ public class FindNextNodeUtil {
}
public static void next(Collection<FlowElement> flowElements, FlowElement flowElement, Map<String, Object> map, List<UserTask> nextUser) {
//如果是结束节点
if (flowElement instanceof EndEvent) {
//如果是子任务的结束节点
if (getSubProcess(flowElements, flowElement) != null) {
flowElement = getSubProcess(flowElements, flowElement);
}
}else {
//获取Task的出线信息--可以拥有多个
List<SequenceFlow> outGoingFlows = null;
if (flowElement instanceof Task) {
outGoingFlows = ((Task) flowElement).getOutgoingFlows();
} else if (flowElement instanceof Gateway) {
outGoingFlows = ((Gateway) flowElement).getOutgoingFlows();
} else if (flowElement instanceof StartEvent) {
outGoingFlows = ((StartEvent) flowElement).getOutgoingFlows();
} else if (flowElement instanceof SubProcess) {
outGoingFlows = ((SubProcess) flowElement).getOutgoingFlows();
} else if (flowElement instanceof CallActivity) {
outGoingFlows = ((CallActivity) flowElement).getOutgoingFlows();
}
int outGoingFlowssize = outGoingFlows.size();
if (outGoingFlows != null && outGoingFlows.size() > 0) {
int lxxh = outGoingFlows.size() - outGoingFlowssize;
//遍历所有的出线--找到可以正确执行的那一条
for (SequenceFlow sequenceFlow : outGoingFlows) {
//1.有表达式,且为true
//2.无表达式
String expression = sequenceFlow.getConditionExpression();
if (expression == null || Boolean.parseBoolean(
String.valueOf(
result(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))))) {
//出线的下一节点
String nextFlowElementID = sequenceFlow.getTargetRef();
if (checkSubProcess(nextFlowElementID, flowElements, nextUser)) {
continue;
}
//查询下一节点的信息
FlowElement nextFlowElement = getFlowElementById(nextFlowElementID, flowElements);
//调用流程
if (nextFlowElement instanceof CallActivity) {
CallActivity ca = (CallActivity) nextFlowElement;
if (ca.getLoopCharacteristics() != null) {
UserTask userTask = new UserTask();
userTask.setId(ca.getId());
userTask.setId(ca.getId());
userTask.setLoopCharacteristics(ca.getLoopCharacteristics());
userTask.setName(ca.getName());
nextUser.add(userTask);
}
next(flowElements, nextFlowElement, map, nextUser);
}
//用户任务
if (nextFlowElement instanceof UserTask) {
nextUser.add((UserTask) nextFlowElement);
}
//排他网关
else if (nextFlowElement instanceof ExclusiveGateway) {
if (lxxh > 0) {
// continue;
}
//next(flowElements, nextFlowElement, map, nextUser);
nextByGateway(flowElements, nextFlowElement, map, nextUser);
}
//并行网关
else if (nextFlowElement instanceof ParallelGateway) {
if (lxxh > 0) {
// continue;
}
next(flowElements, nextFlowElement, map, nextUser);
}
//接收任务
else if (nextFlowElement instanceof ReceiveTask) {
next(flowElements, nextFlowElement, map, nextUser);
}
//服务任务
else if (nextFlowElement instanceof ServiceTask) {
next(flowElements, nextFlowElement, map, nextUser);
}
//子任务的起点
else if (nextFlowElement instanceof StartEvent) {
next(flowElements, nextFlowElement, map, nextUser);
}
//结束节点
else if (nextFlowElement instanceof EndEvent) {
next(flowElements, nextFlowElement, map, nextUser);
}
}
lxxh++;
}
}
}
}
public static void nextByGateway(Collection<FlowElement> flowElements, FlowElement flowElement, Map<String, Object> map, List<UserTask> nextUser) {
//如果是结束节点
if (flowElement instanceof EndEvent) {
//如果是子任务的结束节点
......@@ -61,10 +159,7 @@ public class FindNextNodeUtil {
//1.有表达式,且为true
//2.无表达式
String expression = sequenceFlow.getConditionExpression();
if (expression == null ||Boolean.parseBoolean(
String.valueOf(
result(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))))) {
//出线的下一节点
//出线的下一节点
String nextFlowElementID = sequenceFlow.getTargetRef();
if (checkSubProcess(nextFlowElementID, flowElements, nextUser)) {
continue;
......@@ -114,7 +209,7 @@ public class FindNextNodeUtil {
else if (nextFlowElement instanceof EndEvent) {
next(flowElements, nextFlowElement, map, nextUser);
}
}
}
}
}
......@@ -215,9 +310,12 @@ public class FindNextNodeUtil {
public static Object result(Map<String, Object> map, String expression) {
FelEngine fel = new FelEngineImpl();
FelContext ctx = fel.getContext();
for (Map.Entry<String, Object> entry : map.entrySet()) {
ctx.set(entry.getKey(), entry.getValue());
if(map!=null){
for (Map.Entry<String, Object> entry : map.entrySet()) {
ctx.set(entry.getKey(), entry.getValue());
}
}
Object result = fel.eval(expression);
return result;
}
......
......@@ -104,10 +104,12 @@ public class FlowInstanceServiceImpl extends FlowServiceFactory implements IFlow
String zdmc="";
String zdval="";
if(formValues.get("dataName")==null){
if(formValues.get("_value")!=null) {
Map zdv=(Map)formValues.get("_value");
zdmc=(String)zdv.get("dataName");
zdval=zdv.get("dataId").toString();
Map zdv = (Map) formValues.get("_value");
zdmc = (String) zdv.get("dataName");
zdval = zdv.get("dataId").toString();
}
}else{
zdmc=(String)formValues.get("dataName");
......
......@@ -115,6 +115,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment());
//Long userId = SecurityUtils.getLoginUser().getUser().getUserId();
SysUser loginUser = iFlowThirdService.getLoginUser();
taskService.complete(taskVo.getTaskId(), taskVo.getValues());
Object userTypeObject = taskVo.getValues().get("approvalType");
......@@ -122,13 +123,16 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
Task nextTask = taskService.createTaskQuery()
.processInstanceId(taskVo.getInstanceId())
.singleResult();
String userType = userTypeObject.toString();
String approvalId = taskVo.getValues().get("approval").toString();
if(userType.equals("user")) {
taskService.setAssignee(nextTask.getId(), approvalId);
} else {
taskService.addCandidateGroup(nextTask.getId(),approvalId);
if(nextTask!=null){
String userType = userTypeObject.toString();
String approvalId = taskVo.getValues().get("approval").toString();
if(userType.equals("user")) {
taskService.setAssignee(nextTask.getId(), approvalId);
} else {
taskService.addCandidateGroup(nextTask.getId(),approvalId);
}
}
}
}
......@@ -1579,12 +1583,17 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
*/
@Override
public Result getNextFlowNode(FlowTaskVo flowTaskVo) {
/** 1个节点 逻辑
// todo 似乎逻辑未写完,待检查
FlowNextDto flowNextDto = this.getNextFlowNode(flowTaskVo.getTaskId(), flowTaskVo.getValues());
// if (flowNextDto==null) {
// return Result.OK("流程已完结", null);
// }
return Result.OK(flowNextDto);
*/
List<FlowNextDto> flowNextDto = this.getNextFlowNodeList(flowTaskVo.getTaskId(), flowTaskVo.getValues());
return Result.OK(flowNextDto);
}
/**
......@@ -1657,6 +1666,12 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
flowNextDto.setNodeisApprove(issApprove);
}
//why工作流修改
if(nextUserTask!=null&&nextUserTask.size()>0){
flowNextDto.setUserTaskList(nextUserTask);
}
return flowNextDto;
}
......@@ -1664,6 +1679,90 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
return null;
}
/**
* 获取下一个节点信息,流程定义上的节点信息
* @param taskId 当前节点id
* @param values 流程变量
* @return 如果返回null,表示没有下一个节点,流程结束
*/
public List<FlowNextDto> getNextFlowNodeList(String taskId, Map<String, Object> values) {
List<FlowNextDto> FlowNextDtoList=new ArrayList<>();
//当前节点
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if (Objects.nonNull(task)) {
// 下个任务节点
List<UserTask> nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, values);
if (CollectionUtils.isNotEmpty(nextUserTask)) {
for (UserTask userTask : nextUserTask) {
FlowNextDto flowNextDto = new FlowNextDto();
flowNextDto.setUserTask(userTask);
//待办人员
List<SysUser> sysUserFromTask = this.getSysUserFromTask(userTask);
flowNextDto.setUserList(sysUserFromTask);
MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics();
if (Objects.nonNull(multiInstance)) {
// 会签 多实例
String collectionString = multiInstance.getInputDataItem();
Object colObj = values.get(collectionString);
List<String> userNameList = null;
if(colObj!=null){
userNameList = (List) colObj;
}
if (CollUtil.isNotEmpty(userNameList)){
// 待办人员从变量中获取 否则就是节点中配置的用户 sysUserFromTask
List<SysUser> userList = Lists.newArrayList();
for (String username : userNameList) {
SysUser userByUsername = iFlowThirdService.getUserByUsername(username);
if (userByUsername==null){
throw new CustomException(username + " 用户名未找到");
} else {
userList.add(userByUsername);
}
}
flowNextDto.setUserList(userList);
} else {
// 变量中没有传入,写入节点中配置的用户
List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList());
values.put(collectionString,collect_username);
}
} else {
// todo 读取自定义节点属性做些啥?
//String dataType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_DATA_TYPE);
String dataType="fixed";
String userType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_USER_TYPE);
flowNextDto.setType(userType);
if(userType.equals("user")&&(userTask.getAssignee()==null||(userTask.getAssignee()!=null&&userTask.getAssignee().equals("")))){
dataType="dynamic";
}
if(userType.equals("role")&&(userTask.getCandidateGroups()==null||(userTask.getCandidateGroups()!=null&&userTask.getCandidateGroups().size()==0))){
dataType="dynamic";
}
if(userType.equals("role")&&(userTask.getCandidateGroups()!=null&&userTask.getCandidateGroups().size()>0)){
dataType="fixed";
}
flowNextDto.setDataType(dataType);
}
boolean issApprove=this.getNextFlowNodeIsApprove(taskId);
flowNextDto.setNodeisApprove(issApprove);
FlowNextDtoList.add(flowNextDto);
}
return FlowNextDtoList;
}
}
return null;
}
public List<SysUser> getSysUserFromTask(UserTask userTask) {
String assignee = userTask.getAssignee();
if (StrUtil.isNotBlank(assignee)){
......@@ -1981,9 +2080,12 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
String formUrlparval="";
String formUrlpar="";
if(formValues.get("dataId")==null){
Map zdv=(Map)formValues.get("_value");
formUrlpar=(String)zdv.get("dataName");
formUrlparval=zdv.get("dataId").toString();
if(formValues.get("_value")!=null){
Map zdv=(Map)formValues.get("_value");
formUrlpar=(String)zdv.get("dataName");
formUrlparval=zdv.get("dataId").toString();
}
}else{
formUrlparval=formValues.get("dataId").toString();
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论