| | |
| | | kgzEndLoc = LocationHelper.GetLoc(logicConfig.S_LKBKHCLOC); |
| | | if (kgzStartLoc == null) |
| | | { |
| | | WMSHelper.addAlarmRecord("流程异常", "高", $"库区:{logicConfig.S_AREA_CODE},没有可用的空工装"); |
| | | WMSHelper.addAlarmRecord("流程异常", "高", $"空工装出库站台:{logicConfig.S_LKKTJBLOC},没有在WMS系统中录入"); |
| | | photoStatus = false; |
| | | } |
| | | if (kgzEndLoc == null) |
| | |
| | | { |
| | | "areaCode": "ZZFZLCK", |
| | | "areaName": "中转库(非直连)", |
| | | "cntrType": [ 7 ], |
| | | "cntrType": [ 0 ], |
| | | "type": 2 |
| | | } |
| | | ], |
| | |
| | | public static void UpdateInventoryRegularly() |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var areaCodeList = Settings.areaPropertyList.Select(a => a.areaCode).ToList(); |
| | | var locations = db.Queryable<Location>() |
| | | .LeftJoin<LjLotOnhand>((a, b) => a.S_CODE == b.STORAGE_LOCATION) |
| | | .LeftJoin<LocCntrRel>((a, b, c) => a.S_CODE == c.S_LOC_CODE) |
| | | .Where((a, b, c) => b.PALLET_ID != c.S_CNTR_CODE) |
| | | .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE) |
| | | .Where((a,b) => a.N_CURRENT_NUM > 0 && b.S_CNTR_CODE != null && areaCodeList.Contains(a.S_AREA_CODE) ) |
| | | .ToList(); |
| | | |
| | | foreach (var loc in locations) |
| | | { |
| | | var lotOnhand = db.Queryable<LjLotOnhand>().Where(a => a.STORAGE_LOCATION == loc.S_CODE).First(); |
| | | if (lotOnhand != null) { |
| | | db.Deleteable(lotOnhand).ExecuteCommand(); |
| | | db.Deleteable<LjLotOnhand>().Where(a => a.ID == lotOnhand.ID).ExecuteCommand(); |
| | | } |
| | | |
| | | var locCntrRels = LocationHelper.GetLocCntr(loc.S_CODE); |
| | |
| | | var material = WMSHelper.GetMaterial(cntrItem.S_ITEM_CODE); |
| | | LjLotOnhand ljLotOnhand = new LjLotOnhand() |
| | | { |
| | | ID = WMSHelper.GenerateStockRecordNo(), |
| | | MATERIAL_CODE = cntrItem.S_ITEM_CODE, |
| | | LOT_NAME = cntrItem.S_BATCH_NO, |
| | | PALLET_ID = cntrItem.S_CNTR_CODE, |
| | | STORAGE_LOCATION = loc.S_CODE, |
| | | QC_STATUS = cntrItem.S_ITEM_STATE, |
| | | UNIT = material.S_UNIT, |
| | | UNIT = material == null ? "":material.S_UNIT, |
| | | QTY = cntrItem.F_QTY, |
| | | IN_DATE = cntrItem.T_INBOUND_TIME, |
| | | IN_DATE = cntrItem.T_INBOUND_TIME.ToString("yyyy-MM-dd"), |
| | | CREATION_DATE = DateTime.Now, |
| | | WAREHOUSE_TYPE = "2" |
| | | }; |
| | | db.Insertable(lotOnhand).ExecuteCommand(); |
| | | db.Insertable(ljLotOnhand).ExecuteCommand(); |
| | | } |
| | | }); |
| | | } |
| | |
| | | public string QC_STATUS { get; set; } //状态 |
| | | public string UNIT { get; set; } //单位 |
| | | public float QTY { get; set; } //数量 |
| | | public DateTime IN_DATE { get; set; } //入库时间 |
| | | public string IN_DATE { get; set; } //入库时间 |
| | | public DateTime CREATION_DATE { get; set; } //创建日期 |
| | | public string WAREHOUSE_TYPE { get; set; } //区分不同厂家(1/思尔特,2/杭叉) |
| | | } |
| | |
| | | var date = DateTime.Now.ToString("yyMMdd"); |
| | | return $"SO{date}{id.ToString().PadLeft(4, '0')}"; |
| | | } |
| | | internal static int GenerateStockRecordNo() |
| | | { |
| | | return SYSHelper.GetSerialNumber("库存记录号", "SR"); |
| | | } |
| | | |
| | | internal static string GenerateAlarmNo() |
| | | { |
| | |
| | | result.success = false; |
| | | result.message = "内部异常,请联系开发人员处理"; |
| | | LogHelper.Info($"内部异常,错误信息:{ex.Message}", "车间控制器"); |
| | | LogHelper.Info(ex.StackTrace, "车间控制器"); |
| | | } |
| | | LogHelper.Info("创建入库搬运任务-createInOrder 出参:" + JsonConvert.SerializeObject(result), "车间控制器"); |
| | | return result; |
| | |
| | | result.success = false; |
| | | result.message = "内部异常,请联系开发人员处理"; |
| | | LogHelper.Info($"内部异常,错误信息:{ex.Message}", "车间控制器"); |
| | | LogHelper.Info(ex.StackTrace, "车间控制器"); |
| | | } |
| | | |
| | | LogHelper.Info("创建出库搬运任务-createOutOrder 出参:" + JsonConvert.SerializeObject(result), "车间控制器"); |
| | |
| | | |
| | | if (wcsTask.S_SCHEDULE_TYPE.Contains("LD")) |
| | | { |
| | | if (wcsTask.S_TYPE.Contains("出库")) |
| | | { |
| | | var locCntrs = LocationHelper.GetLocCntrRel(wcsTask.S_START_LOC); |
| | | if (locCntrs.Count > 0) |
| | | { |
| | | var cntrList = locCntrs.Select(a => a.S_CNTR_CODE).ToList(); |
| | | if (cntrList.Contains(wcsTask.S_CNTR_CODE)) |
| | | { |
| | | var linePlcInfo = WCSHelper.GetLinePlcInfo(wcsTask.S_START_LOC); |
| | | triggerAlarmCommand(linePlcInfo , 1); |
| | | } |
| | | } |
| | | } |
| | | |
| | | LocationHelper.UnBindingLoc(wcsTask.S_START_LOC, new List<string>() { wcsTask.S_CNTR_CODE }); |
| | | LocationHelper.UnBindingLoc(wcsTask.S_END_LOC, new List<string>() { wcsTask.S_CNTR_CODE }); |
| | | |
| | |
| | | ContainerHelper.deleteCntrItem(wmsTask.S_CNTR_CODE); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | WCSHelper.Fail(wcsTask); |
| | | LocationHelper.UnLockLoc(wcsTask.S_START_LOC); |
| | | LocationHelper.UnLockLoc(wcsTask.S_END_LOC); |
| | |
| | | S7Helper.WriteInt(line.deviceNo, 101, line.writeAddr + 8, command); // 下发指令(默认=0 入库=2 出库=1 不合格退回=3) |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 清除输送线命令 |
| | | /// </summary> |
| | | /// <param name="line"></param> |
| | | /// <param name="command"> 1.agv任务异常取消</param> |
| | | public static void triggerAlarmCommand(LinePlcInfo line, short command) |
| | | { |
| | | S7Helper.WriteDint(line.deviceNo, 101, line.writeAddr + 20, command); // 任务号 |
| | | } |
| | | |
| | | public class SSXStatusInfo { |
| | | public string deviceNo { get; set; } |
| | | public string status { get; set; } |
| | |
| | | else { |
| | | Console.WriteLine($"起点托盘数量和货位容器表不符合,请检查【货位表】和【货位容器表】"); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | |
| | | { |
| | | |
| | | float weight = pipelineSignalInfo.weight / trayCodes.Count; |
| | | float furWeight = WMSHelper.getFurWeight(child.LOTATT09); // 毛皮重量 |
| | | float furWeight = WMSHelper.getFurWeight(child.LOTATT10); // 毛皮重量 |
| | | child.F_NET_WEIGHT = weight - furWeight; |
| | | asnNo = child.S_ASN_NO; |
| | | orientSign = child.LOTATT18; |
| | |
| | | ContainerHelper.deleteCntrItem(cntrCode); |
| | | } |
| | | } |
| | | |
| | | if (wst.S_TYPE == "出库任务") |
| | | { |
| | | var child = WMSHelper.getOutstockListChild(wst.S_OP_DEF_CODE, cst.S_DATA); |
| | | |
| | | var cntrCodeList = cst.S_CNTR_CODE.Split(',').ToList(); |
| | | // 更新出库数量 |
| | | float qty = 0; |
| | | for (int i = 0; i < cntrCodeList.Count; i++) |
| | | { |
| | | var cntrItemRels = ContainerHelper.GetCntrItemRel(cntrCodeList[i]); |
| | | foreach (var cntrItemRel in cntrItemRels) |
| | | { |
| | | qty -= cntrItemRel.F_QTY; |
| | | } |
| | | } |
| | | child.PRE_COMPLETED_QTY = child.PRE_COMPLETED_QTY + qty; |
| | | WMSHelper.updateOutStockListChild(child); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | var cntrItemRel = ContainerHelper.GetCntrItemRel(downCntr.S_CNTR_CODE).FirstOrDefault(); |
| | | if (cntrItemRel != null) |
| | | { |
| | | float height = WMSHelper.getFurHeight(cntrItemRel.LOTATT09); |
| | | float height = WMSHelper.getFurHeight(cntrItemRel.LOTATT10); |
| | | mst.S_START_LOC = mst.S_START_LOC + "-" + height; |
| | | } |
| | | } |
| | |
| | | if (endLocCntrRels != null && endLocCntrRels.Count == 1) { |
| | | var cntrItemRel = ContainerHelper.GetCntrItemRel(endLocCntrRels[0].S_CNTR_CODE).FirstOrDefault(); |
| | | if (cntrItemRel != null) { |
| | | float height = WMSHelper.getFurHeight(cntrItemRel.LOTATT09); |
| | | float height = WMSHelper.getFurHeight(cntrItemRel.LOTATT10); |
| | | mst.S_END_LOC = mst.S_END_LOC + "-" + height; |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | // 查询同批次入库锁数量,如果锁数量 >= 2 ,则不再从【空排】入库 |
| | | int lockNum = db.Queryable<Location>().Where(a => a.N_LOCK_STATE == 1 && a.S_LOCK_OP.Trim() == asnNo).Count(); |
| | | LogHelper.Info("同批次入库锁数量:" + lockNum, "Mobox"); |
| | | if (end == null && rowNum < 2 && lockNum < 2 ) |
| | | var lockRow = db.Queryable<Location>().Where(a => a.N_LOCK_STATE == 1 && a.S_LOCK_OP.Trim() == asnNo).Take(1).PartitionBy(l => new { l.S_AREA_CODE, l.N_ROW }).ToList(); |
| | | LogHelper.Info("同批次入库锁数量:" + lockRow.Count, "Mobox"); |
| | | if (end == null && rowNum < 2 && lockRow.Count < 2 ) |
| | | { |
| | | string fullerCode = null; |
| | | if (rowNum == 1) |
| | | if (lockRow.Count > 0) |
| | | { |
| | | var maxLoc = lockRow[0]; |
| | | var fuller = db.Queryable<TN_Fuller>().Where(a => a.S_AREA_CODE == maxLoc.S_AREA_CODE && a.N_ROW == maxLoc.N_ROW).First(); |
| | | if (fuller != null) |
| | | { |
| | | fullerCode = fuller.FULLER_CODE; |
| | | } |
| | | } |
| | | |
| | | if (fullerCode == null && rowNum > 0 ) |
| | | { |
| | | var maxLoc = listMaxCol[0]; |
| | | var fuller = db.Queryable<TN_Fuller>().Where(a => a.S_AREA_CODE == maxLoc.S_AREA_CODE && a.N_ROW == maxLoc.N_ROW).First(); |
| | |
| | | { |
| | | "HostToAgvServerUrl": "http://192.168.1.146:9988/HostToAGV.cgi", |
| | | "HASeverUrl": "http://172.16.10.41", |
| | | "NDCApiUrl": "", |
| | | "SqlServer": "server=192.168.1.204;uid=root;pwd=yn123456;database=oimobox", |
| | | "SqlServer1": "Data Source=192.168.1.198\\sql2008;Initial Catalog=OIMobox;User ID=sa;Password=sa@2015", |
| | | "ApiPort": 8901, |
| | |
| | | "WHCode": "IW001", |
| | | "NDCApiUrl": "", |
| | | "baseTrayBufferLoc": [ |
| | | |
| | | { |
| | | |
| | | { |
| | | "bufferOutLoc": "SeA26", |
| | | "bufferInLoc": "PPA06-12-1-2" |
| | | }, |
| | | { |
| | | { |
| | | "bufferOutLoc": "SeA27", |
| | | "bufferInLoc": "PPA07-13-1-1" |
| | | }, |
| | | { |
| | | { |
| | | "bufferOutLoc": "SeA28", |
| | | "bufferInLoc": "PPA07-13-1-2" |
| | | }, |
| | | { |
| | | { |
| | | "bufferOutLoc": "SeA29", |
| | | "bufferInLoc": "PPA07-14-1-1" |
| | | }, |
| | | { |
| | | { |
| | | "bufferOutLoc": "SeA231", |
| | | "bufferInLoc": "PPA07-14-1-2" |
| | | } |
| | |
| | | }, |
| | | { |
| | | "locCode": "SeA05", |
| | | "roadway": [ 2], |
| | | "roadway": [ 2 ], |
| | | "action": 1 |
| | | }, |
| | | { |
| | |
| | | }, |
| | | { |
| | | "locCode": "SeA10", |
| | | "roadway": [ 3 ], |
| | | "roadway": [ 3 ], |
| | | "action": 1 |
| | | }, |
| | | { |
| | |
| | | }, |
| | | { |
| | | "locCode": "SeA29", |
| | | "roadway": [ 6,7 ], |
| | | "roadway": [ 6, 7 ], |
| | | "action": 1 |
| | | }, |
| | | { |
| | | "locCode": "SeA30", |
| | | "roadway": [ 6,7 ], |
| | | "roadway": [ 6, 7 ], |
| | | "action": 2 |
| | | }, |
| | | { |
| | | "locCode": "SeA31", |
| | | "roadway": [ 6,7 ], |
| | | "roadway": [ 6, 7 ], |
| | | "action": 1 |
| | | }, |
| | | { |
| | | "locCode": "SeA32", |
| | | "roadway": [ 6,7 ], |
| | | "roadway": [ 6, 7 ], |
| | | "action": 2 |
| | | } |
| | | ] |
| | |
| | | { |
| | | public class NDCApi |
| | | { |
| | | private static readonly HttpHelper apiHelper = new HttpHelper(); |
| | | public static string NDCApiUrl { set; get; } |
| | | |
| | | static NDCApi() { |
| | |
| | | /// <param name="ts"></param> |
| | | /// <param name="pri"></param> |
| | | /// <param name="taskNo"></param> |
| | | /// <param name="param"></param> |
| | | /// <param name="paramList"></param> |
| | | /// <returns></returns> |
| | | public static AgvApiResult AddOrderNew(int ts, int pri, string taskNo, List<Param> paramList) |
| | | { |
| | | var httpH = new HttpHelper(); |
| | | var agvApiResult = new AgvApiResult(); |
| | | var model = new AddOrderNewModel(); |
| | | model.ts_no = ts; |
| | | model.pri = pri; |
| | | model.task_no = taskNo; |
| | | model.paramList = paramList; |
| | | model.param = paramList; |
| | | try { |
| | | LogHelper.Info($"任务{taskNo}下发,{JsonConvert.SerializeObject(model)}" , "NDC"); |
| | | var result = httpH.WebPost(NDCApiUrl + "Add",JsonConvert.SerializeObject(model)); |
| | | var result = apiHelper.Post(NDCApiUrl + "Add",JsonConvert.SerializeObject(model)); |
| | | LogHelper.Info($"任务下发结果res={result}", "NDC"); |
| | | agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result); |
| | | return agvApiResult; |
| | |
| | | /// <returns></returns> |
| | | public static AgvApiResult AddOrderNew(AddOrderNewModel model) |
| | | { |
| | | var httpH = new HttpHelper(); |
| | | var agvApiResult = new AgvApiResult(); |
| | | try |
| | | { |
| | | LogHelper.Info($"任务{model.task_no}下发,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}下发,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | var result = httpH.WebPost(NDCApiUrl + "Add", JsonConvert.SerializeObject(model)); |
| | | var result = apiHelper.Post(NDCApiUrl + "Add", JsonConvert.SerializeObject(model)); |
| | | LogHelper.Info($"任务下发结果res={result}", "NDC"); |
| | | Console.WriteLine($"任务下发结果res={result}"); |
| | | agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result); |
| | | return agvApiResult; |
| | | } |
| | |
| | | /// <returns></returns> |
| | | public static AgvApiResult CancelOrder(string tsNo, bool is_force) |
| | | { |
| | | var httpH = new HttpHelper(); |
| | | var agvApiResult = new AgvApiResult(); |
| | | var model = new CancelOrderModel(); |
| | | model.task_no = tsNo; |
| | |
| | | try { |
| | | LogHelper.Info($"任务{model.task_no}取消,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}取消,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | var result = httpH.WebPost(NDCApiUrl + "Cancel", JsonConvert.SerializeObject(model)); |
| | | var result = apiHelper.Post(NDCApiUrl + "Cancel", JsonConvert.SerializeObject(model)); |
| | | LogHelper.Info($"任务{model.task_no}取消结果={result}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}取消结果={result}", "NDC"); |
| | | agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result); |
| | |
| | | /// <returns></returns> |
| | | public static AgvApiResult CancelOrder(CancelOrderModel model) |
| | | { |
| | | var httpH = new HttpHelper(); |
| | | var agvApiResult = new AgvApiResult(); |
| | | try |
| | | { |
| | | LogHelper.Info($"任务{model.task_no}取消,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}取消,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | var result = httpH.WebPost(NDCApiUrl + "Cancel", JsonConvert.SerializeObject(model)); |
| | | var result = apiHelper.Post(NDCApiUrl + "Cancel", JsonConvert.SerializeObject(model)); |
| | | LogHelper.Info($"任务{model.task_no}取消结果={result}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}取消结果={result}", "NDC"); |
| | | agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result); |
| | | return agvApiResult; |
| | | } |
| | |
| | | /// <returns></returns> |
| | | public static AgvApiResult ChangeOrderPri(string taskNo, int newPri) |
| | | { |
| | | var httpH = new HttpHelper(); |
| | | var agvApiResult = new AgvApiResult(); |
| | | var model = new ChangePriModel(); |
| | | model.task_no = taskNo; |
| | |
| | | try |
| | | { |
| | | LogHelper.Info($"任务{model.task_no}优先级更改,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}优先级更改,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | var result = httpH.WebPost(NDCApiUrl + "ChangePri", JsonConvert.SerializeObject(model)); |
| | | var result = apiHelper.Post(NDCApiUrl + "ChangePri", JsonConvert.SerializeObject(model)); |
| | | LogHelper.Info($"任务{model.task_no}优先级更改结果={result}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}优先级更改结果={result}", "NDC"); |
| | | agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result); |
| | | return agvApiResult; |
| | | } |
| | |
| | | /// <returns></returns> |
| | | public static AgvApiResult ChangeOrderPri(ChangePriModel model) |
| | | { |
| | | var httpH = new HttpHelper(); |
| | | var agvApiResult = new AgvApiResult(); |
| | | try |
| | | { |
| | | LogHelper.Info($"任务{model.task_no}优先级更改,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}优先级更改,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | var result = httpH.WebPost(NDCApiUrl + "ChangePri", JsonConvert.SerializeObject(model)); |
| | | var result = apiHelper.Post(NDCApiUrl + "ChangePri", JsonConvert.SerializeObject(model)); |
| | | LogHelper.Info($"任务{model.task_no}优先级更改结果={result}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}优先级更改结果={result}", "NDC"); |
| | | agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result); |
| | | return agvApiResult; |
| | | } |
| | |
| | | /// <returns></returns> |
| | | public static AgvApiResult ChangeOrderParam(string taskNo,int paramNo, string paramStr) |
| | | { |
| | | var httpH = new HttpHelper(); |
| | | var agvApiResult = new AgvApiResult(); |
| | | var model = new ChangeParamModel(); |
| | | model.task_no = taskNo; |
| | |
| | | model.param = paramStr; |
| | | try { |
| | | LogHelper.Info($"任务{model.task_no}参数更改,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}参数更改,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | var result = httpH.WebPost(NDCApiUrl + "ChangeParam", JsonConvert.SerializeObject(model)); |
| | | var result = apiHelper.Post(NDCApiUrl + "ChangeParam", JsonConvert.SerializeObject(model)); |
| | | LogHelper.Info($"任务{model.task_no}参数更改结果={result}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}参数更改结果={result}", "NDC"); |
| | | agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result); |
| | | return agvApiResult; |
| | | } |
| | |
| | | /// <returns></returns> |
| | | public static AgvApiResult ChangeOrderParam(ChangeParamModel model) |
| | | { |
| | | var httpH = new HttpHelper(); |
| | | var agvApiResult = new AgvApiResult(); |
| | | try |
| | | { |
| | | LogHelper.Info($"任务{model.task_no}参数更改,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}参数更改,{JsonConvert.SerializeObject(model)}", "NDC"); |
| | | var result = httpH.WebPost(NDCApiUrl + "ChangeParam", JsonConvert.SerializeObject(model)); |
| | | var result = apiHelper.Post(NDCApiUrl + "ChangeParam", JsonConvert.SerializeObject(model)); |
| | | LogHelper.Info($"任务{model.task_no}参数更改结果={result}", "NDC"); |
| | | Console.WriteLine($"任务{model.task_no}参数更改结果={result}", "NDC"); |
| | | agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result); |
| | | return agvApiResult; |
| | | } |
| | |
| | | public int ts_no { set; get; }//TS 号,必须有值 |
| | | public int pri { set; get; }//优先级 |
| | | public string task_no { set; get; }//上游任务编码,如果 no_feedback = 1 时,可以为空 |
| | | public List<Param> paramList { set; get; } = new List<Param>();//参数列表 |
| | | public List<Param> param { set; get; } = new List<Param>();//参数列表 |
| | | } |
| | | |
| | | |
| | |
| | | }; |
| | | paramList.Add(param); |
| | | } |
| | | model.paramList = paramList; |
| | | model.param = paramList; |
| | | LogHelper.Info($"向AGV下发任务,任务参数:{model}", "WMS"); |
| | | var res = NDCApi.AddOrderNew(model); |
| | | if (res != null && res.err_code == 0 || true) |
| | |
| | | <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" /> |
| | | <bindingRedirect oldVersion="0.0.0.0-5.2.9.0" newVersion="5.2.9.0" /> |
| | | </dependentAssembly> |
| | | <dependentAssembly> |
| | | <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" /> |
| | | <bindingRedirect oldVersion="0.0.0.0-8.0.30.0" newVersion="8.0.30.0" /> |
| | | </dependentAssembly> |
| | | <dependentAssembly> |
| | | <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> |
| | | <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" /> |
| | | </dependentAssembly> |
| | | </assemblyBinding> |
| | | </runtime> |
| | | </configuration> |
| | |
| | | <WarningLevel>4</WarningLevel> |
| | | </PropertyGroup> |
| | | <ItemGroup> |
| | | <Reference Include="BouncyCastle.Crypto, Version=1.9.0.0, Culture=neutral, PublicKeyToken=0e99375e54769942, processorArchitecture=MSIL"> |
| | | <HintPath>packages\Portable.BouncyCastle.1.9.0\lib\net40\BouncyCastle.Crypto.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="EasyModbus, Version=5.6.0.0, Culture=neutral, processorArchitecture=MSIL"> |
| | | <HintPath>packages\EasyModbusTCP.5.6.0\lib\net40\EasyModbus.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="Google.Protobuf, Version=3.19.4.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL"> |
| | | <HintPath>packages\Google.Protobuf.3.19.4\lib\net45\Google.Protobuf.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="K4os.Compression.LZ4, Version=1.2.6.0, Culture=neutral, PublicKeyToken=2186fa9121ef231d, processorArchitecture=MSIL"> |
| | | <HintPath>packages\K4os.Compression.LZ4.1.2.6\lib\net46\K4os.Compression.LZ4.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="K4os.Compression.LZ4.Streams, Version=1.2.6.0, Culture=neutral, PublicKeyToken=2186fa9121ef231d, processorArchitecture=MSIL"> |
| | | <HintPath>packages\K4os.Compression.LZ4.Streams.1.2.6\lib\net46\K4os.Compression.LZ4.Streams.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="K4os.Hash.xxHash, Version=1.0.6.0, Culture=neutral, PublicKeyToken=32cd54395057cec3, processorArchitecture=MSIL"> |
| | | <HintPath>packages\K4os.Hash.xxHash.1.0.6\lib\net46\K4os.Hash.xxHash.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> |
| | | <HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.7.0.0\lib\netstandard2.0\Microsoft.Bcl.AsyncInterfaces.dll</HintPath> |
| | |
| | | </Reference> |
| | | <Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> |
| | | <HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="MySql.Data, Version=8.0.30.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL"> |
| | | <HintPath>packages\MySql.Data.8.0.30\lib\net452\MySql.Data.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> |
| | | <HintPath>..\ConsoleApp1\packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll</HintPath> |
| | |
| | | <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> |
| | | <HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="System.ComponentModel, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" /> |
| | | <Reference Include="System.ComponentModel.DataAnnotations" /> |
| | | <Reference Include="System.Configuration" /> |
| | | <Reference Include="System.Configuration.Install" /> |
| | | <Reference Include="System.Core" /> |
| | | <Reference Include="System.IO.Compression" /> |
| | | <Reference Include="System.Management" /> |
| | | <Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> |
| | | <HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath> |
| | | </Reference> |
| | |
| | | <Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> |
| | | <HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="System.Transactions" /> |
| | | <Reference Include="System.Web" /> |
| | | <Reference Include="System.Web.Http, Version=5.2.9.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> |
| | | <HintPath>..\packages\System.Web.Http.dll</HintPath> |
| | |
| | | <Reference Include="Topshelf.NLog, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b800c4cfcdeea87b, processorArchitecture=MSIL"> |
| | | <HintPath>..\packages\Topshelf.NLog.4.3.0\lib\net452\Topshelf.NLog.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="Ubiety.Dns.Core, Version=2.2.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL"> |
| | | <HintPath>packages\MySql.Data.8.0.30\lib\net452\Ubiety.Dns.Core.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="WebActivatorEx, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7b26dc2a43f6a0d4, processorArchitecture=MSIL"> |
| | | <HintPath>..\packages\WebActivatorEx.2.0\lib\net40\WebActivatorEx.dll</HintPath> |
| | | </Reference> |
| | | <Reference Include="ZstdNet, Version=1.4.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL"> |
| | | <HintPath>packages\MySql.Data.8.0.30\lib\net452\ZstdNet.dll</HintPath> |
| | | </Reference> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <Compile Include="api\MoboxController.cs" /> |
| | |
| | | internal class Program |
| | | { |
| | | static void Main(string[] args) { |
| | | |
| | | Settings.Init(); |
| | | //1.0 开启api |
| | | Startup(); |
| | | //2.0 开启tcp |
| | |
| | | using HH.WCS.Mobox3.YNJT_PT.process; |
| | | using HH.WCS.Mobox3.YNJT_PT.util; |
| | | using HH.WCS.Mobox3.YNJT_PT.wms; |
| | | using MySqlX.XDevAPI.Common; |
| | | using Newtonsoft.Json; |
| | | using Newtonsoft.Json.Linq; |
| | | using SqlSugar; |
| | |
| | | N_IS_URGENT = model.isUrgent, |
| | | T_OFF_TIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), |
| | | N_IS_FULL = model.isFull, |
| | | |
| | | S_LOC = model.loc |
| | | }; |
| | | WMSHelper.addOffLineRecord(record); |
| | | } |
| | |
| | | var itemBarcodeInfo = WMSHelper.GetGreenTireInformation(ext.barcode); |
| | | if (itemBarcodeInfo != null) |
| | | { |
| | | itemBarcodeInfo.N_URGENT_FLAG = offLineRecord.N_IS_URGENT; |
| | | // 计算生效时间、失效时间 |
| | | var overage = WMSHelper.getOverage(itemBarcodeInfo.BARCODE); |
| | | LogHelper.Info($"计算生效时间、失效时间,返回值:{JsonConvert.SerializeObject(overage)}", "WMS"); |
| | | if (overage != null) |
| | | { |
| | | DateTime txndate = DateTime.Parse(itemBarcodeInfo.TXNDATE); |
| | | DateTime minTime = txndate.AddHours(overage.MINHOUR); |
| | | DateTime maxTime = txndate.AddDays(overage.OVERAGE); |
| | | itemBarcodeInfo.S_EFFECTIVE_TIME = minTime.ToString("yyyy-MM-dd HH:mm:ss"); |
| | | itemBarcodeInfo.S_EXPIRATION_TIME = maxTime.ToString("yyyy-MM-dd HH:mm:ss"); |
| | | } |
| | | else |
| | | { |
| | | response.code = 1; |
| | | response.msg = $"未查询到物料存放时间配置信息,条形码:{itemBarcodeInfo.BARCODE}"; |
| | | return response; |
| | | } |
| | | |
| | | ContainerHelper.addCntrItemRel(rfid, itemBarcodeInfo); |
| | | barcodeList.Add(ext); |
| | | } |
| | | else |
| | |
| | | wmsTask.N_B_STATE = 1; |
| | | WMSHelper.UpdateTaskState(wmsTask); |
| | | |
| | | // 绑定容器物料信息 |
| | | /*// 绑定容器物料信息 |
| | | var itemBarcodeInfo = WMSHelper.GetGreenTireInformation(ext.barcode); |
| | | WMSHelper.bindBarcodeItemInfo(wmsTask.S_CNTR_CODE, itemBarcodeInfo); |
| | | WMSHelper.bindBarcodeItemInfo(wmsTask.S_CNTR_CODE, itemBarcodeInfo);*/ |
| | | } |
| | | } |
| | | } |
| | |
| | | else |
| | | { |
| | | // 异常托盘排除 |
| | | var middleLoc = WMSHelper.getMinTaskMiddleLoc(1); // 1.异常排出位 |
| | | endLoc = WMSHelper.getAbnormalAreaEmptyLoc(Settings.abnormalArea); |
| | | var middleLoc = WMSHelper.getMinTaskMiddleLoc(1); // 1.排出位 |
| | | endLoc = WMSHelper.getOnlneLoc(2); // 2.空托上线位(排出的托盘都出库到空托上线位进行处理) |
| | | if (endLoc != null && middleLoc != null) |
| | | { |
| | | var wmsTask = new WMSTask() |
| | |
| | | |
| | | /// <summary> |
| | | /// 读码请求 |
| | | /// 场景:1. |
| | | /// </summary> |
| | | public static ResponseResult readCodeRequest(NotifyDeviceSignalModel model) |
| | | { |
| | |
| | | { |
| | | verifyResult = true |
| | | }; |
| | | var wmsTask = WMSHelper.GetWmsTask(model.taskNo); |
| | | if (wmsTask != null) |
| | | var wcsTask = WCSHelper.GetTask(model.taskNo); |
| | | var wmsTask = WMSHelper.GetWmsTask(wcsTask.S_OP_CODE); |
| | | if (wcsTask != null && wmsTask != null) |
| | | { |
| | | if (wmsTask.S_TYPE != "异常托盘出库任务") |
| | | Location endLoc = LocationHelper.GetLoc(wmsTask.S_END_LOC); // 原终点 |
| | | if (wcsTask.S_TYPE == "满料下线入库任务") |
| | | { |
| | | Location endLoc = null; |
| | | Location middleLoc = null; |
| | | // 判断rfid是否异常 |
| | | if (model.cntrNo != wmsTask.S_CNTR_CODE) |
| | | if (model.cntrNo != wcsTask.S_CNTR_CODE) |
| | | { |
| | | endLoc = LocationHelper.GetLoc(wmsTask.S_END_LOC); |
| | | var connectLoc = Settings.connectLocList.Where(a => a.roadway == endLoc.N_ROADWAY && a.type == 1).FirstOrDefault(); |
| | | middleLoc = LocationHelper.GetLoc(connectLoc.locCode); |
| | | endLoc = WMSHelper.getAbnormalAreaEmptyLoc(Settings.abnormalArea); |
| | | // 查询排出口 |
| | | Location middleLoc = WMSHelper.getMinTaskMiddleLoc(1, 0, endLoc.N_ROADWAY); |
| | | // 查询新终点 |
| | | endLoc = WMSHelper.getOnlneLoc(2); |
| | | |
| | | wcsTask.S_END_LOC = middleLoc.S_CODE; |
| | | wcsTask.S_END_AREA = middleLoc.S_AREA_CODE; |
| | | WCSHelper.updateTaskEnd(wcsTask); |
| | | |
| | | wmsTask.S_END_LOC = endLoc.S_CODE; |
| | | wmsTask.S_END_AREA = endLoc.S_AREA_CODE; |
| | | WMSHelper.UpdateTaskEnd(wmsTask); |
| | | |
| | | var wcsTask = WCSHelper.GetTaskBySrcNo(wmsTask.S_CODE); |
| | | if (wcsTask != null) |
| | | { |
| | | wcsTask.S_END_LOC = middleLoc.S_CODE; |
| | | wcsTask.S_END_AREA = middleLoc.S_AREA_CODE; |
| | | WCSHelper.updateTaskEnd(wcsTask); |
| | | } |
| | | |
| | | readCodeFeedbackResponse.verifyResult = false; |
| | | readCodeFeedbackResponse.endLoc = middleLoc.S_CODE; |
| | | response.data = readCodeFeedbackResponse; |
| | | } |
| | | } |
| | | else if (wcsTask.S_TYPE == "胚胎叫料出库任务") |
| | | { |
| | | if (model.cntrNo != wcsTask.S_CNTR_CODE) |
| | | { |
| | | // 计算排出口 |
| | | endLoc = WMSHelper.getCallOutLoc(endLoc.N_ROW); |
| | | |
| | | wcsTask.S_END_LOC = endLoc.S_CODE; |
| | | wcsTask.S_END_AREA = endLoc.S_AREA_CODE; |
| | | WCSHelper.updateTaskEnd(wcsTask); |
| | | |
| | | wmsTask.S_END_LOC = endLoc.S_CODE; |
| | | wmsTask.S_END_AREA = endLoc.S_AREA_CODE; |
| | | WMSHelper.UpdateTaskEnd(wmsTask); |
| | | |
| | | readCodeFeedbackResponse.verifyResult = false; |
| | | readCodeFeedbackResponse.endLoc = endLoc.S_CODE; |
| | | } |
| | | else |
| | | { |
| | | var cntrItemRels = ContainerHelper.GetCntrItemRel(wmsTask.S_CNTR_CODE); |
| | | if (cntrItemRels.Count > 0) |
| | | var cntrItemRels = ContainerHelper.GetCntrItemRel(wcsTask.S_CNTR_CODE); |
| | | if (cntrItemRels.Count > 0) |
| | | { |
| | | if (cntrItemRels[0].S_ITEM_STATE != "OK") |
| | | if (cntrItemRels[0].S_ITEM_STATE != "OK") |
| | | { |
| | | middleLoc = WMSHelper.getMinTaskMiddleLoc(1); // 1.异常排出位 |
| | | endLoc = WMSHelper.getAbnormalAreaEmptyLoc(Settings.abnormalArea); |
| | | endLoc = WMSHelper.getMinTaskMiddleLoc(1,endLoc.N_ROADWAY); ; |
| | | |
| | | wcsTask.S_END_LOC = endLoc.S_CODE; |
| | | wcsTask.S_END_AREA = endLoc.S_AREA_CODE; |
| | | WCSHelper.updateTaskEnd(wcsTask); |
| | | |
| | | wmsTask.S_END_LOC = endLoc.S_CODE; |
| | | wmsTask.S_END_AREA = endLoc.S_AREA_CODE; |
| | | WMSHelper.UpdateTaskEnd(wmsTask); |
| | | |
| | | var wcsTask = WCSHelper.GetTaskBySrcNo(wmsTask.S_CODE); |
| | | if (wcsTask != null) |
| | | { |
| | | wcsTask.S_END_LOC = middleLoc.S_CODE; |
| | | wcsTask.S_END_AREA = middleLoc.S_AREA_CODE; |
| | | WCSHelper.updateTaskEnd(wcsTask); |
| | | } |
| | | |
| | | readCodeFeedbackResponse.verifyResult = false; |
| | | readCodeFeedbackResponse.endLoc = middleLoc.S_CODE; |
| | | response.data = readCodeFeedbackResponse; |
| | | readCodeFeedbackResponse.endLoc = endLoc.S_CODE; |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | else |
| | |
| | | } |
| | | response.data = readCodeFeedbackResponse; |
| | | return response; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 申请新终点 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public static ResponseResult applyDest(ApplyDestModel model) |
| | | { |
| | | ResponseResult response = new ResponseResult(); |
| | | ApplyDest applyDest = new ApplyDest(); |
| | | var wcsTask = WCSHelper.GetTask(model.taskNo); |
| | | if (wcsTask != null) |
| | | { |
| | | var wmsTask = WMSHelper.GetWmsTask(wcsTask.S_OP_CODE); |
| | | if (wcsTask != null) |
| | | { |
| | | string itemCode = null; |
| | | var endLoc = LocationHelper.GetLoc(wcsTask.S_END_LOC); |
| | | var cntrItemRels = ContainerHelper.GetCntrItemRel(wcsTask.S_CNTR_CODE); |
| | | if (cntrItemRels.Count > 0) |
| | | { |
| | | itemCode = cntrItemRels[0].S_ITEM_CODE; |
| | | } |
| | | |
| | | if (model.applyType == 1) |
| | | { |
| | | LocationHelper.LockLoc(wcsTask.S_END_LOC, 3); // 将原货位锁定(其他锁) |
| | | var endLocGroup = WMSHelper.getInStockEndLoc(1, itemCode, endLoc.N_ROADWAY); |
| | | if (endLocGroup.endLocList.Count > 0) |
| | | { |
| | | endLoc = endLocGroup.endLocList[0]; |
| | | applyDest.endLoc = endLoc.S_CODE; |
| | | } |
| | | } |
| | | else if (model.applyType == 2) |
| | | { |
| | | var endLocGroup = WMSHelper.getInStockEndLoc(1, cntrItemRels[0].S_ITEM_CODE, 0, endLoc.N_ROADWAY); |
| | | if (endLocGroup.endLocList.Count > 0) |
| | | { |
| | | endLoc = endLocGroup.endLocList[0]; |
| | | applyDest.endLoc = endLoc.S_CODE; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | response.code = 1; |
| | | response.msg = $"任务:{model.taskNo}不存在"; |
| | | } |
| | | return response; |
| | | } |
| | | |
| | | public class ApplyDest |
| | | { |
| | | public string endLoc { get; set; } |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | S_START_AREA = startLoc.S_AREA_CODE, |
| | | S_END_LOC = endLoc.S_CODE, |
| | | S_END_AREA = endLoc.S_AREA_CODE, |
| | | S_TYPE = "满料下线入库任务", |
| | | S_TYPE = "胚胎叫料出库任务", |
| | | S_OP_DEF_CODE = model.reqId, |
| | | S_OP_DEF_NAME = "成型机满料下线入库", |
| | | S_OP_DEF_NAME = "硫化机呼叫胚胎出库", |
| | | N_PRIORITY = 1, |
| | | T_START_TIME = DateTime.Now, |
| | | S_GROUP_NO = groupNo, |
| | |
| | | if (locCntrs.Count == 1) |
| | | { |
| | | Location startLoc = LocationHelper.GetLoc(locCntrs[0].S_LOC_CODE); |
| | | var connectLoc = Settings.connectLocList.Where(a => a.roadway == startLoc.N_ROADWAY && a.type == 1).First(); |
| | | var connectLoc = Settings.connectLocList.Where(a => a.roadway == startLoc.N_ROADWAY).First(); |
| | | Location middleLoc = LocationHelper.GetLoc(connectLoc.locCode); |
| | | Location endLoc = LocationHelper.GetLoc(""); |
| | | if (endLoc != null) |
| | |
| | | |
| | | if (model.status == 2 || model.status == 8) |
| | | { |
| | | if (mst != null) |
| | | if (mst != null && mst.N_B_STATE != 2) |
| | | { |
| | | if (mst.N_B_STATE != 2) |
| | | if (mst.S_END_LOC != cst.S_END_LOC) |
| | | { |
| | | WCSCore.createLastTask(cst.S_END_LOC, mst); |
| | | } |
| | | else |
| | | { |
| | | mst.N_B_STATE = 2; |
| | | WMSHelper.UpdateTaskState(mst); |
| | | } |
| | | |
| | | if (mst.S_TYPE == "呼叫空托出库") |
| | | { |
| | | LocationHelper.UnBindingLoc(mst.S_END_LOC, new List<string>() { mst.S_CNTR_CODE }); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | public class OffLineModel |
| | | { |
| | | public string loc { get; set; } // 下线位 |
| | | public string rfid { get; set; } // 托盘号 |
| | | public string deviceNo { get; set; } // 机台号 |
| | | public int isUrgent { get; set; } // N_IS_URGENT 是否加急(0.否 1.是) |
| | |
| | | var result = new SimpleResult(); |
| | | var task = WCSHelper.GetTask(model.TaskNo); |
| | | if (task != null) { |
| | | if (task.N_B_STATE == 0) { |
| | | |
| | | if (task.N_B_STATE == 0) |
| | | { |
| | | //等待直接修改状态为取消 |
| | | WCSHelper.UpdateStatus(model.TaskNo, "取消"); |
| | | LocationHelper.UnLockLoc(task.S_START_LOC); |
| | |
| | | /*LocationHelper.UnBindingLoc(task.S_START_LOC, new List<string> { task.S_CNTR_CODE });*/ |
| | | result.resultMsg = "任务等待,直接取消"; |
| | | } |
| | | else if (task.N_B_STATE < 3) { |
| | | //已推送但是没有完成或者取消,通知hosttoagv |
| | | NDCHelper.Cancel(task.S_CODE); |
| | | result.resultMsg = "任务取消已经发送给小车"; |
| | | else if (task.N_B_STATE < 3) |
| | | { |
| | | if (task.S_SCHEDULE_TYPE == "AGV") |
| | | { |
| | | //已推送但是没有完成或者取消,通知hosttoagv |
| | | NDCHelper.Cancel(task.S_CODE); |
| | | result.resultMsg = "任务取消已经发送给小车"; |
| | | } |
| | | else if (task.S_SCHEDULE_TYPE == "WCS") |
| | | { |
| | | |
| | | } |
| | | |
| | | } |
| | | else { |
| | | else |
| | | { |
| | | result.resultCode = 1; |
| | | result.resultMsg = "任务已结束"; |
| | | } |
| | | |
| | | |
| | | } |
| | | else { |
| | | result.resultCode = 1; |
| | |
| | | catch (Exception ex) |
| | | { |
| | | LogHelper.Info($"WMS内部错误,错误原因:{ex.Message}", "WMS"); |
| | | LogHelper.Info(ex.StackTrace, "WMS"); |
| | | responseResult.code = 500; |
| | | responseResult.msg = $"WMS内部错误,请联系开发人员处理"; |
| | | } |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 3.硫化机呼叫胚胎出库 |
| | | /// 3.申请终点 |
| | | /// 场景:1.堆垛机放货异常申请新终点; 2.堆垛机入库输送线堵塞申请新终点 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public ResponseResult applyDest(ApplyDestModel model) |
| | | { |
| | | LogHelper.Info("【3.申请终点】applyDest 入参:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | ResponseResult responseResult = new ResponseResult(); |
| | | responseResult = ApiHelper.applyDest(model); |
| | | LogHelper.Info("【3.申请终点】applyDest 出参:" + JsonConvert.SerializeObject(responseResult), "WMS"); |
| | | return responseResult; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 4.硫化机呼叫胚胎出库 |
| | | /// 逻辑: |
| | | /// 1.根据机台号查询【硫化机工单表】、【胚胎已完成的条码中间表】筛选当前班次的生产计划数量是否满足,当预计生产数量 = 实际数+在途数量 ,则停止叫料 |
| | | /// 2.查询机台号在【硫化机工单表】对应的物料编码, |
| | |
| | | /// <returns></returns> |
| | | public ResponseResult callItemOutStock(CallItemModel model ) |
| | | { |
| | | LogHelper.Info("【3.硫化机呼叫胚胎出库】callItemOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | LogHelper.Info("【4.硫化机呼叫胚胎出库】callItemOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | ResponseResult responseResult = new ResponseResult(); |
| | | responseResult = ApiHelper.callItemOutStock(model); |
| | | LogHelper.Info("【3.硫化机呼叫胚胎出库】callItemOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS"); |
| | | LogHelper.Info("【4.硫化机呼叫胚胎出库】callItemOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS"); |
| | | return responseResult; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 4.空托回立库 |
| | | /// 5.空托回立库 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public ResponseResult emptyTrayInStock(EmptyTrayInStockModel model ) |
| | | { |
| | | LogHelper.Info("【4.空托回立库】emptyTrayInStock 入参:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | LogHelper.Info("【5.空托回立库】emptyTrayInStock 入参:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | ResponseResult responseResult = new ResponseResult(); |
| | | responseResult = ApiHelper.emptyTrayInStock(model); |
| | | LogHelper.Info("【4.空托回立库】emptyTrayInStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS"); |
| | | LogHelper.Info("【5.空托回立库】emptyTrayInStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS"); |
| | | return responseResult; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 5.成型机呼叫空托 |
| | | /// 6.成型机呼叫空托 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public ResponseResult callEmptyTrayOutStock(CallEmptyTrayOutStockModel model) |
| | | { |
| | | LogHelper.Info("【5.成型机呼叫空托】callEmptyTrayOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | LogHelper.Info("【6.成型机呼叫空托】callEmptyTrayOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | ResponseResult responseResult = new ResponseResult(); |
| | | responseResult = ApiHelper.callEmptyTrayOutStock(model); |
| | | LogHelper.Info("【5.成型机呼叫空托】callEmptyTrayOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS"); |
| | | LogHelper.Info("【6.成型机呼叫空托】callEmptyTrayOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS"); |
| | | return responseResult; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 6.胎胚立库抽检出库、人工出库胎胚 |
| | | /// 7.胎胚立库抽检出库、人工出库胎胚 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public ResponseResult embryoCheckOutStock(EmbryoCheckOutStockModel model) |
| | | { |
| | | LogHelper.Info("【6.胎胚立库抽检出库】embryoCheckOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | LogHelper.Info("【7.胎胚立库抽检出库】embryoCheckOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | ResponseResult responseResult = new ResponseResult(); |
| | | responseResult = ApiHelper.embryoCheckOutStock(model); |
| | | LogHelper.Info("【 6.胎胚立库抽检出库】embryoCheckOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS"); |
| | | LogHelper.Info("【 7.胎胚立库抽检出库】embryoCheckOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS"); |
| | | return responseResult; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 7.异常回库流程 |
| | | /// 8.异常回库流程 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public ResponseResult anomalyTrayInStock(AnomalyTrayInStockModel model) |
| | | { |
| | | LogHelper.Info("【7.异常回库流程】embryoCheckOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | LogHelper.Info("【8.异常回库流程】embryoCheckOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | ResponseResult responseResult = new ResponseResult(); |
| | | responseResult = ApiHelper.anomalyTrayInStock(model); |
| | | LogHelper.Info("【7.异常回库流程】embryoCheckOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS"); |
| | | LogHelper.Info("【8.异常回库流程】embryoCheckOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS"); |
| | | return responseResult; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 8.WCS 任务状态反馈 |
| | | /// 9.WCS 任务状态反馈 |
| | | /// 业务场景:WCS在执行任务时,回报任务状态 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | |
| | | /*[Route("notifyTaskStatus")]*/ |
| | | public ReturnResult notifyTaskStatus(TaskStatusFeedbackModel model) |
| | | { |
| | | LogHelper.Info("【8.WCS任务状态反馈】Request:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | LogHelper.Info("【9.WCS任务状态反馈】Request:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | var result = ApiHelper.taskStatusFeedback(model); |
| | | LogHelper.Info("【8.WCS任务状态反馈】response:" + JsonConvert.SerializeObject(result), "WMS"); |
| | | LogHelper.Info("【9.WCS任务状态反馈】response:" + JsonConvert.SerializeObject(result), "WMS"); |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 9.空托盘解绑 |
| | | /// 10.空托盘解绑 |
| | | /// 业务场景:空托盘回主线 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | |
| | | [HttpPost] |
| | | public ReturnResult emptyTrayUnBind(EmptyTrayUnBindModel model) |
| | | { |
| | | LogHelper.Info("【9.空托盘解绑】Request:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | LogHelper.Info("【10.空托盘解绑】Request:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | var result = ApiHelper.emptyTrayUnBind(model); |
| | | LogHelper.Info("【9.空托盘解绑】response:" + JsonConvert.SerializeObject(result), "WMS"); |
| | | LogHelper.Info("【10.空托盘解绑】response:" + JsonConvert.SerializeObject(result), "WMS"); |
| | | return result; |
| | | } |
| | | |
| | |
| | | public string trayCode { get; set; } // 容器编码 |
| | | } |
| | | |
| | | public class ApplyDestModel |
| | | { |
| | | public string reqId { get; set; } |
| | | public string reqTime { get; set; } |
| | | public string taskNo { get; set; } // 任务号 |
| | | public int applyType { get; set; } //申请类型 1.堆垛机放货异常申请新终点; 2.堆垛机入库输送线堵塞申请新终点 |
| | | public string loc { get; set; } |
| | | } |
| | | |
| | | public class CallItemModel |
| | | { |
| | | public string reqId { get; set; } |
| | |
| | | { |
| | | "HostToAgvServerUrl": "http://192.168.1.146:9988/HostToAGV.cgi", |
| | | "HASeverUrl": "http://172.16.10.41", |
| | | "SqlServer": "Data Source=192.168.1.188;Initial Catalog=OIMobox;User ID=sa;Password=Am123123", |
| | | "SqlServer": "server=192.168.1.204;uid=root;pwd=yn123456;database=oimobox", |
| | | "SqlServer1": "Data Source=192.168.1.198\\sql2008;Initial Catalog=OIMobox;User ID=sa;Password=sa@2015", |
| | | "ApiPort": 8901, |
| | | "FacCode": "1122", |
| | | "WHCode": "TSCK", |
| | | "StockArea": "area2", |
| | | "AbnormalArea": "area1", // 异常区 |
| | | "StockArea": "SSA", |
| | | |
| | | // 接驳位 type 1.排出口 |
| | | // 接驳位 type 1.立库前排出口 2.满料上线位 3.空托上线位 4.硫化机前排除口 |
| | | "ConnectLoc": [ |
| | | { |
| | | "locCode": "loc1", |
| | | "roadway": 1, |
| | | "locCode": "OA1-1-1-1", |
| | | "roadway": 1 |
| | | }, |
| | | { |
| | | "locCode": "OA1-1-2-1", |
| | | "roadway": 2 |
| | | }, |
| | | { |
| | | "locCode": "OA1-1-3-1", |
| | | "roadway": 3 |
| | | }, |
| | | { |
| | | "locCode": "OA1-1-4-1", |
| | | "roadway": 4 |
| | | }, |
| | | { |
| | | "locCode": "OA1-1-5-1", |
| | | "roadway": 5 |
| | | }, |
| | | { |
| | | "locCode": "OA1-1-6-1", |
| | | "roadway": 6 |
| | | }, |
| | | { |
| | | "locCode": "OA1-1-7-1", |
| | | "roadway": 7 |
| | | }, |
| | | { |
| | | "locCode": "OA1-1-8-1", |
| | | "roadway": 8 |
| | | } |
| | | ], |
| | | |
| | | // 上(输送)线货位 type 1.满料上线位 2.空托上线位 |
| | | "OnLineLoc": [ |
| | | { |
| | | "locCode": "UCL1-1-1-1", |
| | | "type": 1 |
| | | }, |
| | | { |
| | | "locCode": "loc1", |
| | | "roadway": 2, |
| | | "locCode": "UCL1-1-2-1", |
| | | "type": 1 |
| | | }, |
| | | { |
| | | "locCode": "UCL1-1-3-1", |
| | | "type": 2 |
| | | } |
| | | ], |
| | | |
| | | // 叫料异常排除位 |
| | | "CallOutLoc": [ |
| | | { |
| | | "locCode": "OA1-2-1-1", |
| | | "row": 1 |
| | | }, |
| | | { |
| | | "locCode": "OA1-2-2-1", |
| | | "row": 2 |
| | | }, |
| | | { |
| | | "locCode": "OA1-2-3-1", |
| | | "row": 3 |
| | | }, |
| | | { |
| | | "locCode": "OA1-2-4-1", |
| | | "roadway": 4 |
| | | } |
| | | ] |
| | | } |
| | |
| | | //安全请求等 |
| | | TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData); |
| | | } |
| | | |
| | | if (model.State == 2) |
| | | { |
| | | var mst = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE); |
| | | if (mst.S_END_LOC == TN_Task.S_END_LOC) |
| | | { |
| | | mst.N_B_STATE = 2; |
| | | WMSHelper.UpdateTaskState(mst); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | S_START_LOC = a.S_START_LOC, |
| | | S_END_LOC = a.S_END_LOC, |
| | | S_SCHEDULE_TYPE = "杭奥", |
| | | N_CNTR_COUNT = 1, |
| | | S_CNTR_CODE = a.S_CNTR_CODE, |
| | | |
| | | }; |
| | |
| | | S_START_LOC = a.S_START_LOC, |
| | | S_END_LOC = a.S_END_LOC, |
| | | S_SCHEDULE_TYPE = "杭奥", |
| | | N_CNTR_COUNT = 1, |
| | | |
| | | S_CNTR_CODE = a.S_CNTR_CODE, |
| | | |
| | | }; |
| | |
| | | public string S_CODE { get; set; } |
| | | public string S_TYPE { get; set; } |
| | | public string S_SPEC { get; set; } |
| | | public float F_WEIGHT { get; set; } |
| | | public float F_LOAD_WEIGHT { get; set; } |
| | | public float F_MAX_WEIGHT { get; set; } |
| | | public int N_LENGTH { get; set; } |
| | | public int N_WIDTH { get; set; } |
| | | public int N_HEIGHT { get; set; } |
| | | public string C_IS_VIRTUAL { get; set; } = "N"; |
| | | public int N_TYPE { get; set; } |
| | | public string C_ENABLE { get; set; } = "Y"; |
| | | public string S_STATE_PRE { get; set; } |
| | | public int N_REVIEW_RESULT { get; set; } |
| | | |
| | | public int N_DETAIL_COUNT { get; set; } |
| | | public int N_B_STATE { get; set; } |
| | | public string S_LOCK_OP_CODE { get; set; } |
| | | public string S_LOCK_STATE { get; set; } |
| | | public int N_LOCK_STATE { get; set; } |
| | | /// <summary> |
| | | /// 码盘时候标记 |
| | | /// </summary> |
| | | public string S_SRC { get; internal set; } |
| | | public string S_DEST { get; internal set; } |
| | | |
| | | |
| | | |
| | | [SugarColumn(IsIgnore = true)] |
| | |
| | | public int QTY { get; set; } // 数量 |
| | | public string TXNDATE { get; set; } // 生产时间 |
| | | public string DATE_SHIFT { get; set; } // 转班日期 |
| | | |
| | | [SugarColumn(IsIgnore = true)] |
| | | public string S_EFFECTIVE_TIME { get; set; } // 生效时间 |
| | | [SugarColumn(IsIgnore = true)] |
| | | public string S_EXPIRATION_TIME { get; set; } // 失效时间 |
| | | [SugarColumn(IsIgnore = true)] |
| | | public int N_URGENT_FLAG { get; set; } = 0; // 加急标识 |
| | | } |
| | | } |
| | |
| | | { |
| | | public string S_RFID { get; set; } // 托盘号 |
| | | public string S_LOC { get; set; } // 下线货位 |
| | | public string S_DEVICE_NO { get; set; } // 下线货位 |
| | | public string S_ITEM_STATUS { get; set; } = "OK"; // 下线货位 |
| | | public string S_DEVICE_NO { get; set; } // 设备号 |
| | | public int N_IS_URGENT { get; set; } // N_IS_URGENT 是否加急(0.否 1.是) |
| | | public string T_OFF_TIME { get; set; } // 下线时间 |
| | | public int N_IS_FULL { get; set; } // 是否满拖 0.否 1.是 |
| | |
| | | [SugarTable("TN_standard_overage")] |
| | | internal class Overage : BaseModel |
| | | { |
| | | public string MCNGRP { get; set; } //生产流程组 |
| | | public string MCNGRP { get; set; } //生产流程组 0.硫化机 1.半制品 |
| | | public string ITEMPATT { get; set; } // 物料前缀 |
| | | public int OVERAGE { get; set; } // 最大保存时间 |
| | | public float MINHOUR { get; set; } // 多久后生效 |
| | |
| | | public string S_OP_NAME { get; set; } |
| | | public string S_WORKSHOP_NO { get; set; } |
| | | public string S_WORKSHOP_NAME { get; set; } |
| | | // 起点层数 |
| | | public int N_START_LAYER { get; internal set; } |
| | | // 终点层数 |
| | | public int N_END_LAYER { get; internal set; } |
| | | // 容器数量 |
| | | public int N_CNTR_COUNT { get; internal set; } |
| | | |
| | | |
| | | internal static string GetStateStr(int state) { |
| | | //0等待 1已推送 2执行 3完成 4错误 |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <packages> |
| | | <package id="EasyModbusTCP" version="5.6.0" targetFramework="net461" /> |
| | | <package id="Google.Protobuf" version="3.19.4" targetFramework="net461" /> |
| | | <package id="K4os.Compression.LZ4" version="1.2.6" targetFramework="net461" /> |
| | | <package id="K4os.Compression.LZ4.Streams" version="1.2.6" targetFramework="net461" /> |
| | | <package id="K4os.Hash.xxHash" version="1.0.6" targetFramework="net461" /> |
| | | <package id="Microsoft.AspNet.WebApi.Client" version="5.2.9" targetFramework="net461" /> |
| | | <package id="Microsoft.AspNet.WebApi.Core" version="5.2.9" targetFramework="net461" /> |
| | | <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.9" targetFramework="net461" /> |
| | |
| | | <package id="Microsoft.Owin.Host.HttpListener" version="4.2.2" targetFramework="net461" /> |
| | | <package id="Microsoft.Owin.Hosting" version="4.2.2" targetFramework="net461" /> |
| | | <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net461" /> |
| | | <package id="MySql.Data" version="8.0.30" targetFramework="net461" /> |
| | | <package id="Newtonsoft.Json" version="13.0.2" targetFramework="net461" /> |
| | | <package id="NLog" version="5.1.1" targetFramework="net452" requireReinstallation="true" /> |
| | | <package id="NModbus" version="3.0.81" targetFramework="net461" /> |
| | | <package id="NModbus4" version="2.1.0" targetFramework="net461" /> |
| | | <package id="Owin" version="1.0" targetFramework="net461" /> |
| | | <package id="Portable.BouncyCastle" version="1.9.0" targetFramework="net461" /> |
| | | <package id="S7netplus" version="0.20.0" targetFramework="net461" /> |
| | | <package id="SqlSugar" version="5.1.3.47" targetFramework="net461" /> |
| | | <package id="Swashbuckle" version="5.6.0" targetFramework="net461" /> |
| | |
| | | /// <param name="mst"></param> |
| | | /// <param name="v"></param> |
| | | internal static void CacheBitUpdate(WCSTask mst, bool load) { |
| | | var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1; |
| | | if (load) { |
| | | Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); |
| | | LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); |
| | |
| | | var endLoc = LocationHelper.GetLocation(mst.S_END_LOC); |
| | | |
| | | if (mst.S_SCHEDULE_TYPE == "NDC") { |
| | | Console.WriteLine($"SendTask {mst.S_CODE}"); |
| | | var dic = new Dictionary<string, string>(); |
| | | dic.Add("No", mst.S_CODE); |
| | | dic.Add("Pri", mst.N_PRIORITY.ToString()); |
| | | dic.Add("From", startLoc.S_AGV_SITE); |
| | | dic.Add("To", endLoc.S_AGV_SITE); |
| | | if (mst.S_TYPE == "移库") |
| | | { |
| | | dic.Add("FUNC", "32"); |
| | | } |
| | | else |
| | | { |
| | | dic.Add("FUNC", "0"); |
| | | } |
| | | |
| | | var data = mst.N_END_LAYER + 16 * mst.N_START_LAYER; |
| | | // 参数4 |
| | | dic.Add("DATA", data.ToString()); |
| | | //物料信息中获取 |
| | | //先获取托盘信息 |
| | | var itemInfo = LocationHelper.GetCntrItem(mst.S_CNTR_CODE); |
| | | if (itemInfo != null) { |
| | | // 参数5 |
| | | dic.Add("ItemHeight", itemInfo.N_TS_HEIGHT); |
| | | //参数6 默认值 |
| | | string[] parts = itemInfo.Item_Spec.Split('*'); |
| | | if (parts.Length > 1) |
| | | { |
| | | if (parts[1].Equals("1200")) |
| | | { |
| | | dic.Add("TrayType", "1"); |
| | | } |
| | | else if (parts[1].Equals("1210")) |
| | | { |
| | | dic.Add("TrayType", "2"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | //获取参数7和8 |
| | | dic.Add("FromCol", "0"); |
| | | dic.Add("ToCol", "0"); |
| | | |
| | | //改起点 |
| | | var flb1 = GetFreeLineBit(startLoc.S_AREA_CODE, startLoc.N_ROW, startLoc.N_COL); |
| | | if (flb1 != null) { |
| | | dic["FromCol"] = (startLoc.N_COL - flb1.minCol).ToString(); |
| | | if (mst.N_START_LAYER == 1) { |
| | | dic["From"] = flb1.bit1.ToString(); |
| | | } |
| | | else { |
| | | dic["From"] = flb1.bit2.ToString(); |
| | | } |
| | | } |
| | | //改终点 |
| | | var flb = GetFreeLineBit(endLoc.S_AREA_CODE, endLoc.N_ROW, endLoc.N_COL); |
| | | if (flb != null) { |
| | | dic["ToCol"] = (endLoc.N_COL - flb.minCol).ToString(); |
| | | if (mst.N_END_LAYER == 1) { |
| | | dic["To"] = flb.bit1.ToString(); |
| | | } |
| | | else { |
| | | dic["To"] = flb.bit2.ToString(); |
| | | } |
| | | } |
| | | |
| | | var res = NDC.AddNewOrderNew(5, mst.N_PRIORITY, mst.S_CODE, dic); |
| | | if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009)) { |
| | | //推送成功,修改任务优先级 |
| | | mst.N_B_STATE = 1; |
| | | WCSHelper.UpdateStatus(mst); |
| | | result = true; |
| | | } |
| | | |
| | | } |
| | | else if (mst.S_SCHEDULE_TYPE == "杭奥") { |
| | | //调第三方接口 |
| | |
| | | { |
| | | public static string HostToAgvServerUrl { get; set; } |
| | | public static string HASeverUrl { get; set; } |
| | | public static string SqlServer { get; set; } |
| | | public static string SqlServer { get; set; } |
| | | public static string SqlServer1 { get; set; } |
| | | public static List<ConnectLoc> connectLocList { get; set; } |
| | | public static List<OnLineLoc> onLineLocList { get; set; } |
| | | public static List<CallOutLoc> callOutLocList { get; set; } |
| | | public static int port { get; set; } |
| | | public static string WHCode { get; set; } |
| | | public static string FacCode { get; set; } |
| | | public static string abnormalArea { get; set; } |
| | | public static string stockArea { get; set; } |
| | | |
| | | |
| | |
| | | if (keyValue.Name == "ConnectLoc") { |
| | | connectLocList = JsonConvert.DeserializeObject<List<ConnectLoc>>(keyValue.Value.ToString()); |
| | | } |
| | | if (keyValue.Name == "AbnormalArea") |
| | | if (keyValue.Name == "OnLineLoc") |
| | | { |
| | | abnormalArea = keyValue.Value.ToString(); |
| | | onLineLocList = JsonConvert.DeserializeObject<List<OnLineLoc>>(keyValue.Value.ToString()); |
| | | } |
| | | if (keyValue.Name == "CallOutLoc") |
| | | { |
| | | callOutLocList = JsonConvert.DeserializeObject<List<CallOutLoc>>(keyValue.Value.ToString()); |
| | | } |
| | | if (keyValue.Name == "StockArea") |
| | | { |
| | |
| | | { |
| | | public string locCode { get; set; } |
| | | public int roadway { get; set; } |
| | | } |
| | | |
| | | public class OnLineLoc |
| | | { |
| | | public string locCode { get; set; } |
| | | public int type { get; set; } |
| | | } |
| | | |
| | | |
| | | public class CallOutLoc |
| | | { |
| | | public string locCode { get; set; } |
| | | public int row { get; set; } |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | { |
| | | ConnectionString = string.IsNullOrEmpty(url) ? Settings.SqlServer : url, |
| | | //ConnectionString = @"Data Source=192.168.1.198\sql2008;Initial Catalog=OIMobox;User ID=sa;Password=sa@2015", |
| | | DbType = DbType.SqlServer, |
| | | DbType = DbType.MySql, |
| | | IsAutoCloseConnection = true, |
| | | InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息 |
| | | }); |
| | |
| | | using HH.WCS.Mobox3.YNJT_PT.models.other; |
| | | using HH.WCS.Mobox3.YNJT_PT.models; |
| | | using HH.WCS.Mobox3.YNJT_PT.models.other; |
| | | using HH.WCS.Mobox3.YNJT_PT.util; |
| | | using System; |
| | | using System.Collections.Generic; |
| | |
| | | var date = DateTime.Now.ToString("yyMMdd"); |
| | | return $"TP{date}{id.ToString().PadLeft(4, '0')}"; |
| | | } |
| | | /// <summary> |
| | | /// 根据容器类型、目的地、状态查询容器 |
| | | /// </summary> |
| | | /// <param name="dest"></param> |
| | | /// <param name="cntrType"></param> |
| | | /// <param name="state"></param> |
| | | /// <returns></returns> |
| | | internal static List<Container> GetCntrListByPurpose(string dest, string cntrType, int state) { |
| | | //1.0 查货位容器表 |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var list = db.Queryable<Container>().Where(a => a.S_DEST == dest && a.S_TYPE == cntrType && a.N_B_STATE == state).ToList(); |
| | | return list; |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// TN_ContainerHelper.test("4L天然水箱装6入", 50, "335ml东方树叶15入", 30); |
| | | /// </summary> |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 根据容器来源和状态获取托盘 |
| | | /// 添加容器物料信息 |
| | | /// </summary> |
| | | /// <param name="src"></param> |
| | | /// <param name="state"></param> |
| | | /// <returns></returns> |
| | | internal static List<Container> GetCntr(string dest, int state, string cntrType = "") { |
| | | public static bool addCntrItemRel( string cntrCode,GreenTireInformation info) |
| | | { |
| | | bool res = false; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | if (cntrType == "") { |
| | | return db.Queryable<Container>().Where(a => a.S_DEST == dest && a.N_B_STATE == state).ToList(); |
| | | } |
| | | else { |
| | | return db.Queryable<Container>().Where(a => a.S_DEST == dest && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList(); |
| | | } |
| | | } |
| | | internal static bool UpdateCntr(List<string> cntrs, string dest, int state) { |
| | | var res = false; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList(); |
| | | if (models.Count > 0) { |
| | | models.ForEach(a => { |
| | | a.S_DEST = dest; a.N_B_STATE = state; |
| | | db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.N_B_STATE }).ExecuteCommand(); |
| | | }); |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | internal static bool UpdateCntrDest(List<string> cntrs, string dest) { |
| | | var res = false; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList(); |
| | | if (models.Count > 0) { |
| | | models.ForEach(a => { |
| | | a.S_DEST = dest; |
| | | db.Updateable(a).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand(); |
| | | }); |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | /// <summary> |
| | | /// 更新托盘来源 |
| | | /// </summary> |
| | | /// <param name="cntr"></param> |
| | | /// <param name="src"></param> |
| | | /// <returns></returns> |
| | | internal static bool UpdateCntrSrc(string cntr, string src) { |
| | | var res = false; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var model = db.Queryable<Container>().Where(a => a.S_CODE == cntr).First(); |
| | | if (model != null) { |
| | | model.S_SRC = src; |
| | | model.T_MODIFY = DateTime.Now; |
| | | res = db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.T_MODIFY }).ExecuteCommand() > 0; |
| | | } |
| | | return res; |
| | | } |
| | | internal static bool UpdateCntrState(List<string> cntrs, int state) { |
| | | var res = false; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList(); |
| | | if (models.Count > 0) { |
| | | models.ForEach(a => { |
| | | a.N_B_STATE = state; |
| | | db.Updateable(a).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand(); |
| | | }); |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | var container = ContainerHelper.GetCntr(cntrCode); |
| | | if (container != null) |
| | | { |
| | | try |
| | | { |
| | | db.BeginTran(); |
| | | db.Deleteable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntrCode).ExecuteCommand(); |
| | | |
| | | internal static bool UpdateCntr(List<string> cntrs, string src, string dest, int state) { |
| | | var res = false; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList(); |
| | | if (models.Count > 0) { |
| | | models.ForEach(a => { |
| | | a.S_DEST = dest; a.N_B_STATE = state; a.S_SRC = src; |
| | | db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.N_B_STATE, it.S_SRC }).ExecuteCommand(); |
| | | }); |
| | | res = true; |
| | | CntrItemRel cntrItemRel = new CntrItemRel() |
| | | { |
| | | S_CG_ID = info.BARCODE, |
| | | S_CNTR_CODE = cntrCode, |
| | | S_ITEM_CODE = info.ITEMCODE, |
| | | S_CELL_NO = info.TIRECODE, |
| | | F_QTY = info.QTY, |
| | | S_MCN = info.MCN, |
| | | S_OPR = info.OPR, |
| | | S_OPR02 = info.OPR02, |
| | | S_OPR03 = info.OPR03, |
| | | S_OPR04 = info.OPR04, |
| | | S_WINDUP = info.WINDUP, |
| | | S_TXNDATE = info.TXNDATE, |
| | | S_DATE_SHIFT = info.DATE_SHIFT, |
| | | S_EFFECTIVE_TIME = info.S_EFFECTIVE_TIME, |
| | | S_EXPIRATION_TIME = info.S_EXPIRATION_TIME, |
| | | N_URGENT_FLAG = info.N_URGENT_FLAG, |
| | | }; |
| | | |
| | | db.Insertable(cntrItemRel).ExecuteCommand(); |
| | | container.N_DETAIL_COUNT = 1; |
| | | db.Updateable(container).ExecuteCommand(); |
| | | db.CommitTran(); |
| | | res = true; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | db.RollbackTran(); |
| | | } |
| | | } |
| | | return res; |
| | | } |
| | | public static bool ClearCntrInfo(string cntr) { |
| | | |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var model = db.Queryable<Container>().Where(a => a.S_CODE == cntr).First(); |
| | | if (model != null) { |
| | | model.S_SRC = ""; |
| | | model.S_DEST = ""; |
| | | model.N_B_STATE = 0; |
| | | model.T_MODIFY = DateTime.Now; |
| | | |
| | | } |
| | | db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.S_DEST, it.N_B_STATE, it.T_MODIFY }).ExecuteCommand(); |
| | | return db.Deleteable<CntrItemRel>().Where(a => a.S_CNTR_CODE.Trim() == cntr.Trim()).ExecuteCommand() > 0; |
| | | } |
| | | internal static List<Container> GetCntrBySrc(string src, int state, string cntrType = "") { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | if (cntrType == "") { |
| | | return db.Queryable<Container>().Where(a => a.S_SRC == src && a.N_B_STATE == state).ToList(); |
| | | } |
| | | else { |
| | | return db.Queryable<Container>().Where(a => a.S_SRC == src && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList(); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | |
| | | return result; |
| | | } |
| | | |
| | | [SugarTable("dbo.OI_SYS_MAXID")] |
| | | [SugarTable("OI_SYS_MAXID")] |
| | | public class OI_SYS_MAXID |
| | | { |
| | | public string CN_S_TYPE { get; set; } |
| | |
| | | N_SCHEDULE_TYPE=1, |
| | | S_B_STATE = "等待", |
| | | S_CNTR_CODE = cntrInfo, |
| | | N_START_LAYER = startLayer, |
| | | N_END_LAYER = endLayer, |
| | | N_CNTR_COUNT = cntrCount |
| | | |
| | | }; |
| | | |
| | |
| | | /// </summary> |
| | | /// <param name="locNum"></param> |
| | | /// <param name="itemCode"></param> |
| | | /// <param name="roadway"></param> |
| | | /// <param name="excludeRoadway"></param> |
| | | /// <returns></returns> |
| | | public static EndLocGroup getInStockEndLoc(int locNum, string itemCode) |
| | | public static EndLocGroup getInStockEndLoc(int locNum, string itemCode , int roadway = 0 ,int excludeRoadway = 0) |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | EndLocGroup endLocGroup = new EndLocGroup { endLocList = new List<Location>() }; |
| | | |
| | | // 1. 获取候选巷道列表(物料均衡或巷道均衡) |
| | | var candidateRoadways = GetCandidateRoadways(db, itemCode); |
| | | if (candidateRoadways.Count == 0) return endLocGroup; |
| | | List<int> candidateRoadways = new List<int>(); |
| | | if (roadway == 0) |
| | | { |
| | | candidateRoadways = GetCandidateRoadways(db, itemCode); |
| | | if (candidateRoadways.Count == 0) return endLocGroup; |
| | | |
| | | if (excludeRoadway != 0) |
| | | { |
| | | candidateRoadways.Remove(excludeRoadway); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | candidateRoadways.Add(roadway); |
| | | } |
| | | |
| | | |
| | | // 2. 处理单货位入库 |
| | | if (locNum == 1) |
| | |
| | | /// </summary> |
| | | private static List<int> GetCandidateRoadways(SqlSugarClient db, string itemCode) |
| | | { |
| | | var list = new List<int>(); |
| | | // 策略1:巷道内同规格物料 < 10 的巷道(按数量升序) |
| | | var materialRoadways = db.Queryable<Location>() |
| | | .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE) |
| | | .LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE) |
| | | .Where((a, b, c) => |
| | | a.S_AREA_CODE == Settings.stockArea && |
| | | a.N_CURRENT_NUM == 1 && |
| | | a.N_LOCK_STATE == 0 && |
| | | a.C_ENABLE == "Y" && |
| | | b.S_CNTR_CODE != null && |
| | | c.S_ITEM_CODE == itemCode) |
| | | .GroupBy(a => a.N_ROADWAY) |
| | | .Having(a => SqlFunc.AggregateCount(a.S_CODE) < 10) |
| | | .Select(a => new { Roadway = a.N_ROADWAY, Count = SqlFunc.AggregateCount(a.S_CODE) }) |
| | | .OrderBy(a => a.Count) |
| | | .Select(a => a.Roadway) |
| | | .ToList(); |
| | | var materialRoadwayGroup = db.Queryable<Location>() |
| | | // 表别名:a = Location, b = LocCntrRel, c = CntrItemRel |
| | | .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE) |
| | | .LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE) |
| | | |
| | | if (materialRoadways.Count > 0) return materialRoadways; |
| | | // 基础筛选条件(所有位置) |
| | | .Where((a, b, c) => |
| | | a.S_AREA_CODE == Settings.stockArea && // 指定区域 |
| | | a.N_LOCK_STATE == 0 && // 未锁定 |
| | | a.C_ENABLE == "Y") // 启用状态 |
| | | |
| | | // 策略2:所有巷道按空货位数降序排序 |
| | | return db.Queryable<Location>() |
| | | .Where(a => |
| | | a.S_AREA_CODE == Settings.stockArea && |
| | | a.N_CURRENT_NUM == 0 && |
| | | a.N_LOCK_STATE == 0 && |
| | | a.C_ENABLE == "Y") |
| | | .GroupBy(a => a.N_ROADWAY) |
| | | .Select(a => new { Roadway = a.N_ROADWAY, Count = SqlFunc.AggregateCount(a.S_CODE) }) |
| | | .OrderByDescending(a => a.Count) |
| | | .Select(a => a.Roadway) |
| | | .ToList(); |
| | | // 按巷道分组(使用原始表字段) |
| | | .GroupBy((a, b, c) => a.N_ROADWAY) |
| | | |
| | | // 选择分组结果(包含聚合计算) |
| | | .Select((a, b, c) => new |
| | | { |
| | | Roadway = a.N_ROADWAY, // 巷道编号 |
| | | |
| | | // 统计满足特定条件的数量: |
| | | // 1. 当前数量=1 (a.N_CURRENT_NUM == 1) |
| | | // 2. 物料匹配 (c.S_ITEM_CODE == itemCode) |
| | | // 3. 容器关联存在 (b.S_CNTR_CODE != null) |
| | | validCount = SqlFunc.AggregateSum(SqlFunc.IIF( |
| | | a.N_CURRENT_NUM == 1 && |
| | | c.S_ITEM_CODE == itemCode && |
| | | b.S_CNTR_CODE != null, |
| | | 1, 0)) |
| | | }) |
| | | .ToList(); |
| | | |
| | | |
| | | |
| | | if (materialRoadwayGroup.Count > 0) |
| | | { |
| | | list = materialRoadwayGroup.Where(a => a.validCount < 10).OrderBy(a => a.validCount).Select(a => a.Roadway).ToList(); |
| | | } |
| | | |
| | | if (list.Count == 0) |
| | | { |
| | | // 策略2:所有巷道按空货位数降序排序 |
| | | materialRoadwayGroup = db.Queryable<Location>() |
| | | .Where(a => |
| | | a.S_AREA_CODE == Settings.stockArea && |
| | | a.N_CURRENT_NUM == 0 && |
| | | a.N_LOCK_STATE == 0 && |
| | | a.C_ENABLE == "Y") |
| | | .GroupBy(a => a.N_ROADWAY) |
| | | .Select(a => new { Roadway = a.N_ROADWAY, validCount = SqlFunc.AggregateCount(a.S_CODE) }) |
| | | .ToList(); |
| | | |
| | | list = materialRoadwayGroup.OrderByDescending(a => a.validCount).Select(a => a.Roadway).ToList(); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | // 按层->列排序,便于查找相邻 |
| | | var sorted = locations |
| | | .OrderBy(l => l.N_LAYER) |
| | | .ThenBy(l => l.N_ROW) |
| | | .ThenBy(l => l.N_COL) |
| | | .ToList(); |
| | | |
| | |
| | | { |
| | | // 查询巷道是否正常,异常跳过 |
| | | var stackerStates = WCSDispatch.getStackerState(loc.N_ROADWAY); |
| | | if (stackerStates.Count == 0 || stackerStates[0].roadway_state == "0" || stackerStates[0].roadway_state == "3") |
| | | if ( false /*stackerStates.Count == 0 || stackerStates[0].roadway_state == "0" || stackerStates[0].roadway_state == "3"*/) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | startLoc = loc; |
| | | break; |
| | | } |
| | | } |
| | | return startLoc; |
| | |
| | | /// 查询巷道任务最少的接驳位 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public static Location getMinTaskMiddleLoc(int type) |
| | | public static Location getMinTaskMiddleLoc(int type , int roadway = 0 , int excludeRoadway = 0) |
| | | { |
| | | Location location = new Location(); |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | |
| | | var roadwayGroup = db.Queryable<Location>() |
| | | var query = db.Queryable<Location>() |
| | | .LeftJoin<WCSTask>((a, b) => a.S_CODE == b.S_END_LOC && b.N_B_STATE < 3) |
| | | .Where((a, b) => a.S_AREA_CODE == Settings.stockArea) |
| | | .GroupBy((a, b) => a.N_ROADWAY) |
| | | .Where((a, b) => a.S_AREA_CODE == Settings.stockArea); |
| | | |
| | | if (roadway != 0) |
| | | { |
| | | query = query.Where((a, b) => a.N_ROADWAY == roadway); |
| | | } |
| | | if (excludeRoadway != 0) |
| | | { |
| | | query = query.Where((a, b) => a.N_ROADWAY != excludeRoadway); |
| | | } |
| | | |
| | | var roadwayGroup = query.GroupBy((a, b) => a.N_ROADWAY) |
| | | .Select((a, b) => new { roadway = a.N_ROADWAY, num = SqlFunc.AggregateDistinctCount(b.S_CODE != null) }) |
| | | .OrderBy(a => a.num) |
| | | .ToList(); |
| | | |
| | | foreach (var item in roadwayGroup) |
| | | { |
| | | // 1.查询巷道内的堆垛机状态是否正常 |
| | | |
| | | // 2.查询接驳位 |
| | | var connectLoc = Settings.connectLocList.Where(a => a.type == type && a.roadway == item.roadway).FirstOrDefault(); |
| | | var connectLoc = Settings.connectLocList.Where(a => a.roadway == item.roadway).FirstOrDefault(); |
| | | if (connectLoc != null) |
| | | { |
| | | location = LocationHelper.GetLoc(connectLoc.locCode); |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 查询上线货位 |
| | | /// </summary> |
| | | /// <param name="type"></param> |
| | | /// <returns></returns> |
| | | public static Location getOnlneLoc(int type) |
| | | { |
| | | Location location = null; |
| | | var connectLoc = Settings.onLineLocList.Where(a => a.type == type).FirstOrDefault(); |
| | | if (connectLoc != null) |
| | | { |
| | | location = LocationHelper.GetLoc(connectLoc.locCode); |
| | | } |
| | | return location; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 查询叫料异常排出位 |
| | | /// </summary> |
| | | /// <param name="row"></param> |
| | | /// <returns></returns> |
| | | public static Location getCallOutLoc(int row) |
| | | { |
| | | Location location = null; |
| | | var connectLoc = Settings.callOutLocList.Where(a => a.row == row).FirstOrDefault(); |
| | | if (connectLoc != null) |
| | | { |
| | | location = LocationHelper.GetLoc(connectLoc.locCode); |
| | | } |
| | | return location; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 查询物料存放时间配置信息 |
| | | /// </summary> |
| | | /// <param name="bc_entried"></param> |