| | |
| | | |
| | | namespace HH.WCS.Mobox3.AnGang.core |
| | | { |
| | | internal class WCSCore |
| | | { |
| | | internal class WCSCore { |
| | | public static string AgvState = string.Empty; |
| | | |
| | | public static ReturnResult OperateAgvTaskStatus(AgvTaskState model) { |
| | | var result = new ReturnResult(); |
| | | try { |
| | |
| | | break; |
| | | case 2: // 完成 |
| | | WCSHelper.End(TN_Task); // 任务状态改成结束 |
| | | |
| | | break; |
| | | case 7: // 异常 |
| | | TaskProcess.OperateStatus(TN_Task, 7); // 异常处理 |
| | |
| | | return; |
| | | } |
| | | |
| | | if (db.Updateable<TN_Loc_Container>() |
| | | .SetColumns(d => d.S_IMG_URL == filepath) |
| | | .Where(d => d.S_CNTR_CODE == model.S_CNTR_CODE).ExecuteCommand() <= 0) { |
| | | if (db.Updateable<TN_Loc_Container>().SetColumns(d => d.S_IMG_URL == filepath).Where(d => d.S_CNTR_CODE == model.S_CNTR_CODE).ExecuteCommand() <= 0 && |
| | | db.Updateable<TN_CG_Detail>().SetColumns(d => d.S_EXT_ATTR5 == filepath).Where(d => d.S_CNTR_CODE == model.S_CNTR_CODE).ExecuteCommand() <= 0) { // FIX: SNAP |
| | | |
| | | LogHelper.Info($"图片URL '{filepath}' 写入数据库失败"); |
| | | return; |
| | |
| | | //cgDetail.F_QTY = 0; // 不设置为空,便于测试时预先设置一个正常值 |
| | | } |
| | | else { |
| | | var weight = float.Parse(data[0].parameter_varchar200_up); |
| | | var weight_str = data[0].parameter_varchar200_up.Split(';')[1].Split('-')[1]; |
| | | |
| | | var weight = float.Parse(weight_str); |
| | | cgDetail.F_QTY = weight; |
| | | tn_task.F_WEIGHT = weight; |
| | | |
| | |
| | | return; |
| | | } |
| | | |
| | | //row -= 100; // 111-118 => 1-8 |
| | | |
| | | // 只当之前指定终点货架后,才尝试计算终点货位 |
| | | if (cgDetail.F_QTY > 2000) { |
| | | // 重量超过 2t |
| | |
| | | LogHelper.Info("重量超过2t,不允许入库"); |
| | | |
| | | // 传递给国自AGV |
| | | if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo { |
| | | type_name = "GET_DST", |
| | | interaction_info_id = int.Parse(tn_task.S_EQ_TASK_CODE), |
| | | info_status = "error", |
| | | })) { |
| | | LogHelper.Info($"国自AGV接受超重取消信息成功", "HosttoagvTask"); |
| | | if (GZRobot.TryGetInteractionInfoId(tn_task.S_CODE, out var id1)) { |
| | | if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo { |
| | | type_name = "GET_DST", |
| | | interaction_info_id = id1, |
| | | info_status = "error", |
| | | })) { |
| | | LogHelper.Info($"国自AGV接受超重取消信息成功", "HosttoagvTask"); |
| | | } |
| | | else { |
| | | LogHelper.Info($"国自AGV接受超重取消信息失败", "HosttoagvTask"); |
| | | } |
| | | } |
| | | else { |
| | | LogHelper.Info($"国自AGV接受超重取消信息失败", "HosttoagvTask"); |
| | | LogHelper.Info($"AGV:获取任务{tn_task.S_CODE}的interaction_info_id失败!", "HosttoagvTask"); |
| | | } |
| | | |
| | | return; |
| | | return; // 超重会自己return,如果国自agv没接受到也不需要提前return |
| | | } |
| | | else if (cgDetail.F_QTY > 1500) { |
| | | // 重量超过1.5t,需要选择1-2层货架 |
| | |
| | | |
| | | // 如果没有符合条件的货位,置空,等待PDA重新确定 |
| | | if (endLoc == null) { |
| | | tn_task.S_END_AREA = Settings.Areas[1][0]; // HJQ |
| | | tn_task.S_END_AREA = Settings.Areas[AreaIndex.H货架区][0]; // HJQ |
| | | tn_task.S_END_LOC = "0"; |
| | | |
| | | // 不需要再给GZ AGV传空值,一开始就没给具体货位,只给了Area |
| | |
| | | LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁 |
| | | |
| | | // 传递给国自AGV |
| | | if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo { |
| | | type_name = "GET_DST", |
| | | interaction_info_id = int.Parse(tn_task.S_EQ_TASK_CODE), |
| | | info_status = "invalid", |
| | | return_value = LocationHelper.GetAgvSite(tn_task.S_END_LOC), // 目前使用agvsite |
| | | })) { |
| | | LogHelper.Info($"国自AGV接受终点信息成功", "HosttoagvTask"); |
| | | if (GZRobot.TryGetInteractionInfoId(tn_task.S_CODE, out var id2)) { |
| | | if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo { |
| | | type_name = "GET_DST", |
| | | interaction_info_id = id2, |
| | | info_status = "invalid", |
| | | return_value = LocationHelper.GetAgvSite(tn_task.S_END_LOC), // 目前使用agvsite |
| | | })) { |
| | | LogHelper.Info($"国自AGV接受终点信息成功", "HosttoagvTask"); |
| | | } |
| | | else { |
| | | LogHelper.Info($"国自AGV接受终点信息失败", "HosttoagvTask"); |
| | | return; |
| | | } |
| | | } |
| | | else { |
| | | LogHelper.Info($"国自AGV接受终点信息失败", "HosttoagvTask"); |
| | | LogHelper.Info($"AGV:获取任务{tn_task.S_CODE}的interaction_info_id失败!", "HosttoagvTask"); |
| | | return; |
| | | } |
| | | |
| | | using (var tran = db.Ado.UseTran()) { |
| | |
| | | LogHelper.Info("更新物料重量失败:没有接受到来自国自AGV的重量信息"); |
| | | return; |
| | | } |
| | | var weight_str = data[0].parameter_varchar200_up.Split(';')[1].Split('-')[1]; |
| | | |
| | | var weight = float.Parse(data[0].parameter_varchar200_up); |
| | | var weight = float.Parse(weight_str); |
| | | cgDetail.F_QTY = weight; |
| | | |
| | | if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it => it.F_QTY).ExecuteCommand() <= 0) { |
| | |
| | | /// <summary> |
| | | /// 任务分发,根据调度类型发给不同的调度系统 |
| | | /// </summary> |
| | | internal static void Dispatch() |
| | | { |
| | | internal static void Dispatch() { |
| | | //查询任务 |
| | | //获取所有等待的任务 |
| | | var list = WCSHelper.GetWaitingTaskList(); |
| | | LogHelper.Info("等待任务信息" + JsonConvert.SerializeObject(list), "API"); |
| | | if (list.Count > 0) |
| | | { |
| | | list.ForEach(task => |
| | | { |
| | | if (list.Count > 0) { |
| | | list.ForEach(task => { |
| | | //使用自定义任务推送 |
| | | TaskProcess.SendTask(task);//调度NDC或杭奥或国自设备 |
| | | }); |
| | | } |
| | | else |
| | | { |
| | | else { |
| | | LogHelper.Info("暂无任务"); |
| | | } |
| | | } |
| | |
| | | // 目前该项目没有站台安全交互的功能 |
| | | return gzResult; |
| | | } |
| | | |
| | | public static string agvRealtimeStateReport(agvRealtimeStateReportInfo model) { |
| | | var res = string.Empty; |
| | | switch (model.agvStatusID) { |
| | | case 1: res = "in_system"; break; |
| | | case 2: res = "out_system"; break; |
| | | case 3: res = "online"; break; |
| | | case 4: res = "offline"; break; |
| | | case 5: res = "ready"; break; |
| | | case 6: res = "not_ready"; break; |
| | | case 7: res = "in_dispatch"; break; |
| | | case 8: res = "out_dispatch"; break; |
| | | case 9: res = "running"; break; |
| | | case 10: res = "not_running"; break; |
| | | } |
| | | AgvState = res; |
| | | return res; |
| | | } |
| | | } |
| | | } |