using System; using System.Configuration; using System.IO; using System.Linq; using System.ServiceProcess; using SocketTransfer.SDK; using HZQR.Common; namespace Unzip { partial class UnzipFileService : ServiceBase { /// /// 流水数据库连接字符串 /// string _OracleConnStr = ConfigurationManager.AppSettings["OracleConnStr"].ToString(); /// /// 经营数据的数据库连接字符串 /// string _OracleConnStr_Business = ConfigurationManager.AppSettings["OracleConnStr_Business"].ToString(); string ZipUrl = ConfigurationManager.AppSettings["ZipUrl"].ToString(); //待解压文件绝对路径 string ExecTime = ConfigurationManager.AppSettings["ExecTime"].ToString(); //服务执行间隔时间,小时为单位 System.Timers.Timer _timer = new System.Timers.Timer(); //定时器 public UnzipFileService() { InitializeComponent(); } #region 方法 -> 开启服务 protected override void OnStart(string[] args) { // TODO: 在此处添加代码以启动服务。 int ExecMinutes = Convert.ToInt32(ExecTime == "" ? "1" : ExecTime); int _interval = ExecMinutes * 60 * 1000; //设置定时任务执行间隔(分钟) _timer.Interval = _interval; _timer.AutoReset = true; _timer.Enabled = true; _timer.Elapsed += new System.Timers.ElapsedEventHandler(ActionRun); _timer.Start(); LogUtil.WriteLog("文件解压服务启动"); RunProccess(); } #endregion #region 方法 -> 停止服务 protected override void OnStop() { // TODO: 在此处添加代码以执行停止服务所需的关闭操作。 _timer.AutoReset = false; _timer.Enabled = false; _timer.Stop(); LogUtil.WriteLog("文件解压服务停止"); } #endregion #region 方法 -> 执行文件解压操作 private void ActionRun(object sender, System.Timers.ElapsedEventArgs e) { RunProccess(); //处理异常解压缩日志 ReUnzipErrorFile(); } #endregion #region 方法 -> 执行解压操作,并插入数据库 /// /// 解压收银机上传的文本文件,并插入数据库 /// 自然日口径:前一日销售流水表、前一日销售流水明细表 /// 账期口径:单品数据表、异常稽核表、异常稽核明细表、异常稽核统计表、移动支付异常记录表、促销流水表、日志文件 /// public void RunProccess() { try { if (ZipUrl == "") { LogUtil.WriteLog("文件解压失败:文件夹路径不能为空"); } else { string fileName = ZipUrl; //获取存储流水、异常稽核、移动支付的数据库连接(数据库在151orcl) OracleHelper _OracleHelper = new OracleHelper(_OracleConnStr.Split(',')[0], _OracleConnStr.Split(',')[1], _OracleConnStr.Split(',')[2], _OracleConnStr.Split(',')[3]); //获取存储单品数据、促销流水的数据库连接(数据库在175orcl) OracleHelper _OracleHelper_Business = new OracleHelper(_OracleConnStr_Business.Split(',')[0], _OracleConnStr_Business.Split(',')[1], _OracleConnStr_Business.Split(',')[2], _OracleConnStr_Business.Split(',')[3]); //获取给定路径下-所有匹配文件 DirectoryInfo dir = new DirectoryInfo(@fileName.TrimEnd('\\')); //解压自然日文件夹下面的压缩文件:销售 Method.UnZipHelper.UnZipDirFiles(dir, "PosDataFile_NaturalDay", _OracleHelper, _OracleHelper_Business); //解压日结营收文件夹下面的压缩文件 Method.UnZipHelper.UnZipDirFiles(dir, "PosDataFile_EndAccount", _OracleHelper, _OracleHelper_Business); //解压重传的日结营收文件夹下面的压缩文件 Method.UnZipHelper.ReUnZipDirFiles(dir, "PosDataFile_ReEndAccount", _OracleHelper, _OracleHelper_Business); } } catch (Exception ex) { LogUtil.WriteLog("文件解压失败:" + ex.Message); } finally { LogUtil.WriteLog("///------------执行结束------------///"); } } #endregion #region 方法 -> 重新检测解压缩异常的日志记录,删除已经插入的数据,将当日的所有压缩文件合并到一起,去除重复数据后再执行插入 public void ReUnzipErrorFile() { try { if (ZipUrl == "") { LogUtil.WriteLog("文件解压失败:文件夹路径不能为空"); } else { //获取存储流水的数据库连接(数据库在151orcl) OracleHelper _OracleHelper = new OracleHelper(_OracleConnStr.Split(',')[0], _OracleConnStr.Split(',')[1], _OracleConnStr.Split(',')[2], _OracleConnStr.Split(',')[3]); //记录异常日志的数据库连接(数据库在175orcl) OracleHelper _OracleHelper_Business = new OracleHelper(_OracleConnStr_Business.Split(',')[0], _OracleConnStr_Business.Split(',')[1], _OracleConnStr_Business.Split(',')[2], _OracleConnStr_Business.Split(',')[3]); //获取自然日压缩文件所在的文件目录 string fileName = ZipUrl + "\\PosDataFile_NaturalDay"; DirectoryInfo dirDaily = new DirectoryInfo(@fileName.TrimEnd('\\')); //重新检测解压缩异常的日志记录 Method.UnZipHelper.ReUnzipErrorFile(dirDaily, _OracleHelper, _OracleHelper_Business); } } catch (Exception ex) { LogUtil.WriteLog("文件解压失败:" + ex.Message); } finally { LogUtil.WriteLog("///------------执行结束------------///"); } } #endregion } }