CodeGeneratorTool.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  1. using Infrastructure;
  2. using Infrastructure.Extensions;
  3. using Infrastructure.Helper;
  4. using Infrastructure.Model;
  5. using JinianNet.JNTemplate;
  6. using SqlSugar;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.IO;
  10. using System.Linq;
  11. using ZR.CodeGenerator.Model;
  12. using ZR.Model.System.Generate;
  13. namespace ZR.CodeGenerator
  14. {
  15. /// <summary>
  16. /// 代码生成器
  17. /// </remarks>
  18. /// </summary>
  19. public class CodeGeneratorTool
  20. {
  21. private static readonly string CodeTemplateDir = "CodeGenTemplate";
  22. /// <summary>
  23. /// 代码生成器入口方法
  24. /// </summary>
  25. /// <param name="dto"></param>
  26. public static void Generate(GenerateDto dto)
  27. {
  28. var genOptions = AppSettings.Get<CodeGen>("codeGen");
  29. dto.VueParentPath = "Frontend";
  30. if (!genOptions.VuePath.IsEmpty())
  31. {
  32. dto.VueParentPath = genOptions.VuePath;
  33. }
  34. if (genOptions.UniappPath.IsNotEmpty())
  35. {
  36. dto.AppVuePath = genOptions.UniappPath;
  37. }
  38. dto.GenOptions = GenerateOption(dto.GenTable);
  39. if (dto.GenTable.SubTable != null)
  40. {
  41. dto.SubTableOptions = GenerateOption(dto.GenTable.SubTable);
  42. }
  43. if (dto.GenTable.SubTableName.IsNotEmpty() && dto.GenTable.SubTable == null)
  44. {
  45. throw new CustomException($"{dto.GenTable.SubTableName}子表不存在");
  46. }
  47. ReplaceDto replaceDto = new()
  48. {
  49. ModelTypeName = dto.GenTable.ClassName,//表名对应C# 实体类名
  50. PermissionPrefix = dto.GenTable?.Options?.PermissionPrefix,
  51. Author = dto.GenTable.FunctionAuthor,
  52. ShowBtnAdd = dto.GenTable.Options.CheckedBtn.Any(f => f == 1),
  53. ShowBtnEdit = dto.GenTable.Options.CheckedBtn.Any(f => f == 2),
  54. ShowBtnDelete = dto.GenTable.Options.CheckedBtn.Any(f => f == 3),
  55. ShowBtnExport = dto.GenTable.Options.CheckedBtn.Any(f => f == 4),
  56. ShowBtnView = dto.GenTable.Options.CheckedBtn.Any(f => f == 5),
  57. ShowBtnTruncate = dto.GenTable.Options.CheckedBtn.Any(f => f == 6),
  58. ShowBtnMultiDel = dto.GenTable.Options.CheckedBtn.Any(f => f == 7),
  59. ShowBtnImport = dto.GenTable.Options.CheckedBtn.Any(f => f == 8),
  60. ViewFileName = dto.GenTable.BusinessName.FirstUpperCase(),
  61. OperBtnStyle = dto.GenTable.Options.OperBtnStyle,
  62. UseSnowflakeId = dto.GenTable.Options.UseSnowflakeId,
  63. EnableLog = dto.GenTable.Options.EnableLog
  64. };
  65. var columns = dto.GenTable.Columns;
  66. replaceDto.PKName = columns.Find(f => f.IsPk || f.IsIncrement)?.CsharpField ?? "Id";
  67. replaceDto.PKType = columns.Find(f => f.IsPk || f.IsIncrement)?.CsharpType ?? "int";
  68. replaceDto.UploadFile = columns.Any(f => f.HtmlType.Equals(GenConstants.HTML_IMAGE_UPLOAD) || f.HtmlType.Equals(GenConstants.HTML_FILE_UPLOAD)) ? 1 : 0;
  69. replaceDto.SelectMulti = columns.Any(f => f.HtmlType.Equals(GenConstants.HTML_SELECT_MULTI)) ? 1 : 0;
  70. replaceDto.ShowEditor = columns.Any(f => f.HtmlType.Equals(GenConstants.HTML_EDITOR)) ? 1 : 0;
  71. replaceDto.FistLowerPk = replaceDto.PKName.FirstLowerCase();
  72. InitJntTemplate(dto, replaceDto);
  73. GenerateModels(replaceDto, dto);
  74. GenerateService(replaceDto, dto);
  75. GenerateControllers(replaceDto, dto);
  76. if (dto.GenTable.Options.FrontTpl == 2)
  77. {
  78. GenerateVue3Views(replaceDto, dto);
  79. }
  80. else if (dto.GenTable.Options.FrontTpl == 1)
  81. {
  82. GenerateVueViews(replaceDto, dto);
  83. }
  84. else
  85. {
  86. GenerateAntDesignViews(replaceDto, dto);
  87. }
  88. if (dto.GenTable.Options.GenerateRepo == 1)
  89. {
  90. GenerateRepository(replaceDto, dto);
  91. }
  92. GenerateVueJs(dto);
  93. GenerateSql(dto);
  94. if (genOptions.ShowApp)
  95. {
  96. GenerateAppVueViews(replaceDto, dto, genOptions.UniappVersion);
  97. GenerateAppVueFormViews(replaceDto, dto, genOptions.UniappVersion);
  98. GenerateAppJs(dto);
  99. }
  100. dto.ReplaceDto = replaceDto;
  101. }
  102. private static CodeGenerateOption GenerateOption(GenTable genTable)
  103. {
  104. CodeGenerateOption _option = new()
  105. {
  106. BaseNamespace = genTable.BaseNameSpace,
  107. SubNamespace = genTable.ModuleName.FirstUpperCase()
  108. };
  109. _option.DtosNamespace = _option.BaseNamespace + "Model";
  110. _option.ModelsNamespace = _option.BaseNamespace + "Model";
  111. _option.RepositoriesNamespace = _option.BaseNamespace + "Repository";
  112. //_option.IRepositoriesNamespace = _option.BaseNamespace + "Repository";
  113. _option.IServicsNamespace = _option.BaseNamespace + "Service";
  114. _option.ServicesNamespace = _option.BaseNamespace + "Service";
  115. _option.ApiControllerNamespace = _option.BaseNamespace + "Admin.WebApi";
  116. return _option;
  117. }
  118. #region 读取模板
  119. /// <summary>
  120. /// 生成实体类Model
  121. /// </summary>
  122. /// <param name="generateDto"></param>
  123. /// <param name="replaceDto">替换实体</param>
  124. private static void GenerateModels(ReplaceDto replaceDto, GenerateDto generateDto)
  125. {
  126. var path = Path.Combine(CodeTemplateDir, "csharp");
  127. var tpl = JnHelper.ReadTemplate(path, "TplModel.txt");
  128. var tplDto = JnHelper.ReadTemplate(path, "TplDto.txt");
  129. string fullPath = Path.Combine(generateDto.GenOptions.ModelsNamespace, generateDto.GenOptions.SubNamespace, replaceDto.ModelTypeName + ".cs");
  130. string fullPathDto = Path.Combine(generateDto.GenOptions.ModelsNamespace, generateDto.GenOptions.SubNamespace, "Dto", replaceDto.ModelTypeName + "Dto.cs");
  131. generateDto.GenCodes.Add(new GenCode(1, "Model.cs", fullPath, tpl.Render()));
  132. generateDto.GenCodes.Add(new GenCode(2, "Dto.cs", fullPathDto, tplDto.Render()));
  133. }
  134. /// <summary>
  135. /// 生成Repository层代码文件
  136. /// </summary>
  137. /// <param name="generateDto"></param>
  138. /// <param name="replaceDto">替换实体</param>
  139. private static void GenerateRepository(ReplaceDto replaceDto, GenerateDto generateDto)
  140. {
  141. var tpl = JnHelper.ReadTemplate(Path.Combine(CodeTemplateDir, "csharp"), "TplRepository.txt");
  142. var result = tpl.Render();
  143. var fullPath = Path.Combine(generateDto.GenOptions.RepositoriesNamespace, generateDto.GenOptions.SubNamespace, $"{replaceDto.ModelTypeName}Repository.cs");
  144. generateDto.GenCodes.Add(new GenCode(3, "Repository.cs", fullPath, result));
  145. }
  146. /// <summary>
  147. /// 生成Service文件
  148. /// </summary>
  149. private static void GenerateService(ReplaceDto replaceDto, GenerateDto generateDto)
  150. {
  151. var path = Path.Combine(CodeTemplateDir, "csharp");
  152. var tpl = JnHelper.ReadTemplate(path, "TplService.txt");
  153. var tpl2 = JnHelper.ReadTemplate(path, "TplIService.txt");
  154. var fullPath = Path.Combine(generateDto.GenOptions.ServicesNamespace, generateDto.GenOptions.SubNamespace, $"{replaceDto.ModelTypeName}Service.cs");
  155. var fullPath2 = Path.Combine(generateDto.GenOptions.IServicsNamespace, generateDto.GenOptions.SubNamespace, $"I{generateDto.GenOptions.SubNamespace}Service", $"I{replaceDto.ModelTypeName}Service.cs");
  156. generateDto.GenCodes.Add(new GenCode(4, "Service.cs", fullPath, tpl.Render()));
  157. generateDto.GenCodes.Add(new GenCode(4, "IService.cs", fullPath2, tpl2.Render()));
  158. }
  159. /// <summary>
  160. /// 生成控制器ApiControllers文件
  161. /// </summary>
  162. private static void GenerateControllers(ReplaceDto replaceDto, GenerateDto generateDto)
  163. {
  164. var tpl = JnHelper.ReadTemplate(Path.Combine(CodeTemplateDir, "csharp"), "TplControllers.txt");
  165. tpl.Set("QueryCondition", replaceDto.QueryCondition);
  166. var result = tpl.Render();
  167. var fullPath = Path.Combine(generateDto.GenOptions.ApiControllerNamespace, "Controllers", generateDto.GenOptions.SubNamespace, $"{replaceDto.ModelTypeName}Controller.cs");
  168. generateDto.GenCodes.Add(new GenCode(5, "Controller.cs", fullPath, result));
  169. }
  170. /// <summary>
  171. /// 生成Vue页面
  172. private static void GenerateVueViews(ReplaceDto replaceDto, GenerateDto generateDto)
  173. {
  174. string fileName = generateDto.GenTable.TplCategory switch
  175. {
  176. "tree" => "TplTreeVue.txt",
  177. "select" => "TplVueSelect.txt",
  178. _ => "TplVue.txt",
  179. };
  180. var path = Path.Combine(CodeTemplateDir, "vue2");
  181. fileName = Path.Combine("vue2", fileName);
  182. replaceDto.VueViewListHtml = JnHelper.ReadTemplate(path, "TableList.txt").Render();
  183. replaceDto.VueQueryFormHtml = JnHelper.ReadTemplate(path, "QueryForm.txt").Render();
  184. replaceDto.VueViewFormHtml = JnHelper.ReadTemplate(path, "CurdForm.txt").Render();
  185. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, fileName);
  186. var fullPath = Path.Combine(generateDto.VueParentPath, "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{replaceDto.ViewFileName}.vue");
  187. generateDto.GenCodes.Add(new GenCode(6, "index.vue", fullPath, tpl.Render()));
  188. }
  189. /// <summary>
  190. /// vue3
  191. /// </summary>
  192. /// <param name="generateDto"></param>
  193. private static void GenerateVue3Views(ReplaceDto replaceDto, GenerateDto generateDto)
  194. {
  195. string fileName = generateDto.GenTable.TplCategory switch
  196. {
  197. "tree" => "TreeVue.txt",
  198. _ => "Vue.txt",
  199. };
  200. fileName = Path.Combine("v3", fileName);
  201. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, fileName);
  202. tpl.Set("treeCode", generateDto.GenTable?.Options?.TreeCode?.FirstLowerCase());
  203. tpl.Set("treeName", generateDto.GenTable?.Options?.TreeName?.FirstLowerCase());
  204. tpl.Set("treeParentCode", generateDto.GenTable?.Options?.TreeParentCode?.FirstLowerCase());
  205. tpl.Set("options", generateDto.GenTable?.Options);
  206. var result = tpl.Render();
  207. var fullPath = Path.Combine(generateDto.VueParentPath, "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{replaceDto.ViewFileName}.vue");
  208. generateDto.GenCodes.Add(new GenCode(16, "index.vue", fullPath, result));
  209. }
  210. /// <summary>
  211. /// AntDesign
  212. /// </summary>
  213. /// <param name="generateDto"></param>
  214. private static void GenerateAntDesignViews(ReplaceDto replaceDto, GenerateDto generateDto)
  215. {
  216. string fileName = generateDto.GenTable.TplCategory switch
  217. {
  218. "tree" => "TreeVue.txt",
  219. _ => "Vue2.txt",
  220. };
  221. fileName = Path.Combine("antDesign", fileName);
  222. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, fileName);
  223. tpl.Set("treeCode", generateDto.GenTable?.Options?.TreeCode?.FirstLowerCase());
  224. tpl.Set("treeName", generateDto.GenTable?.Options?.TreeName?.FirstLowerCase());
  225. tpl.Set("treeParentCode", generateDto.GenTable?.Options?.TreeParentCode?.FirstLowerCase());
  226. tpl.Set("options", generateDto.GenTable?.Options);
  227. var result = tpl.Render();
  228. var fullPath = Path.Combine(generateDto.VueParentPath, "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{replaceDto.ViewFileName}.vue");
  229. generateDto.GenCodes.Add(new GenCode(16, "index.vue", fullPath, result));
  230. }
  231. /// <summary>
  232. /// 生成vue页面api
  233. /// </summary>
  234. /// <param name="generateDto"></param>
  235. /// <returns></returns>
  236. public static void GenerateVueJs(GenerateDto generateDto)
  237. {
  238. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, "TplVueApi.txt");
  239. var result = tpl.Render();
  240. string fileName;
  241. if (generateDto.VueVersion == 3)
  242. {
  243. fileName = generateDto.GenTable.BusinessName.ToLower() + ".js";//vue3 api引用目前只能小写
  244. }
  245. else
  246. {
  247. fileName = generateDto.GenTable.BusinessName.FirstLowerCase() + ".js";
  248. }
  249. string fullPath = Path.Combine(generateDto.VueParentPath, "src", "api", generateDto.GenTable.ModuleName.FirstLowerCase(), fileName);
  250. generateDto.GenCodes.Add(new GenCode(7, "api.js", fullPath, result));
  251. }
  252. /// <summary>
  253. /// 生成SQL
  254. /// </summary>
  255. /// <param name="generateDto"></param>
  256. public static void GenerateSql(GenerateDto generateDto)
  257. {
  258. string tempName = generateDto.DbType switch
  259. {
  260. 0 => "MySqlTemplate",
  261. 1 => "SqlTemplate",
  262. 4 => "PgSql",
  263. _ => "Other",
  264. };
  265. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, Path.Combine("sql", $"{tempName}.txt"));
  266. tpl.Set("parentId", generateDto.GenTable?.Options?.ParentMenuId ?? 0);
  267. var result = tpl.Render();
  268. string fullPath = Path.Combine(generateDto.GenCodePath, "sql", generateDto.GenTable.BusinessName + ".sql");
  269. generateDto.GenCodes.Add(new GenCode(8, "sql菜单", fullPath, result));
  270. }
  271. #endregion
  272. #region app页面
  273. /// <summary>
  274. /// 列表页面
  275. /// </summary>
  276. /// <param name="generateDto"></param>
  277. /// <param name="replaceDto"></param>
  278. /// <param name="uniappVersion"></param>
  279. private static void GenerateAppVueViews(ReplaceDto replaceDto, GenerateDto generateDto, int uniappVersion)
  280. {
  281. var fileName = Path.Combine("app", $"vue{uniappVersion}.txt");
  282. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, fileName);
  283. tpl.Set("options", generateDto.GenTable?.Options);
  284. var result = tpl.Render();
  285. var fullPath = Path.Combine(generateDto.AppVuePath, "pages", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{replaceDto.ViewFileName.FirstLowerCase()}", "index.vue");
  286. generateDto.GenCodes.Add(new GenCode(20, "uniapp页面", fullPath, result));
  287. }
  288. private static void GenerateAppVueFormViews(ReplaceDto replaceDto, GenerateDto generateDto, int uniappVersion)
  289. {
  290. var fileName = Path.Combine("app", uniappVersion == 3 ? "form3.txt" : "form.txt");
  291. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, fileName);
  292. tpl.Set("options", generateDto.GenTable?.Options);
  293. var result = tpl.Render();
  294. var fullPath = Path.Combine(generateDto.AppVuePath, "pages", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{replaceDto.ViewFileName.FirstLowerCase()}", "edit.vue");
  295. generateDto.GenCodes.Add(new GenCode(20, "uniapp表单", fullPath, result));
  296. }
  297. /// <summary>
  298. /// 生成vue页面api
  299. /// </summary>
  300. /// <param name="generateDto"></param>
  301. /// <returns></returns>
  302. public static void GenerateAppJs(GenerateDto generateDto)
  303. {
  304. var filePath = Path.Combine("app", "api.txt");
  305. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, filePath);
  306. var result = tpl.Render();
  307. string fileName = generateDto.GenTable.BusinessName.ToLower() + ".js";
  308. string fullPath = Path.Combine(generateDto.AppVuePath, "api", generateDto.GenTable.ModuleName.FirstLowerCase(), fileName);
  309. generateDto.GenCodes.Add(new GenCode(21, "uniapp Api", fullPath, result));
  310. }
  311. #endregion
  312. #region 帮助方法
  313. /// <summary>
  314. /// 如果有前缀替换将前缀替换成空,替换下划线"_"为空再将首字母大写
  315. /// 表名转换成C#类名
  316. /// </summary>
  317. /// <param name="tableName"></param>
  318. /// <returns></returns>
  319. public static string GetClassName(string tableName, bool autoRemovePre, string tablePrefix)
  320. {
  321. if (!string.IsNullOrEmpty(tablePrefix) && autoRemovePre)
  322. {
  323. string[] prefixList = tablePrefix.Split(",", StringSplitOptions.RemoveEmptyEntries);
  324. for (int i = 0; i < prefixList.Length; i++)
  325. {
  326. if (!string.IsNullOrEmpty(prefixList[i].ToString()))
  327. {
  328. tableName = tableName.Replace(prefixList[i], "", StringComparison.OrdinalIgnoreCase);
  329. }
  330. }
  331. }
  332. //return tableName.UnderScoreToCamelCase();
  333. return tableName.ConvertToPascal("_");
  334. }
  335. /// <summary>
  336. /// 首字母转小写,模板使用(勿删)
  337. /// </summary>
  338. /// <param name="str"></param>
  339. /// <returns></returns>
  340. public static string FirstLowerCase(string str)
  341. {
  342. try
  343. {
  344. return string.IsNullOrEmpty(str) ? str : str[..1].ToLower() + str[1..];
  345. }
  346. catch (Exception ex)
  347. {
  348. Console.WriteLine(ex.Message);
  349. return str;
  350. }
  351. }
  352. /// <summary>
  353. /// 获取C# 类型
  354. /// </summary>
  355. /// <param name="sDatatype"></param>
  356. /// <param name="csharpType"></param>
  357. /// <returns></returns>
  358. public static CSharpDataType GetCSharpDatatype(string sDatatype, CsharpTypeArr csharpType)
  359. {
  360. sDatatype = sDatatype.ToLower();
  361. if (csharpType.Int.Contains(sDatatype))
  362. {
  363. return CSharpDataType.@int;
  364. }
  365. else if (csharpType.Long.Contains(sDatatype))
  366. {
  367. return CSharpDataType.@long;
  368. }
  369. else if (csharpType.Float.Contains(sDatatype))
  370. {
  371. return CSharpDataType.@float;
  372. }
  373. else if (csharpType.Decimal.Contains(sDatatype))
  374. {
  375. return CSharpDataType.@decimal;
  376. }
  377. else if (csharpType.DateTime.Contains(sDatatype))
  378. {
  379. return CSharpDataType.DateTime;
  380. }
  381. else if (csharpType.Bool.Contains(sDatatype))
  382. {
  383. return CSharpDataType.@bool;
  384. }
  385. return CSharpDataType.@string;
  386. }
  387. #endregion
  388. #region 初始化信息
  389. /// <summary>
  390. /// 初始化表信息
  391. /// </summary>
  392. /// <param name="dto"></param>
  393. /// <returns></returns>
  394. public static GenTable InitTable(InitTableDto dto)
  395. {
  396. var className = GetClassName(dto.TableName, dto.CodeGen.AutoPre, dto.CodeGen.TablePrefix);
  397. GenTable genTable = new()
  398. {
  399. DbName = dto.DbName,
  400. BaseNameSpace = "ZR.",//导入默认命名空间前缀
  401. ModuleName = dto.CodeGen.ModuleName,//导入默认模块名
  402. ClassName = className,
  403. BusinessName = className,
  404. FunctionAuthor = dto.CodeGen.Author,
  405. TableName = dto.TableName,
  406. TableComment = dto.Desc,
  407. FunctionName = dto.Desc,
  408. Create_by = dto.UserName,
  409. Options = new CodeOptions()
  410. {
  411. SortType = "asc",
  412. CheckedBtn = new int[] { 1, 2, 3 },
  413. PermissionPrefix = className.ToLower(),
  414. FrontTpl = dto.FrontTpl
  415. }
  416. };
  417. return genTable;
  418. }
  419. /// <summary>
  420. /// 初始化列属性字段数据
  421. /// </summary>
  422. /// <param name="genTable"></param>
  423. /// <param name="dbColumnInfos"></param>
  424. /// <param name="seqs"></param>
  425. /// <param name="codeGen"></param>
  426. public static List<GenTableColumn> InitGenTableColumn(GenTable genTable, List<DbColumnInfo> dbColumnInfos, List<OracleSeq> seqs = null, CodeGen codeGen = null)
  427. {
  428. OptionsSetting optionsSetting = new();
  429. var dbConfig = AppSettings.Get<DbConfigs>(nameof(GenConstants.CodeGenDbConfig));
  430. optionsSetting.CodeGenDbConfig = dbConfig ?? throw new CustomException("代码生成节点数据配置异常"); ;
  431. optionsSetting.CodeGen = codeGen ?? throw new CustomException("代码生成节点配置异常");
  432. List<GenTableColumn> genTableColumns = new();
  433. foreach (var column in dbColumnInfos)
  434. {
  435. genTableColumns.Add(InitColumnField(genTable, column, seqs, optionsSetting));
  436. }
  437. return genTableColumns;
  438. }
  439. /// <summary>
  440. /// 初始化表字段数据
  441. /// </summary>
  442. /// <param name="genTable"></param>
  443. /// <param name="column"></param>
  444. /// <param name="optionsSetting"></param>
  445. /// <param name="seqs">oracle 序列</param>
  446. /// <returns></returns>
  447. private static GenTableColumn InitColumnField(GenTable genTable, DbColumnInfo column, List<OracleSeq> seqs, OptionsSetting optionsSetting)
  448. {
  449. var dataType = column.DataType;
  450. if (optionsSetting.CodeGenDbConfig.DbType == 3)
  451. {
  452. dataType = column.OracleDataType;
  453. var seqName = $"SEQ_{genTable.TableName}_{column.DbColumnName}";
  454. var isIdentity = seqs.Any(f => seqName.Equals(f.SEQUENCE_NAME, StringComparison.CurrentCultureIgnoreCase));
  455. column.IsIdentity = isIdentity;
  456. }
  457. GenTableColumn genTableColumn = new()
  458. {
  459. ColumnName = column.DbColumnName.FirstLowerCase(),
  460. ColumnComment = column.ColumnDescription,
  461. IsPk = column.IsPrimarykey,
  462. ColumnType = dataType,
  463. TableId = genTable.TableId,
  464. TableName = genTable.TableName,
  465. CsharpType = GetCSharpDatatype(dataType, optionsSetting.CodeGen.CsharpTypeArr).ToString(),
  466. CsharpField = column.DbColumnName.ConvertToPascal("_"),
  467. IsRequired = !column.IsNullable,
  468. IsIncrement = column.IsIdentity,
  469. Create_by = genTable.Create_by,
  470. Create_time = DateTime.Now,
  471. IsInsert = !column.IsIdentity || GenConstants.inputDtoNoField.Any(f => f.Contains(column.DbColumnName, StringComparison.OrdinalIgnoreCase)),//非自增字段都需要插入
  472. IsEdit = true,
  473. IsQuery = false,
  474. IsExport = true,
  475. HtmlType = GenConstants.HTML_INPUT,
  476. };
  477. if (GenConstants.imageFiled.Any(f => column.DbColumnName.ToLower().Contains(f.ToLower())))
  478. {
  479. genTableColumn.HtmlType = GenConstants.HTML_IMAGE_UPLOAD;
  480. }
  481. else if (GenConstants.COLUMNTYPE_TIME.Any(f => genTableColumn.CsharpType.ToLower().Contains(f.ToLower())))
  482. {
  483. genTableColumn.HtmlType = GenConstants.HTML_DATETIME;
  484. }
  485. else if (GenConstants.radioFiled.Any(f => column.DbColumnName.EndsWith(f, StringComparison.OrdinalIgnoreCase)) ||
  486. GenConstants.radioFiled.Any(f => column.DbColumnName.StartsWith(f, StringComparison.OrdinalIgnoreCase)))
  487. {
  488. genTableColumn.HtmlType = GenConstants.HTML_RADIO;
  489. }
  490. else if (GenConstants.selectFiled.Any(f => column.DbColumnName == f) ||
  491. GenConstants.selectFiled.Any(f => column.DbColumnName.EndsWith(f, StringComparison.OrdinalIgnoreCase)))
  492. {
  493. genTableColumn.HtmlType = GenConstants.HTML_SELECT;
  494. }
  495. else if (column.Length > 500)
  496. {
  497. genTableColumn.HtmlType = GenConstants.HTML_TEXTAREA;
  498. }
  499. //编辑字段
  500. if (column.IsIdentity || column.IsPrimarykey || GenConstants.COLUMNNAME_NOT_EDIT.Any(f => column.DbColumnName.Contains(f)))
  501. {
  502. genTableColumn.IsEdit = false;
  503. }
  504. //列表字段
  505. if (!GenConstants.COLUMNNAME_NOT_LIST.Any(f => column.DbColumnName.Contains(f) && !column.IsPrimarykey))
  506. {
  507. genTableColumn.IsList = true;
  508. }
  509. //时间类型初始化between范围查询
  510. if (genTableColumn.CsharpType == GenConstants.TYPE_DATE)
  511. {
  512. genTableColumn.QueryType = "BETWEEN";
  513. }
  514. return genTableColumn;
  515. }
  516. #endregion
  517. /// <summary>
  518. /// 初始化Jnt模板
  519. /// </summary>
  520. /// <param name="dto"></param>
  521. /// <param name="replaceDto"></param>
  522. private static void InitJntTemplate(GenerateDto dto, ReplaceDto replaceDto)
  523. {
  524. #if DEBUG
  525. Engine.Current.Clean();
  526. #endif
  527. dto.GenTable.Columns = dto.GenTable.Columns.OrderBy(x => x.Sort).ToList();
  528. bool showCustomInput = dto.GenTable.Columns.Any(f => f.HtmlType.Equals(GenConstants.HTML_CUSTOM_INPUT, StringComparison.OrdinalIgnoreCase));
  529. #region 查询所有字典
  530. var dictHtml = new string[] { GenConstants.HTML_CHECKBOX, GenConstants.HTML_RADIO, GenConstants.HTML_SELECT, GenConstants.HTML_SELECT_MULTI };
  531. var dicts = new List<GenTableColumn>();
  532. dicts.AddRange(dto.GenTable.Columns.FindAll(f => dictHtml.Contains(f.HtmlType)));
  533. if (dto.GenTable.SubTable != null && dto.GenTable.SubTableName.IsNotEmpty())
  534. {
  535. dicts.AddRange(dto.GenTable?.SubTable?.Columns?.FindAll(f => dictHtml.Contains(f.HtmlType)));
  536. }
  537. #endregion
  538. //jnt模板引擎全局变量
  539. Engine.Configure((options) =>
  540. {
  541. options.TagPrefix = "${";
  542. options.TagSuffix = "}";
  543. options.TagFlag = '$';
  544. options.OutMode = OutMode.Auto;
  545. //options.DisableeLogogram = true;//禁用简写
  546. options.Data.Set("refs", "$");//特殊标签替换
  547. options.Data.Set("t", "$");//特殊标签替换
  548. options.Data.Set("modal", "$");//特殊标签替换
  549. options.Data.Set("alert", "$");//特殊标签替换
  550. options.Data.Set("index", "$");//特殊标签替换
  551. options.Data.Set("confirm", "$");//特殊标签替换
  552. options.Data.Set("nextTick", "$");
  553. options.Data.Set("tab", "$");
  554. options.Data.Set("replaceDto", replaceDto);
  555. options.Data.Set("options", dto.GenOptions);
  556. options.Data.Set("subTableOptions", dto.SubTableOptions);
  557. options.Data.Set("genTable", dto.GenTable);
  558. options.Data.Set("genSubTable", dto.GenTable?.SubTable);
  559. options.Data.Set("showCustomInput", showCustomInput);
  560. options.Data.Set("tool", new CodeGeneratorTool());
  561. options.Data.Set("dicts", dicts.DistinctBy(x => x.DictType));
  562. options.Data.Set("sub", dto.GenTable.SubTable != null && dto.GenTable.SubTableName.IsNotEmpty());
  563. options.EnableCache = true;
  564. //...其它数据
  565. });
  566. }
  567. #region 模板用
  568. /// <summary>
  569. /// 模板用
  570. /// </summary>
  571. /// <param name="str"></param>
  572. /// <returns></returns>
  573. public static bool CheckInputDtoNoField(string str)
  574. {
  575. return GenConstants.inputDtoNoField.Any(f => f.Contains(str, StringComparison.OrdinalIgnoreCase));
  576. }
  577. public static bool CheckTree(GenTable genTable, string csharpField)
  578. {
  579. return (genTable.TplCategory.Equals("tree", StringComparison.OrdinalIgnoreCase) && genTable?.Options?.TreeParentCode != null && csharpField.Equals(genTable?.Options?.TreeParentCode));
  580. }
  581. public static string QueryExp(string propertyName, string queryType)
  582. {
  583. if (queryType.Equals("EQ"))
  584. {
  585. return $"it => it.{propertyName} == parm.{propertyName})";
  586. }
  587. if (queryType.Equals("GTE"))
  588. {
  589. return $"it => it.{propertyName} >= parm.{propertyName})";
  590. }
  591. if (queryType.Equals("GT"))
  592. {
  593. return $"it => it.{propertyName} > parm.{propertyName})";
  594. }
  595. if (queryType.Equals("LT"))
  596. {
  597. return $"it => it.{propertyName} < parm.{propertyName})";
  598. }
  599. if (queryType.Equals("LTE"))
  600. {
  601. return $"it => it.{propertyName} <= parm.{propertyName})";
  602. }
  603. if (queryType.Equals("NE"))
  604. {
  605. return $"it => it.{propertyName} != parm.{propertyName})";
  606. }
  607. if (queryType.Equals("LIKE"))
  608. {
  609. return $"it => it.{propertyName}.Contains(parm.{propertyName}))";
  610. }
  611. return $"it => it.{propertyName} == parm.{propertyName})";
  612. }
  613. #endregion
  614. }
  615. }