@@ -1,19 +1,16 @@ | |||||
package com.hz.pm.api.common.helper; | package com.hz.pm.api.common.helper; | ||||
import com.wflow.workflow.service.ProcessInstanceService; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import org.flowable.bpmn.model.Activity; | |||||
import org.flowable.bpmn.model.BpmnModel; | import org.flowable.bpmn.model.BpmnModel; | ||||
import org.flowable.bpmn.model.Process; | import org.flowable.bpmn.model.Process; | ||||
import org.flowable.bpmn.model.UserTask; | import org.flowable.bpmn.model.UserTask; | ||||
import org.flowable.engine.HistoryService; | import org.flowable.engine.HistoryService; | ||||
import org.flowable.engine.RepositoryService; | import org.flowable.engine.RepositoryService; | ||||
import org.flowable.engine.RuntimeService; | |||||
import org.flowable.engine.TaskService; | import org.flowable.engine.TaskService; | ||||
import org.flowable.engine.history.HistoricActivityInstance; | import org.flowable.engine.history.HistoricActivityInstance; | ||||
import org.flowable.engine.history.HistoricActivityInstanceQuery; | |||||
import org.flowable.engine.history.HistoricProcessInstance; | import org.flowable.engine.history.HistoricProcessInstance; | ||||
import org.flowable.task.api.Task; | import org.flowable.task.api.Task; | ||||
import org.flowable.task.api.history.HistoricTaskInstance; | |||||
import org.flowable.variable.api.history.HistoricVariableInstance; | import org.flowable.variable.api.history.HistoricVariableInstance; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
@@ -46,18 +43,24 @@ public class WflowHelper { | |||||
List<UserTask> userTasks = processes.get(0).findFlowElementsOfType(UserTask.class); | List<UserTask> userTasks = processes.get(0).findFlowElementsOfType(UserTask.class); | ||||
for (UserTask userTask : userTasks) { | for (UserTask userTask : userTasks) { | ||||
if (userTask.getId().equals(activityId)) { | if (userTask.getId().equals(activityId)) { | ||||
return userTask.getLoopCharacteristics().isSequential(); | |||||
return !userTask.getLoopCharacteristics().isSequential(); | |||||
} | } | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
public List<Task> listUnFinishedTasks(String activityId) { | |||||
public List<Task> listPendingTasks(String activityId) { | |||||
return taskService.createTaskQuery() | return taskService.createTaskQuery() | ||||
.taskDefinitionKey(activityId) | .taskDefinitionKey(activityId) | ||||
.list(); | .list(); | ||||
} | } | ||||
public List<HistoricTaskInstance> listFinishedTasks(String activityId) { | |||||
return historyService.createHistoricTaskInstanceQuery() | |||||
.taskDefinitionKey(activityId) | |||||
.list(); | |||||
} | |||||
/** | /** | ||||
* 所有流程是否完成(审核通过) | * 所有流程是否完成(审核通过) | ||||
* | * | ||||
@@ -5,6 +5,7 @@ import cn.hutool.extra.spring.SpringUtil; | |||||
import com.hz.pm.api.common.enumeration.ProjectProcessStageEnum; | import com.hz.pm.api.common.enumeration.ProjectProcessStageEnum; | ||||
import com.hz.pm.api.common.helper.UserInfoHelper; | import com.hz.pm.api.common.helper.UserInfoHelper; | ||||
import com.hz.pm.api.common.helper.WflowHelper; | import com.hz.pm.api.common.helper.WflowHelper; | ||||
import com.hz.pm.api.common.util.ThreadPoolUtil; | |||||
import com.hz.pm.api.external.MhApiClient; | import com.hz.pm.api.external.MhApiClient; | ||||
import com.hz.pm.api.external.model.dto.MhZwddWorkNoticeDTO; | import com.hz.pm.api.external.model.dto.MhZwddWorkNoticeDTO; | ||||
import com.hz.pm.api.external.todo.MHTodoClient; | import com.hz.pm.api.external.todo.MHTodoClient; | ||||
@@ -26,11 +27,11 @@ import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; | |||||
import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; | import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; | ||||
import org.flowable.common.engine.api.delegate.event.FlowableEvent; | import org.flowable.common.engine.api.delegate.event.FlowableEvent; | ||||
import org.flowable.common.engine.api.delegate.event.FlowableEventListener; | import org.flowable.common.engine.api.delegate.event.FlowableEventListener; | ||||
import org.flowable.task.api.Task; | |||||
import org.flowable.task.api.TaskInfo; | |||||
import org.flowable.task.api.history.HistoricTaskInstance; | |||||
import org.flowable.task.service.impl.persistence.entity.TaskEntity; | import org.flowable.task.service.impl.persistence.entity.TaskEntity; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import java.time.Instant; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Optional; | import java.util.Optional; | ||||
import java.util.Set; | import java.util.Set; | ||||
@@ -58,6 +59,11 @@ public class TaskCreatedListener implements FlowableEventListener { | |||||
@Override | @Override | ||||
public void onEvent(FlowableEvent event) { | public void onEvent(FlowableEvent event) { | ||||
Instant instant = Instant.now().plusSeconds(5); | |||||
ThreadPoolUtil.SCHEDULER.schedule(() -> handleEvent(event), instant); | |||||
} | |||||
private void handleEvent(FlowableEvent event) { | |||||
if (event.getType().equals(FlowableEngineEventType.TASK_CREATED)) { | if (event.getType().equals(FlowableEngineEventType.TASK_CREATED)) { | ||||
FlowableEngineEntityEvent entityEvent = (FlowableEngineEntityEvent) event; | FlowableEngineEntityEvent entityEvent = (FlowableEngineEntityEvent) event; | ||||
String procDefId = entityEvent.getProcessDefinitionId(); | String procDefId = entityEvent.getProcessDefinitionId(); | ||||
@@ -127,15 +133,16 @@ public class TaskCreatedListener implements FlowableEventListener { | |||||
} | } | ||||
TaskEntity taskEntity = (TaskEntity) entityEvent.getEntity(); | TaskEntity taskEntity = (TaskEntity) entityEvent.getEntity(); | ||||
WflowHelper wflowHelper = SpringUtil.getBean(WflowHelper.class); | WflowHelper wflowHelper = SpringUtil.getBean(WflowHelper.class); | ||||
boolean orUserTask = wflowHelper.isOrUserTask(procDefId, taskEntity.getTaskDefinitionId()); | |||||
String taskDefKey = taskEntity.getTaskDefinitionKey(); | |||||
boolean orUserTask = wflowHelper.isOrUserTask(procDefId, taskDefKey); | |||||
switch (procType.get()) { | switch (procType.get()) { | ||||
case XC_APPROVAL_PROCESS: | case XC_APPROVAL_PROCESS: | ||||
case PROJECT_RECORD_APPROVAL_PROCESS: | case PROJECT_RECORD_APPROVAL_PROCESS: | ||||
case ACCEPTANCE_DECLARATION_APPROVAL_PROCESS: | case ACCEPTANCE_DECLARATION_APPROVAL_PROCESS: | ||||
MHTodoTypeEnum todoType = getMhTodoTypeEnum(procType.get()); | MHTodoTypeEnum todoType = getMhTodoTypeEnum(procType.get()); | ||||
if (orUserTask) { | if (orUserTask) { | ||||
List<Task> tasks = wflowHelper.listUnFinishedTasks(taskEntity.getTaskDefinitionId()); | |||||
Set<String> taskIds = CollUtils.fieldSet(tasks, TaskInfo::getId); | |||||
List<HistoricTaskInstance> tasks = wflowHelper.listFinishedTasks(taskDefKey); | |||||
Set<String> taskIds = CollUtils.fieldSet(tasks, HistoricTaskInstance::getId); | |||||
taskIds.add(taskEntity.getId()); | taskIds.add(taskEntity.getId()); | ||||
mhTodoClient.completeTodo(todoType, taskIds); | mhTodoClient.completeTodo(todoType, taskIds); | ||||
} else { | } else { | ||||
@@ -3,7 +3,10 @@ package com.hz.pm.api.todocenter; | |||||
import cn.hutool.json.JSONObject; | import cn.hutool.json.JSONObject; | ||||
import com.hz.pm.api.AppTests; | import com.hz.pm.api.AppTests; | ||||
import com.hz.pm.api.common.helper.UserInfoHelper; | import com.hz.pm.api.common.helper.UserInfoHelper; | ||||
import com.hz.pm.api.external.MhApiClient; | |||||
import com.hz.pm.api.external.model.dto.MhZwddWorkNoticeDTO; | |||||
import com.hz.pm.api.external.todo.MHTodoClient; | import com.hz.pm.api.external.todo.MHTodoClient; | ||||
import com.hz.pm.api.external.todo.dto.MhTodoExtraParamDTO; | |||||
import com.hz.pm.api.external.todo.enumerization.MHTodoTypeEnum; | import com.hz.pm.api.external.todo.enumerization.MHTodoTypeEnum; | ||||
import com.hz.pm.api.user.security.model.UserFullInfoDTO; | import com.hz.pm.api.user.security.model.UserFullInfoDTO; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
@@ -22,20 +25,34 @@ public class MhApiClientTest extends AppTests { | |||||
@Autowired | @Autowired | ||||
private MHTodoClient mhTodoClient; | private MHTodoClient mhTodoClient; | ||||
@Autowired | @Autowired | ||||
private UserInfoHelper userInfoHelper; | |||||
private MhApiClient mhApiClient; | |||||
@Test | @Test | ||||
public void sendTodo() { | public void sendTodo() { | ||||
UserFullInfoDTO assignee = new UserFullInfoDTO(); | UserFullInfoDTO assignee = new UserFullInfoDTO(); | ||||
assignee.setUserId(347873L); | |||||
assignee.setUserId(150L); | |||||
assignee.setMhUserId("62697f4ed80d823fa1f26c5a082d989e"); | assignee.setMhUserId("62697f4ed80d823fa1f26c5a082d989e"); | ||||
JSONObject paramObj = new JSONObject(); | |||||
paramObj.set("projectId", 1213); | |||||
paramObj.set("instId", 1213); | |||||
paramObj.set("taskId", 1213); | |||||
String content = String.format("【%s】的【%s】需要您审核,请及时处理。", | |||||
"市住保房管局深化信创项目", "立项备案审批"); | |||||
mhTodoClient.addTodo(paramObj, assignee, MHTodoTypeEnum.XCFHX_INSPECT_AUDIT, "1212121", content); | |||||
MhTodoExtraParamDTO paramObj = MhTodoExtraParamDTO.builder() | |||||
.bidId(117L) | |||||
.path("/toDoCenter/handleDuringExamine") | |||||
.projectId(2333L) | |||||
.userName("杨云迪") | |||||
.nodeId("node_65f010952418b30a56467594") | |||||
.taskId("a733d3fb-e049-11ee-aa3b-024410885fae") | |||||
.instanceId("8edc9888-e049-11ee-aa3b-024410885fae") | |||||
.build(); | |||||
mhTodoClient.addTodo(paramObj, assignee, MHTodoTypeEnum.XCFHX_INSPECT_AUDIT, "1212121", null); | |||||
} | |||||
@Test | |||||
public void test(){ | |||||
MhZwddWorkNoticeDTO notice = MhZwddWorkNoticeDTO.builder() | |||||
.title(MHTodoTypeEnum.DECLARED_RECORD_AUDIT.getVal()) | |||||
.targetUser("ce44b47503147319fc3b5c826cb51fd2") | |||||
.content(String.format("【%s】的【%s】需要您审核,请及时处理。", | |||||
"市住保房管局深化信创项目", "立项备案审批")) | |||||
.build(); | |||||
mhApiClient.sendZwddWorkNotice(notice); | |||||
} | } | ||||
} | } |
@@ -246,10 +246,13 @@ sync-mh-user: | |||||
sync-mh-company: | sync-mh-company: | ||||
open: false | open: false | ||||
mh: | mh: | ||||
zwdd-work-notice: | |||||
client-id: ningda-74a5e5da-3bc3-414a-b9e6-004b7d87e310 | |||||
client-secret: ningda-df746ce4-0c79-4242-b3c7-90ff8630c9742c6727cd-3ae7-48ae-87ad-2b39188ebabd | |||||
sso: | sso: | ||||
client-id: ningda-74a5e5da-3bc3-414a-b9e6-004b7d87e310 | client-id: ningda-74a5e5da-3bc3-414a-b9e6-004b7d87e310 | ||||
client-secret: ningda-df746ce4-0c79-4242-b3c7-90ff8630c9742c6727cd-3ae7-48ae-87ad-2b39188ebabd | client-secret: ningda-df746ce4-0c79-4242-b3c7-90ff8630c9742c6727cd-3ae7-48ae-87ad-2b39188ebabd | ||||
api-host: https://hzszxc.hzswb.cn:8443/test/mh-gateway/auth-single | |||||
api-host: https://hzszxc.hzswb.cn:8443/mh-gateway/auth-single | |||||
expert-qr-code-url: https://jiema.wwei.cn/uploads/2023/12/28/658d7a3f15f06.jpg | expert-qr-code-url: https://jiema.wwei.cn/uploads/2023/12/28/658d7a3f15f06.jpg | ||||
file: | file: | ||||
down-url: https://weixin.hzszxc.hzswb.cn:8443/test/mh-gateway/oss/oss/previewFileLogin | down-url: https://weixin.hzszxc.hzswb.cn:8443/test/mh-gateway/oss/oss/previewFileLogin | ||||