lss
2025-05-16 23b4700a5a8555684de58b5d80ff06ae387432f2
流程开发
1个文件已添加
7个文件已修改
379 ■■■■ 已修改文件
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/HH.WCS.DaYang.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/api/ApiHelper.cs 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/api/ApiModel.cs 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/api/WmsController.cs 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/core/WCSCore.cs 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/models/EquipmentStatus.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/wms/LocationHelper.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/wms/WCSHelper.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/HH.WCS.DaYang.csproj
@@ -188,6 +188,7 @@
    <Compile Include="core\Monitor.cs" />
    <Compile Include="models\BaseModel.cs" />
    <Compile Include="models\Area.cs" />
    <Compile Include="models\EquipmentStatus.cs" />
    <Compile Include="models\CntrItem.cs" />
    <Compile Include="models\CntrItemDetail.cs" />
    <Compile Include="models\OI_WMS_OP_DEF.cs" />
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/api/ApiHelper.cs
@@ -140,7 +140,7 @@
            return result;
        }
        private static object lockObj = new object();
        /// <summary>
@@ -268,7 +268,7 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal static Result EquipmentInfo(EquipmentInfoModel model)
        internal static Result NotifyDeviceSignal(NotifyDeviceSignalModel model)
        {
            Result result = new Result { resultCode = 0, resultMsg = "创建成功" };
            if (model == null)
@@ -282,28 +282,29 @@
            string cntrcode = model.CntrNo;
            var db = new SqlHelper<object>().GetInstance();
            if (model.DeviceNo=="1")//叠盘机
            if (model.DeviceNo == "1")//叠盘机
            {
            }
            else //入库空
            {
                #region 获取起点信息
                //根据托盘获取起点信息
                var CntrLoc = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == cntrcode).First();
                if (CntrLoc == null)
                #region 获取起点信息,并判断空托是否叠满
                //根据起点 获取绑定托盘数量
                var CntrLoc = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == model.Loc).ToList();
                if (CntrLoc.Count < 4)
                {
                    result.resultCode = -1;
                    result.resultMsg = $"根据托盘:{cntrcode}未找到绑定托盘";
                    LogHelper.Info($"creattask:根据托盘:{cntrcode}未找到绑定托盘");
                    result.resultMsg = $"根据货位:{model.Loc}获取托盘数量小于4";
                    LogHelper.Info($"EquipmentInfo:根据货位:{model.Loc}获取托盘数量小于4");
                    return result;
                }
                startloc = LocationHelper.GetLoc(CntrLoc.S_LOC_CODE);
                else
                {
                    //拼接托盘号
                    cntrcode = CntrLoc.Select(a => a.S_CNTR_CODE).ToString();
                }
                startloc = LocationHelper.GetLoc(model.Loc);
                if (startloc == null)
                {
                    result.resultCode = -1;
                    result.resultMsg = $"根据起点:{CntrLoc.S_LOC_CODE}未找到货位信息";
                    LogHelper.Info($"creattask:根据起点:{CntrLoc.S_LOC_CODE}未找到货位信息");
                    result.resultMsg = $"根据起点:{model.Loc}未找到货位信息";
                    LogHelper.Info($"EquipmentInfo:根据起点:{model.Loc}未找到货位信息");
                    return result;
                }
@@ -315,9 +316,10 @@
                {
                    result.resultCode = -1;
                    result.resultMsg = $"未计算到立库终点货位,请检查货位情况";
                    LogHelper.Info($"creattask:未计算到立库终点货位,请检查货位情况");
                    LogHelper.Info($"EquipmentInfo:未计算到立库终点货位,请检查货位情况");
                    return result;
                }
                #endregion
                #region 创建任务
@@ -347,6 +349,148 @@
                }
                #endregion
            }
            else //入库空
            {
                //入库口申请入库
                if (model.SignalType == 1)
                {
                    #region 获取起点信息
                    //根据托盘获取起点信息
                    var CntrLoc = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == cntrcode).First();
                    if (CntrLoc == null)
                    {
                        result.resultCode = -1;
                        result.resultMsg = $"根据托盘:{cntrcode}未找到绑定托盘";
                        LogHelper.Info($"EquipmentInfo:根据托盘:{cntrcode}未找到绑定托盘");
                        return result;
                    }
                    startloc = LocationHelper.GetLoc(CntrLoc.S_LOC_CODE);
                    if (startloc == null)
                    {
                        result.resultCode = -1;
                        result.resultMsg = $"根据起点:{CntrLoc.S_LOC_CODE}未找到货位信息";
                        LogHelper.Info($"EquipmentInfo:根据起点:{CntrLoc.S_LOC_CODE}未找到货位信息");
                        return result;
                    }
                    #endregion
                    #region 计算立库终点
                    endloc = LocationHelper.InStorage(startloc);
                    if (endloc == null)
                    {
                        result.resultCode = -1;
                        result.resultMsg = $"未计算到立库终点货位,请检查货位情况";
                        LogHelper.Info($"EquipmentInfo:未计算到立库终点货位,请检查货位情况");
                        return result;
                    }
                    #endregion
                    #region 创建任务
                    if (startloc != null && endloc != null)
                    {
                        var wcsTask = new WCSTask
                        {
                            S_CODE = WCSHelper.GenerateTaskNo(),
                            S_TYPE = "入库",
                            S_START_LOC = startloc.S_CODE,
                            S_END_LOC = endloc.S_CODE,
                            S_START_WH = startloc.S_WH_CODE,
                            S_START_AREA = startloc.S_AREA_CODE,
                            S_END_WH = endloc.S_WH_CODE,
                            S_END_AREA = endloc.S_AREA_CODE,
                            N_CNTR_COUNT = 1,
                            N_SCHEDULE_TYPE = 2,
                            S_CNTR_CODE = cntrcode
                        };
                        LogHelper.Info("创建入平库任务:" + JsonConvert.SerializeObject(wcsTask));
                        if (WCSHelper.CreateTask(wcsTask))
                        {
                            LocationHelper.LockLoc(startloc.S_CODE, 2);
                            LocationHelper.LockLoc(endloc.S_CODE, 1);
                            LogHelper.Info("创建任务成功");
                        }
                    }
                    #endregion
                }
                //入库空申请叠盘
                else
                {
                    //判断设备状态是否属于叠盘状态
                    var DeviceStatu = db.Queryable<EquipmentStatus>().Where(a => a.deviceNo == model.DeviceNo).First();
                    if (DeviceStatu != null && DeviceStatu.Status == "1")
                    {
                        #region 获取起点信息
                        //根据托盘获取起点信息
                        var CntrLoc = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == cntrcode).First();
                        if (CntrLoc == null)
                        {
                            result.resultCode = -1;
                            result.resultMsg = $"根据托盘:{cntrcode}未找到绑定托盘";
                            LogHelper.Info($"EquipmentInfo:根据托盘:{cntrcode}未找到绑定托盘");
                            return result;
                        }
                        startloc = LocationHelper.GetLoc(CntrLoc.S_LOC_CODE);
                        if (startloc == null)
                        {
                            result.resultCode = -1;
                            result.resultMsg = $"根据起点:{CntrLoc.S_LOC_CODE}未找到货位信息";
                            LogHelper.Info($"EquipmentInfo:根据起点:{CntrLoc.S_LOC_CODE}未找到货位信息");
                            return result;
                        }
                        #endregion
                        #region 获取终点信息
                        string DiePanLoc = "";
                        //根据托盘获取起点信息
                        endloc = db.Queryable<Location>().Where(a => a.S_CODE == DiePanLoc).First();
                        if (endloc == null)
                        {
                            result.resultCode = -1;
                            result.resultMsg = $"根据货位编码:{DiePanLoc}未找到叠盘货位";
                            LogHelper.Info($"EquipmentInfo:根据货位编码:{DiePanLoc}未找到叠盘货位");
                            return result;
                        }
                        #endregion
                        #region 创建任务
                        if (startloc != null && endloc != null)
                        {
                            var wcsTask = new WCSTask
                            {
                                S_CODE = WCSHelper.GenerateTaskNo(),
                                S_TYPE = "入库",
                                S_START_LOC = startloc.S_CODE,
                                S_END_LOC = endloc.S_CODE,
                                S_START_WH = startloc.S_WH_CODE,
                                S_START_AREA = startloc.S_AREA_CODE,
                                S_END_WH = endloc.S_WH_CODE,
                                S_END_AREA = endloc.S_AREA_CODE,
                                N_CNTR_COUNT = 1,
                                N_SCHEDULE_TYPE = 2,
                                S_CNTR_CODE = cntrcode
                            };
                            LogHelper.Info("创建入平库任务:" + JsonConvert.SerializeObject(wcsTask));
                            if (WCSHelper.CreateTask(wcsTask))
                            {
                                LocationHelper.LockLoc(startloc.S_CODE, 2);
                                LocationHelper.LockLoc(endloc.S_CODE, 1);
                                LogHelper.Info("创建任务成功");
                            }
                        }
                        #endregion
                    }
                    else
                    {
                        result.resultCode = -1;
                        result.resultMsg = $"当前叠盘机状态不属于叠盘状态,不允许空托叠托";
                        LogHelper.Info($"EquipmentInfo:当前叠盘机状态不属于叠盘状态,不允许空托叠托");
                        return result;
                    }
                }
            }
            return result;
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/api/ApiModel.cs
@@ -256,19 +256,81 @@
        /// <summary>
        /// 设备信号反馈
        /// </summary>
        public partial class PutInModel
        public partial class NotifyDeviceSignalModel
        {
            /// <summary>
            /// 起点
            /// 托盘号,可空,多个托盘号可以拼接
            /// </summary>
            public string startBit { get; set; }
            [JsonProperty("cntrNo")]
            public string CntrNo { get; set; }
            /// <summary>
            /// 设备编号
            /// </summary>
            [JsonProperty("deviceNo")]
            public string DeviceNo { get; set; }
            [JsonProperty("extData")]
            public Dictionary<string, object>[] ExtData { get; set; }
            /// <summary>
            /// 货位,上料点、下料点、读码位、称重位
            /// </summary>
            [JsonProperty("loc")]
            public string Loc { get; set; }
            /// <summary>
            /// 请求类型,1:入库申请
            /// </summary>
            [JsonProperty("signalType")]
            public int SignalType { get; set; }
        }
        /// <summary>
        /// 任务状态反馈
        /// </summary>
        public partial class NotifyTaskStatusModel
        {
            /// <summary>
            /// 设备号
            /// </summary>
            [JsonProperty("deviceNo")]
            public string DeviceNo { get; set; }
            /// <summary>
            /// 异常代码,主要是针对各种异常取消的描述
            /// </summary>
            [JsonProperty("errCode")]
            public int ErrCode { get; set; }
            /// <summary>
            /// 当前托盘位置
            /// </summary>
            [JsonProperty("loc")]
            public string Loc { get; set; }
            /// <summary>
            /// 任务状态,1:开始/执行中;2:完成;3:准备取货;4:取货完成;5:准备卸货;6:卸货完成;7:异常取消;8:强制完成
            /// </summary>
            [JsonProperty("status")]
            public int Status { get; set; }
            /// <summary>
            /// wcs的子任务号,如果wcs任务拆分了,可以一起上报子任务号,方便日志追踪
            /// </summary>
            [JsonProperty("subTaskNo")]
            public string SubTaskNo { get; set; }
            /// <summary>
            /// 任务号
            /// </summary>
            [JsonProperty("taskNo")]
            public string TaskNo { get; set; }
        }
        #endregion
        #region 大洋立库接口接收返回参数
        /// <summary>
        /// 设备信息返回
        /// </summary>
@@ -318,38 +380,7 @@
            [JsonProperty("workStatus")]
            public int WorkStatus { get; set; }
        }
        /// <summary>
        /// 设备信号反馈
        /// </summary>
        public partial class EquipmentInfoModel
        {
            /// <summary>
            /// 托盘号,可空,多个托盘号可以拼接
            /// </summary>
            [JsonProperty("cntrNo")]
            public string CntrNo { get; set; }
            /// <summary>
            /// 设备编号
            /// </summary>
            [JsonProperty("deviceNo")]
            public string DeviceNo { get; set; }
            [JsonProperty("extData")]
            public Dictionary<string, object>[] ExtData { get; set; }
            /// <summary>
            /// 货位,上料点、下料点、读码位、称重位
            /// </summary>
            [JsonProperty("loc")]
            public string Loc { get; set; }
            /// <summary>
            /// 请求类型,1:入库申请
            /// </summary>
            [JsonProperty("signalType")]
            public long SignalType { get; set; }
        }
        public partial class Empty
        {
         
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/api/WmsController.cs
@@ -1,4 +1,5 @@

using HH.WCS.DaYang.core;
using Newtonsoft.Json;
using System.Web.Http;
using static HH.WCS.DaYang.api.ApiHelper;
@@ -35,13 +36,25 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public Result EquipmentInfo(EquipmentInfoModel model)
        public Result notifyDeviceSignal(NotifyDeviceSignalModel model)
        {
            Result result = new Result();
            LogHelper.Info("EquipmentInfo 接收:" + JsonConvert.SerializeObject(model), "EquipmentInfo");
            result = ApiHelper.EquipmentInfo(model);
            LogHelper.Info("EquipmentInfo 返回:" + JsonConvert.SerializeObject(result), "EquipmentInfo");
            LogHelper.Info("notifyDeviceSignal 接收:" + JsonConvert.SerializeObject(model), "EquipmentInfo");
            result = ApiHelper.NotifyDeviceSignal(model);
            LogHelper.Info("notifyDeviceSignal 返回:" + JsonConvert.SerializeObject(result), "EquipmentInfo");
            return result;
        }
        /// <summary>
        /// 任务状态反馈
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ReturnResult notifyTaskStatus(NotifyTaskStatusModel model)
        {
            LogHelper.Info("AGVCallbackState Request:" + JsonConvert.SerializeObject(model), "HosttoagvTask");
            WCSCore.NotifyTaskStatus(model);
            return new ReturnResult();
        }
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/core/WCSCore.cs
@@ -65,7 +65,7 @@
                                WCSHelper.Fail(TN_Task);
                                break;
                        }
                        WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData);
                        WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData,"agv");
                        //调用第三方接口(如果有)TaskProcess.ReportStatus
                    }
                    else
@@ -80,6 +80,52 @@
            }
        }
        public static void NotifyTaskStatus(NotifyTaskStatusModel model)
        {
                var TN_Task = WCSHelper.GetTask(model.TaskNo);
                if (TN_Task != null)
                {
                    if (model.Status <= 7)
                    {
                        //有任务号请求
                        switch (model.Status)
                        {
                            case 1:
                                WCSHelper.Begin(TN_Task);
                                break;
                            #region MyRegion
                            case 3:
                                WCSHelper.UpdateStatus(TN_Task, "开始取货");
                                break;
                            case 4:
                                WCSHelper.UpdateStatus(TN_Task, "取货完成");
                                TaskProcess.OperateStatus(TN_Task, 4);
                                break;
                            case 5:
                                WCSHelper.UpdateStatus(TN_Task, "开始卸货");
                                break;
                            case 6:
                                WCSHelper.UpdateStatus(TN_Task, "卸货完成");
                                TaskProcess.OperateStatus(TN_Task, 6);
                                break;
                            #endregion
                            case 2:
                                WCSHelper.End(TN_Task);
                                break;
                            case 7:
                                TaskProcess.OperateStatus(TN_Task, 7);
                                WCSHelper.Fail(TN_Task);
                                break;
                        }
                        WCSHelper.AddActionRecord(model.TaskNo, model.Status,"","","wcs");
                        //调用第三方接口(如果有)TaskProcess.ReportStatus
                    }
                }
        }
        /// <summary>
        /// 任务分发,根据调度类型发给不同的调度系统
        /// </summary>
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/models/EquipmentStatus.cs
New file
@@ -0,0 +1,22 @@
using HH.WCS.DaYang.models;
using SqlSugar;
using System;
namespace HH.WCS.DaYang
{
    [SugarTable("TN_EquipmentStatus")]
    public class EquipmentStatus : BaseModel
    {
        /// <summary>
        /// ״̬
        /// </summary>
        public string Status { get; set; }
        /// <summary>
        /// 设备号
        /// </summary>
        public string deviceNo { get; set; }
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/wms/LocationHelper.cs
@@ -79,7 +79,7 @@
                    }
                }
                //空托入库,相同物料内测排的货位
                //托盘入库,相同物料内测排的货位
                var Locs = GetLocByItemCode(areaCode, itemCode, new int[] { 1, 4 }).OrderByDescending(b => b.N_COL).ToList();
                if (Locs.Count > 0)
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/wms/WCSHelper.cs
@@ -145,7 +145,7 @@
            }
            return res;
        }
        internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData)
        internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData,string Type)
        {
            var db = new SqlHelper<TaskAction>().GetInstance();
            var action = new TaskAction()
@@ -153,7 +153,7 @@
                N_ACTION_CODE = state,
                S_TASK_CODE = no,
                S_EQ_CODE = forkliftNo,
                S_EQ_TYPE = "agv",
                S_EQ_TYPE = Type,
                S_DATA = extData
            };
            return db.Insertable(action).ExecuteCommand() > 0;