This commit is contained in:
zpc 2025-09-24 14:03:47 +08:00
parent c945442160
commit 5bd8167c2e
3 changed files with 181 additions and 10 deletions

View File

@ -175,4 +175,28 @@ namespace CoreCms.Net.Model.ViewModels.SQ
public string cancel_reason { get; set; } public string cancel_reason { get; set; }
} }
/// <summary>
/// 签到参与人项(不包含发起者)
/// </summary>
public class SQReservationCheckInAttendeeDto
{
/// <summary>
/// 用户ID
/// </summary>
public int user_id { get; set; }
/// <summary>
/// 是否出席true=赴约false=未赴约)
/// </summary>
public bool isAttended { get; set; }
}
/// <summary>
/// 预约签到 DTO仅发起者可调用
/// </summary>
public class SQReservationCheckInDto
{
[Required(ErrorMessage = "请输入预约ID")]
public int reservation_id { get; set; }
public List<SQReservationCheckInAttendeeDto> attendeds { get; set; }
}
} }

View File

@ -66,15 +66,9 @@ public class SQController : ControllerBase
, IHttpContextUser user , IHttpContextUser user
, IUnitOfWork unitOfWork , IUnitOfWork unitOfWork
, ICoreCmsUserBlacklistServices coreCmsUserBlacklistServices , ICoreCmsUserBlacklistServices coreCmsUserBlacklistServices
, , ISQReservationEvaluateServices sQReservationEvaluateServices
ISQReservationEvaluateServices sQReservationEvaluateServices , ISQReservationReputationServices sQReservationReputationServices
, , ISQRoomUnavailableTimesServices sQRoomUnavailableTimesServices
ISQReservationReputationServices sQReservationReputationServices
,
ISQRoomUnavailableTimesServices sQRoomUnavailableTimesServices
) )
{ {
_webHostEnvironment = webHostEnvironment; _webHostEnvironment = webHostEnvironment;
@ -132,7 +126,7 @@ ISQRoomUnavailableTimesServices sQRoomUnavailableTimesServices
{ {
var userId = _user.ID; var userId = _user.ID;
var list = await _dbBase.Ado.SqlQueryAsync<SQReservationsApiDto>($"SELECT r.*, p.role AS Role, p.is_arrive, CASE WHEN r.status = 1 THEN 0 WHEN r.status = 2 THEN 1 WHEN r.status = 0 THEN 2 WHEN r.status = 3 THEN 3 END AS orderid FROM SQReservations r LEFT JOIN SQReservationParticipants p ON r.id = p.reservation_id WHERE r.status < 4 AND p.user_id = {userId} AND p.status = 0 AND DATEADD(day, 5, end_time) > GETDATE() ORDER BY orderid asc, r.start_time ASC "); var list = await _dbBase.Ado.SqlQueryAsync<SQReservationsApiDto>($"SELECT r.*, p.role AS Role, p.is_arrive, CASE WHEN r.status = 1 THEN 0 WHEN r.status = 2 THEN 1 WHEN r.status = 0 THEN 2 WHEN r.status = 3 THEN 3 END AS orderid FROM SQReservations r LEFT JOIN SQReservationParticipants p ON r.id = p.reservation_id WHERE r.status < 4 AND p.user_id = {userId} AND p.status = 0 AND DATEADD(day,2, end_time) > GETDATE() ORDER BY orderid asc, r.start_time ASC ");
if (list != null && list.Count > 0) if (list != null && list.Count > 0)
{ {
var roomList = await _SQRoomsServices.GetRoomList(); var roomList = await _SQRoomsServices.GetRoomList();
@ -880,4 +874,150 @@ ISQRoomUnavailableTimesServices sQRoomUnavailableTimesServices
}; };
} }
/// <summary>
/// 预约签到(仅发起者可操作,且只能签到一次)
/// </summary>
/// <param name="dto">签到参数:不包含发起者的参会名单</param>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiDto> CheckInReservation([FromBody] SQReservationCheckInDto dto)
{
var userId = _user.ID;
if (dto == null || dto.reservation_id <= 0)
{
return new WebApiDto
{
Code = 500,
Data = null,
Msg = "参数错误"
};
}
// 查询预约
var reservation = await _SQReservationsServices.QueryByClauseAsync(
r => r.id == dto.reservation_id,
r => r.id, OrderByType.Asc);
if (reservation == null)
{
return new WebApiDto
{
Code = 404,
Data = null,
Msg = "预约不存在"
};
}
// 已结束或已取消
if (reservation.status >= 3)
{
return new WebApiDto
{
Code = 400,
Data = null,
Msg = "预约已结束或已取消,无法签到"
};
}
// 已进行中(已签到),禁止重复
if (reservation.status == 2)
{
return new WebApiDto
{
Code = 400,
Data = null,
Msg = "已签到,无法重复签到"
};
}
// 权限校验:仅发起者可签到
var initiator = await _SQReservationParticipantsServices.QueryByClauseAsync(
p => p.reservation_id == dto.reservation_id && p.user_id == userId && p.role == 1 && p.status == 0,
p => p.id, OrderByType.Asc);
if (initiator == null)
{
return new WebApiDto
{
Code = 403,
Data = null,
Msg = "仅发起者可进行签到"
};
}
dto.attendeds ??= new List<SQReservationCheckInAttendeeDto>();
var falseUserIds = dto.attendeds
.Where(a => a != null && a.isAttended == false)
.Select(a => a.user_id)
.Distinct()
.ToList();
try
{
_dbBase.Ado.BeginTran();
// 1) 预约置为进行中
var updatedReservation = await _SQReservationsServices.UpdateAsync(
it => new SQReservations
{
status = 2,
updated_at = DateTime.Now
},
it => it.id == dto.reservation_id);
if (!updatedReservation)
{
_dbBase.Ado.RollbackTran();
return new WebApiDto
{
Code = 500,
Data = null,
Msg = "签到失败:更新预约状态异常"
};
}
// 2) 默认将所有未退出的参与者标记为已赴约(1)
await _SQReservationParticipantsServices.UpdateAsync(
it => new SQReservationParticipants
{
is_arrive = 1
},
it => it.reservation_id == dto.reservation_id && it.status == 0);
// 3) 对于传入的未出席名单,标记为未赴约(2)
if (falseUserIds.Count > 0)
{
await _SQReservationParticipantsServices.UpdateAsync(
it => new SQReservationParticipants
{
is_arrive = 2
},
it => it.reservation_id == dto.reservation_id && it.status == 0 && falseUserIds.Contains(it.user_id));
}
// 4) 确保发起者始终为已赴约(1)
await _SQReservationParticipantsServices.UpdateAsync(
it => new SQReservationParticipants
{
is_arrive = 1
},
it => it.reservation_id == dto.reservation_id && it.status == 0 && it.user_id == userId);
_dbBase.Ado.CommitTran();
return new WebApiDto
{
Code = 0,
Data = null,
Msg = "签到成功"
};
}
catch (Exception)
{
_dbBase.Ado.RollbackTran();
return new WebApiDto
{
Code = 500,
Data = null,
Msg = "签到失败"
};
}
}
} }

View File

@ -849,6 +849,13 @@
<param name="dto">取消预约参数</param> <param name="dto">取消预约参数</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:CoreCms.Net.Web.WebApi.Controllers.SQController.CheckInReservation(CoreCms.Net.Model.ViewModels.SQ.SQReservationCheckInDto)">
<summary>
预约签到(仅发起者可操作,且只能签到一次)
</summary>
<param name="dto">签到参数:不包含发起者的参会名单</param>
<returns></returns>
</member>
<member name="T:CoreCms.Net.Web.WebApi.Controllers.StoreController"> <member name="T:CoreCms.Net.Web.WebApi.Controllers.StoreController">
<summary> <summary>
门店调用接口数据 门店调用接口数据