|
|
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using DevExpress.XtraEditors; using ICSSoft.Frame.User.BLL; using ICSSoft.Base.Language.Tool; using ICSSoft.Base.UserControl.MessageControl; using System.Data.SqlClient; using ICSSoft.Base.Config.AppConfig; using ICSSoft.Base.Report.Filter; using ICSSoft.Base.Config.DBHelper; using ICSSoft.Base.UserControl.FormControl; using ICSSoft.Base.ReferForm.AppReferForm; using ICSSoft.Base.Lable.PrintTool; using ICSSoft.Frame.Data.DAL; using ICSSoft.Frame.Data.BLL; using ICSSoft.Frame.Data.Entity;
using System.Collections; using System.Net; using System.IO; using Newtonsoft.Json; using System.Configuration; using DevExpress.XtraGrid.Columns; using System.Linq; using ICSSoft.Frame.Common;
namespace ICSSoft.Frame.APP { public partial class FormICSAgvSlOrBackHH : DevExpress.XtraEditors.XtraForm {
string Lotno; string Opcode; string Eqpcode; Timer T = new Timer(); DataTable TableMain = new DataTable(); DataTable TableSon = new DataTable();
#region 构造函数
public FormICSAgvSlOrBackHH() { InitializeComponent(); } public FormICSAgvSlOrBackHH(String Lotno,string Opcode,string Eqpcode) { InitializeComponent(); this.Lotno = Lotno; this.Opcode = Opcode; this.Eqpcode = Eqpcode; } #endregion
public void LoadUIMes(string Lotno,string Opcode ) { string sql = @"Select LOTNO,MCODE,A.TRANSNO,B.INVNAME,C.OPCODE,C.OPNAME FROM ICSITEMLot a
Left join ICSINVENTORY b on a.MCODE=b.INVCODE Left join ICSOP C ON C.OPCODE='{0}' WHERE A.LotNO='{1}' ";
sql = string.Format(sql,Opcode,Lotno); DataSet Set = DBHelper.ExecuteDataset(AppConfig.AppConnectString, CommandType.Text, sql); DataTable datasource = Set.Tables[0]; TxtLotno.Text = Lotno; TxtOpcode.Text = Opcode; TxtOpName.Text = datasource.Rows[0]["OPNAME"].ToString(); TxtMocode.Text = datasource.Rows[0]["TRANSNO"].ToString(); TxtItemcode.Text= datasource.Rows[0]["MCODE"].ToString(); TxtItemName.Text = datasource.Rows[0]["INVNAME"].ToString(); }
public void LoadGridMes() { StringBuilder logmes = new StringBuilder(""); try { TableSon = InitAgvLog().Copy(); var AreaMes = ICSAGVBLL.GetAreaCode("00088", "5", AppConfig.AppConnectString, AppConfig.WorkPointCode); string sql = @" select vv.define1 from Sys_EnumValues vv
inner join Sys_Enumkey kk on kk.WorkPointCode=vv.WorkPointCode and kk.EnumKey=vv.EnumKey where kk.enumname='AGV管控' and vv.EnumText='AGVInventory' and kk.WorkPointCode ='" + AppConfig.WorkPointCode + "'";
DataTable dt = DBHelper.ExecuteDataset(AppConfig.AppConnectString, CommandType.Text, sql).Tables[0]; if (dt == null || dt.Rows.Count == 0) { throw new Exception("请联系管理员,在自定义档案中维护信息:AGV管控-AGVInventory"); }
logmes.AppendLine("调用接口:AGVInventory");
string GetInventoryListUrl = dt.Rows[0]["define1"].ToString(); var Detail = new { referCode = Lotno/*, zoneCode = AreaMes.Split('@')[0].Split(':')[0]*/}; var GetInventoryListModel = new { inventoryDetail = Detail, pageSize = "100", pageNum = "1", area = AppConfig.GetDataBaseNameByConnectString(AppConfig.AppConnectString) == "ICSMES_GTSys" ? "GT" : "JJ" }; var StringContent = JsonConvert.SerializeObject(GetInventoryListModel); logmes.AppendLine("params:" + StringContent + ""); var Rtnstr = WebInvokePost(GetInventoryListUrl, StringContent); logmes.AppendLine("ReturnMes:" + Rtnstr + ""); ReturnMesInv ReturnMes = JsonConvert.DeserializeObject<ReturnMesInv>(Rtnstr); if (ReturnMes.code != 200) throw new Exception(ReturnMes.msg); else {
foreach (InventoryDetail inv in ReturnMes.data) { DataRow row = TableMain.NewRow(); row["选择"] = ""; row["子件编码"] = inv.materialCode; row["子件名称"] = inv.materialName; row["计划数量"] = /*inv.taskQty*/inv.qty; row["起始点位"] = AreaMes.Split('@')[0]; row["ID"] = inv.id; row["已领数量"] = TableSon.AsEnumerable().Where(a => a["子件编码"].ToString() == inv.materialCode && a["DetailId"].ToString() == inv.id).Sum(a => Convert.ToDecimal(a["本次数量"])); TableMain.Rows.Add(row); } }
gridControl1.DataSource = TableMain; gridControl2.DataSource = TableSon;
}
catch (Exception ex) { ICSBaseSimpleCode.AppshowMessageBox(ex.Message); } finally {
WriteLogFile(logmes.ToString(), "AGV接口"); }
}
#region 关闭 退出
private void btnClose_Click(object sender, EventArgs e) { this.Close(); } #endregion
#region 移动窗体
private const int WM_NCHITTEST = 0x84; private const int HTCLIENT = 0x1; private const int HTCAPTION = 0x2; //首先必须了解Windows的消息传递机制,当有鼠标活动消息时,
//系统发送WM_NCHITTEST 消息给窗体作为判断消息发生地的根据。 nchittest
//假如你点击的是标题栏,窗体收到的消息值就是 HTCAPTION ,
//同样地,若接受到的消息是 HTCLIENT,说明用户点击的是客户区,也就是鼠标消息发生在客户区。
//重写窗体,使窗体可以不通过自带标题栏实现移动
protected override void WndProc(ref Message m) {
//当重载窗体的 WndProc 方法时,可以截获 WM_NCHITTEST 消息并改些该消息,
//当判断鼠标事件发生在客户区时,改写改消息,发送 HTCAPTION 给窗体,
//这样,窗体收到的消息就时 HTCAPTION ,在客户区通过鼠标来拖动窗体就如同通过标题栏来拖动一样。
//注意:当你重载 WndProc 并改写鼠标事件后,整个窗体的鼠标事件也就随之改变了。
switch (m.Msg) { case WM_NCHITTEST: base.WndProc(ref m); if ((int)m.Result == HTCLIENT) m.Result = (IntPtr)HTCAPTION; return; } //拦截双击标题栏、移动窗体的系统消息
if (m.Msg != 0xA3) { base.WndProc(ref m); }
} #endregion
#region 取消
private void can_Click(object sender, EventArgs e) { this.Close(); } #endregion
#region 页面加载
private void FormICSItenLotAdd_Load(object sender, EventArgs e) { foreach (Control contorl in panel1.Controls) { if (contorl is TextEdit) { (contorl as TextEdit).Properties.ReadOnly = true; } } foreach (GridColumn column in gridViewMain.Columns) { TableMain.Columns.Add(new DataColumn(column.FieldName)); } LoadUIMes(Lotno,Opcode); InitLocation(); LoadGridMes(); T.Interval = 10000; T.Tick += delegate(object sender1, EventArgs e1) { try { DataTable LogTable = InitAgvLog();
foreach (DataRow Row in LogTable.Rows) { var SonRows = TableSon.AsEnumerable().Where(a => a["ID"].ToString()== Row["ID"].ToString()).FirstOrDefault(); if (SonRows==null) { DataRow NewRow = TableSon.NewRow(); NewRow.ItemArray = Row.ItemArray; TableSon.Rows.Add(NewRow); continue; } else { SonRows["是否到料"] = Row["是否到料"]; SonRows["是否返回"] = Row["是否返回"]; }
}
//foreach (DataRow row in TableMain.Rows)
//{
// row["已领数量"] = TableSon.AsEnumerable().Where(a => a["子件编码"].ToString() == row["子件编码"].ToString() && a["DetailId"].ToString() == row["ID"].ToString()).Sum(a => Convert.ToDecimal(a["本次数量"]));
//}
} catch (Exception ex) { throw ex; }
}; T.Start();
} #endregion
private DataTable InitAgvLog() { try {
string sql = @"select A.ID,A.MaterialCode as 子件编码,'' AS 选择,A.IsArrive as 到料状态,A.Mtime as 叫料时间,B.MTIME AS 返回时间,B.ISBACK AS 返回状态,ISNULL(B.QTY,0) AS 本次数量,A.EATTRIBUTE1 AS DetailId,A.LOCATIONCODE as 起始点位,a.QTY,A.Groupid,a.AREA as 区域,a.endlocation as 点位,a.groupid,a.isarrive as 是否到料,a.isback as 是否返回 from ICSAGVTASKLOG a
Left Join ICSAGVTASKLOG b on a.id<>b.id AND B.TaskType='料框返回' and a.groupid=b.groupid where A.Lotno='{0}' and A.opcode='{1}' and A.TaskType='叫料'";
sql = string.Format(sql, Lotno, Opcode); DataTable Table = DBHelper.ExecuteDataset(AppConfig.AppConnectString, CommandType.Text, sql).Tables[0]; return Table; } catch (Exception ex) { throw ex; } }
public void InitLocation() { try {
string sql = @"select a.locationcode as 点位编码,b.LocationName as 点位名称 from IcsEqpWithLocation a left join IcsAGVLocation b on a.locationcode=b.locationcode where eqpcode='{0}'"; sql = string.Format(sql,Eqpcode); DataTable Table = DBHelper.ExecuteDataset(AppConfig.AppConnectString, CommandType.Text, sql).Tables[0]; LookUpEditLocation.DataSource = Table; LookUpEditLocation.DisplayMember = "点位编码"; LookUpEditLocation.ValueMember = "点位编码"; LookUpEditLocation.NullText = "";//空时的值
LookUpEditLocation.ImmediatePopup = true;//输入值是否马上弹出窗体
LookUpEditLocation.ValidateOnEnterKey = true;//回车确认
LookUpEditLocation.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;//要使用户可以输入,这里须设为Standard
LookUpEditLocation.AllowNullInput = DevExpress.Utils.DefaultBoolean.True; //可用Ctrl + Delete清空选择內容 //自适应宽度
LookUpEditLocation.BestFitMode = DevExpress.XtraEditors.Controls.BestFitMode.BestFitResizePopup;
} catch (Exception ex) { throw ex; }
}
private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e) { if (e.Info.IsRowIndicator && e.RowHandle >= 0) e.Info.DisplayText = (e.RowHandle + 1).ToString(); }
private void BtnBack_Click(object sender, EventArgs e) { try { List<ICSAGVTASKLOG> Log_List = new List<ICSAGVTASKLOG>(); List<AGVCreateTaskModel> Task_List = new List<AGVCreateTaskModel>(); for (int i = 0; i < TableSon.Rows.Count; i++) { if (TableSon.Rows[i]["选择"].ToString() == "Y") { Check("", "料框返回", TableSon.Rows[i]["ID"].ToString()); ICSAGVTASKLOG log = new ICSAGVTASKLOG(); log.ID = AppConfig.GetGuid(); log.Lotno = Lotno; log.Opcode = Opcode; log.Itemcode = TxtItemcode.Text; log.MaterialCode = TableSon.Rows[i]["子件编码"].ToString(); log.LocationCode = TableSon.Rows[i]["点位"].ToString(); log.EndLocation = TableSon.Rows[i]["起始点位"].ToString(); log.Qty =(Decimal?)(TableSon.Rows[i]["本次数量"]); log.TaskType = "料框返回HH"; log.Mtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); log.MuserName = AppConfig.UserName; log.IsArrive = false; log.IsBack = false; log.GroupID = TableSon.Rows[i]["groupid"].ToString(); Log_List.Add(log);
AGVCreateTaskModel model = new AGVCreateTaskModel(); model.area = log.Area.Split(':')[0]; model.qty =Convert.ToInt32(TableSon.Rows[i]["QTY"].ToString()) -(int)log.Qty; model.station = log.LocationCode; model.type = "false"; model.materialCode = log.MaterialCode; //model.materialName = MainRow["子件名称"].ToString();
model.trackingNumber = Lotno; Task_List.Add(model);
} }
if (Log_List.Count <= 0) throw new Exception("请选择要料框返回的料框!");
string mes = ICSAGVBLL.CreateAGVTaskJJorBack(Task_List, Log_List, AppConfig.AppConnectString, AppConfig.WorkPointCode); if (string.IsNullOrEmpty(mes)) { ICSBaseSimpleCode.AppshowMessageBox("料框返回成功!"); LoadGridMes();
} else ICSBaseSimpleCode.AppshowMessageBox(mes);
} catch (Exception ex) { ICSBaseSimpleCode.AppshowMessageBox(ex.Message); } }
private void BtnCall_Click(object sender, EventArgs e) { try { List<ICSAGVTASKLOG> Log_List = new List<ICSAGVTASKLOG>(); List<PointToPointModel> Task_List = new List<PointToPointModel>(); for (int i = 0; i <gridViewMain.RowCount; i++) { if (gridViewMain.GetRowCellValue(i, 选择).ToString()== "Y") { string AgvId = gridViewMain.GetRowCellValue(i,AGVID).ToString();//子件库存查询的接口ID 可能存在多笔相同子件不同料框的情况,需要记录id区分是哪个料框叫的料
Check(AgvId,"叫料"); ICSAGVTASKLOG log = new ICSAGVTASKLOG(); log.ID = AppConfig.GetGuid(); log.Lotno = Lotno; log.Opcode = Opcode; log.Itemcode = TxtItemcode.Text; log.MaterialCode = gridViewMain.GetRowCellValue(i, 子件编码).ToString(); log.LocationCode= gridViewMain.GetRowCellValue(i, 起始点位).ToString(); log.EndLocation = gridViewMain.GetRowCellValue(i, 到料点位).ToString(); log.Qty = Convert.ToDecimal(gridViewMain.GetRowCellValue(i, 计划数量).ToString()); log.TaskType = "叫料HH"; log.Mtime =Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); log.MuserName = AppConfig.UserName; log.IsArrive = false; log.IsBack = false; log.GroupID= AppConfig.GetGuid(); //叫料,料框返回Goupid是相同的
log.Eattribute1= AgvId; Log_List.Add(log);
PointToPointModel model = new PointToPointModel(); model.warehouseCode = "KS0001"; model.startingPoint = log.LocationCode; model.endPoint = log.EndLocation; Task_List.Add(model); } }
if (Log_List.Count <= 0) throw new Exception("请选择要叫料的物料!");
string mes=ICSAGVBLL.AgvPointToPoint(Task_List, Log_List,AppConfig.AppConnectString,AppConfig.WorkPointCode); if (string.IsNullOrEmpty(mes)) { ICSBaseSimpleCode.AppshowMessageBox("叫料成功!"); TableMain.Clear(); TableSon.Clear(); LoadGridMes();
} else ICSBaseSimpleCode.AppshowMessageBox(mes);
} catch (Exception ex) { ICSBaseSimpleCode.AppshowMessageBox(ex.Message); } }
/// <summary>
///
/// </summary>
/// <param name="AgvID">主表信息标识</param>
/// <param name="Type">叫料or料框返回</param>
/// <param name="LogID">叫料日志id</param>
private void Check(String AgvID,string Type,params string[] LogID) {
try { DataTable LogTable = InitAgvLog();
if (Type == "叫料") { DataRow MainRow = TableMain.AsEnumerable().Where(A => A["ID"].ToString() == AgvID).FirstOrDefault(); List<DataRow> CheckRow_List = LogTable.AsEnumerable().Where(a => a["DetailId"].ToString() == AgvID).ToList(); //decimal HasLLQty = CheckRow_List.Sum(a => Convert.ToDecimal(a["本次数量"]));
string LocationCode = MainRow["到料点位"].ToString();
if (CheckRow_List.Where(a => string.IsNullOrEmpty(a["返回时间"].ToString()) == true).Count() > 0) throw new Exception("ID:" + AgvID + ",已叫料且未料框返回,无法再次叫料!"); if (Convert.ToDecimal(MainRow["计划数量"])<=0) throw new Exception("ID:" + AgvID + ",库存数量为0,无法再次叫料!"); if(string.IsNullOrEmpty(LocationCode)) throw new Exception("ID:" + AgvID + ",需输入到料点位!"); } else if (Type == "料框返回") { var BackRow=LogTable.AsEnumerable().Where(a => a["ID"].ToString() == LogID[0]).FirstOrDefault();
if (!String.IsNullOrEmpty(BackRow["返回时间"].ToString())) throw new Exception("行标识:" + LogID[0] + ",已执行料框返回完毕,请勿重复操作!");
if(string.IsNullOrEmpty(TableSon.AsEnumerable().Where(A => A["ID"].ToString() == LogID[0]).Select(A => A["OnQty"]).ToString())) throw new Exception("行标识:" + LogID[0] + ",需要输入本次数量!"); } } catch (Exception ex) { throw ex; }
}
public static string WebInvokePost(string url, string JsonData) { //构造一个Web请求的对象
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.Accept = "text/html, application/xhtml+xml, */*"; request.ContentType = "application/json;charset=utf-8"; var stream=request.GetRequestStream(); byte[] Data = System.Text.Encoding.UTF8.GetBytes(JsonData); stream.Write(Data, 0, Data.Length);
//获取web请求的响应的内容
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } }
private void gridViewMain_DoubleClick(object sender, EventArgs e) { if (gridViewMain.FocusedRowHandle < 0) { return; } if (gridViewMain.FocusedColumn ==选择) { if (gridViewMain.GetRowCellValue(gridViewMain.FocusedRowHandle, 选择).ToString() == "") { gridViewMain.SetRowCellValue(gridViewMain.FocusedRowHandle, 选择, "Y"); } else { gridViewMain.SetRowCellValue(gridViewMain.FocusedRowHandle, 选择, ""); }
} }
private void gridViewSon_DoubleClick(object sender, EventArgs e) { if (gridViewSon.FocusedRowHandle < 0) { return; } if (gridViewSon.FocusedColumn == ColSelect) { if (gridViewSon.GetRowCellValue(gridViewSon.FocusedRowHandle, ColSelect).ToString() == "") { gridViewSon.SetRowCellValue(gridViewSon.FocusedRowHandle, ColSelect, "Y"); } else { gridViewSon.SetRowCellValue(gridViewSon.FocusedRowHandle, ColSelect, ""); }
} }
private void TxtOnQty_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(gridViewSon.GetFocusedRowCellValue(返回时间).ToString()) && gridViewSon.FocusedColumn == OnQty) { TxtOnQty.ReadOnly = true; OnQty.OptionsColumn.ReadOnly = true; } else { TxtOnQty.ReadOnly = false; OnQty.OptionsColumn.ReadOnly = false; } }
#region 写入日志
public static void WriteLogFile(string input, string txtName) { try { string logAdress = ConfigurationManager.AppSettings["logAdress"].ToString() + "\\Log\\"; if (!System.IO.Directory.Exists(logAdress)) { System.IO.Directory.CreateDirectory(logAdress);//不存在就创建目录
}
string adress = logAdress + txtName; if (!System.IO.Directory.Exists(adress)) { System.IO.Directory.CreateDirectory(adress);//不存在就创建目录
}
// string logAdress = ConfigurationManager.AppSettings["logAdress"].ToString();
/**/ ///指定日志文件的目录
string fname = adress + "\\" + "log" + DateTime.Now.ToString("yy-MM-dd") + ".txt"; /**/ ///定义文件信息对象
FileInfo finfo = new FileInfo(fname);
if (!finfo.Exists) { FileStream fs; fs = File.Create(fname); fs.Close(); finfo = new FileInfo(fname); }
/**/ ///判断文件是否存在以及是否大于2K
if (finfo.Length > 1024 * 1024 * 10) { /**/ ///文件超过10MB则重命名
File.Move(logAdress + "\\Log\\" + txtName + ".txt", Directory.GetCurrentDirectory() + DateTime.Now.TimeOfDay + "\\Log\\" + txtName + ".txt"); /**/ ///删除该文件
//finfo.Delete();
} //finfo.AppendText();
/**/ ///创建只写文件流
using (FileStream fs = finfo.OpenWrite()) { /**/ ///根据上面创建的文件流创建写数据流
StreamWriter w = new StreamWriter(fs);
/**/ ///设置写数据流的起始位置为文件流的末尾
w.BaseStream.Seek(0, SeekOrigin.End);
w.WriteLine("*****************Start*****************"); w.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); /**/ ///写入当前系统时间并换行
/**/ ///写入日志内容并换行
w.WriteLine(input);
/**/ ///写入------------------------------------“并换行
w.WriteLine("------------------END------------------------");
/**/ ///清空缓冲区内容,并把缓冲区内容写入基础流
w.Flush();
/**/ ///关闭写数据流
w.Close(); } } catch (Exception ex) { throw ex; }
} #endregion
private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e) {
} } }
|