using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Collections.Concurrent; using Saraff.Twain; using HXX.Scanner.Common; using HXX.Scanner.Biz.Socket; using HXX.Scanner.Database; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace HXX.Scanner.Biz { /// /// 扫描生成的图片文件相关 /// public class file_manager { /// /// 当前扫描参数,复制自startScan,仅正式扫描生效 /// private static file_batch_info current_scanner_parameter { get; set; } /// /// 本次扫描生成的所有文件集合 /// public static ConcurrentDictionary dic_file_list { get; set; } /// /// 弹框扫描是否已经初始化标记 /// private static bool init_use_source_ui { get; set; } /// /// 同步块 /// private static object lockObj = new object(); /// /// 上传结果通知2 /// public static del_http_notify2 on_http_notify2; /// /// 初始化,由startScan调用 /// /// public static void Init(cmd_startScan2 data) { current_scanner_parameter = EntityClone.DeriveCopy(data); dic_file_list = new ConcurrentDictionary(); init_use_source_ui = false; } /// /// 获取当前扫描的图片,应该设置的文件参数信息 /// /// /// public static file_info get_file_info(Twain32 engine) { lock (lockObj) { init_when_use_source_ui(engine); return get_file_info2(); } } /// /// 获取当前扫描的图片,应该设置的文件参数信息,主要是即将保存的文件名 /// /// public static file_info get_file_info2() { file_info info = EntityClone.DeriveCopy(current_scanner_parameter); //倘若是背面 if (info.current_side == 2) { //获取数据库保存的正面的信息 var brother = dic_file_list.FirstOrDefault(x => x.Value.SN == dic_file_list.Max(y => y.Value.SN) && x.Value.current_side == 1); if (brother.Value != null) { //同一张纸的正反面拥有同一个sn info.SN = brother.Value.SN; } else { info.SN = CommonOperation.GetTimeStamp(); } } else { info.SN = CommonOperation.GetTimeStamp(); } info.file_path = get_path(); //info.file_ext = engine.Capabilities.ImageFileFormat.GetCurrent().ToString().ToLower(); //info.file_ext = "jpeg"; info.zipId = current_scanner_parameter.current_page++; info.file_ext = "bmp"; //info.file_name = info.SN + "-" + info.zipId + "-" + info.current_side + "." + info.file_ext; info.file_name = info.zipId.ToString().PadLeft(6, '0') + "." + info.file_ext; info.file_full_name = info.file_path + info.file_name; dic_file_list[info.file_full_name] = info; change_side(); return info; } /// /// 弹框扫描时的初始化 /// /// private static void init_when_use_source_ui(Twain32 engine) { if (current_scanner_parameter.isLocalConfig == "1" && !init_use_source_ui) { var c_paper = engine.Capabilities.SupportedSizes.Get(); var c_ab = engine.Capabilities.DuplexEnabled.Get(); var paper = c_paper[c_paper.CurrentIndex].ToString(); var ab = c_ab[c_ab.CurrentIndex].ToString().ToLower(); var r_paper = biz_environment.get_paper_size(paper); current_scanner_parameter.paperSize = r_paper.Item1; config_environment.web_parameter.paperSize = r_paper.Item1; config_environment.paper_size = r_paper.Item2; var scanner = scanner_manager.get_current(); scanner.setPaperSize(config_environment.paper_size); if (ab == "true") { current_scanner_parameter.paperSchema = 2; config_environment.web_parameter.paperSchema = 2; config_environment.scan_ab = true; } else { current_scanner_parameter.paperSchema = 1; config_environment.web_parameter.paperSchema = 1; config_environment.scan_ab = false; } init_use_source_ui = true; } } ///// ///// 获取文件保存路径 ///// ///// //private static string get_path() //{ // StringBuilder sb = new StringBuilder(); // var xx = config_manager.Get("dataDir"); // if (config_environment.scan_state) // { // if (current_scanner_parameter != null) // { // if (!string.IsNullOrEmpty(config_manager.Get("dataDir"))) // { // sb.Append(config_manager.Get("dataDir") + @"\"); // //sb.Append(DateTime.Now.Year.ToString() + "." + DateTime.Now.Month.ToString().PadLeft(2, '0') + @"\"); // //sb.Append(DateTime.Now.Year.ToString() + @"\"); // sb.Append(DateTime.Now.ToString("yyyyMMdd") + @"\"); // //sb.Append(current_scanner_parameter.schoolId + @"\"); // sb.Append(current_scanner_parameter.examId + "-" + current_scanner_parameter.examPaperId + @"\"); // //sb.Append(current_scanner_parameter.examPaperId + @"\"); // sb.Append(current_scanner_parameter.batchNumber + @"\"); // //if (!string.IsNullOrEmpty(current_scanner_parameter.batchNumber)) // //{ // // sb.Append(current_scanner_parameter.batchNumber + @"\"); // //} // //else // //{ // // sb.Append(@"0\"); // //} // } // } // } // var dir = sb.ToString(); // if (!string.IsNullOrEmpty(dir)) // { // if (!Directory.Exists(dir)) // { // Directory.CreateDirectory(dir); // } // } // return dir; //} /// /// 获取文件保存路径 /// /// private static string get_path() { StringBuilder sb = new StringBuilder(); //var xx = config_manager.Get("dataDir"); //if (config_environment.scan_state) { if (current_scanner_parameter != null) { if (!string.IsNullOrEmpty(config_manager.Get("dataDir"))) { sb.Append(config_manager.Get("dataDir") + @"\"); sb.Append(DateTime.Now.ToString("yyyyMMdd") + @"\"); sb.Append(current_scanner_parameter.subjectCode + @"\"); sb.Append(current_scanner_parameter.batchNumber + @"\"); } } } var dir = sb.ToString(); var dir_ready = dir + @"ready\"; var dir_complete = dir + @"complete\"; if (!string.IsNullOrEmpty(dir)) { if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (!Directory.Exists(dir_ready)) { Directory.CreateDirectory(dir_ready); } if (!Directory.Exists(dir_complete)) { Directory.CreateDirectory(dir_complete); } } return dir_ready; } /// /// 翻面操作,用于双面扫描时计算文件名 /// private static void change_side() { if (current_scanner_parameter.paperSchema == 2) { if (current_scanner_parameter.current_side == 1) { current_scanner_parameter.current_side = 2; } else { current_scanner_parameter.current_side = 1; //current_scanner_parameter.current_page++; } } else { //current_scanner_parameter.current_page++; } } /// /// 保存文件(包括转换图片格式,保存数据库和上传http) /// /// public static void save(string fileName) { Task.Run(() => { try { save_detail(fileName); } catch (Exception ee) { LogManager.WriteLog(ee); } }); } /// /// 临时变量 /// public static int temp_count = 0; ///// ///// 保存文件 详细 ///// ///// //private static void save_detail(string fileName) //{ // ResponseEntity _result = new ResponseEntity() { Status = -1 }; // tb_file_info entity = null; // //在保存文件前,就抢先把文件信息放入http上传队列 // var e_q = new upf() { entity = null, result = _result, seqNumber = 0 }; // if (config_environment.scan_type != ScanType.Test_Panel_1_Side && config_environment.scan_type != ScanType.Test_Panel_2_Sides) // { // new http_manager().Upload(e_q); // } // try // { // string dstFileName = fileName; // //文件格式转换,bmp转jpg // if (fileName.EndsWith(".tiff")) // { // dstFileName = fileName.Substring(0, fileName.Length - 1); // //压缩图片 // Device_Scanner.zipImage(fileName, dstFileName, true); // } // else if (fileName.EndsWith(".bmp")) // { // //dstFileName = fileName.Substring(0, fileName.Length - 3) + "tif"; // dstFileName = fileName.Substring(0, fileName.Length - 3) + "jpeg"; // //压缩图片 // Device_Scanner.zipImage_jpeg(fileName, dstFileName, true); // } // else if (fileName.EndsWith(".jpeg")) // { // fileName = fileName.Replace(".jpeg", ".bmp"); // } // temp_count++; // //测试扫描 单面 // if (config_environment.scan_type == ScanType.Test_Panel_1_Side) // { // _result.Status = 11; // _result.Message = "test scan 1"; // System.Diagnostics.Process.Start("explorer.exe", config_manager.Get("dataDir")); // return; // } // //测试扫描 双面 // else if (config_environment.scan_type == ScanType.Test_Panel_2_Sides) // { // if (temp_count % 2 == 1) // { // _result.Status = 11; // _result.Message = "test scan 2"; // System.Diagnostics.Process.Start("explorer.exe", config_manager.Get("dataDir")); // return; // } // } // //正式扫描 // else // { // var file = dic_file_list.FirstOrDefault(x => x.Key == fileName).Value; // if (file != null) // { // //更新文件信息 // change_file(file, dstFileName); // //保存数据库 // e_q.entity = new biz_db().Add(file); // _result.Status = 1; // _result.Message = "ok"; // } // else // { // _result.Status = 0; // _result.Message = "file not found 5"; // } // } // } // catch (Exception ee) // { // entity = null; // _result.Status = 0; // _result.Message = ee.Message; // LogManager.WriteLog(ee); // } // //new http_manager().Upload(entity, result); //} /// /// 保存文件 详细 /// /// private static void save_detail(string fileName) { ResponseEntity _result = new ResponseEntity() { Status = -1 }; //在保存文件前,就抢先把文件信息放入http上传队列 var e_q = new upf() { entity = null, result = _result, upload_type = upload_type_enum.normal }; try { string dstFileName = fileName; //文件格式转换,bmp转jpg if (fileName.EndsWith(".tiff")) { dstFileName = fileName.Substring(0, fileName.Length - 1); //压缩图片 Device_Scanner.zipImage(fileName, dstFileName, true); } else if (fileName.EndsWith(".bmp")) { //dstFileName = fileName.Substring(0, fileName.Length - 3) + "tif"; dstFileName = fileName.Substring(0, fileName.Length - 3) + "jpeg"; //压缩图片 Device_Scanner.zipImage_jpeg(fileName, dstFileName, true); } else if (fileName.EndsWith(".jpeg")) { fileName = fileName.Replace(".jpeg", ".bmp"); } temp_count++; //测试扫描 单面 if (config_environment.scan_type == ScanType.Test_Panel_1_Side) { _result.Status = 11; _result.Message = "test scan 1"; System.Diagnostics.Process.Start("explorer.exe", config_manager.Get("dataDir")); return; } //测试扫描 双面 else if (config_environment.scan_type == ScanType.Test_Panel_2_Sides) { if (temp_count % 2 == 1) { _result.Status = 11; _result.Message = "test scan 2"; System.Diagnostics.Process.Start("explorer.exe", config_manager.Get("dataDir")); return; } } //正式扫描 else { if (config_environment.scan_type2 == ScanType.Formal) { var file = dic_file_list.FirstOrDefault(x => x.Key == fileName).Value; if (file != null) { //更新文件信息 change_file(file, dstFileName); //保存数据库 e_q.entity = new biz_db().Add(file); _result.Status = 1; _result.Message = "ok"; new http_manager().Upload(e_q); } else { _result.Status = 0; _result.Message = "file not found 5"; } if (e_q.entity.fi_side == 1) { //socket发送结果 var count = new biz_db().get_count_by_batchNumber(e_q.entity.fi_batchSeq, e_q.entity.fi_subjectCode); var response = new response_scanNumber() { number = count, batchNumber = e_q.entity.fi_batchSeq, subjectCode = e_q.entity.fi_subjectCode }; on_http_notify2(JsonConvert.SerializeObject(response)); } } else if (config_environment.scan_type2 == ScanType.ScanTemplate) { var response = new response_scanTemplate(); response.batchNumber = config_environment.web_parameter.batchNumber; response.subjectCode = config_environment.web_parameter.subjectCode; response.url = self_http_manager.get_url(dstFileName); response.name = Path.GetFileName(dstFileName); response.full_name = dstFileName; on_http_notify2(JsonConvert.SerializeObject(response)); } } } catch (Exception ee) { _result.Status = 0; _result.Message = ee.Message; LogManager.WriteLog(ee); } //new http_manager().Upload(entity, result); } /// /// 更新文件信息 /// /// /// private static void change_file(file_info file, string dstFileName) { file.file_full_name = dstFileName; file.file_name = Path.GetFileName(dstFileName); file.file_ext = Path.GetExtension(file.file_name).Replace(".", ""); } /// /// 判断http上传的seqNumber /// /// public static int get_seqNumber() { int result = 1; if (current_scanner_parameter != null) { result = current_scanner_parameter.current_page++; } return result; } } }