usingHh.Mes.Common.log;usingHh.Mes.Common.Request;usingHh.Mes.POJO.Entity;usingHh.Mes.POJO.Response;usingHh.Mes.POJO.ViewModel;usingHh.Mes.POJO.WebEntity.tool;usingHh.Mes.Service.Repository;usingHh.Mes.Service.WebService.Base;usingHh.Mes.T4;usingSqlSugar;usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.Globalization;usingSystem.IO;usingSystem.Linq;usingSystem.Text.RegularExpressions;usingDbType=SqlSugar.DbType;namespaceHh.Mes.Service.WebService.Tool{publicclassCodeGeneratorService:RepositorySqlSugar<base_Entity>{privatereadonlyDbTypedbType;privatereadonlySysModuleService_moduleService;publicCodeGeneratorService(SysModuleServicemoduleService){dbType=Context.CurrentConnectionConfig.DbType;_moduleService=moduleService;}publicdynamicLoad(PageReqpageReq,TableInfoentity){returnExceptionsHelp.Instance.ExecuteT(()=>{vardata=GetAllTableDescription(entity.TableCode,entity.TableName);varresult=newResponse<List<TableInfo>>(){Result=data.Skip(pageReq.limit*(pageReq.page-1)).Take(pageReq.limit).ToList(),Count=data.Count()};returnresult;},catchRetrunValue:"list");}///<summary>///获取代码///</summary>///<paramname="entityName">表名称</param>///<paramname="areaName">区域名称</param>///<returns></returns>publicCodePreviewVMGetCode(stringentityName,stringareaName,IEnumerable<string>areaItems){varjsText=string.Empty;varmodelText=string.Empty;varschemaTables=GetSchemaTable(entityName);if(schemaTables.Any()){varjsTemplate=newJavaScriptTemplate(areaName,entityName,schemaTables);jsText=jsTemplate.TransformText();varmodelTemplate=newModelTemplate(entityName,schemaTables);modelText=modelTemplate.TransformText();}varcontrollerTemplate=newControllerTemplate(areaName,entityName);//过滤部分列,用于在Service和Cshtml渲染varfilterColumns=newList<string>{"Id","keys","createBy","createTime","updateTime","updateBy"};varnewColumns=schemaTables.Where(x=>!filterColumns.Any(f=>x.ColumnName.Equals(f,StringComparison.OrdinalIgnoreCase))).ToList();varserviceTemplate=newServiceTemplate(areaName,entityName,newColumns);vartableDescription=GetTableDescription(entityName);varcshtmlTemplate=newCshtmlTemplate(areaName,entityName,newColumns,tableDescription?.TableName);varvm=newCodePreviewVM(){JavaScriptTemp=jsText,ModelTemp=modelText,ControllerTemp=controllerTemplate.TransformText(),ServiceTemp=serviceTemplate.TransformText(),CshtmlTemp=cshtmlTemplate.TransformText(),AreaItems=areaItems,AreaName=areaName,EntityName=entityName,};returnvm;}///<summary>///获取所有表名称和表注释///</summary>///<paramname="tableCode">表名称,用于模糊查询</param>///<paramname="tableName">表说明/备注,用于模糊查询</param>///<returns></returns>publicList<TableInfo>GetAllTableDescription(stringtableCode="",stringtableName=""){varresult=newList<TableInfo>();stringsql=string.Empty;switch(dbType){caseDbType.MySql:vartableSchemaName=Context.CurrentConnectionConfig.ConnectionString.Split(";").FirstOrDefault(x=>x.Equals("database",StringComparison.OrdinalIgnoreCase))?.Split("=").LastOrDefault();if(!string.IsNullOrWhiteSpace(tableSchemaName)){sql=$"select table_name as TableCode,table_comment AS TableName from information_schema.tables where table_schema='{tableSchemaName}' ";if(!string.IsNullOrWhiteSpace(tableCode)){sql+=$"And table_name Like '%{tableCode}%' ";}if(!string.IsNullOrWhiteSpace(tableName)){sql+=$"And table_comment LIKE '%{tableName}%' ";}sql+="ORDER BY TableCode";result=Context.Ado.SqlQuery<TableInfo>(sql).ToList();}break;caseDbType.SqlServer:sql="SELECT * FROM vw_TableDes WHERE 1=1 ";if(!string.IsNullOrWhiteSpace(tableCode)){sql+=$"And TableCode Like '%{tableCode}%' ";}if(!string.IsNullOrWhiteSpace(tableName)){sql+=$"And Cast(TableName as varchar) LIKE '%{tableName}%' ";}sql+="ORDER BY TableCode";result=Context.Ado.SqlQuery<TableInfo>(sql).ToList();break;caseDbType.Sqlite:sql=$"SELECT Name AS TableCode FROM sqlite_master WHERE type='table' ";if(!string.IsNullOrWhiteSpace(tableCode)){sql+=$"And name Like '%{tableCode}%' ";}sql+="ORDER BY name";result=Context.Ado.SqlQuery<TableInfo>(sql).ToList();break;caseDbType.Oracle:break;caseDbType.PostgreSQL:break;caseDbType.Dm:break;caseDbType.Kdbndp:break;default:break;}returnresult;}///<summary>///获取单张的表名称和表注释///</summary>///<paramname="tableCode">表名称</param>///<returns></returns>publicTableInfoGetTableDescription(stringtableCode){vartable=newTableInfo(){TableCode=tableCode,TableName=string.Empty};stringsql;switch(dbType){caseDbType.MySql:vartableSchemaName=Context.CurrentConnectionConfig.ConnectionString.Split(";").FirstOrDefault(x=>x.Equals("database",StringComparison.OrdinalIgnoreCase))?.Split("=").LastOrDefault();if(!string.IsNullOrWhiteSpace(tableSchemaName)){sql=$"select table_name as TableCode,table_comment AS TableName from information_schema.tables where table_schema='{tableSchemaName}'";table=Context.Ado.SqlQuerySingle<TableInfo>(sql);}break;caseDbType.SqlServer:sql=$"SELECT * FROM vw_TableDes WHERE TableCode = '{tableCode}' ORDER BY TableCode";table=Context.Ado.SqlQuerySingle<TableInfo>(sql);break;caseDbType.Sqlite:break;caseDbType.Oracle:break;caseDbType.PostgreSQL:break;caseDbType.Dm:break;caseDbType.Kdbndp:break;default:break;}returntable;}///<summary>///获取表字段信息,包含字段名称、字段类型、字段长度以及字段注释///</summary>///<paramname="tableCode">表名</param>publicList<TableColumnInfo>GetSchemaTable(stringtableCode){vardata=newList<TableColumnInfo>();stringsql;switch(dbType){caseDbType.MySql:vartableSchemaName=Context.CurrentConnectionConfig.ConnectionString.Split(";").FirstOrDefault(x=>x.Equals("database",StringComparison.OrdinalIgnoreCase))?.Split("=").LastOrDefault();sql=$@"SELECTDISTINCTcolumn_nameASColumnName,data_typeASTypeName,character_Maximum_lengthASTypeLenght,column_commentASColumnDescription,CASEis_nullableWHEN'NO'THEN0ELSE1ENDASNullAbleFROMinformation_schema.COLUMNSWHEREtable_schema='{tableSchemaName}'ANDtable_name='{tableCode}'";if(!string.IsNullOrWhiteSpace(tableCode)){data=Context.SqlQueryable<TableColumnInfo>(sql).ToList();}break;caseDbType.SqlServer:varobjname=newSugarParameter("@objname",tableCode);varresult=Context.Ado.UseStoredProcedure().GetDataSetAll($"up_help",objname).Tables[1];foreach(DataRowdrinresult.Rows){int.TryParse(dr["length"].ToString(),outintlength);varitem=newTableColumnInfo{ColumnName=dr["Column_name"].ToString(),TypeName=dr["Type"].ToString(),ColumnDescription=dr["Column_Desc"].ToString(),TypeLenght=length,NullAble=dr["NullAble"].ToString().Equals("yes",StringComparison.OrdinalIgnoreCase)};data.Add(item);}break;caseDbType.Sqlite:sql=$"PRAGMA table_info('{tableCode}')";varsqliteResult=Context.Ado.SqlQuery<dynamic>(sql).ToList();foreach(variteminsqliteResult){vartypeString=$"{item.type}";int.TryParse(Regex.Match(typeString,"[0-9]+").ToString(),outintlenght);data.Add(newTableColumnInfo{ColumnName=item.name,ColumnDescription=string.Empty,TypeLenght=lenght,NullAble=!Convert.ToBoolean(item.notnull),TypeName=Regex.Match(typeString,"[A-Z,a-z]+").ToString(),});}break;caseDbType.Oracle:break;caseDbType.PostgreSQL:break;caseDbType.Dm:break;caseDbType.Kdbndp:break;default:break;}//数据格式化data.ForEach(x=>{x.ColumnName=FirstLowerCase(x.ColumnName);x.TypeName=SqlToCsharp(x.TypeName);x.ColumnDescription=Regex.Replace(x.ColumnDescription,@"[\r\n]","");});returndata;}///<summary>///数据库类型转C#数据类型,目前仅支持SqlServer、MySql、Sqlite///</summary>///<paramname="sqlFieldType">数据表字段类型</param>///<returns>相对应的C#数据类型</returns>privatestringSqlToCsharp(stringsqlFieldType){stringcSharpType;switch(sqlFieldType.ToLower()){case"image":case"varbinary":case"timestamp":case"binary":cSharpType="byte[]";break;case"text":case"char":case"nvarchar":case"nchar":case"ntext":case"varchar":cSharpType="string";break;case"uniqueidentifier":cSharpType="Guid";break;case"tinyint":cSharpType="byte";break;case"smallint":cSharpType="Int16";break;case"int":case"integer":cSharpType="int";break;case"smalldatetime":case"datetime":case"datetime2":cSharpType="DateTime";break;case"decimal":case"smallmoney":case"money":cSharpType="decimal";break;case"real":cSharpType="Single";break;case"float":cSharpType="double";break;case"bit":cSharpType="bool";break;case"bigint":cSharpType="Int64";break;default:cSharpType=string.Empty;break;}returncSharpType;}///<summary>///字符串首字母转小写///</summary>///<paramname="str"></param>///<returns></returns>privatestringFirstLowerCase(stringstr){returnstr.Substring(0,1).ToLower()+str.Substring(1);}///<summary>///保存文件///</summary>///<paramname="path"></param>///<paramname="text"></param>publicResponseSaveFile(stringpath,stringtext){varresult=newResponse(){Status=true};varfileName=Path.GetFileName(path);varbasePath=Path.GetDirectoryName(path);try{if(!File.Exists(path)){if(!Directory.Exists(basePath)){Directory.CreateDirectory(basePath);}File.WriteAllText(path,text);result.Message=$"“{fileName}”保存成功";}else{result.Status=false;result.Message=$"保存“{fileName}”失败,文件已存在!";}}catch(Exceptionex){result.Status=false;result.Message=$"保存“{fileName}”失败,{ex.Message}";}returnresult;}publicstringConvertToControllerName(stringtableName){varstr=CultureInfo.CurrentCulture.TextInfo.ToTitleCase(tableName);returnstring.Join("",str.Split("_"));}///<summary>///添加菜单栏和按钮///</summary>///<paramname="module"></param>///<paramname="areaName">区域名称</param>///<returns></returns>publicResponseInsertModelAndButton(SysModulemodule,stringareaName){varresult=newResponse(){Status=true};try{varoldmodule=Context.Queryable<SysModule>().Any(x=>x.Url.Equals(module.Url));if(oldmodule){result.Status=false;result.Message=$"路径为“{module.Url}”菜单项已存在!";}else{varpeer=Context.Queryable<SysModule>().Where(x=>x.Url.StartsWith($"/{areaName}/")).First();if(peer!=null){module.ParentName=peer.ParentName;module.ParentId=peer.ParentId;}Response<SysModule>sysModule=_moduleService.Ins(module,base.sysWebUser.Account);List<SysModuleElement>btns=_moduleService.DefaultBtns.Select(x=>newSysModuleElement{AreaMenus="1",Name=x.Text,Icon=x.Icon,Class=x.BtnClass,DomId=x.Value,ModuleId=sysModule.Result.Id,Remark=x.Text,Sort=x.Sort,}).ToList();_moduleService.AddMenu(btns,base.sysWebUser.Account);result=sysModule;}}catch(Exceptionex){result.Status=false;result.Message=ex.Message;}returnresult;}}}