From e9eb2968323aff12ae027bcc1009bbdc8c82a809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=BE=8E=E8=8D=A3?= <10755671+mei-rong-he@user.noreply.gitee.com> Date: Mon, 9 Mar 2026 09:40:59 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=8A=A5=E8=A1=A82=E3=80=81=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E5=BA=93=E5=AF=BC=E5=85=A5=E9=9B=86=E5=9B=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entities/SK/T_SK_BASIC_LIBRARY.cs | 49 ++-- .../BIStatiscialAnalysisController.cs | 4 + .../APT.SK.WebApi/App_Start/DIConfig.cs | 5 +- .../Controllers/Api/BasicLibraryController.cs | 268 +++++++++++++++++- .../Controllers/Api/CrossDbContext.cs | 73 +++++ 5 files changed, 374 insertions(+), 25 deletions(-) create mode 100644 APT.MicroApi/APT.SK.WebApi/Controllers/Api/CrossDbContext.cs diff --git a/APT.MS.Domain/Entities/SK/T_SK_BASIC_LIBRARY.cs b/APT.MS.Domain/Entities/SK/T_SK_BASIC_LIBRARY.cs index ab87e4b..6b9a9c8 100644 --- a/APT.MS.Domain/Entities/SK/T_SK_BASIC_LIBRARY.cs +++ b/APT.MS.Domain/Entities/SK/T_SK_BASIC_LIBRARY.cs @@ -6,6 +6,7 @@ using APT.MS.Domain.Enums.SK; using System; using System.Collections.Generic; using System.ComponentModel; +using System.ComponentModel.DataAnnotations.Schema; using System.Text; namespace APT.MS.Domain.Entities.SK @@ -26,7 +27,8 @@ namespace APT.MS.Domain.Entities.SK [Description("生产单元")] [DataFieldForeignKey("Nav_ProductionUnit")] public Guid? PRODUCTION_UNIT_ID { get; set; } - [Description("导航属性:生产单元")] + [Description("导航属性:生产单元")] + [NotMapped] public T_FM_USER_PRODUCTION_UNIT_SET Nav_ProductionUnit { get; set; } /// /// 辨识区域 @@ -39,7 +41,8 @@ namespace APT.MS.Domain.Entities.SK /// /// 导航属性:辨识区域 /// - [Description("导航属性:辨识区域")] + [Description("导航属性:辨识区域")] + [NotMapped] public T_SK_RISK_AREA Nav_Area { get; set; } /// /// 风险名称 @@ -63,7 +66,8 @@ namespace APT.MS.Domain.Entities.SK /// /// 导航属性:风险类别 /// - [Description("导航属性:风险类别")] + [Description("导航属性:风险类别")] + [NotMapped] public T_SK_RISK_TYPE Nav_Type { get; set; } [Description("风险评价L")] @@ -104,13 +108,15 @@ namespace APT.MS.Domain.Entities.SK public Guid? RISK_NAME_ID { get; set; } - [Description("导航属性:风险名称")] + [Description("导航属性:风险名称")] + [NotMapped] public T_SK_RISK_NAME Nav_RiskName { get; set; } /// /// 导航属性:管控措施 /// [Description("管控措施")] - [FormFieldEdit] + [FormFieldEdit] + [NotMapped] public ICollection Nav_Details { get; set; } [Description("是否有效")] @@ -127,37 +133,46 @@ namespace APT.MS.Domain.Entities.SK public string TYPE_NAME { get; set; } [Description("是否同步企业库")] - [DataFieldIngore] + [DataFieldIngore] + [NotMapped] public string PUBLISH { get; set; } [Description("管控措施")] - [DataFieldIngore] + [DataFieldIngore] + [NotMapped] public string MEASURE { get; set; } [Description("检查内容")] - [DataFieldIngore] + [DataFieldIngore] + [NotMapped] public string CHECKCONTENTS { get; set; } [Description("检查依据")] - [DataFieldIngore] + [DataFieldIngore] + [NotMapped] public string CHECKBASICS { get; set; } [Description("检查标准")] - [DataFieldIngore] + [DataFieldIngore] + [NotMapped] public string CHECKSTANDARDS { get; set; } [Description("隐患描述")] - [DataFieldIngore] + [DataFieldIngore] + [NotMapped] public string HIDDENSCRIPTION { get; set; } [Description("隐患等级")] - [DataFieldIngore] + [DataFieldIngore] + [NotMapped] public string HIDDENLEVEL { get; set; } [Description("整改措施")] - [DataFieldIngore] + [DataFieldIngore] + [NotMapped] public string RECIFYMEASURE { get; set; } [Description("分值L")] [DataFieldForeignKey("Nav_SCOREL")] public Guid? SCOREL_ID { get; set; } - [Description("导航属性:分值L")] + [Description("导航属性:分值L")] + [NotMapped] public T_SK_SCOREL Nav_SCOREL { get; set; } [Description("分值E")] @@ -165,7 +180,8 @@ namespace APT.MS.Domain.Entities.SK public Guid? SCOREE_ID { get; set; } - [Description("导航属性:分值E")] + [Description("导航属性:分值E")] + [NotMapped] public T_SK_SCOREE Nav_SCOREE { get; set; } [Description("分值C")] @@ -173,7 +189,8 @@ namespace APT.MS.Domain.Entities.SK public Guid? SCOREC_ID { get; set; } - [Description("导航属性:分值C")] + [Description("导航属性:分值C")] + [NotMapped] public T_SK_SCOREC Nav_SCOREC { get; set; } } } diff --git a/APT.MicroApi/APT.SC.WebApi/Controllers/Api/BIController/BIStatiscialAnalysisController.cs b/APT.MicroApi/APT.SC.WebApi/Controllers/Api/BIController/BIStatiscialAnalysisController.cs index 3ad58cb..485ed93 100644 --- a/APT.MicroApi/APT.SC.WebApi/Controllers/Api/BIController/BIStatiscialAnalysisController.cs +++ b/APT.MicroApi/APT.SC.WebApi/Controllers/Api/BIController/BIStatiscialAnalysisController.cs @@ -11230,6 +11230,10 @@ namespace APT.SC.WebApi.Controllers.Api.BIController USER_NAME = item["USER_NAME"] != null ? item["USER_NAME"].ToString() : null }); } + if (!string.IsNullOrEmpty(filter.Keyword)) + { + listAddNew = listAddNew.Where(t => t.COMPANY_NAME == filter.Keyword).ToList(); + } var taskGroup = listAddNew.GroupBy(t => new { t.COMPANY_NAME, t.MOULD_NAME, t.FORM_NAME }).ToList(); if (taskGroup != null && taskGroup.Any()) { diff --git a/APT.MicroApi/APT.SK.WebApi/App_Start/DIConfig.cs b/APT.MicroApi/APT.SK.WebApi/App_Start/DIConfig.cs index 0fce052..4fb01e8 100644 --- a/APT.MicroApi/APT.SK.WebApi/App_Start/DIConfig.cs +++ b/APT.MicroApi/APT.SK.WebApi/App_Start/DIConfig.cs @@ -3,12 +3,14 @@ using APT.BaseData.Domain.IServices.BD; using APT.BaseData.Domain.IServices.BS; using APT.BaseData.Domain.IServices.EX; using APT.BaseData.Domain.IServices.FM; +using APT.BaseData.Domain.IServices.OP; using APT.BaseData.Domain.IServices.Platform; using APT.BaseData.Services.DomainServices; using APT.BaseData.Services.Services.BD; using APT.BaseData.Services.Services.BS; using APT.BaseData.Services.Services.EX; using APT.BaseData.Services.Services.FM; +using APT.BaseData.Services.Services.OP; using APT.BaseData.Services.Services.Platform; using APT.BaseData.Services.Sys; using Autofac; @@ -56,7 +58,8 @@ namespace APT.SK.WebApi.App_Start builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); } } } diff --git a/APT.MicroApi/APT.SK.WebApi/Controllers/Api/BasicLibraryController.cs b/APT.MicroApi/APT.SK.WebApi/Controllers/Api/BasicLibraryController.cs index 65e23ee..67f4ab1 100644 --- a/APT.MicroApi/APT.SK.WebApi/Controllers/Api/BasicLibraryController.cs +++ b/APT.MicroApi/APT.SK.WebApi/Controllers/Api/BasicLibraryController.cs @@ -1,21 +1,31 @@ -using APT.BaseData.Domain.Entities.FM; +using APT.BaseData.Domain.ApiModel; using APT.BaseData.Domain.Entities; +using APT.BaseData.Domain.Entities.FM; using APT.BaseData.Domain.Enums; +using APT.BaseData.Domain.Enums.PF; +using APT.BaseData.Domain.IServices.OP; +using APT.BaseData.Services.DomainServices; using APT.BaseData.Services.Services.FM; +using APT.BaseData.Services.Services.OP; +using APT.Infrastructure.Api; using APT.Infrastructure.Core; using APT.MS.Domain.Entities.FO; using APT.MS.Domain.Entities.SK; using APT.MS.Domain.Enums; +using APT.MS.Domain.Enums.SK; +using APT.SK.WebApi.Controllers.Api; using APT.Utility; using Microsoft.AspNetCore.Mvc; -using APT.BaseData.Domain.Enums.PF; -using APT.BaseData.Services.DomainServices; +using Microsoft.Data.SqlClient; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Internal; using MySqlX.XDevAPI.Common; -using System.Security.Policy; -using System.Collections.Generic; -using System.Linq; +using NPOI.SS.Formula.PTG; using System; -using APT.MS.Domain.Enums.SK; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Security.Policy; namespace APT.SK.WebApi.Controllers { @@ -24,7 +34,12 @@ namespace APT.SK.WebApi.Controllers /// [Route("api/SK/SKBasicLibrary")] public partial class BasicLibraryController : AuthorizeApiController - { + { + IOPTenantDBConnService OPTenantDBConnService { get; set; } + public BasicLibraryController(IOPTenantDBConnService opTenantDBConnService) + { + OPTenantDBConnService = opTenantDBConnService; + } /// /// 保存 /// @@ -564,6 +579,243 @@ namespace APT.SK.WebApi.Controllers } return result; }); + } + + /// + /// 获取集团基础库 + /// + /// 过滤实体 + /// + + [HttpPost, Route("JTOrderEntities")] + public JsonActionResult> JTOrderEntities([FromBody] KeywordFilter filter) + { + var result = new JsonActionResult>(); + string strConn = OPTenantDBConnService.GetConnByORGID(filter.OrgId.Value); + string name = "mh_jy_head"; + if (!string.IsNullOrEmpty(strConn)) + { + // 找左边字符串结束位置 + int start = strConn.IndexOf("Database="); + if (start != -1) { + start += "Database=".Length; + } + // 找右边字符串开始位置 + int end = strConn.IndexOf(";uid", start); + if (end != -1) + { + // 截取中间 + name = strConn.Substring(start, end - start); + } + } + // 2. 传入构造函数 + using var db = new CrossDbContext(strConn); + + // 3. 要跨哪些库?自己定义,指定总部 + var dbNames = new List(); + //{ + // "mh_jy_head", + //}; + dbNames.Add(name); + result.Data = db.QueryCrossDatabases(dbNames).ToList(); + //DataTable library = new DataTable(); + //using (SqlConnection connection = new SqlConnection(strConn)) + //{ + // try + // { + // connection.Open(); + // //风险等级占比 + // string sqlRisk = "select * from T_SK_BASIC_LIBRARY "; + // SqlCommand comRisk = new SqlCommand(sqlRisk, connection); + // SqlDataAdapter riskData = new SqlDataAdapter(comRisk); + // riskData.Fill(library); + // connection.Close(); + // } + // catch (Exception ex) + // { + // if (!string.IsNullOrEmpty(ex.StackTrace)) + // throw new Exception("错误日志:[StackTrace]" + ex.StackTrace); + // else + // throw new Exception("【" + HttpContext.Request.Path + "】错误日志:[Message]" + ex.Message); + // } + //} + + if (result != null && result.Data != null) + { + if (result.Data != null && result.Data.Any()) + { + foreach (var item in result.Data) + { + var detailStr = new List(); + var contentStr = new List(); + var basicStr = new List(); + var standardStr = new List(); + var scripStr = new List(); + var levelStr = new List(); + var measureStr = new List(); + if (item.Nav_Details != null && item.Nav_Details.Any()) + { + foreach (var item2 in item.Nav_Details.OrderBy(t => t.NUM)) + { + //var i = 1; + if (item2 != null && !string.IsNullOrEmpty(item2.MEASURES_NAME)) + { + detailStr.Add(item2.MEASURES_NAME); + var temp = item2.NUM + "、" + item2.MEASURES_NAME + Environment.NewLine; + item.MINE_NAME = item.MINE_NAME + temp; + item.MEASURE = item.MEASURE + temp; + //i++; + } + if (item2 != null && item2.Nav_DetailContents != null && item2.Nav_DetailContents.Any()) + { + foreach (var item3 in item2.Nav_DetailContents.OrderBy(t => t.NUM)) + { + if (item3 != null) + { + if (item3.Nav_Contents != null && !string.IsNullOrEmpty(item3.Nav_Contents.CHECKCONTENT)) + { + contentStr.Add(item3.Nav_Contents.CHECKCONTENT); + } + if (!string.IsNullOrEmpty(item3.CHECK_STANDARD)) + { + standardStr.Add(item3.CHECK_STANDARD); + } + if (item3.Nav_DetailBasics != null && item3.Nav_DetailBasics.Any()) + { + foreach (var item4 in item3.Nav_DetailBasics) + { + if (item4 != null && item4.Nav_Law != null && !string.IsNullOrEmpty(item4.Nav_Law.NAME)) + { + basicStr.Add(item4.Nav_Law.NAME); + } + } + } + if (item3.Nav_DetailHiddens != null && item3.Nav_DetailHiddens.Any()) + { + foreach (var item4 in item3.Nav_DetailHiddens.OrderBy(t => t.NUM)) + { + if (item4 != null) + { + if (item4.Nav_Question != null && !string.IsNullOrEmpty(item4.Nav_Question.DESCREPTION)) + { + scripStr.Add(item4.Nav_Question.DESCREPTION); + } + levelStr.Add(item4.HIDDEN_LEVEL.GetDescription()); + if (!string.IsNullOrEmpty(item4.RECTIFICATION_MEASURES)) + { + measureStr.Add(item4.RECTIFICATION_MEASURES); + } + } + } + } + } + } + } + } + } + //if (detailStr.Any()) + //{ + // detailStr = detailStr.Distinct().ToList(); + // var i = 1; + // foreach (var item2 in detailStr) + // { + // if (!string.IsNullOrEmpty(item2)) + // { + // var temp = i + "、" + item2 + "\r\n"; + // item.MEASURE = item.MEASURE + temp; + // i++; + // } + // } + //} + if (contentStr.Any()) + { + contentStr = contentStr.Distinct().ToList(); + var i = 1; + foreach (var item2 in contentStr) + { + if (!string.IsNullOrEmpty(item2)) + { + var temp = i + "、" + item2 + "\r\n"; + item.CHECKCONTENTS = item.CHECKCONTENTS + temp; + i++; + } + } + } + if (basicStr.Any()) + { + basicStr = basicStr.Distinct().ToList(); + var i = 1; + foreach (var item2 in basicStr) + { + if (!string.IsNullOrEmpty(item2)) + { + var temp = i + "、" + item2 + "\r\n"; + item.CHECKBASICS = item.CHECKBASICS + temp; + i++; + } + } + } + if (standardStr.Any()) + { + standardStr = standardStr.Distinct().ToList(); + var i = 1; + foreach (var item2 in standardStr) + { + if (!string.IsNullOrEmpty(item2)) + { + var temp = i + "、" + item2 + "\r\n"; + item.CHECKSTANDARDS = item.CHECKSTANDARDS + temp; + i++; + } + } + } + if (scripStr.Any()) + { + scripStr = scripStr.Distinct().ToList(); + var i = 1; + foreach (var item2 in scripStr) + { + if (!string.IsNullOrEmpty(item2)) + { + var temp = i + "、" + item2 + "\r\n"; + item.HIDDENSCRIPTION = item.HIDDENSCRIPTION + temp; + i++; + } + } + } + if (levelStr.Any()) + { + levelStr = levelStr.Distinct().ToList(); + var i = 1; + foreach (var item2 in levelStr) + { + if (!string.IsNullOrEmpty(item2)) + { + var temp = i + "、" + item2 + "\r\n"; + item.HIDDENLEVEL = item.HIDDENLEVEL + temp; + i++; + } + } + } + if (measureStr.Any()) + { + measureStr = measureStr.Distinct().ToList(); + var i = 1; + foreach (var item2 in measureStr) + { + if (!string.IsNullOrEmpty(item2)) + { + var temp = i + "、" + item2 + "\r\n"; + item.RECIFYMEASURE = item.RECIFYMEASURE + temp; + i++; + } + } + } + } + result.Data.OrderBy(t => t.AREA_ID); + } + } + return result; } } } diff --git a/APT.MicroApi/APT.SK.WebApi/Controllers/Api/CrossDbContext.cs b/APT.MicroApi/APT.SK.WebApi/Controllers/Api/CrossDbContext.cs new file mode 100644 index 0000000..e80b500 --- /dev/null +++ b/APT.MicroApi/APT.SK.WebApi/Controllers/Api/CrossDbContext.cs @@ -0,0 +1,73 @@ +using APT.BaseData.Domain.ApiModel; +using APT.BaseData.Domain.ApiModel.PF; +using APT.BaseData.Domain.Entities.FM; +using APT.BaseData.Domain.IServices.OP; +using APT.MS.Domain.Entities.SK; +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace APT.SK.WebApi.Controllers.Api +{ + public class CrossDbContext : DbContext + { + public DbSet T_SK_BASIC_LIBRARY { get; set; } + // 动态连接字符串(外部传入) + private readonly string _connString; + + // 构造函数:动态接收连接字符串 + public CrossDbContext(string connString) + { + _connString = connString; + } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + // 使用动态的连接字符串 + optionsBuilder.UseSqlServer(_connString); + } + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + // 必须把你的实体配置进去,EF才认识它 + modelBuilder.Entity() + .Ignore(x => x.Nav_Org) + .Ignore(x => x.DbConn) + .Ignore(x => x.TaskID); + //modelBuilder.Entity() + // .Ignore(x => x.departmentCheckedKeys); + } + /// + /// 跨库查询:同服务器,多个库 + /// + /// 库名列表 + /// 跨库合并结果 + public IQueryable QueryCrossDatabases(List databaseNames) + { + IQueryable? query = null; + + foreach (var dbName in databaseNames) + { + // 核心:动态拼接 库名.dbo.表名 + string sql = $"SELECT * FROM {dbName}.dbo.T_SK_BASIC_LIBRARY"; + var dbSet = this.Set().FromSqlRaw(sql); + query = dbSet; + //query = query == null ? dbSet : query.UnionAll(dbSet); + } + + return query ?? Enumerable.Empty().AsQueryable(); + } + /// + /// 跨库查询:同服务器,多个库,静态数据库连接时直接给库名称 + /// + /// 跨库合并结果 + // ========== 查询方法:直接跨库合并 ========== + public IQueryable GetAllUserInfos() + { + // 查询库B(关键:直接修改表名,同服务器跨库) + var dbBUsers = this.Set() + .FromSqlRaw("SELECT * FROM mh_jy_head.dbo.T_SK_BASIC_LIBRARY"); + + return dbBUsers; + } + } +}