// RejectToStart public static FlowActionRequest PostFlowActionRejectToStart( string clientRequestGuid, string bizDocumentGuid, string bizDocumentTypeCode, DateTime bizTimeStamp, string userMemo, string bizDataPayloadJson, string optionalFlowActionDataJson, int userId, // 执行人员 string userGuid, int flowInstanceId, string flowInstanceGuid, string code, string currentActivityGuid, // 当前所处的活动状态(也许流程有多个入口) string startActivityGuid, // 退回到的开始状态 List <Paticipant> roles, // 接办人选择的下一个活动状态待办角色/人员列表 int?delegateeUserId, string delegateeUserGuid) { // 未通过合法性检查直接返回 if (!preValidate(clientRequestGuid)) { return(null); } var incomingReq = new FlowActionRejectToStart( clientRequestGuid, bizDocumentGuid, bizDocumentTypeCode, bizTimeStamp, userMemo, bizDataPayloadJson, optionalFlowActionDataJson, userId, userGuid, flowInstanceId, flowInstanceGuid, code, currentActivityGuid, startActivityGuid, roles, delegateeUserId, delegateeUserGuid); return(saveToDB(incomingReq)); }
public FlowActionRejectToStartResult // rejectToStart processActionRequest(FlowActionRejectToStart req) { var concreteMetaObj = req.concreteMetaObj; using (var db = new EnouFlowInstanceContext()) { var flowInst = getFlowInstance(db, req.flowInstanceId, req.bizDocumentGuid); var reqInDb = getReqInDB(req.flowActionRequestId, db); string failReason; ActivityNode destNode; #region Check BizTimeStamp Valid if (!isBizTimeStampValid((DateTime)concreteMetaObj.bizTimeStamp, req, flowInst, out failReason)) { updateReqProcessingResultInDB(reqInDb, EnumFlowActionRequestResultType.fail, failReason); db.SaveChanges(); return(new FlowActionRejectToStartResult(req.flowActionRequestId, req.clientRequestGuid, flowInst, false, failReason)); } #endregion #region Decide next activity, need be start type var flowDefHelper = new FlowTemplateDefHelper( flowInst.flowTemplateJson); string startActivityGuid; if (string.IsNullOrWhiteSpace(req.startActivityGuid)) { startActivityGuid = flowInst.startActivityGuid; } else { startActivityGuid = req.startActivityGuid; } destNode = flowDefHelper.getNodeFromGuid(startActivityGuid); if (destNode.type != ActivityTypeString.standard_Start) { failReason = "目标活动不是开始类型(FlowActionRejectToStartResult)"; updateReqProcessingResultInDB(reqInDb, EnumFlowActionRequestResultType.fail, failReason); db.SaveChanges(); return(new FlowActionRejectToStartResult(req.flowActionRequestId, req.clientRequestGuid, flowInst, false, failReason)); } #endregion #region Decide activity owners/ List<UserDTO> List <UserDTO> taskUsers = new List <UserDTO>(); // taskUsers = FlowTemplateDefHelper.getUserDTOsFromPaticipantList(req.roles); taskUsers = getUserDTOsFromPaticipantList(req.roles, flowInst); if (taskUsers.Count() == 0) {// 如果没有直接指定用户, 则根据流程实例的creatorId,将任务指派给流程实例的创建者 using (var orgDb = new EnouFlowOrgMgmtContext()) { var creator = new UserHelper(orgDb).getUserDTO(flowInst.creatorId); if (creator != null) { taskUsers.Add(creator); } } } if (taskUsers.Count() == 0) // 如果参与活动的用户数为0则出错 { failReason = $@"无法找到参与活动'{destNode.name}'的用户" + $@"({ req.roles.ToString()}). (FlowActionRejectToStartResult)"; updateReqProcessingResultInDB(reqInDb, EnumFlowActionRequestResultType.fail, failReason); db.SaveChanges(); return(new FlowActionRejectToStartResult(req.flowActionRequestId, req.clientRequestGuid, flowInst, false, failReason)); } #endregion #region update instance DateTime newBizTimeStamp = DateTime.Now; DateTime originBizTimeStamp = flowInst.bizTimeStamp; flowInst.bizTimeStamp = newBizTimeStamp; flowInst.previousActivityGuid = flowInst.currentActivityGuid; flowInst.previousActivityName = flowInst.currentActivityName; flowInst.currentActivityGuid = destNode.guid; flowInst.currentActivityName = destNode.name; // RejectToStart不更新BizDataPayloadJson: // updateBizDataPayloadJsonOfFlowInst(flowInst, req); #endregion #region update tasks for user status like taskState,finishTime, delegatee updateTaskForUserStatesAfterAction(db, (int)concreteMetaObj.userId, originBizTimeStamp, newBizTimeStamp, flowInst.previousActivityGuid, flowInst, reqInDb); #endregion #region add task for users: FlowTaskForUser taskUsers.ForEach(user => addFlowTaskForUser(db, user, flowInst, EnumFlowTaskType.redraft)); #endregion #region write 3 type logs: FlowInstanceFriendlyLog & FlowInstanceTechLog addFlowInstanceFriendlyLog( flowInst, reqInDb.flowActionRequestId, flowInst.previousActivityName, reqInDb.userId.Value, reqInDb.delegateeUserId, "退回(拒绝)/Reject", req.userMemo, db); #warning TODO: another 2 type logs #endregion #region update request updateRequestToSuccess(reqInDb, flowInst); #endregion db.SaveChanges(); return(new FlowActionRejectToStartResult(req.flowActionRequestId, req.clientRequestGuid, flowInst)); } }