diff --git a/WGShare.API/Controllers/Frontend/HomeController.cs b/WGShare.API/Controllers/Frontend/HomeController.cs index 0b6a8cd..c2873e2 100644 --- a/WGShare.API/Controllers/Frontend/HomeController.cs +++ b/WGShare.API/Controllers/Frontend/HomeController.cs @@ -4,6 +4,8 @@ using Mapster; using Masuit.Tools; using Microsoft.AspNetCore.Mvc; using MiniExcelLibs; +using MiniExcelLibs.Attributes; +using MiniExcelLibs.OpenXml; using SqlSugar; using System.IO; using System.Text.RegularExpressions; @@ -211,9 +213,11 @@ namespace WGShare.API.Controllers.Frontend RoomNum = room.RoomNum, BeginTime = beginDatetime.ToString("yyyy-MM-dd HH:mm:ss"), EndTime = endDaetime.ToString("yyyy-MM-dd HH:mm:ss"), - Users = new List() + Users = new List(), + Signin = new List() }; + #region 计算入会次数、累计参会时长 foreach (var userRecord in groupByUser) { if (userRecord.IsNullOrEmpty()) @@ -262,6 +266,22 @@ namespace WGShare.API.Controllers.Frontend SumTime = sumTime, }); } + #endregion + + #region 计算签到次数 + var signins = await _sqlSugar.Queryable() + .InnerJoin((u, us) => u.UId == us.Id) + .Where((u, us) => u.RoomNum == roomNum && u.CreateTime >= beginDatetime && u.CreateTime <= endDaetime) + .Select((u, us) => new SignInListRecordExcelDto + { + Account = us.Account, + SignInTime = u.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"), + UserName = us.UserName, + SignInName = u.SignInName + }) + .ToListAsync(); + value.Signin.AddRange(signins); + #endregion using var stream = new MemoryStream(); diff --git a/WGShare.API/Controllers/Frontend/RoomController.cs b/WGShare.API/Controllers/Frontend/RoomController.cs index 5f1468f..613b835 100644 --- a/WGShare.API/Controllers/Frontend/RoomController.cs +++ b/WGShare.API/Controllers/Frontend/RoomController.cs @@ -658,5 +658,33 @@ namespace WGShare.API.Controllers.Frontend return _ossHelper.GetAccessFileUrl(fileUrl); } #endregion + + /// + /// 获取签到列表 + /// + /// + [HttpGet("sign-in")] + public async Task> GetSignInList() + { + var list = await _sqlSugar.Queryable() + .Where(x => x.UId == UId) + .ToListAsync(); + + return list.Adapt>(); + } + + /// + /// 提交签到 + /// + /// + /// + [HttpPost("sign-in")] + public async Task SignIn([FromBody] List list) + { + var entitys = list.Adapt>(); + entitys.ForEach(x => x.UId = UId); + + await _sqlSugar.Insertable(entitys).ExecuteCommandAsync(); + } } } diff --git a/WGShare.API/Controllers/Frontend/UserController.cs b/WGShare.API/Controllers/Frontend/UserController.cs index 4229893..a49bb7d 100644 --- a/WGShare.API/Controllers/Frontend/UserController.cs +++ b/WGShare.API/Controllers/Frontend/UserController.cs @@ -16,6 +16,8 @@ using WGShare.Domain.FriendlyException; using WGShare.Domain.GeneralModel; using Yitter.IdGenerator; using WGShare.Domain.Enums; +using Microsoft.AspNetCore.Routing.Template; +using MiniExcelLibs.OpenXml; namespace WGShare.API.Controllers.Frontend { @@ -115,6 +117,45 @@ namespace WGShare.API.Controllers.Frontend .UpdateColumns(x => new { x.Account, x.UserName, x.RoleId, x.Year, x.Subject }).ExecuteCommandAsync() > 0; } + /// + /// 获取用户签到名单列表 + /// + /// + /// + [HttpGet("signs")] + public async Task> GetUserSignInList([FromQuery] string uid) + { + var list = await _sqlSugar.Queryable().Where(x => x.UId == uid) + .ToListAsync(); + + return list.Adapt>(); + } + + + /// + /// 修改用户签到列表 + /// + /// + [HttpPut("signs")] + public async Task ModifySignList([FromQuery] string uid, [FromBody] List signInList) + { + var entities = signInList.Adapt>(); + + using (var tran = _sqlSugar.AsTenant().UseTran()) + { + await _sqlSugar.Deleteable().Where(x => x.UId == uid).ExecuteCommandAsync(); + + if (!entities.IsNullOrEmpty()) + { + var stor = await _sqlSugar.Storageable(entities).ToStorageAsync(); + await stor.AsInsertable.ExecuteCommandAsync(); //不存在插入 + await stor.AsUpdateable.UpdateColumns(x => x.SignInName).ExecuteCommandAsync(); //存在更新 + } + tran.CommitTran(); + } + + } + /// /// 更改密码 /// @@ -245,6 +286,81 @@ namespace WGShare.API.Controllers.Frontend } + /// + /// 获取签到绑定列表 + /// + /// + [HttpGet("signin-list")] + public async Task GetSignInBinding() + { + var userWithSign = await _sqlSugar.Queryable() + .InnerJoin((u, r) => u.RoleId == r.Id) + .LeftJoin((u, r, s) => u.Id == s.UId) + .Where((u, r, s) => u.IsDelete == false && TenantId == u.TenantId) + .Select((u, r, s) => new SignInListExcelDto + { + UId = u.Id, + Account = u.Account, + RoleId = u.RoleId, + RoleName = r.RoleName, + SignInName = s.SignInName, + UserName = u.UserName, + }).ToListAsync(); + var value = new Dictionary() + { + ["Users"] = userWithSign + }; + + using var stream = new MemoryStream(); + await MiniExcel.SaveAsByTemplateAsync(stream, $@"{AppDomain.CurrentDomain.BaseDirectory}signInListImportTemplate.xlsx", value); + stream.Seek(0, SeekOrigin.Begin); + var fileName = $@"excel/签到绑定导入-{DateTime.Now.ToString("MMddHHmmss")}.xlsx"; + _ossHelper.UploadWithExpireTime(fileName, stream, 10); + return _ossHelper.GetAccessFileUrl(fileName, 5); + } + + + [HttpPost("import/signin-list")] + public async Task ImportSigninList([FromForm] IFormFile file) + { + using var stream = file.OpenReadStream(); + var rows = stream.Query().ToList(); + rows.RemoveAll(x => x == null || string.IsNullOrWhiteSpace(x.Account) || string.IsNullOrWhiteSpace(x.UId)); + if (rows.IsNullOrEmpty()) + { + throw Oops.Oh("无有效数据,请检查文件数据!"); + } + + // 获取已存在用户Id + var existsUIds = await _sqlSugar.Queryable() + .Where(x => x.IsDelete == false).Select(x => x.Id).ToListAsync(); + // 去除不存在用户Id + rows.RemoveAll(x => !existsUIds.Contains(x.UId)); + + var delUids = rows.Select(x => x.UId).Distinct().ToList(); + + + var entities = rows.Where(x => !string.IsNullOrWhiteSpace(x.SignInName)).Adapt>(); + + using (var tran = _sqlSugar.AsTenant().UseTran()) + { + await _sqlSugar.Deleteable().Where(x => delUids.Contains(x.UId)).ExecuteCommandAsync(); + + var store = await _sqlSugar.Storageable(entities) + .WhereColumns(x => new { x.UId, x.SignInName }) + .ToStorageAsync(); + + + await store.AsInsertable.ExecuteCommandAsync(); + await store.AsUpdateable.UpdateColumns(x => x.SignInName).ExecuteCommandHasChangeAsync(); + + tran.CommitTran(); + } + + + + return; + } } } diff --git a/WGShare.API/WGShare.API.csproj b/WGShare.API/WGShare.API.csproj index b2a151f..e1639d3 100644 --- a/WGShare.API/WGShare.API.csproj +++ b/WGShare.API/WGShare.API.csproj @@ -35,6 +35,9 @@ Never + + PreserveNewest + PreserveNewest diff --git a/WGShare.API/WGShare.API.xml b/WGShare.API/WGShare.API.xml index ec7eb40..95c3f6f 100644 --- a/WGShare.API/WGShare.API.xml +++ b/WGShare.API/WGShare.API.xml @@ -303,6 +303,19 @@ 文件Id + + + 获取签到列表 + + + + + + 提交签到 + + + + 获取用户列表 @@ -325,6 +338,19 @@ + + + 获取用户签到名单列表 + + + + + + + 修改用户签到列表 + + + 更改密码 @@ -353,6 +379,12 @@ + + + 获取签到绑定列表 + + + 前后端共用接口 diff --git a/WGShare.API/meetingRecordTemplate.xlsx b/WGShare.API/meetingRecordTemplate.xlsx index 824af45..7144d8e 100644 Binary files a/WGShare.API/meetingRecordTemplate.xlsx and b/WGShare.API/meetingRecordTemplate.xlsx differ diff --git a/WGShare.API/signInListImportTemplate.xlsx b/WGShare.API/signInListImportTemplate.xlsx new file mode 100644 index 0000000..5068256 Binary files /dev/null and b/WGShare.API/signInListImportTemplate.xlsx differ diff --git a/WGShare.Domain/DTOs/Room/RoomMettingRecordExportDTO.cs b/WGShare.Domain/DTOs/Room/RoomMettingRecordExportDTO.cs index e655c4e..06c231a 100644 --- a/WGShare.Domain/DTOs/Room/RoomMettingRecordExportDTO.cs +++ b/WGShare.Domain/DTOs/Room/RoomMettingRecordExportDTO.cs @@ -1,4 +1,5 @@ -using System; +using MiniExcelLibs.Attributes; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -15,6 +16,8 @@ namespace WGShare.Domain.DTOs.Room public string EndTime { get; set; } public List Users { get; set; } + + public List Signin { get; set; } } public class UserBehavior @@ -27,4 +30,15 @@ namespace WGShare.Domain.DTOs.Room public int JoinCount { get; set; } public int SumTime { get; set; } } + + public class SignInListRecordExcelDto + { + + public string Account { get; set; } + + public string UserName { get; set; } + + public string SignInTime { get; set; } + public string SignInName { get; set; } + } } diff --git a/WGShare.Domain/DTOs/User/SignInListExcelDto.cs b/WGShare.Domain/DTOs/User/SignInListExcelDto.cs new file mode 100644 index 0000000..6143632 --- /dev/null +++ b/WGShare.Domain/DTOs/User/SignInListExcelDto.cs @@ -0,0 +1,33 @@ +using MiniExcelLibs.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WGShare.Domain.DTOs.User +{ + /// + /// 导出账号签到用户列表 + /// + public class SignInListExcelDto + { + + [ExcelColumnName("UId")] + public string UId { get; set; } + + + [ExcelColumnName("账号")] + public string Account { get; set; } + + [ExcelColumnName("账号名称")] + public string UserName{ get; set; } + + public string RoleId { get; set; } + [ExcelColumnName("角色")] + public string RoleName { get; set; } + [ExcelColumnName("绑定签到人姓名")] + + public string SignInName { get; set; } + } +} diff --git a/WGShare.Domain/DTOs/User/UserSignInListDto.cs b/WGShare.Domain/DTOs/User/UserSignInListDto.cs new file mode 100644 index 0000000..e8c8712 --- /dev/null +++ b/WGShare.Domain/DTOs/User/UserSignInListDto.cs @@ -0,0 +1,18 @@ +using MiniExcelLibs.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WGShare.Domain.DTOs.User +{ + public class UserSignInListDto + { + + public string Id { get; set; } + public string UId { get; set; } + + public string SignInName { get; set; } + } +} diff --git a/WGShare.Domain/DTOs/User/UserSignInRecordDto.cs b/WGShare.Domain/DTOs/User/UserSignInRecordDto.cs new file mode 100644 index 0000000..31c524b --- /dev/null +++ b/WGShare.Domain/DTOs/User/UserSignInRecordDto.cs @@ -0,0 +1,18 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WGShare.Domain.DTOs.User +{ + public class UserSignInRecordDto + { + + + public string SignInName { get; set; } + + public string RoomNum { get; set; } + } +} diff --git a/WGShare.Domain/Entities/UserSignInList.cs b/WGShare.Domain/Entities/UserSignInList.cs new file mode 100644 index 0000000..8d5d923 --- /dev/null +++ b/WGShare.Domain/Entities/UserSignInList.cs @@ -0,0 +1,48 @@ +using AngleSharp.Text; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WGShare.Domain.Entities +{ + /// + /// 签到名单 + /// + [SugarTable("user_signin_list")] + public class UserSignInList + { + + /// + /// + /// + [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)] + public string Id { get; set; } + + + /// + /// + /// + [SugarColumn(ColumnName = "uid")] + public string UId { get; set; } + + + [SugarColumn(ColumnName = "signin_name")] + public string SignInName { get; set; } + + /// + /// 创建时间 + /// 默认值: CURRENT_TIMESTAMP + /// + [SugarColumn(ColumnName = "create_time", IsOnlyIgnoreInsert = true, IsOnlyIgnoreUpdate = true)] + public DateTime CreateTime { get; set; } + + /// + /// 修改时间 + /// + [SugarColumn(ColumnName = "modify_time", IsOnlyIgnoreInsert = true, IsOnlyIgnoreUpdate = true)] + public DateTime ModifyTime { get; set; } + } +} diff --git a/WGShare.Domain/Entities/UserSignInRecord.cs b/WGShare.Domain/Entities/UserSignInRecord.cs new file mode 100644 index 0000000..a8adb13 --- /dev/null +++ b/WGShare.Domain/Entities/UserSignInRecord.cs @@ -0,0 +1,44 @@ +using AngleSharp.Text; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WGShare.Domain.Entities +{ + /// + /// 签到名单记录 + /// + [SugarTable("user_signin_record")] + public class UserSignInRecord + { + + /// + /// + /// + [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)] + public string Id { get; set; } + + + /// + /// + /// + [SugarColumn(ColumnName = "uid")] + public string UId { get; set; } + + + [SugarColumn(ColumnName = "signin_name")] + public string SignInName { get; set; } + + [SugarColumn(ColumnName = "room_num")] + public string RoomNum { get; set; } + /// + /// 创建时间 + /// 默认值: CURRENT_TIMESTAMP + /// + [SugarColumn(ColumnName = "create_time", IsOnlyIgnoreInsert = true, IsOnlyIgnoreUpdate = true)] + public DateTime CreateTime { get; set; } + } +}