CodeGenerator/CloudBuilder.CodeGenerator/OperationUserControl.cs
owenchen 5959bae57b ow
2026-05-12 10:32:46 +08:00

287 lines
12 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using CloudBuilder.CodeGenerator.Config;
using CloudBuilder.CodeGenerator.Data;
using CloudBuilder.CodeGenerator.Utility;
using CloudBuilder.Core.Application.Builders;
using CloudBuilder.Core.DatabaseAccessor.Entity;
using CloudBuilder.Core.DependencyInjection.Form;
using CloudBuilder.Core.Extensions;
using CloudBuilder.Core.Service;
using CloudBuilder.Core.Utility;
using Krypton.Toolkit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.VisualStudio.OLE.Interop;
using RazorEngineCore;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Windows.Forms.Design;
namespace CloudBuilder.CodeGenerator
{
public partial class OperationUserControl : UserControl, IUserControl
{
private readonly IApplicationService app;
private readonly TableControl tableControl;
private ConfigUserControl configUserControl;
private readonly TemplateUserControl templateUserControl;
private readonly OutputUserControl outputUserControl;
private ToolInitConfig toolInitConfig;
public OperationUserControl(IApplicationService app,
[FromKeyedServices("TableControl")] TableControl tableControl,
[FromKeyedServices("TemplateUserControl")] TemplateUserControl templateUserControl,
[FromKeyedServices("OutputUserControl")] OutputUserControl outputUserControl)
{
InitializeComponent();
this.app = app;
this.tableControl = tableControl;
this.templateUserControl = templateUserControl;
this.outputUserControl = outputUserControl;
InitUserControl();
}
public void InitUserControl()
{
assemblyComboBox.DisplayMember = "Text";
assemblyComboBox.ValueMember = "Value";
toolInitConfig = ToolInitConfig.GetInstance();
List<ComboBoxItem> l = new List<ComboBoxItem>();
List<string> types = new List<string>();
foreach (NamespaceObject nso in toolInitConfig.NamespaceObjects)
{
if (l.Select(x => x.Text).Contains(nso.Assembly)) continue;
l.Add(CreateNewComboBoxItem(nso.Assembly, nso.Assembly));
}
DataTable dtbl = DataTableConvertor.ToDataTable<ComboBoxItem>(l);
assemblyComboBox.DataSource = dtbl;
assemblyComboBox.SelectedValue = toolInitConfig.CurrentAssembly;
InitkryptonCheckedListBox1(toolInitConfig.CurrentAssembly);
}
private void InitkryptonCheckedListBox1(string currentAssembly)
{
if (string.IsNullOrEmpty(currentAssembly)) return;
int i = 0;
kryptonCheckedListBox1.Items.Clear();
foreach (NamespaceObject nso in toolInitConfig.NamespaceObjects.Where(x => x.Assembly == currentAssembly).ToList())
{
if (nso.TemplateType.Contains("Entity") && nso.TemplateType != "Entity") continue;
if (nso.TemplateType.Contains("TypeScript")) continue;
kryptonCheckedListBox1.Items.Add(CreateNewItem(nso.TemplateType));
if (!nso.TemplateType.Contains("Entity"))
{
i++;
continue;
}
kryptonCheckedListBox1.SetItemCheckState(i++, CheckState.Checked);
}
}
private void outputFileBut_Click(object sender, EventArgs e)
{
ModelData model = GetModelData();
if (model.sysTableSchemas == null || model.sysTableSchemas.Length == 0)
{
MessageBox.Show("请选择要生成的数据表", "提示");
return;
}
for (var i = 0; i < kryptonCheckedListBox1.Items.Count; i++)
{
if (kryptonCheckedListBox1.GetItemCheckState(i) == CheckState.Checked)
{
KryptonListItem a = (KryptonListItem)kryptonCheckedListBox1.Items[i];
WriteAllText(model, a.ShortText);
}
}
MessageBox.Show("生成成功", "提示");
}
private void WriteAllText(ModelData model, string templateType)
{
NamespaceObject namespaceObject = toolInitConfig.NamespaceObjects.Where(x => x.Assembly == assemblyComboBox.Text.Trim() && x.TemplateType == templateType).FirstOrDefault();
if (namespaceObject == null) return;
string fileName = Path.Combine(toolInitConfig.TemplatePath, namespaceObject.TemplateFileName);
if (!File.Exists(fileName)) return;
if (!Path.Exists(namespaceObject.OutFilePath)) return;
var tp = File.ReadAllText(fileName);
string outputFileName = Path.Combine(namespaceObject.OutFilePath, namespaceObject.FileNamePrefix + model.sysTableSchemas[0].TableName.StringToProerty() + namespaceObject.FileNameSuffix);
if (templateType == "RegistEntity")
{
outputFileName = Path.Combine(namespaceObject.OutFilePath, namespaceObject.Assembly.Replace(".", "") + namespaceObject.FileNameSuffix);
//文件不存在,先初始化文件
if (!File.Exists(outputFileName)) File.WriteAllText(outputFileName, RazorEngineHelper.CompiledTemplate(tp, model));
string allTxt = File.ReadAllText(outputFileName);
tp = File.ReadAllText(Path.Combine(toolInitConfig.TemplatePath, namespaceObject.TemplateFileName.Replace(".cshtml", ".Key.cshtml")));
var temp = RazorEngineHelper.CompiledTemplate(tp, model);
if (allTxt.Contains("<" + model.sysTableSchemas[0].TableName.StringToProerty() + "Entity>()")) return;
int end = allTxt.IndexOf("//***END***", StringComparison.OrdinalIgnoreCase);
allTxt = allTxt.Substring(0, end) + temp + allTxt.Substring(end, allTxt.Length - end);
File.WriteAllText(outputFileName, allTxt);
return;
}
else if (templateType == "Permission")
{
outputFileName = Path.Combine(namespaceObject.OutFilePath, namespaceObject.Assembly.Split('.')[namespaceObject.Assembly.Split('.').Length - 1] + namespaceObject.FileNameSuffix);
//文件存在不覆盖,插入
if (File.Exists(outputFileName))
{
string allTxt = File.ReadAllText(outputFileName);
tp = File.ReadAllText(Path.Combine(toolInitConfig.TemplatePath, namespaceObject.TemplateFileName));
var temp = RazorEngineHelper.CompiledTemplate(tp, model);
if (allTxt.Contains(model.sysTableSchemas[0].TableName.StringToProerty())) return;
int end = allTxt.IndexOf("//***END***", StringComparison.OrdinalIgnoreCase);
allTxt = allTxt.Substring(0, end) + temp + allTxt.Substring(end, allTxt.Length - end);
File.WriteAllText(outputFileName, allTxt);
return;
}
else
{
tp = File.ReadAllText(Path.Combine(toolInitConfig.TemplatePath, namespaceObject.TemplateFileName.Replace(".cshtml", ".auto.cshtml")));
var temp = RazorEngineHelper.CompiledTemplate(tp, model);
File.WriteAllText(outputFileName, temp);
}
}
//Entity可以直接輸出其他要文件不存在才生成
if (templateType == "Entity" || templateType == "IEntityKey" || !File.Exists(outputFileName))
File.WriteAllText(outputFileName, RazorEngineHelper.CompiledTemplate(tp, model));
if ((model.KeyCount >= 0) && templateType == "Entity")
{
if (model.KeyCount > 1)
WriteAllText(model, "IEntityKey");
WriteAllText(model, "RegistEntity");
}
else if (templateType == "Service")
{
WriteAllText(model, "Permission");
}
}
private void templateBut_Click(object sender, EventArgs e)
{
try
{
ModelData modelData = GetModelData();
((OutputUserControl)outputUserControl).contextTxt.Text = RazorEngineHelper.CompiledTemplate(((TemplateUserControl)templateUserControl).contextTxt.Text, modelData);
MessageBox.Show("生成成功", "提示");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "出错");
}
}
private ModelData GetModelData()
{
configUserControl = app.ServiceProvider.GetKeyedService<ConfigUserControl>("ConfigUserControl");
ModelData modelData = new ModelData();
modelData.sysTableSchemas = ((TableControl)tableControl).GetDataSource();
modelData.NamespaceObject = toolInitConfig.NamespaceObjects.Where(x => x.TemplateType == configUserControl.GetTemplateType() && x.Assembly == configUserControl.GetAssembly()).FirstOrDefault();
if (modelData.sysTableSchemas != null && modelData.sysTableSchemas.Length > 0)
{
modelData.KeyCount = modelData.sysTableSchemas.Where(x => x.Pk > 0).Count();
if (modelData.KeyCount == 1)
{
modelData.KeyType = modelData.sysTableSchemas.Where(x => x.Pk > 0).FirstOrDefault().TypeOfName;
}
else if (modelData.KeyCount > 1)
{
modelData.KeyType = $"{modelData.sysTableSchemas[0].TableName.StringToProerty()}EntityKey";
}
else
{
modelData.KeyType = "string";
}
}
List<Assembly> assemblies = new List<Assembly>();
if (toolInitConfig.AssemblyReferences != null)
{
foreach (var reference in toolInitConfig.AssemblyReferences)
{
if (string.IsNullOrEmpty(reference.AssemblyFileName)) continue;
if (!File.Exists(reference.AssemblyFileName)) continue;
assemblies.Add(Assembly.LoadFrom(reference.AssemblyFileName));
}
}
if (configUserControl.GetTemplateType() == "Controller" || configUserControl.GetTemplateType() == "TypeScriptService")
modelData.ClassInfos = RazorEngineHelper.PackIServiceClassInfo(assemblies.Where(x => Path.GetFileNameWithoutExtension(x.ManifestModule.Name) == modelData.NamespaceObject.Assembly).FirstOrDefault());
else
if (configUserControl.GetTemplateType() == "TypeScript")
modelData.ClassInfos = RazorEngineHelper.PackTypeScriptClassInfo(assemblies.Where(x => Path.GetFileNameWithoutExtension(x.ManifestModule.Name) == modelData.NamespaceObject.Assembly).FirstOrDefault());
return modelData;
}
public class ComboBoxItem
{
public string Text { get; set; }
public string Value { get; set; }
}
private ComboBoxItem CreateNewComboBoxItem(string text, string value)
{
ComboBoxItem item = new ComboBoxItem();
item.Text = text;
item.Value = value;
return item;
}
private object CreateNewItem(string text)
{
KryptonListItem item = new KryptonListItem();
item.ShortText = text;
return item;
}
private void assemblyComboBox_SelectionChangeCommitted(object sender, EventArgs e)
{
((MainFunctionView)(this.ParentForm)).SetConfigUserControl(assemblyComboBox.SelectedValue);
}
private void assemblyComboBox_SelectedValueChanged(object sender, EventArgs e)
{
InitkryptonCheckedListBox1((string)assemblyComboBox.SelectedValue);
}
}
}