liudl
2025-03-13 b71144811c970ddb7296f5243f722ec6b00cf805
Admin.NET/WCS.Application/OpenApi/DemoOpenApi.cs
@@ -1,4 +1,7 @@
using DocumentFormat.OpenXml.Presentation;
using Dm.filter;
using DocumentFormat.OpenXml.Drawing.Charts;
using DocumentFormat.OpenXml.Office.CustomUI;
using DocumentFormat.OpenXml.Presentation;
using Elastic.Clients.Elasticsearch;
using Furion.Logging;
using Newtonsoft.Json;
@@ -145,7 +148,7 @@
    }
    /// <summary>
    /// WCS接收WMS下发的入库单任务
    /// WCS接收WMS下发的出入库单任务
    /// </summary>
    /// <param name="models"></param>
    /// <returns></returns>
@@ -158,12 +161,17 @@
        {
            foreach (var item in models)
            {
                string str = JsonConvert.SerializeObject(models);
                Log.Information("接收WMS推送的箱码信息:" + str);
                // 验证任务是否已存在
                //var taskInfo = _db.Queryable<WcsOderTask>().First(w => w.OrderNo == item.OrderNo && w.SkuNo == item.SkuNo && w.LotNo == item.LotNo);
                //if (taskInfo == null)
                //{
                    var orderAdd = new WcsOderTask()
                //var taskid = _db.Queryable<WcsOderTask>().OrderByDescending(w=>w.CreateTime).First();
                //int newid = (int)taskid.Id + 1;
                var orderAdd = new WcsOderTask()
                    {
                        OrderNo = item.OrderNo,
                        TaskNo = "",
                        LotNo = item.LotNo,
@@ -172,6 +180,8 @@
                        BoxType = item.BoxType,
                        Qty = item.Qty,
                        TaskType = (TaskTypeEnum)item.TaskType,
                        CreateTime = DateTime.Now,
                        Status = TaskStatusEnum.Wait,
                    };
                    _db.Insertable(orderAdd).ExecuteCommand();
               //}
@@ -262,6 +272,7 @@
                        SkuName = models.SkuName,
                        Standard = models.Standard,
                        LotNo = models.LotNo,
                        LineNo = models.LineNo,                 // 产线号或产线名称
                        Qty = item2.Qty,
                        FullQty = models.FullQty,
                        //SupplierLot = models.SupplierLot,
@@ -277,7 +288,7 @@
                        BoxNo3 = item2.BoxNo3,
                        QtyCount = item2.QtyCount,
                        QtyOrd = item2.QtyOrd,
                        Status = "0",
                        Level = level,
@@ -340,4 +351,301 @@
        }
    }
    /// <summary>
    /// WCS接受赋码系统推送的结批总数量
    /// </summary>
    /// <param name="models">结批数量信息</param>
    /// <returns>反馈信息</returns>
    [HttpPost]
    [AllowAnonymous]
    public ResponseFuMaModel HttpTotalNum(FumaJiepiModel models)
    {
        try
        {
            string str = JsonConvert.SerializeObject(models);
            Log.Information("接收赋码推送的完工结批总数量:" + str);
            //查看赋码下发的任务信息是否正在分拣
            var num = _db.Queryable<WcsCheckTask>().Where(m => m.SkuNo == models.SkuNo &&m.LotNo == models.LotNo && m.Status == "1").ToList();
            if (num.Count < 1)
            {
                return new ResponseFuMaModel() { Success = "-1", Message = "该批次未进行分拣或已结批" };
            }
            //获取包装数量
            int Fqty = int.Parse(models.FinishQty);
            int bzQty = 0;
            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);
                bzQty = (int)boxinfo.QtyCount;
            }
            else
            {
                Fqty = (int)(Fqty / boxinfolog.QtyCount);
                bzQty = (int)boxinfolog.QtyCount;
            }
            int Jpqty = 0;
            //写入该任务完成数量
            foreach (var item in num)
            {
                item.FinishQty = Fqty;
                //判断当前单据码垛数量是否和完工数量相等,是则结批该单据
                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 (checkNum.First().Qty != 0)//有支码
                    {
                        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.SkuNo == models.SkuNo && m.LotNo == models.LotNo && m.OrderCode == item.OrderNo).ToList();//箱码表已码垛箱码信息
                if (checkNum2.Count>0)
                {
                    if (checkNum2.First().Qty != 0)//有支码
                    {
                        foreach (var item2 in checkNum)
                        {
                            Jpqty = (int)(Jpqty + item2.Qty);
                        }
                    }
                    else//无支码
                    {
                        foreach (var item2 in checkNum)
                        {
                            Jpqty = (int)(Jpqty + item2.QtyCount);
                        }
                    }
                }
                if (Jpqty/bzQty == 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);
                    //获取工位点位信息
                    var portno = item.Port;
                    var modDevice = _db.Queryable<WcsPosition>().Where(s => s.StationNum == portno).First();
                    var listPlcDevice = _db.Queryable<WcsDevice>().Where(s => s.StationNum == portno && s.Text.Contains("2楼")).First();
                    var ret = plcConn.SetPlcDBValue(modDevice.PosType, listPlcDevice.DbNumber, modDevice.PlcPos, "1");//写入开始结批信号
                    if (ret.IsSucceed)
                    {
                        item.Status = "2";//结批中
                    }
                    else { throw new Exception("完工结批信号下发给PLC错误"); }
                }
                _db.Updateable(item).ExecuteCommand();
                return new ResponseFuMaModel() { Success = "0", Message = "接受完工结批数量成功" };
            }
            return new ResponseFuMaModel() { Success = "0", Message = "接受完工结批数量成功" };
        }
        catch (Exception ex)
        {
            return new ResponseFuMaModel() { Success = "-1", Message = ex.Message };
        }
    }
    /// <summary>
    /// WCS接受WMS入库放货确认接口
    /// </summary>
    /// <param name="models"></param>
    /// <returns>反馈信息</returns>
    [HttpPost]
    [AllowAnonymous]
    public IsBaleModel2 HttpInConfirm(PortModel models)
    {
        try
        {
            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
            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")
            {
                //读取成功后写入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可放信号
                    return new IsBaleModel2() { Success = 0, Message = "接受成功" };
                }
            }
            return new IsBaleModel2() { Success = -1, Message = "读取PLC点位信息失败" };
        }
        catch (Exception ex)
        {
            return new IsBaleModel2() { Success = -1, Message = ex.Message };
        }
    }
    /// <summary>
    /// WCS接受WMS入库放货请求接口
    /// </summary>
    /// <param name="models"></param>
    /// <returns>反馈信息</returns>
    [HttpPost]
    [AllowAnonymous]
    public IsBaleModel2 HttpInRequest(PortRequestModel models)
    {
        try
        {
            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;
            }
            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 == "任务号").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放货信号
                return new IsBaleModel2() { Success = 0, Message = "接受成功" };
            }
            return new IsBaleModel2() { Success = -1, Message = "读取PLC点位信息失败" };
        }
        catch (Exception ex)
        {
            return new IsBaleModel2() { Success = -1, Message = ex.Message };
        }
    }
    /// <summary>
    /// WCS接受WMS小车放完成接口
    /// </summary>
    /// <param name="models"></param>
    /// <returns>反馈信息</returns>
    [HttpPost]
    [AllowAnonymous]
    public IsBaleModel2 HttpInFinish(PortModel models)
    {
        try
        {
            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;
            }
            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 == "WCS").First();
            var ret = plcConn.SetPlcDBValue(modDevice.PosType, listPlcDevice.DbNumber, modDevice.PlcPos, "160");//放完成
            if (ret.IsSucceed)
            {
                //回传WMS放货信号
                return new IsBaleModel2() { Success = 0, Message = "接受成功" };
            }
            return new IsBaleModel2() { Success = -1, Message = "读取PLC点位信息失败" };
        }
        catch (Exception ex)
        {
            return new IsBaleModel2() { Success = -1, Message = ex.Message };
        }
    }
}