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 { private IConfiguration _configuration; public FormModuleApp(ISugarUnitOfWork unitWork, ISimpleClient repository, IAuth auth, IConfiguration configuration) : base(unitWork, repository, auth) { _configuration = configuration; } #region 查询数据 /// /// 模块获取分页列表 /// /// 筛选关键词 /// 父级菜单 /// 当前页 /// 每页条数 /// public async Task>>> GetModulePageList(string keyword, string pmoduleid, int pageindex, int pagesize) { //定义且实例化分页数据 RefAsync totalCount = 0; //PageModel page = new PageModel { PageIndex = pageindex, PageSize = pagesize, TotalCount = totalCount }; ////筛选条件处理 //Expression> expression = PredicateBuilder.True(); ; //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>> { Result = new PageInfo> { Items = info, Total = totalCount } }; } /// /// 获取列表 /// /// /// public async Task>> GetList() { var info = await this.Repository.GetListAsync(r => r.EnabledMark == 1); return new Response> { Result = info }; } /// /// 获取实体数据 /// /// 发布表单模板的id(formmodule的id) /// public async Task> GetForm(string id) { var info = await this.Repository.GetByIdAsync(id); return new Response { Result = info }; } /// /// 根据菜单主键id获取实体数据 /// /// 菜单id(SYSModule的id) /// public async Task> GetFormByModuleId(string id) { var info = await this.Repository.GetFirstAsync(r => r.ModuleId == id); return new Response { Result = info }; } /// /// 根据编号获取实体数据 /// /// 编号 /// public async Task> GetFormByCode(string code) { var info = await this.Repository.GetFirstAsync(r => r.Code == code); return new Response { Result = info }; } /// /// 获取设计数据 /// /// 编码 /// public async Task> 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>() .GetFirstAsync(r => r.Id == info.Entity.FormVerison); } return new Response { Result = info }; } #endregion #region 增删改 #region 添加 /// /// 保存模块功能实体(新增、修改)(系统功能菜单,按钮,视图,表单四个表) /// /// 主键值 /// 实体 /// 按钮列表 /// 视图列集合 /// 表单字段 public async Task> SaveEntity(string keyValue, FormModuleEntity entity, SysModule module, List moduleElement, List moduleColumn, List moduleForm) { var mid = entity.ModuleId; var oldModuleEntity = await this.Repository.AsSugarClient().Queryable().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() .Where(r => r.ModuleId == entity.ModuleId).ToListAsync(); List buttonList = new List(); List columnList = new List(); List formList = new List(); 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(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(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 { Result = flag, Message = flag == true ? "操作成功" : "操作失败" }; } } /// /// 更新状态 /// /// 主键 /// 状态 /// public async Task> 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 { Result = flag, Message = flag == true ? "操作成功" : "操作失败" }; } } else { return new Response { Result = false, Message = "数据丢失" }; } } public async Task> 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 { Result = flag, Message = flag == true ? "操作成功" : "操作失败" }; } } else { return new Response { Result = false, Message = "数据不存在" }; } } /// /// 根据菜单主键id删除表单发布模板信息 /// /// 菜单id(Sysmodule的主键) public async Task> 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 { Result = flag, Message = flag == true ? "操作成功" : "操作失败" }; } } #endregion #endregion #region 扩展方法 /// /// 判断数据表字段重复 /// /// 主键值 /// 表名 /// 主键名 /// 数据字段 /// public async Task> 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(strSql.ToString()).ToListAsync(); if (dt.Count == 0) { return new Response { Result = true }; } else { return new Response { Result = false, Message = "字段重复" }; } } #endregion #region 获取数据库数据列表 /// /// 数据表列表 /// /// 数据库编码 /// 是否读取存储区 /// public Response> 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> { Result = info }; } } #endregion #region 导出 public Response ListToExcel(System.Data.DataTable list, List headers) { Response response = new Response(); 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; } } }