using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using CsvHelper;
using CsvHelper.Configuration;
using HH.WCS.Mobox3.RiDong.generalMethod;
using HH.WCS.Mobox3.RiDong.models;
namespace HH.WCS.Mobox3.RiDong.util;
///
/// 文件传输帮助类
///
public static class FtpHelper
{
///
/// 文件上传
///
public static void Upload()
{
// 示例数据集合
var dataCollection = new List
{
new DataItem { Id = 1, Name = "Item1", Value = 10.5 },
new DataItem { Id = 2, Name = "Item2", Value = 20.0 },
new DataItem { Id = 3, Name = "Item3", Value = 30.75 }
};
string csvFilePath = Path.Combine(Path.GetTempPath(), "data.csv");
string ftpUrl = "ftp://169.93.160.23/WMS/data.csv";
string ftpUsername = "admin";
string ftpPassword = "admin";
// 生成CSV文件
GenerateCsv(dataCollection, csvFilePath);
// 上传CSV文件到FTP
UploadFileToFtp(csvFilePath, ftpUrl, ftpUsername, ftpPassword);
}
///
/// 将数据生成为CSV文件
///
///
///
static void GenerateCsv(List dataCollection, string filePath)
{
StringBuilder csvContent = new StringBuilder();
csvContent.AppendLine("Id,Name,Value"); // CSV头部
foreach (var item in dataCollection)
{
csvContent.AppendLine($"{item.Id},{item.Name},{item.Value}");
}
File.WriteAllText(filePath, csvContent.ToString());
}
///
/// 文件上传方法
///
/// 文件路径
/// ftp路径
/// ftp名称
/// ftp密码
static void UploadFileToFtp(string filePath, string ftpUrl, string username, string password)
{
using (WebClient client = new WebClient())
{
client.Credentials = new NetworkCredential(username, password);
client.UploadFile(ftpUrl, WebRequestMethods.Ftp.UploadFile, filePath);
Console.WriteLine("File uploaded successfully.");
}
}
class DataItem
{
public int Id { get; set; }
public string Name { get; set; }
public double Value { get; set; }
}
///
/// 下载文件
///
public static void Download()
{
string ftpUrl = "ftp://192.168.89.1/AS400/";
string ftpUsername = "TJY/ftp";
// string ftpUrl = "ftp://169.93.160.23/AS400/";
// string ftpUsername = "admin";
// string ftpPassword = "admin";
// string ftpUrl = "ftp://192.168.1.27/AS400/";
// string ftpUsername = "WIN-7GJE5GQNO22/ftp";
string ftpPassword = "1234";
// 获取FTP目录下的所有文件
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl);
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
try
{
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))
{
string fileName;
while ((fileName = reader.ReadLine()) != null)
{
string fileUrl = ftpUrl + fileName;
Console.WriteLine(fileUrl);
bool delete = false;
// 将fileName作为参数传递给ProcessFile方法
ProcessFile(fileUrl, fileName, ftpUsername, ftpPassword, ref delete);
// 删除查询到的一些数据
if (delete)
{
DeleteFile(fileUrl, ftpUsername, ftpPassword, fileName);
}
}
}
}
catch (WebException ex)
{
// 更详细地处理网络相关异常,比如根据不同的状态码采取不同措施
if (((FtpWebResponse)ex.Response).StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
{
Console.WriteLine($"文件不可用或已被删除,异常信息: {ex.Message}");
}
else
{
Console.WriteLine($"网络请求出现异常,异常信息: {ex.Message}");
// 可以考虑记录详细日志等操作,方便后续排查问题
}
}
catch (Exception ex)
{
Console.WriteLine($"其他未知异常,异常信息: {ex.Message}");
// 记录日志或者进行其他全局的异常处理操作
}
}
///
/// 处理方法
///
///
///
///
///
///
private static void ProcessFile(string fileUrl, string fileName, string ftpUsername, string ftpPassword, ref bool delete)
{
FtpWebRequest request1 = (FtpWebRequest)WebRequest.Create(fileUrl);
request1.Method = WebRequestMethods.Ftp.DownloadFile;
request1.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
//Delimiter = ";", // 自定义分隔符
HasHeaderRecord = false, // 无表头模式
IgnoreBlankLines = true, // 忽略空行
AllowComments = true // 允许注释行
};
try
{
using FtpWebResponse response1 = (FtpWebResponse)request1.GetResponse();
using Stream responseStream1 = response1.GetResponseStream();
if (responseStream1 == null) return;
using (var csv = new CsvReader(new StreamReader(responseStream1, Encoding.UTF8), config))
// using var csv = new CsvReader(new StreamReader(responseStream1, Encoding.UTF8), CultureInfo.InvariantCulture);
if (fileName.StartsWith("MO"))
{
List materialOuts = new List();
while (csv.Read())
{
MaterialOut materialOut = new MaterialOut
{
S_TRANSACTION = csv.GetField(0),
S_TRAN_SUB_SEQ = csv.GetField(1),
S_TRANSACTION_TYPE = csv.GetField(2),
S_SO = csv.GetField(3),
S_ORDER_LINE = csv.GetField(4),
S_END_USER = csv.GetField(5),
S_INT_ITEM_CODE = csv.GetField(6),
S_INT_PRODUCT_CODE = csv.GetField(7),
S_COLOR_CODE = csv.GetField(8),
S_WAREHOUSE_CODE = csv.GetField(9),
S_STORE = csv.GetField(10),
S_LOT = csv.GetField(11),
S_LOR_QUANTITYOT = csv.GetField(12),
D_CREATION_DATE = csv.GetField(13),
T_CREATION_TIME = csv.GetField(14),
S_USER_NAME = csv.GetField(15),
S_ORIG_TRANSACTION = csv.GetField(16),
D_RESULT_DATE = csv.GetField(17),
T_RESULT_TIME = csv.GetField(18),
S_WMST = csv.GetField(19),
S_ACTUAL_QUANTITY = csv.GetField(20),
D_COMPLETE_DATE = csv.GetField(21),
T_COMPLETE_TIME = csv.GetField(22)
};
if (AdoSqlMethod.QueryCount(p =>
p.S_TRANSACTION == materialOut.S_TRANSACTION) == 0)
{
var first = materialOuts.FirstOrDefault(p =>
p.S_TRANSACTION == materialOut.S_TRANSACTION &&
p.S_LOT == materialOut.S_LOT &&
p.S_INT_PRODUCT_CODE == materialOut.S_INT_PRODUCT_CODE);
if (first != null)
{
first.S_LOR_QUANTITYOT += materialOut.S_LOR_QUANTITYOT;
}
else
{
materialOuts.Add(materialOut);
}
}
}
// 将数据添加进数据库中,然后对于的数据需要生成任务
AdoSqlMethod.AddList(materialOuts);
// 写入领用单(要过滤的,用文件名当作单号,已经处理的不要重复处理,正常情况下处理完就删除了,测试时候关闭自动删除)
delete = true;
}
else if (fileName.StartsWith("DO"))
{
List doOuts = new List();
while (csv.Read())
{
DoOut doOut = new DoOut
{
S_TRANSACTION = csv.GetField(0),
S_TRAN_SUB_SEQ = csv.GetField(1),
S_TRANSACTION_TYPE = csv.GetField(2),
S_SO = csv.GetField(3),
S_ORDER_LINE = csv.GetField(4),
S_END_USER = csv.GetField(5),
S_INT_ITEM_CODE = csv.GetField(6),
S_INT_PRODUCT_CODE = csv.GetField(7),
S_COLOR_CODE = csv.GetField(8),
S_WAREHOUSE_CODE = csv.GetField(9),
S_STORE = csv.GetField(10),
S_LOT = csv.GetField(11),
S_LOR_QUANTITYOT = csv.GetField(12),
S_PRODUCT_SIGN = csv.GetField(13),
D_CREATION_DATE = csv.GetField(14),
T_CREATION_TIME = csv.GetField(15),
D_SEND_DATE = csv.GetField(16),
T_SEND_TIME = csv.GetField(17),
S_USER_NAME = csv.GetField(18),
S_ORIG_TRANSACTION = csv.GetField(19),
D_RESULT_DATE = csv.GetField(20),
T_RESULT_TIME = csv.GetField(21),
S_WMST = csv.GetField(22),
S_ACTUAL_QUANTITY = csv.GetField(23),
D_COMPLETE_DATE = csv.GetField(24),
T_COMPLETE_TIME = csv.GetField(25),
};
if (AdoSqlMethod.QueryCount(p =>
p.S_TRANSACTION == doOut.S_TRANSACTION) == 0)
{
var first = doOuts.FirstOrDefault(p =>
p.S_TRANSACTION == doOut.S_TRANSACTION && p.S_LOT == doOut.S_LOT &&
p.S_INT_PRODUCT_CODE == doOut.S_INT_PRODUCT_CODE);
if (first != null)
{
first.S_LOR_QUANTITYOT += doOut.S_LOR_QUANTITYOT;
}
else
{
doOuts.Add(doOut);
}
}
}
// 将数据添加进数据库中,然后对于的数据需要生成任务
AdoSqlMethod.AddList(doOuts);
// 任务生成成功,打标记,然后将文件进行删除
// 写入出库单
delete = true;
}
else if (fileName.StartsWith("PRD"))
{
List tnMaterials = new List();
while (csv.Read())
{
var type = csv.GetField(19);
var type2 = "";
if (type == "C")
{
type2 = "制品";
}
else if (type == "R")
{
type2 = "原料";
}
var tnMaterial = new TN_Material()
{
// 规格编码
S_MATERIAL_CODE = csv.GetField(0),
// 物料编码
S_ITEM_CODE = csv.GetField(4),
// 规格
S_MATERIAL = csv.GetField(5),
S_MATERIAL_TYPE = type2,
// F_WEIGHT = item.WEIGHT,
};
if (AdoSqlMethod.QueryCount(p => p.S_ITEM_CODE == tnMaterial.S_ITEM_CODE) == 0)
{
// AdoSqlMethod- .QueryFirst(p=>p.INTERNAL_ITEM_CODE == tnMaterial.INTERNAL_ITEM_CODE);
tnMaterials.Add(tnMaterial);
}
}
// 将数据添加进数据库中
AdoSqlMethod.AddList(tnMaterials);
// 任务生成成功,打标记,然后将文件进行删除
// 写入出库单
delete = true;
}
else if (fileName.StartsWith("ITM"))
{
int readNumber = 0;
int updateNumber = 0;
while (csv.Read())
{
readNumber++;
var INTERNAL_ITEM_CODE = csv.GetField(2);
var tnMaterial = AdoSqlMethod.QueryFirst(p =>
p.S_ITEM_CODE == INTERNAL_ITEM_CODE);
if (tnMaterial != null)
{
tnMaterial.S_ITEM_NAME = csv.GetField(0);
AdoSqlMethod.UpdateFirst(tnMaterial, p => new { p.S_ITEM_NAME });
updateNumber++;
}
}
if (readNumber == updateNumber)
{
// 读取的数据条数和操作的数据条数一致删除
delete = true;
}
}
}
catch (CsvHelperException csvEx)
{
Console.WriteLine($"CSV文件解析出现异常,异常信息: {csvEx.Message}");
// 对于CSV解析异常,可以考虑记录日志、跳过该文件等操作,避免影响后续文件处理
}
catch (Exception ex)
{
Console.WriteLine($"文件处理过程中出现其他未知异常,异常信息: {ex.Message}");
// 进行通用的异常处理,比如记录日志等
}
}
///
/// 删除文件
///
///
///
///
///
private static void DeleteFile(string fileUrl, string ftpUsername, string ftpPassword, string fileName)
{
FtpWebRequest deleteRequest = (FtpWebRequest)WebRequest.Create(fileUrl);
deleteRequest.Method = WebRequestMethods.Ftp.DeleteFile;
deleteRequest.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
try
{
using (FtpWebResponse deleteResponse = (FtpWebResponse)deleteRequest.GetResponse())
{
Console.WriteLine($"Deleted {fileName}: {deleteResponse.StatusDescription}");
}
}
catch (WebException ex)
{
Console.WriteLine($"删除文件时出现网络异常,异常信息: {ex.Message}");
// 根据具体情况决定是否需要重试删除操作或者记录详细信息等
}
catch (Exception ex)
{
Console.WriteLine($"删除文件时出现其他未知异常,异常信息: {ex.Message}");
// 进行合适的异常处理,比如记录日志等
}
}
class Test1
{
public string location { get; set; }
public string actionType { get; set; }
public string code { get; set; }
//Parse方法会在自定义读写CSV文件时用到
public static Test1 Parse(string[] fields)
{
try
{
Test1 ret = new Test1();
ret.location = fields[0];
ret.actionType = fields[1];
ret.code = fields[2];
return ret;
}
catch (Exception ex)
{
//做一些异常处理,写日志之类的
return null;
}
}
}
///
/// 文件复制
///
private static void FileCopy()
{
}
}