using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace Project.Manager { public struct sModelInfo { public string Group; public string QRCode; public int QRx; public int QRy; public string Asset; public string Memo; public void Clear() { Group = string.Empty; QRCode = string.Empty; QRx = 0; QRy = 0; Asset = string.Empty; Memo = string.Empty; } } public class ModelManager { public enum eModelType : int { Users = 0, Model, } public DataSet1 dataSet; private string[] fn; public ModelManager() { string path = AppDomain.CurrentDomain.BaseDirectory + "Model"; if (!System.IO.Directory.Exists(path)) System.IO.Directory.CreateDirectory(path); this.fn = new string[] { path + "\\Users.csv", path + "\\Model.csv" }; dataSet = new DataSet1(); } public void LoadData(eModelType model) { //set filename string filename = fn[(int)model]; int lineCount = 0; string buffer = string.Empty; Pub.log.Add("ModelData Load : " + model.ToString() + "fn=" + filename); //read file var fi = new FileInfo(filename); if (fi.Exists == false) { Pub.log.AddE(string.Format("▣ No Data",model)); return; } lineCount = 0; try { buffer = System.IO.File.ReadAllText(fi.FullName, System.Text.Encoding.Default); } catch (Exception ex) { buffer = string.Empty; Pub.log.AddE(string.Format("ItemData Error File={0},Message={1}", filename, ex.Message)); return; } //존재하는 컬럼확인을 위해 미리 저장함 List dbCols = new List(); foreach (System.Data.DataColumn col in dataSet.Tables[model.ToString()].Columns) dbCols.Add(col.ColumnName); List Cols = new List(); foreach (string items in buffer.Split('\r')) { lineCount += 1; var line = items.Replace("\r", "").Replace("\n", ""); if (line.Trim() == "" || line.StartsWith("ver")) continue; //빈줄과 버젼표기는 제거한다. string[] buf = line.Split(','); //첫줄에는 컬럼명이 들어있다. if (Cols.Count < 1) { foreach (string colname in buf) { if (colname.isEmpty()) continue; //비어있는값은 처리하지 않는다. Cols.Add(colname); } continue; } //데이터를 각 컬럼에 넣는다. System.Data.DataRow dr = dataSet.Tables[model.ToString()].NewRow(); //비젼속성은 컬럼명이 v_로 시작한다. for (int i = 0; i < Cols.Count; i++) //0번은 Mccode이므로 제외한다. { try { if (dbCols.IndexOf(Cols[i]) == -1) continue; //존재하지 않는 컬럼은 제외한다. if (Cols[i].ToUpper() == "IDX") continue; dr[Cols[i]] = buf[i+1]; } catch (Exception ex) { Pub.log.AddE("Item Load Error:" + ex.Message); } } try { if (dr.RowState == System.Data.DataRowState.Detached) { dataSet.Tables[model.ToString()].Rows.Add(dr); } else if (dr.RowState != System.Data.DataRowState.Deleted) dr.EndEdit(); } catch (Exception ex) { Pub.log.AddE("Load Item file" + ex.Message); } } dataSet.AcceptChanges(); } /// /// project , model read from file /// public void Load() { //데이터셋 초기화 if (dataSet == null) dataSet = new DataSet1(); else dataSet.Clear(); //파일로부터 데이터를 읽어들인다. this.LoadData(eModelType.Users); this.LoadData(eModelType.Model); this.dataSet.AcceptChanges(); System.Text.StringBuilder sb = new StringBuilder(); sb.Append("model data list"); for(int i = 0; i< dataSet.Tables.Count;i++) { var dt = dataSet.Tables[i]; if (dt.TableName.ToLower() == "resultdata") continue; sb.AppendLine(dt.TableName + " : " + dt.Rows.Count.ToString() + "건"); } Pub.log.AddI(sb.ToString()); } public void Save() { this.dataSet.AcceptChanges(); System.IO.DirectoryInfo di = new DirectoryInfo (Util.CurrentPath + "\\Model"); if (!di.Exists) di.Create(); SaveData(eModelType.Users); SaveData(eModelType.Model); } public void SaveData(eModelType model) { var data = new StringBuilder(); data.AppendLine("ver,:" + model.ToString()); //version List baseCols = new List(); if (model == eModelType.Users) baseCols.AddRange(new string[] { "No", "Name", "Memo" }); else if (model == eModelType.Model) baseCols.AddRange(new string[] { "Group", "Asset" }); List cols = new List(); foreach (System.Data.DataColumn col in this.dataSet.Tables[model.ToString()].Columns) { string colname = col.ColumnName.ToLower(); if (colname == "idx" || colname.StartsWith("_")) continue; //기본열은 제외한다. if (baseCols.IndexOf(col.ColumnName) >= 0) continue; cols.Add(col.ColumnName); } //열을 정렬해서 추가한다. var bb = cols.OrderBy(t => t); baseCols.AddRange(bb); //정렬된 열을 추가해준다. foreach (string colname in baseCols) data.Append("," + colname); data.AppendLine(); //output data(글로벌 셋팅하고 MC코드값만 취한다)v var dt = dataSet.Tables[model.ToString()]; var drows = dt.Select("", "idx"); foreach (var dr in drows) { foreach (string colname in baseCols) //지정된 열제목의 데이터를 가져온다. { data.Append(","); if (dr[colname] != DBNull.Value) data.Append(dr[colname].ToString()); else if (dt.Columns[colname].DataType == typeof(double) || dt.Columns[colname].DataType == typeof(Int32) || dt.Columns[colname].DataType == typeof(UInt32) || dt.Columns[colname].DataType == typeof(Single) || dt.Columns[colname].DataType == typeof(byte) || dt.Columns[colname].DataType == typeof(Boolean) || dt.Columns[colname].DataType == typeof(Int16) || dt.Columns[colname].DataType == typeof(UInt16)) { if (dt.Columns[colname].DataType == typeof(Boolean)) data.Append("False"); else data.Append("0"); } else data.Append(""); } data.AppendLine(); } try { System.IO.File.WriteAllText(fn[(int)model], data.ToString(), System.Text.Encoding.Default); Pub.log.AddAT("Save "+ model.ToString()+" Parameter - OK"); } catch (Exception ex) { Util.MsgE("Save Error\r\n" + ex.Message); Pub.log.AddE("Save Error :: " + ex.Message); } } public DataSet1.UsersRow GetUser(string no) { var datas = this.dataSet.Users.Where(t => t.No == no); if (datas.Count() < 1) return null; return datas.First(); } public DataSet1.UsersRow[] GetUsers() { var datas = dataSet.Users.Select("", "No"); if (datas.Length < 1) return null; return datas as DataSet1.UsersRow[]; } public DataSet1.ModelRow GetModel(string Asset) { if (Asset.isEmpty()) return null; if (dataSet.Model == null || dataSet.Model.Rows.Count < 1) return null; var datas = dataSet.Model.Where(t => t.Asset == Asset).ToArray(); if (datas.Length != 1) return null; return datas[0]; } public sModelInfo GetModelInfo(string qrData) { sModelInfo retval = new sModelInfo(); retval.Clear(); var model = GetModel(qrData); if(model != null) { retval.Asset = model.Asset; retval.Memo = model.Memo; } return retval; } } }