| | |
| | | using System.Data; |
| | | using System.Reflection.Emit; |
| | | using WCS.Application.Entity; |
| | | using WCS.Application.Service.WcsDevice.Dto; |
| | | using WCS.Application.Util; |
| | | using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinExpressIntracityUpdateStoreRequest.Types; |
| | | using static SKIT.FlurlHttpClient.Wechat.Api.Models.NontaxInsertBillRequest.Types.CardExtra.Types.BillCard.Types; |
| | |
| | | // 反馈WMS |
| | | var requestMode = new TaskRequestWMS() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | TaskNo = modTask.TaskNo + modTask.EndLocate , |
| | | PalletNo = modTask.PalletNo, |
| | | TaskType = ((int)TaskTypeEnum.Out).ToString(), |
| | | TaskStatus = ((int)TaskStatusEnum.Complete).ToString() |
| | |
| | | // 反馈WMS |
| | | var requestMode = new TaskRequestWMS() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | TaskNo = modTask.TaskNo + modTask.EndLocate , |
| | | PalletNo = modTask.PalletNo, |
| | | TaskType = ((int)TaskTypeEnum.Out).ToString(), |
| | | TaskStatus = ((int)TaskStatusEnum.Complete).ToString() |
| | |
| | | } |
| | | } |
| | | } |
| | | // 根据箱内品种号获取码躲绑定工位及对应的分道号 |
| | | var checkTaskInfo = _db.Queryable<WcsCheckTask>().First(w => w.SkuNo == boxInfo.SkuNo && w.SkuName == boxInfo.SkuName && w.LotNo == boxInfo.LotNo && w.Status == "1"); |
| | | if (checkTaskInfo == null) |
| | | |
| | | |
| | | // 验证是否零箱 |
| | | if (boxInfo.BitBoxMark == "1") |
| | | { |
| | | // 绑定信息为null写入剔除通道号 |
| | | // 是零箱直接剔除,进行人工组托 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("箱码未绑定分拣任务,进行剔除。"); |
| | | Log.Error("零箱,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | |
| | | |
| | | // 根据箱内品种号获取码躲绑定工位及对应的分道号 |
| | | var checkTaskInfo = _db.Queryable<WcsCheckTask>().First(w => w.SkuNo == boxInfo.SkuNo && w.SkuName == boxInfo.SkuName && w.LotNo == boxInfo.LotNo && w.Status == "1"); |
| | | if (checkTaskInfo == null) |
| | | { |
| | | // 判断是否关联单据 wcsordertask |
| | | var orderModel = _db.Queryable<WcsOderTask>() |
| | | .First(m => m.SkuNo == boxInfo.SkuNo && m.Status== TaskStatusEnum.Wait && m.LotNo == boxInfo.LotNo && m.IsDelete == false); |
| | | if (orderModel != null) |
| | | { |
| | | // 根据boxinfo表产线字段自动绑定分道(1线产品只能绑定到8道) |
| | | if (boxInfo.LineNo != "1") |
| | | {// 绑定到除8道外其他道 |
| | | |
| | | // 获取未绑定道 |
| | | var lineNoModels = _db.Queryable<WcsCheckTask>() |
| | | .Where(m => m.Status == "0" && m.LineNo != "8" && m.RoboatType == PLCTypeEnum.RobotPalletizer).ToList(); |
| | | if (lineNoModels.Count > 0) |
| | | { |
| | | // 获取当前物料品种号 |
| | | var skuInfo = await _db.Queryable<WcsMateialPzInfo>().Where(w => w.SkuNo == boxInfo.SkuNo).FirstAsync(); |
| | | if (skuInfo == null) |
| | | { |
| | | // 此产品若没设定品规,进行剔除处理。防止堵塞件箱线 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("没有空闲分道,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | |
| | | foreach (var lineNoModel in lineNoModels) |
| | | { |
| | | // 读取设备验证是否绑定分道 |
| | | var (respg, pzNo) = plcConn.GetPlcDBValue(lineNoModel.PosType, lineNoModel.DbNumber, lineNoModel.PlcPos); |
| | | if (respg.IsSucceed) |
| | | { |
| | | if (pzNo != 0) |
| | | { |
| | | // plc此分道未解绑 |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | // 自动绑定分道 |
| | | lineNoModel.OrderNo = orderModel.OrderNo; |
| | | lineNoModel.LotNo = boxInfo.LotNo; |
| | | lineNoModel.SkuNo = boxInfo.SkuNo; |
| | | lineNoModel.SkuName = boxInfo.SkuName; |
| | | lineNoModel.Qty = orderModel.Qty; |
| | | lineNoModel.Status = "1";//已绑定 |
| | | lineNoModel.PZNo = skuInfo.PZNo; |
| | | |
| | | // 给PLC写入品规 |
| | | var ret = plcConn.SetPlcDBValue(lineNoModel.PosType, lineNoModel.DbNumber, lineNoModel.PlcPos, skuInfo.PZNo); |
| | | if (ret.IsSucceed) |
| | | { |
| | | //写入流程字成功后更新分拣任务 |
| | | _db.Updateable(lineNoModel).ExecuteCommand(); |
| | | //更新WcsOderTask表 |
| | | orderModel.Status = TaskStatusEnum.Doing; |
| | | _db.Updateable(orderModel).ExecuteCommand(); |
| | | // Liudl 通知前端更新分拣任务 |
| | | //下发分拣任务 |
| | | HubUtil.PublicCheckTask(lineNoModel.Adapt<WcsDeviceTaskOrderDto>()); |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | throw Oops.Bah("与PCL交互失败,绑定失败!"); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 读取plc失败 |
| | | break; |
| | | } |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | // 若没有空闲道,进行剔除处理。防止堵塞件箱线 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("没有空闲分道,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | else |
| | | {// 绑定到8道 |
| | | // 获取未绑定道 |
| | | var lineNo8Model = _db.Queryable<WcsCheckTask>() |
| | | .First(m => m.Status == "0" && m.LineNo == "8" && m.RoboatType == PLCTypeEnum.RobotPalletizer); |
| | | if (lineNo8Model != null) |
| | | { |
| | | // 获取当前物料品种号 |
| | | var skuInfo = await _db.Queryable<WcsMateialPzInfo>().Where(w => w.SkuNo == boxInfo.SkuNo).FirstAsync(); |
| | | if (skuInfo == null) |
| | | { |
| | | // 此产品若没设定品规,进行剔除处理。防止堵塞件箱线 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("没有空闲分道,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | |
| | | |
| | | // 读取设备验证是否绑定分道 |
| | | var (respg, pzNo) = plcConn.GetPlcDBValue(lineNo8Model.PosType, lineNo8Model.DbNumber, lineNo8Model.PlcPos); |
| | | if (respg.IsSucceed) |
| | | { |
| | | if (pzNo != 0) |
| | | { |
| | | // plc此分道未解绑 |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | // 自动绑定分道 |
| | | lineNo8Model.OrderNo = orderModel.OrderNo; |
| | | lineNo8Model.LotNo = boxInfo.LotNo; |
| | | lineNo8Model.SkuNo = boxInfo.SkuNo; |
| | | lineNo8Model.SkuName = boxInfo.SkuName; |
| | | lineNo8Model.Qty = orderModel.Qty; |
| | | lineNo8Model.Status = "1";//已绑定 |
| | | lineNo8Model.PZNo = skuInfo.PZNo; |
| | | |
| | | // 给PLC写入品规 |
| | | var ret = plcConn.SetPlcDBValue(lineNo8Model.PosType, lineNo8Model.DbNumber, lineNo8Model.PlcPos, skuInfo.PZNo); |
| | | if (ret.IsSucceed) |
| | | { |
| | | //写入流程字成功后更新分拣任务 |
| | | _db.Updateable(lineNo8Model).ExecuteCommand(); |
| | | //更新WcsOderTask表 |
| | | orderModel.Status = TaskStatusEnum.Doing; |
| | | _db.Updateable(orderModel).ExecuteCommand(); |
| | | |
| | | // Liudl 通知前端更新分拣任务 |
| | | //下发分拣任务 |
| | | HubUtil.PublicCheckTask(lineNo8Model.Adapt<WcsDeviceTaskOrderDto>()); |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | throw Oops.Bah("与PCL交互失败,绑定失败!"); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 读取plc失败 |
| | | break; |
| | | } |
| | | |
| | | |
| | | } |
| | | else |
| | | { |
| | | // 没有空闲道,进行剔除处理。防止堵塞件箱线 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("没有空闲分道,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 不关联单据直接进行剔除处理 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("箱码未绑定分拣任务,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | if (modDevice.DbNumber == "DB102")//1L拆跺分拣后需要回传箱码 |
| | | { |
| | | var http = new HttpService(); |
| | | IsBaleModel2 ret1 = http.RequestBoxno(boxNoVal); |
| | | if (ret1.Success == -1) |
| | | { // liudl 此段程序不会执行 确认后直接删除 |
| | | if (modDevice.DbNumber == "DB102")//1L拆跺分拣后需要回传箱码 |
| | | { |
| | | Log.Error("箱码分拣回传失败,需要手动拣货。失败箱码:"+boxNoVal); |
| | | break; |
| | | var http = new HttpService(); |
| | | IsBaleModel2 ret1 = http.RequestBoxno(boxNoVal); |
| | | if (ret1.Success == -1) |
| | | { |
| | | Log.Error("箱码分拣回传失败,需要手动拣货。失败箱码:"+boxNoVal); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | break; |
| | |
| | | } |
| | | |
| | | var rowCount = _db.Updateable(boxInfo).ExecuteCommand(); |
| | | Log.Information(string.Format("插码成功,箱码是:"+ boxNo, modDevice.StationNum)); |
| | | if (rowCount > 0) |
| | | { |
| | | // 插码成功 |
| | |
| | | } |
| | | break; |
| | | } |
| | | // 组托成功后将信息存到log表 |
| | | string sqlStr = $"insert into WCSBoxInfoLog select * from WCSBoxInfo where IsDelete=0 and PalletNo='{palletNo}'"; |
| | | int insertCount = _db.Ado.ExecuteCommand(sqlStr); |
| | | if (insertCount > 0) |
| | | { |
| | | // 组托成功后将信息存到log表 |
| | | string sqlStr2 = $"delete from WCSBoxInfoLog where IsDelete=0 and PalletNo='{palletNo}'"; |
| | | string sqlStr2 = $"delete from WCSBoxInfo where IsDelete=0 and PalletNo='{palletNo}'"; |
| | | _db.Ado.ExecuteCommand(sqlStr2); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 拆垛机器人业务处理 |
| | | /// 出库件箱输送和拆垛机器人业务处理 |
| | | /// </summary> |
| | | /// <param name="modDevice"></param> |
| | | private static void StackingRobot(WcsDeviceDto modDevice) |
| | | { |
| | | var plcConn = modDevice.PLCUtil; |
| | | if (modDevice.DbNumber == "DB131" && modDevice.DbNumber == "DB132" && modDevice.DbNumber == "DB133" && modDevice.DbNumber == "DB134") |
| | | if (modDevice.DbNumber == "DB131" || modDevice.DbNumber == "DB132" || modDevice.DbNumber == "DB133" || modDevice.DbNumber == "DB134") |
| | | { |
| | | switch (modDevice.Value.ToString()) |
| | | { |
| | |
| | | // 根据任务号获取任务信息 |
| | | if (res1.IsSucceed) |
| | | { |
| | | var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.EndLocate == "009" && m.IsDelete == false); |
| | | var modTask = _db.Queryable<WcsTask>().First(m => m.TaskNo == tasknoVal && m.EndLocate == "009" && m.IsDelete == false); |
| | | if (modTask == null) |
| | | { |
| | | Log.Error(string.Format($"出库任务未下发,请人工处理,无法拆垛!")); |
| | |
| | | //通过任务号和托盘号向WMS申请此托盘的拆垛信息 |
| | | var http = new HttpService(); |
| | | RequestBoxInfoCheckAll tasklist = http.RequestBoxCheckinfo(palletVal, tasknoVal); |
| | | if (!tasklist.Success.Contains("-1")) |
| | | if (tasklist.Success != -1) |
| | | { |
| | | //获取拆垛物料品种(需要增加物料判断,同一个物料号可能会出现不同的码垛规则) |
| | | var pz = _db.Queryable<WcsMateialPzInfo>().First(m => m.SkuNo == tasklist.list[0].SkuNo); |
| | | var pz = _db.Queryable<WcsMateialPzInfo>().First(m => m.SkuNo == tasklist.data[0].SkuNo); |
| | | //下发拆托规格,拆箱数和托盘上总箱数(不绑定机器人,拆垛任务信息只下发一次) |
| | | // 给PLC写入任务数据 |
| | | var listResult = new List<Result>(); |
| | | // 获取托盘规则 |
| | | var Standard = modDevice.listStation.FirstOrDefault(m => m.Text == "规格"); |
| | | listResult.Add(plcConn.SetPlcDBValue(Standard.PosType, modDevice.DbNumber, Standard.PlcPos, tasklist.list[0].Standard)); |
| | | listResult.Add(plcConn.SetPlcDBValue(Standard.PosType, modDevice.DbNumber, Standard.PlcPos, pz.PZNo)); |
| | | //抓箱数 |
| | | var qty = modDevice.listStation.FirstOrDefault(m => m.Text == "拆箱数量"); |
| | | listResult.Add(plcConn.SetPlcDBValue(qty.PosType, modDevice.DbNumber, qty.PlcPos, tasklist.list[0].Qty.ToString())); |
| | | listResult.Add(plcConn.SetPlcDBValue(qty.PosType, modDevice.DbNumber, qty.PlcPos, tasklist.data[0].Qty.ToString())); |
| | | //总箱数 |
| | | var qtycount = modDevice.listStation.FirstOrDefault(m => m.Text == "总箱数"); |
| | | listResult.Add(plcConn.SetPlcDBValue(qtycount.PosType, modDevice.DbNumber, qtycount.PlcPos, tasklist.list[0].QtyCount.ToString())); |
| | | listResult.Add(plcConn.SetPlcDBValue(qtycount.PosType, modDevice.DbNumber, qtycount.PlcPos, tasklist.data[0].QtyCount.ToString())); |
| | | |
| | | |
| | | // 是否写入成功 |
| | | if (listResult.All(s => s.IsSucceed)) |
| | | { |
| | | var ret1 = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "20"); |
| | | var ret1 = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "30"); |
| | | |
| | | } |
| | | else |
| | | { |
| | | Log.Error(string.Format($"码垛信息未写入!托盘号:"+palletVal+",码垛位:"+modDevice.StationNum)); |
| | | Log.Error(string.Format($"码垛信息未写入!托盘号:" + palletVal + ",码垛位:" + modDevice.StationNum)); |
| | | break; |
| | | } |
| | | } |
| | |
| | | break; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | switch (modDevice.Value.ToString()) |
| | | { |
| | | case "1": |
| | | // 1楼件箱PLC请求WCS读码 |
| | | { |
| | | // 读取plc箱码 |
| | | var modBoxNo = modDevice.listStation.FirstOrDefault(m => m.Text == "主扫条码"); |
| | | var (res, boxNo) = plcConn.GetPlcDBValue(modBoxNo.PosType, modDevice.DbNumber, modBoxNo.PlcPos); |
| | | if (string.IsNullOrWhiteSpace(boxNo.ToString())) |
| | | { |
| | | |
| | | // 箱信息为null写入剔除通道号:0 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("箱码为null或已绑定托盘,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 箱码 |
| | | string boxNoVal = boxNo.ToString(); |
| | | // 通道号 |
| | | var modLineNo = modDevice.listStation.FirstOrDefault(m => m.Text == "通道号"); |
| | | |
| | | // 调用wms接口验证箱码是否可拣货并返回装车口 |
| | | var http = new HttpService(); |
| | | RequestloadingAddre requesModel = http.ResultBoxInfoExportWcs(boxNoVal); |
| | | if (requesModel.Success != "0") |
| | | { |
| | | // 箱信息为null写入剔除通道号:0 |
| | | var ret = plcConn.SetPlcDBValue(modLineNo.PosType, modDevice.DbNumber, modLineNo.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("出库分拣根据箱码获取装车口失败,进行剔除。" + requesModel.Message); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 写入出库分道号 |
| | | var ret = plcConn.SetPlcDBValue(modLineNo.PosType, modDevice.DbNumber, modLineNo.PlcPos, requesModel.loadingAddre); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | };break; |
| | | case "10": |
| | | // 1楼件箱PLC读码失败,WCS不做处理直接剔除手持拣货。 |
| | | { |
| | | |
| | | };break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |