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.

703 lines
26 KiB
C#

5 months ago
using DocumentFormat.OpenXml.Spreadsheet;
using Infrastructure;
using Microsoft.Extensions.Configuration;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using OpenAuth.App.Base;
using OpenAuth.App.FormModule.Request;
using OpenAuth.App.Interface;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using SqlSugar;
using System.Linq.Expressions;
using System.Text;
using Castle.Core.Internal;
using DocumentFormat.OpenXml.Drawing.Charts;
using OpenAuth.App.BaseApp.Base;
namespace OpenAuth.App.FormModule
{
public class FormModuleApp : SqlSugarBaseApp<Repository.Domain.FormModuleEntity, SugarDbContext>
{
private IConfiguration _configuration;
public FormModuleApp(ISugarUnitOfWork<SugarDbContext> unitWork,
ISimpleClient<Repository.Domain.FormModuleEntity> repository, IAuth auth,
IConfiguration configuration) : base(unitWork, repository, auth)
{
_configuration = configuration;
}
#region 查询数据
/// <summary>
/// 模块获取分页列表
/// </summary>
/// <param name="keyword">筛选关键词</param>
/// <param name="pmoduleid">父级菜单</param>
/// <param name="pageindex">当前页</param>
/// <param name="pagesize">每页条数</param>
/// <returns></returns>
public async Task<Response<PageInfo<List<FormModuleEntity>>>> GetModulePageList(string keyword,
string pmoduleid, int pageindex, int pagesize)
{
//定义且实例化分页数据
RefAsync<int> totalCount = 0;
//PageModel page = new PageModel { PageIndex = pageindex, PageSize = pagesize, TotalCount = totalCount };
////筛选条件处理
//Expression<Func<FormModuleEntity, bool>> expression = PredicateBuilder.True<FormModuleEntity>(); ;
//if (!string.IsNullOrEmpty(keyword))
//{
// expression = expression.And(t => t.Code.Contains(keyword) || t.Name.Contains(keyword));
//}
//if (!string.IsNullOrEmpty(pmoduleid))
//{
// expression = expression.And(t => t.PmoduleId == pmoduleid);
//}
//多租户
//if (ConfigHelper.GetConfig().IsSass)
//{
// expression = expression.And(t => t.IsMain != 1);
//}
//数据查询并返回
var info = await this.Repository.AsQueryable()
.WhereIF(!string.IsNullOrEmpty(keyword), t => t.Code.Contains(keyword) || t.Name.Contains(keyword))
.WhereIF(!string.IsNullOrEmpty(pmoduleid), t => t.PmoduleId == pmoduleid)
.OrderByDescending(t => t.CreateDate)
.ToPageListAsync(pageindex, pagesize, totalCount);
return new Response<PageInfo<List<FormModuleEntity>>>
{
Result = new PageInfo<List<FormModuleEntity>>
{
Items = info,
Total = totalCount
}
};
}
/// <summary>
/// 获取列表
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<Response<List<FormModuleEntity>>> GetList()
{
var info = await this.Repository.GetListAsync(r => r.EnabledMark == 1);
return new Response<List<FormModuleEntity>>
{
Result = info
};
}
/// <summary>
/// 获取实体数据
/// </summary>
/// <param name="id">发布表单模板的idformmodule的id</param>
/// <returns></returns>
public async Task<Response<FormModuleEntity>> GetForm(string id)
{
var info = await this.Repository.GetByIdAsync(id);
return new Response<FormModuleEntity>
{
Result = info
};
}
/// <summary>
/// 根据菜单主键id获取实体数据
/// </summary>
/// <param name="id">菜单idSYSModule的id</param>
/// <returns></returns>
public async Task<Response<FormModuleEntity>> GetFormByModuleId(string id)
{
var info = await this.Repository.GetFirstAsync(r => r.ModuleId == id);
return new Response<FormModuleEntity>
{
Result = info
};
}
/// <summary>
/// 根据编号获取实体数据
/// </summary>
/// <param name="code">编号</param>
/// <returns></returns>
public async Task<Response<FormModuleEntity>> GetFormByCode(string code)
{
var info = await this.Repository.GetFirstAsync(r => r.Code == code);
return new Response<FormModuleEntity>
{
Result = info
};
}
/// <summary>
/// 获取设计数据
/// </summary>
/// <param name="code">编码</param>
/// <returns></returns>
public async Task<Response<FormModuleSchemeReq>> GetEntityByCode(string code)
{
var info = new FormModuleSchemeReq();
info.Entity = await this.Repository.GetFirstAsync(r => r.Code == code);
if (info.Entity != null)
{
info.FormScheme = await base.Repository
.ChangeRepository<SugarRepositiry<Repository.Domain.FormScheme>>()
.GetFirstAsync(r => r.Id == info.Entity.FormVerison);
}
return new Response<FormModuleSchemeReq>
{
Result = info
};
}
#endregion
#region 增删改
#region 添加
/// <summary>
/// 保存模块功能实体(新增、修改)(系统功能菜单,按钮,视图,表单四个表)
/// </summary>
/// <param name="keyValue">主键值</param>
/// <param name="module">实体</param>
/// <param name="moduleElement">按钮列表</param>
/// <param name="moduleColumn">视图列集合</param>
/// <param name="moduleForm">表单字段</param>
public async Task<Response<bool>> SaveEntity(string keyValue, FormModuleEntity entity, SysModule module,
List<SysModuleElement> moduleElement, List<SysModuleColumn> moduleColumn, List<SysModuleForm> moduleForm)
{
var mid = entity.ModuleId;
var oldModuleEntity = await this.Repository.AsSugarClient().Queryable<SysModule>().Where(r => r.Id == mid)
.FirstAsync();
if (oldModuleEntity == null)
{
module.Id = mid;
mid = string.Empty;
}
using (var uwo = base.UnitWork.CreateContext())
{
#region 添加系统菜单及下属菜单信息
#region 添加
if (string.IsNullOrEmpty(module.ParentId) || module.ParentId == "-1")
{
module.ParentId = "0";
}
if (string.IsNullOrEmpty(mid))
{
// 新增
if (string.IsNullOrEmpty(module.Id))
{
module.Id = Guid.NewGuid().ToString();
}
//module.F_CreateDate = DateTime.Now;
//module.F_CreateUserId = this.GetUserId();
//module.F_CreateUserName = this.GetUserName();
//module.F_DeleteMark = 0;
await uwo.SysModule.InsertAsync(module);
}
else
{
// 编辑
await uwo.SysModule.UpdateAsync(u => new SysModule
{
ParentId = module.ParentId,
IconName = module.IconName,
ParentName = module.ParentName,
SortNo = module.SortNo,
Encode = module.Encode,
IsSys = module.IsSys,
Code = module.Code,
Status = module.Status,
CascadeId = module.CascadeId,
Url = module.Url
}, u => u.Id == mid);
await uwo.SysModuleElement.DeleteAsync(t => t.ModuleId == mid);
await uwo.SysModuleColumn.DeleteAsync(t => t.ModuleId == mid);
await uwo.SysModuleForm.DeleteAsync(t => t.ModuleId == mid);
}
int num = 0;
if (moduleElement != null)
{
foreach (var item in moduleElement)
{
item.Sort = num;
item.ModuleId = module.Id;
//item.F_ModuleButtonId = Guid.NewGuid().ToString();
if (string.IsNullOrEmpty(item.Id))
{
item.Id = Guid.NewGuid().ToString();
}
await uwo.SysModuleElement.InsertAsync(item);
num++;
}
}
if (moduleColumn != null)
{
num = 0;
foreach (var item in moduleColumn)
{
item.SortCode = num;
item.ModuleId = module.Id;
//item.F_ModuleColumnId = Guid.NewGuid().ToString();
if (string.IsNullOrEmpty(item.ModuleColumnId))
{
item.ModuleColumnId = Guid.NewGuid().ToString();
}
await uwo.SysModuleColumn.InsertAsync(item);
num++;
}
}
if (moduleForm != null)
{
num = 0;
foreach (var item in moduleForm)
{
item.SortCode = num;
item.ModuleId = module.Id;
//item.F_ModuleFormId = Guid.NewGuid().ToString();
if (string.IsNullOrEmpty(item.ModuleFormId))
{
item.ModuleFormId = Guid.NewGuid().ToString();
}
await uwo.SysModuleForm.InsertAsync(item);
num++;
}
}
#endregion
#region 权限
if (!string.IsNullOrEmpty(entity.ModuleId))
{
var objectList = await this.Repository.AsSugarClient().Queryable<SysModuleElement>()
.Where(r => r.ModuleId == entity.ModuleId).ToListAsync();
List<string> buttonList = new List<string>();
List<string> columnList = new List<string>();
List<string> formList = new List<string>();
if (moduleElement != null)
{
foreach (var item in moduleElement)
{
buttonList.Add(item.Id);
}
}
if (moduleColumn != null)
{
foreach (var item in moduleColumn)
{
columnList.Add(item.ModuleColumnId);
}
}
if (moduleForm != null)
{
foreach (var item in moduleForm)
{
formList.Add(item.ModuleFormId);
}
}
if (buttonList.Count == 0)
{
await uwo.SysRoleElement.DeleteAsync(r => objectList.Select(r => r.Id).Contains(r.ElementId));
}
else
{
await uwo.SysRoleElement.DeleteAsync(r => !buttonList.Contains(r.ElementId));
}
if (columnList.Count == 0)
{
//await moduleService.BaseRepository().Delete<AuthorizeEntity>(t => t.F_ItemType == 3 && t.F_ParentId == moduleEntity.F_ModuleId);
}
else
{
await uwo.SysRoleElement.DeleteAsync(r => !buttonList.Contains(r.ElementId));
}
if (formList.Count == 0)
{
//await moduleService.BaseRepository().Delete<AuthorizeEntity>(t => t.F_ItemType == 4 && t.F_ParentId == moduleEntity.F_ModuleId);
}
else
{
await uwo.SysRoleElement.DeleteAsync(r => !buttonList.Contains(r.ElementId));
}
}
#endregion
#endregion
#region 表单发布模板信息添加
entity.ModuleId = module.Id;
if (string.IsNullOrEmpty(keyValue))
{
var user = _auth.GetCurrentUser().User;
entity.Id = Guid.NewGuid().ToString();
entity.CreateDate = DateTime.Now;
entity.CreateUserId = user.Id.ToString();
entity.CreateUserName = user.Name;
await uwo.FormModuleEntity.InsertAsync(entity);
}
else
{
//编辑
var user = _auth.GetCurrentUser().User;
entity.Id = keyValue;
entity.ModifyDate = DateTime.Now;
entity.ModifyUserId = user.Id.ToString();
entity.ModifyUserName = user.Name;
await uwo.FormModuleEntity.UpdateAsync(entity);
}
#endregion
var flag = uwo.Commit();
return new Response<bool>
{
Result = flag,
Message = flag == true ? "操作成功" : "操作失败"
};
}
}
/// <summary>
/// 更新状态
/// </summary>
/// <param name="keyValue">主键</param>
/// <param name="state">状态</param>
/// <returns></returns>
public async Task<Response<bool>> UpdateState(string keyValue, int state)
{
var entity = await this.Repository.GetByIdAsync(keyValue);
if (entity != null)
{
using (var uwo = UnitWork.CreateContext())
{
await uwo.FormModuleEntity.UpdateAsync(r => new FormModuleEntity
{
EnabledMark = state
}, r => r.Id == keyValue);
await uwo.SysModule.UpdateAsync(r => new SysModule
{
Status = state
}, r => r.Id == keyValue);
var flag = uwo.Commit();
return new Response<bool>
{
Result = flag,
Message = flag == true ? "操作成功" : "操作失败"
};
}
}
else
{
return new Response<bool>
{
Result = false,
Message = "数据丢失"
};
}
}
public async Task<Response<bool>> DeleteForm(string keyValue)
{
var entity = await this.Repository.GetByIdAsync(keyValue);
if (entity != null)
{
using (var uwo = UnitWork.CreateContext())
{
await uwo.FormModuleEntity.DeleteByIdAsync(keyValue);
await uwo.SysModule.DeleteByIdAsync(entity.ModuleId);
await uwo.SysModuleColumn.DeleteAsync(r => r.ModuleId == entity.ModuleId);
await uwo.SysModuleElement.DeleteAsync(r => r.ModuleId == entity.ModuleId);
await uwo.SysModuleForm.DeleteAsync(r => r.ModuleId == entity.ModuleId);
var flag = uwo.Commit();
return new Response<bool>
{
Result = flag,
Message = flag == true ? "操作成功" : "操作失败"
};
}
}
else
{
return new Response<bool>
{
Result = false,
Message = "数据不存在"
};
}
}
/// <summary>
/// 根据菜单主键id删除表单发布模板信息
/// </summary>
/// <param name="keyValue">菜单idSysmodule的主键</param>
public async Task<Response<bool>> DeleteEntityByModuleId(string keyValue)
{
using (var uwo = UnitWork.CreateContext())
{
await uwo.FormModuleEntity.DeleteAsync(r => r.ModuleId == keyValue);
await uwo.SysModule.DeleteByIdAsync(keyValue);
await uwo.SysModuleColumn.DeleteAsync(r => r.ModuleId == keyValue);
await uwo.SysModuleElement.DeleteAsync(r => r.ModuleId == keyValue);
await uwo.SysModuleForm.DeleteAsync(r => r.ModuleId == keyValue);
var flag = uwo.Commit();
return new Response<bool>
{
Result = flag,
Message = flag == true ? "操作成功" : "操作失败"
};
}
}
#endregion
#endregion
#region 扩展方法
/// <summary>
/// 判断数据表字段重复
/// </summary>
/// <param name="keyValue">主键值</param>
/// <param name="tableName">表名</param>
/// <param name="keyName">主键名</param>
/// <param name="filedsJson">数据字段</param>
/// <returns></returns>
public async Task<Response<bool>> ExistFiled(string keyValue, string tableName, string keyName,
string filedsJson)
{
StringBuilder strSql = new StringBuilder();
var tableNameList = tableName.Split(".");
var dbCode = string.Empty;
if (tableNameList.Length == 2)
{
dbCode = tableNameList[0];
tableName = tableNameList[1];
}
strSql.Append("select * from " + tableName + " t where 1=1 ");
if (!string.IsNullOrEmpty(keyValue))
{
strSql.Append(" AND \"" + keyName + "\" !=\'" + keyValue + "\'");
}
var args = filedsJson.ToJObject();
foreach (var item in args.Properties())
{
if (!string.IsNullOrEmpty(item.Value.ToString()))
{
strSql.Append(" AND \"" + item.Name + "\" = '" + item.Value + "'");
}
}
var dt = await this.Repository.AsSugarClient().SqlQueryable<dynamic>(strSql.ToString()).ToListAsync();
if (dt.Count == 0)
{
return new Response<bool>
{
Result = true
};
}
else
{
return new Response<bool>
{
Result = false,
Message = "字段重复"
};
}
}
#endregion
#region 获取数据库数据列表
/// <summary>
/// 数据表列表
/// </summary>
/// <param name="code">数据库编码</param>
/// <param name="isCache">是否读取存储区</param>
/// <returns></returns>
public Response<List<DbTableInfo>> GetTableList(string code, string key, bool isCache = false)
{
using (var db = this.CodeClient(code, _configuration))
{
var list = db.DbMaintenance.GetTableInfoList(isCache);
//var list = db.DbMaintenance.GetTableInfoList((dbtype, sql) =>
//{
// if (dbtype == SqlSugar.DbType.Kdbndp)
// {
// return sql.Replace(@"where relkind = 'r' and c.oid > 16384 and c.relnamespace != 99 and c.relname not like '%pl_profiler_saved%' order by relname", @" INNER JOIN PG_NAMESPACE AS n ON c.relnamespace = n.oid where relkind = 'r' and c.oid > 16384 and c.relnamespace != 99 and c.relname not like '%pl_profiler_saved%' and n.nspname = 'public' order by relname");
// }
// return sql;
//});
var info = list.FindAll(t =>
t.DbObjectType == DbObjectType.Table && t.Name.ToLower() != "lr_db_codecolumns" &&
t.Name.ToLower() != "lr_db_codetable" && t.Name.ToLower() != "lr_db_history")
.WhereIF(!key.IsNullOrEmpty(), t => t.Name.ToLower().Contains(key.ToLower())).ToList();
return new Response<List<DbTableInfo>>
{
Result = info
};
}
}
#endregion
#region 导出
public Response<MemoryStream> ListToExcel(System.Data.DataTable list, List<ModuleColumn> headers)
{
Response<MemoryStream> response = new Response<MemoryStream>();
try
{
HSSFWorkbook workbook = new HSSFWorkbook();
#region 内容样式
IFont font1 = workbook.CreateFont(); //创建一个字体样式对象
font1.FontName = "Microsoft YaHei"; //和excel里面的字体对应
//font1.Boldweight = short.MaxValue;//字体加粗
font1.FontHeightInPoints = 12; //字体大小
ICellStyle style = workbook.CreateCellStyle(); //创建样式对象
style.BorderBottom = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
style.VerticalAlignment = VerticalAlignment.Center;
style.SetFont(font1); //将字体样式赋给样式对象
style.WrapText = true;
#endregion
#region 标题样式
IFont font = workbook.CreateFont(); //创建一个字体样式对象
font.FontName = "Microsoft YaHei"; //和excel里面的字体对应
font.Boldweight = (short)FontBoldWeight.Bold; //字体加粗
font.FontHeightInPoints = 12; //字体大小
ICellStyle style1 = workbook.CreateCellStyle(); //创建样式对象
style1.BorderBottom = BorderStyle.Thin;
style1.BorderLeft = BorderStyle.Thin;
style1.BorderRight = BorderStyle.Thin;
style1.BorderTop = BorderStyle.Thin;
style1.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
style1.VerticalAlignment = VerticalAlignment.Center;
style1.SetFont(font); //将字体样式赋给样式对象
#endregion
#region 创建表头
int m = list.Rows.Count / 60000+1;
for (int k = 0; k < m; k++)
{
ISheet sheet = workbook.CreateSheet("Sheet"+k.ToString());
IRow rowHeader = sheet.CreateRow(0);
rowHeader.Height = 20 * 30;
for (int i = 0; i < headers.Count; i++)
{
ModuleColumn header = headers[i];
rowHeader.CreateCell(i);
rowHeader.Cells[i].CellStyle = style1;
rowHeader.Cells[i].SetCellValue(header.value);
sheet.SetColumnWidth(i, 20 * 350);
}
#endregion
#region 填充数据
var val = (k + 1) * 60000;
var num = 60000;
if (val > list.Rows.Count)
{
num=list.Rows.Count-k*60000;
}
for (int i = 0; i < num; i++) //循环数据
{
var item = list.Rows[k*60000+i]; //获取数据
IRow dataRow = sheet.CreateRow(i + 1); //创建行
for (int j = 0; j < headers.Count; j++) //循环表头
{
//数据处理
var objValue = "";
if (list.Columns.Contains(headers[j].key))
{
objValue = item[headers[j].key].ToString();
}
else
{
objValue = "";
}
//创建单元格
dataRow.CreateCell(j);
dataRow.Cells[j].CellStyle = style; //添加单元格样式
if (objValue != null && !string.IsNullOrEmpty(objValue.ToString()))
{
dataRow.Cells[j].SetCellValue(objValue.ToString()); //填充Excel单元格
}
else
{
dataRow.Cells[j].SetCellValue(""); //填充Excel单元格
}
}
}
}
#endregion
response.Result = new MemoryStream();
workbook.Write(response.Result);
workbook = null;
response.Result.Close();
response.Result.Dispose();
response.Code = 200;
response.Message = "获取成功";
}
catch (Exception ex)
{
response.Code = 500;
response.Message = ex.Message;
}
return response;
}
#endregion
}
public class ModuleColumn
{
public string key { get; set; }
public string value { get; set; }
}
}