diff --git a/WGShare.API/Controllers/Backend/UserController.cs b/WGShare.API/Controllers/Backend/UserController.cs
index 0c8b604..8f3ce7c 100644
--- a/WGShare.API/Controllers/Backend/UserController.cs
+++ b/WGShare.API/Controllers/Backend/UserController.cs
@@ -52,6 +52,7 @@ namespace WGShare.API.Controllers.Backend
u => u.UserName.Contains(searchDTO.keyword) || u.Account.Contains(searchDTO.keyword) || u.Id.Contains(searchDTO.keyword))
.WhereIF(!string.IsNullOrWhiteSpace(searchDTO.TenantId), u => u.TenantId == searchDTO.TenantId)
.WhereIF(!string.IsNullOrWhiteSpace(searchDTO.RoleId), u => u.RoleId == searchDTO.RoleId)
+ .OrderBy(u => u.Id, OrderByType.Desc)
//.Where(u => u.IsDelete == false)
.Select((u, r, t) => new User
{
diff --git a/WGShare.API/Controllers/Frontend/UserController.cs b/WGShare.API/Controllers/Frontend/UserController.cs
index 9fc2035..f3c3a7b 100644
--- a/WGShare.API/Controllers/Frontend/UserController.cs
+++ b/WGShare.API/Controllers/Frontend/UserController.cs
@@ -1,7 +1,12 @@
using Mapster;
+using Masuit.Tools;
+using Masuit.Tools.Security;
using Microsoft.AspNetCore.Mvc;
+using Microsoft.VisualBasic;
+using MiniExcelLibs;
using SqlSugar;
using System;
+using System.Text.RegularExpressions;
using WGShare.API.Controllers.Basic;
using WGShare.API.Helpers;
using WGShare.Domain.Constant;
@@ -18,10 +23,13 @@ namespace WGShare.API.Controllers.Frontend
public class UserController : BasicController
{
private readonly ISqlSugarClient _sqlSugar;
+ private readonly OssHelper _ossHelper;
- public UserController(ISqlSugarClient sqlSugar)
+ public UserController(ISqlSugarClient sqlSugar,
+ OssHelper ossHelper)
{
this._sqlSugar = sqlSugar;
+ this._ossHelper = ossHelper;
}
@@ -131,5 +139,79 @@ namespace WGShare.API.Controllers.Frontend
.Where(x => ids.Contains(x.Id)).ExecuteCommandHasChangeAsync();
}
+
+ ///
+ /// Excel 导入用户
+ ///
+ ///
+ ///
+ [HttpPost("import")]
+ public async Task Import([FromForm] IFormFile file)
+ {
+
+ using var stream = file.OpenReadStream();
+ var rows = stream.Query().ToList();
+ if (rows.IsNullOrEmpty())
+ {
+ throw Oops.Oh("无有效数据,请检查文件数据!");
+ }
+
+ var accounts = rows.Select(x => x.Account.Trim());
+ var repeatAccount = accounts.GroupBy(x => x).Where(x => x.Count() > 1).Select(x => x.Key).ToHashSet();
+
+ // 去除重复账号
+ var distinctAccount = accounts.Except(repeatAccount);
+
+ // 数据库重复账号检查
+ var existsAccount = await _sqlSugar.Queryable()
+ .Where(x => distinctAccount.Contains(x.Account))
+ .Select(x => x.Account)
+ .ToListAsync();
+ if (!existsAccount.IsNullOrEmpty())
+ {
+ repeatAccount.UnionWith(existsAccount);
+ }
+
+ if (!repeatAccount.IsNullOrEmpty())
+ {
+ // 重复账号,返回结果Excel
+ foreach (var row in rows)
+ {
+ if (repeatAccount.Contains(row.Account))
+ {
+ row.ImportResult = "账号重复";
+ }
+ else
+ {
+ row.ImportResult = "可导入";
+ }
+ }
+ //FileStreamResult fileStream = null;
+ using var memoryStream = new MemoryStream();
+
+ memoryStream.SaveAs(rows);
+ memoryStream.Seek(0, SeekOrigin.Begin);
+
+ var fileName = $@"excel/{Regex.Replace(file.FileName, @"\.(xlsx|xls)$", "", RegexOptions.IgnoreCase)}_导入失败_{DateTime.Now.ToString("HHmmss")}.xlsx";
+ _ossHelper.UploadWithExpireTime(fileName, memoryStream, 10);
+ var fileUrl = _ossHelper.GetAccessFileUrl(fileName, 1);
+
+ return Ok((isSuccess: false, url: fileUrl, msg: "导入失败,请检查原因后重新导入!"));
+ }
+
+ var users = rows.Adapt>();
+ users.ForEach(x =>
+ {
+ x.Pwd = x.Pwd.MDString();
+ x.ScreenShareId = UserShareIdHelper.GenerateUnique8DigitNumber();
+ x.TenantId = TenantId;
+ x.RoleId = x.RoleId == "管理员" ? "1" : "2";
+ });
+
+ await _sqlSugar.Insertable(users).ExecuteCommandAsync();
+
+ return Ok((isSuccess: true, url: "", msg: "导入成功"));
+ }
+
}
}
diff --git a/WGShare.API/WGShare.API.xml b/WGShare.API/WGShare.API.xml
index aa8d386..c2db736 100644
--- a/WGShare.API/WGShare.API.xml
+++ b/WGShare.API/WGShare.API.xml
@@ -281,6 +281,13 @@
+
+
+ Excel 导入用户
+
+
+
+
前后端共用接口