using HH.Redis.ReisModel; using HH.WMS.BLL; using HH.WMS.BLL.Algorithm; using HH.WMS.BLL.External; using HH.WMS.BLL.InStock; using HH.WMS.BLL.MoveStock; using HH.WMS.BLL.SysMgr; using HH.WMS.Common; using HH.WMS.Common.Algorithm; using HH.WMS.Common.External; using HH.WMS.Common.Para; using HH.WMS.Common.Response; using HH.WMS.DAL; using HH.WMS.DAL.Algorithm; using HH.WMS.DAL.Basic; using HH.WMS.DAL.InStock; using HH.WMS.Entitys; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Entitys; using HH.WMS.Entitys.External; using HH.WMS.Entitys.MoveStock; using HH.WMS.TaskService.Dto; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data; using System.Linq; namespace HH.WMS.TaskService.Jobs { /// /// 巨星同步数据(货位、托盘)Job /// public class JxSyncDataJob { private readonly LockDto _lockDto = new LockDto { IsLock = false }; public void Run() { var logPara = LogType.LogPara("巨星同步数据"); if (_lockDto.IsLock) { Log.Detail(logPara, "当前同步数据任务正在被锁定,还存在未执行结束的任务"); return; } _lockDto.Lock(""); try { SyncDataTask(logPara); } catch (Exception ex) { Log.Detail(logPara, "异常:" + ex.Message); } _lockDto.Unlock(); } //获取移库管理中未执行的数据,只取一条,且将状态变为执行中 private void SyncDataTask(LogPara logPara) { List lstTasks = BLLCreator.Create().GetTask(" AND CN_S_EXT1 = 'NeedSync' "); if (lstTasks.Count == 0) { Log.Detail(logPara, "当前没有需要执行的同步数据!"); return; } else { foreach (TN_WM_TASKEntity entity in lstTasks) { JXJobReference.WebServiceSoapClient jxService = new JXJobReference.WebServiceSoapClient(); string returnFromJuxing = jxService.SetAGVJobStatus("GreatStar", "HNWSRFID", entity.CN_S_TRAY_CODE, entity.CN_S_END_BIT, "", ""); //调用巨星接口回报托盘所入货位及库区 if (string.IsNullOrEmpty(returnFromJuxing)) { DALCreator.Create>().Update(new { CN_S_EXT1 = "Y" }, new { CN_S_TASK_NO = entity.CN_S_TASK_NO }, null); Log.Detail(logPara, "调用巨星WMS返回结果:" + "调用成功"); } } } } private void MoveTrayFromTmpArea(LogPara logPara) { List lstArea = DALCreator.Create().GetAreaCodeByClass("缓存区"); if (lstArea.Count == 0) { return; } List lstCanOutL = DALCreator.Create().GetAssignFlatItemQtyJX(lstArea[0].CN_S_AREA_CODE); List lstTrueLocation = DALCreator.Create().GetLocationByLocationCode(lstCanOutL.Select(o => o.locationCode).ToList()); lstCanOutL = lstCanOutL.Join(lstTrueLocation, u => u.locationCode, d => d.CN_S_LOCATION_CODE, (u, d) => new { u, d }).Select(o => new outAssignLocation { trayCode = o.u.trayCode, locationCode = o.u.locationCode, stockAreaCode = o.u.stockAreaCode, useState = o.u.useState, opTime = o.u.opTime, productDate = o.u.productDate, lotNo = o.u.lotNo, CN_S_STOCK_CODE = o.d.CN_S_STOCK_CODE, CN_S_ROADWAY = o.d.CN_S_ROADWAY, CN_S_ROW = o.d.CN_S_ROW, CN_S_COL = o.d.CN_S_COL, CN_S_FLOOR = o.d.CN_S_FLOOR, CN_S_LOCATION_STATE = o.d.CN_S_LOCATION_STATE }).ToList(); List locationInLock = DALCreator.Create().GetLockLocationByState("", lstArea[0].CN_S_AREA_CODE, null, Constants.Location_State_InLock); Log.AlgorInfo("OutAssign-FlatAreaOutLocation", "locationInLock数据:" + JsonConvert.SerializeObject(locationInLock)); foreach (TN_WM_LOCATIONCODE_EXT_Entity lEntity in locationInLock) { lstCanOutL.RemoveAll(o => o.CN_S_ROW == lEntity.CN_S_ROW && o.CN_S_COL == lEntity.CN_S_COL); } lstCanOutL = lstCanOutL.OrderBy(o => o.CN_S_ROW).ThenByDescending(a => a.CN_S_COL).ToList(); string jxWebUrl = string.Empty; foreach (outAssignLocation outAL in lstCanOutL) { InWorkAreaEntity inWorkAreaEntity = new InWorkAreaEntity(); inWorkAreaEntity.trayCode = outAL.trayCode; inWorkAreaEntity.startBit = outAL.locationCode; inWorkAreaEntity.locationGear = ""; inWorkAreaEntity.endArea = ""; inWorkAreaEntity.endBit = ""; inWorkAreaEntity.isTransport = "Y"; inWorkAreaEntity.needCreateAMSTask = "Y"; List lstInWork = new List(); lstInWork.Add(inWorkAreaEntity); //调用巨星接口获取入库库区 DataSet ds = new DataSet(); string clientKey1 = string.Empty; string clientKey2 = string.Empty; //调用巨星接口获取托盘入库库区 try { try { jxWebUrl = System.Configuration.ConfigurationManager.AppSettings["jxWebUrl"].ToString(); } catch (Exception ep) { ExternalResponse eResponse = new ExternalResponse { success = false, errMsg = "异常:获取webconfig中jxWebUrl配置异常!" + ep.Message }; Log.Detail(logPara, "InWorkArea接口返回结果:" + JsonConvert.SerializeObject(eResponse)); return; } try { clientKey1 = System.Configuration.ConfigurationManager.AppSettings["clientKey1"].ToString(); } catch (Exception ep) { ExternalResponse eResponse = new ExternalResponse { success = false, errMsg = "异常:获取webconfig中clientKey1配置异常!" + ep.Message }; Log.Detail(logPara, "InWorkArea接口返回结果:" + JsonConvert.SerializeObject(eResponse)); return; } try { clientKey2 = System.Configuration.ConfigurationManager.AppSettings["clientKey2"].ToString(); } catch (Exception ep) { ExternalResponse eResponse = new ExternalResponse { success = false, errMsg = "异常:获取webconfig中clientKey2配置异常!" + ep.Message }; Log.Detail(logPara, "InWorkArea接口返回结果:" + JsonConvert.SerializeObject(eResponse)); return; } WebServiceAgent jxAgent = new WebServiceAgent(jxWebUrl); object[] para = { clientKey1, clientKey2, "AGV", inWorkAreaEntity.trayCode, "", "I", "N", null, null }; Log.Detail(logPara, "调用巨星接口获取托盘入库库区输入参数:" + JsonConvert.SerializeObject(para)); object returnObject = jxAgent.Invoke("GetJobDetail", para); ds = (DataSet)returnObject; Log.Detail(logPara, "调用巨星接口获取托盘入库库区:" + JsonConvert.SerializeObject(ds)); if (ds.Tables[0].Rows.Count == 0) { ExternalResponse eResponse = new ExternalResponse { success = false, errMsg = string.Format("托盘号{0}调用巨星WMS的GetJobDetail未获取到数据!", inWorkAreaEntity.trayCode) }; Log.Detail(logPara, "InWorkArea接口返回结果:" + JsonConvert.SerializeObject(eResponse)); return; } object[] para1 = { clientKey1, clientKey2, ds.Tables[0].Rows[0]["TrnSeqNo"].ToString(), inWorkAreaEntity.trayCode, "", "80", "8", "hh" }; Log.Detail(logPara, "调用巨星接口SetAGVJobStatus输入参数:" + JsonConvert.SerializeObject(para1)); object returnObject1 = jxAgent.Invoke("SetAGVJobStatus", para); // HH.WMS.JX.JXWMSServices.WebServiceSoapClient jxServices = new JX.JXWMSServices.WebServiceSoapClient(); // jxServices.SetAGVJobStatus("GreatStar", "HNWSRFID", transportTask.CN_S_TRAY_CODE, transportTask.CN_S_END_BIT, "", ""); Log.Detail(logPara, "returnFromJuxing,SetAGVJobStatus,8:" + returnObject1.ToString()); } catch (Exception ex) { ExternalResponse eResponse = new ExternalResponse { success = false, errMsg = string.Format("调用巨星WMS的GetJobDetail接口异常:{0}!", ex.Message) }; Log.Detail(logPara, "InWorkArea接口返回结果:" + JsonConvert.SerializeObject(eResponse)); return; } if (string.IsNullOrEmpty(inWorkAreaEntity.endBit)) { inWorkAreaEntity.endArea = ds.Tables[0].Rows[0]["ToAreaCode"].ToString(); inWorkAreaEntity.remark = ds.Tables[0].Rows[0]["TrnSeqNo"].ToString(); } else { inWorkAreaEntity.remark = ds.Tables[0].Rows[0]["TrnSeqNo"].ToString(); } string needCreateAMSTask = string.Empty; try { needCreateAMSTask = System.Configuration.ConfigurationManager.AppSettings["needCreateAMSTask"].ToString(); } catch (Exception ep) { ExternalResponse eResponse = new ExternalResponse { success = false, errMsg = "异常:获取webconfig中needCreateAMSTask配置异常!" + ep.Message }; Log.Detail(logPara, "InWorkArea接口返回结果:" + JsonConvert.SerializeObject(eResponse)); return; } inWorkAreaEntity.needCreateAMSTask = needCreateAMSTask; List inWorkAreaEntitys = new List(); inWorkAreaEntitys.Add(inWorkAreaEntity); ExternalResponse resultJX = BLLCreator.Create().InWorkAreaJX(inWorkAreaEntitys); try { if (resultJX.success) { Log.Detail(logPara, "调用巨星WebService接口反馈托盘搬运货位异动"); //更新是否传递给巨星任务完成 WebServiceAgent jxAgent = new WebServiceAgent(jxWebUrl); object[] para = { clientKey1, clientKey2, inWorkAreaEntitys[0].remark, resultJX.okList[0].trayCode, resultJX.okList[0].startBit, "", "I", "hh" }; object returnObject = jxAgent.Invoke("SetLocation", para); } } catch (Exception ex) { Log.Detail(LogType.LogPara("调用巨星WMS接口反馈状态"), "调用巨星WMS接口反馈托盘搬运货位异动:" + ex.Message + ex.StackTrace); } string result = JsonConvert.SerializeObject(resultJX); if (result.IndexOf("false") > 0) { break; } } } } }