You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

685 lines
27 KiB

using Newtonsoft.Json;
using NFine.Code;
using NFine.Data.Extensions;
using NFine.Domain._03_Entity.SRM;
using NFine.Repository;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Reflection;
using System.Data.SqlClient;
using UpdateServiceLibrary.Helper;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Web;
namespace NFine.Application.WMS
{
public class SystemUpdateApp : RepositoryFactory<ICSVendor>
{
//public string DownloadFileFolder = @"C:\path\folder";
//public string UpdateFileFolder = @"C:\path\folder2";
public static DataTable Invmes = new DataTable();
PickMaterialApp App = new PickMaterialApp();
DownLoadFileHelper downLoadFileHelper = new DownLoadFileHelper();
FileHelper helper = new FileHelper();
#region 获取更新文件信息
/// <summary>
///获取更新文件信息
/// </summary>
/// <returns></returns>
public string GetFileList()
{
string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
string result = String.Empty;
try
{
result = JsonConvert.SerializeObject(GetUpdateFilesDetail().FaBuList);
}
catch (Exception ex)
{
result = ex.Message;
}
return result;
}
#endregion
#region 获取详情信息
/// <summary>
/// 获取详情信息
/// </summary>
/// <returns></returns>
public string GetFilesDetail(string faBuNum)
{
string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
string result = String.Empty;
try
{
result = JsonConvert.SerializeObject(GetUpdateFilesDetail(faBuNum).FaBuList[0].Files);
}
catch (Exception ex)
{
result = ex.Message;
}
return result;
}
#endregion
#region 获取文件信息
/// <summary>
/// 获取文件信息
/// </summary>
/// <returns></returns>
public JsonData GetUpdateFilesDetail(string faBuNum="")
{
JsonData result;
try
{
string sql = @"SELECT F_FullName,F_Description FROM [dbo].[Sys_SRM_Items] WHERE F_EnCode = 'SystemUpdate'";
var dt = SqlHelper.CmdExecuteDataTable(sql);
if (dt.Rows.Count <= 0)
{
throw new Exception("请先在自定义档案维护客户信息");
}
TypeModel model = new TypeModel
{
CustomerName = dt.Rows[0]["F_FullName"].ToString(),
XTType = "WMS",
FaBuNum = faBuNum
};
string Inputstr = JsonConvert.SerializeObject(model);
string APIURL = dt.Rows[0]["F_Description"].ToString()+ "APIGetFaBuFile";
string jsonString = HttpPost(APIURL, Inputstr);
result = JsonConvert.DeserializeObject<JsonData>(jsonString);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return result;
}
#endregion
#region 接口api解析
/// <summary>
/// 接口api解析
/// </summary>
/// <param name="url">地址</param>
/// <param name="body">参数</param>
/// <returns></returns>
public static string HttpPost(string url, string body)
{
try
{
Encoding encoding = Encoding.UTF8;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Accept = "application/json, text/javascript, */*"; //"text/html, application/xhtml+xml, */*";
request.ContentType = "application/json; charset=utf-8";
byte[] buffer = encoding.GetBytes(body);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
{
return reader.ReadToEnd();
}
}
catch (WebException ex)
{
throw new Exception(ex.Message);
}
}
#endregion
#region 调用更新接口
/// <summary>
/// 调用更新接口
/// </summary>
/// <returns></returns>
public ResultModel ConfirmDown(string faBuNum)
{
ResultModel result;
try
{
string userName = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
string sql = @"SELECT F_FullName,F_Description FROM [dbo].[Sys_SRM_Items] WHERE F_EnCode = 'SystemUpdate'";
string ip1=string.Empty;
var dt = SqlHelper.CmdExecuteDataTable(sql);
if (dt.Rows.Count<=0)
{
throw new Exception("请先在自定义档案维护客户信息");
}
// 获取所有的网络接口
NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
// 遍历所有网络接口,寻找当前活动的接口(即已连接的网络接口)
foreach (NetworkInterface networkInterface in networkInterfaces)
{
// 如果网络接口是活动的(即已连接)
if (networkInterface.OperationalStatus == OperationalStatus.Up)
{
// 获取该接口的所有IP地址信息
UnicastIPAddressInformationCollection ipAddressInfo = networkInterface.GetIPProperties().UnicastAddresses;
// 遍历IP地址信息,寻找IPv4地址
foreach (UnicastIPAddressInformation ip in ipAddressInfo)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
// 输出IPv4地址
ip1= ip.Address.ToString();
// 如果只需要第一个IPv4地址,可以在找到后退出循环
break;
}
}
}
}
ConfirmDownModel model = new ConfirmDownModel
{
CustomerName = dt.Rows[0]["F_FullName"].ToString(),
PersonName = userName,
FaBuNum = faBuNum,
IP1= ip1
};
string Inputstr = JsonConvert.SerializeObject(model);
string APIURL = dt.Rows[0]["F_Description"].ToString()+ "APIConfirmDownFaBuFile";
string jsonString = HttpPost(APIURL, Inputstr);
result = JsonConvert.DeserializeObject<ResultModel>(jsonString);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return result;
}
#endregion
/// <summary>
/// 更新文件
/// </summary>
/// <param name="savePath"></param>
/// <param name="Year"></param>
/// <returns></returns>
public string UpdateFiles(String keyValue)
{
string msg = string.Empty;
//数据获取
try
{
string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
SqlConnection conn = SqlHelper.GetDataCenterConn();
//获取文件版本号
List<string> filesArr = keyValue.Split(',').Where(o=>!o.IsEmpty()).ToList();
string publishPath = System.AppDomain.CurrentDomain.BaseDirectory;
string name = new DirectoryInfo(publishPath).Name + "-WMSBSBackup";
string DownloadFileFolder = Path.Combine(new DirectoryInfo(publishPath).Parent.FullName, name);
if (!Directory.Exists(DownloadFileFolder))
Directory.CreateDirectory(DownloadFileFolder);
// 获取文件夹的DirectoryInfo对象
DirectoryInfo directoryInfo = new DirectoryInfo(DownloadFileFolder);
string folderPrefix = DateTime.Now.ToString("yyyyMMdd"); // 你想要匹配的文件夹前缀
//string newFolderName=string.Empty; // 新文件夹的名称
string newFolderPath = string.Empty;
// 获取所有以指定前缀开头的文件夹
var directories = Directory.GetDirectories(DownloadFileFolder, folderPrefix + "*")
.Select(dir => new DirectoryInfo(dir))
.ToList();
// 如果没有找到任何文件夹,则直接创建新文件夹
if (!directories.Any())
{
newFolderPath = Path.Combine(DownloadFileFolder, folderPrefix + "01");
Directory.CreateDirectory(newFolderPath);
}
else
{
// 解析文件夹名称以获取流水号,并找出最大的流水号
int maxSerialNumber = directories
.Select(dir => int.Parse(dir.Name.Substring(folderPrefix.Length)))
.Max();
// 流水号加1,并创建新文件夹
int newSerialNumber = maxSerialNumber + 1;
newFolderPath = Path.Combine(DownloadFileFolder, $"{folderPrefix}{newSerialNumber:D2}"); // D2表示格式化为两位数
}
Exception exception = null;
Directory.CreateDirectory(newFolderPath);
filesArr.ForEach(faBuNum =>
{
var files = GetUpdateFilesDetail(faBuNum).FaBuList[0].Files;
//List<Files> files = new List<Files>();
//Files f1 = new Files {
// FilePath = "http://119.3.29.177:8013/ReportFile/ProjectFaBuFile/发布文件202403060331541test.sql"
//};
//Files f2 = new Files
//{
// FilePath = "http://119.3.29.177:8013/ReportFile/ProjectFaBuFile/发布文件202403060329051系统更新压缩补丁包.zip"
//};
//files.Add(f1);
//files.Add(f2);
var downloadFolder = Path.Combine(newFolderPath, faBuNum);
if (!Directory.Exists(downloadFolder))
Directory.CreateDirectory(downloadFolder);
var UpdateFileFolder = Path.Combine(downloadFolder, "UnZip");
if (!Directory.Exists(UpdateFileFolder))
Directory.CreateDirectory(UpdateFileFolder);
//备份需要替换的文件
var backUpfolder = Path.Combine(newFolderPath, "Backup");
if (!Directory.Exists(backUpfolder))
Directory.CreateDirectory(backUpfolder);
files.ForEach(info =>
{
var downloadFilePath = Path.Combine(downloadFolder, Path.GetFileName(info.FilePath));
//下载文件
var downLoad = downLoadFileHelper.DownloadFile(info.FilePath, downloadFilePath);
if (!downLoad.IsSuccess)
{
throw new Exception(downLoad.Data.Message);
}
//获取文件的名称
string fileName = Path.GetFileNameWithoutExtension(downloadFilePath);
//获取后缀名
string fileNameExtension = Path.GetExtension(downloadFilePath);
//判断文件名称,进行解压缩操作
if (fileName.EndsWith("系统更新压缩补丁包"))
{
//if (Directory.Exists(UpdateFileFolder))
// Directory.Delete(UpdateFileFolder, true);
var unzip = ZipHelper.Unzip(new FileInfo(downloadFilePath), new DirectoryInfo(UpdateFileFolder));
if (!unzip.IsSuccess)
{
throw new Exception(unzip.Message);
}
//备份需要替换的文件
//var backUpfolder = Path.Combine(new DirectoryInfo(publishPath).Parent.FullName, "Backup");
//if (!Directory.Exists(backUpfolder))
// Directory.CreateDirectory(backUpfolder);
var backupPath = Path.Combine(backUpfolder, DateTime.Now.ToString("yyyyMMddHHmmss")+".zip");
ZipHelper.ZipFile(new DirectoryInfo(publishPath), new FileInfo(backupPath));
//移动替换文件
FileController.MoveFolder(UpdateFileFolder, publishPath);
Directory.Delete(UpdateFileFolder, true);
}
else if (fileNameExtension == ".sql")
{
try
{
//读取文件中的内容,并执行sql语句
string sqlText = File.ReadAllText(downloadFilePath);
//执行sql语句
SqlHelper.CmdExecuteNonQueryLi(sqlText);
}
catch(Exception ex)
{
msg = fileName+ "脚本执行失败,请手动操作\n" + ex;
exception = ex;
}
}
});
//替换成功,调接口
var returnModel = ConfirmDown(faBuNum);
});
if (exception != null)
throw exception;
return msg;
}
catch (Exception ex)
{
throw new Exception(msg+ex.Message);
}
}
#region 更新文件
/// <summary>
/// 更新文件
/// </summary>
/// <param name="uploadedFileName">上传的文件名</param>
/// <param name="fileStream">上传的文件流</param>
/// <param name="savePath">上传文件目标文件夹</param>
/// <returns></returns>
public string UpdateFiles(string uploadedFileName, Stream fileStream,string savePath)
{
string msg = string.Empty;
//数据获取
try
{
SqlConnection conn = SqlHelper.GetDataCenterConn();
string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
#region 校验文件名规则
// 压缩包命名规则 发布客户~系统类型~发布单据号
int index = uploadedFileName.LastIndexOf('.');
var informationArr = Path.GetFileName(uploadedFileName.Substring(0, index)).Split('~');
if (informationArr.Length <= 0)
{
msg = "文件命名规则必须是:发布客户~系统类型~发布单据号,请确认";
return msg;
}
string sql = @"SELECT F_FullName,F_Description FROM [dbo].[Sys_SRM_Items] WHERE F_EnCode = 'SystemUpdate'";
var dt = SqlHelper.CmdExecuteDataTable(sql);
if (dt.Rows.Count <= 0)
{
throw new Exception("请先在自定义档案维护客户信息");
}
if (dt.Rows[0]["F_FullName"].ToString() != informationArr[0])
{
msg = $"更新文件客户名称:{informationArr[0]}和系统客户名称:{dt.Rows[0]["F_FullName"]}不一致";
return msg;
}
if (informationArr[1] != "WMS")
{
msg = $"请确保更新文件系统为WMS";
return msg;
}
#endregion
var uploadfile = Path.Combine(savePath, uploadedFileName);
#region 保存文件
if (!Directory.Exists(savePath))
Directory.CreateDirectory(savePath);
var buff = new byte[1024 * 1024];
int len = 0;
using (var nf = new FileStream(uploadfile, FileMode.OpenOrCreate))
{
while ((len = fileStream.Read(buff, 0, buff.Length)) > 0)
{
nf.Write(buff, 0, len);
nf.Flush();
}
}
#endregion
#region 生成文件解压路径
//获取文件版本号
string faBuNum = informationArr[2];
string publishPath = System.AppDomain.CurrentDomain.BaseDirectory;
string name = new DirectoryInfo(publishPath).Name + "-WMSBSBackup";
string DownloadFileFolder = Path.Combine(new DirectoryInfo(publishPath).Parent.FullName, name);
if (!Directory.Exists(DownloadFileFolder))
Directory.CreateDirectory(DownloadFileFolder);
// 获取文件夹的DirectoryInfo对象
DirectoryInfo directoryInfo = new DirectoryInfo(DownloadFileFolder);
string folderPrefix = DateTime.Now.ToString("yyyyMMdd");
string newFolderPath = string.Empty;
// 获取所有以指定前缀开头的文件夹
var directories = Directory.GetDirectories(DownloadFileFolder, folderPrefix + "*");
// 如果没有找到任何文件夹,则直接创建新文件夹
if (!directories.Any())
{
newFolderPath = Path.Combine(DownloadFileFolder, folderPrefix + "01");
}
else
{
// 解析文件夹名称以获取流水号,并找出最大的流水号
int maxSerialNumber = directories
.Select(dir => int.Parse(Path.GetFileName(dir).Substring(folderPrefix.Length)))
.Max();
// 流水号加1,并创建新文件夹
int newSerialNumber = maxSerialNumber + 1;
newFolderPath = Path.Combine(DownloadFileFolder, $"{folderPrefix}{newSerialNumber:D2}"); // D2表示格式化为两位数
}
Directory.CreateDirectory(newFolderPath);
var downloadFolder = Path.Combine(newFolderPath, faBuNum);
if (!Directory.Exists(downloadFolder))
Directory.CreateDirectory(downloadFolder);
//获取解压下载文件夹
var UnZipFileFolder = Path.Combine(downloadFolder, "UnZip"+ informationArr[0]);
if (!Directory.Exists(UnZipFileFolder))
Directory.CreateDirectory(UnZipFileFolder);
#endregion
var unzipSource = ZipHelper.Unzip(new FileInfo(uploadfile), new DirectoryInfo(UnZipFileFolder));
if (!unzipSource.IsSuccess)
{
throw new Exception(unzipSource.Message);
}
var files = Directory.GetFiles(UnZipFileFolder).ToList();
var UpdateFileFolder = Path.Combine(downloadFolder, "UnZip");
if (!Directory.Exists(UpdateFileFolder))
Directory.CreateDirectory(UpdateFileFolder);
#region 创建备份文件夹
var backUpfolder = Path.Combine(newFolderPath, "Backup");
if (!Directory.Exists(backUpfolder))
Directory.CreateDirectory(backUpfolder);
#endregion
Exception exception = null;
files.ForEach(info =>
{
//获取文件的名称
string fileName = Path.GetFileNameWithoutExtension(info);
//获取后缀名
string fileNameExtension = Path.GetExtension(info);
//判断文件名称,进行解压缩操作
if (fileName.EndsWith("系统更新压缩补丁包"))
{
//if (Directory.Exists(UpdateFileFolder))
// Directory.Delete(UpdateFileFolder, true);
var unzip = ZipHelper.Unzip(new FileInfo(info), new DirectoryInfo(UpdateFileFolder));
if (!unzip.IsSuccess)
{
throw new Exception(unzip.Message);
}
//备份需要替换的文件
var backupPath = Path.Combine(backUpfolder, DateTime.Now.ToString("yyyyMMddHHmmss") + ".zip");
ZipHelper.ZipFile(new DirectoryInfo(publishPath), new FileInfo(backupPath));
//移动替换文件
FileController.MoveFolder(UpdateFileFolder, publishPath);
Directory.Delete(UpdateFileFolder, true);
}
else if (fileNameExtension == ".sql")
{
try
{
//读取文件中的内容,并执行sql语句
string sqlText = File.ReadAllText(info);
//执行sql语句
SqlHelper.CmdExecuteNonQueryLi(sqlText);
}
catch (Exception ex)
{
msg = fileName + "脚本执行失败,请手动操作\n" + ex;
exception = ex;
}
}
//替换成功,调接口
var returnModel = ConfirmDown(faBuNum);
});
if (exception != null)
throw exception;
return msg;
}
catch (Exception ex)
{
throw new Exception(msg + ex.Message);
}
}
#endregion
//深拷贝
#region
public static T DeepCopyByReflect<T>(T obj)
{
if (obj == null)
return obj;
var type = obj.GetType();
//如果是字符串或值类型则直接返回
if (obj is string || type.IsValueType) return obj;
if(type.IsArray)
{
var elementType = Type.GetType(type.FullName.Replace("[]", null));
var array = obj as Array;
var copied = Array.CreateInstance(elementType, array.Length);
for (int idx = 0; idx < copied.Length; idx++)
{
copied.SetValue(DeepCopyByReflect(array.GetValue(idx)), idx);
}
return (T)Convert.ChangeType(copied,type);
}
object retval = Activator.CreateInstance(obj.GetType());
FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.Static);
foreach (FieldInfo field in fields)
{
try { field.SetValue(retval, DeepCopyByReflect(field.GetValue(obj))); }
catch { }
}
return (T)retval;
}
#endregion
// 定义一个类来表示 JSON 数据的结构
public class JsonData
{
public string IsSuccess { get; set; }
public string Message { get; set; }
public List<JsonDetail> FaBuList { get; set; }
}
public class JsonDetail
{
public string FaBuNum { get; set; }
public string FaBuVersion { get; set; }
public string FaBuContent { get; set; }
public string FaBuRemark { get; set; }
public string ProjectCode { get; set; }
public string FaBuTime { get; set; }
public string ConfirmPerson { get; set; }
public string IsDownloaded { get; set; }
public string DownTime { get; set; }
public string DownPersonName { get; set; }
public List<Files> Files { get; set; }
}
/// <summary>
/// 文件详情
/// </summary>
public class Files
{
public string FileName { get; set; }
public string FilePath { get; set; }
public string FileVersion { get; set; }
}
public class TypeModel
{
/// <summary>
/// 客户名称
/// </summary>
public string CustomerName { get; set; }
/// <summary>
/// 系统名
/// </summary>
public string XTType { get; set; }
/// <summary>
/// 系统名
/// </summary>
public string FaBuNum { get; set; }
}
/// <summary>
/// 回传对象
/// </summary>
public class ConfirmDownModel
{
/// <summary>
/// 客户名称
/// </summary>
public string CustomerName { get; set; }
/// <summary>
/// 发布单号
/// </summary>
public string FaBuNum { get; set; }
/// <summary>
/// 调用电脑接口IP1
/// </summary>
public string IP1 { get; set; }
/// <summary>
///调用电脑接口IP2
/// </summary>
public string IP2 { get; set; }
/// <summary>
/// 下载人员名称
/// </summary>
public string PersonName { get; set; }
}
/// <summary>
/// 返回对象
/// </summary>
public class ResultModel
{
/// <summary>
/// 是否成功
/// </summary>
public bool IsSuccess { get; set; }
/// <summary>
/// 返回消息
/// </summary>
public string Message { get; set; }
}
}
}