zhaowc
2025-06-07 9dfb7d191bdf19595d766647222171f992d8af3f
Admin.NET/WCS.Application/OpenApi/DemoOpenApi.cs
@@ -1,5 +1,6 @@
using Dm.filter;
using DocumentFormat.OpenXml.Drawing.Charts;
using DocumentFormat.OpenXml.Office.CustomUI;
using DocumentFormat.OpenXml.Presentation;
using Elastic.Clients.Elasticsearch;
using Furion.Logging;
@@ -79,6 +80,8 @@
        ResponseModel result = new ResponseModel();
        try
        {
            string str = JsonConvert.SerializeObject(models);
            Log.Information("接收WMS出入库任务,任务号:" + models.TaskNo + ",托盘号:"+ models.PalletNo);
            // 验证任务是否已存在
            var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == models.TaskNo);
            if (taskInfo != null)
@@ -97,6 +100,8 @@
            }
            Enum type;
            var bale = "0";
            decimal nqty = 0;
            decimal ncomqty = 0;
            if (models.TaskType == "0" )
            {
                type = TaskTypeEnum.In;
@@ -113,6 +118,14 @@
            else
            {
                type = TaskTypeEnum.Move;
            }
            if (!string.IsNullOrEmpty( models.Qty))
            {
                nqty =Convert.ToDecimal(models.Qty);
            }
            if (!string.IsNullOrEmpty(models.CompleteQty))
            {
                ncomqty = Convert.ToDecimal(models.CompleteQty);
            }
            //新增任务
            var taskAdd = new WcsTask()
@@ -131,10 +144,10 @@
                IsBale = bale,
                //LotNo =models.LotNo,
                //SkuNo=models.SkuNo,
                //SkuName=models.SkuName,
                //Qty=models.Qty
                LotNo = models.LotNo,
                SkuName = models.SkuName,
                Qty = nqty,
                CompleteQty = ncomqty
            };
            _db.Insertable(taskAdd).ExecuteCommand();           
@@ -371,26 +384,129 @@
                return new ResponseFuMaModel() { Success = "-1", Message = "该批次未进行分拣或已结批" };
            }
            //获取包装数量
            int Fqty = int.Parse(models.FinishQty);
            var boxinfolog = _db.Queryable<WcsBoxInfoLog>().Where(m => m.SkuNo == models.SkuNo && m.LotNo == models.LotNo && m.BitBoxMark == "0").First();
            if (boxinfolog == null)
            {
                var boxinfo = _db.Queryable<WcsBoxInfo>().Where(m => m.SkuNo == models.SkuNo && m.LotNo == models.LotNo && m.BitBoxMark == "0").First();
                Fqty = (int)(Fqty /boxinfo.QtyCount);
            }
            else
            {
                Fqty = (int)(Fqty / boxinfolog.QtyCount);
            }
            int Jpqty = 0;
            //写入该任务完成数量
            foreach (var item in num)
            {
                int jp = 0;//结批是否需要组盘0:不需要,1:需要。不需要组盘则直接释放分道,需要组盘则下发PLC预结批信号
                item.FinishQty = Fqty;
            }
            _db.Updateable(num).ExecuteCommand();
                //判断当前单据码垛数量是否和完工数量相等,是则结批该单据
                //获取已组盘数量
                var checkNum = _db.Queryable<WcsBoxInfoLog>().Where(m => m.SkuNo == models.SkuNo && m.LotNo == models.LotNo && m.OrderCode == item.OrderNo).ToList();//组盘表箱码信息
                if (checkNum.Count>0)
                {
                    if (!(string.IsNullOrEmpty(checkNum.First().BoxNo2))||!(string.IsNullOrEmpty(checkNum.First().BoxNo3)))//有支码
                    {
                        foreach (var item2 in checkNum)
                        {
                            Jpqty = (int)(Jpqty + item2.Qty);
                        }
                    }
                    else//无支码
                    {
                        foreach (var item2 in checkNum)
                        {
                            Jpqty = (int)(Jpqty + item2.QtyCount);
                        }
                    }
                }
                //获取已插码数量
                var checkNum2 = _db.Queryable<WcsBoxInfo>().Where(m =>m.BitBoxMark != "1" && m.SkuNo == models.SkuNo && m.LotNo == models.LotNo &&(m.PalletNo != null || m.PalletNo != "") && m.OrderCode == item.OrderNo).ToList();//箱码表已码垛箱码信息
                if (checkNum2.Count>0)
                {
                    jp = 1;//箱码表还有未组盘箱,需要组盘
                    if (!string.IsNullOrEmpty(checkNum2.First().BoxNo2)||!string.IsNullOrEmpty(checkNum2.First().BoxNo3))//有支码
                    {
                        foreach (var item2 in checkNum2)
                        {
                            Jpqty = (int)(Jpqty + item2.Qty);
                        }
                    }
                    else//无支码
                    {
                        foreach (var item2 in checkNum2)
                        {
                            Jpqty = (int)(Jpqty + item2.QtyCount);
                        }
                    }
                }
                //获取零箱数量
                var checkNum3 = _db.Queryable<WcsBoxInfo>().Where(m => m.BitBoxMark == "1" && m.SkuNo == models.SkuNo && m.LotNo == models.LotNo).ToList();
                if (checkNum3.Count > 0)
                {
                    if (!string.IsNullOrEmpty(checkNum3.First().BoxNo2) || !string.IsNullOrEmpty(checkNum3.First().BoxNo3))//有支码
                    {
                        foreach (var item3 in checkNum3)
                        {
                            Jpqty = (int)(Jpqty + item3.Qty);
                        }
                    }
                    else//无支码
                    {
                        foreach (var item3 in checkNum3)
                        {
                            Jpqty = (int)(Jpqty + item3.QtyCount);
                        }
                    }
                }
                if (Jpqty == Fqty)
                {
                    var modPlc = _db.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.ConveyorLine && s.Text == ("2层托盘输送线")).First();
                    if (modPlc == null)
                        throw Oops.Bah("未找到输送线PLC");
                    PLCUtil plcConn = new PLCUtil(modPlc);
                    //判断当前分道是否有未组盘箱
                    if (jp == 0)
                    {
                        // 分道解绑,抓箱品种写入0
                        var ret1 = plcConn.SetPlcDBValue(item.PosTypeLot, item.DbNumber, item.PlcPos, "0");
                        if (ret1.IsSucceed)
                        {
                            //更新入库订单
                            var orderTask = _db.Queryable<WcsOderTask>().Where(w => w.SkuNo == item.SkuNo && w.LotNo == item.LotNo && w.IsDelete == false).ToList();
                            if (orderTask.Count > 0)
                            {
                                foreach (var item2 in orderTask)
                                {
                                    item2.Status = TaskStatusEnum.Complete;
                                    _db.Updateable(item2).ExecuteCommand();
                                }
                            }
                            //写入流程字成功后更新分拣任务    liudl 最后一托盘申请完入库才可清空
                            item.OrderNo = "";
                            item.TaskNo = "";
                            item.LotNo = "";
                            item.SkuNo = "";
                            item.SkuName = "";
                            item.BoxType = "";
                            item.Qty = 0;
                            item.PZNo = "";
                            item.Status = "0";      // 绑定分道 0:解绑  1:绑定
                            item.FinishQty = 0;
                            //更新分拣任务
                            _db.Updateable(item).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
                        }
                    }
                    else
                    {
                        //预结批信号下发
                        var ret2 = plcConn.SetPlcDBValue(item.PosType, item.DbNumber, item.PosLot, "1");//写入开始结批信号
                        if (ret2.IsSucceed)
                        {
                            item.Status = "2";//结批中
                        }
                        else { throw new Exception("完工结批信号下发给PLC错误"); }
                    }
                    _db.Updateable(item).ExecuteCommand();
                }
            }
            return new ResponseFuMaModel() { Success = "0", Message = "接受完工结批数量成功" };
        }
        catch (Exception ex)
@@ -415,16 +531,43 @@
            string str = JsonConvert.SerializeObject(models);
            Log.Information("接收WMS入库放货确认,放货口:" + models.Port+"入库口");
            var portno = models.Port;
            var layer = "3";
            switch (models.Port)
            {
                case "033":
                    portno = "33";
                    layer = "1";
                    break;
                case "039":
                    portno = "39";
                    layer = "1";
                    break;
                case "044":
                    portno = "44";
                    layer = "1";
                    break;
                case "051":
                    portno = "51";
                    layer = "1";
                    break;
            }
            //检测入库口状态,120为可放,占用则修改为130
            WcsDeviceDto modDevice = new WcsDeviceDto();
            var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "PLC流程字");
            var plcConn = modDevice.PLCUtil;
            var (res1, val) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos);
            var modPlc = _db.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.ConveyorLine && s.Text == (layer + "层托盘输送线")).First();
            if (modPlc == null)
                throw Oops.Bah("未找到输送线PLC");
            PLCUtil plcConn = new PLCUtil(modPlc);
            //获取工位点位信息
            var listPlcDevice = _db.Queryable<WcsDevice>().Where(s => s.LedIP != null && s.StationNum == portno).First();
            var modDevice = _db.Queryable<WcsPosition>().Where(s => s.StationNum == portno && s.Text == "PLC").First();
            var (res1, val) = plcConn.GetPlcDBValue(modDevice.PosType, listPlcDevice.DbNumber, modDevice.PlcPos);
            if (val.ToString() == "120")
            {
                modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "WCS流程字");
                //读取成功后写入130
                var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "130");//占用此工位
                modDevice = _db.Queryable<WcsPosition>().Where(s => s.StationNum == portno && s.Text == "WCS").First();
                var ret = plcConn.SetPlcDBValue(modDevice.PosType, listPlcDevice.DbNumber, modDevice.PlcPos, "130");//占用此工位
                if (ret.IsSucceed)
                {
                    //回传WMS可放信号
@@ -452,18 +595,41 @@
        try
        {
            string str = JsonConvert.SerializeObject(models);
            Log.Information("接收WMS入库放货确认,放货口:" + models.Port + "入库口");
            Log.Information("接收WMS入库放货请求,放货口:" + models.Port + "入库口");
            WcsDeviceDto modDevice = new WcsDeviceDto();
            var plcConn = modDevice.PLCUtil;
            var portno = models.Port;
            var layer = "3";
            switch (models.Port)
            {
                case "033":
                    portno = "33";
                    layer = "1";
                    break;
                case "039":
                    portno = "39";
                    layer = "1";
                    break;
                case "044":
                    portno = "44";
                    layer = "1";
                    break;
                case "051":
                    portno = "51";
                    layer = "1";
                    break;
            }
            var modPlc = _db.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.ConveyorLine && s.Text == (layer + "层托盘输送线")).First();
            if (modPlc == null)
                throw Oops.Bah("未找到输送线PLC");
            PLCUtil plcConn = new PLCUtil(modPlc);
            //获取工位点位信息
            //modDevice = ......=models.Port
            var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
            plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, models.TaskNo);//写入任务号
                                                                                                    //
            modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "WCS流程字");
            var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "140");//开始放货
            var listPlcDevice = _db.Queryable<WcsDevice>().Where(s=>s.LedIP != null && s.StationNum == portno).First();
            var modDevice = _db.Queryable<WcsPosition>().Where(s => s.StationNum == portno && s.Text == "任务号").First();
            plcConn.SetPlcDBValue(modDevice.PosType, listPlcDevice.DbNumber, modDevice.PlcPos, models.TaskNo);//写入任务号
                                                                                                              //
            modDevice = _db.Queryable<WcsPosition>().Where(s => s.StationNum == portno && s.Text == "WCS").First();
            var ret = plcConn.SetPlcDBValue(modDevice.PosType, listPlcDevice.DbNumber, modDevice.PlcPos, "140");//写入开始放货信号
            if (ret.IsSucceed)
            {
                //回传WMS放货信号
@@ -492,15 +658,39 @@
        try
        {
            string str = JsonConvert.SerializeObject(models);
            Log.Information("接收WMS入库放货确认,放货口:" + models.Port + "入库口");
            Log.Information("接收WMS入库放货完成,放货口:" + models.Port + "入库口");
            WcsDeviceDto modDevice = new WcsDeviceDto();
            var portno = models.Port;
            var layer = "3";
            switch (models.Port)
            {
                case "033":
                    portno = "33";
                    layer = "1";
                    break;
                case "039":
                    portno = "39";
                    layer = "1";
                    break;
                case "044":
                    portno = "44";
                    layer = "1";
                    break;
                case "051":
                    portno = "51";
                    layer = "1";
                    break;
            }
            var modPlc = _db.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.ConveyorLine && s.Text == (layer + "层托盘输送线")).First();
            if (modPlc == null)
                throw Oops.Bah("未找到输送线PLC");
            PLCUtil plcConn = new PLCUtil(modPlc);
            //获取工位点位信息
            //modDevice = ......=models.Port
            var listPlcDevice = _db.Queryable<WcsDevice>().Where(s => s.LedIP != null && s.StationNum == portno).First();
            var modDevice = _db.Queryable<WcsPosition>().Where(s => s.StationNum == portno && s.Text == "WCS").First();
            var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "WCS流程字");
            var plcConn = modDevice.PLCUtil;
            var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "140");//开始放货
            var ret = plcConn.SetPlcDBValue(modDevice.PosType, listPlcDevice.DbNumber, modDevice.PlcPos, "160");//放完成
            if (ret.IsSucceed)
            {
                //回传WMS放货信号