/// <summary> /// 抢任务 /// </summary> /// <param name="user"></param> /// <param name="taskId"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task <ResponseMessage> KcoinTaskGrab(Models.UserInfo user, string taskId, CancellationToken cancellationToken = default(CancellationToken)) { var response = new ResponseMessage(); var taskInfo = await _iTaskStore.GetTaskInfos().Where(a => !a.IsDelete && a.Id == taskId).FirstOrDefaultAsync(cancellationToken); var nowTime = DateTime.Now; if (taskInfo == null) { response.Code = ResponseCodeDefines.NotFound; response.Message = "任务未找到"; return(response); } var periodInfo = await _iTaskStore.GetScorePeriods().Where(w => !w.IsDelete && w.Id == taskInfo.PeriodId).FirstOrDefaultAsync(); if (periodInfo == null || periodInfo.State != 1) { response.Code = ResponseCodeDefines.ModelStateInvalid; response.Message = "只有进行中的赛季才能操作"; return(response); } if (taskInfo.ExamineState != 2) { response.Code = ResponseCodeDefines.NotAllow; response.Message = "任务未审核通过"; return(response); } if (taskInfo.TaskState == 0 || nowTime < taskInfo.LootTime) { response.Code = ResponseCodeDefines.NotAllow; response.Message = "未到开抢时间"; return(response); } if (taskInfo.TaskState == 2 || taskInfo.TaskState == 3) { response.Code = ResponseCodeDefines.NotAllow; response.Message = "任务已被领取"; return(response); } var taskUser = new TaskUser { UserId = user.Id, TaskId = taskId, GetTime = nowTime, }; //事务保存 using (var trans = await _transaction.BeginTransaction()) { try { var oldTaskUser = await _iTaskStore.GetTaskUsers().Where(w => w.TaskId == taskInfo.Id).ToListAsync(); if (oldTaskUser.Any(fi => fi.UserId == user.Id)) { response.Code = ResponseCodeDefines.NotAllow; response.Message = "您已抢到该任务!"; trans.Rollback(); return(response); } if (taskInfo.UserNumber < oldTaskUser.Count + 1) { response.Code = ResponseCodeDefines.NotAllow; response.Message = "当前任务所需人数已满"; trans.Rollback(); return(response); } await _iTaskStore.AddTaskUserAsync(taskUser, cancellationToken); var taskUserQuery = _iTaskStore.GetTaskUsers().Where(a => a.TaskId == taskId); var taskUserCount = await taskUserQuery.CountAsync(cancellationToken); if (taskUserCount >= taskInfo.UserNumber) { taskInfo.TaskState = 2; await _iTaskStore.UpdateTaskInfoAsync(taskInfo, cancellationToken); } // 抢任务成功添加动态 await _dynamicHelper.AddDynamicContent( DynamicType.TaskGet, taskInfo.PeriodId, taskInfo.Id, "", "", user.UserName, user.GroupName, user.Id, taskInfo.TaskName, taskInfo.Score, null, null); trans.Commit(); } catch (Exception e) { trans.Rollback(); throw new Exception("保存事务失败", e); } } return(response); }