2025-03-28 09:49:56 +08:00

277 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using HZQR.Common;
using ICSharpCode.SharpZipLib.Zip;
using Newtonsoft.Json.Linq;
using SocketTransfer.SDK;
namespace Unzip
{
partial class Service1 : ServiceBase
{
string _OracleConnStr = ConfigurationManager.AppSettings["OracleConnStr"].ToString();//数据库连接字符串
string Master_Table = ConfigurationManager.AppSettings["Master_Table"].ToString();//销售流水主表名
string Details_Table = ConfigurationManager.AppSettings["Details_Table"].ToString();//销售流水详情表名
string ZipUrl = ConfigurationManager.AppSettings["ZipUrl"].ToString();//待解压文件绝对路径
string ExecTime = ConfigurationManager.AppSettings["ExecTime"].ToString();//服务执行间隔时间,小时为单位
System.Timers.Timer _timer = new System.Timers.Timer();//定时器
public Service1()
{
InitializeComponent();
}
#region ->
protected override void OnStart(string[] args)
{
// TODO: 在此处添加代码以启动服务。
int ExecHour = Convert.ToInt32(ExecTime == "" ? "1" : ExecTime);
int _interval = ExecHour * 60 * 60 * 1000;
_timer.Interval = _interval;
_timer.AutoReset = true;
_timer.Enabled = true;
_timer.Elapsed += new System.Timers.ElapsedEventHandler(ActionRun);
_timer.Start();
LogUtil.WriteLog(null, "文件解压服务启动", "文件解压服务");
RunProccess();
}
#endregion
#region ->
protected override void OnStop()
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
_timer.AutoReset = false;
_timer.Enabled = false;
_timer.Stop();
LogUtil.WriteLog(null, "文件解压服务停止", "文件解压服务");
}
#endregion
#region ->
private void ActionRun(object sender, System.Timers.ElapsedEventArgs e)
{
RunProccess();
}
#endregion
#region ->
private void RunProccess()
{
try
{
if (ZipUrl == "")
{
LogUtil.WriteLog(null, "文件解压失败:文件夹路径不能为空", "文件解压服务");
}
else
{
string fileName = ZipUrl;
OracleHelper _OracleHelper = new OracleHelper(_OracleConnStr.Split(',')[0],
_OracleConnStr.Split(',')[1], _OracleConnStr.Split(',')[2], _OracleConnStr.Split(',')[3]);
//获取给定路径下-所有匹配文件
DirectoryInfo dic = new DirectoryInfo(@fileName.TrimEnd('\\'));
//获取指定路径下所有zip文件
FileInfo[] filesDic = dic.GetFiles("*.zip", SearchOption.TopDirectoryOnly).Distinct().ToArray();
//获取指定路径下所有文件夹
DirectoryInfo[] dicInfo = dic.GetDirectories("*", SearchOption.TopDirectoryOnly).Distinct().ToArray();
if (filesDic.Length > 0)
{
ForFile(filesDic, fileName, _OracleHelper);
}
if (dicInfo.Length > 0)
{
//循环文件夹找出所有zip文件并解压
foreach (DirectoryInfo item in dicInfo)
{
if (item.FullName.Contains("SystemLog"))
{
continue;
}
FileInfo[] filesInfo = item.GetFiles("*.zip", SearchOption.TopDirectoryOnly).Distinct().ToArray();
if (filesInfo.Length > 0)
{
ForFile(filesInfo, item.FullName, _OracleHelper);
}
}
}
}
}
catch (Exception ex)
{
LogUtil.WriteLog(null, "文件解压失败:" + ex.Message, "文件解压服务");
}
}
#endregion
#region ->
private void ForFile(FileInfo[] filesInfo, string fileName, OracleHelper _OracleHelper)
{
string error = "";
//已解压的zip文件移动到该文件夹下
string SavaZipUrl = fileName + "\\" + "ZIP";
if (!Directory.Exists(SavaZipUrl))
{
Directory.CreateDirectory(SavaZipUrl);
}
foreach (FileInfo item in filesInfo)
{
if (UnZip(item, fileName, ref error))
{
//将已解压zip文件移动到ZIP文件夹中
if (!File.Exists(SavaZipUrl + "\\" + item.Name))
{
File.Move(item.FullName, SavaZipUrl + "\\" + item.Name);
}
LogUtil.WriteLog(null, "文件【" + item.FullName + "】解压成功", "文件解压服务");
#region T_SELLMASTERT_SELLDETAILS插入数据
string sql;
string DirectoryPath = fileName + "\\" + item.Name.Replace(item.Extension, "");
//表T_SELLMASTER
if (File.Exists(DirectoryPath + "\\T_SELLMASTER.txt"))
{
string masterfile = File.ReadAllText(DirectoryPath + "\\T_SELLMASTER.txt", Encoding.Default);
var jar = JArray.Parse(masterfile);
foreach (JObject data in jar)
{
DataTable dt = _OracleHelper.ExcuteSqlGetDataSet(@"SELECT COUNT(1) FROM " + Master_Table +
" WHERE SELLMASTER_CODE='" + data["SELLMASTER_CODE"] + "'").Tables[0];
if (Convert.ToInt32(dt.Rows[0][0]) == 0)
{
sql = string.Format(@"INSERT INTO {28}
(SELLMASTER_ID,SELLMASTER_CODE,SERVERPARTCODE,SERVERPART_NAME,
SHOPCODE,SHOPNAME,MACHINECODE,SELLWORKER_CODE,SELLWORKER_NAME,
SELLMASTER_DATE,TICKET_CODE,SELLMASTER_COUNT,SELLMASTER_OFFPRICE,
SELLMASTER_AMOUNT,CASHPAY,BANKPAY,MEMBERPAY,COUPONPAY,MOBILEPAY,
INTERNALPAY,OTHERPAY,PAYMENT_TYPE,MOBILEPAY_CODE,MERCHANT_ORDER,
SELLMASTER_DESC,TRANSFER_STATE,PAY_AMOUNT,COUPON_TYPE,SELLMASTER_STATE)
VALUES ({0},'{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}',
TO_TIMESTAMP('{9}','YYYY-MM-DD HH24:MI:SS'),'{10}',{11},{12},
{13},{14},{15},{16},{17},{18},{19},{20},'{21}','{22}','{23}',
'{24}',{25},{26},'{27}',{29})",
data["SELLMASTER_ID"], data["SELLMASTER_CODE"], data["SERVERPARTCODE"], data["SERVERPART_NAME"],
data["SHOPCODE"], data["SHOPNAME"], data["MACHINECODE"], data["SELLWORKER_CODE"], data["SELLWORKER_NAME"],
data["SELLMASTER_DATE"], data["TICKET_CODE"], data["SELLMASTER_COUNT"], data["SELLMASTER_OFFPRICE"],
data["SELLMASTER_AMOUNT"], data["CASHPAY"], data["BANKPAY"], data["MEMBERPAY"], data["COUPONPAY"],
data["MOBILEPAY"], data["INTERNALPAY"], data["OTHERPAY"], data["PAYMENT_TYPE"],
data["MOBILEPAY_CODE"], data["MERCHANT_ORDER"], data["SELLMASTER_DESC"], 0,
data["PAY_AMOUNT"], data["COUPON_TYPE"], Master_Table,
data["SELLMASTER_STATE"] == null ? "9" : data["SELLMASTER_STATE"].ToString());
_OracleHelper.ExcuteSql(sql);
}
}
File.Delete(DirectoryPath + "\\T_SELLMASTER.txt");
}
//表T_SELLDETAILS
if (File.Exists(DirectoryPath + "\\T_SELLDETAILS.txt"))
{
string detailFile = File.ReadAllText(DirectoryPath + "\\T_SELLDETAILS.txt", Encoding.Default);
var jar = JArray.Parse(detailFile);
foreach (JObject data in jar)
{
DataTable dt = _OracleHelper.ExcuteSqlGetDataSet(@"SELECT COUNT(1) FROM " + Details_Table +
" WHERE SELLDETAILS_ID=" + data["SELLDETAILS_ID"] + " AND SELLMASTER_CODE = '" +
data["SELLMASTER_CODE"] + "'").Tables[0];
if (Convert.ToInt32(dt.Rows[0][0]) == 0)
{
sql = string.Format(@"INSERT INTO {16}
(SELLDETAILS_ID,SELLMASTER_CODE,COMMODITY_CODE,COMMODITY_BARCODE,
COMMODITY_NAME,SELLDETAILS_COUNT,SELLDETAILS_PRICE,SELLDETAILS_OFFPRICE,
SELLDETAILS_AMOUNT,LINENUM,PAYMENT_TYPE,CREATE_DATE,
SELLDETAILS_DESC,TRANSFER_STATE,COMMODITY_SYMBOL,COMMODITY_TYPE)
VALUES ({0},'{1}','{2}','{3}','{4}',{5},{6},{7},
{8},{9},'{10}',TO_TIMESTAMP('{11}','YYYY-MM-DD HH24:MI:SS'),
'{12}',{13},'{14}','{15}')",
data["SELLDETAILS_ID"], data["SELLMASTER_CODE"], data["COMMODITY_CODE"], data["COMMODITY_BARCODE"],
data["COMMODITY_NAME"], data["SELLDETAILS_COUNT"], data["SELLDETAILS_PRICE"], data["SELLDETAILS_OFFPRICE"],
data["SELLDETAILS_AMOUNT"], data["LINENUM"], data["PAYMENT_TYPE"], data["CREATE_DATE"],
data["SELLDETAILS_DESC"], 0, data["COMMODITY_SYMBOL"], data["COMMODITY_TYPE"], Details_Table);
_OracleHelper.ExcuteSql(sql);
}
}
File.Delete(DirectoryPath + "\\T_SELLDETAILS.txt");
}
#endregion
Directory.Delete(DirectoryPath);
LogUtil.WriteLog(null, "文件夹【" + DirectoryPath + "】删除成功", "文件夹删除");
}
else
{
LogUtil.WriteLog(null, "文件【" + item.FullName + "】解压失败:" + error, "文件解压服务");
}
}
}
#endregion
#region -> Zip文件
private bool UnZip(FileInfo zipFile, string url, ref string error)
{
ZipEntry zipEntry;
string fileUrl = url + "\\" + zipFile.Name.Replace(zipFile.Extension, "");
try
{
using (ZipInputStream zipInput = new ZipInputStream(File.OpenRead(zipFile.FullName)))
{
//判断存储解压数据的文件夹是否存在
if (!Directory.Exists(fileUrl))
{
Directory.CreateDirectory(fileUrl);
}
while ((zipEntry = zipInput.GetNextEntry()) != null)
{
if (!string.IsNullOrWhiteSpace(zipEntry.Name))
{
//文件是否为目录路径
if (zipEntry.IsDirectory)
{
if (!Directory.Exists(fileUrl + "\\" + zipEntry.Name))
{
Directory.CreateDirectory(fileUrl + "\\" + zipEntry.Name);
}
}
else
{
if (!File.Exists(fileUrl + "\\" + zipEntry.Name))
{
FileStream stream = File.Create(fileUrl + "\\" + zipEntry.Name);
byte[] data = new byte[zipEntry.Size];
int size = Convert.ToInt32(zipEntry.Size);
//读取文件数据
size = zipInput.Read(data, 0, data.Length);
if (size == 0)
break;
stream.Write(data, 0, size);
stream.Close();
}
}
}
}
zipInput.Close();
}
return true;
}
catch (Exception ex)
{
error = ex.Message;
return false;
}
}
#endregion
}
}