public async Task <ApiResponse <PatchResult> > Patch( Guid id, [FromBody] StateMachineInstancePatchDto dto) { var patchResult = await _stateMachineInstanceService.Patch(id, dto); var result = new PatchResult(patchResult.Code == 200 ? 1 : 0); return(ApiResponse.Custom(Response, patchResult.Code, patchResult.Message, result)); }
public async Task <StateMachineInstancePatchResultDto> Patch(Guid id, StateMachineInstancePatchDto dto) { // 更新阶段, 参数和并发键 StateMachineInstanceEntity stateMachineInstanceEntity = null; StateMachineEntity stateMachineEntity = null; for (int from = 0; from <= ConcurrencyErrorMaxRetryTimes; ++from) { stateMachineInstanceEntity = await _repository.QueryAsync(q => q.FirstOrDefaultAsyncTestable(x => x.Id == id)); if (stateMachineInstanceEntity == null) { return(StateMachineInstancePatchResultDto.NotFound("state machine instance not found")); } stateMachineEntity = await _stateMachineRepository.QueryNoTrackingAsync(q => q.FirstOrDefaultAsyncTestable(x => x.Name == stateMachineInstanceEntity.Name)); if (stateMachineEntity == null) { return(StateMachineInstancePatchResultDto.NotFound("state machine not found")); } stateMachineInstanceEntity.Status = StateMachineStatus.Running; stateMachineInstanceEntity.Stage = dto.Stage ?? StateMachineBase.InitialStage; stateMachineInstanceEntity.ExecutionKey = PrimaryKeyUtils.Generate <Guid>().ToString(); stateMachineInstanceEntity.FromManagementService = _configuration.Name; stateMachineInstanceEntity.StartTime = DateTime.UtcNow; // 柚子大姐要求 if (dto.Parameters != null) { var parameters = stateMachineInstanceEntity.Parameters; foreach (var pair in dto.Parameters) { parameters[pair.Key] = pair.Value; } stateMachineInstanceEntity.Parameters = parameters; } try { await _repository.SaveChangesAsync(); break; } catch (DbUpdateConcurrencyException) { if (from == ConcurrencyErrorMaxRetryTimes) { throw; } await Task.Delay(1); } } // 创建状态机实例 var stateMachineInstance = await _stateMachineInstanceStore.CreateInstance( stateMachineEntity, stateMachineInstanceEntity); // 运行状态机, 从这里开始会在后台运行 #pragma warning disable CS4014 _stateMachineInstanceStore.RunInstance(stateMachineInstance); #pragma warning restore CS4014 return(StateMachineInstancePatchResultDto.Success()); }