Files
2026-08-19 14:11:17 +08:00

287 lines
12 KiB
C#

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);
}
}
}