using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Project.Manager { public class DatabaseManagerSIDHistory { /// /// 최종파일 /// private String LastFileName; private DataSet1.SIDHistoryDataTable dt; private string baseDirName; /// /// 파일디비초기화작업(클라이언트 갯수만큼 버퍼를 확보한다) /// public DatabaseManagerSIDHistory(string basedirbname = "HistorySID") { LastFileName = string.Empty; dt = new DataSet1.SIDHistoryDataTable(); baseDirName = basedirbname; } //해당 결과를 버퍼에 추가한다. public Boolean Add(DataSet1.SIDHistoryRow dataRow, Boolean autoFlush = false) { //입력된 자료를 복사해서 버퍼에 넣는다. var newdr = this.dt.NewSIDHistoryRow(); foreach (string col in getDataColumnList()) { if (col.ToLower() == "idx") continue; newdr[col] = dataRow[col]; } this.dt.AddSIDHistoryRow(newdr); try { Flush(); //파일에 실제저장한다. return true; } catch (Exception ex) { PUB.log.AddE("history data add" + ex.Message); return false; } } /// /// 신규파일을 생성합니다. /// /// void MakeFile(string filename) { //파일이없다면 헤더를 만들어준다. var xml = new arUtil.XMLHelper(filename); xml.CreateFile(); } /// /// 저장해야할 컬럼명을 반환한다.(idx는 제외한다) /// /// public string[] getDataColumnList() { //저장하고자하는 순서를 미리 지정한다.(지정안된 자료는 알아서 저장된다) string[] reserveCols = new string[] { }; List cols = new List(); cols.AddRange(reserveCols); for (int i = 0; i < this.dt.Columns.Count; i++) { string colname = dt.Columns[i].ColumnName; if (reserveCols.Contains(colname)) continue; cols.Add(colname); } return cols.ToArray(); } public string GetFileName(string jobseqdate, string jobseqno, string sid) { var saveFileName = System.IO.Path.Combine(AR.SETTING.Data.Path_Data, baseDirName, jobseqdate.Substring(0, 4), jobseqdate.Substring(4, 2), jobseqdate.Substring(6, 2), string.Format("{0}_{1}_{2}", jobseqdate, jobseqno, sid)); return saveFileName; } public void Flush() { //데이터가없다면 처리하지 않음 if (this.dt.Rows.Count < 1) return; //쓸데이터를 모두 버퍼에 밀어넣는다. foreach (DataSet1.SIDHistoryRow dr in dt.Rows) { if (dr.RowState == System.Data.DataRowState.Deleted || dr.RowState == System.Data.DataRowState.Detached) continue; //lot date check //if (dr.time_lotstart.Year == 1982) dr.time_lotstart = DateTime.Now; //작업이 종료된 시간을 기준으로 파일을 생성한다. // if (dr.info_lot.isEmpty()) dr.info_lot = "NoLot"; //if (dr.info_stripid.isEmpty()) dr.info_stripid = "S" + dr.time_pcbstart.ToString("yyyyMMddHHmmss"); //string curdatestr = string.Format("{0:0000}\\{1:00}\\{2:00}\\{3}\\{4}", // dr.time_lotstart.Year, dr.time_lotstart.Month, dr.time_lotstart.Day, dr.info_lot,dr.info_stripid); //작업이 시작한 시간으로 데이터 파일을 저장해야함 var saveFileName = System.IO.Path.Combine(AR.SETTING.Data.Path_Data, baseDirName, dr.seqdate.Substring(0, 4), dr.seqdate.Substring(4, 2), dr.seqdate.Substring(6, 2), string.Format("{0}_{1}_{2}.csv", dr.seqdate, dr.seqno, dr.sid)); dr.EndEdit(); //저장할 파일 체크 System.IO.FileInfo fi = new System.IO.FileInfo(saveFileName); //폴더새엇ㅇ if (!fi.Directory.Exists) fi.Directory.Create(); //파일없는경우 헤더생성 // if (!fi.Exists) MakeFile(fi.FullName); //파일에기록 try { //general info //데이터는 csv 형태로 저장한다 var line = string.Format("{2},{0},{1},{3}\r\n", dr.rid, dr.qty, dr.time.ToString("yyyy-MM-dd HH:mm:ss"), dr.rev); System.IO.File.AppendAllText(fi.FullName, line, System.Text.Encoding.UTF8); } catch (Exception ex) { PUB.log.AddE("DBMAN:FLUSH:" + ex.Message); return; } PUB.log.Add("DATABASE", string.Format("◆ Data Saved : {0}", fi.Name)); } dt.Clear(); dt.AcceptChanges(); } /// /// 지정된 파일의 모든 내용을 읽어서 DataTable 로 반환합니다. /// /// /// public DataSet1.SIDHistoryDataTable GetDatas(System.IO.FileInfo[] files) { DataSet1.SIDHistoryDataTable retval = new DataSet1.SIDHistoryDataTable(); //모든파일을 대상으로한다. if (files != null && files.Count() > 0) { foreach (var file in files) { var lines = System.IO.File.ReadAllLines(file.FullName, System.Text.Encoding.UTF8); foreach (var line in lines) { var onlyName = file.Name.Replace(file.Extension, "").Split('_'); if (String.IsNullOrEmpty(line.Trim())) continue; var buf = line.Split(','); var newdr = retval.NewSIDHistoryRow(); newdr.seqdate = onlyName[0]; newdr.seqno = onlyName[1]; newdr.sid = onlyName[2]; newdr.time = DateTime.Parse(buf[0]); newdr.rid = buf[1]; int qty, rev; if (int.TryParse(buf[2], out qty)) newdr.qty = qty; else newdr.qty = 0; if (buf.Length > 3 && int.TryParse(buf[3], out rev)) newdr.rev = rev; else newdr.rev = 0; //newdr.qty = int.Parse(buf[2]); //newdr.rev = int.Parse(buf[3]); retval.AddSIDHistoryRow(newdr); } } } retval.AcceptChanges(); return retval; } public System.IO.FileInfo[] Getfiles(string seqdate, string seqno) { var path = System.IO.Path.Combine(AR.SETTING.Data.Path_Data, baseDirName, seqdate.Substring(0, 4), seqdate.Substring(4, 2), seqdate.Substring(6, 2)); var di = new System.IO.DirectoryInfo(path); if (di.Exists == false) return null; else return di.GetFiles(string.Format("{0}_{1}_*.csv", seqdate, seqno)); } /// /// 지정된 기간사이의 파일명을 반환합니다. /// /// 검색시작일(시간은 적용안함) /// 검색종료일(시간은 적용안함) /// 검색필터 /// 장치번호 /// 검색바코드 /// //public List Getfiles(DateTime sdate, DateTime edate) //{ // List retfiles = new List(); // //날짜사이의 모든 파일을 대상으로해야함 // string sd = sdate.ToShortDateString(); // string ed = edate.ToShortDateString(); // int sy = sdate.Year; // int ey = edate.Year; // int sm = sdate.Month; // int em = edate.Month; // int sday = sdate.Day; // int eday = edate.Day; // Boolean endtast = false; // for (int y = sy; y <= ey; y++) // { // for (int m = 1; m <= 12; m++) // { // for (int d = 1; d <= 31; d++) // { // string daystr = string.Format("{0:0000}-{1:00}-{2:00}", y, m, d); // if (ed == daystr) endtast = true; //마지막 날짜이다. // if (y == sy && m < sm) continue; //시작년도 시작월 이전의 자료라면 넘어간다. // else if (y == sy && m == sm && d < sday) continue; //시작년도 시작월 시작일 이전의 자료라면 넘어간다. // var path = new System.IO.DirectoryInfo( // System.IO.Path.Combine(COMM.SETTING.Data.Path_Data, baseDirName, daystr.Replace("-", "\\"))); // if (path.Exists == false) continue; // var files = path.GetFiles("*.csv", System.IO.SearchOption.TopDirectoryOnly); // if (files != null && files.Length > 0) retfiles.AddRange(files.OrderBy(t => t.Name).ToList()); // if (endtast) // break; // TODO: might not be correct. Was : Exit For // } // if (endtast) // break; // TODO: might not be correct. Was : Exit For // } // if (endtast) // break; // TODO: might not be correct. Was : Exit For // } // return retfiles; //} } }