PolicyService.cs 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634
  1. using Agent.Models;
  2. using log4net;
  3. using Quartz;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Configuration;
  7. using System.Data.SqlClient;
  8. using Dapper;
  9. using System.Linq;
  10. using System.Windows;
  11. using System.IO;
  12. namespace Agent.Services
  13. {
  14. class PolicyService
  15. {
  16. public static readonly string _jobTimer = @ConfigurationManager.AppSettings["jobTimer"];
  17. private static readonly ILog log = LogManager.GetLogger(typeof(PolicyService));
  18. private readonly FileTableService _fileTableService = new FileTableService();
  19. private readonly ReportService _reportService = new ReportService();
  20. private readonly HashService _hashService = new HashService();
  21. private readonly UserService _userService = new UserService();
  22. private readonly JobKey _jobKey = new JobKey("PolicyJob");
  23. private readonly TriggerKey _triggerKey = new TriggerKey("PolicyTrigger");
  24. //시험번호
  25. public static string G_Testcontrolid = "";
  26. //시험항목번호
  27. public static string G_teststandardmasterid = "";
  28. private System.Windows.Forms.OpenFileDialog openFileDialog1;
  29. System.IO.FileStream fs;//문서파일을 위함
  30. System.IO.BinaryReader br;//문서파일을 위함
  31. private byte[] hwpfile;//문서파일을 위함
  32. /// <summary>
  33. /// 정책 조회
  34. /// </summary>
  35. /// <returns></returns>
  36. public List<Policy> GetPolicies()
  37. {
  38. try
  39. {
  40. var userTid = Application.Current.Properties["user_tid"];
  41. using (var con = new SqlConnection(App._myConnection))
  42. {
  43. con.Open();
  44. var sql = $@"
  45. SELECT [tid]
  46. ,[user_tid]
  47. ,[path]
  48. ,[type]
  49. ,[is_delete]
  50. ,[create_date]
  51. ,[custom_tag1]
  52. ,[custom_tag2]
  53. ,[custom_tag3]
  54. FROM [di_policy]
  55. WHERE 1=1
  56. AND user_tid = @UserTid
  57. AND is_delete = 0
  58. ";
  59. return con.Query<Policy>(sql, new { UserTid = userTid }).ToList();
  60. }
  61. }
  62. catch (Exception e)
  63. {
  64. log.Error(e);
  65. return null;
  66. }
  67. }
  68. public List<Policy> GetPoliciesRowNum()
  69. {
  70. try
  71. {
  72. var userTid = Application.Current.Properties["user_tid"];
  73. using (var con = new SqlConnection(App._myConnection))
  74. {
  75. con.Open();
  76. var sql = $@"
  77. SELECT ROW_NUMBER() OVER (ORDER BY [tid] DESC) AS RowNum
  78. , [tid]
  79. ,[user_tid]
  80. ,[path]
  81. ,[type]
  82. ,[is_delete]
  83. ,[create_date]
  84. ,[custom_tag1]
  85. ,[custom_tag2]
  86. ,[custom_tag3]
  87. ,[custom_tag4]
  88. ,[custom_tag5]
  89. ,[custom_tag6]
  90. ,[custom_tag7]
  91. ,[custom_tag8]
  92. ,[custom_tag9]
  93. ,[custom_tag10]
  94. FROM [di_policy]
  95. WHERE 1=1
  96. AND user_tid = @UserTid
  97. AND is_delete = 0
  98. ORDER BY [tid] DESC
  99. ";
  100. return con.Query<Policy>(sql, new { UserTid = userTid }).ToList();
  101. }
  102. }
  103. catch (Exception e)
  104. {
  105. log.Error(e);
  106. return new List<Policy>();
  107. }
  108. }
  109. /// <summary>
  110. /// 정책 삭제
  111. /// </summary>
  112. /// <param name="policyTid"></param>
  113. /// <returns></returns>
  114. public bool DeletePolicy(int policyTid)
  115. {
  116. try
  117. {
  118. using (var con = new SqlConnection(App._myConnection))
  119. {
  120. con.Open();
  121. var sql = $@"
  122. UPDATE [di_policy]
  123. SET [is_delete] = 1
  124. WHERE tid = @PolicyTid
  125. ";
  126. return 0 < con.Execute(sql, new { PolicyTid = policyTid });
  127. }
  128. }
  129. catch (Exception e)
  130. {
  131. log.Error(e);
  132. return false;
  133. }
  134. }
  135. /// <summary>
  136. /// 정책 추가
  137. /// </summary>
  138. /// <param name="con"></param>
  139. /// <param name="type"></param>
  140. /// <param name="srcPath"></param>
  141. /// <returns></returns>
  142. private void AddPolicy(SqlConnection con, string type, string srcPath, string id)
  143. {
  144. try
  145. {
  146. var userTid = Application.Current.Properties["user_tid"];
  147. var sql = @"
  148. INSERT INTO [di_policy]
  149. ([user_tid]
  150. ,[path]
  151. ,[type]
  152. ,[is_delete]
  153. ,[create_date]
  154. ,[sys_plant_cd]
  155. )
  156. VALUES
  157. (@UserTid
  158. ,@Path
  159. ,@Type
  160. ,0
  161. ,GETDATE()
  162. ,@sysPlantCd
  163. )
  164. ";
  165. con.Execute(sql, new { UserTid = userTid, Type = type, Path = srcPath, sysPlantCd = App._sysPlantCd });
  166. var sql1 = _userService.Insert_insertAT("추가", id, srcPath, Convert.ToInt32(userTid));
  167. }
  168. catch (Exception)
  169. {
  170. throw;
  171. }
  172. }
  173. public bool AddFilePolicy(string filePath, string id)
  174. {
  175. try
  176. {
  177. var userTid = Application.Current.Properties["user_tid"];
  178. using (var con = new SqlConnection(App._myConnection))
  179. {
  180. if (IsDuplicatedPath(con, filePath))
  181. {
  182. return false;
  183. }
  184. AddPolicy(con, "FILE", filePath, id);
  185. return true;
  186. }
  187. }
  188. catch (Exception e)
  189. {
  190. log.Error(e);
  191. return false;
  192. }
  193. }
  194. public bool AddDirectoryPolicy(string directoryPath, string id)
  195. {
  196. try
  197. {
  198. var userTid = Application.Current.Properties["user_tid"];
  199. using (var con = new SqlConnection(App._myConnection))
  200. {
  201. if (IsDuplicatedPath(con, directoryPath))
  202. {
  203. return false;
  204. }
  205. AddPolicy(con, "DIRECTORY", directoryPath, id);
  206. return true;
  207. }
  208. }
  209. catch (Exception e)
  210. {
  211. log.Error(e);
  212. return false;
  213. }
  214. }
  215. public bool IsDuplicatedPath(SqlConnection con, string path)
  216. {
  217. try
  218. {
  219. var userTid = Application.Current.Properties["user_tid"];
  220. var sql = $@"
  221. SELECT COUNT(*)
  222. FROM [di_policy]
  223. WHERE 1=1
  224. AND user_tid = @UserTid
  225. AND is_delete = 0
  226. AND @Path = path
  227. ";
  228. //AND(@Path LIKE path + '%' OR path LIKE @LikePath)
  229. return 0 < con.Query<int>(sql, new { UserTid = userTid, Path = path, LikePath = $"{path}%" }).SingleOrDefault();
  230. }
  231. catch(Exception)
  232. {
  233. throw;
  234. }
  235. }
  236. public PolicyIndex GetPolicyIndex(SqlConnection con, SqlTransaction transaction, int policyTid, string path)
  237. {
  238. try
  239. {
  240. var sql = $@"
  241. SELECT [tid]
  242. ,[policy_tid]
  243. ,[name]
  244. ,[path]
  245. ,[create_date]
  246. ,[last_update]
  247. FROM [di_policy_index]
  248. WHERE 1=1
  249. AND policy_tid = @PolicyTid
  250. AND path = @Path
  251. ";
  252. PolicyIndex policyIndex = con.Query<PolicyIndex>(sql, new { PolicyTid = policyTid, Path = path }, transaction).SingleOrDefault();
  253. if (null == policyIndex)
  254. {
  255. policyIndex = CreatePolicyIndex(con, transaction, policyTid, path);
  256. }
  257. return policyIndex;
  258. }
  259. catch (Exception ex)
  260. {
  261. //MessageBox.Show(ex.Message, "오류", MessageBoxButton.OK, MessageBoxImage.Error);
  262. throw;
  263. }
  264. }
  265. private PolicyIndex CreatePolicyIndex(SqlConnection con, SqlTransaction transaction, int policyTid, string path)
  266. {
  267. try
  268. {
  269. var sql = $@"
  270. INSERT INTO [di_policy_index]
  271. ([policy_tid]
  272. ,[name]
  273. ,[path]
  274. ,[sys_plant_cd]
  275. )
  276. OUTPUT
  277. INSERTED.tid, INSERTED.policy_tid, INSERTED.name, INSERTED.path, INSERTED.create_date, INSERTED.last_update
  278. VALUES
  279. (@PolicyTid
  280. ,@Name
  281. ,@Path
  282. ,@sysPlantCd
  283. )
  284. ";
  285. return con.Query<PolicyIndex>(sql, new { PolicyTid = policyTid, Name = Path.GetFileName(path), Path = path, sysPlantCd = App._sysPlantCd }, transaction).SingleOrDefault();
  286. }
  287. catch (Exception)
  288. {
  289. throw;
  290. }
  291. }
  292. /// <summary>
  293. /// 정책 태그 수정
  294. /// </summary>
  295. /// <param name="policyTid"></param>
  296. /// <param name="tag1"></param>
  297. /// <param name="tag2"></param>
  298. /// <param name="tag3"></param>
  299. /// <param name="tag4"></param>
  300. /// <param name="tag5"></param>
  301. /// <param name="tag6"></param>
  302. /// <param name="tag7"></param>
  303. /// <param name="tag8"></param>
  304. /// <param name="tag9"></param>
  305. /// <param name="tag10"></param>
  306. /// <returns></returns>
  307. 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)
  308. {
  309. try
  310. {
  311. using (var con = new SqlConnection(App._myConnection))
  312. {
  313. var sql = @"
  314. UPDATE [di_policy]
  315. SET custom_tag1 = @Tag1
  316. ,custom_tag2 = @Tag2
  317. ,custom_tag3 = @Tag3
  318. ,custom_tag4 = @Tag4
  319. ,custom_tag5 = @Tag5
  320. ,custom_tag6 = @Tag6
  321. ,custom_tag7 = @Tag7
  322. ,custom_tag8 = @Tag8
  323. ,custom_tag9 = @Tag9
  324. ,custom_tag10 = @Tag10
  325. WHERE tid = @PolicyTid
  326. ";
  327. var data = new
  328. {
  329. PolicyTid = policyTid,
  330. Tag1 = tag1,
  331. Tag2 = tag2,
  332. Tag3 = tag3,
  333. Tag4 = tag4,
  334. Tag5 = tag5,
  335. Tag6 = tag6,
  336. Tag7 = tag7,
  337. Tag8 = tag8,
  338. Tag9 = tag9,
  339. Tag10 = tag10
  340. };
  341. return 0 < con.Execute(sql, data);
  342. }
  343. }
  344. catch (Exception e)
  345. {
  346. log.Error(e);
  347. return false;
  348. }
  349. }
  350. /// <summary>
  351. /// 정책 히스토리 조회
  352. /// </summary>
  353. /// <param name="policyTid"></param>
  354. /// <param name="policyIndexTid"></param>
  355. /// <returns></returns>
  356. public List<PolicyHistory> GetPolicyHistories(int policyTid, int policyIndexTid)
  357. {
  358. try
  359. {
  360. using (var con = new SqlConnection(App._myConnection))
  361. {
  362. con.Open();
  363. var sql = @"
  364. SELECT [tid]
  365. ,[policy_tid]
  366. ,[policy_index_tid]
  367. ,[create_date]
  368. ,[hash]
  369. ,[backup_file_id]
  370. ,[equip_cd]
  371. ,[test_no]
  372. ,[work_emp]
  373. ,[upload_date]
  374. FROM [di_policy_history]
  375. WHERE file_ck = '1'
  376. AND policy_tid = @PolicyTid
  377. AND policy_index_tid = @policyIndexTid
  378. ORDER BY upload_date DESC
  379. ";
  380. return con.Query<PolicyHistory>(sql, new { PolicyTid = policyTid, PolicyIndexTid = policyIndexTid }).ToList();
  381. }
  382. }
  383. catch (Exception e)
  384. {
  385. log.Error(e);
  386. return null;
  387. }
  388. }
  389. /// <summary>
  390. /// 사용자 디렉터리 조회
  391. /// </summary>
  392. /// <returns></returns>
  393. public string GetUserDirectory()
  394. {
  395. try
  396. {
  397. var userDirectoryName = $"u{Application.Current.Properties["user_tid"]}";
  398. using (var con = new SqlConnection(App._myConnection))
  399. {
  400. con.Open();
  401. var pathId = _fileTableService.GetDirectory(con, userDirectoryName);
  402. if(null == pathId)
  403. {
  404. using (var transaction = con.BeginTransaction())
  405. {
  406. pathId = _fileTableService.CreateDirectoryToRoot(con, transaction, userDirectoryName);
  407. transaction.Commit();
  408. }
  409. }
  410. return pathId;
  411. }
  412. }
  413. catch (Exception e)
  414. {
  415. log.Error(e);
  416. return null;
  417. }
  418. }
  419. /// <summary>
  420. /// 정책 디렉터리 조회
  421. /// </summary>
  422. /// <param name="policyTid"></param>
  423. /// <returns></returns>
  424. public string GetPolicyDirectory(int policyTid)
  425. {
  426. try
  427. {
  428. var policyDirectoryName = $"p{policyTid}";
  429. var userDirectoryPathId = GetUserDirectory();
  430. using (var con = new SqlConnection(App._myConnection))
  431. {
  432. con.Open();
  433. var pathId = _fileTableService.GetDirectory(con, policyDirectoryName);
  434. if (null == pathId)
  435. {
  436. using (var transaction = con.BeginTransaction())
  437. {
  438. pathId = _fileTableService.CreateDirectory(con, transaction, policyDirectoryName, userDirectoryPathId);
  439. transaction.Commit();
  440. }
  441. }
  442. return pathId;
  443. }
  444. }
  445. catch (Exception e)
  446. {
  447. log.Error(e);
  448. return null;
  449. }
  450. }
  451. /// <summary>
  452. /// 파일 정책 히스토리 추가
  453. /// </summary>
  454. /// <param name="policy"></param>
  455. /// <param name="isHashCheck"></param>
  456. /// <param name="isLimit"></param>
  457. /// <returns>
  458. /// -1: 실패
  459. /// 1: 성공
  460. /// 2: 중복 업로드 제한
  461. /// 3: 대용량 업로드 일일 제한
  462. /// </returns>
  463. public int AddFilePolicyHistory(Policy policy, bool isHashCheck, bool isLimit)
  464. {
  465. try
  466. {
  467. if (!File.Exists(policy.Path))
  468. {
  469. log.Error($"[FILE]백업 대상이 경로에 없음 (PolicyTid={policy.Tid})");
  470. return -1;
  471. }
  472. var policyDirectoryPathId = GetPolicyDirectory(policy.Tid);
  473. if (null == policyDirectoryPathId)
  474. {
  475. log.Error($"[FILE]정책 디렉터리 생성 실패 (PolicyTid={policy.Tid})");
  476. return -1;
  477. }
  478. using (var con = new SqlConnection(App._myConnection))
  479. {
  480. con.Open();
  481. using (var transaction = con.BeginTransaction())
  482. {
  483. var policyIndex = GetPolicyIndex(con, transaction, policy.Tid, policy.Path);
  484. if (null == policyIndex)
  485. {
  486. transaction.Rollback();
  487. log.Error($"[FILE]인덱스 생성 실패 (PolicyTid={policy.Tid})");
  488. return -1;
  489. }
  490. if (isHashCheck && FileUploadHashChk(con, transaction, policy.Tid, policyIndex.Tid, policyIndex.Path, policyIndex.Name))
  491. {
  492. transaction.Rollback();
  493. log.Info($"[FILE]중복 업로드 제한 (PolicyTid={policy.Tid})");
  494. return 2;
  495. }
  496. if (isLimit && FileUploadLimitChk(con, transaction, policyIndex.Path, policy.Tid, policyIndex.Tid))
  497. {
  498. transaction.Rollback();
  499. log.Info($"[FILE]대용량 업로드 일일 제한 (PolicyTid={policy.Tid})");
  500. return 3;
  501. }
  502. var policyHistoryDirectoryPathId = _fileTableService.CreateDirectory(con, transaction, policyDirectoryPathId);
  503. if (null == policyHistoryDirectoryPathId)
  504. {
  505. transaction.Rollback();
  506. log.Error($"[FILE]정책 히스토리 디렉터리 생성 실패 (PolicyTid={policy.Tid}");
  507. return -1;
  508. }
  509. var fileStreamId = _fileTableService.UploadFile(con, transaction, policyIndex.Path, policyHistoryDirectoryPathId);
  510. if (Guid.Empty == fileStreamId)
  511. {
  512. transaction.Rollback();
  513. log.Error($"[FILE]백업 대상 업로드에 실패 (PolicyTid={policy.Tid})");
  514. return -1;
  515. }
  516. //var info = new FileInfo(policy.Path);
  517. //policy.Create_Date = info.LastWriteTime;
  518. if (!AddPolicyHistory(con, transaction, policyIndex.Path, policy.Tid, policy.Custom_Tag1, policy.Test_No, policy.Create_Date, policy.Work_Emp, policyIndex.Tid, fileStreamId))
  519. {
  520. transaction.Rollback();
  521. return -1;
  522. }
  523. if (!AuditPolicyHistory(con, transaction, "I", App._userCd, "신규 등록", fileStreamId))
  524. {
  525. transaction.Rollback();
  526. return -1;
  527. }
  528. transaction.Commit();
  529. return 1;
  530. }
  531. }
  532. }
  533. catch (Exception e)
  534. {
  535. log.Error(e);
  536. return -1;
  537. }
  538. }
  539. /// <summary>
  540. /// 디렉토리 정책 히스토리 추가
  541. /// </summary>
  542. /// <param name="policy"></param>
  543. /// <param name="isRetry"></param>
  544. /// <param name="isHashCheck"></param>
  545. /// <param name="isLimit"></param>
  546. /// <returns></returns>
  547. public int AddDirectoryPolicyHistory(Policy policy, bool isRetry, bool isHashCheck, bool isLimit)
  548. {
  549. try
  550. {
  551. var policyDirectoryPathId = GetPolicyDirectory(policy.Tid);
  552. if (null == policyDirectoryPathId)
  553. {
  554. log.Error($"[DIRECTORY]정책 디렉터리가 생성 실패 (PolicyTid={policy.Tid})");
  555. return 0;
  556. }
  557. var policyHistoryDirectoryPathId = _fileTableService.CreateDirectory(policyDirectoryPathId);
  558. if (null == policyHistoryDirectoryPathId)
  559. {
  560. log.Error($"[DIRECTORY]정책 히스토리 디렉터리 생성 실패 (PolicyTid={policy.Tid})");
  561. return 0;
  562. }
  563. //20230130
  564. //var result = BackupFullSearch(policy.Path, policyHistoryDirectoryPathId, policy.Tid, isRetry, isHashCheck, isLimit);
  565. var result = BackupFullSearch(policy.Path, policyHistoryDirectoryPathId, policy.Tid, policy.Custom_Tag1, policy.Test_No, policy.Create_Date, policy.Work_Emp, isRetry, isHashCheck, isLimit);
  566. if (result.IsNA())
  567. {
  568. _fileTableService.RemoveDirectory(policyHistoryDirectoryPathId);
  569. }
  570. return result.Success;
  571. }
  572. catch (Exception e)
  573. {
  574. log.Error(e);
  575. return 0;
  576. }
  577. }
  578. /// <summary>
  579. /// 모든 파일 검색 후 백업
  580. /// </summary>
  581. /// <param name="con"></param>
  582. /// <param name="transaction"></param>
  583. /// <param name="srcPath"></param>
  584. /// <param name="parentId"></param>
  585. /// <param name="policyTid"></param>
  586. /// <param name="policyTest_No"></param>
  587. /// <param name="policyCreate_Date"></param>
  588. /// <param name="policyWork_Emp"></param>
  589. /// <param name="isRetry"></param>
  590. /// <param name="isHashCheck"></param>
  591. /// <param name="isLimit"></param>
  592. /// <returns></returns>
  593. 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)
  594. {
  595. var results = new DirectoryBackupResult();
  596. try
  597. {
  598. var directoryInfo = new FileInfo(srcPath);
  599. var directoryPath = _fileTableService.CreateDirectory(directoryInfo.Name, parentId);
  600. if (null == directoryPath)
  601. {
  602. return results;
  603. }
  604. var files = Directory.GetFiles(srcPath).ToList();
  605. foreach (var file in files)
  606. {
  607. Boolean Extension = false;
  608. //string str = ".1vmdk, .pdf,.jpg, .vmdk";
  609. string[] ExtCk = App._exceptExtension.Split(',');
  610. string str1 = Path.GetExtension(file);
  611. for (int i = 0; i < ExtCk.Length; i++)//초기화; 조건식; 반복식
  612. {
  613. if (str1.IndexOf(ExtCk[i].Trim()) >= 0)
  614. {
  615. Extension = true;
  616. break;
  617. }
  618. }
  619. if (Extension == true)
  620. {
  621. continue;
  622. }
  623. var fileName = Path.GetFileName(file);
  624. var info = new FileInfo(file);
  625. policyCreate_Date = info.LastWriteTime;
  626. // 데이터베이스에 넣기전 파싱하는 부분 (시험번호, 사용자) 명명규칙
  627. string sFiletype = fileName.Substring(fileName.LastIndexOf('.') + 1);
  628. if (sFiletype == "pdf")
  629. {
  630. String[] strfileName = fileName.Split('_');
  631. if (strfileName.Length > 2)
  632. {
  633. policyWork_Emp = strfileName[0].ToString();
  634. policyTest_No = strfileName[1].ToString();
  635. }
  636. else
  637. {
  638. policyWork_Emp = null;
  639. policyTest_No = null;
  640. }
  641. }
  642. else
  643. {
  644. policyWork_Emp = null;
  645. policyTest_No = null;
  646. }
  647. //성공
  648. int result = BackupDirectoryPolicyChild(file, directoryPath, policyTid, policyEquip_Cd, policyTest_No, policyCreate_Date, policyWork_Emp, isHashCheck, isLimit);
  649. if (0 < result)
  650. {
  651. results.Success++;
  652. if (1 == result)
  653. {
  654. _reportService.AddBackupReport(policyTid, fileName, file, true);
  655. }
  656. //if (2 == result || 3 == result)
  657. //{
  658. // results.Duplicate++;
  659. //}
  660. continue;
  661. }
  662. //실패
  663. _reportService.AddBackupReport(policyTid, fileName, file, false);
  664. ////재시도 (재시도 옵션 활성화)
  665. //result = BackupDirectoryPolicyChild(file, directoryPath, policyTid, policyEquip_Cd, policyTest_No, policyCreate_Date, policyWork_Emp, isHashCheck, isLimit);
  666. //if (isRetry && 0 < result)
  667. //{
  668. // results.Success++;
  669. // _reportService.AddRetryReport(policyTid, fileName, file, true);
  670. // if (2 == result || 3 == result)
  671. // {
  672. // results.Duplicate++;
  673. // }
  674. // continue;
  675. //}
  676. ////재시도 실패 (재시도 옵션 활성화)
  677. //if (isRetry)
  678. //{
  679. // _reportService.AddRetryReport(policyTid, fileName, file, false);
  680. // continue;
  681. //}
  682. }
  683. var directories = Directory.GetDirectories(srcPath).ToList();
  684. foreach (var directory in directories)
  685. {
  686. var tmp = BackupFullSearch(directory, directoryPath, policyTid, policyEquip_Cd, policyTest_No, policyCreate_Date, policyWork_Emp, isRetry, isHashCheck, isLimit);
  687. results.Success += tmp.Success;
  688. results.Duplicate += tmp.Duplicate;
  689. }
  690. return results;
  691. }
  692. catch (Exception)
  693. {
  694. throw;
  695. //return results;
  696. }
  697. }
  698. /// <summary>
  699. /// 디렉터리 정책 파일 백업
  700. /// </summary>
  701. /// <param name="con"></param>
  702. /// <param name="transaction"></param>
  703. /// <param name="filePath"></param>
  704. /// <param name="directoryPath"></param>
  705. /// <param name="policyTid"></param>
  706. /// <param name="policyEquip_Cd"></param>
  707. /// <param name="policyTest_No"></param>
  708. /// <param name="policyCreate_Date"></param>
  709. /// <param name="policyWork_Emp"></param>
  710. /// <param name="isHashCheck"></param>
  711. /// <param name="isLimit"></param>
  712. /// <returns>
  713. /// -1: 실패
  714. /// 1: 성공
  715. /// 2: 중복 업로드 제한
  716. /// 3: 대용량 업로드 일일 제한
  717. /// </returns>
  718. 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)
  719. {
  720. try
  721. {
  722. using (var con = new SqlConnection(App._myConnection))
  723. {
  724. con.Open();
  725. using (var transaction = con.BeginTransaction())
  726. {
  727. var policyIndex = GetPolicyIndex(con, transaction, policyTid, filePath);
  728. if (null == policyIndex)
  729. {
  730. transaction.Rollback();
  731. log.Error($"[DIRECTORY]인덱스 생성 실패 (PolicyTid={policyTid})");
  732. return -1;
  733. }
  734. if (isHashCheck && FileUploadHashChk(con, transaction, policyTid, policyIndex.Tid, filePath, policyIndex.Name))
  735. {
  736. transaction.Rollback();
  737. log.Info($"[DIRECTORY]중복 업로드 제한 (PolicyTid={policyTid})");
  738. return 2;
  739. }
  740. if (isLimit && FileUploadLimitChk(con, transaction, filePath, policyTid, policyIndex.Tid))
  741. {
  742. transaction.Rollback();
  743. log.Info($"[DIRECTORY]대용량 업로드 일일 제한 (PolicyTid={policyTid})");
  744. return 3;
  745. }
  746. var fileStreamId = _fileTableService.UploadFile(con, transaction, filePath, directoryPath);
  747. //var info = new FileInfo(filePath);
  748. //policyCreate_Date = info.LastWriteTime;
  749. //var result = AddPolicyHistory(con, transaction, filePath, policyTid, policyTest_No, policyCreate_Date, policyWork_Emp, policyIndex.Tid, fileStreamId);
  750. if(!AddPolicyHistory(con, transaction, filePath, policyTid, policyEquip_Cd, policyTest_No, policyCreate_Date, policyWork_Emp, policyIndex.Tid, fileStreamId))
  751. {
  752. transaction.Rollback();
  753. return -1;
  754. }
  755. if (!AuditPolicyHistory(con, transaction, "I", App._userCd, "신규 등록", fileStreamId))
  756. {
  757. transaction.Rollback();
  758. return -1;
  759. }
  760. transaction.Commit();
  761. return 1;
  762. //transaction.Rollback();
  763. //return -1;
  764. }
  765. }
  766. }
  767. catch (Exception e)
  768. {
  769. log.Error(e);
  770. return -1;
  771. }
  772. }
  773. /// <summary>
  774. /// 정책 히스토리 추가
  775. /// </summary>
  776. /// <param name="con"></param>
  777. /// <param name="transaction"></param>
  778. /// <param name="path"></param>
  779. /// <param name="policyTid"></param>
  780. /// <param name="policyEquip_Cd"></param>
  781. /// <param name="policyTest_No"></param>
  782. /// <param name="policyCreate_Date"></param>
  783. /// <param name="policyWork_Emp"></param>
  784. /// <param name="policyIndexTid"></param>
  785. /// <param name="guid"></param>
  786. /// <returns></returns>
  787. 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)
  788. {
  789. try
  790. {
  791. if (policyEquip_Cd == null)
  792. {
  793. policyEquip_Cd = "";
  794. }
  795. var Equip_Cd = "";
  796. Equip_Cd = App._equipCd;
  797. if (policyEquip_Cd.Trim().Length > 2)
  798. {
  799. Equip_Cd = policyEquip_Cd.Trim();
  800. }
  801. var sql = $@"
  802. INSERT INTO [di_policy_history]
  803. ([policy_tid]
  804. ,[policy_index_tid]
  805. ,[file_ck]
  806. ,[hash]
  807. ,[backup_file_id]
  808. ,[equip_cd]
  809. ,[test_no]
  810. ,[create_date]
  811. ,[use_yn]
  812. ,[work_emp]
  813. ,[upload_date]
  814. ,[insert_emp]
  815. ,[sys_plant_cd]
  816. )
  817. VALUES
  818. (@PolicyTid
  819. ,@PolicyIndexTid
  820. ,@file_ck
  821. ,@Hash
  822. ,@BackupFileId
  823. ,@equip_cd
  824. ,@test_no
  825. ,@create_date
  826. ,@use_yn
  827. ,@work_emp
  828. ,GETDATE()
  829. ,@userCd
  830. ,@sysPlantCd)
  831. ";
  832. var data = new
  833. {
  834. PolicyTid = policyTid,
  835. PolicyIndexTid = policyIndexTid,
  836. file_ck = "1",
  837. Hash = _hashService.FileToMD5(path),
  838. BackupFileId = guid,
  839. equip_cd = Equip_Cd,
  840. test_no = policyTest_No,
  841. create_date = policyCreate_Date,
  842. use_yn = 'Y',
  843. work_emp = policyWork_Emp,
  844. userCd = App._userCd,
  845. sysPlantCd = App._sysPlantCd
  846. };
  847. return 0 < con.Execute(sql, data, transaction);
  848. }
  849. catch (Exception ex)
  850. {
  851. throw;
  852. }
  853. }
  854. /// <summary>
  855. /// 정책 히스토리 Audit 추가
  856. /// </summary>
  857. /// <param name="con"></param>
  858. /// <param name="transaction"></param>
  859. /// <param name="path"></param>
  860. /// <param name="tid"></param>
  861. /// <param name="type"></param>
  862. /// <param name="policyCreate_Date"></param>
  863. /// <param name="Work_Emp"></param>
  864. /// <param name="policyIndexTid"></param>
  865. /// <param name="guid"></param>
  866. /// <param name="dbNane"></param>
  867. /// <param name="Type"></param>
  868. /// <param name="audit_emp_cd"></param>
  869. /// <param name="audit_Remark"></param>
  870. /// <returns></returns>
  871. public bool AuditPolicyHistory(SqlConnection con, SqlTransaction transaction, string type, String Work_Emp, String remark, Guid guid)
  872. {
  873. try
  874. {
  875. var sql = $@"
  876. INSERT INTO chang_dbName
  877. (
  878. [audit_Gubun]
  879. ,[audit_emp_cd]
  880. ,[audit_timestamp]
  881. ,[audit_remark]
  882. ,[tid]
  883. ,[policy_tid]
  884. ,[policy_index_tid]
  885. ,[file_ck]
  886. ,[hash]
  887. ,[backup_file_id]
  888. ,[equip_cd]
  889. ,[test_no]
  890. ,[create_date]
  891. ,[use_yn]
  892. ,[work_emp]
  893. ,[upload_date]
  894. ,[insert_emp]
  895. ,[sys_plant_cd]
  896. )
  897. SELECT
  898. @Type
  899. ,@audit_emp_cd
  900. ,GETDATE()
  901. ,@audit_Remark
  902. ,[tid]
  903. ,[policy_tid]
  904. ,[policy_index_tid]
  905. ,[file_ck]
  906. ,[hash]
  907. ,[backup_file_id]
  908. ,[equip_cd]
  909. ,[test_no]
  910. ,[create_date]
  911. ,[use_yn]
  912. ,[work_emp]
  913. ,GETDATE()
  914. ,[insert_emp]
  915. ,[sys_plant_cd]
  916. FROM [di_policy_history]
  917. WHERE [backup_file_id] = @backup_file_id
  918. ";
  919. var data = new
  920. {
  921. Type = type,
  922. audit_emp_cd = Work_Emp,
  923. audit_Remark = remark,
  924. backup_file_id = guid
  925. };
  926. var sql1 = sql.Replace("chang_dbName", App._dbName + "_at.[dbo].[di_policy_history_at] ");
  927. //var sql1 = sql.Replace("chang_dbName", "DI_HISTORY_TEST_240510_at.[dbo].[di_policy_history_at] ");
  928. return 0 < con.Execute(sql1, data, transaction);
  929. }
  930. catch (Exception)
  931. {
  932. throw;
  933. }
  934. }
  935. /// <summary>
  936. /// 백업
  937. /// </summary>
  938. /// <returns></returns>
  939. public BackupResult Backup()
  940. {
  941. var successFile = 0;
  942. var totalFile = 0;
  943. var isRetry = (bool)Application.Current.Properties["user_is_retry"];
  944. var isHashCheck = (bool)Application.Current.Properties["user_is_hash"];
  945. var isLimit = (bool)Application.Current.Properties["user_is_limit"];
  946. var userDirectory = GetUserDirectory();
  947. if (null == userDirectory)
  948. {
  949. Application.Current.Properties["backup_status"] = null;
  950. log.Error("사용자 디렉터리 생성 실패");
  951. return new BackupResult()
  952. {
  953. Success = successFile,
  954. Fail = totalFile - successFile
  955. };
  956. }
  957. Application.Current.Properties["backup_status"] = "OK";
  958. var policies = GetPolicies();
  959. if (0 == policies.Count)
  960. {
  961. log.Warn("정책 없음");
  962. return new BackupResult()
  963. {
  964. Success = successFile,
  965. Fail = totalFile - successFile
  966. };
  967. }
  968. var filePolicies = policies.Where(policy => "FILE".Equals(policy.Type)).ToList();
  969. totalFile += filePolicies.Count;
  970. foreach (var policy in filePolicies)
  971. {
  972. try
  973. {
  974. var fileName = Path.GetFileName(policy.Path);
  975. var info = new FileInfo(policy.Path);
  976. policy.Create_Date = info.LastWriteTime;
  977. // 데이터베이스에 넣기전 파싱하는 부분 (시험번호, 사용자) 명명규칙
  978. string sFiletype = fileName.Substring(fileName.LastIndexOf('.') + 1);
  979. if (sFiletype == "pdf")
  980. {
  981. String[] strfileName = fileName.Split('_');
  982. if (strfileName.Length > 2)
  983. {
  984. policy.Work_Emp = strfileName[0].ToString();
  985. policy.Test_No = strfileName[1].ToString();
  986. }
  987. else
  988. {
  989. policy.Work_Emp = null;
  990. policy.Test_No = null;
  991. }
  992. }
  993. else
  994. {
  995. policy.Work_Emp = null;
  996. policy.Test_No = null;
  997. }
  998. //성공
  999. int result = AddFilePolicyHistory(policy, isHashCheck, isLimit);
  1000. if (0 < result)
  1001. {
  1002. successFile++;
  1003. if (1 == result)
  1004. {
  1005. _reportService.AddBackupReport(policy.Tid, fileName, policy.Path, true);
  1006. }
  1007. continue;
  1008. }
  1009. //실패
  1010. _reportService.AddBackupReport(policy.Tid, fileName, policy.Path, false);
  1011. ////재시도 (재시도 옵션 활성화)
  1012. //if (isRetry && 0 < AddFilePolicyHistory(policy, isHashCheck, isLimit))
  1013. //{
  1014. // successFile++;
  1015. // _reportService.AddRetryReport(policy.Tid, fileName, policy.Path, true);
  1016. // continue;
  1017. //}
  1018. ////재시도 실패 (재시도 옵션 활성화)
  1019. //if (isRetry)
  1020. //{
  1021. // _reportService.AddRetryReport(policy.Tid, fileName, policy.Path, false);
  1022. // continue;
  1023. //}
  1024. }catch(Exception e)
  1025. {
  1026. log.Error($"File 백업 오류(PolicyTid={policy.Tid})" + ", " + e.Message.ToString());
  1027. continue;
  1028. }
  1029. }
  1030. var directoryPolicies = policies.Where(policy => "DIRECTORY".Equals(policy.Type)).ToList();
  1031. foreach (var policy in directoryPolicies)
  1032. {
  1033. if (!Directory.Exists(policy.Path))
  1034. {
  1035. log.Error($"[DIRECTORY]백업 경로가 없음 (PolicyTid={policy.Tid})");
  1036. continue;
  1037. }
  1038. int curTotalFile = Directory.GetFileSystemEntries(policy.Path).Count();
  1039. totalFile += curTotalFile;
  1040. successFile += AddDirectoryPolicyHistory(policy, isRetry, isHashCheck, isLimit);
  1041. }
  1042. return new BackupResult()
  1043. {
  1044. Success = successFile,
  1045. Fail = totalFile - successFile
  1046. };
  1047. }
  1048. /// <summary>
  1049. /// 복구
  1050. /// </summary>
  1051. /// <param name="policyTid"></param>
  1052. /// <param name="indexPath"></param>
  1053. /// <param name="compareHash"></param>
  1054. /// <param name="srcStreamId"></param>
  1055. /// <returns></returns>
  1056. public bool Restore(int policyTid, string indexPath, string compareHash, DateTime create_date, Guid srcStreamId, string type, string remark)
  1057. {
  1058. var result = PolicyFileDownload(policyTid, indexPath, compareHash, create_date, srcStreamId, type, remark);
  1059. _reportService.AddRestoreReport(policyTid, Path.GetFileName(indexPath), indexPath, result);
  1060. return result;
  1061. }
  1062. /// <summary>
  1063. /// 정책 파일 다운로드
  1064. /// </summary>
  1065. /// <param name="policyTid"></param>
  1066. /// <param name="indexPath"></param>
  1067. /// <param name="compareHash"></param>
  1068. /// <param name="srcStreamId"></param>
  1069. /// <returns></returns>
  1070. public bool PolicyFileDownload(int policyTid, string indexPath, string compareHash, DateTime create_date, Guid srcStreamId, string type, string remark)
  1071. {
  1072. try
  1073. {
  1074. using (var con = new SqlConnection(App._myConnection))
  1075. {
  1076. con.Open();
  1077. using (var transaction = con.BeginTransaction())
  1078. {
  1079. var tmpDstPath = _fileTableService.DownloadFile(con, transaction, indexPath, srcStreamId);
  1080. //transaction.Commit();
  1081. if (compareHash.Equals(_hashService.FileToMD5(tmpDstPath)))
  1082. {
  1083. //File.SetCreationTime(indexPath, File.GetCreationTime(tmpDstPath));
  1084. //File.SetCreationTime(tmpDstPath, File.GetCreationTime(tmpDstPath));
  1085. if (File.Exists(indexPath))
  1086. {
  1087. File.Delete(indexPath);
  1088. }
  1089. File.Move(tmpDstPath, indexPath);
  1090. //File.Copy(tmpDstPath, indexPath, true);
  1091. //File.SetCreationTime(indexPath, File.GetCreationTime(tmpDstPath));
  1092. //File.SetCreationTime(indexPath, Convert.ToDateTime(File.GetCreationTime(tmpDstPath).ToString()));
  1093. File.SetLastWriteTime(indexPath, create_date);
  1094. //File.SetCreationTime(indexPath, Convert.ToDateTime("2023-03-12 03:47:07"));
  1095. //File.SetLastWriteTime(indexPath, Convert.ToDateTime("2023-03-13 03:47:07"));
  1096. //if (!AuditPolicyHistory(con, transaction, type, App._userCd, remark, srcStreamId))
  1097. if (!AuditPolicyHistory(con, transaction, type, App._jobuserCd, remark, srcStreamId))
  1098. {
  1099. transaction.Rollback();
  1100. return false;
  1101. }
  1102. transaction.Commit();
  1103. return true;
  1104. }
  1105. File.Delete(tmpDstPath);
  1106. transaction.Commit();
  1107. return false;
  1108. }
  1109. }
  1110. }
  1111. catch (Exception e)
  1112. {
  1113. log.Error(e);
  1114. return false;
  1115. }
  1116. }
  1117. /// <summary>
  1118. /// 모니터링 추가
  1119. /// </summary>
  1120. /// <returns></returns>
  1121. public int AddMonitor()
  1122. {
  1123. try
  1124. {
  1125. var userTid = Application.Current.Properties["user_tid"];
  1126. using (var con = new SqlConnection(App._myConnection))
  1127. {
  1128. con.Open();
  1129. var sql = @"
  1130. INSERT INTO [di_policy_monitor]
  1131. ([user_tid]
  1132. ,[start_date]
  1133. ,[end_date]
  1134. ,[is_manual]
  1135. ,[is_done]
  1136. ,[success_count]
  1137. ,[fail_count]
  1138. ,[sys_plant_cd]
  1139. )
  1140. OUTPUT
  1141. INSERTED.tid AS tid
  1142. VALUES
  1143. (@UserTid
  1144. ,GETDATE()
  1145. ,NULL
  1146. ,0
  1147. ,0
  1148. ,0
  1149. ,0
  1150. ,@sysPlantCd
  1151. )
  1152. ";
  1153. return con.Query<int>(sql, new { UserTid = userTid, sysPlantCd = App._sysPlantCd}).SingleOrDefault();
  1154. }
  1155. }
  1156. catch (Exception e)
  1157. {
  1158. log.Error(e);
  1159. return 0;
  1160. }
  1161. }
  1162. /// <summary>
  1163. /// 모니터링 변경
  1164. /// </summary>
  1165. /// <param name="policyMonitorTid"></param>
  1166. /// <param name="successCount"></param>
  1167. /// <param name="failCount"></param>
  1168. public void ModifyMonitor(int policyMonitorTid, int successCount, int failCount)
  1169. {
  1170. try
  1171. {
  1172. using (var con = new SqlConnection(App._myConnection))
  1173. {
  1174. con.Open();
  1175. var sql = @"
  1176. UPDATE [di_policy_monitor]
  1177. SET [end_date] = GETDATE()
  1178. ,[is_done] = 1
  1179. ,[success_count] = @Success
  1180. ,[fail_count] = @Fail
  1181. WHERE tid = @PolicyMonitorTid
  1182. ";
  1183. con.Query<int>(sql, new { PolicyMonitorTid = policyMonitorTid, Success = successCount, Fail = failCount }).SingleOrDefault();
  1184. }
  1185. }
  1186. catch (Exception e)
  1187. {
  1188. log.Error(e);
  1189. }
  1190. }
  1191. /// <summary>
  1192. /// 마지막 백업 모니터링 조회
  1193. /// </summary>
  1194. /// <returns></returns>
  1195. public PolicyMonitor GetLastMonitoring()
  1196. {
  1197. var userTid = Application.Current.Properties["user_tid"];
  1198. try
  1199. {
  1200. using (var con = new SqlConnection(App._myConnection))
  1201. {
  1202. con.Open();
  1203. var sql = $@"
  1204. SELECT TOP 1 [tid]
  1205. ,[user_tid]
  1206. ,[start_date]
  1207. ,[end_date]
  1208. ,[is_manual]
  1209. ,[is_done]
  1210. ,[success_count]
  1211. ,[fail_count]
  1212. FROM [di_policy_monitor]
  1213. WHERE user_tid = @UserTid
  1214. AND is_done = 1
  1215. ORDER BY start_date DESC
  1216. ";
  1217. return con.Query<PolicyMonitor>(sql, new { UserTid = userTid }).SingleOrDefault();
  1218. }
  1219. }
  1220. catch (Exception e)
  1221. {
  1222. log.Error(e);
  1223. return null;
  1224. }
  1225. }
  1226. /// <summary>
  1227. /// 파일 용량 체크
  1228. /// </summary>
  1229. /// <param name="path"></param>
  1230. /// <param name="order"></param>
  1231. /// <param name="chkSize"></param>
  1232. /// <returns></returns>
  1233. public bool FileSizeCheck(string path, string order, long chkSize)
  1234. {
  1235. long size = 0;
  1236. FileInfo info = new FileInfo(path);
  1237. long fileSize = info.Length;
  1238. switch (order)
  1239. {
  1240. case "KB":
  1241. size = (fileSize / 1024);
  1242. break;
  1243. case "MB":
  1244. size = (long)(fileSize / Math.Pow(1024, 2));
  1245. break;
  1246. case "GB":
  1247. size = (long)(fileSize / Math.Pow(1024, 3));
  1248. break;
  1249. }
  1250. if (size > chkSize)
  1251. {
  1252. return true;
  1253. }
  1254. else
  1255. {
  1256. return false;
  1257. }
  1258. }
  1259. /// <summary>
  1260. /// 업로드 제한 체크
  1261. /// (20MB 이상일 경우 하루에 한 번만 백업)
  1262. /// </summary>
  1263. /// <param name="con"></param>
  1264. /// <param name="transaction"></param>
  1265. /// <param name="filePath"></param>
  1266. /// <param name="policyTid"></param>
  1267. /// <param name="policyIndexTid"></param>
  1268. /// <returns></returns>
  1269. public bool FileUploadLimitChk(SqlConnection con, SqlTransaction transaction, string filePath, int policyTid, int policyIndexTid)
  1270. {
  1271. try
  1272. {
  1273. if (!FileSizeCheck(filePath, "MB", 20))
  1274. {
  1275. return false;
  1276. }
  1277. var sql = @"
  1278. SELECT COUNT(*)
  1279. FROM [di_policy_history]
  1280. WHERE file_ck = '1'
  1281. AND policy_tid = @PolicyTid
  1282. AND policy_index_tid = @PolicyIndexTid
  1283. AND CONVERT(CHAR(10), upload_date, 23) = CONVERT(CHAR(10), GETDATE(), 23)
  1284. ";
  1285. return 0 < con.Query<int>(sql, new { PolicyTid = policyTid, PolicyIndexTid = policyIndexTid }, transaction).SingleOrDefault();
  1286. }
  1287. catch (Exception e)
  1288. {
  1289. log.Error(e);
  1290. return false;
  1291. }
  1292. }
  1293. /// <summary>
  1294. /// 업로드 제한 체크
  1295. /// (마지막 백업한 파일과 HASH 같으면 백업 안함)
  1296. /// </summary>
  1297. /// <param name="con"></param>
  1298. /// <param name="transaction"></param>
  1299. /// <param name="policyTid"></param>
  1300. /// <param name="policyIndexTid"></param>
  1301. /// <param name="filePath"></param>
  1302. /// <returns></returns>
  1303. public bool FileUploadHashChk(SqlConnection con, SqlTransaction transaction, int policyTid, int policyIndexTid, string filePath, string fileName)
  1304. {
  1305. try
  1306. {
  1307. var willUploadFileHash = _hashService.FileToMD5(filePath);
  1308. var sql = @"
  1309. SELECT TOP 1 hash
  1310. FROM [di_policy_history] a
  1311. INNER JOIN di_policy_index b ON a.policy_tid = b.policy_tid
  1312. WHERE 1=1
  1313. --AND policy_tid = @PolicyTid
  1314. --AND policy_index_tid = @PolicyIndexTid
  1315. AND hash = @willUploadFileHash
  1316. AND name = @FileName
  1317. ORDER BY upload_date DESC
  1318. ";
  1319. //var willUploadFileHash = _hashService.FileToMD5(filePath);
  1320. return willUploadFileHash.Equals(con.Query<string>
  1321. (sql, new { PolicyTid = policyTid, PolicyIndexTid = policyIndexTid, willUploadFileHash = willUploadFileHash, FileName = fileName }, transaction).SingleOrDefault());
  1322. }
  1323. catch (Exception e)
  1324. {
  1325. log.Error(e);
  1326. return false;
  1327. }
  1328. }
  1329. /// <summary>
  1330. /// 사용자태그 확장 정책 인덱스 조회
  1331. /// </summary>
  1332. /// <returns></returns>
  1333. public List<PolicyIndexDto> GetPolicyIndexesExtendTag()
  1334. {
  1335. try
  1336. {
  1337. var userTid = Application.Current.Properties["user_tid"];
  1338. using (var con = new SqlConnection(App._myConnection))
  1339. {
  1340. var sql = $@"
  1341. SELECT T2.[tid]
  1342. ,T2.[policy_tid]
  1343. ,T2.[name]
  1344. ,T2.[path]
  1345. ,T2.[create_date]
  1346. ,T2.[last_update]
  1347. ,T1.[custom_tag1]
  1348. ,T1.[custom_tag2]
  1349. ,T1.[custom_tag3]
  1350. ,T1.[custom_tag4]
  1351. ,T1.[custom_tag5]
  1352. ,T1.[custom_tag6]
  1353. ,T1.[custom_tag7]
  1354. ,T1.[custom_tag8]
  1355. ,T1.[custom_tag9]
  1356. ,T1.[custom_tag10]
  1357. FROM [di_policy] T1
  1358. INNER JOIN [di_policy_index] T2 ON T1.tid = T2.policy_tid
  1359. WHERE 1=1
  1360. AND T1.user_tid = @UserTid
  1361. AND T1.is_delete = 0
  1362. ";
  1363. return con.Query<PolicyIndexDto>(sql, new { UserTid = userTid }).ToList();
  1364. }
  1365. }
  1366. catch (Exception e)
  1367. {
  1368. log.Error(e);
  1369. return new List<PolicyIndexDto>();
  1370. }
  1371. }
  1372. public IJobDetail GetPolicyJob()
  1373. {
  1374. return JobBuilder.Create<PolicyJob>()
  1375. .WithIdentity(_jobKey)
  1376. .Build();
  1377. }
  1378. public ITrigger GetPolicyTrigger()
  1379. {
  1380. try
  1381. {
  1382. return TriggerBuilder.Create()
  1383. .WithIdentity(_triggerKey)
  1384. .StartNow()
  1385. .WithCronSchedule(GetPolicySchedule())
  1386. .Build();
  1387. }
  1388. catch (Exception e)
  1389. {
  1390. log.Error(e);
  1391. return null;
  1392. }
  1393. }
  1394. public void ScheduledPolicyJob()
  1395. {
  1396. App.Scheduler.ScheduleJob(GetPolicyJob(), GetPolicyTrigger());
  1397. }
  1398. public void UpdateScheduledPolicyJob()
  1399. {
  1400. App.Scheduler.DeleteJob(_jobKey);
  1401. ScheduledPolicyJob();
  1402. }
  1403. private string GetPolicySchedule()
  1404. {
  1405. var backupType = Application.Current.Properties["user_backup_type"];
  1406. log.Info($"[di_user]스케줄러 주기={backupType}");
  1407. if ("REAL_TIME".Equals(backupType))
  1408. {
  1409. return "0 * * * * ?";
  1410. }
  1411. if ("EVERY_HOUR".Equals(backupType))
  1412. {
  1413. return "0 0 * * * ?";
  1414. }
  1415. if ("EVERY_DAY".Equals(backupType))
  1416. {
  1417. //return "0 30 16 * * ?";
  1418. return _jobTimer;
  1419. }
  1420. return "0 0 0 * * ?";
  1421. }
  1422. }
  1423. [DisallowConcurrentExecution]
  1424. public partial class PolicyJob : IJob
  1425. {
  1426. private static readonly ILog log = LogManager.GetLogger(typeof(PolicyJob));
  1427. private PolicyService _policyService = new PolicyService();
  1428. public void Execute(IJobExecutionContext context)
  1429. {
  1430. var policyMonitorTid = _policyService.AddMonitor();
  1431. var result = _policyService.Backup();
  1432. _policyService.ModifyMonitor(policyMonitorTid, result.Success, result.Fail);
  1433. }
  1434. }
  1435. }