You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
338 lines
14 KiB
C#
338 lines
14 KiB
C#
using Infrastructure;
|
|
using OpenAuth.App.Base;
|
|
using OpenAuth.App.FormScheme;
|
|
using OpenAuth.App.Permission;
|
|
using OpenAuth.Repository;
|
|
using OpenAuth.Repository.Domain;
|
|
using SqlSugar;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using OpenAuth.App.BaseApp.Base;
|
|
|
|
namespace OpenAuth.App.Import
|
|
{
|
|
public class ImportApp : SqlSugarBaseApp<Repository.Domain.ExcelImport, SugarDbContext>
|
|
{
|
|
SysDataItemDetailApp _dataItemDetailApp;
|
|
FormSchemeApp _formSchemeApp;
|
|
public ImportApp(ISugarUnitOfWork<SugarDbContext> unitWork, SysDataItemDetailApp dataItemDetailApp, FormSchemeApp formSchemeApp,
|
|
ISimpleClient<Repository.Domain.ExcelImport> repository)
|
|
: base(unitWork, repository, null)
|
|
{
|
|
_dataItemDetailApp = dataItemDetailApp;
|
|
_formSchemeApp = formSchemeApp;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取导入的分页数据
|
|
/// </summary>
|
|
/// <param name="keyWord">查询关键字</param>
|
|
/// <param name="moduleId">菜单id</param>
|
|
/// <param name="page"></param>
|
|
/// <param name="limit"></param>
|
|
/// <returns></returns>
|
|
public async Task<Response<PageInfo<List<ExcelImport>>>> LoadExcelImportPage(string keyWord, string moduleId, int page, int limit)
|
|
{
|
|
RefAsync<int> totalCount = 0;
|
|
var expression = Expressionable.Create<ExcelImport>()
|
|
.AndIF(!string.IsNullOrEmpty(keyWord), t => t.Name.Contains(keyWord))
|
|
.AndIF(!string.IsNullOrEmpty(moduleId), t => t.ModuleId == moduleId);
|
|
var info = await base.Repository.AsQueryable()
|
|
.Where(expression.ToExpression())
|
|
.ToPageListAsync(page, limit, totalCount);
|
|
return new Response<PageInfo<List<ExcelImport>>>
|
|
{
|
|
Result = new PageInfo<List<ExcelImport>>
|
|
{
|
|
Items = info,
|
|
Total = totalCount
|
|
}
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取表单数据
|
|
/// </summary>
|
|
/// <param name="id">id</param>
|
|
/// <returns></returns>
|
|
public async Task<ExcelImport> GetEntity(string id)
|
|
{
|
|
var entity = await base.Repository.AsQueryable()
|
|
.Where(t => t.Id == id)
|
|
.FirstAsync();
|
|
return entity;
|
|
}
|
|
/// <summary>
|
|
/// 获取配置字段列表
|
|
/// </summary>
|
|
/// <param name="importId">配置信息主键</param>
|
|
/// <returns></returns>
|
|
public Task<List<ExcelImportFileds>> GetFieldList(string importId)
|
|
{
|
|
return base.Repository.ChangeRepository<SugarRepositiry<Repository.Domain.ExcelImportFileds>>().AsQueryable().Where(t => t.ImportId == importId).ToListAsync();
|
|
}
|
|
/// <summary>
|
|
/// 获取导入配置列表根据模块ID
|
|
/// </summary>
|
|
/// <param name="moduleId">功能模块主键</param>
|
|
/// <returns></returns>
|
|
public async Task<List<ExcelImport>> GetModuleList(string moduleId)
|
|
{
|
|
var expression = Expressionable.Create<ExcelImport>();
|
|
expression = expression.And(t => t.ModuleId == moduleId && t.EnabledMark == 1);
|
|
return await base.Repository.AsQueryable().Where(expression.ToExpression()).ToListAsync();
|
|
}
|
|
/// <summary>
|
|
/// 删除数据
|
|
/// </summary>
|
|
/// <param name="keyValue">主键</param>
|
|
public async Task<Response<bool>> DeleteEntity(string keyValue)
|
|
{
|
|
using (var uow = base.UnitWork.CreateContext())
|
|
{
|
|
await uow.ExcelImport.DeleteByIdAsync(keyValue);
|
|
await uow.ExcelImportFileds.DeleteAsync(a => a.ImportId == keyValue);
|
|
|
|
var falg = uow.Commit();
|
|
return new Response<bool>
|
|
{
|
|
Result = falg,
|
|
Message = (falg == true ? "success" : "error")
|
|
};
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 保存表单(新增、修改)
|
|
/// </summary>
|
|
/// <param name="keyValue">主键值</param>
|
|
/// <param name="entity">实体数据</param>
|
|
/// <param name="filedList">字段列表</param>
|
|
/// <returns></returns>
|
|
public async Task<Response<bool>> SaveEntity(string keyValue, ExcelImport entity, List<ExcelImportFileds> filedList)
|
|
{
|
|
using (var uow = base.UnitWork.CreateContext())
|
|
{
|
|
if (!string.IsNullOrEmpty(keyValue))
|
|
{
|
|
entity.Id = keyValue;
|
|
entity.ModifyDate = DateTime.Now;
|
|
await uow.ExcelImport.UpdateAsync(entity);
|
|
}
|
|
else
|
|
{
|
|
entity.Id = Guid.NewGuid().ToString();
|
|
entity.CreateDate = DateTime.Now;
|
|
entity.EnabledMark = 1;
|
|
await uow.ExcelImport.InsertAsync(entity);
|
|
}
|
|
await uow.ExcelImportFileds.DeleteAsync(t => t.ImportId == entity.Id);
|
|
foreach (var item in filedList)
|
|
{
|
|
item.ImportId = entity.Id;
|
|
await uow.ExcelImportFileds.InsertAsync(item);
|
|
}
|
|
var falg = uow.Commit();
|
|
return new Response<bool>
|
|
{
|
|
Result = falg,
|
|
Message = (falg == true ? "success" : "error")
|
|
};
|
|
}
|
|
}
|
|
|
|
#region 扩展方法
|
|
/// <summary>
|
|
/// excel 数据导入(未导入数据写入缓存)
|
|
/// </summary>
|
|
/// <param name="templateId">导入模板主键</param>
|
|
/// <param name="dt">导入数据</param>
|
|
/// <returns></returns>
|
|
public async Task<(DataTable elist, int snum, int fnum)> ImportTable(string templateId, DataTable dt)
|
|
{
|
|
int snum = 0;
|
|
int fnum = 0;
|
|
// 创建一个datatable容器用于保存导入失败的数据
|
|
DataTable failDt = new DataTable();
|
|
dt.Columns.Add("导入错误", typeof(string));
|
|
foreach (DataColumn dc in dt.Columns)
|
|
{
|
|
failDt.Columns.Add(dc.ColumnName, dc.DataType);
|
|
}
|
|
|
|
if (dt.Rows.Count > 0)
|
|
{
|
|
ExcelImport entity = await GetEntity(templateId);
|
|
List<ExcelImportFileds> list = (List<ExcelImportFileds>)await GetFieldList(templateId);
|
|
|
|
if (entity != null && list.Count > 0)
|
|
{
|
|
string sqlonly = " select * from " + entity.DbTable + " where 1=1 {LEARUN_SASSID} ";
|
|
// 数据字典数据
|
|
Dictionary<string, List<SysDataItemDetail>> dataItemMap = new Dictionary<string, List<SysDataItemDetail>>();
|
|
Dictionary<string, DataTable> dataSourceMap = new Dictionary<string, DataTable>();
|
|
|
|
foreach (DataRow dr in dt.Rows)
|
|
{ // 行数据循环
|
|
try
|
|
{
|
|
List<SugarParameter> dbParameters = new List<SugarParameter>();
|
|
foreach (var col in list)
|
|
{
|
|
object paramValue = null;
|
|
|
|
switch (col.RelationType)
|
|
{
|
|
case 0://无关联
|
|
paramValue = dr[col.ColName].ToString();
|
|
await IsOnlyOne(col, sqlonly, dr[col.ColName].ToString(), entity.DbId);
|
|
break;
|
|
case 1://GUID
|
|
paramValue = Guid.NewGuid().ToString();
|
|
break;
|
|
case 2://数据字典
|
|
string dataItemName = "";
|
|
if (!dataItemMap.ContainsKey(col.DataItemCode))
|
|
{
|
|
List<SysDataItemDetail> dataItemList = (List<SysDataItemDetail>)await _dataItemDetailApp.Load(col.DataItemCode, "");
|
|
dataItemMap.Add(col.DataItemCode, dataItemList);
|
|
}
|
|
dataItemName = FindDataItemValue(dataItemMap[col.DataItemCode], dr[col.ColName].ToString(), col.ColName);
|
|
paramValue = dataItemName;
|
|
await IsOnlyOne(col, sqlonly, dataItemName, entity.DbId);
|
|
break;
|
|
case 3://数据表
|
|
string v = "";
|
|
try
|
|
{
|
|
//string queryJson = "{" + col.F_DSourceExcelId + ":\"" + dr[col.F_ColName].ToString() + "\"}";
|
|
if (!dataSourceMap.ContainsKey(col.DSourceId))
|
|
{
|
|
//DataTable sourceDt = await _dataSourceIBLL.GetDataTable(col.DSourceId);
|
|
DataTable sourceDt = new DataTable();
|
|
dataSourceMap.Add(col.DSourceId, sourceDt);
|
|
}
|
|
v = FindDataSourceValue(dataSourceMap[col.DSourceId], col.DSourceExcelId.ToLower(), dr[col.ColName].ToString(), col.DSourceDBId.ToLower());
|
|
paramValue = v;
|
|
}
|
|
catch (Exception)
|
|
{
|
|
throw (new Exception("【" + col.ColName + "】 找不到对应的数据"));
|
|
}
|
|
await IsOnlyOne(col, sqlonly, v, entity.DbId);
|
|
break;
|
|
case 4://固定值
|
|
paramValue = col.Value;
|
|
break;
|
|
case 5://操作人ID
|
|
paramValue = "";
|
|
break;
|
|
case 6://操作人名字
|
|
paramValue = "";
|
|
break;
|
|
case 7://操作时间
|
|
paramValue = DateTime.Now;
|
|
break;
|
|
}
|
|
|
|
dbParameters.Add(new SugarParameter(col.Name, paramValue));
|
|
}
|
|
|
|
//await excelImportService.BaseRepository(entity.DbId).ExecuteInsert(entity.DbTable, dbParameters);
|
|
_formSchemeApp.ExecuteInsert(entity.DbTable, dbParameters);
|
|
snum++;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
fnum++;
|
|
if (entity.ErrorType == 0)// 如果错误机制是终止
|
|
{
|
|
dr["导入错误"] = $"{ex.Message} 【之后数据未被导入】";
|
|
failDt.Rows.Add(dr.ItemArray);
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
dr["导入错误"] = ex.Message;
|
|
failDt.Rows.Add(dr.ItemArray);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return (failDt, snum, fnum);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 数据字典查找Value
|
|
/// </summary>
|
|
/// <param name="dataItemList">数据字典数据</param>
|
|
/// <param name="itemName">项目名</param>
|
|
/// <param name="colName">列名</param>
|
|
/// <returns></returns>
|
|
private string FindDataItemValue(List<SysDataItemDetail> dataItemList, string itemName, string colName)
|
|
{
|
|
SysDataItemDetail dataItem = dataItemList.Find(t => t.ItemName == itemName);
|
|
if (dataItem != null)
|
|
{
|
|
return dataItem.ItemValue;
|
|
}
|
|
else
|
|
{
|
|
throw (new Exception("【" + colName + "】数据字典找不到对应值"));
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 获取数据源数据
|
|
/// </summary>
|
|
/// <param name="dt">数据源</param>
|
|
/// <param name="name">名称</param>
|
|
/// <param name="value">值</param>
|
|
/// <param name="colname">列名</param>
|
|
/// <returns></returns>
|
|
private string FindDataSourceValue(DataTable dt, string name, string value, string colname)
|
|
{
|
|
|
|
foreach (DataRow dr in dt.Rows)
|
|
{
|
|
if (dr[name].ToString() == value)
|
|
{
|
|
return dr[colname].ToString();
|
|
}
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
/// <summary>
|
|
/// 判断是否数据有重复
|
|
/// </summary>
|
|
/// <param name="col"></param>
|
|
/// <param name="sqlonly"></param>
|
|
/// <param name="value"></param>
|
|
/// <param name="dbId"></param>
|
|
private async Task IsOnlyOne(ExcelImportFileds col, string sqlonly, string value, string dbId)
|
|
{
|
|
if (col.OnlyOne == 1)
|
|
{
|
|
var dp = new Dictionary<string, string>();
|
|
sqlonly += col.Name + " = @" + col.Name;
|
|
dp.Add(col.Name, value);
|
|
var d = await _formSchemeApp.FindTableNew(sqlonly, dp);
|
|
if (d.Count > 0)
|
|
{
|
|
throw new Exception("【" + col.ColName + "】此项数据不能重复");
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|