file_manager.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7. using System.Collections.Concurrent;
  8. using Saraff.Twain;
  9. using HXX.Scanner.Common;
  10. using HXX.Scanner.Biz.Socket;
  11. using HXX.Scanner.Database;
  12. using Newtonsoft.Json;
  13. using Newtonsoft.Json.Linq;
  14. namespace HXX.Scanner.Biz
  15. {
  16. /// <summary>
  17. /// 扫描生成的图片文件相关
  18. /// </summary>
  19. public class file_manager
  20. {
  21. /// <summary>
  22. /// 当前扫描参数,复制自startScan,仅正式扫描生效
  23. /// </summary>
  24. private static file_batch_info current_scanner_parameter { get; set; }
  25. /// <summary>
  26. /// 本次扫描生成的所有文件集合
  27. /// </summary>
  28. public static ConcurrentDictionary<string, file_info> dic_file_list { get; set; }
  29. /// <summary>
  30. /// 弹框扫描是否已经初始化标记
  31. /// </summary>
  32. private static bool init_use_source_ui { get; set; }
  33. /// <summary>
  34. /// 同步块
  35. /// </summary>
  36. private static object lockObj = new object();
  37. /// <summary>
  38. /// 上传结果通知2
  39. /// </summary>
  40. public static del_http_notify2 on_http_notify2;
  41. /// <summary>
  42. /// 初始化,由startScan调用
  43. /// </summary>
  44. /// <param name="data"></param>
  45. public static void Init(cmd_startScan2 data)
  46. {
  47. current_scanner_parameter = EntityClone.DeriveCopy<cmd_startScan2, file_batch_info>(data);
  48. dic_file_list = new ConcurrentDictionary<string, file_info>();
  49. init_use_source_ui = false;
  50. }
  51. /// <summary>
  52. /// 获取当前扫描的图片,应该设置的文件参数信息
  53. /// </summary>
  54. /// <param name="engine"></param>
  55. /// <returns></returns>
  56. public static file_info get_file_info(Twain32 engine)
  57. {
  58. lock (lockObj)
  59. {
  60. init_when_use_source_ui(engine);
  61. return get_file_info2();
  62. }
  63. }
  64. /// <summary>
  65. /// 获取当前扫描的图片,应该设置的文件参数信息,主要是即将保存的文件名
  66. /// </summary>
  67. /// <returns></returns>
  68. public static file_info get_file_info2()
  69. {
  70. file_info info = EntityClone.DeriveCopy<file_batch_info, file_info>(current_scanner_parameter);
  71. //倘若是背面
  72. if (info.current_side == 2)
  73. {
  74. //获取数据库保存的正面的信息
  75. var brother = dic_file_list.FirstOrDefault(x => x.Value.SN == dic_file_list.Max(y => y.Value.SN) && x.Value.current_side == 1);
  76. if (brother.Value != null)
  77. {
  78. //同一张纸的正反面拥有同一个sn
  79. info.SN = brother.Value.SN;
  80. }
  81. else
  82. {
  83. info.SN = CommonOperation.GetTimeStamp();
  84. }
  85. }
  86. else
  87. {
  88. info.SN = CommonOperation.GetTimeStamp();
  89. }
  90. info.file_path = get_path();
  91. //info.file_ext = engine.Capabilities.ImageFileFormat.GetCurrent().ToString().ToLower();
  92. //info.file_ext = "jpeg";
  93. info.zipId = current_scanner_parameter.current_page++;
  94. info.file_ext = "bmp";
  95. //info.file_name = info.SN + "-" + info.zipId + "-" + info.current_side + "." + info.file_ext;
  96. info.file_name = info.zipId.ToString().PadLeft(6, '0') + "." + info.file_ext;
  97. info.file_full_name = info.file_path + info.file_name;
  98. dic_file_list[info.file_full_name] = info;
  99. change_side();
  100. return info;
  101. }
  102. /// <summary>
  103. /// 弹框扫描时的初始化
  104. /// </summary>
  105. /// <param name="engine"></param>
  106. private static void init_when_use_source_ui(Twain32 engine)
  107. {
  108. if (current_scanner_parameter.isLocalConfig == "1" && !init_use_source_ui)
  109. {
  110. var c_paper = engine.Capabilities.SupportedSizes.Get();
  111. var c_ab = engine.Capabilities.DuplexEnabled.Get();
  112. var paper = c_paper[c_paper.CurrentIndex].ToString();
  113. var ab = c_ab[c_ab.CurrentIndex].ToString().ToLower();
  114. var r_paper = biz_environment.get_paper_size(paper);
  115. current_scanner_parameter.paperSize = r_paper.Item1;
  116. config_environment.web_parameter.paperSize = r_paper.Item1;
  117. config_environment.paper_size = r_paper.Item2;
  118. var scanner = scanner_manager.get_current();
  119. scanner.setPaperSize(config_environment.paper_size);
  120. if (ab == "true")
  121. {
  122. current_scanner_parameter.paperSchema = 2;
  123. config_environment.web_parameter.paperSchema = 2;
  124. config_environment.scan_ab = true;
  125. }
  126. else
  127. {
  128. current_scanner_parameter.paperSchema = 1;
  129. config_environment.web_parameter.paperSchema = 1;
  130. config_environment.scan_ab = false;
  131. }
  132. init_use_source_ui = true;
  133. }
  134. }
  135. ///// <summary>
  136. ///// 获取文件保存路径
  137. ///// </summary>
  138. ///// <returns></returns>
  139. //private static string get_path()
  140. //{
  141. // StringBuilder sb = new StringBuilder();
  142. // var xx = config_manager.Get("dataDir");
  143. // if (config_environment.scan_state)
  144. // {
  145. // if (current_scanner_parameter != null)
  146. // {
  147. // if (!string.IsNullOrEmpty(config_manager.Get("dataDir")))
  148. // {
  149. // sb.Append(config_manager.Get("dataDir") + @"\");
  150. // //sb.Append(DateTime.Now.Year.ToString() + "." + DateTime.Now.Month.ToString().PadLeft(2, '0') + @"\");
  151. // //sb.Append(DateTime.Now.Year.ToString() + @"\");
  152. // sb.Append(DateTime.Now.ToString("yyyyMMdd") + @"\");
  153. // //sb.Append(current_scanner_parameter.schoolId + @"\");
  154. // sb.Append(current_scanner_parameter.examId + "-" + current_scanner_parameter.examPaperId + @"\");
  155. // //sb.Append(current_scanner_parameter.examPaperId + @"\");
  156. // sb.Append(current_scanner_parameter.batchNumber + @"\");
  157. // //if (!string.IsNullOrEmpty(current_scanner_parameter.batchNumber))
  158. // //{
  159. // // sb.Append(current_scanner_parameter.batchNumber + @"\");
  160. // //}
  161. // //else
  162. // //{
  163. // // sb.Append(@"0\");
  164. // //}
  165. // }
  166. // }
  167. // }
  168. // var dir = sb.ToString();
  169. // if (!string.IsNullOrEmpty(dir))
  170. // {
  171. // if (!Directory.Exists(dir))
  172. // {
  173. // Directory.CreateDirectory(dir);
  174. // }
  175. // }
  176. // return dir;
  177. //}
  178. /// <summary>
  179. /// 获取文件保存路径
  180. /// </summary>
  181. /// <returns></returns>
  182. private static string get_path()
  183. {
  184. StringBuilder sb = new StringBuilder();
  185. //var xx = config_manager.Get("dataDir");
  186. //if (config_environment.scan_state)
  187. {
  188. if (current_scanner_parameter != null)
  189. {
  190. if (!string.IsNullOrEmpty(config_manager.Get("dataDir")))
  191. {
  192. sb.Append(config_manager.Get("dataDir") + @"\");
  193. sb.Append(DateTime.Now.ToString("yyyyMMdd") + @"\");
  194. sb.Append(current_scanner_parameter.subjectCode + @"\");
  195. sb.Append(current_scanner_parameter.batchNumber + @"\");
  196. }
  197. }
  198. }
  199. var dir = sb.ToString();
  200. var dir_ready = dir + @"ready\";
  201. var dir_complete = dir + @"complete\";
  202. if (!string.IsNullOrEmpty(dir))
  203. {
  204. if (!Directory.Exists(dir))
  205. {
  206. Directory.CreateDirectory(dir);
  207. }
  208. if (!Directory.Exists(dir_ready))
  209. {
  210. Directory.CreateDirectory(dir_ready);
  211. }
  212. if (!Directory.Exists(dir_complete))
  213. {
  214. Directory.CreateDirectory(dir_complete);
  215. }
  216. }
  217. return dir_ready;
  218. }
  219. /// <summary>
  220. /// 翻面操作,用于双面扫描时计算文件名
  221. /// </summary>
  222. private static void change_side()
  223. {
  224. if (current_scanner_parameter.paperSchema == 2)
  225. {
  226. if (current_scanner_parameter.current_side == 1)
  227. {
  228. current_scanner_parameter.current_side = 2;
  229. }
  230. else
  231. {
  232. current_scanner_parameter.current_side = 1;
  233. //current_scanner_parameter.current_page++;
  234. }
  235. }
  236. else
  237. {
  238. //current_scanner_parameter.current_page++;
  239. }
  240. }
  241. /// <summary>
  242. /// 保存文件(包括转换图片格式,保存数据库和上传http)
  243. /// </summary>
  244. /// <param name="fileName"></param>
  245. public static void save(string fileName)
  246. {
  247. Task.Run(() =>
  248. {
  249. try
  250. {
  251. save_detail(fileName);
  252. }
  253. catch (Exception ee)
  254. {
  255. LogManager.WriteLog(ee);
  256. }
  257. });
  258. }
  259. /// <summary>
  260. /// 临时变量
  261. /// </summary>
  262. public static int temp_count = 0;
  263. ///// <summary>
  264. ///// 保存文件 详细
  265. ///// </summary>
  266. ///// <param name="fileName"></param>
  267. //private static void save_detail(string fileName)
  268. //{
  269. // ResponseEntity<response_http_uploadImg> _result = new ResponseEntity<response_http_uploadImg>() { Status = -1 };
  270. // tb_file_info entity = null;
  271. // //在保存文件前,就抢先把文件信息放入http上传队列
  272. // var e_q = new upf() { entity = null, result = _result, seqNumber = 0 };
  273. // if (config_environment.scan_type != ScanType.Test_Panel_1_Side && config_environment.scan_type != ScanType.Test_Panel_2_Sides)
  274. // {
  275. // new http_manager().Upload(e_q);
  276. // }
  277. // try
  278. // {
  279. // string dstFileName = fileName;
  280. // //文件格式转换,bmp转jpg
  281. // if (fileName.EndsWith(".tiff"))
  282. // {
  283. // dstFileName = fileName.Substring(0, fileName.Length - 1);
  284. // //压缩图片
  285. // Device_Scanner.zipImage(fileName, dstFileName, true);
  286. // }
  287. // else if (fileName.EndsWith(".bmp"))
  288. // {
  289. // //dstFileName = fileName.Substring(0, fileName.Length - 3) + "tif";
  290. // dstFileName = fileName.Substring(0, fileName.Length - 3) + "jpeg";
  291. // //压缩图片
  292. // Device_Scanner.zipImage_jpeg(fileName, dstFileName, true);
  293. // }
  294. // else if (fileName.EndsWith(".jpeg"))
  295. // {
  296. // fileName = fileName.Replace(".jpeg", ".bmp");
  297. // }
  298. // temp_count++;
  299. // //测试扫描 单面
  300. // if (config_environment.scan_type == ScanType.Test_Panel_1_Side)
  301. // {
  302. // _result.Status = 11;
  303. // _result.Message = "test scan 1";
  304. // System.Diagnostics.Process.Start("explorer.exe", config_manager.Get("dataDir"));
  305. // return;
  306. // }
  307. // //测试扫描 双面
  308. // else if (config_environment.scan_type == ScanType.Test_Panel_2_Sides)
  309. // {
  310. // if (temp_count % 2 == 1)
  311. // {
  312. // _result.Status = 11;
  313. // _result.Message = "test scan 2";
  314. // System.Diagnostics.Process.Start("explorer.exe", config_manager.Get("dataDir"));
  315. // return;
  316. // }
  317. // }
  318. // //正式扫描
  319. // else
  320. // {
  321. // var file = dic_file_list.FirstOrDefault(x => x.Key == fileName).Value;
  322. // if (file != null)
  323. // {
  324. // //更新文件信息
  325. // change_file(file, dstFileName);
  326. // //保存数据库
  327. // e_q.entity = new biz_db().Add(file);
  328. // _result.Status = 1;
  329. // _result.Message = "ok";
  330. // }
  331. // else
  332. // {
  333. // _result.Status = 0;
  334. // _result.Message = "file not found 5";
  335. // }
  336. // }
  337. // }
  338. // catch (Exception ee)
  339. // {
  340. // entity = null;
  341. // _result.Status = 0;
  342. // _result.Message = ee.Message;
  343. // LogManager.WriteLog(ee);
  344. // }
  345. // //new http_manager().Upload(entity, result);
  346. //}
  347. /// <summary>
  348. /// 保存文件 详细
  349. /// </summary>
  350. /// <param name="fileName"></param>
  351. private static void save_detail(string fileName)
  352. {
  353. ResponseEntity<response_http_uploadImg2> _result = new ResponseEntity<response_http_uploadImg2>() { Status = -1 };
  354. //在保存文件前,就抢先把文件信息放入http上传队列
  355. var e_q = new upf() { entity = null, result = _result, upload_type = upload_type_enum.normal };
  356. try
  357. {
  358. string dstFileName = fileName;
  359. //文件格式转换,bmp转jpg
  360. if (fileName.EndsWith(".tiff"))
  361. {
  362. dstFileName = fileName.Substring(0, fileName.Length - 1);
  363. //压缩图片
  364. Device_Scanner.zipImage(fileName, dstFileName, true);
  365. }
  366. else if (fileName.EndsWith(".bmp"))
  367. {
  368. //dstFileName = fileName.Substring(0, fileName.Length - 3) + "tif";
  369. dstFileName = fileName.Substring(0, fileName.Length - 3) + "jpeg";
  370. //压缩图片
  371. Device_Scanner.zipImage_jpeg(fileName, dstFileName, true);
  372. }
  373. else if (fileName.EndsWith(".jpeg"))
  374. {
  375. fileName = fileName.Replace(".jpeg", ".bmp");
  376. }
  377. temp_count++;
  378. //测试扫描 单面
  379. if (config_environment.scan_type == ScanType.Test_Panel_1_Side)
  380. {
  381. _result.Status = 11;
  382. _result.Message = "test scan 1";
  383. System.Diagnostics.Process.Start("explorer.exe", config_manager.Get("dataDir"));
  384. return;
  385. }
  386. //测试扫描 双面
  387. else if (config_environment.scan_type == ScanType.Test_Panel_2_Sides)
  388. {
  389. if (temp_count % 2 == 1)
  390. {
  391. _result.Status = 11;
  392. _result.Message = "test scan 2";
  393. System.Diagnostics.Process.Start("explorer.exe", config_manager.Get("dataDir"));
  394. return;
  395. }
  396. }
  397. //正式扫描
  398. else
  399. {
  400. if (config_environment.scan_type2 == ScanType.Formal)
  401. {
  402. var file = dic_file_list.FirstOrDefault(x => x.Key == fileName).Value;
  403. if (file != null)
  404. {
  405. //更新文件信息
  406. change_file(file, dstFileName);
  407. //保存数据库
  408. e_q.entity = new biz_db().Add(file);
  409. _result.Status = 1;
  410. _result.Message = "ok";
  411. new http_manager().Upload(e_q);
  412. }
  413. else
  414. {
  415. _result.Status = 0;
  416. _result.Message = "file not found 5";
  417. }
  418. if (e_q.entity.fi_side == 1)
  419. {
  420. //socket发送结果
  421. var count = new biz_db().get_count_by_batchNumber(e_q.entity.fi_batchSeq, e_q.entity.fi_subjectCode);
  422. var response = new response_scanNumber() { number = count, batchNumber = e_q.entity.fi_batchSeq, subjectCode = e_q.entity.fi_subjectCode };
  423. on_http_notify2(JsonConvert.SerializeObject(response));
  424. }
  425. }
  426. else if (config_environment.scan_type2 == ScanType.ScanTemplate)
  427. {
  428. var response = new response_scanTemplate();
  429. response.batchNumber = config_environment.web_parameter.batchNumber;
  430. response.subjectCode = config_environment.web_parameter.subjectCode;
  431. response.url = self_http_manager.get_url(dstFileName);
  432. response.name = Path.GetFileName(dstFileName);
  433. response.full_name = dstFileName;
  434. on_http_notify2(JsonConvert.SerializeObject(response));
  435. }
  436. }
  437. }
  438. catch (Exception ee)
  439. {
  440. _result.Status = 0;
  441. _result.Message = ee.Message;
  442. LogManager.WriteLog(ee);
  443. }
  444. //new http_manager().Upload(entity, result);
  445. }
  446. /// <summary>
  447. /// 更新文件信息
  448. /// </summary>
  449. /// <param name="file"></param>
  450. /// <param name="dstFileName"></param>
  451. private static void change_file(file_info file, string dstFileName)
  452. {
  453. file.file_full_name = dstFileName;
  454. file.file_name = Path.GetFileName(dstFileName);
  455. file.file_ext = Path.GetExtension(file.file_name).Replace(".", "");
  456. }
  457. /// <summary>
  458. /// 判断http上传的seqNumber
  459. /// </summary>
  460. /// <returns></returns>
  461. public static int get_seqNumber()
  462. {
  463. int result = 1;
  464. if (current_scanner_parameter != null)
  465. {
  466. result = current_scanner_parameter.current_page++;
  467. }
  468. return result;
  469. }
  470. }
  471. }