diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfoCardsController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfoCardsController.cs
new file mode 100644
index 00000000..6ef9aed1
--- /dev/null
+++ b/Src/Dlhis.Basic/Organization/Controllers/GainfoCardsController.cs
@@ -0,0 +1,47 @@
+using Dlhis.Basic.Organization.Request;
+using Dlhis.Basic.Organization.Response;
+using Dlhis.Basic.Organization.Services;
+using Dlhis.Basic.Packs;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+
+namespace Dlhis.Basic.Organization.Controllers;
+
+///
+/// 档案卡记录
+///
+[Authorize]
+[Route("api/[controller]")]
+[ApiController]
+public class GainfoCardsController : ControllerBase
+{
+ private readonly IGainfoCardService _gainfoCardService;
+
+ public GainfoCardsController(IGainfoCardService gainfoCardService)
+ {
+ _gainfoCardService = gainfoCardService;
+ }
+
+ ///
+ /// 换卡
+ ///
+ ///
+ ///
+ [HttpPost("change")]
+ [Transactional]
+ public async Task ChangeCardAsync(ChangeCardRequest request)
+ {
+ await _gainfoCardService.ChangeCardAsync(request);
+ }
+
+ ///
+ /// 换卡记录
+ ///
+ ///
+ ///
+ [HttpGet("records")]
+ public async Task> GetChangeRecordsAsync(string userNo)
+ {
+ return await _gainfoCardService.GetChangeRecordsAsync(userNo);
+ }
+}
diff --git a/Src/Dlhis.Basic/Organization/Request/ChangeCardRequest.cs b/Src/Dlhis.Basic/Organization/Request/ChangeCardRequest.cs
new file mode 100644
index 00000000..d470812f
--- /dev/null
+++ b/Src/Dlhis.Basic/Organization/Request/ChangeCardRequest.cs
@@ -0,0 +1,17 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Dlhis.Basic.Organization.Request;
+
+public class ChangeCardRequest
+{
+ [Required]
+ public string UserNo { get; set; }
+
+ [Required]
+ public string CardNo { get; set; }
+
+ [Required]
+ public string Reason { get; set; }
+
+ public string Remark { get; set; }
+}
diff --git a/Src/Dlhis.Basic/Organization/Response/ChangeCardResponse.cs b/Src/Dlhis.Basic/Organization/Response/ChangeCardResponse.cs
new file mode 100644
index 00000000..47943f0e
--- /dev/null
+++ b/Src/Dlhis.Basic/Organization/Response/ChangeCardResponse.cs
@@ -0,0 +1,15 @@
+namespace Dlhis.Basic.Organization.Response;
+
+public class ChangeCardResponse
+{
+ public string UserNo { get; set; }
+ public string UserCode { get; set; }
+ public string UserName { get; set; }
+ public string CardNo { get; set; }
+
+ public string Reason { get; set; }
+
+ public string Remark { get; set; }
+
+ public DateTime CreateTime { get; set; }
+}
diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoCardService.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoCardService.cs
new file mode 100644
index 00000000..8bbce4c7
--- /dev/null
+++ b/Src/Dlhis.Basic/Organization/Services/IGainfoCardService.cs
@@ -0,0 +1,11 @@
+using Dlhis.Basic.Organization.Request;
+using Dlhis.Basic.Organization.Response;
+
+namespace Dlhis.Basic.Organization.Services;
+
+public interface IGainfoCardService
+{
+ Task ChangeCardAsync(ChangeCardRequest request);
+
+ Task> GetChangeRecordsAsync(string userNo);
+}
diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoStore.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoStore.cs
index 3204fb74..8af56343 100644
--- a/Src/Dlhis.Basic/Organization/Services/IGainfoStore.cs
+++ b/Src/Dlhis.Basic/Organization/Services/IGainfoStore.cs
@@ -9,7 +9,7 @@ namespace Dlhis.Basic.Organization.Services;
///
public interface IGainfoStore : IScopeDependency
{
- ISugarQueryable Queryable(GainfoStatusEnumType? gainfoStatus);
+ ISugarQueryable Queryable(GainfoStatusEnumType? gainfoStatus = null);
diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoCardService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoCardService.cs
new file mode 100644
index 00000000..c9d3213e
--- /dev/null
+++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoCardService.cs
@@ -0,0 +1,54 @@
+using Dlhis.Basic.Organization.Request;
+using Dlhis.Basic.Organization.Response;
+using Dlhis.Entity.Basic.Entity;
+using Kurisu.AspNetCore.Utils.Extensions;
+using Kurisu.SqlSugar.Services;
+
+namespace Dlhis.Basic.Organization.Services.Implements;
+
+public class GainfoCardService : IGainfoCardService
+{
+ private readonly IDbContext _dbContext;
+ private readonly IGainfoStore _gainfoStore;
+
+ public GainfoCardService(IDbContext dbContext, IGainfoStore gainfoStore)
+ {
+ _dbContext = dbContext;
+ _gainfoStore = gainfoStore;
+ }
+
+ public async Task ChangeCardAsync(ChangeCardRequest request)
+ {
+ var gainfo = await _gainfoStore.Queryable().Where(x => x.No == request.UserNo).FirstAsync();
+ gainfo.ThrowIfNull("档案不存在");
+
+ gainfo.CardNo = request.CardNo;
+
+ await _gainfoStore.UpdateAsync(gainfo);
+ await _dbContext.InsertAsync(new GainfoCardRecordEntity
+ {
+ UserNo = request.UserNo,
+ CardNo = request.CardNo,
+ Reason = request.Reason,
+ Remark = request.Remark,
+ });
+ }
+
+ public async Task> GetChangeRecordsAsync(string userNo)
+ {
+ return await _dbContext.Queryable()
+ .LeftJoin((x, ga) => x.UserNo == ga.No)
+ .Where(x => x.UserNo == userNo)
+ .Select((x, ga) => new ChangeCardResponse
+ {
+ UserNo = x.UserNo,
+ UserCode = ga.Code,
+ UserName = ga.Name,
+ CardNo = x.CardNo,
+ Reason = x.Reason,
+ Remark = x.Remark,
+ CreateTime = x.CreateTime,
+ })
+ .ToListAsync();
+ }
+}
diff --git a/Src/Dlhis.Entity/Basic/Entity/GainfoCardRecordEntity.cs b/Src/Dlhis.Entity/Basic/Entity/GainfoCardRecordEntity.cs
new file mode 100644
index 00000000..59c4b49d
--- /dev/null
+++ b/Src/Dlhis.Entity/Basic/Entity/GainfoCardRecordEntity.cs
@@ -0,0 +1,33 @@
+using Kurisu.Core.DataAccess.Entity;
+using Kurisu.SqlSugar;
+using SqlSugar;
+
+namespace Dlhis.Entity.Basic.Entity;
+
+[SugarTable(TableName = "GainfoCardRecord", TableDescription = "卡记录")]
+public class GainfoCardRecordEntity : SugarBaseEntity, ITenantId
+{
+ ///
+ /// 档案No
+ ///
+ [SugarColumn(IsNullable = false, IndexGroupNameList = new[] { "idx_GainfoCardRecord_userno" })]
+ public string UserNo { get; set; }
+
+ ///
+ /// 卡号
+ ///
+ [SugarColumn(IsNullable = false)]
+ public string CardNo { get; set; }
+
+ ///
+ /// 更换原因
+ ///
+ public string Reason { get; set; }
+
+ ///
+ /// 备注
+ ///
+ public string Remark { get; set; }
+
+ public string TenantId { get; set; }
+}