diff --git a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs index 62786b5c..e8934f50 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs @@ -65,4 +65,15 @@ public class BalancesController : ControllerBase { return await _balanceService.GetPageByUserAsync(request); } + + /// + /// 作废消费明细 + /// + /// + /// + [HttpPost("obsoluteOutRecord")] + public async Task ObsoluteAsync(BalanceRecordObsoluteRequest request) + { + await _balanceService.ObsoluteAsync(request); + } } diff --git a/Src/Dlhis.Canteen/Order/Request/BalanceRecordObsoluteRequest.cs b/Src/Dlhis.Canteen/Order/Request/BalanceRecordObsoluteRequest.cs new file mode 100644 index 00000000..aa9dba9b --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Request/BalanceRecordObsoluteRequest.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Canteen.Order.Request; + +public class BalanceRecordObsoluteRequest +{ + public int Id { get; set; } + + + /// + /// 事由 + /// + [Required(ErrorMessage = "事由不能为空")] + public string Reason { get; set; } +} diff --git a/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs b/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs index 54da29aa..f629d00b 100644 --- a/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs @@ -11,4 +11,6 @@ public interface IBalanceService : IScopeDependency Task> GetPageByDeviceUniqueNoAsync(BalanceRecordPageByDeviceUniqueNoRequest request); Task> GetPageByUserAsync(BalanceRecordUserPageRequest request); + + Task ObsoluteAsync(BalanceRecordObsoluteRequest request); } diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs index 1e320bab..ab97c515 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs @@ -3,6 +3,8 @@ using Dlhis.Canteen.Order.Response; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Canteen.Entities; using Dlhis.Entity.Canteen.Enums; +using Kurisu.AspNetCore.UnifyResultAndValidation; +using Kurisu.AspNetCore.Utils.Extensions; using Kurisu.Core.DataAccess.Dto; using Kurisu.Core.User.Abstractions; using Kurisu.SqlSugar.Attributes; @@ -16,11 +18,13 @@ public class BalanceService : IBalanceService { private readonly IDbContext _dbContext; private readonly ICurrentUser _currentUser; + private readonly ILogger _logger; - public BalanceService(IDbContext dbContext, ICurrentUser currentUser) + public BalanceService(IDbContext dbContext, ICurrentUser currentUser, ILogger logger) { _dbContext = dbContext; _currentUser = currentUser; + _logger = logger; } public async Task> GetPageAsync(BalanceRecordPageRequest request) @@ -162,4 +166,61 @@ public class BalanceService : IBalanceService return page; } + + [Transactional] + public async Task ObsoluteAsync(BalanceRecordObsoluteRequest request) + { + var balanceRecord = await _dbContext.Queryable().Where(x => x.Id == request.Id).SingleAsync(); + balanceRecord.ThrowIfNull("记录不存在"); + + (balanceRecord.Type != BalanceRecordTypeEnumType.Out).ThrowIfTrue("非消费记录,无法操作"); + + balanceRecord.Status = BalanceRecordStatusEnumType.Obsolute; + balanceRecord.Remark = request.Reason; + + + await ContinueUpdateAsync(async () => + { + //重算金额 + var canteenUser = await _dbContext.Queryable().Where(x => x.UserNo == balanceRecord.UserNo).SingleAsync(); + + //金额 + + canteenUser.Balance += Math.Abs(balanceRecord.Amount); + + var effect = await _dbContext.Updateable() + .SetColumns(x => x.Balance == canteenUser.Balance) + .SetColumns(x => x.Version == x.Version + 1) + .Where(x => x.UserNo == balanceRecord.UserNo && x.Version == canteenUser.Version) + .ExecuteCommandAsync(); + + if (effect <= 0) throw new VersionExceptions("更新版本冲突"); + + await _dbContext.UpdateAsync(balanceRecord); + }, 5); + } + + + //************************************************************ help methods ****************************************************************** + + private async Task ContinueUpdateAsync(Func func, int retry) + { + for (int i = 0; i < retry; i++) + { + try + { + await func(); + return; + } + catch (Exception ex) when (ex is VersionExceptions) + { + _logger.LogWarning(ex, ex.Message); + } + catch (Exception) + { + throw; + } + } + + throw new UserFriendlyException("操作失败,请重试"); + } } diff --git a/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs b/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs index 25aeaf29..3303970b 100644 --- a/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs +++ b/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs @@ -127,5 +127,11 @@ public class BalanceRecordEntity : SugarBaseEntity, ITenantId [SugarColumn(ColumnDescription = "消费时间")] public DateTime CostDateTime { get; set; } + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注")] + public string Remark { get; set; } + public string TenantId { get; set; } } \ No newline at end of file diff --git a/Src/Dlhis.Entity/Canteen/Enums/BalanceRecordStatusEnumType.cs b/Src/Dlhis.Entity/Canteen/Enums/BalanceRecordStatusEnumType.cs index 1c00c06f..91bf413e 100644 --- a/Src/Dlhis.Entity/Canteen/Enums/BalanceRecordStatusEnumType.cs +++ b/Src/Dlhis.Entity/Canteen/Enums/BalanceRecordStatusEnumType.cs @@ -25,5 +25,5 @@ public enum BalanceRecordStatusEnumType /// 作废 /// [Description("作废数据")] - Absolute = 99 + Obsolute = 99 } \ No newline at end of file