`
liudl
2025-01-17 af15096c2336e2916076231af13caa7d92974949
Admin.NET/WCS.Application/Service/WcsDevice/WcsDeviceService.cs
@@ -6,6 +6,7 @@
using System.Drawing.Drawing2D;
using WCS.Application.Entity;
using WCS.Application.Service.WcsDevice.Dto;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinComponentApiGetAuthorizerInfoResponse.Types.Authorizer.Types;
namespace WCS.Application;
@@ -18,7 +19,7 @@
    private readonly SqlSugarRepository<WcsPlc> _wcsPlcRep;
    private readonly SqlSugarRepository<WcsDevice> _wcsDeviceRep;
    private readonly SysCacheService _sysCacheService;
    public WcsDeviceService(SqlSugarRepository<WcsPlc> wcsPlcRep,SqlSugarRepository<WcsDevice> wcsDeviceRep, SysCacheService sysCacheService)
    public WcsDeviceService(SqlSugarRepository<WcsPlc> wcsPlcRep, SqlSugarRepository<WcsDevice> wcsDeviceRep, SysCacheService sysCacheService)
    {
        _wcsPlcRep = wcsPlcRep;
        _wcsDeviceRep = wcsDeviceRep;
@@ -82,7 +83,7 @@
            case "suoding":     // 锁定
                modUtil.SetPlcDBValue(PLCDataTypeEnum.Short, DbNum, "48.0", input.LocatNo);
                break;
            default:
                break;
        }
@@ -115,7 +116,7 @@
                modPlc = plcList.FirstOrDefault(m => m.Text == "1层托盘输送线");
                if (modPlc == null)
                    throw Oops.Bah($"未查询到{input.Layer}楼层PLC信息");
                DbNum = "";
                DbNum = "DB1100";
                break;
            case "2":
                modPlc = plcList.FirstOrDefault(m => m.Text == "2层托盘输送线");
@@ -127,7 +128,7 @@
                modPlc = plcList.FirstOrDefault(m => m.Text == "3层托盘输送线");
                if (modPlc == null)
                    throw Oops.Bah($"未查询到{input.Layer}楼层PLC信息");
                DbNum = "";
                DbNum = "DB1100";
                break;
            default:
                throw Oops.Bah("楼层信息错误");
@@ -168,6 +169,11 @@
        var (result11, value11) = modUtil.GetPlcDBValue(PLCDataTypeEnum.Short, DbNum, "48");
        data.EndCeng = value11.ToString();
        var (result12, value12) = modUtil.GetPlcDBValue(PLCDataTypeEnum.Byte, DbNum, "50");
        data.ChanMo = value12.ToString();
        var (result13, value13) = modUtil.GetPlcDBValue(PLCDataTypeEnum.Byte, DbNum, "51");
        data.ChaiMo = value13.ToString();
        modUtil.Close();
        return data;
    }
@@ -182,50 +188,46 @@
    public async Task WriteInfo(WcsDeviceUpInfo input)
    {
        WcsPlc modPlc;
        string DbNum = "";// DB块
        string DbNum = "DB91";// DB块
        if (string.IsNullOrWhiteSpace(input.LocatNo))//如果工位为空
        {
            throw Oops.Bah("工位不能为空");
        }
        var plcList = await _wcsPlcRep.Context.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.ConveyorLine && s.IsDelete == false).ToListAsync();
        var plcList = await _wcsPlcRep.Context.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.ConveyorLine).ToListAsync();
        switch (input.Layer)
        {
            case "1":
                modPlc = plcList.FirstOrDefault(m=>m.Text == "1层托盘输送线");
                if (modPlc == null)
                    throw Oops.Bah($"未查询到{input.Layer}楼层PLC信息");
                DbNum = "";
                modPlc = plcList.FirstOrDefault(m => m.Text == "1层托盘输送线");
                //DbNum = "";
                break;
            case "2":
                modPlc = plcList.FirstOrDefault(m => m.Text == "2层托盘输送线");
                if (modPlc == null)
                    throw Oops.Bah($"未查询到{input.Layer}楼层PLC信息");
                DbNum = "DB91";
                //DbNum = "DB91";
                break;
            case "3":
                modPlc = plcList.FirstOrDefault(m => m.Text == "3层托盘输送线");
                if (modPlc == null)
                    throw Oops.Bah($"未查询到{input.Layer}楼层PLC信息");
                DbNum = "";
                //DbNum = "";
                break;
            default:
                throw Oops.Bah("楼层信息错误");
        }
        var device = await _wcsDeviceRep.Context.Queryable<WcsDevice>().FirstAsync(s => s.PlcId == modPlc.Id && s.StationNum == input.LocatNo && s.IsDelete == false && s.DeviceType == DeviceTypeEnum.Show);
        if (device == null)
        if (modPlc == null)
            throw Oops.Bah($"未查询到{input.Layer}楼层PLC信息");
        var device = await _wcsDeviceRep.Context.Queryable<WcsDevice>().FirstAsync(s => s.PlcId == modPlc.Id && s.StationNum == input.LocatNo && s.DeviceType == DeviceTypeEnum.Show);
        if (device == null)
        {
            throw Oops.Bah("当前楼层未查询到该工位信息");
        }
        PLCUtil modUtil = new PLCUtil(modPlc);
        // true : 手动模式    false:自动模式
        var (result, value) = modUtil.GetPlcDBValue(PLCDataTypeEnum.Bit, DbNum, "50.4");
        if (result.IsSucceed)
        {
            if (input.TypeName != "shoudong" && value.ToString().ToLower() == "false"  && input.TypeName != "huifu" && input.TypeName != "UpTask" )
            if (input.TypeName != "shoudong" && value.ToString().ToLower() == "false" && input.TypeName != "huifu" && input.TypeName != "UpTask")
            {
                throw Oops.Bah("当前为自动模式,请先切换为手动模式");
            }
@@ -234,7 +236,7 @@
        {
            throw Oops.Bah("读取PLC手自动值失败");
        }
        switch (input.TypeName)
        {
            case "zidong":     // 自动
@@ -258,10 +260,10 @@
                {
                    throw Oops.Bah("事件结果错误");
                }
                break;
            case "1diandong":   // 1点动
                if(input.FuncName == "true")
                if (input.FuncName == "true")
                {
                    modUtil.SetPlcDBValue(PLCDataTypeEnum.Bit, DbNum, "50.7", "true");
                }
@@ -403,11 +405,11 @@
            case "fanzhuansheng":
                if (input.FuncName == "true")
                {
                    modUtil.SetPlcDBValue(PLCDataTypeEnum.Bit, DbNum, "51.7", "true");
                    modUtil.SetPlcDBValue(PLCDataTypeEnum.Bit, DbNum, "59.0", "true");
                }
                else if (input.FuncName == "false")
                {
                    modUtil.SetPlcDBValue(PLCDataTypeEnum.Bit, DbNum, "51.7", "false");
                    modUtil.SetPlcDBValue(PLCDataTypeEnum.Bit, DbNum, "59.0", "false");
                }
                else
                {
@@ -417,11 +419,11 @@
            case "fanzhuanjiang":
                if (input.FuncName == "true")
                {
                    modUtil.SetPlcDBValue(PLCDataTypeEnum.Bit, DbNum, "52.0", "true");
                    modUtil.SetPlcDBValue(PLCDataTypeEnum.Bit, DbNum, "59.1", "true");
                }
                else if (input.FuncName == "false")
                {
                    modUtil.SetPlcDBValue(PLCDataTypeEnum.Bit, DbNum, "52.0", "false");
                    modUtil.SetPlcDBValue(PLCDataTypeEnum.Bit, DbNum, "59.1", "false");
                }
                else
                {
@@ -445,8 +447,8 @@
                {
                    throw Oops.Bah("读取PLC值失败");
                }
                break;
            default:
                break;
@@ -547,7 +549,7 @@
                Thread.Sleep(1000);
                modUtil.SetPlcDBValue(PLCDataTypeEnum.Bit, DbNum, "50.2", "false");
                break;
            default:
                break;
        }
@@ -570,7 +572,7 @@
        WcsPlc modPlc;
        string DbNum = "";// DB块 
        var plcList = await _wcsPlcRep.Context.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.ConveyorLine && s.IsDelete == false).ToListAsync();
        if (input.Layer == "1")
        {
@@ -685,7 +687,7 @@
                    {
                        throw Oops.Bah("事件结果错误");
                    }
                    break;
                    break;
                case "TwoBoxStop":
                    if (input.FuncName == "true")
@@ -717,7 +719,7 @@
        {
            throw Oops.Bah("操作类型信息错误");
        }
    }
    #endregion
@@ -746,6 +748,7 @@
            .WhereIF(input.PlcId > 0, u => u.PlcId == input.PlcId)
            .WhereIF(!string.IsNullOrWhiteSpace(input.StationNum), u => u.StationNum.Contains(input.StationNum.Trim()))
            .WhereIF(!string.IsNullOrWhiteSpace(input.Text), u => u.Text.Contains(input.Text.Trim()))
            .WhereIF(input.DeviceType.HasValue, u => u.DeviceType == input.DeviceType)
            //处理外键和TreeSelector相关字段的连接
            .LeftJoin<WcsPlc>((u, plcid) => u.PlcId == plcid.Id)
            .Select((u, plcid) => new WcsDeviceOutput
@@ -970,7 +973,7 @@
                            (result, var palletNo) = modConn.GetPlcDBValue(modPositionPalletNo.PosType, modDevice.DbNumber, modPositionPalletNo.PlcPos, modPositionPalletNo.StringLength);
                            modDevice.PalletNo = Convert.ToString(palletNo);
                            Console.WriteLine(modDevice.DbNumber + "." + modPositionPalletNo.PlcPos + "----------");
                        }
                        }
                        if (cachePlc.Type == PLCTypeEnum.ConveyorLine || cachePlc.Type == PLCTypeEnum.StackingMachine)
                        {
                            //放货排
@@ -1015,11 +1018,11 @@
                                (result, var pickStorey) = modConn.GetPlcDBValue(modPositionPickStorey.PosType, modDevice.DbNumber, modPositionPickStorey.PlcPos);
                                modDevice.PickStorey = Convert.ToInt32(pickStorey);
                            }
                            if (cachePlc.Type == PLCTypeEnum.StackingMachine)
                            {
                                //跺机的起始工位用取货排列层
                                modDevice.StartLocatNo = $"{modDevice.PickRow.ToString().PadLeft(2,'0')}{modDevice.PickCol.ToString().PadLeft(2, '0')}{modDevice.PickStorey.ToString().PadLeft(2, '0')}";
                                modDevice.StartLocatNo = $"{modDevice.PickRow.ToString().PadLeft(2, '0')}{modDevice.PickCol.ToString().PadLeft(2, '0')}{modDevice.PickStorey.ToString().PadLeft(2, '0')}";
                                //跺机的目的工位用放货排列层
                                modDevice.EndLocatNo = $"{modDevice.ReleaseRow.ToString().PadLeft(2, '0')}{modDevice.ReleaseCol.ToString().PadLeft(2, '0')}{modDevice.ReleaseStorey.ToString().PadLeft(2, '0')}";
                            }
@@ -1157,7 +1160,7 @@
                var modPositionEndLocatNo = listPosition.FirstOrDefault(s => s.Text == "目的工位");
                if (modPositionEndLocatNo != null)
                    result = modUtil.SetPlcDBValue(modPositionEndLocatNo.PosType, modDbDevice.DbNumber, modPositionEndLocatNo.PlcPos, modDevice.EndLocatNo.ToString());
            }
            }
        }
        //托盘码
        if (modDevice.PalletNo != null)
@@ -1237,7 +1240,7 @@
    public async Task<dynamic> WcsPackPlcList()
    {
        return await _wcsDeviceRep.Context.Queryable<WcsPlc>()
                .Where(w => w.Type == PLCTypeEnum.RobotPalletizer || w.Type == PLCTypeEnum.StackingRobot)
                .Where(w => w.Type == PLCTypeEnum.RobotPalletizer /*|| w.Type == PLCTypeEnum.StackingRobot*/)
                .OrderByDescending(o => o.Type)
                .Select(u => new
                {
@@ -1282,7 +1285,7 @@
                    PZNo = task.PZNo,
                    Qty = task.Qty,
                    PlcId=device.PlcId,
                    PlcId = device.PlcId,
                    Type = plc.Type
                })
                .ToListAsync();
@@ -1294,7 +1297,62 @@
        if (modUtil.Connected)
        {
            connStatus = true;
        }
        }
        foreach (var item in list)
        {
            item.PlcStatus = connStatus;
        }
        return list;
    }
    /// <summary>
    /// 获取设备对应工位列表
    /// </summary>
    /// <param name="entry"></param>
    /// <returns></returns>
    [HttpGet]
    [ApiDescriptionSettings(Name = "WcsStackingRobotList")]
    [DisplayName("获取设备对应工位列表")]
    public async Task<List<WcsDeviceTaskOrderDto>> WcsStackingRobotList()
    {
        //var list = await _wcsDeviceRep.AsQueryable()
        //                            .LeftJoin<WcsPlc>((a, b) => a.PlcId == b.Id)
        //                            .Where((a, b) => a.DeviceType == DeviceTypeEnum.Business)
        //                            .Select<WcsDeviceOutput>((a, b) => new WcsDeviceOutput() { Type = b.Type }, true)
        //                            .ToListAsync();
        var list = await _wcsDeviceRep.Context.Queryable<WcsCheckTask>()
                .LeftJoin<WcsDevice>((task, device) => device.StationNum == task.Port)
                .InnerJoin<WcsPlc>((task, device, plc) => device.PlcId == plc.Id)
                .Where((task, device, plc) => task.Id <= 3)
                .OrderBy((task, device, plc) => device.CreateTime)
                .Select((task, device, plc) => new WcsDeviceTaskOrderDto()
                {
                    Id = device.Id,
                    TaskId = task.Id,
                    Text = task.Id.ToString() + "号出库分拣线",
                    TaskNo = task.TaskNo,
                    OrderNo = task.OrderNo,
                    LotNo = task.LotNo,
                    SkuNo = task.SkuNo,
                    SkuName = task.SkuName,
                    LineNo = task.LineNo,
                    Status = task.Status,
                    PZNo = task.PZNo,
                    Qty = task.Qty,
                    PlcId = device.PlcId,
                    Type = plc.Type
                })
                .ToListAsync();
        bool connStatus = false;
        //获取设备的状态
        var modPlc = await _wcsDeviceRep.Context.Queryable<WcsPlc>().FirstAsync(s => s.Id == list[0].PlcId);
        PLCUtil modUtil = new PLCUtil(modPlc);
        if (modUtil.Connected)
        {
            connStatus = true;
        }
        foreach (var item in list)
        {
            item.PlcStatus = connStatus;