@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; | |||
import com.baomidou.mybatisplus.core.toolkit.Assert; | |||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
import com.hz.pm.api.common.model.constant.BizConst; | |||
import com.hz.pm.api.common.statemachine.util.StateMachineUtil; | |||
import com.hz.pm.api.common.statemachine.util.TenderStateMachineUtil; | |||
import com.hz.pm.api.projectdeclared.model.dto.OperationReq; | |||
import com.hz.pm.api.projectdeclared.model.entity.Operation; | |||
@@ -25,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional; | |||
import java.time.LocalDateTime; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Objects; | |||
/** | |||
@@ -42,6 +44,7 @@ public class OperationManage { | |||
private final IPurchaseService purchaseService; | |||
private final IProjectService projectService; | |||
private final TenderStateMachineUtil tenderStateMachineUtil; | |||
private final StateMachineUtil stateMachineUtil; | |||
/** | |||
* 获取实施详情 | |||
@@ -62,13 +65,13 @@ public class OperationManage { | |||
@Transactional(rollbackFor = Exception.class) | |||
public String pushOperation(OperationReq req) { | |||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||
Purchase purchase = purchaseService.getById(req.getBidId()); | |||
List<Purchase> purchases = purchaseService.listByProjectId(req.getProjectId()); | |||
Map<Long, Purchase> purchaseMap = CollUtils.listToMap(purchases, Purchase::getId); | |||
Purchase purchase = purchaseMap.get(req.getBidId()); | |||
if (!TenderStatusEnum.TO_BE_SUBMIT_OPERATION_PLAN.eq(purchase.getStatus())) { | |||
throw BizException.wrap("该标段不支持填写实施计划"); | |||
} | |||
Operation pre = operationService.getOne(Wrappers.lambdaQuery(Operation.class) | |||
.eq(Operation::getBidId, req.getBidId()) | |||
.last(BizConst.LIMIT_1)); | |||
Operation pre = operationService.getByBidId(req.getBidId()); | |||
Project project = projectService.getNewProject(req.getProjectId()); | |||
LocalDateTime now = LocalDateTime.now(); | |||
Operation curr = BeanUtil.copyProperties(req, Operation.class); | |||
@@ -82,6 +85,13 @@ public class OperationManage { | |||
curr.setUpdateOn(now); | |||
curr.setUpdateBy(user.getUsername()); | |||
operationService.saveOrUpdate(curr); | |||
long operationCount = operationService.countByBidIds(purchaseMap.keySet()); | |||
if (operationCount == purchaseMap.size()) { | |||
// 修改项目状态 | |||
stateMachineUtil.pass(project); | |||
projectService.updateById(project); | |||
} | |||
// 修改标段状态 | |||
tenderStateMachineUtil.pass(purchase); | |||
purchaseService.updateById(purchase); | |||
return curr.getProjectCode(); | |||
@@ -41,6 +41,7 @@ import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.beans.BeanUtils; | |||
import org.springframework.stereotype.Component; | |||
import org.springframework.transaction.annotation.Transactional; | |||
import javax.servlet.http.HttpServletResponse; | |||
import java.io.IOException; | |||
@@ -244,6 +245,7 @@ public class PurchaseManage { | |||
return "保存失败"; | |||
} | |||
@Transactional(rollbackFor = Exception.class) | |||
public void submitPurchaseNotice(SubmitPurchaseNoticeReq req) { | |||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||
Long projectId = req.getProjectId(); | |||
@@ -272,6 +274,8 @@ public class PurchaseManage { | |||
return purchase; | |||
}).collect(Collectors.toList()); | |||
purchaseService.saveOrUpdateBatch(purchases); | |||
stateMachineUtil.pass(project); | |||
projectService.updateById(project); | |||
} | |||
public void submitPurchaseRecord(SubmitPurchaseRecordReq req) { | |||
@@ -22,6 +22,12 @@ public class PurchaseVO { | |||
@ApiModelProperty("id") | |||
private Long id; | |||
@ApiModelProperty("标段状态") | |||
private Integer status; | |||
@ApiModelProperty("标段状态名称") | |||
private String statusName; | |||
@ApiModelProperty("标段名称") | |||
private String bidName; | |||
@@ -1,7 +1,13 @@ | |||
package com.hz.pm.api.projectdeclared.service; | |||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
import com.baomidou.mybatisplus.extension.service.IService; | |||
import com.hz.pm.api.projectdeclared.model.entity.Operation; | |||
import com.ningdatech.basic.util.CollUtils; | |||
import java.util.Collection; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
@@ -13,4 +19,22 @@ import com.hz.pm.api.projectdeclared.model.entity.Operation; | |||
*/ | |||
public interface IOperationService extends IService<Operation> { | |||
default Operation getByBidId(Long bidId) { | |||
LambdaQueryWrapper<Operation> query = Wrappers.lambdaQuery(Operation.class) | |||
.eq(Operation::getBidId, bidId); | |||
return getOne(query); | |||
} | |||
default List<Operation> listByBidIds(Collection<Long> bidIds) { | |||
LambdaQueryWrapper<Operation> query = Wrappers.lambdaQuery(Operation.class) | |||
.in(Operation::getBidId, bidIds); | |||
return list(query); | |||
} | |||
default long countByBidIds(Collection<Long> bidIds) { | |||
LambdaQueryWrapper<Operation> query = Wrappers.lambdaQuery(Operation.class) | |||
.in(Operation::getBidId, bidIds); | |||
return count(query); | |||
} | |||
} |
@@ -1,5 +1,7 @@ | |||
package com.hz.pm.api.projectdeclared.service; | |||
import com.baomidou.mybatisplus.core.conditions.Wrapper; | |||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
import com.baomidou.mybatisplus.extension.service.IService; | |||
import com.hz.pm.api.projectdeclared.model.entity.PurchaseInst; | |||
@@ -12,4 +14,12 @@ import com.hz.pm.api.projectdeclared.model.entity.PurchaseInst; | |||
* @since 00:12 2024/2/25 | |||
*/ | |||
public interface IPurchaseInstService extends IService<PurchaseInst> { | |||
default PurchaseInst getByProjectIdAndInstCode(Long projectId, String instCode) { | |||
Wrapper<PurchaseInst> query = Wrappers.lambdaQuery(PurchaseInst.class) | |||
.eq(PurchaseInst::getProjectId, projectId) | |||
.eq(PurchaseInst::getInstCode, instCode); | |||
return getOne(query); | |||
} | |||
} |
@@ -58,6 +58,7 @@ import com.hz.pm.api.projectlib.model.entity.*; | |||
import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum; | |||
import com.hz.pm.api.projectlib.model.enumeration.ProjectRenewalApprovalStatusEnum; | |||
import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum; | |||
import com.hz.pm.api.projectlib.model.enumeration.TenderStatusEnum; | |||
import com.hz.pm.api.projectlib.model.po.ProjectPO; | |||
import com.hz.pm.api.projectlib.model.req.ProjectApplicationListReq; | |||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | |||
@@ -689,7 +690,11 @@ public class ProjectLibManage { | |||
//查询采购备案 | |||
List<Purchase> purchases = purchaseService.listByProjectIds(allVersionProjectId); | |||
vo.setPurchases(BeanUtil.copyToList(purchases, PurchaseVO.class)); | |||
vo.setPurchases(CollUtils.fieldList(purchases,w -> { | |||
PurchaseVO purchase = BeanUtil.copyProperties(w, PurchaseVO.class); | |||
purchase.setStatusName(TenderStatusEnum.getDescByStatus(w.getStatus())); | |||
return purchase; | |||
})); | |||
//查询合同备案 | |||
List<ContractVO> contracts = constructionManage.detailContractByProjectId(projectInfo.getId()); | |||
@@ -28,6 +28,7 @@ public enum InstTypeEnum { | |||
APPLY_DELAY(6, "申请延期审批流程"), | |||
DECLARED_RECORD(8, "立项备案审批流程"), | |||
XCFHX_APPLY(9, "信创审查审批流程"), | |||
APPLY_BORROW(7, "申请借阅审批流程"); | |||
@@ -7,17 +7,25 @@ import com.alibaba.fastjson.JSON; | |||
import com.alibaba.fastjson.TypeReference; | |||
import com.baomidou.mybatisplus.core.conditions.Wrapper; | |||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | |||
import com.baomidou.mybatisplus.core.toolkit.Assert; | |||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
import com.google.common.collect.Sets; | |||
import com.hz.pm.api.common.enumeration.ProjectProcessStageEnum; | |||
import com.hz.pm.api.common.model.constant.BizConst; | |||
import com.hz.pm.api.common.statemachine.util.StateMachineUtil; | |||
import com.hz.pm.api.common.statemachine.util.TenderStateMachineUtil; | |||
import com.hz.pm.api.common.util.BizUtils; | |||
import com.hz.pm.api.filemanage.model.entity.ProjectApplyBorrow; | |||
import com.hz.pm.api.filemanage.service.INdProjectApplyBorrowService; | |||
import com.hz.pm.api.projectdeclared.manage.DeclaredProjectManage; | |||
import com.hz.pm.api.projectdeclared.model.dto.ProjectDraftSaveDTO; | |||
import com.hz.pm.api.projectdeclared.model.entity.ProjectConstructionSuggestions; | |||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||
import com.hz.pm.api.projectdeclared.model.entity.PurchaseInst; | |||
import com.hz.pm.api.projectdeclared.model.enumerization.ProjectDraftTypeEnum; | |||
import com.hz.pm.api.projectdeclared.service.IConstructionSuggestionsService; | |||
import com.hz.pm.api.projectdeclared.service.IPurchaseInstService; | |||
import com.hz.pm.api.projectdeclared.service.IPurchaseService; | |||
import com.hz.pm.api.projectlib.model.dto.ProjectApplicationDTO; | |||
import com.hz.pm.api.projectlib.model.dto.ProjectDTO; | |||
import com.hz.pm.api.projectlib.model.entity.Project; | |||
@@ -36,6 +44,7 @@ import com.hz.pm.api.sys.manage.NoticeManage; | |||
import com.hz.pm.api.todocenter.constant.TodoCenterConst; | |||
import com.hz.pm.api.user.util.LoginUserUtil; | |||
import com.ningdatech.basic.exception.BizException; | |||
import com.ningdatech.basic.util.CollUtils; | |||
import com.ningdatech.basic.util.NdDateUtils; | |||
import com.wflow.contants.HisProInsEndActId; | |||
import com.wflow.workflow.bean.process.ProgressNode; | |||
@@ -49,6 +58,7 @@ import org.apache.commons.lang3.StringUtils; | |||
import org.flowable.engine.HistoryService; | |||
import org.flowable.engine.RuntimeService; | |||
import org.flowable.engine.TaskService; | |||
import org.flowable.engine.history.HistoricActivityInstance; | |||
import org.flowable.engine.history.HistoricProcessInstance; | |||
import org.flowable.engine.task.Comment; | |||
import org.flowable.variable.api.history.HistoricVariableInstance; | |||
@@ -88,6 +98,9 @@ public class HandlerManage { | |||
private final INdProjectDelayApplyService projectDelayApplyService; | |||
private final INdProjectApplyBorrowService projectApplyBorrowService; | |||
private final IConstructionSuggestionsService constructionSuggestionsService; | |||
private final IPurchaseService purchaseService; | |||
private final IPurchaseInstService purchaseInstService; | |||
private final TenderStateMachineUtil tenderStateMachineUtil; | |||
@Value("${spring.profiles.active}") | |||
private String active; | |||
@@ -177,6 +190,12 @@ public class HandlerManage { | |||
// 判断是否 保存建设建议信息 | |||
saveConstructionSuggestInfo(instance.getId(), project); | |||
break; | |||
case ON_FIRST_INSPECTED: | |||
purchasePassedCallback(project, instanceId, ProjectProcessStageEnum.XC_APPROVAL_PROCESS); | |||
break; | |||
case ON_FINALLY_INSPECTED: | |||
purchasePassedCallback(project, instanceId, ProjectProcessStageEnum.ACCEPTANCE_DECLARATION_APPROVAL_PROCESS); | |||
break; | |||
default: | |||
throw new BizException("传入项目状态错误: " + project.getStatus()); | |||
} | |||
@@ -200,6 +219,67 @@ public class HandlerManage { | |||
} | |||
} | |||
private void purchasePassedCallback(Project project, String instanceId, ProjectProcessStageEnum processStage) { | |||
// 查询所有的标段 | |||
List<Purchase> purchases = purchaseService.listByProjectId(project.getId()); | |||
Map<Long, Purchase> purchaseMap = CollUtils.listToMap(purchases, Purchase::getId); | |||
// 查询所有标段对应的最新的信创审批流程编码 | |||
List<PurchaseInst> instList = purchaseInstService.list(Wrappers.lambdaQuery(PurchaseInst.class) | |||
.in(PurchaseInst::getBidId, purchaseMap.keySet()) | |||
.eq(PurchaseInst::getInstType, processStage.getCode())); | |||
Purchase currPurchase = instList.stream() | |||
.filter(w -> w.getInstCode().equals(instanceId)) | |||
.findFirst() | |||
.flatMap(w -> Optional.ofNullable(purchaseMap.get(w.getBidId()))) | |||
.orElseThrow(() -> BizException.wrap("当前审批的标段不存在")); | |||
tenderStateMachineUtil.pass(currPurchase); | |||
purchaseService.updateById(currPurchase); | |||
Collection<PurchaseInst> lastInstList = BizUtils.groupFirst(instList, PurchaseInst::getBidId, Comparator.comparing(PurchaseInst::getCreatOn).reversed()); | |||
Set<String> instCodes = CollUtils.fieldSet(lastInstList, PurchaseInst::getInstCode); | |||
if (instCodes.size() != purchases.size()) { | |||
return; | |||
} | |||
long finishedCount = historyService.createHistoricProcessInstanceQuery() | |||
.processInstanceIds(instCodes) | |||
.finished() | |||
.count(); | |||
if (finishedCount != instCodes.size()) { | |||
return; | |||
} | |||
for (String instCode : instCodes) { | |||
HistoricActivityInstance task = historyService.createHistoricActivityInstanceQuery() | |||
.activityType("userTask") | |||
.processInstanceId(instCode) | |||
.orderByHistoricActivityInstanceEndTime() | |||
.desc() | |||
.singleResult(); | |||
if (task == null) { | |||
return; | |||
} | |||
HistoricVariableInstance variableInstance = historyService.createHistoricVariableInstanceQuery() | |||
.processInstanceId(instCode) | |||
.variableName("approve_" + task.getTaskId()) | |||
.singleResult(); | |||
if (variableInstance == null || !"PASS".equals(variableInstance.getValue())) { | |||
return; | |||
} | |||
} | |||
stateMachineUtil.pass(project); | |||
projectService.updateById(project); | |||
} | |||
private void purchaseRejectedCallback(Project project, String instanceId) { | |||
PurchaseInst purchaseInst = purchaseInstService.getByProjectIdAndInstCode(project.getId(), instanceId); | |||
Assert.notNull(purchaseInst, "该标段对应的流程不存在"); | |||
Purchase purchase = purchaseService.getById(purchaseInst.getBidId()); | |||
Assert.notNull(purchase, "标段信息不存在"); | |||
tenderStateMachineUtil.reject(purchase); | |||
purchaseService.updateById(purchase); | |||
} | |||
/** | |||
* 去保存 建设建议信息 | |||
* | |||
@@ -264,22 +344,33 @@ public class HandlerManage { | |||
/** | |||
* 驳回后 所处理的逻辑 | |||
* | |||
* @param project \ | |||
* @param instance \ | |||
* @param project \ | |||
* @param hiInst \ | |||
*/ | |||
public void afterRejectTodo(Project project, HistoricProcessInstance instance) { | |||
public void afterRejectTodo(Project project, HistoricProcessInstance hiInst) { | |||
Long userId = LoginUserUtil.getUserId(); | |||
// 获取当前流程实例类型 | |||
String instanceId = project.getInstCode(); | |||
ProjectInst projectInst = projectInstService.getByInstCode(instanceId); | |||
Integer instType = projectInst.getInstType(); | |||
// 审批流程不是申请延期和申请借阅,需调用状态机 | |||
if (!InstTypeEnum.APPLY_DELAY.eq(instType) && !InstTypeEnum.APPLY_BORROW.eq(instType)) { | |||
// 更新项目状态和流程状态 | |||
updateRejectProjectStatus(userId, project, instType); | |||
InstTypeEnum instTypeEnum = InstTypeEnum.getByCode(instType); | |||
Assert.notNull(instTypeEnum, "不支持的流程类型"); | |||
switch (instTypeEnum) { | |||
case APPLY_BORROW: | |||
case APPLY_DELAY: | |||
break; | |||
case XCFHX_APPLY: | |||
case PROJECT_FINAL_INSPECTION: | |||
purchaseRejectedCallback(project, instanceId); | |||
break; | |||
default: | |||
updateRejectProjectStatus(userId, project, instType); | |||
break; | |||
} | |||
//发送消息 | |||
noticeManage.sendNotice(userId, project, instance.getProcessDefinitionName(), | |||
noticeManage.sendNotice(userId, project, hiInst.getProcessDefinitionName(), | |||
REJECT_MSG_TEMPLATE, MsgTypeEnum.PROJECT_REVIEW_REJECT); | |||
} | |||
@@ -1,5 +1,6 @@ | |||
package com.hz.pm.api.todocenter; | |||
import cn.hutool.json.JSONUtil; | |||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
import com.ningdatech.basic.exception.BizException; | |||
import com.hz.pm.api.AppTests; | |||
@@ -17,10 +18,13 @@ import org.flowable.bpmn.model.FlowElement; | |||
import org.flowable.common.engine.impl.cmd.CustomSqlExecution; | |||
import org.flowable.engine.*; | |||
import org.flowable.engine.history.HistoricActivityInstance; | |||
import org.flowable.engine.history.HistoricProcessInstance; | |||
import org.flowable.engine.history.HistoricProcessInstanceQuery; | |||
import org.flowable.engine.impl.cmd.AbstractCustomSqlExecution; | |||
import org.flowable.engine.runtime.Execution; | |||
import org.flowable.task.api.Task; | |||
import org.flowable.task.api.history.HistoricTaskInstance; | |||
import org.flowable.variable.api.history.HistoricVariableInstance; | |||
import org.junit.Test; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
@@ -58,14 +62,14 @@ public class FlowableTest extends AppTests { | |||
private WflowCcTasksMapper ccTasksMapper; | |||
@Test | |||
public void withdrawTest(){ | |||
public void withdrawTest() { | |||
String taskId = "cc3d7536-f1f3-11ed-b9e0-02426daa406d"; | |||
// 不是流程发起人撤回 | |||
HistoricTaskInstance handledTaskInstance = historyService.createHistoricTaskInstanceQuery() | |||
.taskId(taskId) | |||
.singleResult(); | |||
if (Objects.isNull(handledTaskInstance)){ | |||
if (Objects.isNull(handledTaskInstance)) { | |||
throw new BizException("获取任务实例失败!"); | |||
} | |||
@@ -96,7 +100,7 @@ public class FlowableTest extends AppTests { | |||
// 传节点定义key 获取撤回操作人在流程配置中所在的节点 | |||
FlowElement beforeFlowElement = bpmnModel.getFlowElement(handledNodeId); | |||
// 获取执行撤回操作的节点所在子流程所有节点ID | |||
List<String> actIdList = Lists.newArrayList(handledNodeId,currentNodeId); | |||
List<String> actIdList = Lists.newArrayList(handledNodeId, currentNodeId); | |||
List<HistoricActivityInstance> historicActivityInstanceList = historyService | |||
.createHistoricActivityInstanceQuery() | |||
@@ -121,11 +125,11 @@ public class FlowableTest extends AppTests { | |||
// 强制流程指向前一个审核人节点 | |||
runtimeService.createChangeActivityStateBuilder() | |||
.processInstanceId(processInstanceId) | |||
.moveActivityIdsToSingleActivityId(actIds,handledNodeId) | |||
.moveActivityIdsToSingleActivityId(actIds, handledNodeId) | |||
.changeState(); | |||
// 如果是从会签节点撤回,执行会签节点的节点ID和当前待处理节点ID相同,只需要标记当前会签节点为被撤回 | |||
if (handledNodeId.equals(currentNodeId)){ | |||
if (handledNodeId.equals(currentNodeId)) { | |||
activityInstances = activityInstances.stream().filter(a -> currentNodeId.equals(a.getActivityId())).collect(Collectors.toList()); | |||
} | |||
for (HistoricActivityInstance activityInstance : activityInstances) { | |||
@@ -145,7 +149,7 @@ public class FlowableTest extends AppTests { | |||
} | |||
@Test | |||
public void testWithDraw(){ | |||
public void testWithDraw() { | |||
ReqProcessHandlerDTO param = new ReqProcessHandlerDTO(); | |||
param.setProjectId(633L); | |||
param.setTaskId("8e3e9329-f544-11ed-91fd-02426daa406d"); | |||
@@ -156,7 +160,7 @@ public class FlowableTest extends AppTests { | |||
HistoricTaskInstance handledTaskInstance = historyService.createHistoricTaskInstanceQuery() | |||
.taskId(param.getTaskId()) | |||
.singleResult(); | |||
if (Objects.isNull(handledTaskInstance)){ | |||
if (Objects.isNull(handledTaskInstance)) { | |||
throw new BizException("获取任务实例失败!"); | |||
} | |||
@@ -189,7 +193,7 @@ public class FlowableTest extends AppTests { | |||
// 传节点定义key 获取撤回操作人在流程配置中所在的节点 | |||
FlowElement beforeFlowElement = bpmnModel.getFlowElement(handledNodeId); | |||
// 获取执行撤回操作的节点所在子流程所有节点ID | |||
List<String> actIdList = Lists.newArrayList(handledNodeId,currentNodeId); | |||
List<String> actIdList = Lists.newArrayList(handledNodeId, currentNodeId); | |||
List<HistoricActivityInstance> historicActivityInstanceList = historyService | |||
.createHistoricActivityInstanceQuery() | |||
@@ -199,11 +203,11 @@ public class FlowableTest extends AppTests { | |||
// 标记执行撤回操作节点及当前待处理节点(userTask类型)为被撤回(使用DELETE_REASON_标志) | |||
List<HistoricActivityInstance> activityInstances = historicActivityInstanceList.stream() | |||
.filter(a -> { | |||
if(actIdList.contains(a.getActivityId())){ | |||
if(a.getActivityId().equals(handledNodeId)){ | |||
return (CodeUtil.computationTime(a.getStartTime(),handleCreateTime) == 0L); | |||
}else if(a.getActivityId().equals(currentNodeId)){ | |||
return (CodeUtil.computationTime(a.getStartTime(),currentCreateTime) == 0L); | |||
if (actIdList.contains(a.getActivityId())) { | |||
if (a.getActivityId().equals(handledNodeId)) { | |||
return (CodeUtil.computationTime(a.getStartTime(), handleCreateTime) == 0L); | |||
} else if (a.getActivityId().equals(currentNodeId)) { | |||
return (CodeUtil.computationTime(a.getStartTime(), currentCreateTime) == 0L); | |||
} | |||
} | |||
return Boolean.FALSE; | |||
@@ -224,11 +228,11 @@ public class FlowableTest extends AppTests { | |||
runtimeService.createChangeActivityStateBuilder() | |||
.processInstanceId(processInstanceId) | |||
// .moveActivityIdTo(currentNodeId,handledNodeId) | |||
.moveActivityIdsToSingleActivityId(actIds,handledNodeId) | |||
.moveActivityIdsToSingleActivityId(actIds, handledNodeId) | |||
.changeState(); | |||
// 如果是从会签节点撤回,执行会签节点的节点ID和当前待处理节点ID相同,只需要标记当前会签节点为被撤回 | |||
if (handledNodeId.equals(currentNodeId)){ | |||
if (handledNodeId.equals(currentNodeId)) { | |||
activityInstances = activityInstances.stream().filter(a -> currentNodeId.equals(a.getActivityId())).collect(Collectors.toList()); | |||
} | |||
for (HistoricActivityInstance activityInstance : activityInstances) { | |||
@@ -247,11 +251,11 @@ public class FlowableTest extends AppTests { | |||
} | |||
// 如果当前执行撤回操作的节点后有抄送节点,撤回后,需将抄送任务节点删除 | |||
String ccNodeId = param.getCcNodeId(); | |||
ccTasksMapper.delete(Wrappers.lambdaQuery(WflowCcTasks.class).eq(WflowCcTasks::getNodeId,ccNodeId)); | |||
ccTasksMapper.delete(Wrappers.lambdaQuery(WflowCcTasks.class).eq(WflowCcTasks::getNodeId, ccNodeId)); | |||
} | |||
@Test | |||
public void reject(){ | |||
public void reject() { | |||
String instCode = "0e63faec-08ff-11ee-9663-00163e000353"; | |||
String nodeId1 = "node_6486ddcbe4b0ab4a27ccfdbd"; | |||
String nodeId2 = "node_6486ddcbe4b0ab4a27ccfdc1"; | |||
@@ -263,11 +267,46 @@ public class FlowableTest extends AppTests { | |||
//强制流程指向驳回 | |||
runtimeService.createChangeActivityStateBuilder() | |||
.processInstanceId(instCode) | |||
.moveActivityIdsToSingleActivityId(Lists.newArrayList(nodeId1,nodeId2,nodeId3), "refuse-end") | |||
.moveActivityIdsToSingleActivityId(Lists.newArrayList(nodeId1, nodeId2, nodeId3), "refuse-end") | |||
.moveExecutionsToSingleActivityId(executions.stream().map(Execution::getId) | |||
.collect(Collectors.toList()), "refuse-end") | |||
.changeState(); | |||
log.info("操作成功!"); | |||
} | |||
@Test | |||
public void ifInstFinishedAndPassed() { | |||
String processInstanceId = "3c44c787-d387-11ee-9016-02426daa406d"; | |||
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() | |||
.processInstanceId(processInstanceId) | |||
.finished() | |||
.singleResult(); | |||
if (historicProcessInstance != null && historicProcessInstance.getEndTime() != null) { | |||
HistoricActivityInstance lastTaskInstance = historyService.createHistoricActivityInstanceQuery() | |||
.processInstanceId(processInstanceId) | |||
.orderByHistoricActivityInstanceEndTime() | |||
.desc() | |||
.list() | |||
.stream() | |||
.filter(instance -> instance.getActivityType().equals("userTask")) | |||
.findFirst() | |||
.orElse(null); | |||
if (lastTaskInstance != null) { | |||
String lastTaskId = lastTaskInstance.getActivityId(); | |||
System.out.println(JSONUtil.toJsonStr(lastTaskInstance)); | |||
HistoricVariableInstance approvalStatusVariable = historyService.createHistoricVariableInstanceQuery() | |||
.processInstanceId(processInstanceId) | |||
.variableName("approve_" + lastTaskInstance.getTaskId()) | |||
.singleResult(); | |||
System.out.println(approvalStatusVariable.getValue()); | |||
} | |||
} | |||
} | |||
} |