DESKTOP-9BNTV8O
2025-03-11 3b87f36219202b4cec47840bd9f56fdbe53e7d04
Admin.NET/WCS.Application/OpenApi/DemoOpenApi.cs
@@ -1,4 +1,10 @@
using Elastic.Clients.Elasticsearch;
using AngleSharp.Io;
using COSXML.Network;
using Elastic.Clients.Elasticsearch;
using Elastic.Clients.Elasticsearch.Inference;
using Furion.Logging;
using NewLife.Http;
using Newtonsoft.Json;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
@@ -30,7 +36,7 @@
    //}
    // <summary>
    /// WCS接受WMS下发的任务(单条任务)
    /// WCS接受WMS下发的任务
    /// </summary>
    /// <param name="models">任务信息</param>
    /// <returns>反馈信息</returns>
@@ -89,19 +95,21 @@
            {
                models.Order = 2;
            }
            //新增任务
            int aaa = int.Parse(models.TaskType);
            var taskAdd = new WcsTask()
            {
                TaskNo = models.TaskNo,
                TaskType = TaskTypeEnum.Out,
                TaskType = (TaskTypeEnum)aaa,
                Status = TaskStatusEnum.Wait,
                //IsSuccess =TaskSuccessEnum.Success,
                Origin = "WMS",
                StartRoadway= models.StartRoadway,
                StartRoadway = models.StartRoadway,
                StartLocate = models.StartLocate,
                EndLocate = models.EndLocate,
                EndRoadway= models.EndRoadway,
                EndRoadway = models.EndRoadway,
                PalletNo = models.PalletNo,
                Levels = 999
                //LotNo =models.LotNo,
                //SkuNo=models.SkuNo,
@@ -137,14 +145,15 @@
                //{
                    var orderAdd = new WcsOderTask()
                    {
                        OrderNo = item.OrderNo,
                        OrderNo = item.OrderNo.Trim(),
                        TaskNo = "",
                        LotNo = item.LotNo,
                        SkuNo = item.SkuNo,
                        SkuName = item.SkuName,
                        LotNo = item.LotNo.Trim(),
                        SkuNo = item.SkuNo.Trim(),
                        SkuName = item.SkuName.Trim(),
                        BoxType = item.BoxType,
                        Qty = item.Qty,
                        TaskType = (TaskTypeEnum)item.TaskType,
                        Status=TaskStatusEnum.Wait
                    };
                    _db.Insertable(orderAdd).ExecuteCommand();
               //}
@@ -157,4 +166,198 @@
        }
    }
    /// <summary>
    /// 获取空托盘垛申请入库工位
    /// </summary>
    /// <returns></returns>
    [AllowAnonymous]
    [HttpPost]
    public ResponseModel GetNullPalletRukuStation()
    {
        try
        {
            string rukuAdress = "";
            var conveyList4 = new List<string>() { "266", "265" };//四楼入库工位
            foreach (var item in conveyList4)
            {
                // 根据目标工位号获取输送线链接
                var plcCconn = PLCCommon.GetPlcIp(item);
                // 读取目标工位当前状态
                var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == item && m.DeviceType == DeviceTypeEnum.Business);
                var (result, value) = plcCconn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.PlcPos);
                if (result.IsSucceed)
                {
                    if (value.ToString() == "120")//空闲状态
                    {
                        // 判断该工位是否存在未完成的出库任务
                        var modInTask = _db.Queryable<WcsTask>().OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime, OrderByType.Asc)
                            .First(s => (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.TaskType == TaskTypeEnum.Out && s.EndLocate == item);
                        if (modInTask == null)
                        {
                            // 若空闲并没有未完成的出库任务提前占用此工位
                            var ret = plcCconn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "130");
                            if (ret.IsSucceed)
                            {
                                rukuAdress = item;
                                break;
                            }
                        }
                    }
                }
            }
            if (!string.IsNullOrEmpty(rukuAdress))
            {
                return new ResponseModel() { StatusCode = 0, Msg = rukuAdress };
            }
            else
            {
                return new ResponseModel() { StatusCode = -1, Msg = "无空闲入库工位" };
            }
        }
        catch (Exception ex)
        {
            return new ResponseModel() { StatusCode = -1, Msg = ex.Message };
        }
    }
    /// <summary>
    /// 小车入库口放货完成,WMS调用WCS更改PLC
    /// </summary>
    /// <param name="StationNum"></param>
    /// <returns></returns>
    [AllowAnonymous]
    [HttpPost]
    public ResponseModel UpdatePlcPosAgvTaskFinsh(AgvTaskFinshModel model)
    {
        try
        {
            var conveyList4 = new List<string>() { "266", "265" };//四楼入库工位
            if (!conveyList4.Contains(model.StationNum))
            {
                return new ResponseModel() { StatusCode = -1, Msg = "工位号无效" };
            }
            // 根据目标工位号获取输送线链接
            var plcCconn = PLCCommon.GetPlcIp(model.StationNum);
            // 读取目标工位当前状态
            var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == model.StationNum && m.DeviceType == DeviceTypeEnum.Business);
            var (result, value) = plcCconn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.PlcPos);
            if (result.IsSucceed)
            {
                if (value.ToString() != "150")//空闲状态
                {
                    return new ResponseModel() { StatusCode = -1, Msg = "工位号PLC状态异常" };
                }
                // 写入160,放货完成
                var ret = plcCconn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "160");
                if (ret.IsSucceed)
                {
                    return new ResponseModel() { StatusCode = 0, Msg = "成功" };
                }
                else
                {
                    return new ResponseModel() { StatusCode = -1, Msg = "写入PLC失败" };
                }
            }
            else
            {
                return new ResponseModel() { StatusCode = -1, Msg = "连接PLC失败" };
            }
        }
        catch (Exception ex)
        {
            return new ResponseModel() { StatusCode = -1, Msg = ex.Message };
        }
    }
    /// <summary>
    /// WCS接受赋码系统推送的箱码信息
    /// </summary>
    /// <param name="models">箱码信息</param>
    /// <returns>反馈信息</returns>
    [HttpPost("AddHttpBoxInfo")]
    [AllowAnonymous]
    public ResponseFuMaModel AddHttpBoxInfo(FumaBoxModel models)
    {
        try
        {
            string str = JsonConvert.SerializeObject(models);
            Log.Information("接收赋码推送的箱码信息:" + str);
            var num = _db.Queryable<WcsBoxInfo>().Where(m => m.BoxNo == models.Product.BoxNo && m.IsDelete == false).ToList();
            var type = "add";
            if (num.Count > 0)
            {
                //WCS存在箱码信息,更新箱码信息(需判断箱码是否已组盘入库)
                var num2 = num.Count(m => m.Status != "0" || !string.IsNullOrWhiteSpace(m.PalletNo));
                if (num2 > 0)
                {
                    throw new Exception("该箱已入盘入库,不可更新信息");
                }
                type = "edit";
            }
            if (models.Product.Barcodes.Count == 0)
            {
                throw new Exception("盒码集合不能为空");
            }
            var listBox = new List<WcsBoxInfo>();
            foreach (var item in models.Product.Barcodes)
            {
                if (string.IsNullOrWhiteSpace(models.Product.ProductionTime) || string.IsNullOrWhiteSpace(models.Product.ExpirationTime))
                {
                    throw new Exception("生产日期或过期日期不能为空");
                }
                DateTime proTime;
                DateTime expTime;
                var isValid = DateTime.TryParse(models.Product.ProductionTime, out proTime);
                var isValid2 = DateTime.TryParse(models.Product.ExpirationTime, out expTime);
                if (!isValid || !isValid2)
                {
                    throw new Exception("生产日期或失效日期格式错误");
                };
                var boxAdd = new WcsBoxInfo()
                {
                    SkuNo = models.Product.SkuNo,
                    SkuName = models.Product.SkuName,
                    LotNo = models.Product.LotNo,
                    LotText = models.Product.LotText,
                    Custom = models.Product.Custom,
                    CustomName = models.Product.CustomName,
                    ProductionTime = proTime,
                    ExpirationTime = expTime,
                    LineNo=models.Product.Line_No,
                    Standard = models.Product.Standard,
                    PackageStandard = models.Product.PackageStandard,
                    PackUnit = models.Product.PackUnit,
                    StoreTime = DateTime.Parse(models.Product.StoreTime),
                    BitBoxMark = models.Product.BitBoxMark,
                    BoxNo = models.Product.BoxNo,
                    Qty = 1,//数量
                    FullQty = 0,//整箱数量
                    InsPectMark = models.Product.InsPectMark,//抽检标记
                    BoxNo2 = item.BoxNo2,
                    BoxNo3 = "",
                    Level = item.Level,
                    EndLotFlag = string.IsNullOrWhiteSpace(models.Product.BitBoxMark) ? "0" : models.Product.BitBoxMark,//结批标识
                    QtyCount = 0,//总件数
                    QtyOrd = 0,//第几件
                    Status = "0",
                    IsDelete = false
                };
                listBox.Add(boxAdd);
            }
            _db.Insertable(listBox).ExecuteCommand();
            if (type == "edit")
            {
                _db.Deleteable(num).ExecuteCommand();
            }
            return new ResponseFuMaModel() { Success = true, Message = "ok" };
        }
        catch (Exception ex)
        {
            return new ResponseFuMaModel() { Success = false, Message = ex.Message };
        }
    }
}