Browse Source

CardRegister UnitOfWork

bjmzak
DESKTOP-G961P6V\Zhh 2 years ago
parent
commit
01197c5fbd
  1. 26
      src/Shentun.Peis.Application.Contracts/CardRegisters/CreateCardBillDto.cs
  2. 22
      src/Shentun.Peis.Application/CardRegisters/CardRegisterAppService.cs
  3. 20
      src/Shentun.Peis.Domain.Shared/Enums/CardBillFlag.cs
  4. 1
      src/Shentun.Peis.Domain/CardBills/CardBill.cs
  5. 63
      src/Shentun.Peis.Domain/CardRegisters/CardRegisterManager.cs
  6. 2
      src/Shentun.Peis.Domain/Sexs/Sex.cs
  7. 13
      src/Shentun.Peis.EntityFrameworkCore/EntityFrameworkCore/PeisDbContext.cs
  8. 54
      src/Shentun.Peis.EntityFrameworkCore/IncludeDetails/IncludeDetailsExtr.cs
  9. 135
      test/Shentun.Peis.Domain.Tests/CardRegisterManagerTest.cs
  10. 2
      test/Shentun.Peis.Domain.Tests/GuideTypeManagerTest.cs

26
src/Shentun.Peis.Application.Contracts/CardRegisters/CreateCardBillDto.cs

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Shentun.Peis.CardRegisters
{
public class CreateCardBillDto
{
/// <summary>
/// 卡登记编号
/// </summary>
public Guid CardRegisterId { get; set; }
/// <summary>
/// 支付方式
/// </summary>
public string PayModeId { get; set; }
/// <summary>
/// 记账金额
/// </summary>
public decimal BillMoney { get; set; }
/// <summary>
/// 记账标志 0、扣费 1、退费 2、充值
/// </summary>
public char BillFlag { get; set; }
}
}

22
src/Shentun.Peis.Application/CardRegisters/CardRegisterAppService.cs

@ -229,8 +229,9 @@ namespace Shentun.Peis.CardRegisters
await _cardRegisterRepository.UpdateAsync(entity);
}
/*
/// <summary>
/// 会员卡充值
/// 会员卡充值 delete by zhh 2024-03-17
/// </summary>
/// <returns></returns>
[HttpPost("api/app/cardregister/cardregisterrecharge")]
@ -245,7 +246,7 @@ namespace Shentun.Peis.CardRegisters
await _cardRegisterRepository.UpdateAsync(cardRegisterEnt);
//增加充值记录
var cardBill = new CardBill
var cardBill = new CardBill(GuidGenerator.Create())
{
BillFlag = '2',
BillMoney = input.RechargeAmount,
@ -266,6 +267,23 @@ namespace Shentun.Peis.CardRegisters
throw new UserFriendlyException("参数有误");
}
}
*/
/// <summary>
/// 会员卡充值
/// </summary>
/// <returns></returns>
[HttpPost("api/app/cardregister/addcardbill")]
public async Task AddCardBill(CreateCardBillDto createCardBillDto)
{
Check.NotNull<CreateCardBillDto>(createCardBillDto ,"CreateCardBillDto");
var cardRegister = await _cardRegisterRepository.GetAsync(createCardBillDto.CardRegisterId);
var cardBill = _manager.CreateCardBill(cardRegister,
createCardBillDto.PayModeId, createCardBillDto.BillFlag, createCardBillDto.BillMoney);
await _cardRegisterRepository.UpdateAsync(cardRegister);
await _cardBillRepository.InsertAsync(cardBill);
}
}
}

20
src/Shentun.Peis.Domain.Shared/Enums/CardBillFlag.cs

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
namespace Shentun.Peis.Enums
{
public static class CardBillFlag
{
[Description("充值")]
public const char Charge = '0';
[Description("扣费")]
public const char Deduction = '1';
[Description("退费")]
public const char Refund = '2';
}
}

1
src/Shentun.Peis.Domain/CardBills/CardBill.cs

@ -63,5 +63,6 @@ namespace Shentun.Peis.Models
//{
// return new object[] { CardBillId };
//}
public CardBill(Guid id):base(id) { }
}
}

63
src/Shentun.Peis.Domain/CardRegisters/CardRegisterManager.cs

@ -118,6 +118,69 @@ namespace Shentun.Peis.CardRegisters
}
}
}
public CardBill CreateCardBill(CardRegister entity, string payModeId ,char billFlag, decimal amount)
{
Check.NotNull<CardRegister>(entity, nameof(entity));
Check.NotNull<char>(billFlag, "记账标志");
if (amount == 0 ) {
throw new ArgumentException("金额等于0");
};
if(billFlag == Shentun.Peis.Enums.CardBillFlag.Charge && amount < 0)
{
throw new ArgumentException("充值金额不能小于0");
}
else if(billFlag != Shentun.Peis.Enums.CardBillFlag.Charge && amount > 0)
{
throw new ArgumentException("扣费或退费金额不能大于0");
}
if ((entity.CardBalance + amount) < 0 )
{
throw new ArgumentException($"扣费或退费金额不能小于余额{entity.CardBalance}");
}
entity.CardBalance += amount;
var cardBill = new CardBill(GuidGenerator.Create())
{
CardRegisterId = entity.Id,
PayModeId = payModeId,
BillFlag = billFlag,
BillMoney = amount,
};
return cardBill;
}
public void AddCardBill(CardRegister entity, string payModeId, char billFlag, decimal amount)
{
Check.NotNull<CardRegister>(entity, nameof(entity));
Check.NotNull<char>(billFlag, "记账标志");
if (amount == 0)
{
throw new ArgumentException("金额等于0");
};
if (billFlag == Shentun.Peis.Enums.CardBillFlag.Charge && amount < 0)
{
throw new ArgumentException("充值金额不能小于0");
}
else if (billFlag != Shentun.Peis.Enums.CardBillFlag.Charge && amount > 0)
{
throw new ArgumentException("扣费或退费金额不能大于0");
}
if ((entity.CardBalance + amount) < 0)
{
throw new ArgumentException($"扣费或退费金额不能小于余额{entity.CardBalance}");
}
entity.CardBalance += amount;
var cardBill = new CardBill(GuidGenerator.Create())
{
CardRegisterId = entity.Id,
PayModeId = payModeId,
BillFlag = billFlag,
BillMoney = amount,
};
entity.CardBills.Add(cardBill);
}
public void Verify(CardRegister entity)
{
Check.NotNull<CardRegister>(entity, nameof(entity));

2
src/Shentun.Peis.Domain/Sexs/Sex.cs

@ -12,7 +12,7 @@ namespace Shentun.Peis.Models
/// 性别设置
/// </summary>
[Table("sex")]
public class Sex : AuditedEntity, IHasConcurrencyStamp, ICharIdIDisplayName
public class Sex : AuditedEntity, IHasConcurrencyStamp, ICharId,IDisplayName
{
[Key]
[Column("id")]

13
src/Shentun.Peis.EntityFrameworkCore/EntityFrameworkCore/PeisDbContext.cs

@ -37,6 +37,16 @@ using Volo.Abp.TenantManagement.EntityFrameworkCore;
namespace Shentun.Peis.EntityFrameworkCore;
/// <summary>
/// 用于建立EfCoreCardRegisterRepository,采用接口注入,
/// 它不是必须的,只是一个推荐的习惯,此处暂时用于测试是否可行
/// </summary>
public interface IPeisDbContext: IEfCoreDbContext
{
public DbSet<CardBill> CardBills { get; set; }
public DbSet<CardRegister> CardRegisters { get; set; }
}
[ReplaceDbContext(typeof(IIdentityDbContext))]
[ReplaceDbContext(typeof(IOpenIddictDbContext))]
[ReplaceDbContext(typeof(IAuditLoggingDbContext))]
@ -55,7 +65,8 @@ public class PeisDbContext :
IBackgroundJobsDbContext,
ISettingManagementDbContext,
IPermissionManagementDbContext,
ITenantManagementDbContext
ITenantManagementDbContext,
IPeisDbContext
{
/* Add DbSet properties for your Aggregate Roots / Entities here. */

54
src/Shentun.Peis.EntityFrameworkCore/IncludeDetails/IncludeDetailsExtr.cs

@ -0,0 +1,54 @@
using Microsoft.EntityFrameworkCore;
using Shentun.Peis.EntityFrameworkCore;
using Shentun.Peis.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Identity;
using Volo.Abp.Identity.EntityFrameworkCore;
namespace Shentun.Peis.IncludeDetails
{
internal static class IncludeDetailsExtr
{
public static async Task<IQueryable<CardRegister>> IncludeDetails(this Task<IQueryable<CardRegister>> queryable,
bool include = true)
{
if (!include)
{
return queryable.Result;
}
return queryable.Result
.Include(x => x.CardBills);
}
}
public interface ICardRegisterRepository : IBasicRepository<CardRegister, Guid>, IBasicRepository<CardRegister>,
IReadOnlyRepository<CardRegister>, IRepository, IReadOnlyBasicRepository<CardRegister, Guid>
{
}
public class EfCoreCardRegisterRepository
: EfCoreRepository<PeisDbContext, CardRegister, Guid>, ICardRegisterRepository
{
public EfCoreCardRegisterRepository(
IDbContextProvider<PeisDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public async override Task<IQueryable<CardRegister>> WithDetailsAsync()
{
var query = await GetQueryableAsync().IncludeDetails();
return query; // Uses the extension method defined above
}
}
}

135
test/Shentun.Peis.Domain.Tests/CardRegisterManagerTest.cs

@ -0,0 +1,135 @@
using NSubstitute;
using NSubstitute.Exceptions;
using Shentun.Peis.CardRegisters;
using Shentun.Peis.Enums;
using Shentun.Peis.GuidTypes;
using Shentun.Peis.IncludeDetails;
using Shentun.Peis.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TencentCloud.Cpdp.V20190820.Models;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Uow;
using Xunit;
using Xunit.Abstractions;
namespace Shentun.Peis
{
public class CardRegisterManagerTest : PeisDomainTestBase
{
private readonly IRepository<CardRegister, Guid> _repository;
private readonly IRepository<CardBill, Guid> _cardBillRepository;
private readonly ICardRegisterRepository _cardRegisterRepository;
private readonly CardRegisterManager _manager;
private readonly ITestOutputHelper _output;
private readonly IUnitOfWorkManager _unitOfWorkManager;
public CardRegisterManagerTest(ITestOutputHelper output)
{
_output = output;
_repository = GetRequiredService<IRepository<CardRegister, Guid>>();
_cardRegisterRepository = GetRequiredService<ICardRegisterRepository>();
_cardBillRepository = GetRequiredService<IRepository<CardBill, Guid>>();
_manager = GetRequiredService<CardRegisterManager>();
_unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>();
}
[Fact]
[UnitOfWork]
public async void AddCardBillTest()
{
var id = new Guid("3a0d9464-e69e-67d5-c292-b2e11fb334b1");
using (IUnitOfWork unitOfWork = _unitOfWorkManager.Begin())
{
var cardRegister = await _cardRegisterRepository.GetAsync(id, includeDetails: true);
//var cardRegister = _cardRegisterRepository.WithDetails().Where(o => o.Id == id).FirstOrDefault();
//var cardRegister = await _cardRegisterRepository.GetAsync(id, includeDetails: true);
//var cardRegister = await _cardRegisterRepository.Get(new Guid("3a0d9464-e69e-67d5-c292-b2e11fb334b1"), includeDetails: true);
//await _repository.EnsureCollectionLoadedAsync(cardRegister, x => x.CardBills);
_output.WriteLine(cardRegister.CardBalance.ToString());
_output.WriteLine(cardRegister.CardBills.Count.ToString());
var cardBill = _manager.CreateCardBill(cardRegister, "01", CardBillFlag.Charge, Convert.ToDecimal(10));
try
{
await _repository.UpdateAsync(cardRegister);
await _cardBillRepository.InsertAsync(cardBill);
await unitOfWork.CompleteAsync();
}
catch (Exception ex)
{
await unitOfWork.RollbackAsync();
}
_output.WriteLine(cardRegister.CardBalance.ToString());
}
}
[Fact]
public async void AddCardBillNoUnitOfWorkTest()
{
var id = new Guid("3a0d9464-e69e-67d5-c292-b2e11fb334b1");
var cardRegister = await _cardRegisterRepository.GetAsync(id, includeDetails: true);
//var cardRegister = _cardRegisterRepository.WithDetails().Where(o => o.Id == id).FirstOrDefault();
//var cardRegister = await _cardRegisterRepository.GetAsync(id, includeDetails: true);
//var cardRegister = await _cardRegisterRepository.Get(new Guid("3a0d9464-e69e-67d5-c292-b2e11fb334b1"), includeDetails: true);
//await _repository.EnsureCollectionLoadedAsync(cardRegister, x => x.CardBills);
_output.WriteLine(cardRegister.CardBalance.ToString());
_output.WriteLine(cardRegister.CardBills.Count.ToString());
var cardBill = _manager.CreateCardBill(cardRegister, "01", CardBillFlag.Refund, Convert.ToDecimal(-1000));
await _repository.UpdateAsync(cardRegister);
await _cardBillRepository.InsertAsync(cardBill);
}
/// <summary>
/// 要支持级联更新,必须使用工作单元UnitOfWork
/// </summary>
[Fact]
//[UnitOfWork]
public async void AddCardBillByGetIdTest()
{
var id = new Guid("3a0d9464-e69e-67d5-c292-b2e11fb334b1");
using (IUnitOfWork unitOfWork = _unitOfWorkManager.Begin())
{
var cardRegister = await _cardRegisterRepository.GetAsync(id, includeDetails: true);
_output.WriteLine(cardRegister.CardBalance.ToString());
_output.WriteLine(cardRegister.CardBills.Count.ToString());
_manager.AddCardBill(cardRegister, "01", CardBillFlag.Charge, Convert.ToDecimal(100));
try
{
await _repository.UpdateAsync(cardRegister);
await unitOfWork.CompleteAsync();
}
catch (Exception ex)
{
await unitOfWork.RollbackAsync();
}
_output.WriteLine(cardRegister.CardBalance.ToString());
}
}
}
}

2
test/Shentun.Peis.Domain.Tests/GuideTypeManagerTest.cs

@ -80,7 +80,7 @@ namespace Shentun.Peis
{
using (var uow = _unitOfWorkManager.Begin())
{
var entity = await _repository.GetAsync(new Guid("3a0d6c49-cecf-19d9-0f4b-0923a28a3889"));
var entity = await _repository.GetAsync(new Guid("3a0d9464-e69e-67d5-c292-b2e11fb334b1"));
await _manager.CheckAndDeleteAsync(entity);
}

Loading…
Cancel
Save