diff --git a/CoreCms.Net.Model/Entities/SQ/SQReservationParticipants.cs b/CoreCms.Net.Model/Entities/SQ/SQReservationParticipants.cs index b462862..abfb254 100644 --- a/CoreCms.Net.Model/Entities/SQ/SQReservationParticipants.cs +++ b/CoreCms.Net.Model/Entities/SQ/SQReservationParticipants.cs @@ -128,9 +128,9 @@ namespace CoreCms.Net.Model.Entities public System.String important_data { get; set; } /// - /// 是否需要退款。0 无需退款,未交押金,1 待支付 ,2 已支付 ,9退款失败 + /// 是否需要退款。0 无需退款,未交押金,1 待支付 ,2 已支付 ,3 发起退款,4退款中,5退款完成。9退款失败 /// - [Display(Name = "是否需要退款。0 无需退款,未交押金,1 待支付 ,2 已支付 ,9退款失败")] + [Display(Name = "是否需要退款。0 无需退款,未交押金,1 待支付 ,2 已支付 ,3 发起退款,4退款中,5退款完成。 9退款失败")] public System.Int32 is_refund { get; set; } /// diff --git a/CoreCms.Net.Task/HangfireDispose.cs b/CoreCms.Net.Task/HangfireDispose.cs index a523a27..1f5ceb9 100644 --- a/CoreCms.Net.Task/HangfireDispose.cs +++ b/CoreCms.Net.Task/HangfireDispose.cs @@ -66,8 +66,10 @@ namespace CoreCms.Net.Task //定时刷新获取微信AccessToken RecurringJob.AddOrUpdate(s => s.Execute(), "0 0/4 * * * ? ", TimeZoneInfo.Local); // 每2分钟刷新获取微信AccessToken - // 预约状态处理(每分钟执行一次) + // 预约状态处理(每分钟执行一次) RecurringJob.AddOrUpdate(s => s.Execute(), "0 0/1 * * * ? ", TimeZoneInfo.Local); + // 预约退款处理 + //RecurringJob.AddOrUpdate(s => s.Execute(), "0 0/1 * * * ? ", TimeZoneInfo.Local); } diff --git a/CoreCms.Net.Task/SQReservationJob.cs b/CoreCms.Net.Task/SQReservationJob.cs index 4552589..a04d2b6 100644 --- a/CoreCms.Net.Task/SQReservationJob.cs +++ b/CoreCms.Net.Task/SQReservationJob.cs @@ -1,6 +1,7 @@ using CoreCms.Net.Caching.AutoMate.RedisCache; using CoreCms.Net.Configuration; using CoreCms.Net.IServices; +using CoreCms.Net.Model.Entities; using DotLiquid.Tags; @@ -17,149 +18,158 @@ using System.Threading.Tasks; using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinUserInfoBatchGetRequest.Types; -namespace CoreCms.Net.Task +namespace CoreCms.Net.Task; + +/// +/// 预约定时清理 +/// +public class SQReservationJob { - /// - /// 预约定时清理 - /// - public class SQReservationJob + private readonly ISQReservationsServices _reservationsServices; + private readonly ISQReservationParticipantsServices _participantsServices; + private readonly IRedisOperationRepository _redisOperationRepository; + public SQReservationJob(ISQReservationsServices reservationsServices, + ISQReservationParticipantsServices participantsServices, + IRedisOperationRepository redisOperationRepository) { - private readonly ISQReservationsServices _reservationsServices; - private readonly ISQReservationParticipantsServices _participantsServices; - private readonly IRedisOperationRepository _redisOperationRepository; - public SQReservationJob(ISQReservationsServices reservationsServices, - ISQReservationParticipantsServices participantsServices, - IRedisOperationRepository redisOperationRepository) - { - _reservationsServices = reservationsServices; - _participantsServices = participantsServices; - _redisOperationRepository = redisOperationRepository; - } + _reservationsServices = reservationsServices; + _participantsServices = participantsServices; + _redisOperationRepository = redisOperationRepository; + } - public async System.Threading.Tasks.Task Execute() + public async System.Threading.Tasks.Task Execute() + { + Console.WriteLine($"[SQReservationJob] 执行开始 @ {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); + var now = DateTime.Now; + Console.WriteLine("[SQReservationJob] 步骤1:将已到结束时间的预约置为已结束(3)"); + // 1) 将已到结束时间的预约置为已结束(3) + var endedList = await _reservationsServices.QueryListByClauseAsync( + r => r.status == 2 && r.end_time <= now, + r => r.id, OrderByType.Asc); + Console.WriteLine($"[SQReservationJob] 步骤1:查询到待结束记录数量 = {endedList?.Count ?? 0}"); + if (endedList != null && endedList.Count > 0) { - Console.WriteLine($"[SQReservationJob] 执行开始 @ {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); - var now = DateTime.Now; - Console.WriteLine("[SQReservationJob] 步骤1:将已到结束时间的预约置为已结束(3)"); - // 1) 将已到结束时间的预约置为已结束(3) - var endedList = await _reservationsServices.QueryListByClauseAsync( - r => r.status == 2 && r.end_time <= now, - r => r.id, OrderByType.Asc); - Console.WriteLine($"[SQReservationJob] 步骤1:查询到待结束记录数量 = {endedList?.Count ?? 0}"); - if (endedList != null && endedList.Count > 0) + var changedCount = 0; + foreach (var item in endedList) { - var changedCount = 0; - foreach (var item in endedList) + Console.WriteLine($"[SQReservationJob] 步骤1:预约ID={item.id} 从状态2->3,end_time={item.end_time:yyyy-MM-dd HH:mm:ss}"); + item.status = 3; + item.updated_at = now; + changedCount++; + } + Console.WriteLine($"[SQReservationJob] 步骤1:批量更新记录数 = {changedCount}"); + await _reservationsServices.UpdateAsync(endedList); + } + //Console.WriteLine("[SQReservationJob] 步骤2:将开始时间已到且未结束的预约置为进行中(2)"); + //// 2) 将开始时间已到且未结束的预约置为进行中(2) + //var startedList = await _reservationsServices.QueryListByClauseAsync( + // r => r.status == 1 && r.start_time <= now && r.end_time > now, + // r => r.id, OrderByType.Asc); + //Console.WriteLine($"[SQReservationJob] 步骤2:查询到待置为进行中记录数量 = {startedList?.Count ?? 0}"); + //if (startedList != null && startedList.Count > 0) + //{ + // var changedCount = 0; + // foreach (var item in startedList) + // { + // Console.WriteLine($"[SQReservationJob] 步骤2:预约ID={item.id} 从状态1->2,start_time={item.start_time:yyyy-MM-dd HH:mm:ss} end_time={item.end_time:yyyy-MM-dd HH:mm:ss}"); + // item.status = 2; + // item.updated_at = now; + // changedCount++; + // } + // Console.WriteLine($"[SQReservationJob] 步骤2:批量更新记录数 = {changedCount}"); + // await _reservationsServices.UpdateAsync(startedList); + //} + + + // 2.5) 到达开始时间但人数未满的预约置为取消(4) + Console.WriteLine("[SQReservationJob] 步骤2.5:到达开始时间但人数未满的预约置为取消(4)"); + var toCancelList = await _reservationsServices.QueryListByClauseAsync( + r => r.status == 0 && r.start_time <= now && r.end_time > now, + r => r.id, OrderByType.Asc); + Console.WriteLine($"[SQReservationJob] 步骤2.5:查询到候选取消记录数量 = {toCancelList?.Count ?? 0}"); + if (toCancelList != null && toCancelList.Count > 0) + { + var examineCount = 0; + foreach (var item in toCancelList) + { + var count = await _participantsServices.GetCountAsync(p => p.reservation_id == item.id && p.status == 0); + Console.WriteLine($"[SQReservationJob] 步骤2.5:预约ID={item.id} 参与人数={count}/{item.player_count},start_time={item.start_time:yyyy-MM-dd HH:mm:ss}"); + if (count < item.player_count) { - Console.WriteLine($"[SQReservationJob] 步骤1:预约ID={item.id} 从状态2->3,end_time={item.end_time:yyyy-MM-dd HH:mm:ss}"); - item.status = 3; + Console.WriteLine($"[SQReservationJob] 步骤2.5:预约ID={item.id} 人数未满,置为取消(4)"); + item.status = 4; item.updated_at = now; - changedCount++; } - Console.WriteLine($"[SQReservationJob] 步骤1:批量更新记录数 = {changedCount}"); - await _reservationsServices.UpdateAsync(endedList); + examineCount++; } - //Console.WriteLine("[SQReservationJob] 步骤2:将开始时间已到且未结束的预约置为进行中(2)"); - //// 2) 将开始时间已到且未结束的预约置为进行中(2) - //var startedList = await _reservationsServices.QueryListByClauseAsync( - // r => r.status == 1 && r.start_time <= now && r.end_time > now, - // r => r.id, OrderByType.Asc); - //Console.WriteLine($"[SQReservationJob] 步骤2:查询到待置为进行中记录数量 = {startedList?.Count ?? 0}"); - //if (startedList != null && startedList.Count > 0) - //{ - // var changedCount = 0; - // foreach (var item in startedList) - // { - // Console.WriteLine($"[SQReservationJob] 步骤2:预约ID={item.id} 从状态1->2,start_time={item.start_time:yyyy-MM-dd HH:mm:ss} end_time={item.end_time:yyyy-MM-dd HH:mm:ss}"); - // item.status = 2; - // item.updated_at = now; - // changedCount++; - // } - // Console.WriteLine($"[SQReservationJob] 步骤2:批量更新记录数 = {changedCount}"); - // await _reservationsServices.UpdateAsync(startedList); - //} - - - // 2.5) 到达开始时间但人数未满的预约置为取消(4) - Console.WriteLine("[SQReservationJob] 步骤2.5:到达开始时间但人数未满的预约置为取消(4)"); - var toCancelList = await _reservationsServices.QueryListByClauseAsync( - r => r.status == 0 && r.start_time <= now && r.end_time > now, - r => r.id, OrderByType.Asc); - Console.WriteLine($"[SQReservationJob] 步骤2.5:查询到候选取消记录数量 = {toCancelList?.Count ?? 0}"); - if (toCancelList != null && toCancelList.Count > 0) + var toCancelChanged = toCancelList.Where(x => x.status == 4).ToList(); + Console.WriteLine($"[SQReservationJob] 步骤2.5:需要更新为取消的记录数 = {toCancelChanged.Count}"); + if (toCancelChanged.Count > 0) { - var examineCount = 0; - foreach (var item in toCancelList) + await _reservationsServices.UpdateAsync(toCancelChanged); + Console.WriteLine($"[SQReservationJob] 步骤2.5:已更新为取消的记录数 = {toCancelChanged.Count}"); + foreach (var item in toCancelChanged) { - var count = await _participantsServices.GetCountAsync(p => p.reservation_id == item.id && p.status == 0); - Console.WriteLine($"[SQReservationJob] 步骤2.5:预约ID={item.id} 参与人数={count}/{item.player_count},start_time={item.start_time:yyyy-MM-dd HH:mm:ss}"); - if (count < item.player_count) - { - Console.WriteLine($"[SQReservationJob] 步骤2.5:预约ID={item.id} 人数未满,置为取消(4)"); - item.status = 4; - item.updated_at = now; - } - examineCount++; - } - var toCancelChanged = toCancelList.Where(x => x.status == 4).ToList(); - Console.WriteLine($"[SQReservationJob] 步骤2.5:需要更新为取消的记录数 = {toCancelChanged.Count}"); - if (toCancelChanged.Count > 0) - { - await _reservationsServices.UpdateAsync(toCancelChanged); - Console.WriteLine($"[SQReservationJob] 步骤2.5:已更新为取消的记录数 = {toCancelChanged.Count}"); - foreach (var item in toCancelChanged) - { - Console.WriteLine($"[SQReservationJob] 步骤2.5:准备通知预约ID={item.id} 的参与用户"); - var userList = await _participantsServices.QueryListByClauseAsync(p => p.reservation_id == item.id && p.status == 0); - Console.WriteLine($"[SQReservationJob] 步骤2.5:预约ID={item.id} 需通知用户数量 = {userList.Count}"); - await _reservationsServices.NotifyReservationFailedAsync(item, userList); - Console.WriteLine($"[SQReservationJob] 步骤2.5:预约ID={item.id} 组局失败通知入队完成"); - } + Console.WriteLine($"[SQReservationJob] 步骤2.5:准备通知预约ID={item.id} 的参与用户"); + var userList = await _participantsServices.QueryListByClauseAsync(p => p.reservation_id == item.id && p.status == 0); + Console.WriteLine($"[SQReservationJob] 步骤2.5:预约ID={item.id} 需通知用户数量 = {userList.Count}"); + await _reservationsServices.NotifyReservationFailedAsync(item, userList); + Console.WriteLine($"[SQReservationJob] 步骤2.5:预约ID={item.id} 组局失败通知入队完成"); + + // 解散(取消)的预约,标记需要退款押金的参与者为“待退款(3)” + // 条件:未退出(status=0) 且 押金已支付(is_refund=2) 且 有有效支付单号 + await _participantsServices.UpdateAsync( + it => new SQReservationParticipants + { + is_refund = 3 + }, + it => it.reservation_id == item.id && it.status == 0 && it.is_refund == 2 && it.paymentId != null && it.paymentId != ""); + Console.WriteLine($"[SQReservationJob] 步骤2.5:预约ID={item.id} 已标记需要退款的参与者为待退款(3)"); } } - - // 3) 开始前30分钟内,人数已凑齐则置为锁定(1) - Console.WriteLine("[SQReservationJob] 步骤3:开始前30分钟内,人数已凑齐则置为锁定(1)"); - var threshold = now.AddMinutes(30); - var toLockList = await _reservationsServices.QueryListByClauseAsync( - r => r.status == 0 && r.start_time > now && r.start_time <= threshold, - r => r.id, OrderByType.Asc); - Console.WriteLine($"[SQReservationJob] 步骤3:查询到候选锁定记录数量 = {toLockList?.Count ?? 0},阈值时间={threshold:yyyy-MM-dd HH:mm:ss}"); - if (toLockList != null && toLockList.Count > 0) - { - foreach (var item in toLockList) - { - // 当前有效参与人数(未退出) - var count = await _participantsServices.GetCountAsync(p => p.reservation_id == item.id && p.status == 0); - Console.WriteLine($"[SQReservationJob] 步骤3:预约ID={item.id} 参与人数={count}/{item.player_count},start_time={item.start_time:yyyy-MM-dd HH:mm:ss}"); - if (count >= item.player_count) - { - Console.WriteLine($"[SQReservationJob] 步骤3:预约ID={item.id} 人数已满,置为锁定(1)"); - item.status = 1; - item.updated_at = now; - } - } - // 仅更新被修改的项 - var changed = toLockList.Where(x => x.status == 1).ToList(); - Console.WriteLine($"[SQReservationJob] 步骤3:需要更新为锁定的记录数 = {changed.Count}"); - if (changed.Count > 0) - { - await _reservationsServices.UpdateAsync(changed); - Console.WriteLine($"[SQReservationJob] 步骤3:已更新为锁定的记录数 = {changed.Count}"); - foreach (var item in changed) - { - Console.WriteLine($"[SQReservationJob] 步骤3:准备通知预约ID={item.id} 的参与用户"); - var userList = await _participantsServices.QueryListByClauseAsync(p => p.reservation_id == item.id && p.status == 0); - Console.WriteLine($"[SQReservationJob] 步骤3:预约ID={item.id} 需通知用户数量 = {userList.Count}"); - await _reservationsServices.NotifyReservationSuccessAsync(item, userList); - Console.WriteLine($"[SQReservationJob] 步骤3:预约ID={item.id} 组局成功通知入队完成"); - - - } - } - } - - Console.WriteLine($"[SQReservationJob] 执行结束 @ {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); } + + // 3) 开始前30分钟内,人数已凑齐则置为锁定(1) + Console.WriteLine("[SQReservationJob] 步骤3:开始前30分钟内,人数已凑齐则置为锁定(1)"); + var threshold = now.AddMinutes(30); + var toLockList = await _reservationsServices.QueryListByClauseAsync( + r => r.status == 0 && r.start_time > now && r.start_time <= threshold, + r => r.id, OrderByType.Asc); + Console.WriteLine($"[SQReservationJob] 步骤3:查询到候选锁定记录数量 = {toLockList?.Count ?? 0},阈值时间={threshold:yyyy-MM-dd HH:mm:ss}"); + if (toLockList != null && toLockList.Count > 0) + { + foreach (var item in toLockList) + { + // 当前有效参与人数(未退出) + var count = await _participantsServices.GetCountAsync(p => p.reservation_id == item.id && p.status == 0); + Console.WriteLine($"[SQReservationJob] 步骤3:预约ID={item.id} 参与人数={count}/{item.player_count},start_time={item.start_time:yyyy-MM-dd HH:mm:ss}"); + if (count >= item.player_count) + { + Console.WriteLine($"[SQReservationJob] 步骤3:预约ID={item.id} 人数已满,置为锁定(1)"); + item.status = 1; + item.updated_at = now; + } + } + // 仅更新被修改的项 + var changed = toLockList.Where(x => x.status == 1).ToList(); + Console.WriteLine($"[SQReservationJob] 步骤3:需要更新为锁定的记录数 = {changed.Count}"); + if (changed.Count > 0) + { + await _reservationsServices.UpdateAsync(changed); + Console.WriteLine($"[SQReservationJob] 步骤3:已更新为锁定的记录数 = {changed.Count}"); + foreach (var item in changed) + { + Console.WriteLine($"[SQReservationJob] 步骤3:准备通知预约ID={item.id} 的参与用户"); + var userList = await _participantsServices.QueryListByClauseAsync(p => p.reservation_id == item.id && p.status == 0); + Console.WriteLine($"[SQReservationJob] 步骤3:预约ID={item.id} 需通知用户数量 = {userList.Count}"); + await _reservationsServices.NotifyReservationSuccessAsync(item, userList); + Console.WriteLine($"[SQReservationJob] 步骤3:预约ID={item.id} 组局成功通知入队完成"); + + + } + } + } + + Console.WriteLine($"[SQReservationJob] 执行结束 @ {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); } } diff --git a/CoreCms.Net.Task/SQReservationRefundJob.cs b/CoreCms.Net.Task/SQReservationRefundJob.cs new file mode 100644 index 0000000..6bea4d0 --- /dev/null +++ b/CoreCms.Net.Task/SQReservationRefundJob.cs @@ -0,0 +1,113 @@ +using CoreCms.Net.Caching.AutoMate.RedisCache; +using CoreCms.Net.IServices; +using CoreCms.Net.Model.Entities; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CoreCms.Net.Task; + + +public class SQReservationRefundJob +{ + private readonly ISQReservationsServices _reservationsServices; + private readonly ISQReservationParticipantsServices _participantsServices; + private readonly IRedisOperationRepository _redisOperationRepository; + private readonly ICoreCmsBillPaymentsServices _billPaymentsServices; + private readonly ICoreCmsBillRefundServices _billRefundServices; + public SQReservationRefundJob(ISQReservationsServices reservationsServices, + ISQReservationParticipantsServices participantsServices, + IRedisOperationRepository redisOperationRepository, + ICoreCmsBillPaymentsServices billPaymentsServices, + ICoreCmsBillRefundServices billRefundServices) + { + _reservationsServices = reservationsServices; + _participantsServices = participantsServices; + _redisOperationRepository = redisOperationRepository; + _billPaymentsServices = billPaymentsServices; + _billRefundServices = billRefundServices; + } + + public async System.Threading.Tasks.Task Execute() + { + Console.WriteLine($"[SQReservationRefundJob] 执行开始 @ {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); + // 扫描需要退款的参与者:is_refund=3(发起退款)、未退出(status=0)、有有效支付单号 + var needRefundList = await _participantsServices.QueryListByClauseAsync( + p => p.is_refund == 3 && p.paymentId != null && p.paymentId != "", + p => p.id, OrderByType.Asc); + + if (needRefundList == null || needRefundList.Count == 0) + { + Console.WriteLine("[SQReservationRefundJob] 无需处理的记录"); + return; + } + + foreach (var participant in needRefundList) + { + try + { + // 查询预约获取押金 + var reservation = await _reservationsServices.QueryByClauseAsync(r => r.id == participant.reservation_id); + var deposit = reservation?.deposit_fee ?? 0m; + if (deposit <= 0) + { + // 无需退款,置为已完成 + await _participantsServices.UpdateAsync(it => new SQReservationParticipants { is_refund = 4 }, it => it.id == participant.id); + continue; + } + + // 获取支付单 + var payInfoRes = await _billPaymentsServices.GetInfo(participant.paymentId, participant.user_id); + if (payInfoRes.status == false || payInfoRes.data is not CoreCmsBillPayments payInfo) + { + await _participantsServices.UpdateAsync(it => new SQReservationParticipants { is_refund = 9 }, it => it.id == participant.id); + continue; + } + + // 退款金额:押金与实付金额取最小 + var refundMoney = deposit > payInfo.money ? payInfo.money : deposit; + if (refundMoney <= 0) + { + await _participantsServices.UpdateAsync(it => new SQReservationParticipants { is_refund = 4 }, it => it.id == participant.id); + continue; + } + + // 创建退款单 + var addRefundRes = await _billRefundServices.ToAdd(participant.user_id, payInfo.sourceId, payInfo.type, refundMoney, ""); + if (addRefundRes.status == false) + { + await _participantsServices.UpdateAsync(it => new SQReservationParticipants { is_refund = 9 }, it => it.id == participant.id); + continue; + } + + // 查询退款单并执行原路退款 + var refundInfo = await _billRefundServices.QueryByClauseAsync(p => + p.userId == participant.user_id && p.sourceId == payInfo.sourceId && p.type == payInfo.type && p.money == refundMoney && p.status == 1); + if (refundInfo == null) + { + await _participantsServices.UpdateAsync(it => new SQReservationParticipants { is_refund = 9 }, it => it.id == participant.id); + continue; + } + + var doRefundRes = await _billRefundServices.ToRefund(refundInfo.refundId, 2, ""); + if (doRefundRes.status) + { + await _participantsServices.UpdateAsync(it => new SQReservationParticipants { is_refund = 4 }, it => it.id == participant.id); + } + else + { + await _participantsServices.UpdateAsync(it => new SQReservationParticipants { is_refund = 9 }, it => it.id == participant.id); + } + } + catch (Exception ex) + { + Console.WriteLine($"[SQReservationRefundJob] 处理失败 participantId={participant.id}, ex={ex.Message}"); + await _participantsServices.UpdateAsync(it => new SQReservationParticipants { is_refund = 9 }, it => it.id == participant.id); + } + } + Console.WriteLine($"[SQReservationRefundJob] 执行结束 @ {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); + } +} diff --git a/CoreCms.Net.Web.WebApi/Controllers/SQController.cs b/CoreCms.Net.Web.WebApi/Controllers/SQController.cs index b2f6936..f4fbd15 100644 --- a/CoreCms.Net.Web.WebApi/Controllers/SQController.cs +++ b/CoreCms.Net.Web.WebApi/Controllers/SQController.cs @@ -1036,7 +1036,19 @@ public class SQController : ControllerBase }; } - // 7.2发起者取消整个预约,所有参与人都标记为退出 + + // 7.2 有押金时,已支付押金(is_refund=2)的参与者为发起退款(3) + if (reservation.deposit_fee.HasValue && reservation.deposit_fee.Value > 0) + { + await _SQReservationParticipantsServices.UpdateAsync( + it => new SQReservationParticipants + { + is_refund = 3 + }, + it => it.reservation_id == dto.reservation_id && it.status == 0 && it.is_refund == 2 && it.paymentId != null && it.paymentId != ""); + } + + // 7.3发起者取消整个预约,所有参与人都标记为退出 await _SQReservationParticipantsServices.UpdateAsync( it => new SQReservationParticipants { @@ -1061,6 +1073,16 @@ public class SQController : ControllerBase quit_time = DateTime.Now }, it => it.reservation_id == dto.reservation_id && it.user_id == userId); + // 有押金且已支付押金时,标记该参与者为发起退款(3) + if (reservation.deposit_fee.HasValue && reservation.deposit_fee.Value > 0) + { + await _SQReservationParticipantsServices.UpdateAsync( + it => new SQReservationParticipants + { + is_refund = 3 + }, + it => it.reservation_id == dto.reservation_id && it.user_id == userId && it.is_refund == 2 && it.paymentId != null && it.paymentId != ""); + } } return new WebApiDto() @@ -1208,9 +1230,13 @@ public class SQController : ControllerBase if (reservation.deposit_fee > 0) { - //有押金,押金原路退回 - - + // 有押金,标记到场人员为“发起退款(3)”,由定时任务统一处理实际退款 + await _SQReservationParticipantsServices.UpdateAsync( + it => new SQReservationParticipants + { + is_refund = 3 + }, + it => it.reservation_id == dto.reservation_id && it.status == 0 && it.is_arrive == 1 && it.is_refund == 2 && it.paymentId != null && it.paymentId != ""); } _dbBase.Ado.CommitTran();