| | |
| | | using static HH.WCS.Mobox3.AnGang.Dtos.Response.AgvResponse; |
| | | using HH.WCS.Mobox3.AnGang.Consts; |
| | | using HH.WCS.Mobox3.AnGang.Dispatch; |
| | | using HH.WCS.Mobox3.AnGang.Devices; |
| | | |
| | | namespace HH.WCS.Mobox3.AnGang.Services { |
| | | public class AgvService { |
| | |
| | | try { |
| | | switch (model.state) { |
| | | case 1023: |
| | | break; |
| | | case 1025: |
| | | |
| | | break; |
| | | case 1012: |
| | | break; |
| | |
| | | case AgvStateCode.取货完成: |
| | | WCSHelper.UpdateStatus(TN_Task, "取货完成"); // 任务状态改成取货完成 |
| | | |
| | | // TODO 拍照 |
| | | var captureTask = Task.Run(() => { |
| | | if (TN_Task.S_TYPE == TaskName.货品入库 || TN_Task.S_TYPE == TaskName.产品部分回库) { |
| | | CapturePic(TN_Task); |
| | | } |
| | | }); |
| | | |
| | | var setEndLocTask = Task.Run(() => { |
| | | SetEndLoc(TN_Task); |
| | | // 只要任务为产品入库(PDA),就需要重新指定终点(默认endLoc为"") |
| | | if (TN_Task.S_TYPE == "产品入库(PDA)") { |
| | | SetEndLoc(TN_Task); |
| | | } |
| | | }); |
| | | |
| | | TaskHelper.OperateStatus(TN_Task, 4); // 起点容器货位解绑,解锁起点 |
| | |
| | | return true; |
| | | } |
| | | |
| | | public static void CapturePic(TN_Task model) { |
| | | var db = DbHelper.GetDbClient(); |
| | | |
| | | var filepath = SnapManager.GetCapturePicturePath(); |
| | | if (string.IsNullOrEmpty(filepath)) { |
| | | return; |
| | | } |
| | | |
| | | if (db.Updateable<TN_CG_Detail>() |
| | | .SetColumns(d => d.S_IMG_URL == filepath) |
| | | .Where(d => d.S_CNTR_CODE == model.S_CNTR_CODE).ExecuteCommand() <= 0) { |
| | | |
| | | LogHelper.Info($"图片URL '{filepath}' 写入数据库失败"); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | public static void SetEndLoc(TN_Task tn_task) { |
| | | // 只要任务为产品入库(PDA),就需要重新指定终点(默认endLoc为"") |
| | | if (tn_task.S_TYPE == "产品入库(PDA)") { |
| | | var db = DbHelper.GetDbClient(); |
| | | var endLoc = new TN_Location(); |
| | | |
| | | var db = DbHelper.GetDbClient(); |
| | | var endLoc = new TN_Location(); |
| | | var data = GZRobot.CustomBuf(); |
| | | var weight = float.Parse(data[0].parameter_varchar200_up); |
| | | tn_task.F_WEIGHT = weight; |
| | | |
| | | var data = GZRobot.CustomBuf(); |
| | | var weight = float.Parse(data[0].parameter_varchar200_up); |
| | | tn_task.F_WEIGHT= weight; |
| | | // 只当之前指定终点货架后,才尝试计算终点货位,否则交给人工决定 |
| | | if (tn_task.S_END_AREA != "") { |
| | | if (weight > 1500) { |
| | | // 重量超过1.5t,需要选择1-3层货架 |
| | | endLoc = db.Queryable<TN_Location>().First(a => a.S_SHELF_CODE == tn_task.S_END_AREA && LocationHelper.IsFree(a) && a.N_CURRENT_NUM == 0 && a.N_HEIGHT <= 3); |
| | | } |
| | | else if (weight > 0) { |
| | | // 重量未超过1.5t,在指定货架随便选择1个 |
| | | endLoc = db.Queryable<TN_Location>().First(a => a.S_SHELF_CODE == tn_task.S_END_AREA && LocationHelper.IsFree(a) && a.N_CURRENT_NUM == 0); |
| | | } |
| | | else { |
| | | // 没有接收到重量,或重量出错 |
| | | endLoc = null; |
| | | LogHelper.Info($"错误的重量信息:{weight}"); |
| | | return; |
| | | } |
| | | |
| | | // 只当之前指定终点货架后,才尝试计算终点货位,否则交给人工决定 |
| | | if (tn_task.S_END_AREA != "") { |
| | | if (weight > 1500) { |
| | | // 重量超过1.5t,需要选择1-3层货架 |
| | | endLoc = db.Queryable<TN_Location>().First(a => a.S_SHELF_CODE == tn_task.S_END_AREA && LocationHelper.IsFree(a) && a.N_CURRENT_NUM == 0 && a.N_HEIGHT <= 3); |
| | | } |
| | | else if (weight > 0) { |
| | | // 重量未超过1.5t,在指定货架随便选择1个 |
| | | endLoc = db.Queryable<TN_Location>().First(a => a.S_SHELF_CODE == tn_task.S_END_AREA && LocationHelper.IsFree(a) && a.N_CURRENT_NUM == 0); |
| | | } |
| | | else { |
| | | // 没有接收到重量,或重量出错 |
| | | endLoc = null; |
| | | LogHelper.Info($"错误的重量信息:{weight}"); |
| | | return; |
| | | } |
| | | // 如果没有符合条件的货位,置空,等待PDA重新确定 |
| | | if (endLoc == null) { |
| | | tn_task.S_END_AREA = ""; |
| | | tn_task.S_END_LOC = ""; |
| | | |
| | | // 如果没有符合条件的货位,置空,等待PDA重新确定 |
| | | if (endLoc == null) { |
| | | tn_task.S_END_AREA = ""; |
| | | tn_task.S_END_LOC = ""; |
| | | // 不需要再给GZ AGV传空值,一开始就没给具体货位,只给了Area |
| | | |
| | | // 不需要再给GZ AGV传空值,一开始就没给具体货位,只给了Area |
| | | //var request = new UpdateInteractInfo { |
| | | // interaction_info_id = 3, // 更改终点信息 |
| | | // info_status = "active", |
| | | // return_value = "", |
| | | //}; |
| | | |
| | | //var request = new UpdateInteractInfo { |
| | | // interaction_info_id = 3, // 更改终点信息 |
| | | // info_status = "active", |
| | | // return_value = "", |
| | | //}; |
| | | //GZRobot.UpdateInteractInfo(request); |
| | | |
| | | //GZRobot.UpdateInteractInfo(request); |
| | | using (var trans = db.Ado.UseTran()) { |
| | | if (db.Updateable<TN_Task>(tn_task).UpdateColumns(it => new { it.S_END_LOC, it.F_WEIGHT }) |
| | | .ExecuteCommand() > 0) { |
| | | //LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁 |
| | | |
| | | using (var trans = db.Ado.UseTran()) { |
| | | if (db.Updateable<TN_Task>(tn_task).UpdateColumns(it => new { it.S_END_LOC, it.F_WEIGHT }) |
| | | .ExecuteCommand() > 0) { |
| | | //LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁 |
| | | |
| | | trans.CommitTran(); |
| | | LogHelper.Info($"重新计算后没有合适货位,任务 {tn_task.S_CODE} 修改成功,修改终点货架和货位为空"); |
| | | } |
| | | else { |
| | | trans.RollbackTran(); |
| | | LogHelper.Info($"重新计算后没有合适货位,任务 {tn_task.S_CODE} 修改失败,修改终点货架和货位为空"); |
| | | } |
| | | trans.CommitTran(); |
| | | LogHelper.Info($"重新计算后没有合适货位,任务 {tn_task.S_CODE} 修改成功,修改终点货架和货位为空"); |
| | | } |
| | | else { |
| | | trans.RollbackTran(); |
| | | LogHelper.Info($"重新计算后没有合适货位,任务 {tn_task.S_CODE} 修改失败,修改终点货架和货位为空"); |
| | | } |
| | | } |
| | | else { |
| | | // 找到合适的货位,推送 |
| | | tn_task.S_END_LOC = endLoc.S_CODE; |
| | | } |
| | | else { |
| | | // 找到合适的货位,推送 |
| | | tn_task.S_END_LOC = endLoc.S_CODE; |
| | | |
| | | using (var trans = db.Ado.UseTran()) { |
| | | if (db.Updateable<TN_Task>(tn_task).UpdateColumns(it => new {it.S_END_LOC, it.F_WEIGHT}) |
| | | .ExecuteCommand() > 0) { |
| | | LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁 |
| | | using (var trans = db.Ado.UseTran()) { |
| | | if (db.Updateable<TN_Task>(tn_task).UpdateColumns(it => new { it.S_END_LOC, it.F_WEIGHT }) |
| | | .ExecuteCommand() > 0) { |
| | | LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁 |
| | | |
| | | trans.CommitTran(); |
| | | LogHelper.Info($"计算货位成功,任务 {tn_task.S_CODE} 修改成功,终点货架为 {endLoc.S_SHELF_CODE},修改终点位置为 {endLoc.S_CODE}"); |
| | | } |
| | | else { |
| | | trans.RollbackTran(); |
| | | trans.CommitTran(); |
| | | LogHelper.Info($"计算货位成功,任务 {tn_task.S_CODE} 修改成功,终点货架为 {endLoc.S_SHELF_CODE},修改终点位置为 {endLoc.S_CODE}"); |
| | | } |
| | | else { |
| | | trans.RollbackTran(); |
| | | |
| | | LogHelper.Info($"计算货位成功,任务 {tn_task.S_CODE} 修改失败,终点货架为 {endLoc.S_SHELF_CODE},修改终点位置为 {endLoc.S_CODE}"); |
| | | } |
| | | LogHelper.Info($"计算货位成功,任务 {tn_task.S_CODE} 修改失败,终点货架为 {endLoc.S_SHELF_CODE},修改终点位置为 {endLoc.S_CODE}"); |
| | | } |
| | | } |
| | | } |