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

406 lines
15 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data;
using System.Collections;
using NPOIReport;
using System.Diagnostics;
using System.Runtime.InteropServices;
using Estsh.Client.Base;
using System.Windows.Forms;
using Com.Estsh.MES.App;
using ApServerProvider;
using MainProgram;
using MainProgram.BLL;
using System.Threading;
using Esi.Mes.LabelPrinter;
using ZPLPrinter;
using System.Net.NetworkInformation;
namespace Estsh.Client.StepLibrary
{
public class PrintSN : StepBase
{
//计数器数量
private string _PrdCount = string.Empty;
private RouteHelper _routeHelper = null;
private string _ProcessID;
private string _CheckRouteNecessary;
private static CodesoftPrinter m_csPrinter = new CodesoftPrinter();
private static string BarTenderPath =
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"App_Data\Bartend\bartend.exe");
private static string LabelPath =
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"App_Data\LabelFile");
private static object _lock_print_object = new object();
private const char TAB = '\t';
private const string NEW_LINE = "\r\n";
private List<dynamic> dtLabel = null;
public static bool PrintSerialNumber(List<dynamic> snData, string templateFile, string txtDataFile)
{
if (!CommonListData.CheckDataValid(snData))
return false;
string LabelTemplatePath = Path.Combine(LabelPath, templateFile);
string partLation = snData[0]["part_location"].ToString();
//string LabelTextPath = Path .Combine (LabelPath , "BS" + ".txt");
//string LabelFilePath = Path .Combine (LabelPath , "BS" + ".BTW");
string LabelTextPath = Path.Combine(LabelPath, "BS" + ".txt");
string LabelFilePath = string.Empty;
if (partLation == "03")
{
LabelFilePath = Path.Combine(LabelPath, "MaxBS.Lab");
}
else
{
LabelFilePath = Path.Combine(LabelPath, "BS.Lab");
}
StringBuilder PrintContent = new StringBuilder();
foreach (DataRow dr in snData)
{
string partLocation = dr["part_location"].ToString();
if (partLocation == "0D" || partLocation == "0E")
{
PrintContent.Append(dr["f10"].ToString()); PrintContent.Append(TAB);//1 serial_number
}
else
{
PrintContent.Append(dr["f1"].ToString()); PrintContent.Append(TAB);//1 serial_number
}
PrintContent.Append(dr["f2"].ToString()); PrintContent.Append(TAB); //2 type_name
PrintContent.Append(dr["f3"].ToString()); PrintContent.Append(TAB); //3 model_name
PrintContent.Append(dr["f4"].ToString()); PrintContent.Append(TAB); //4 part_spec
PrintContent.Append(dr["f5"].ToString()); PrintContent.Append(TAB); //5 part_no_3c
PrintContent.Append(dr["f6"].ToString()); PrintContent.Append(TAB); //6 enum_desc
PrintContent.Append(dr["f7"].ToString()); PrintContent.Append(TAB); //7 car_no
PrintContent.Append(dr["f8"].ToString()); PrintContent.Append(TAB); //8 简码+颜色代码 cust_part_no + part_class
PrintContent.Append(dr["part_no"].ToString()); PrintContent.Append(TAB);
PrintContent.Append(dr["number_T"].ToString()); PrintContent.Append(TAB); //9流水号
PrintContent.Append(dr["part_T"].ToString()); PrintContent.Append(TAB); //10
PrintContent.Append(dr["ymd"].ToString()); PrintContent.Append(TAB); //11 ymd
PrintContent.Append(dr["hms"].ToString()); PrintContent.Append(TAB); //12 hms
PrintContent.Append(dr["part_class"].ToString()); PrintContent.Append(TAB); //11 part_class
PrintContent.Append(Environment.NewLine);
lock (_lock_print_object)
{
WritePrintLog(PrintContent.ToString());
//BarTenderPrinter .WriteFile (LabelTextPath , PrintContent .ToString () , Encoding .UTF8 , false);
//BarTenderPrinter .Print (BarTenderPath , LabelFilePath);
PrintCodeSoftSN(dr, LabelFilePath, m_csPrinter);
}
return true;
}
return true;
}
public static bool PrintCodeSoftSN(DataRow snData, string LabelTextPath, CodesoftPrinter csPrinter)
{
Dictionary<String, String> printData = new Dictionary<string, string>();
printData.Add("serial_number", snData["f1"].ToString());
printData.Add("cust_part_no", snData["cust_part_no"].ToString());
printData.Add("part_spec", snData["f4"].ToString());
printData.Add("part_no", snData["part_no"].ToString());
printData.Add("part_T", snData["part_T"].ToString());
printData.Add("number_T", snData["number_T"].ToString());
printData.Add("model_alias", snData["model_alias"].ToString());
printData.Add("create_time", snData["create_time"].ToString());
csPrinter.DoPrint(LabelTextPath, printData, 1);
return true;
}
private static void WritePrintLog(string msgText)
{
string logPath = AppDomain.CurrentDomain.BaseDirectory + @"\\PrintLog";
try
{
if (!System.IO.Directory.Exists(logPath))
{
System.IO.Directory.CreateDirectory(logPath);
}
string txtMsgPath = logPath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
string timeStamp = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss-->");
using (StreamWriter sw = new StreamWriter(txtMsgPath, true))
{
sw.WriteLine(timeStamp + msgText.ToString());
sw.Flush();
sw.Close();
}
}
catch (System.Exception ex)
{
}
}
/// <summary>
/// 输入到打印机
/// </summary>
/// <param name="bartendPath">BarTender.exe 的路径</param>
/// <param name="labelPath">*.btw 文件的路径</param>
public static void Print(string bartendPath, string labelPath)
{
Process process = new Process();
process.StartInfo = new ProcessStartInfo(ToShortPathName(bartendPath), @" /F=" + ToShortPathName(labelPath) + " /p /x");
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.RedirectStandardOutput = true;
try
{
process.Start();
process.WaitForExit(100 * 1000); //等待上述进程执行完毕
if (process.HasExited == false) //程序停止响应处理
{
process.Kill();
process.Dispose();
}
}
catch
{
process.Kill();
process.Dispose();
}
}
/// <summary>
/// 获取短路径
/// </summary>
/// <param name="path">长路径</param>
/// <param name="shortPath">短路径</param>
/// <param name="shortPathLength">短路径的长度</param>
/// <returns>执行结果</returns>
[DllImport("kernel32.dll ", CharSet = CharSet.Auto)]
public static extern int GetShortPathName([MarshalAs(UnmanagedType.LPTStr)] string path, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath, int shortPathLength);
/// <summary>
/// 把长路径转化为短路径(兼容 WIN 98 格式)
/// </summary>
/// <param name="longName">长路径</param>
/// <returns>短路径</returns>
public static string ToShortPathName(string longName)
{
StringBuilder shortNameBuffer = new StringBuilder(256);
int bufferSize = shortNameBuffer.Capacity;
int result = GetShortPathName(longName, shortNameBuffer, bufferSize);
return shortNameBuffer.ToString();
}
/// <summary>
/// Ping 打印机,看是否连通
/// </summary>
/// <returns></returns>
private bool IsActive()
{
Ping ping = new Ping();
PingReply reply = ping.Send(printIP);
return reply.Status == IPStatus.Success;
}
private string printIP = string.Empty;
/// <summary>
/// 执行工步操作
/// </summary>
/// <returns>执行结果</returns>
public override bool Do()
{
try
{
//本地计数器
CountRead();
MESPrintSN _app = new MESPrintSN(App);
Action(this, new EventArgs());
//bool useJupStep = Context.Contains("useJupStep");
//if (!useJupStep)
//{
dtLabel = _app.GetPrintSN2(Context["serial_number"].ToString());
ShowMessage(this, "green|条码正在打印中,条码: " + Context["serial_number"].ToString());
PrintSerialNumber(dtLabel, LabelPath, "");
#region 无用代码
//try
//{
// printIP = _app.GetPrintIP(Context["terminal_id"].ToString());
// if (string.IsNullOrEmpty(printIP))
// {
// ShowMessage(this, "red|工位参数中没有正确配置打印机IP地址请联系系统管理员处理");
// return false;
// }
// if (!IsActive())
// {
// ShowMessage(this, "red|打印机 " + printIP + " 无法连通,请确认网线连接!");
// }
// else
// {
// PrintSNByZPL zplPrinter = new PrintSNByZPL();
// string partLocation = dtLabel[0]["part_location"].ToString();
// if (partLocation == "0D" || partLocation == "0E")
// {
// zplPrinter.PrintSerialNumber(dtLabel, Context["StepLibrary.PrintSN1.BTWFileName.BTW"].ToString(), printIP, 9100, 1);
// }
// else
// {
// zplPrinter.PrintSerialNumber(dtLabel, Context["StepLibrary.PrintSN.BTWFileName.BTW"].ToString(), printIP, 9100, 1);
// }
// }
//}
//catch
//{
// ShowMessage(this, "red|打印机连接失败,请确认打印机网络!");
// return false;
//}
#endregion
_app.UpdatePrintCount(Context["serial_number"].ToString());
// 修改上线时间
_app.UpdateBarcodeInPdlineTime(Context["serial_number"].ToString());
string stationType = _app.stationType(Context["terminal_id"].ToString());
string pdlineID = _app.pdLineID(Context["terminal_id"].ToString());
if (stationType == "B")
{
_app.updateOnLineStatus(Context["serial_number"].ToString(), pdlineID);
}
//}
//Context.Remove("useJupStep");
//本地计数器
CountAdd();
Complate(this, new EventArgs());
return base.Do();
}
catch (Exception ex)
{
// 记录日志
using (StreamWriter sw = new StreamWriter("Error_Log_" + DateTime.Now.ToString("yyyyMM") + ".txt", true))
{
sw.WriteLine(string.Format("{0} {1}", "["
+ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
+ "] ", ex.ToString()));
sw.Flush();
sw.Close();
}
return false;
}
}
void routeGO()
{
MESPrintSN _app = new MESPrintSN(App);
_routeHelper = new RouteHelper(App);
_ProcessID = _app.GetProcessID(Convert.ToInt32(Context["terminal_id"].ToString()))[0]["process_id"].ToString();
_CheckRouteNecessary = _app.GetRouteNecessary(_ProcessID)[0]["necessary"].ToString();
if (_CheckRouteNecessary == "Y")
{
// 流程卡站功能
if (!_routeHelper.RouteGO(Context["serial_number"].ToString(), Convert.ToInt32(Context["terminal_id"].ToString())))
{
ShowMessage(this, _routeHelper.ErrorMessage);
return;
}
}
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// PrintSN
//
this.Name = "PrintSN";
this.Size = new System.Drawing.Size(467, 186);
this.Load += new System.EventHandler(this.PrintSN_Load);
this.ResumeLayout(false);
}
private void CountAdd()
{
string value = _PrdCount;
int count = 0;
try
{
count = Convert.ToInt32(value);
count++;
_PrdCount = count.ToString();
}
catch
{
_PrdCount = "1";
}
try
{
StreamWriter sw = new StreamWriter("InPdlineCount.txt");
sw.Write(count.ToString());
sw.Flush();
sw.Close();
}
catch
{
ShowMessage(this, "计数器更新错误,未知!");
}
}
private void CountRead()
{
try
{
if (File.Exists("InPdlineCount.txt"))
{
FileStream fs = new FileStream(@"InPdlineCount.txt", FileMode.Open);
StreamReader sr = new StreamReader(fs);
string content = sr.ReadToEnd(); //一次性读取全部数据
_PrdCount = content;
fs.Close();
sr.Close();
}
else
{
_PrdCount = "0";
}
}
catch
{
_PrdCount = "0";
ShowMessage(this, "计数器更新错误,未知!");
}
}
private void PrintSN_Load(object sender, EventArgs e)
{
}
}
}