using ICSSoft.Base.Config.AppConfig; using ICSSoft.Base.Config.DBHelper; using ICSSoft.Frame.Common; using ICSSoft.Frame.Data.Entity; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace ICSSoft.Frame.Data.DAL { public class ICSAGVDAL { public static string CreateAGVTaskJJorBack(List Model_List, List Log_List ,string Appconstr, string workpoint) { StringBuilder RtnMes = new StringBuilder(""); AGVCreateTaskReturnModel rr = new AGVCreateTaskReturnModel(); try { string CreateTaskUrl = ""; //获取URL地址 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='CreateTaskUrl' and kk.WorkPointCode ='" + workpoint + "'"; DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0]; if (dt == null || dt.Rows.Count == 0) { throw new Exception("请联系管理员,在自定义档案中维护信息:AGV管控-CreateTaskUrl"); } CreateTaskUrl = dt.Rows[0]["define1"].ToString(); for (int i = 0; i < Model_List.Count; i++) { var Model = Model_List[i]; var Log = Log_List[i]; try { string ReturnStr = CustWebRequest.WorkDayPostData(CreateTaskUrl, JsonConvert.SerializeObject(Model), "application/json;charset=UTF-8"); StringBuilder str = new StringBuilder(); str.AppendLine("创建AGV接口(CreateAGVTask):" + Model.trackingNumber); str.AppendLine("接口传入数据:" + JsonConvert.SerializeObject(Model)); str.AppendLine("接口返回数据:" + ReturnStr); ICSMO2UserDAL.WriteLogFile(str.ToString(), "AGV接口"); if (string.IsNullOrEmpty(ReturnStr)) { throw new Exception("调用接口返回信息为空"); } JObject obj = new JObject(); obj = JObject.Parse(ReturnStr); if (obj["code"] == null) { throw new Exception("接口返回数据异常:数据内容:" + ReturnStr); } else if (obj["code"].ToString() != "200") { throw new Exception("接口返回数据异常:异常信息:" + obj["msg"].ToString()); } try { rr = JsonConvert.DeserializeObject(ReturnStr); } catch (Exception ex) { throw new Exception("解析接口返回数据失败:数据内容:" + ReturnStr + Environment.NewLine + "失败原因:" + ex.Message); } Log.ParamsMes = JsonConvert.SerializeObject(Model); Log.ReturnMes = ReturnStr; Log.Eattribute2 = rr.data.id; //AGV任务编号,后续如果要回写小车到位状态,用此编号查询 WriteMesAgvLog(Log); } catch (Exception ex) { RtnMes.Append("条码:"+Log.Lotno+",工序:"+Log.Opcode+",点位:"+Log.LocationCode+",区域:"+Log.Area+" 子件物料:"+Log.MaterialCode+":"+ex.Message+","+Log.TaskType+"失败,已跳过!\r\n"); continue; } } return RtnMes.ToString(); } catch (Exception ex) { throw ex; } } public static void AgvAreaToArea(AgvAreaToAreaModel Model, ICSAGVTASKLOG log, string Appconstr, string workpoint) { try { string Url = ""; //获取URL地址 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='regionalMoveUrl' and kk.WorkPointCode ='" + workpoint + "'"; DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0]; if (dt == null || dt.Rows.Count == 0) { throw new Exception("请联系管理员,在自定义档案中维护信息:AGV管控-regionalMoveUrl"); } Url = dt.Rows[0]["define1"].ToString(); string ReturnStr = CustWebRequest.WorkDayPostData(Url, JsonConvert.SerializeObject(Model), "application/json;charset=UTF-8"); StringBuilder str = new StringBuilder(); str.AppendLine("创建AGV接口(regionalMove):" + Model.trackingNumber+" "+log.Opcode); str.AppendLine("接口传入数据:" + JsonConvert.SerializeObject(Model)); str.AppendLine("接口返回数据:" + ReturnStr); ICSMO2UserDAL.WriteLogFile(str.ToString(), "AGV接口"); if (string.IsNullOrEmpty(ReturnStr)) { throw new Exception("调用接口返回信息为空"); } JObject obj = new JObject(); obj = JObject.Parse(ReturnStr); if (obj["code"] == null) { throw new Exception("接口返回数据异常:数据内容:" + ReturnStr); } else if (obj["code"].ToString() != "200") { throw new Exception("接口返回数据异常:异常信息:" + obj["msg"].ToString()); } log.ParamsMes = JsonConvert.SerializeObject(Model); log.ReturnMes = ReturnStr; WriteMesAgvLog(log); } catch (Exception ex) { throw ex; } } public static string AgvPointToPoint(List Model_List, List Log_List, string Appconstr, string workpoint) { StringBuilder RtnMes = new StringBuilder(""); try { string CreateTaskUrl = ""; //获取URL地址 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='PointToPointUrl' and kk.WorkPointCode ='" + workpoint + "'"; DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0]; if (dt == null || dt.Rows.Count == 0) { throw new Exception("请联系管理员,在自定义档案中维护信息:AGV管控-PointToPointUrl"); } CreateTaskUrl = dt.Rows[0]["define1"].ToString(); for (int i = 0; i < Model_List.Count; i++) { var Model = Model_List[i]; var Log = Log_List[i]; try { string ReturnStr = CustWebRequest.WorkDayPostData(CreateTaskUrl, JsonConvert.SerializeObject(Model), "application/json;charset=UTF-8"); StringBuilder str = new StringBuilder(); str.AppendLine("创建AGV接口(PointToPointUrl):" +Log.Lotno); str.AppendLine("接口传入数据:" + JsonConvert.SerializeObject(Model)); str.AppendLine("接口返回数据:" + ReturnStr); ICSMO2UserDAL.WriteLogFile(str.ToString(), "AGV接口"); if (string.IsNullOrEmpty(ReturnStr)) { throw new Exception("调用接口返回信息为空"); } JObject obj = new JObject(); obj = JObject.Parse(ReturnStr); if (obj["code"] == null) { throw new Exception("接口返回数据异常:数据内容:" + ReturnStr); } else if (obj["code"].ToString() != "200") { throw new Exception("接口返回数据异常:异常信息:" + obj["msg"].ToString()); } Log.ParamsMes = JsonConvert.SerializeObject(Model); Log.ReturnMes = ReturnStr; WriteMesAgvLog(Log); } catch (Exception ex) { RtnMes.Append("条码:" + Log.Lotno + ",工序:" + Log.Opcode + ",起始点位:" + Log.LocationCode + ",结束点位:" + Log.EndLocation + " :" + ex.Message + "," + Log.TaskType + "失败,已跳过!\r\n"); continue; } } return RtnMes.ToString(); } catch (Exception ex) { throw ex; } } public static AGVCancelTaskReturnModel CancelAGVTask(AGVCancelTaskModel Model, string Appconstr, string workpoint) { AGVCancelTaskReturnModel rr = new AGVCancelTaskReturnModel(); try { string CreateTaskUrl = ""; //获取URL地址 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='CancelTaskUrl' and kk.WorkPointCode ='" + workpoint + "'"; DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0]; if (dt == null || dt.Rows.Count == 0) { throw new Exception("请联系管理员,在自定义档案中维护信息:AGV管控-CancelTaskUrl"); } CreateTaskUrl = dt.Rows[0]["define1"].ToString(); string ReturnStr = CustWebRequest.WorkDayPostData(CreateTaskUrl, JsonConvert.SerializeObject(Model), "application/json;charset=UTF-8"); StringBuilder str = new StringBuilder(); str.AppendLine("创建AGV接口(CancelAGVTask):" ); str.AppendLine("接口传入数据:" + JsonConvert.SerializeObject(Model)); str.AppendLine("接口返回数据:" + ReturnStr); ICSMO2UserDAL.WriteLogFile(str.ToString(), "AGV接口"); if (string.IsNullOrEmpty(ReturnStr)) { throw new Exception("调用接口返回信息为空"); } JObject obj = new JObject(); obj = JObject.Parse(ReturnStr); if (obj.Property("message") == null || obj.Property("result") == null) { throw new Exception("接口返回数据异常:数据内容:" + ReturnStr); } try { rr = JsonConvert.DeserializeObject(ReturnStr); } catch (Exception ex) { throw new Exception("解析接口返回数据失败:数据内容:" + ReturnStr + Environment.NewLine + "失败原因:" + ex.Message); } return rr; } catch (Exception ex) { rr.result = null; rr.message = ex.Message; return rr; } } public static bool IsCanToAGV(string Lotno,string Opcode,string Type, string Appconstr, string workpoint) { try { //获取URL地址 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='" + Type + @"' and kk.WorkPointCode ='" + workpoint+@"' Select SEGCODE FROM ICSMO2USER WHERE lotno='"+Lotno+"' and opcode='"+Opcode+@"' "; DataSet set = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql); DataTable dt = set.Tables[0]; DataTable dt1 = set.Tables[1]; if (dt != null && dt.Rows.Count > 0) { if (dt.Rows[0]["define1"].ToString() == "是"&& dt1.Rows[0]["SEGCODE"].ToString()=="1") { return true; } else { return false; } } else { throw new Exception("请联系管理员,在自定义档案中维护信息:AGV管控-" + Type); } } catch (Exception ex) { throw new Exception(ex.Message); } } public static List GetOPBOM(string LotNo, string opcode, string Appconstr, string workpoint) { List List = new List(); try { string sql = @" IF EXISTS ( SELECT * FROM tempdb..sysobjects WHERE id = object_id( 'tempdb..#TEMP_MODD' ) ) DROP TABLE #TEMP_MODD IF EXISTS ( SELECT * FROM tempdb..sysobjects WHERE id = object_id( 'tempdb..#TEMP_MONewbom' ) ) DROP TABLE #TEMP_MONewbom SELECT lot.lotqty, mo.itemcode, rr.routecode, mo.workpoint INTO #TEMP_MODD FROM icsitemlot lot LEFT JOIN icsmo mo ON mo.mocode= lot.TransNO AND mo.moseq= lot.TransLine AND mo.workpoint= lot.workpoint LEFT JOIN ICSMO2ROUTE rr ON rr.mocode= mo.mocode AND rr.moid= mo.id AND rr.workpoint= mo.workpoint WHERE lot.lotno= '" + LotNo + @"' AND mo.workpoint= '" + workpoint + @"' SELECT itemcode, SBOMVER, workpoint INTO #TEMP_MONewbom FROM ( SELECT MM.itemcode , mm.SBOMVER , MM.workpoint, row_number ( ) OVER ( partition BY MM.itemcode ORDER BY mm.SBOMVER DESC ) rn FROM ICSSBOM MM WHERE EXISTS ( SELECT 1 FROM #TEMP_MODD DD WHERE MM.ITEMCODE= DD.ITEMCODE AND MM.workpoint= dd.workpoint ) ) gg WHERE rn = 1 SELECT ll.obitemcode, ll.obitemqty* dd.lotqty obitemqty FROM ICSOPBOMDETAIL ll INNER JOIN #TEMP_MONewbom bb ON bb.itemcode= ll.itemcode AND bb.WorkPoint= ll.workpoint INNER JOIN #TEMP_MODD dd ON dd.routecode= ll.obcode WHERE ll.opcode= '" + opcode + @"' IF EXISTS ( SELECT * FROM tempdb..sysobjects WHERE id = object_id( 'tempdb..#TEMP_MODD' ) ) DROP TABLE #TEMP_MODD IF EXISTS ( SELECT * FROM tempdb..sysobjects WHERE id = object_id( 'tempdb..#TEMP_MONewbom' ) ) DROP TABLE #TEMP_MONewbom "; DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0]; if (dt != null && dt.Rows.Count > 0) { foreach (DataRow dr in dt.Rows) { MaterialItem mm = new MaterialItem(); mm.materialCode = dr["obitemcode"].ToString(); mm.qty = Convert.ToInt32(Convert.ToDouble(dr["obitemqty"].ToString())); List.Add(mm); } } } catch (Exception ex) { throw new Exception(ex.Message); } return List; } public static bool IsFirstOP(string LOTNO, string opcode, string Appconstr, string workpoint) { try { string sql = @" SELECT opcode FROM ICSITEMROUTE2OPLOT WHERE LOTNO='" + LOTNO + @"' ORDER BY OPSEQ "; DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0]; if (dt != null && dt.Rows.Count > 0) { if (opcode == dt.Rows[0]["opcode"].ToString()) { return true; } else { return false; } } else { throw new Exception("查询工艺路线数据异常"); } } catch (Exception ex) { throw new Exception(ex.Message); } } public static bool IsLastOP(string LOTNO, string opcode, string Appconstr, string workpoint) { try { string sql = @" SELECT opcode FROM ICSITEMROUTE2OPLOT WHERE LOTNO='" + LOTNO+@"' ORDER BY OPSEQ DESC "; DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0]; if (dt != null && dt.Rows.Count > 0) { if (opcode == dt.Rows[0]["opcode"].ToString()) { return true; } else { return false; } } else { throw new Exception("查询工艺路线数据异常"); } } catch (Exception ex) { throw new Exception(ex.Message); } } public static bool NextOPisWW(string LOTNO, string opcode, string Appconstr, string workpoint) { try { string sql = @" SELECT TOP 1 A.OPCODE,OPSEQ,C.EATTRIBUTE1 FROM ICSITEMROUTE2OPLOT A LEFT JOIN ICSMO2USER C ON C.LOTNO=A.LOTNO AND C.OPCODE=A.OPCODE WHERE A.LOTNO='"+LOTNO+@"' AND OPSEQ>(SELECT OPSEQ FROM ICSITEMROUTE2OPLOT B WHERE B.LotNo=A.LotNo AND B.OPCODE='"+opcode+@"') ORDER BY A.OPSEQ "; DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0]; if (dt != null && dt.Rows.Count > 0) { if (String.IsNullOrEmpty(dt.Rows[0]["EATTRIBUTE1"].ToString())|| dt.Rows[0]["EATTRIBUTE1"].ToString()=="0") { return false; } else { return true; } } else { return false; } } catch (Exception ex) { throw new Exception(ex.Message); } } public static bool NextOPisWG(string LOTNO, string opcode, string Appconstr, string workpoint) { try { string sql = @" SELECT ACTIONRESULT FROM ICSLOTONWIP WHERE LOTNO='"+LOTNO+@"' AND OPCODE IN (SELECT TOP 1 A.OPCODE FROM ICSITEMROUTE2OPLOT A LEFT JOIN ICSMO2USER C ON C.LOTNO=A.LOTNO AND C.OPCODE=A.OPCODE WHERE A.LOTNO='" + LOTNO + @"' AND OPSEQ>(SELECT OPSEQ FROM ICSITEMROUTE2OPLOT B WHERE B.LotNo=A.LotNo AND B.OPCODE='" + opcode + @"') ORDER BY A.OPSEQ ); "; DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0]; if (dt != null && dt.Rows.Count > 0) { if (dt.Rows[0]["ACTIONRESULT"].ToString()== "COLLECT_END") { return true; } else { return false; } } else { return false; } } catch (Exception ex) { throw new Exception(ex.Message); } } public static string GetAreaCode(string enumkey, string EnumValue, string Appconstr, string workpoint) { try { string sql = "select ENUMTEXT,DEFINE1,DEFINE2,DEFINE3 FROM Sys_EnumValues WHERE EnumKey='{0}' AND ENUMVALUE='{1}' and workpointcode='{2}'"; sql = string.Format(sql, enumkey, EnumValue,workpoint); var reader = DBHelper.ExecuteReader(Appconstr, CommandType.Text, sql); string returnmes = ""; while (reader.Read()) { returnmes = reader.GetString(0) + ":" + reader.GetString(1)+"@"+ reader.GetString(2)+":"+ reader.GetString(3); } return returnmes; } catch (Exception ex) { throw ex; } } public static void WriteMesAgvLog(ICSAGVTASKLOG log) { FramDataContext db = new FramDataContext(AppConfig.AppConnectString); db.Connection.Open(); db.Transaction = db.Connection.BeginTransaction(); try { db.ICSAGVTASKLOG.InsertOnSubmit(log); db.SubmitChanges(); db.Transaction.Commit(); } catch (Exception ex) { db.Transaction.Rollback(); throw ex; } finally { db.Connection.Close(); } } } }