using JavaCode.cs; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; namespace JavaCode { public partial class FrmEtown : Form { #region 成员变量+构造函数 private static List excludes = new List() { "gid", "eventid", "parentid", "dir", "dep", "createuser", "createtime", "updateuser", "updatetime", "geom", "remarks", "source", "fromsystem", "frequency", "objectid", "shape_leng", "shape_area" }; string baseDir = AppDomain.CurrentDomain.BaseDirectory; private PostgreHelper _dbHelper; private List _list; public FrmEtown() { InitializeComponent(); this.Load += new System.EventHandler(this.FrmEtown_Load); } private void FrmEtown_Load(object sender, EventArgs e) { _dbHelper = new PostgreHelper(DbEnum.etown); } #endregion #region 查询表结构: private void btnReadTab_Click(object sender, EventArgs e) { try { string tabName = this.txtTabPre.Text.Trim(); string tabFilter = string.IsNullOrEmpty(tabName) ? "" : string.Format("and c.relname like '{0}%'", tabName); string sql = string.Format("select c.relname \"tab\", cast(obj_description(c.oid) as varchar) \"desc\", a.attnum \"num\", a.attname \"col\", t.typname \"type\", d.description \"bak\" from pg_attribute a left join pg_description d on d.objoid = a.attrelid and d.objsubid = a.attnum left join pg_class c on a.attrelid = c.oid left join pg_type t on a.atttypid = t.oid where a.attnum >= 0 and reltype>0 and relnamespace in ({0}) {1} and position('pg.dropped' in a.attname) = 0 order by c.relname desc, a.attnum asc", this.txtTabNS.Text.Trim(), tabFilter); DataTable dt = _dbHelper.GetDataTable(sql, null); _list = ModelHandler.FillModel(dt); if (_list == null || _list.Count == 0) { MessageBox.Show("没有查询到数据!"); return; } List tabList = new List(); foreach (TabInfo ti in _list) { if (!tabList.Contains(ti.tab)) { tabList.Add(ti.tab); } } this.tabList.DataSource = tabList; } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void btnAll_Click(object sender, EventArgs e) { for (int i = 0; i < this.tabList.Items.Count; i++) { this.tabList.SetSelected(i, true); } } private void btnAnti_Click(object sender, EventArgs e) { for (int i = 0; i < this.tabList.Items.Count; i++) { bool flag = this.tabList.GetSelected(i); this.tabList.SetSelected(i, !flag); } } private void btnNone_Click(object sender, EventArgs e) { for (int i = 0; i < this.tabList.Items.Count; i++) { this.tabList.SetSelected(i, false); } } private void tabList_SelectedIndexChanged(object sender, EventArgs e) { string tab = this.tabList.SelectedItem as string; List tabs = (from p in _list where p.tab == tab orderby p.num select p).ToList(); this.dgvTab.DataSource = new BindingList(tabs); if (tabs != null && tabs.Count > 1) { this.dgvTab.Rows[1].Selected = true; this.dgvTab.CurrentCell = this.dgvTab.Rows[1].Cells[0]; } } #endregion #region 按钮事件 private void btnGeneMapper_Click(object sender, EventArgs e) { try { string path = Path.Combine(baseDir, "Result\\Mapper"); List names = GetTabList(); foreach (string name in names) { List tabs = GetTabInfo(name); GenerateMapper(path, name, tabs); } OpenFolder(path); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void btnGeneEntity_Click(object sender, EventArgs e) { try { string path = Path.Combine(baseDir, "Result\\Entity"); List names = GetTabList(); foreach (string name in names) { List tabs = GetTabInfo(name); GenerateEntity(path, name, tabs); } OpenFolder(path); } catch (Exception ex) { MessageBox.Show(ex.Message); } } #endregion #region 生成 Mapper private void GenerateMapper(string path, string name, List tabs) { if (!Directory.Exists(path)) Directory.CreateDirectory(path); string tabName = this.txtTabPrefix.Text.Trim() + name; string shortName = GetEntityName(name); string mapperNS = this.txtMapperNS.Text.Trim(); string mapperName = shortName + "Mapper"; string entityNS = this.txtEntityNS.Text.Trim(); string entityName = shortName + "Entity"; string ns = this.txtTabPrefix.Text.Trim(); string bak = shortName; if (!string.IsNullOrEmpty(tabs[0].desc)) bak = tabs[0].desc.Replace("表", ""); List dicts = SelectSysDicts(tabName); if (dicts != null) bak = dicts[0].descr; string javaFile = "Mapper.java"; string xml = File.ReadAllText(Path.Combine(baseDir, "EtownTemplate\\" + javaFile)); xml = xml .Replace("{mapperNS}", mapperNS) .Replace("{mapperName}", mapperName) .Replace("{entityNS}", entityNS) .Replace("{entityName}", entityName) .Replace("{ns}", ns) .Replace("{bak}", bak) .Replace("{date}", DateTime.Now.ToString("yyyy-MM-dd")); string fileName = shortName + "Mapper.java"; File.WriteAllText(Path.Combine(path, fileName), xml); } #endregion #region 生成 Entity private void GenerateEntity(string path, string name, List tabs) { if (!Directory.Exists(path)) Directory.CreateDirectory(path); string tabName = this.txtTabPrefix.Text.Trim() + name; //string shortName = NameConvert(name, true); string shortName = GetEntityName(name); string entityNS = this.txtEntityNS.Text.Trim(); string entityName = shortName + "Entity"; string ns = this.txtTabPrefix.Text.Trim(); long uid = (long)Math.Floor((new Random()).NextDouble() * 1000000000000000000D); string bak = shortName; if (!string.IsNullOrEmpty(tabs[0].desc)) bak = tabs[0].desc.Replace("表", ""); List dicts = SelectSysDicts(tabName); if (dicts != null) bak = dicts[0].descr; string javaFile = "Entity.java"; string xml = File.ReadAllText(Path.Combine(baseDir, "EtownTemplate\\" + javaFile)); xml = xml .Replace("{entityNS}", entityNS) .Replace("{entityName}", entityName) .Replace("{bak}", bak) .Replace("{tabName}", tabName) .Replace("{ns}", ns) .Replace("{uid}", uid.ToString()) .Replace("{date}", DateTime.Now.ToString("yyyy-MM-dd")); StringBuilder sb = new StringBuilder(); sb.Append("\r\n public " + entityName + "() {\r\n }\r\n"); foreach (TabInfo ti in tabs) { string type = GetJavaType(ti); if (excludes.Contains(ti.col)) continue; if (ti.col == "class") { MessageBox.Show(ti.tab + "." + ti.col); return; } sb.Append("\r\n"); string colName = NameConvert(ti.col, false); //if ("references" == colName) sb.Append(" @TableField(value = \"\\\"references\\\"\")").Append("\r\n"); SysDict dict = FindSysDict(dicts, ti.col); string alias = null == dict || string.IsNullOrEmpty(dict.alias) ? (string.IsNullOrEmpty(ti.bak) ? "" : ti.bak.Trim()) : dict.alias.Trim(); sb.Append(" @ApiModelProperty(value = \"" + alias + "\")\r\n"); sb.Append(" private " + type + " " + colName + ";\r\n"); } foreach (TabInfo ti in tabs) { if (excludes.Contains(ti.col)) continue; string type = GetJavaType(ti); string col1 = NameConvert(ti.col, true); string col2 = NameConvert(ti.col, false); sb.Append("\r\n public " + type + " get" + col1 + "() {\r\n return " + col2 + ";\r\n }\r\n"); sb.Append("\r\n public void set" + col1 + "(" + type + " " + col2 + ") {\r\n this." + col2 + " = " + col2 + ";\r\n }\r\n"); } sb.Append("}\r\n"); sb.Insert(0, xml); string fileName = shortName + "Entity.java"; File.WriteAllText(Path.Combine(path, fileName), sb.ToString()); } #endregion #region 生成所有 private void btnGeneAll_Click(object sender, EventArgs e) { try { string mapperPath = Path.Combine(baseDir, "Result\\Mapper"); string entityPath = Path.Combine(baseDir, "Result\\Entity"); List names = GetTabList(); foreach (string name in names) { try { List tabs = GetTabInfo(name); GenerateMapper(mapperPath, name, tabs); GenerateEntity(entityPath, name, tabs); } catch (Exception ec) { MessageBox.Show(name + "\r\n" + ec.Message); } } string path = Path.Combine(baseDir, "Result"); OpenFolder(path); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void txtTabPrefix_TextChanged(object sender, EventArgs e) { txtChanged(sender, e); } private void txtChanged(object sender, EventArgs e) { string pre = txtTabPrefix.Text.Replace(".", "").Trim(); txtMapperNS.Text = "com.smartearth.system.mapper.sd".Replace("sd", pre).Replace("sd", pre); txtEntityNS.Text = "com.smartearth.system.domain.sd".Replace("sd", pre).Replace("sd", pre); } #endregion #region 公共方法 private List SelectSysDicts(string table) { string[] strs = table.Split(new char[] { '.' }); string sql = string.Format("select id,ns||'.'||tab table, descr, field, alias, type from se.sys_dict where ns='{0}' and tab='{1}' order by orderid", strs[0], strs[1]); DataTable dt = _dbHelper.GetDataTable(sql, null); List list = ModelHandler.FillModel(dt); return null == list || list.Count == 0 ? null : list; } private SysDict FindSysDict(List list, string field) { if (null == list) return null; return (from sd in list where sd.field == field select sd).FirstOrDefault(); } private List GetTabList() { List list = new List(); for (int i = 0, c = this.tabList.SelectedItems.Count; i < c; i++) { string item = this.tabList.SelectedItems[i] as String; if (!string.IsNullOrEmpty(item)) { list.Add(item); } } return list; } private List GetTabInfo(string name) { List tabs = (from p in _list where p.tab == name orderby p.num select p).ToList(); return tabs; } private static string GetEntityName(string name) { string[] strs = name.ToLower().Split(new char[] { '_' }); for (int i = 0, c = strs.Length; i < c; i++) { strs[i] = ToUpperFirst(strs[i]); } return string.Join("", strs); } private static string NameConvert(string name, bool firstUpper) { string[] strs = name.ToLower().Split(new char[] { '_' }); for (int i = 0, c = strs.Length; i < c; i++) { if (0 == i && !firstUpper) continue; strs[i] = ToUpperFirst(strs[i]); } return string.Join("", strs); } public static string ToUpperFirst(string str) { return Regex.Replace(str, @"^\w", t => t.Value.ToUpper()); } private string GetJavaType(TabInfo ti) { switch (ti.type) { case "timestamptz": case "timestamp": return "Timestamp"; case "date": return "LocalDate"; case "time": return "LocalTime"; case "float4": // float return "Float"; case "float8": // double return "Double"; case "bool": // boolean return "Boolean"; case "numeric": return "BigDecimal"; case "int8": // long return "Long"; case "int2": case "int4": // int return "Integer"; default: // text, varchar return "String"; } } private bool HasGeom(List tabs) { foreach (TabInfo ti in tabs) { if (ti.col == "geom") return true; } return false; } private static void OpenFolder(string folderPath) { if (string.IsNullOrEmpty(folderPath)) return; Process process = new Process(); ProcessStartInfo psi = new ProcessStartInfo("Explorer.exe"); psi.Arguments = folderPath; process.StartInfo = psi; try { process.Start(); } catch (Exception ex) { throw ex; } finally { process.Close(); } } #endregion } }