12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634 |
- using Agent.Models;
- using log4net;
- using Quartz;
- using System;
- using System.Collections.Generic;
- using System.Configuration;
- using System.Data.SqlClient;
- using Dapper;
- using System.Linq;
- using System.Windows;
- using System.IO;
- namespace Agent.Services
- {
- class PolicyService
- {
- public static readonly string _jobTimer = @ConfigurationManager.AppSettings["jobTimer"];
- private static readonly ILog log = LogManager.GetLogger(typeof(PolicyService));
- private readonly FileTableService _fileTableService = new FileTableService();
- private readonly ReportService _reportService = new ReportService();
- private readonly HashService _hashService = new HashService();
- private readonly UserService _userService = new UserService();
- private readonly JobKey _jobKey = new JobKey("PolicyJob");
- private readonly TriggerKey _triggerKey = new TriggerKey("PolicyTrigger");
- //시험번호
- public static string G_Testcontrolid = "";
- //시험항목번호
- public static string G_teststandardmasterid = "";
- private System.Windows.Forms.OpenFileDialog openFileDialog1;
- System.IO.FileStream fs;//문서파일을 위함
- System.IO.BinaryReader br;//문서파일을 위함
- private byte[] hwpfile;//문서파일을 위함
- /// <summary>
- /// 정책 조회
- /// </summary>
- /// <returns></returns>
- public List<Policy> GetPolicies()
- {
- try
- {
- var userTid = Application.Current.Properties["user_tid"];
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- var sql = $@"
- SELECT [tid]
- ,[user_tid]
- ,[path]
- ,[type]
- ,[is_delete]
- ,[create_date]
- ,[custom_tag1]
- ,[custom_tag2]
- ,[custom_tag3]
- FROM [di_policy]
- WHERE 1=1
- AND user_tid = @UserTid
- AND is_delete = 0
- ";
- return con.Query<Policy>(sql, new { UserTid = userTid }).ToList();
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return null;
- }
- }
- public List<Policy> GetPoliciesRowNum()
- {
- try
- {
- var userTid = Application.Current.Properties["user_tid"];
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- var sql = $@"
- SELECT ROW_NUMBER() OVER (ORDER BY [tid] DESC) AS RowNum
- , [tid]
- ,[user_tid]
- ,[path]
- ,[type]
- ,[is_delete]
- ,[create_date]
- ,[custom_tag1]
- ,[custom_tag2]
- ,[custom_tag3]
- ,[custom_tag4]
- ,[custom_tag5]
- ,[custom_tag6]
- ,[custom_tag7]
- ,[custom_tag8]
- ,[custom_tag9]
- ,[custom_tag10]
- FROM [di_policy]
- WHERE 1=1
- AND user_tid = @UserTid
- AND is_delete = 0
- ORDER BY [tid] DESC
- ";
- return con.Query<Policy>(sql, new { UserTid = userTid }).ToList();
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return new List<Policy>();
- }
- }
- /// <summary>
- /// 정책 삭제
- /// </summary>
- /// <param name="policyTid"></param>
- /// <returns></returns>
- public bool DeletePolicy(int policyTid)
- {
- try
- {
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- var sql = $@"
- UPDATE [di_policy]
- SET [is_delete] = 1
- WHERE tid = @PolicyTid
- ";
- return 0 < con.Execute(sql, new { PolicyTid = policyTid });
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return false;
- }
- }
- /// <summary>
- /// 정책 추가
- /// </summary>
- /// <param name="con"></param>
- /// <param name="type"></param>
- /// <param name="srcPath"></param>
- /// <returns></returns>
- private void AddPolicy(SqlConnection con, string type, string srcPath, string id)
- {
- try
- {
- var userTid = Application.Current.Properties["user_tid"];
- var sql = @"
- INSERT INTO [di_policy]
- ([user_tid]
- ,[path]
- ,[type]
- ,[is_delete]
- ,[create_date]
- ,[sys_plant_cd]
- )
- VALUES
- (@UserTid
- ,@Path
- ,@Type
- ,0
- ,GETDATE()
- ,@sysPlantCd
- )
- ";
- con.Execute(sql, new { UserTid = userTid, Type = type, Path = srcPath, sysPlantCd = App._sysPlantCd });
- var sql1 = _userService.Insert_insertAT("추가", id, srcPath, Convert.ToInt32(userTid));
- }
- catch (Exception)
- {
- throw;
- }
- }
- public bool AddFilePolicy(string filePath, string id)
- {
- try
- {
- var userTid = Application.Current.Properties["user_tid"];
- using (var con = new SqlConnection(App._myConnection))
- {
- if (IsDuplicatedPath(con, filePath))
- {
- return false;
- }
- AddPolicy(con, "FILE", filePath, id);
- return true;
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return false;
- }
- }
- public bool AddDirectoryPolicy(string directoryPath, string id)
- {
- try
- {
- var userTid = Application.Current.Properties["user_tid"];
- using (var con = new SqlConnection(App._myConnection))
- {
- if (IsDuplicatedPath(con, directoryPath))
- {
- return false;
- }
- AddPolicy(con, "DIRECTORY", directoryPath, id);
- return true;
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return false;
- }
- }
- public bool IsDuplicatedPath(SqlConnection con, string path)
- {
- try
- {
- var userTid = Application.Current.Properties["user_tid"];
- var sql = $@"
- SELECT COUNT(*)
- FROM [di_policy]
- WHERE 1=1
- AND user_tid = @UserTid
- AND is_delete = 0
- AND @Path = path
- ";
- //AND(@Path LIKE path + '%' OR path LIKE @LikePath)
- return 0 < con.Query<int>(sql, new { UserTid = userTid, Path = path, LikePath = $"{path}%" }).SingleOrDefault();
- }
- catch(Exception)
- {
- throw;
- }
- }
- public PolicyIndex GetPolicyIndex(SqlConnection con, SqlTransaction transaction, int policyTid, string path)
- {
- try
- {
- var sql = $@"
- SELECT [tid]
- ,[policy_tid]
- ,[name]
- ,[path]
- ,[create_date]
- ,[last_update]
- FROM [di_policy_index]
- WHERE 1=1
- AND policy_tid = @PolicyTid
- AND path = @Path
- ";
- PolicyIndex policyIndex = con.Query<PolicyIndex>(sql, new { PolicyTid = policyTid, Path = path }, transaction).SingleOrDefault();
- if (null == policyIndex)
- {
- policyIndex = CreatePolicyIndex(con, transaction, policyTid, path);
- }
- return policyIndex;
- }
- catch (Exception ex)
- {
- //MessageBox.Show(ex.Message, "오류", MessageBoxButton.OK, MessageBoxImage.Error);
- throw;
- }
- }
- private PolicyIndex CreatePolicyIndex(SqlConnection con, SqlTransaction transaction, int policyTid, string path)
- {
- try
- {
- var sql = $@"
- INSERT INTO [di_policy_index]
- ([policy_tid]
- ,[name]
- ,[path]
- ,[sys_plant_cd]
- )
- OUTPUT
- INSERTED.tid, INSERTED.policy_tid, INSERTED.name, INSERTED.path, INSERTED.create_date, INSERTED.last_update
- VALUES
- (@PolicyTid
- ,@Name
- ,@Path
- ,@sysPlantCd
- )
- ";
- return con.Query<PolicyIndex>(sql, new { PolicyTid = policyTid, Name = Path.GetFileName(path), Path = path, sysPlantCd = App._sysPlantCd }, transaction).SingleOrDefault();
- }
- catch (Exception)
- {
- throw;
- }
- }
- /// <summary>
- /// 정책 태그 수정
- /// </summary>
- /// <param name="policyTid"></param>
- /// <param name="tag1"></param>
- /// <param name="tag2"></param>
- /// <param name="tag3"></param>
- /// <param name="tag4"></param>
- /// <param name="tag5"></param>
- /// <param name="tag6"></param>
- /// <param name="tag7"></param>
- /// <param name="tag8"></param>
- /// <param name="tag9"></param>
- /// <param name="tag10"></param>
- /// <returns></returns>
- public bool ModifyPolicyTags(int policyTid, string tag1, string tag2, string tag3, string tag4, string tag5, string tag6, string tag7, string tag8, string tag9, string tag10)
- {
- try
- {
- using (var con = new SqlConnection(App._myConnection))
- {
- var sql = @"
- UPDATE [di_policy]
- SET custom_tag1 = @Tag1
- ,custom_tag2 = @Tag2
- ,custom_tag3 = @Tag3
- ,custom_tag4 = @Tag4
- ,custom_tag5 = @Tag5
- ,custom_tag6 = @Tag6
- ,custom_tag7 = @Tag7
- ,custom_tag8 = @Tag8
- ,custom_tag9 = @Tag9
- ,custom_tag10 = @Tag10
- WHERE tid = @PolicyTid
- ";
- var data = new
- {
- PolicyTid = policyTid,
- Tag1 = tag1,
- Tag2 = tag2,
- Tag3 = tag3,
- Tag4 = tag4,
- Tag5 = tag5,
- Tag6 = tag6,
- Tag7 = tag7,
- Tag8 = tag8,
- Tag9 = tag9,
- Tag10 = tag10
- };
- return 0 < con.Execute(sql, data);
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return false;
- }
- }
- /// <summary>
- /// 정책 히스토리 조회
- /// </summary>
- /// <param name="policyTid"></param>
- /// <param name="policyIndexTid"></param>
- /// <returns></returns>
- public List<PolicyHistory> GetPolicyHistories(int policyTid, int policyIndexTid)
- {
- try
- {
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- var sql = @"
- SELECT [tid]
- ,[policy_tid]
- ,[policy_index_tid]
- ,[create_date]
- ,[hash]
- ,[backup_file_id]
- ,[equip_cd]
- ,[test_no]
- ,[work_emp]
- ,[upload_date]
- FROM [di_policy_history]
- WHERE file_ck = '1'
- AND policy_tid = @PolicyTid
- AND policy_index_tid = @policyIndexTid
- ORDER BY upload_date DESC
- ";
- return con.Query<PolicyHistory>(sql, new { PolicyTid = policyTid, PolicyIndexTid = policyIndexTid }).ToList();
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return null;
- }
- }
- /// <summary>
- /// 사용자 디렉터리 조회
- /// </summary>
- /// <returns></returns>
- public string GetUserDirectory()
- {
- try
- {
- var userDirectoryName = $"u{Application.Current.Properties["user_tid"]}";
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- var pathId = _fileTableService.GetDirectory(con, userDirectoryName);
- if(null == pathId)
- {
- using (var transaction = con.BeginTransaction())
- {
- pathId = _fileTableService.CreateDirectoryToRoot(con, transaction, userDirectoryName);
- transaction.Commit();
- }
- }
- return pathId;
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return null;
- }
- }
- /// <summary>
- /// 정책 디렉터리 조회
- /// </summary>
- /// <param name="policyTid"></param>
- /// <returns></returns>
- public string GetPolicyDirectory(int policyTid)
- {
- try
- {
- var policyDirectoryName = $"p{policyTid}";
- var userDirectoryPathId = GetUserDirectory();
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- var pathId = _fileTableService.GetDirectory(con, policyDirectoryName);
- if (null == pathId)
- {
- using (var transaction = con.BeginTransaction())
- {
- pathId = _fileTableService.CreateDirectory(con, transaction, policyDirectoryName, userDirectoryPathId);
- transaction.Commit();
- }
- }
- return pathId;
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return null;
- }
- }
- /// <summary>
- /// 파일 정책 히스토리 추가
- /// </summary>
- /// <param name="policy"></param>
- /// <param name="isHashCheck"></param>
- /// <param name="isLimit"></param>
- /// <returns>
- /// -1: 실패
- /// 1: 성공
- /// 2: 중복 업로드 제한
- /// 3: 대용량 업로드 일일 제한
- /// </returns>
- public int AddFilePolicyHistory(Policy policy, bool isHashCheck, bool isLimit)
- {
- try
- {
- if (!File.Exists(policy.Path))
- {
- log.Error($"[FILE]백업 대상이 경로에 없음 (PolicyTid={policy.Tid})");
- return -1;
- }
- var policyDirectoryPathId = GetPolicyDirectory(policy.Tid);
- if (null == policyDirectoryPathId)
- {
- log.Error($"[FILE]정책 디렉터리 생성 실패 (PolicyTid={policy.Tid})");
- return -1;
- }
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- using (var transaction = con.BeginTransaction())
- {
- var policyIndex = GetPolicyIndex(con, transaction, policy.Tid, policy.Path);
- if (null == policyIndex)
- {
- transaction.Rollback();
- log.Error($"[FILE]인덱스 생성 실패 (PolicyTid={policy.Tid})");
- return -1;
- }
- if (isHashCheck && FileUploadHashChk(con, transaction, policy.Tid, policyIndex.Tid, policyIndex.Path, policyIndex.Name))
- {
- transaction.Rollback();
- log.Info($"[FILE]중복 업로드 제한 (PolicyTid={policy.Tid})");
- return 2;
- }
- if (isLimit && FileUploadLimitChk(con, transaction, policyIndex.Path, policy.Tid, policyIndex.Tid))
- {
- transaction.Rollback();
- log.Info($"[FILE]대용량 업로드 일일 제한 (PolicyTid={policy.Tid})");
- return 3;
- }
- var policyHistoryDirectoryPathId = _fileTableService.CreateDirectory(con, transaction, policyDirectoryPathId);
- if (null == policyHistoryDirectoryPathId)
- {
- transaction.Rollback();
- log.Error($"[FILE]정책 히스토리 디렉터리 생성 실패 (PolicyTid={policy.Tid}");
- return -1;
- }
- var fileStreamId = _fileTableService.UploadFile(con, transaction, policyIndex.Path, policyHistoryDirectoryPathId);
- if (Guid.Empty == fileStreamId)
- {
- transaction.Rollback();
- log.Error($"[FILE]백업 대상 업로드에 실패 (PolicyTid={policy.Tid})");
- return -1;
- }
- //var info = new FileInfo(policy.Path);
- //policy.Create_Date = info.LastWriteTime;
-
- if (!AddPolicyHistory(con, transaction, policyIndex.Path, policy.Tid, policy.Custom_Tag1, policy.Test_No, policy.Create_Date, policy.Work_Emp, policyIndex.Tid, fileStreamId))
- {
- transaction.Rollback();
- return -1;
- }
- if (!AuditPolicyHistory(con, transaction, "I", App._userCd, "신규 등록", fileStreamId))
- {
- transaction.Rollback();
- return -1;
- }
- transaction.Commit();
- return 1;
- }
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return -1;
- }
- }
- /// <summary>
- /// 디렉토리 정책 히스토리 추가
- /// </summary>
- /// <param name="policy"></param>
- /// <param name="isRetry"></param>
- /// <param name="isHashCheck"></param>
- /// <param name="isLimit"></param>
- /// <returns></returns>
- public int AddDirectoryPolicyHistory(Policy policy, bool isRetry, bool isHashCheck, bool isLimit)
- {
- try
- {
- var policyDirectoryPathId = GetPolicyDirectory(policy.Tid);
- if (null == policyDirectoryPathId)
- {
- log.Error($"[DIRECTORY]정책 디렉터리가 생성 실패 (PolicyTid={policy.Tid})");
- return 0;
- }
- var policyHistoryDirectoryPathId = _fileTableService.CreateDirectory(policyDirectoryPathId);
- if (null == policyHistoryDirectoryPathId)
- {
- log.Error($"[DIRECTORY]정책 히스토리 디렉터리 생성 실패 (PolicyTid={policy.Tid})");
- return 0;
- }
- //20230130
- //var result = BackupFullSearch(policy.Path, policyHistoryDirectoryPathId, policy.Tid, isRetry, isHashCheck, isLimit);
- var result = BackupFullSearch(policy.Path, policyHistoryDirectoryPathId, policy.Tid, policy.Custom_Tag1, policy.Test_No, policy.Create_Date, policy.Work_Emp, isRetry, isHashCheck, isLimit);
- if (result.IsNA())
- {
- _fileTableService.RemoveDirectory(policyHistoryDirectoryPathId);
- }
- return result.Success;
- }
- catch (Exception e)
- {
- log.Error(e);
- return 0;
- }
- }
- /// <summary>
- /// 모든 파일 검색 후 백업
- /// </summary>
- /// <param name="con"></param>
- /// <param name="transaction"></param>
- /// <param name="srcPath"></param>
- /// <param name="parentId"></param>
- /// <param name="policyTid"></param>
- /// <param name="policyTest_No"></param>
- /// <param name="policyCreate_Date"></param>
- /// <param name="policyWork_Emp"></param>
- /// <param name="isRetry"></param>
- /// <param name="isHashCheck"></param>
- /// <param name="isLimit"></param>
- /// <returns></returns>
- private DirectoryBackupResult BackupFullSearch(string srcPath, string parentId, int policyTid, string policyEquip_Cd, string policyTest_No, DateTime policyCreate_Date, string policyWork_Emp, bool isRetry, bool isHashCheck, bool isLimit)
- {
- var results = new DirectoryBackupResult();
- try
- {
- var directoryInfo = new FileInfo(srcPath);
- var directoryPath = _fileTableService.CreateDirectory(directoryInfo.Name, parentId);
- if (null == directoryPath)
- {
- return results;
- }
- var files = Directory.GetFiles(srcPath).ToList();
- foreach (var file in files)
- {
- Boolean Extension = false;
- //string str = ".1vmdk, .pdf,.jpg, .vmdk";
- string[] ExtCk = App._exceptExtension.Split(',');
- string str1 = Path.GetExtension(file);
- for (int i = 0; i < ExtCk.Length; i++)//초기화; 조건식; 반복식
- {
- if (str1.IndexOf(ExtCk[i].Trim()) >= 0)
- {
- Extension = true;
- break;
- }
- }
- if (Extension == true)
- {
- continue;
- }
- var fileName = Path.GetFileName(file);
- var info = new FileInfo(file);
-
- policyCreate_Date = info.LastWriteTime;
- // 데이터베이스에 넣기전 파싱하는 부분 (시험번호, 사용자) 명명규칙
- string sFiletype = fileName.Substring(fileName.LastIndexOf('.') + 1);
- if (sFiletype == "pdf")
- {
- String[] strfileName = fileName.Split('_');
- if (strfileName.Length > 2)
- {
- policyWork_Emp = strfileName[0].ToString();
- policyTest_No = strfileName[1].ToString();
- }
- else
- {
- policyWork_Emp = null;
- policyTest_No = null;
- }
- }
- else
- {
- policyWork_Emp = null;
- policyTest_No = null;
- }
- //성공
- int result = BackupDirectoryPolicyChild(file, directoryPath, policyTid, policyEquip_Cd, policyTest_No, policyCreate_Date, policyWork_Emp, isHashCheck, isLimit);
- if (0 < result)
- {
- results.Success++;
- if (1 == result)
- {
- _reportService.AddBackupReport(policyTid, fileName, file, true);
- }
- //if (2 == result || 3 == result)
- //{
- // results.Duplicate++;
- //}
- continue;
- }
- //실패
- _reportService.AddBackupReport(policyTid, fileName, file, false);
- ////재시도 (재시도 옵션 활성화)
- //result = BackupDirectoryPolicyChild(file, directoryPath, policyTid, policyEquip_Cd, policyTest_No, policyCreate_Date, policyWork_Emp, isHashCheck, isLimit);
- //if (isRetry && 0 < result)
- //{
- // results.Success++;
- // _reportService.AddRetryReport(policyTid, fileName, file, true);
- // if (2 == result || 3 == result)
- // {
- // results.Duplicate++;
- // }
- // continue;
- //}
- ////재시도 실패 (재시도 옵션 활성화)
- //if (isRetry)
- //{
- // _reportService.AddRetryReport(policyTid, fileName, file, false);
- // continue;
- //}
- }
- var directories = Directory.GetDirectories(srcPath).ToList();
- foreach (var directory in directories)
- {
- var tmp = BackupFullSearch(directory, directoryPath, policyTid, policyEquip_Cd, policyTest_No, policyCreate_Date, policyWork_Emp, isRetry, isHashCheck, isLimit);
- results.Success += tmp.Success;
- results.Duplicate += tmp.Duplicate;
- }
- return results;
- }
- catch (Exception)
- {
- throw;
- //return results;
- }
- }
- /// <summary>
- /// 디렉터리 정책 파일 백업
- /// </summary>
- /// <param name="con"></param>
- /// <param name="transaction"></param>
- /// <param name="filePath"></param>
- /// <param name="directoryPath"></param>
- /// <param name="policyTid"></param>
- /// <param name="policyEquip_Cd"></param>
- /// <param name="policyTest_No"></param>
- /// <param name="policyCreate_Date"></param>
- /// <param name="policyWork_Emp"></param>
- /// <param name="isHashCheck"></param>
- /// <param name="isLimit"></param>
- /// <returns>
- /// -1: 실패
- /// 1: 성공
- /// 2: 중복 업로드 제한
- /// 3: 대용량 업로드 일일 제한
- /// </returns>
- private int BackupDirectoryPolicyChild(string filePath, string directoryPath, int policyTid, string policyEquip_Cd, string policyTest_No, DateTime policyCreate_Date, string policyWork_Emp, bool isHashCheck, bool isLimit)
- {
- try
- {
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- using (var transaction = con.BeginTransaction())
- {
- var policyIndex = GetPolicyIndex(con, transaction, policyTid, filePath);
- if (null == policyIndex)
- {
- transaction.Rollback();
- log.Error($"[DIRECTORY]인덱스 생성 실패 (PolicyTid={policyTid})");
- return -1;
- }
- if (isHashCheck && FileUploadHashChk(con, transaction, policyTid, policyIndex.Tid, filePath, policyIndex.Name))
- {
- transaction.Rollback();
- log.Info($"[DIRECTORY]중복 업로드 제한 (PolicyTid={policyTid})");
- return 2;
- }
- if (isLimit && FileUploadLimitChk(con, transaction, filePath, policyTid, policyIndex.Tid))
- {
- transaction.Rollback();
- log.Info($"[DIRECTORY]대용량 업로드 일일 제한 (PolicyTid={policyTid})");
- return 3;
- }
- var fileStreamId = _fileTableService.UploadFile(con, transaction, filePath, directoryPath);
- //var info = new FileInfo(filePath);
- //policyCreate_Date = info.LastWriteTime;
- //var result = AddPolicyHistory(con, transaction, filePath, policyTid, policyTest_No, policyCreate_Date, policyWork_Emp, policyIndex.Tid, fileStreamId);
- if(!AddPolicyHistory(con, transaction, filePath, policyTid, policyEquip_Cd, policyTest_No, policyCreate_Date, policyWork_Emp, policyIndex.Tid, fileStreamId))
- {
- transaction.Rollback();
- return -1;
- }
- if (!AuditPolicyHistory(con, transaction, "I", App._userCd, "신규 등록", fileStreamId))
- {
- transaction.Rollback();
- return -1;
- }
- transaction.Commit();
- return 1;
- //transaction.Rollback();
- //return -1;
- }
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return -1;
- }
- }
- /// <summary>
- /// 정책 히스토리 추가
- /// </summary>
- /// <param name="con"></param>
- /// <param name="transaction"></param>
- /// <param name="path"></param>
- /// <param name="policyTid"></param>
- /// <param name="policyEquip_Cd"></param>
- /// <param name="policyTest_No"></param>
- /// <param name="policyCreate_Date"></param>
- /// <param name="policyWork_Emp"></param>
- /// <param name="policyIndexTid"></param>
- /// <param name="guid"></param>
- /// <returns></returns>
- private bool AddPolicyHistory(SqlConnection con, SqlTransaction transaction, string path, int policyTid, string policyEquip_Cd, string policyTest_No, DateTime policyCreate_Date, String policyWork_Emp, int policyIndexTid, Guid guid)
- {
- try
- {
- if (policyEquip_Cd == null)
- {
- policyEquip_Cd = "";
- }
- var Equip_Cd = "";
- Equip_Cd = App._equipCd;
- if (policyEquip_Cd.Trim().Length > 2)
- {
- Equip_Cd = policyEquip_Cd.Trim();
- }
- var sql = $@"
- INSERT INTO [di_policy_history]
- ([policy_tid]
- ,[policy_index_tid]
- ,[file_ck]
- ,[hash]
- ,[backup_file_id]
- ,[equip_cd]
- ,[test_no]
- ,[create_date]
- ,[use_yn]
- ,[work_emp]
- ,[upload_date]
- ,[insert_emp]
- ,[sys_plant_cd]
- )
- VALUES
- (@PolicyTid
- ,@PolicyIndexTid
- ,@file_ck
- ,@Hash
- ,@BackupFileId
- ,@equip_cd
- ,@test_no
- ,@create_date
- ,@use_yn
- ,@work_emp
- ,GETDATE()
- ,@userCd
- ,@sysPlantCd)
- ";
- var data = new
- {
- PolicyTid = policyTid,
- PolicyIndexTid = policyIndexTid,
- file_ck = "1",
- Hash = _hashService.FileToMD5(path),
- BackupFileId = guid,
- equip_cd = Equip_Cd,
- test_no = policyTest_No,
- create_date = policyCreate_Date,
- use_yn = 'Y',
- work_emp = policyWork_Emp,
- userCd = App._userCd,
- sysPlantCd = App._sysPlantCd
- };
- return 0 < con.Execute(sql, data, transaction);
- }
- catch (Exception ex)
- {
- throw;
- }
- }
- /// <summary>
- /// 정책 히스토리 Audit 추가
- /// </summary>
- /// <param name="con"></param>
- /// <param name="transaction"></param>
- /// <param name="path"></param>
- /// <param name="tid"></param>
- /// <param name="type"></param>
- /// <param name="policyCreate_Date"></param>
- /// <param name="Work_Emp"></param>
- /// <param name="policyIndexTid"></param>
- /// <param name="guid"></param>
- /// <param name="dbNane"></param>
- /// <param name="Type"></param>
- /// <param name="audit_emp_cd"></param>
- /// <param name="audit_Remark"></param>
- /// <returns></returns>
- public bool AuditPolicyHistory(SqlConnection con, SqlTransaction transaction, string type, String Work_Emp, String remark, Guid guid)
- {
- try
- {
- var sql = $@"
- INSERT INTO chang_dbName
- (
- [audit_Gubun]
- ,[audit_emp_cd]
- ,[audit_timestamp]
- ,[audit_remark]
- ,[tid]
- ,[policy_tid]
- ,[policy_index_tid]
- ,[file_ck]
- ,[hash]
- ,[backup_file_id]
- ,[equip_cd]
- ,[test_no]
- ,[create_date]
- ,[use_yn]
- ,[work_emp]
- ,[upload_date]
- ,[insert_emp]
- ,[sys_plant_cd]
- )
- SELECT
- @Type
- ,@audit_emp_cd
- ,GETDATE()
- ,@audit_Remark
- ,[tid]
- ,[policy_tid]
- ,[policy_index_tid]
- ,[file_ck]
- ,[hash]
- ,[backup_file_id]
- ,[equip_cd]
- ,[test_no]
- ,[create_date]
- ,[use_yn]
- ,[work_emp]
- ,GETDATE()
- ,[insert_emp]
- ,[sys_plant_cd]
- FROM [di_policy_history]
- WHERE [backup_file_id] = @backup_file_id
- ";
- var data = new
- {
- Type = type,
- audit_emp_cd = Work_Emp,
- audit_Remark = remark,
- backup_file_id = guid
- };
- var sql1 = sql.Replace("chang_dbName", App._dbName + "_at.[dbo].[di_policy_history_at] ");
- //var sql1 = sql.Replace("chang_dbName", "DI_HISTORY_TEST_240510_at.[dbo].[di_policy_history_at] ");
- return 0 < con.Execute(sql1, data, transaction);
- }
- catch (Exception)
- {
- throw;
- }
- }
- /// <summary>
- /// 백업
- /// </summary>
- /// <returns></returns>
- public BackupResult Backup()
- {
- var successFile = 0;
- var totalFile = 0;
- var isRetry = (bool)Application.Current.Properties["user_is_retry"];
- var isHashCheck = (bool)Application.Current.Properties["user_is_hash"];
- var isLimit = (bool)Application.Current.Properties["user_is_limit"];
- var userDirectory = GetUserDirectory();
- if (null == userDirectory)
- {
- Application.Current.Properties["backup_status"] = null;
- log.Error("사용자 디렉터리 생성 실패");
- return new BackupResult()
- {
- Success = successFile,
- Fail = totalFile - successFile
- };
- }
- Application.Current.Properties["backup_status"] = "OK";
- var policies = GetPolicies();
- if (0 == policies.Count)
- {
- log.Warn("정책 없음");
- return new BackupResult()
- {
- Success = successFile,
- Fail = totalFile - successFile
- };
- }
- var filePolicies = policies.Where(policy => "FILE".Equals(policy.Type)).ToList();
- totalFile += filePolicies.Count;
- foreach (var policy in filePolicies)
- {
- try
- {
- var fileName = Path.GetFileName(policy.Path);
- var info = new FileInfo(policy.Path);
-
- policy.Create_Date = info.LastWriteTime;
- // 데이터베이스에 넣기전 파싱하는 부분 (시험번호, 사용자) 명명규칙
- string sFiletype = fileName.Substring(fileName.LastIndexOf('.') + 1);
- if (sFiletype == "pdf")
- {
- String[] strfileName = fileName.Split('_');
- if (strfileName.Length > 2)
- {
- policy.Work_Emp = strfileName[0].ToString();
- policy.Test_No = strfileName[1].ToString();
- }
- else
- {
- policy.Work_Emp = null;
- policy.Test_No = null;
- }
- }
- else
- {
- policy.Work_Emp = null;
- policy.Test_No = null;
- }
- //성공
- int result = AddFilePolicyHistory(policy, isHashCheck, isLimit);
- if (0 < result)
- {
- successFile++;
- if (1 == result)
- {
- _reportService.AddBackupReport(policy.Tid, fileName, policy.Path, true);
- }
- continue;
- }
- //실패
- _reportService.AddBackupReport(policy.Tid, fileName, policy.Path, false);
- ////재시도 (재시도 옵션 활성화)
- //if (isRetry && 0 < AddFilePolicyHistory(policy, isHashCheck, isLimit))
- //{
- // successFile++;
- // _reportService.AddRetryReport(policy.Tid, fileName, policy.Path, true);
- // continue;
- //}
- ////재시도 실패 (재시도 옵션 활성화)
- //if (isRetry)
- //{
- // _reportService.AddRetryReport(policy.Tid, fileName, policy.Path, false);
- // continue;
- //}
- }catch(Exception e)
- {
- log.Error($"File 백업 오류(PolicyTid={policy.Tid})" + ", " + e.Message.ToString());
- continue;
- }
- }
- var directoryPolicies = policies.Where(policy => "DIRECTORY".Equals(policy.Type)).ToList();
- foreach (var policy in directoryPolicies)
- {
- if (!Directory.Exists(policy.Path))
- {
- log.Error($"[DIRECTORY]백업 경로가 없음 (PolicyTid={policy.Tid})");
- continue;
- }
- int curTotalFile = Directory.GetFileSystemEntries(policy.Path).Count();
- totalFile += curTotalFile;
- successFile += AddDirectoryPolicyHistory(policy, isRetry, isHashCheck, isLimit);
- }
- return new BackupResult()
- {
- Success = successFile,
- Fail = totalFile - successFile
- };
- }
- /// <summary>
- /// 복구
- /// </summary>
- /// <param name="policyTid"></param>
- /// <param name="indexPath"></param>
- /// <param name="compareHash"></param>
- /// <param name="srcStreamId"></param>
- /// <returns></returns>
- public bool Restore(int policyTid, string indexPath, string compareHash, DateTime create_date, Guid srcStreamId, string type, string remark)
- {
- var result = PolicyFileDownload(policyTid, indexPath, compareHash, create_date, srcStreamId, type, remark);
- _reportService.AddRestoreReport(policyTid, Path.GetFileName(indexPath), indexPath, result);
- return result;
- }
- /// <summary>
- /// 정책 파일 다운로드
- /// </summary>
- /// <param name="policyTid"></param>
- /// <param name="indexPath"></param>
- /// <param name="compareHash"></param>
- /// <param name="srcStreamId"></param>
- /// <returns></returns>
- public bool PolicyFileDownload(int policyTid, string indexPath, string compareHash, DateTime create_date, Guid srcStreamId, string type, string remark)
- {
- try
- {
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- using (var transaction = con.BeginTransaction())
- {
- var tmpDstPath = _fileTableService.DownloadFile(con, transaction, indexPath, srcStreamId);
-
- //transaction.Commit();
- if (compareHash.Equals(_hashService.FileToMD5(tmpDstPath)))
- {
- //File.SetCreationTime(indexPath, File.GetCreationTime(tmpDstPath));
- //File.SetCreationTime(tmpDstPath, File.GetCreationTime(tmpDstPath));
- if (File.Exists(indexPath))
- {
- File.Delete(indexPath);
- }
- File.Move(tmpDstPath, indexPath);
- //File.Copy(tmpDstPath, indexPath, true);
- //File.SetCreationTime(indexPath, File.GetCreationTime(tmpDstPath));
- //File.SetCreationTime(indexPath, Convert.ToDateTime(File.GetCreationTime(tmpDstPath).ToString()));
- File.SetLastWriteTime(indexPath, create_date);
- //File.SetCreationTime(indexPath, Convert.ToDateTime("2023-03-12 03:47:07"));
- //File.SetLastWriteTime(indexPath, Convert.ToDateTime("2023-03-13 03:47:07"));
- //if (!AuditPolicyHistory(con, transaction, type, App._userCd, remark, srcStreamId))
- if (!AuditPolicyHistory(con, transaction, type, App._jobuserCd, remark, srcStreamId))
- {
- transaction.Rollback();
- return false;
- }
- transaction.Commit();
- return true;
- }
- File.Delete(tmpDstPath);
- transaction.Commit();
- return false;
- }
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return false;
- }
- }
- /// <summary>
- /// 모니터링 추가
- /// </summary>
- /// <returns></returns>
- public int AddMonitor()
- {
- try
- {
- var userTid = Application.Current.Properties["user_tid"];
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- var sql = @"
- INSERT INTO [di_policy_monitor]
- ([user_tid]
- ,[start_date]
- ,[end_date]
- ,[is_manual]
- ,[is_done]
- ,[success_count]
- ,[fail_count]
- ,[sys_plant_cd]
- )
- OUTPUT
- INSERTED.tid AS tid
- VALUES
- (@UserTid
- ,GETDATE()
- ,NULL
- ,0
- ,0
- ,0
- ,0
- ,@sysPlantCd
- )
- ";
- return con.Query<int>(sql, new { UserTid = userTid, sysPlantCd = App._sysPlantCd}).SingleOrDefault();
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return 0;
- }
- }
- /// <summary>
- /// 모니터링 변경
- /// </summary>
- /// <param name="policyMonitorTid"></param>
- /// <param name="successCount"></param>
- /// <param name="failCount"></param>
- public void ModifyMonitor(int policyMonitorTid, int successCount, int failCount)
- {
- try
- {
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- var sql = @"
- UPDATE [di_policy_monitor]
- SET [end_date] = GETDATE()
- ,[is_done] = 1
- ,[success_count] = @Success
- ,[fail_count] = @Fail
- WHERE tid = @PolicyMonitorTid
- ";
- con.Query<int>(sql, new { PolicyMonitorTid = policyMonitorTid, Success = successCount, Fail = failCount }).SingleOrDefault();
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- }
- }
- /// <summary>
- /// 마지막 백업 모니터링 조회
- /// </summary>
- /// <returns></returns>
- public PolicyMonitor GetLastMonitoring()
- {
- var userTid = Application.Current.Properties["user_tid"];
- try
- {
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- var sql = $@"
- SELECT TOP 1 [tid]
- ,[user_tid]
- ,[start_date]
- ,[end_date]
- ,[is_manual]
- ,[is_done]
- ,[success_count]
- ,[fail_count]
- FROM [di_policy_monitor]
- WHERE user_tid = @UserTid
- AND is_done = 1
- ORDER BY start_date DESC
- ";
- return con.Query<PolicyMonitor>(sql, new { UserTid = userTid }).SingleOrDefault();
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return null;
- }
- }
- /// <summary>
- /// 파일 용량 체크
- /// </summary>
- /// <param name="path"></param>
- /// <param name="order"></param>
- /// <param name="chkSize"></param>
- /// <returns></returns>
- public bool FileSizeCheck(string path, string order, long chkSize)
- {
- long size = 0;
- FileInfo info = new FileInfo(path);
- long fileSize = info.Length;
- switch (order)
- {
- case "KB":
- size = (fileSize / 1024);
- break;
- case "MB":
- size = (long)(fileSize / Math.Pow(1024, 2));
- break;
- case "GB":
- size = (long)(fileSize / Math.Pow(1024, 3));
- break;
- }
-
- if (size > chkSize)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- /// <summary>
- /// 업로드 제한 체크
- /// (20MB 이상일 경우 하루에 한 번만 백업)
- /// </summary>
- /// <param name="con"></param>
- /// <param name="transaction"></param>
- /// <param name="filePath"></param>
- /// <param name="policyTid"></param>
- /// <param name="policyIndexTid"></param>
- /// <returns></returns>
- public bool FileUploadLimitChk(SqlConnection con, SqlTransaction transaction, string filePath, int policyTid, int policyIndexTid)
- {
- try
- {
- if (!FileSizeCheck(filePath, "MB", 20))
- {
- return false;
- }
- var sql = @"
- SELECT COUNT(*)
- FROM [di_policy_history]
- WHERE file_ck = '1'
- AND policy_tid = @PolicyTid
- AND policy_index_tid = @PolicyIndexTid
- AND CONVERT(CHAR(10), upload_date, 23) = CONVERT(CHAR(10), GETDATE(), 23)
- ";
- return 0 < con.Query<int>(sql, new { PolicyTid = policyTid, PolicyIndexTid = policyIndexTid }, transaction).SingleOrDefault();
- }
- catch (Exception e)
- {
- log.Error(e);
- return false;
- }
- }
- /// <summary>
- /// 업로드 제한 체크
- /// (마지막 백업한 파일과 HASH 같으면 백업 안함)
- /// </summary>
- /// <param name="con"></param>
- /// <param name="transaction"></param>
- /// <param name="policyTid"></param>
- /// <param name="policyIndexTid"></param>
- /// <param name="filePath"></param>
- /// <returns></returns>
- public bool FileUploadHashChk(SqlConnection con, SqlTransaction transaction, int policyTid, int policyIndexTid, string filePath, string fileName)
- {
- try
- {
- var willUploadFileHash = _hashService.FileToMD5(filePath);
- var sql = @"
- SELECT TOP 1 hash
- FROM [di_policy_history] a
- INNER JOIN di_policy_index b ON a.policy_tid = b.policy_tid
- WHERE 1=1
- --AND policy_tid = @PolicyTid
- --AND policy_index_tid = @PolicyIndexTid
- AND hash = @willUploadFileHash
- AND name = @FileName
-
- ORDER BY upload_date DESC
- ";
- //var willUploadFileHash = _hashService.FileToMD5(filePath);
- return willUploadFileHash.Equals(con.Query<string>
- (sql, new { PolicyTid = policyTid, PolicyIndexTid = policyIndexTid, willUploadFileHash = willUploadFileHash, FileName = fileName }, transaction).SingleOrDefault());
- }
- catch (Exception e)
- {
- log.Error(e);
- return false;
- }
- }
- /// <summary>
- /// 사용자태그 확장 정책 인덱스 조회
- /// </summary>
- /// <returns></returns>
- public List<PolicyIndexDto> GetPolicyIndexesExtendTag()
- {
- try
- {
- var userTid = Application.Current.Properties["user_tid"];
- using (var con = new SqlConnection(App._myConnection))
- {
- var sql = $@"
- SELECT T2.[tid]
- ,T2.[policy_tid]
- ,T2.[name]
- ,T2.[path]
- ,T2.[create_date]
- ,T2.[last_update]
- ,T1.[custom_tag1]
- ,T1.[custom_tag2]
- ,T1.[custom_tag3]
- ,T1.[custom_tag4]
- ,T1.[custom_tag5]
- ,T1.[custom_tag6]
- ,T1.[custom_tag7]
- ,T1.[custom_tag8]
- ,T1.[custom_tag9]
- ,T1.[custom_tag10]
- FROM [di_policy] T1
- INNER JOIN [di_policy_index] T2 ON T1.tid = T2.policy_tid
- WHERE 1=1
- AND T1.user_tid = @UserTid
- AND T1.is_delete = 0
- ";
- return con.Query<PolicyIndexDto>(sql, new { UserTid = userTid }).ToList();
- }
- }
- catch (Exception e)
- {
- log.Error(e);
- return new List<PolicyIndexDto>();
- }
- }
- public IJobDetail GetPolicyJob()
- {
- return JobBuilder.Create<PolicyJob>()
- .WithIdentity(_jobKey)
- .Build();
- }
- public ITrigger GetPolicyTrigger()
- {
- try
- {
- return TriggerBuilder.Create()
- .WithIdentity(_triggerKey)
- .StartNow()
- .WithCronSchedule(GetPolicySchedule())
- .Build();
- }
- catch (Exception e)
- {
- log.Error(e);
- return null;
- }
- }
- public void ScheduledPolicyJob()
- {
- App.Scheduler.ScheduleJob(GetPolicyJob(), GetPolicyTrigger());
- }
- public void UpdateScheduledPolicyJob()
- {
- App.Scheduler.DeleteJob(_jobKey);
- ScheduledPolicyJob();
- }
- private string GetPolicySchedule()
- {
- var backupType = Application.Current.Properties["user_backup_type"];
- log.Info($"[di_user]스케줄러 주기={backupType}");
- if ("REAL_TIME".Equals(backupType))
- {
- return "0 * * * * ?";
- }
- if ("EVERY_HOUR".Equals(backupType))
- {
- return "0 0 * * * ?";
- }
- if ("EVERY_DAY".Equals(backupType))
- {
- //return "0 30 16 * * ?";
- return _jobTimer;
- }
- return "0 0 0 * * ?";
- }
- }
- [DisallowConcurrentExecution]
- public partial class PolicyJob : IJob
- {
- private static readonly ILog log = LogManager.GetLogger(typeof(PolicyJob));
- private PolicyService _policyService = new PolicyService();
- public void Execute(IJobExecutionContext context)
- {
- var policyMonitorTid = _policyService.AddMonitor();
- var result = _policyService.Backup();
- _policyService.ModifyMonitor(policyMonitorTid, result.Success, result.Fail);
- }
- }
- }
|