课程管理新增Excel导入

课程场景新增Excel导入
master
xiaochanghai 6 months ago
parent 0971750096
commit 3729875672
  1. 8
      Model/Tiobon.Web.pdm
  2. 2
      Tiobon.Core.Services/BASE/BaseServices.cs
  3. 130
      Tiobon.Core.Services/Ghre/Ghre_CourseSceneServices.cs
  4. 243
      Tiobon.Core.Services/Ghre/Ghre_CourseServices.cs

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?PowerDesigner AppLocale="UTF16" ID="{C294868A-C3F3-41AD-98CC-78B6D4E0CC40}" Label="" LastModificationDate="1734935238" Name="Tiobon" Objects="2778" Symbols="104" Target="Microsoft SQL Server 2008" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="15.0.0.2613"?> <?PowerDesigner AppLocale="UTF16" ID="{C294868A-C3F3-41AD-98CC-78B6D4E0CC40}" Label="" LastModificationDate="1735014381" Name="Tiobon" Objects="2778" Symbols="104" Target="Microsoft SQL Server 2008" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="15.0.0.2613"?>
<!-- do not edit this file --> <!-- do not edit this file -->
<Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object"> <Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object">
@ -13672,11 +13672,11 @@ LABL 0 Arial Unicode MS,8,N</a:FontList>
<a:Code>CourseName</a:Code> <a:Code>CourseName</a:Code>
<a:CreationDate>1713839845</a:CreationDate> <a:CreationDate>1713839845</a:CreationDate>
<a:Creator>Administrator</a:Creator> <a:Creator>Administrator</a:Creator>
<a:ModificationDate>1713839945</a:ModificationDate> <a:ModificationDate>1735014381</a:ModificationDate>
<a:Modifier>Administrator</a:Modifier> <a:Modifier>Administrator</a:Modifier>
<a:Comment>课程名称</a:Comment> <a:Comment>课程名称</a:Comment>
<a:DataType>nvarchar(32)</a:DataType> <a:DataType>nvarchar(64)</a:DataType>
<a:Length>32</a:Length> <a:Length>64</a:Length>
</o:Column> </o:Column>
<o:Column Id="o296"> <o:Column Id="o296">
<a:ObjectID>1335D331-DAA5-4CD0-9A46-A58317A9F23F</a:ObjectID> <a:ObjectID>1335D331-DAA5-4CD0-9A46-A58317A9F23F</a:ObjectID>

@ -827,7 +827,7 @@ public class BaseServices<TEntity, TEntityDto, TInsertDto, TEditDto> : IBaseServ
NPOIHelper.ExportExcel(dt, body.exportSet.TitleName, "sheet1", physicsPath + path); NPOIHelper.ExportExcel(dt, body.exportSet.TitleName, "sheet1", physicsPath + path);
var result = new ExcelData(); var result = new ExcelData();
result.filePath = path; result.filePath = "/Advanced" + path;
result.fileName = body.exportSet.TitleName + ".xlsx"; result.fileName = body.exportSet.TitleName + ".xlsx";
return ServiceResult<ExcelData>.OprateSuccess("导出成功", result); return ServiceResult<ExcelData>.OprateSuccess("导出成功", result);
} }

@ -1,4 +1,6 @@
namespace Tiobon.Core.Services; using NPOI.SS.UserModel;
namespace Tiobon.Core.Services;
/// <summary> /// <summary>
/// 课程场景 (服务) /// 课程场景 (服务)
@ -58,4 +60,130 @@ public class Ghre_CourseSceneServices : BaseServices<Ghre_CourseScene, Ghre_Cour
} }
return await base.Update(Id, editModel); return await base.Update(Id, editModel);
} }
#region Excel导入
public override async Task<ServiceResult<string>> DownloadExcel(string menuName)
{
var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot";
var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}ExcelTemplate{Path.DirectorySeparatorChar}"}";
if (!Directory.Exists(physicsPath + path))
Directory.CreateDirectory(physicsPath + path);
Type entityType = typeof(Ghre_CourseScene);
var fileName = entityType.GetEntityTableName() + ".xlsx";
var physicsPath1 = physicsPath + path + fileName;
//if (dataSourceLists.Any())
// physicsPath1 = physicsPath + path + newFileName;
var result = ServiceResult<string>.OprateSuccess("课程场景_" + DateTimeHelper.ConvertToSecondString1(DateTime.Now) + ".xlsx", physicsPath1);
return result;
}
public override async Task<ServiceResult<ExcelData>> ImportExcel(IFormFile file)
{
var data = new ExcelData();
long id = SnowFlakeSingle.instance.getID();
var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot";
var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}import{Path.DirectorySeparatorChar}{id}{Path.DirectorySeparatorChar}"}";
if (!Directory.Exists(physicsPath + path))
Directory.CreateDirectory(physicsPath + path);
var filepath = physicsPath + path + file.FileName;
using (var stream = File.Create(filepath))
{
await file.CopyToAsync(stream);
}
string extension = Path.GetExtension(filepath);
bool isExistError = false;
var id1 = SnowFlakeSingle.instance.getID();
string errorFileName = path + SnowFlakeSingle.instance.getID() + extension;
var dt = NPOIHelper.ImportExcel(filepath, "课程场景");
if (dt.Columns["Comments"] == null)
dt.Columns.Add("Comments", typeof(string));
for (int i = 0; i < dt.Rows.Count; i++)
{
var comments = new List<string>();
if (!dt.Columns.Contains("场景编号"))
{
comments.Add("未查询到【场景编号】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("场景名称"))
{
comments.Add("未查询到【场景名称】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("备注"))
{
comments.Add("未查询到【备注】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
var SceneNo = dt.Rows[i]["场景编号"].ToString();
var SceneName = dt.Rows[i]["场景名称"].ToString();
if (SceneNo.IsNullOrEmpty() && SceneName.IsNullOrEmpty())
continue;
var remarkSz = dt.Rows[i]["备注"].ToString();
if (await base.AnyAsync(x => x.SceneName == SceneName && x.SceneNo == SceneNo))
{
comments.Add($"系统已存在相同编号名称课程场景数据!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
var dict = new Dictionary<string, object>
{
{ "Id", SnowFlakeSingle.Instance.NextId() },
{ "CreateBy", App.User.ID },
{ "CreateTime", DateTime.Now },
{ "SceneNo", SceneNo },
{ "SceneName", SceneName },
{ "RemarkSz", remarkSz }
};
try
{
await Db.Insertable(dict).AS("Ghre_CourseScene").ExecuteCommandAsync();
data.SuccessCount++;
//data.SuccessCount += list.Count;
}
catch (Exception E)
{
comments.Add(E.Message);
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
}
if (isExistError)
{
NPOIHelper.ExportExcel(dt, null, "课程场景", physicsPath + errorFileName);
data.filePath = errorFileName;
}
return ServiceResult<ExcelData>.OprateSuccess("导入成功!", data);
}
#endregion
} }

@ -1,4 +1,6 @@
using NPOI.SS.UserModel; using NPOI.SS.Formula.Functions;
using NPOI.SS.UserModel;
using NPOI.Util;
using static Tiobon.Core.Model.Consts; using static Tiobon.Core.Model.Consts;
namespace Tiobon.Core.Services; namespace Tiobon.Core.Services;
@ -617,7 +619,7 @@ public class Ghre_CourseServices : BaseServices<Ghre_Course, Ghre_CourseDto, Ins
path = path + body.exportSet.TitleName + ".xlsx"; path = path + body.exportSet.TitleName + ".xlsx";
NPOIHelper.ExportExcel(dt, body.exportSet.TitleName, "sheet1", physicsPath + path); NPOIHelper.ExportExcel(dt, body.exportSet.TitleName, "sheet1", physicsPath + path);
var result = new ExcelData(); var result = new ExcelData();
result.filePath = path; result.filePath = "/Advanced" + path;
result.fileName = body.exportSet.TitleName + ".xlsx"; result.fileName = body.exportSet.TitleName + ".xlsx";
return ServiceResult<ExcelData>.OprateSuccess("导出成功", result); return ServiceResult<ExcelData>.OprateSuccess("导出成功", result);
} }
@ -689,6 +691,243 @@ public class Ghre_CourseServices : BaseServices<Ghre_Course, Ghre_CourseDto, Ins
var result = ServiceResult<string>.OprateSuccess("课程管理_" + DateTimeHelper.ConvertToSecondString1(DateTime.Now) + ".xlsx", physicsPath1); var result = ServiceResult<string>.OprateSuccess("课程管理_" + DateTimeHelper.ConvertToSecondString1(DateTime.Now) + ".xlsx", physicsPath1);
return result; return result;
} }
public override async Task<ServiceResult<ExcelData>> ImportExcel(IFormFile file)
{
var data = new ExcelData();
long id = SnowFlakeSingle.instance.getID();
var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot";
var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}import{Path.DirectorySeparatorChar}{id}{Path.DirectorySeparatorChar}"}";
if (!Directory.Exists(physicsPath + path))
Directory.CreateDirectory(physicsPath + path);
var filepath = physicsPath + path + file.FileName;
using (var stream = File.Create(filepath))
{
await file.CopyToAsync(stream);
}
string extension = Path.GetExtension(filepath);
bool isExistError = false;
var id1 = SnowFlakeSingle.instance.getID();
string errorFileName = path + SnowFlakeSingle.instance.getID() + extension;
var dt = NPOIHelper.ImportExcel(filepath, "课程管理");
if (dt.Columns["Comments"] == null)
dt.Columns.Add("Comments", typeof(string));
for (int i = 0; i < dt.Rows.Count; i++)
{
var comments = new List<string>();
if (!dt.Columns.Contains("课程编号(必填)"))
{
comments.Add("未查询到【课程编号】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("课程名称(必填)"))
{
comments.Add("未查询到【课程名称】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("课程分类(必填)"))
{
comments.Add("未查询到【课程分类】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("课程场景"))
{
comments.Add("未查询到【课程场景】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("标准课时(必填)"))
{
comments.Add("未查询到【标准课时】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("学分(必填)"))
{
comments.Add("未查询到【学分】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("内/外训"))
{
comments.Add("未查询到【内/外训】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("是否公开课(必填)"))
{
comments.Add("未查询到【是否公开课】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("培训有效期(月)"))
{
comments.Add("未查询到【培训有效期(月)】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("课程大纲"))
{
comments.Add("未查询到【课程大纲】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("课前准备"))
{
comments.Add("未查询到【课前准备】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (!dt.Columns.Contains("备注"))
{
comments.Add("未查询到【备注】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
var courseNo = dt.Rows[i]["课程编号(必填)"].ToString();
long? courseClassId = null;
var courseClass = dt.Rows[i]["课程分类(必填)"].ToString();
var courseName = dt.Rows[i]["课程名称(必填)"].ToString();
long? courseSceneId = null;
var courseScene = dt.Rows[i]["课程场景"].ToString();
var standardHour = dt.Rows[i]["标准课时(必填)"].ToString();
var creditPoints = dt.Rows[i]["学分(必填)"].ToString();
var inOrOut = dt.Rows[i]["内/外训"].ToString();
var isOPen = dt.Rows[i]["是否公开课(必填)"].ToString();
var validityPeriod = dt.Rows[i]["培训有效期(月)"].ToString();
var outline = dt.Rows[i]["课程大纲"].ToString();
var beforeReady = dt.Rows[i]["课前准备"].ToString();
var remarkSz = dt.Rows[i]["备注"].ToString();
if (await base.AnyAsync(x => x.CourseNo == courseNo && x.CourseName == courseName))
{
comments.Add($"系统已存在相同编号名称课程数据!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (courseClass.IsNotEmptyOrNull())
{
courseClassId = (await _ghre_CourseClassServices.QuerySingle(x => x.ClassName == courseClass))?.Id;
if (courseClassId is null)
courseClassId = await _ghre_CourseClassServices.Add(new InsertGhre_CourseClassInput()
{
ClassNo = courseClass,
ClassName = courseClass
});
}
else
{
comments.Add($"课程分类为空!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
if (courseScene.IsNotEmptyOrNull())
{
await Db.Queryable<Ghre_CourseScene>().Where(x => x.CourseName == courseScene).FirstAsync();
courseSceneId = (await Db.Queryable<Ghre_CourseScene>().Where(x => x.CourseName == courseScene).FirstAsync())?.Id;
}
if (standardHour.IsNullOrEmpty())
standardHour = "0";
if (creditPoints.IsNullOrEmpty())
creditPoints = "0";
if (inOrOut.IsNotEmptyOrNull())
{
var items = await GetParaList("CourseInOrOut");
inOrOut = items.Where(x => x.ParaDetailName == inOrOut).FirstOrDefault()?.ParaDetailNo ?? "In";
}
if (isOPen.IsNullOrEmpty() || isOPen == "否")
isOPen = "是";
List<long?> courseClassId1 = [courseClassId];
var dict = new Dictionary<string, object>
{
{ "Id", SnowFlakeSingle.Instance.NextId() },
{ "CreateBy", App.User.ID },
{ "CreateTime", DateTime.Now },
{ "CourseClassId",JsonHelper.ObjToJson(courseClassId1) },
{ "CourseNo", courseNo },
{ "CourseName", courseName },
{ "CourseSceneId",courseSceneId },
{ "StandardHour", standardHour },
{ "CreditPoints", creditPoints },
{ "InOrOut", inOrOut },
{ "IsOPen", isOPen=="是" ? true:false },
{ "ValidityPeriod", validityPeriod },
{ "Outline", outline },
{ "BeforeReady", beforeReady },
{ "Status", "Draft" },
{ "UseDefaultCoverImage", true },
{ "DefaultCoverImageName", "defaultCourseCover1" },
{ "RemarkSz", remarkSz }
};
try
{
await Db.Insertable(dict).AS("Ghre_Course").ExecuteCommandAsync();
data.SuccessCount++;
//data.SuccessCount += list.Count;
}
catch (Exception E)
{
comments.Add(E.Message);
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
continue;
}
}
if (isExistError)
{
NPOIHelper.ExportExcel(dt, null, "课程管理", physicsPath + errorFileName);
data.filePath = errorFileName;
}
return ServiceResult<ExcelData>.OprateSuccess("导入成功!", data);
}
#region 获取公开课查询条件 #region 获取公开课查询条件
public async Task<ServiceResult<CoursePublicSearch>> QueryPublicSearchFields(QueryBody body) public async Task<ServiceResult<CoursePublicSearch>> QueryPublicSearchFields(QueryBody body)

Loading…
Cancel
Save