370 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			370 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| 
 | |
| namespace Project.Manager
 | |
| {
 | |
|     public class DatabaseManagerCount
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// 파일검색방법
 | |
|         /// </summary>
 | |
|         public enum eFileSearchMode
 | |
|         {
 | |
|             Normal,
 | |
|             Project,
 | |
|             Model,
 | |
|             MCCode,
 | |
|             Barcode,
 | |
|             All,
 | |
|         }
 | |
| 
 | |
|         public enum eStripSearchResult
 | |
|         {
 | |
|             None,
 | |
|             OK,
 | |
|             NG,
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 최종파일
 | |
|         /// </summary>
 | |
|         private String LastFileName;
 | |
|         public string dataPath = string.Empty;
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 파일디비초기화작업(클라이언트 갯수만큼 버퍼를 확보한다)
 | |
|         /// </summary>
 | |
|         public DatabaseManagerCount()
 | |
|         {
 | |
|             LastFileName = string.Empty;
 | |
|         }
 | |
| 
 | |
|         public Boolean UpdateCountDate(DateTime jobStartTime, int shutIndex, int slotIndex, int count = 1)
 | |
|         {
 | |
|             //대상파일을 설정한다.
 | |
|             var fileName = System.IO.Path.Combine(AR.SETTING.Data.GetDataPath(), "Count",
 | |
|                 jobStartTime.Year.ToString("0000"),
 | |
|                 jobStartTime.Month.ToString("00"),
 | |
|                 jobStartTime.Day.ToString("00"),
 | |
|                 "S" + (shutIndex == 0 ? "F" : "B") + "_" + slotIndex.ToString("0000") + ".xml");
 | |
|             return UpdateCount(fileName, "", count);
 | |
|         }
 | |
| 
 | |
|         public Boolean UpdateCountDM(string DataMatrix, int count = 1)
 | |
|         {
 | |
|             string ww, seq;
 | |
|             PUB.splitID(DataMatrix, out ww, out seq);
 | |
| 
 | |
|             //대상파일을 설정한다.
 | |
|             try
 | |
|             {
 | |
|                 var fileName = "";
 | |
|                 if (seq.Length > 2)
 | |
|                 {
 | |
|                     fileName = System.IO.Path.Combine(this.dataPath, "Count", ww, seq.Substring(0, 2), seq + ".xml");
 | |
|                 }
 | |
|                 else
 | |
|                     fileName = System.IO.Path.Combine(this.dataPath, "Count", ww, seq + ".xml");
 | |
| 
 | |
|                 return UpdateCount(fileName, DataMatrix, count);
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 PUB.log.AddE("UpdateCountDM(" + DataMatrix + ") " + ex.Message);
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public enum eCountTarget
 | |
|         {
 | |
|             Year = 0,
 | |
|             Month,
 | |
|             Day
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 전체수량을 업데이트 합니다.
 | |
|         /// </summary>
 | |
|         public void AddTotalCount(UInt32 New, UInt32 Good, UInt32 Over, UInt32 Err, UInt32 Empty, string modelName)
 | |
|         {
 | |
|             AddTotalCount(eCountTarget.Year, New, Good, Over, Err, Empty, "");
 | |
|             AddTotalCount(eCountTarget.Month, New, Good, Over, Err, Empty, "");
 | |
|             AddTotalCount(eCountTarget.Day, New, Good, Over, Err, Empty, "");
 | |
| 
 | |
|             //모델별로 추가 기록을 해준다
 | |
|             if (modelName != "")
 | |
|             {
 | |
|                 AddTotalCount(eCountTarget.Year, New, Good, Over, Err, Empty, modelName);
 | |
|                 AddTotalCount(eCountTarget.Month, New, Good, Over, Err, Empty, modelName);
 | |
|                 AddTotalCount(eCountTarget.Day, New, Good, Over, Err, Empty, modelName);
 | |
|             }
 | |
|             
 | |
|             //기존값에 해당값을 누적만 시킨다.
 | |
|         }
 | |
|         private void AddTotalCount(eCountTarget target, UInt32 New, UInt32 good, UInt32 Over, UInt32 Err, UInt32 Empty, string modelName)
 | |
|         {
 | |
|             DateTime dt = DateTime.Now;
 | |
|             var filename = "";
 | |
|             if (target == eCountTarget.Year)
 | |
|             {
 | |
|                 filename = System.IO.Path.Combine(this.dataPath, "Count",
 | |
|                 dt.Year.ToString("0000"), "count.xml");
 | |
|             }
 | |
|             else if (target == eCountTarget.Month)
 | |
|             {
 | |
|                 filename = System.IO.Path.Combine(this.dataPath, "Count",
 | |
|                 dt.Year.ToString("0000"),
 | |
|                 dt.Month.ToString("00"), "count.xml");
 | |
|             }
 | |
|             else if (target == eCountTarget.Day)
 | |
|             {
 | |
|                 filename = System.IO.Path.Combine(this.dataPath, "Count",
 | |
|                 dt.Year.ToString("0000"),
 | |
|                 dt.Month.ToString("00"),
 | |
|                 dt.Day.ToString("00"), "count.xml");
 | |
|             }
 | |
| 
 | |
|             var keyname = modelName == "" ? "userdata" : modelName;
 | |
| 
 | |
|             //파일이 없다면 생성한다
 | |
|             var fi = new System.IO.FileInfo(filename);
 | |
|             if (fi.Directory.Exists == false) fi.Directory.Create();
 | |
|             var xml = new AR.XMLHelper(fi.FullName);
 | |
|             if (xml.Exist() == false) xml.CreateFile();
 | |
| 
 | |
|             var str_new = xml.get_Data(keyname,"cnt_new");
 | |
|             var str_good = xml.get_Data(keyname, "cnt_good");
 | |
|             var str_over = xml.get_Data(keyname, "cnt_over");
 | |
|             var str_empty = xml.get_Data(keyname, "cnt_empty");
 | |
|             var str_err = xml.get_Data(keyname, "cnt_error");
 | |
|             if (str_new == "") str_new = "0";
 | |
|             if (str_good == "") str_good = "0";
 | |
|             if (str_over == "") str_over = "0";
 | |
|             if (str_empty == "") str_empty = "0";
 | |
|             if (str_err == "") str_err = "0";
 | |
| 
 | |
|             var cnt_New = UInt32.Parse(str_new);
 | |
|             var cnt_good = UInt32.Parse(str_good);
 | |
|             var cnt_Over = UInt32.Parse(str_over);
 | |
|             var cnt_Empty = UInt32.Parse(str_empty);
 | |
|             var cnt_Err = UInt32.Parse(str_err);
 | |
| 
 | |
|             //기존수량에 누적
 | |
|             cnt_New += New;
 | |
|             cnt_good += good;
 | |
|             cnt_Over += Over;
 | |
|             cnt_Empty += Empty;
 | |
|             cnt_Err += Err;
 | |
| 
 | |
|             //값을 더해서 다시 기록해준다.
 | |
|             xml.set_Data(keyname, "cnt_new", (cnt_New).ToString());
 | |
|             xml.set_Data(keyname, "cnt_good", cnt_good.ToString());
 | |
|             xml.set_Data(keyname, "cnt_over", cnt_Over.ToString());
 | |
|             xml.set_Data(keyname, "cnt_empty", cnt_Empty.ToString());
 | |
|             xml.set_Data(keyname, "cnt_error", cnt_Err.ToString());
 | |
|             string msg;
 | |
|             xml.Save(out msg);
 | |
|         }
 | |
| 
 | |
|         public struct eCountData
 | |
|         {
 | |
|             public UInt32 NewCount;
 | |
|             public UInt32 GoodCount;
 | |
|             public UInt32 OverCount;
 | |
|             public UInt32 EmptyCount;
 | |
|             public UInt32 ErrorCount;
 | |
|             public UInt32 TotalCount
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return NewCount + GoodCount + OverCount + EmptyCount + ErrorCount;
 | |
|                 }
 | |
|             }
 | |
|             public void clear()
 | |
|             {
 | |
|                 NewCount = 0;
 | |
|                 GoodCount = 0;
 | |
|                 OverCount = 0;
 | |
|                 EmptyCount = 0;
 | |
|                 ErrorCount = 0;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public eCountData ReadTotalCount(eCountTarget target,string modelName)
 | |
|         {
 | |
|             var cnt = new eCountData();
 | |
|             cnt.clear();
 | |
| 
 | |
|             DateTime dt = DateTime.Now;
 | |
|             var fi = "";
 | |
|             if (target == eCountTarget.Year)
 | |
|             {
 | |
|                 fi = System.IO.Path.Combine(this.dataPath, "Count",
 | |
|                 dt.Year.ToString("0000"), "count.xml");
 | |
|             }
 | |
|             else if (target == eCountTarget.Month)
 | |
|             {
 | |
|                 fi = System.IO.Path.Combine(this.dataPath, "Count",
 | |
|                 dt.Year.ToString("0000"),
 | |
|                 dt.Month.ToString("00"), "count.xml");
 | |
|             }
 | |
|             else if (target == eCountTarget.Day)
 | |
|             {
 | |
|                 fi = System.IO.Path.Combine(this.dataPath, "Count",
 | |
|                 dt.Year.ToString("0000"),
 | |
|                 dt.Month.ToString("00"),
 | |
|                 dt.Day.ToString("00"), "count.xml");
 | |
|             }
 | |
| 
 | |
|             var appkey = modelName == "" ? "userdata" : modelName;
 | |
| 
 | |
|             //년도데이터가없다면 처리안함
 | |
|             if (System.IO.File.Exists(fi))
 | |
|             {
 | |
|                 var xmlYear = new AR.XMLHelper(fi);
 | |
|                 var str_new = xmlYear.get_Data(appkey,"cnt_new");
 | |
|                 var str_good = xmlYear.get_Data(appkey, "cnt_good");
 | |
|                 var str_over = xmlYear.get_Data(appkey, "cnt_over");
 | |
|                 var str_empty = xmlYear.get_Data(appkey, "cnt_empty");
 | |
|                 var str_err = xmlYear.get_Data(appkey, "cnt_error");
 | |
| 
 | |
|                 if (str_new == "") str_new = "0";
 | |
|                 if (str_good == "") str_good = "0";
 | |
|                 if (str_over == "") str_over = "0";
 | |
|                 if (str_empty == "") str_empty = "0";
 | |
|                 if (str_err == "") str_err = "0";
 | |
| 
 | |
|                 cnt.NewCount = UInt32.Parse(str_new);
 | |
|                 cnt.GoodCount = UInt32.Parse(str_good);
 | |
|                 cnt.OverCount = UInt32.Parse(str_over);
 | |
|                 cnt.EmptyCount = UInt32.Parse(str_empty);
 | |
|                 cnt.ErrorCount = UInt32.Parse(str_err);
 | |
|             }
 | |
| 
 | |
|             return cnt;
 | |
|         }
 | |
| 
 | |
|         //해다 자료가 있다면 수량을 올려주고, 그렇지 않다면 파일을 생성해준다.
 | |
|         private Boolean UpdateCount(string fileName, string DataMatrix, int count = 1)
 | |
|         {
 | |
|             var fi = new System.IO.FileInfo(fileName);
 | |
| 
 | |
|             try
 | |
|             {
 | |
|                 var xml = new AR.XMLHelper(fileName);
 | |
|                 var newCount = count;
 | |
|                 if (fi.Exists == false)
 | |
|                 {
 | |
|                     //신규이다
 | |
|                     if (fi.Directory.Exists == false) fi.Directory.Create();
 | |
| 
 | |
|                     //생성해서 추가한다
 | |
|                     xml.CreateFile();
 | |
|                     xml.set_Data("id", DataMatrix);
 | |
|                     newCount = 2;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     //기존에 있으므로 수량을 읽어서 증가시킨다.
 | |
|                     int curCnt;
 | |
|                     var cntStr = xml.get_Data("count");
 | |
|                     if (int.TryParse(cntStr, out curCnt) == false)
 | |
|                     {
 | |
|                         curCnt = 2;
 | |
|                         PUB.log.AddE("Failed to read existing usage count. Counter string=" + cntStr + ". Setting to default value(1)");
 | |
|                     }
 | |
|                     newCount = curCnt + newCount;
 | |
|                 }
 | |
|                 xml.set_Data("count", newCount.ToString());
 | |
| 
 | |
|                 //이수량입력되는 시점의 데이터를 기록한다  200117
 | |
|                 string saveMssage;
 | |
|                 xml.set_Data("History" + newCount.ToString("000"), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
 | |
|                 xml.Save(out saveMssage);
 | |
| 
 | |
|                 LastFileName = fileName;
 | |
|                 return true;
 | |
|             }
 | |
|             catch
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
|         
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 지정된 파일의 모든 내용을 읽어서 DataTable 로 반환합니다.
 | |
|         /// </summary>
 | |
|         /// <param name="files"></param>
 | |
|         /// <returns></returns>
 | |
|         public Dictionary<String, int> GetDatas(int sYear, int sWorkWeek, int eYear, int eWorkWeek, string searchDataMatrix = "")
 | |
|         {
 | |
|             var retval = new Dictionary<String, int>();
 | |
|             //모든파일을 대상으로한다.
 | |
| 
 | |
|             List<System.IO.FileInfo> retfiles = new List<System.IO.FileInfo>();
 | |
| 
 | |
|             //날짜사이의 모든 파일을 대상으로해야함
 | |
|             int sy = sYear;
 | |
|             int ey = eYear;
 | |
|             int sw = sWorkWeek;
 | |
|             int ew = eWorkWeek;
 | |
| 
 | |
|             int eym = ey * 100 + ew;
 | |
|             int sym = sy * 100 + sw;
 | |
| 
 | |
|             Boolean endtast = false;
 | |
|             for (int y = sy; y <= ey; y++)
 | |
|             {
 | |
|                 var yPath = System.IO.Path.Combine(dataPath, "Count", y.ToString("0000"));
 | |
|                 if (System.IO.Directory.Exists(yPath) == false) continue;
 | |
| 
 | |
|                 for (int w = 1; w <= 50; w++)
 | |
|                 {
 | |
|                     var ym = y * 100 + w;
 | |
|                     if (ym == eym) endtast = true; //마지막 날짜이다.
 | |
|                     if (ym < sym) continue; //이전 WW는 넘어간다
 | |
| 
 | |
|                     var path = new System.IO.DirectoryInfo(System.IO.Path.Combine(yPath, w.ToString("00")));
 | |
|                     if (path.Exists == false) continue; //경로가 없다면 처리하지 않음
 | |
| 
 | |
|                     //검색할 파일 혹은 조건을 생성
 | |
|                     var searchFileName = (searchDataMatrix == "") ? "*.xml" : (searchDataMatrix + ".xml");
 | |
| 
 | |
|                     var files = path.GetFiles(searchFileName, System.IO.SearchOption.TopDirectoryOnly);
 | |
|                     foreach (var file in files)
 | |
|                     {
 | |
|                         try
 | |
|                         {
 | |
|                             var xml = new AR.XMLHelper(file.FullName);
 | |
|                             var id = xml.get_Data("id");
 | |
|                             int curCnt;
 | |
|                             var cntStr = xml.get_Data("count");
 | |
|                             if (int.TryParse(cntStr, out curCnt) == false)
 | |
|                             {
 | |
|                                 curCnt = 1;
 | |
|                                 PUB.log.AddE("Failed to read existing usage count. Counter string=" + cntStr + ". Setting to default value(1)");
 | |
|                             }
 | |
|                             retval.Add(id, curCnt);
 | |
|                         }
 | |
|                         catch (Exception ex)
 | |
|                         {
 | |
|                             PUB.log.AddE("database count getdata" + ex.Message);
 | |
|                         }
 | |
|                     }
 | |
| 
 | |
|                     if (endtast)
 | |
|                         break; // TODO: might not be correct. Was : Exit For
 | |
|                 }
 | |
|                 if (endtast)
 | |
|                     break; // TODO: might not be correct. Was : Exit For
 | |
|             }
 | |
|             return retval;
 | |
|         }
 | |
| 
 | |
|     }
 | |
| }
 | 
