Compare commits

..

2 Commits

Author SHA1 Message Date
youngq 3a529cb55f 1 2024-11-13 15:47:12 +08:00
youngq 4a08c56042 完成签到 2024-11-12 17:51:59 +08:00
14 changed files with 377 additions and 4 deletions

View File

@ -115,11 +115,11 @@
"DockerConfig": {
"Prot": "5192:5192",
"AspNetCoreEnv": "",
"LastEnvName": "marking001",
"LastEnvName": "29dev",
"RemoveDaysFromPublished": "10",
"WorkDir": "",
"Volume": "",
"Other": "--name wgshare-api -e ASPNETCORE_ENVIRONMENT=Production -e TZ=Asia/Shanghai",
"Other": "--name wgshare-api -e ASPNETCORE_ENVIRONMENT=Development -e TZ=Asia/Shanghai",
"EnvPairList": [
{
"EnvName": "29dev",

View File

@ -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<UserBehavior>()
Users = new List<UserBehavior>(),
Signin = new List<SignInListRecordExcelDto>()
};
#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<UserSignInRecord>()
.InnerJoin<User>((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();

View File

@ -658,5 +658,33 @@ namespace WGShare.API.Controllers.Frontend
return _ossHelper.GetAccessFileUrl(fileUrl);
}
#endregion
/// <summary>
/// 获取签到列表
/// </summary>
/// <returns></returns>
[HttpGet("sign-in")]
public async Task<List<UserSignInListDto>> GetSignInList()
{
var list = await _sqlSugar.Queryable<UserSignInList>()
.Where(x => x.UId == UId)
.ToListAsync();
return list.Adapt<List<UserSignInListDto>>();
}
/// <summary>
/// 提交签到
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
[HttpPost("sign-in")]
public async Task SignIn([FromBody] List<UserSignInRecordDto> list)
{
var entitys = list.Adapt<List<UserSignInRecord>>();
entitys.ForEach(x => x.UId = UId);
await _sqlSugar.Insertable(entitys).ExecuteCommandAsync();
}
}
}

View File

@ -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;
}
/// <summary>
/// 获取用户签到名单列表
/// </summary>
/// <param name="uid"></param>
/// <returns></returns>
[HttpGet("signs")]
public async Task<List<UserSignInListDto>> GetUserSignInList([FromQuery] string uid)
{
var list = await _sqlSugar.Queryable<UserSignInList>().Where(x => x.UId == uid)
.ToListAsync();
return list.Adapt<List<UserSignInListDto>>();
}
/// <summary>
/// 修改用户签到列表
/// </summary>
/// <returns></returns>
[HttpPut("signs")]
public async Task ModifySignList([FromQuery] string uid, [FromBody] List<UserSignInListDto> signInList)
{
var entities = signInList.Adapt<List<UserSignInList>>();
using (var tran = _sqlSugar.AsTenant().UseTran())
{
await _sqlSugar.Deleteable<UserSignInList>().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();
}
}
/// <summary>
/// 更改密码
/// </summary>
@ -245,6 +286,79 @@ namespace WGShare.API.Controllers.Frontend
}
/// <summary>
/// 获取签到绑定列表
/// </summary>
/// <returns></returns>
[HttpGet("signin-list")]
public async Task<string> GetSignInBinding()
{
var userWithSign = await _sqlSugar.Queryable<User>()
.InnerJoin<Role>((u, r) => u.RoleId == r.Id)
.LeftJoin<UserSignInList>((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<string, object>()
{
["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<IActionResult> ImportSigninList([FromForm] IFormFile file)
{
using var stream = file.OpenReadStream();
var rows = stream.Query<SignInListExcelDto>().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<User>()
.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<List<UserSignInList>>();
using (var tran = _sqlSugar.AsTenant().UseTran())
{
await _sqlSugar.Deleteable<UserSignInList>().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 Ok((isSuccess: true, url: "", msg: "导入成功"));
}
}
}

View File

@ -35,6 +35,9 @@
<None Update="Reference\AgoraIO.dll">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="signInListImportTemplate.xlsx">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="WGShare.API.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

View File

@ -303,6 +303,19 @@
<param name="fileId">文件Id</param>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.GetSignInList">
<summary>
获取签到列表
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.SignIn(System.Collections.Generic.List{WGShare.Domain.DTOs.User.UserSignInRecordDto})">
<summary>
提交签到
</summary>
<param name="list"></param>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.UserController.GetUserList(System.String,System.Nullable{System.Boolean},WGShare.Domain.GeneralModel.PagedBaseDto)">
<summary>
获取用户列表
@ -325,6 +338,19 @@
<param name="inputDTO"></param>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.UserController.GetUserSignInList(System.String)">
<summary>
获取用户签到名单列表
</summary>
<param name="uid"></param>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.UserController.ModifySignList(System.String,System.Collections.Generic.List{WGShare.Domain.DTOs.User.UserSignInListDto})">
<summary>
修改用户签到列表
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.UserController.ModifyPassword(WGShare.Domain.DTOs.User.UserChangePwdDTO)">
<summary>
更改密码
@ -353,6 +379,12 @@
<param name="file"></param>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.UserController.GetSignInBinding">
<summary>
获取签到绑定列表
</summary>
<returns></returns>
</member>
<member name="T:WGShare.API.Controllers.PublicController">
<summary>
前后端共用接口

Binary file not shown.

View File

@ -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<UserBehavior> Users { get; set; }
public List<SignInListRecordExcelDto> 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; }
}
}

View File

@ -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
{
/// <summary>
/// 导出账号签到用户列表
/// </summary>
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; }
}
}

View File

@ -0,0 +1,19 @@
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; }
}
}

View File

@ -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; }
}
}

View File

@ -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
{
/// <summary>
/// 签到名单
///</summary>
[SugarTable("user_signin_list")]
public class UserSignInList
{
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public string Id { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "uid")]
public string UId { get; set; }
[SugarColumn(ColumnName = "signin_name")]
public string SignInName { get; set; }
/// <summary>
/// 创建时间
/// 默认值: CURRENT_TIMESTAMP
///</summary>
[SugarColumn(ColumnName = "create_time", IsOnlyIgnoreInsert = true, IsOnlyIgnoreUpdate = true)]
public DateTime CreateTime { get; set; }
/// <summary>
/// 修改时间
///</summary>
[SugarColumn(ColumnName = "modify_time", IsOnlyIgnoreInsert = true, IsOnlyIgnoreUpdate = true)]
public DateTime ModifyTime { get; set; }
}
}

View File

@ -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
{
/// <summary>
/// 签到名单记录
///</summary>
[SugarTable("user_signin_record")]
public class UserSignInRecord
{
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public string Id { get; set; }
/// <summary>
///
///</summary>
[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; }
/// <summary>
/// 创建时间
/// 默认值: CURRENT_TIMESTAMP
///</summary>
[SugarColumn(ColumnName = "create_time", IsOnlyIgnoreInsert = true, IsOnlyIgnoreUpdate = true)]
public DateTime CreateTime { get; set; }
}
}