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
}
}