277 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			277 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| 
 | |
| namespace Project.Manager
 | |
| {
 | |
|     public class DatabaseManagerSIDHistory
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// 최종파일
 | |
|         /// </summary>
 | |
|         private String LastFileName;
 | |
|         private DataSet1.SIDHistoryDataTable dt;
 | |
|         private string baseDirName;
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 파일디비초기화작업(클라이언트 갯수만큼 버퍼를 확보한다)
 | |
|         /// </summary>
 | |
|         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;
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 신규파일을 생성합니다.
 | |
|         /// </summary>
 | |
|         /// <param name="filename"></param>
 | |
|         void MakeFile(string filename)
 | |
|         {
 | |
|             //파일이없다면 헤더를 만들어준다.
 | |
|             var xml = new AR.XMLHelper(filename);
 | |
|             xml.CreateFile();
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 저장해야할 컬럼명을 반환한다.(idx는 제외한다)
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         public string[] getDataColumnList()
 | |
|         {
 | |
|             //저장하고자하는 순서를 미리 지정한다.(지정안된 자료는 알아서 저장된다)
 | |
|             string[] reserveCols = new string[] { };
 | |
|             List<String> cols = new List<string>();
 | |
|             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.GetDataPath(), 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.GetDataPath(), 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();
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 지정된 파일의 모든 내용을 읽어서 DataTable 로 반환합니다.
 | |
|         /// </summary>
 | |
|         /// <param name="files"></param>
 | |
|         /// <returns></returns>
 | |
|         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.GetDataPath(), 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));
 | |
|         }
 | |
| 
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 지정된 기간사이의 파일명을 반환합니다.
 | |
|         /// </summary>
 | |
|         /// <param name="sdate">검색시작일(시간은 적용안함)</param>
 | |
|         /// <param name="edate">검색종료일(시간은 적용안함)</param>
 | |
|         /// <param name="extFilter">검색필터</param>
 | |
|         /// <param name="SearchNo">장치번호</param>
 | |
|         /// <param name="SearchBarcode">검색바코드</param>
 | |
|         /// <returns></returns>
 | |
|         //public List<System.IO.FileInfo> Getfiles(DateTime sdate, DateTime edate)
 | |
|         //{
 | |
|         //    List<System.IO.FileInfo> retfiles = new List<System.IO.FileInfo>();
 | |
|         //    //날짜사이의 모든 파일을 대상으로해야함
 | |
| 
 | |
|         //    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;
 | |
|         //}
 | |
|     }
 | |
| }
 | 
