zxx
2025-07-01 5e04278c55e10c245a184057b6ae3bd8238dd93a
xiaomi
2个文件已添加
8个文件已修改
455 ■■■■■ 已修改文件
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/HH.WCS.XiaoMi.csproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/core/WMSCore.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/LocCntrRel.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/LocFrameRel.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/WCSTask.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/bigMaterial.cs 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/smallMaterial.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/process/TaskProcess.cs 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/wms/LocationHelper.cs 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/wms/WCSHelper.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/HH.WCS.XiaoMi.csproj
@@ -217,6 +217,8 @@
    <Compile Include="dispatch\HanAo.cs" />
    <Compile Include="dispatch\NDC.cs" />
    <Compile Include="core\Monitor.cs" />
    <Compile Include="models\LocFrameRel.cs" />
    <Compile Include="models\smallMaterial.cs" />
    <Compile Include="models\bigMaterial.cs" />
    <Compile Include="models\AutoRepairEmptyTray.cs" />
    <Compile Include="models\TN_ISUSING.cs" />
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/core/WMSCore.cs
@@ -366,5 +366,57 @@
            }
        }
        /// <summary>
        /// 应急空料架上线_AMR
        /// </summary>
        /// <returns></returns>
        public static void EmergencyEmptyMaterial()
        {
            var db = new SqlHelper<Location>().GetInstance();
            try
            {
                var startLoc = new Location();
                var endLoc = new Location();
                var endReservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "应急空料架缓存区域").FirstOrDefault();
                endLoc = TaskProcess.InWorkTransport(endReservoirs.areaCode);
                if (endLoc != null)
                {
                    var startReservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "空料架区").FirstOrDefault();
                    startLoc = TaskProcess.OutWorkTransport(startReservoirs.areaCode);
                    if (startLoc!=null)
                    {
                        var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First();
                        //创建任务
                        LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", "应急空料架上线_AMR");
                        var res = TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "应急空料架上线_AMR", locCntrRel.S_CNTR_CODE, 1, 1);
                        if (res)
                        {
                            LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建成功");
                        }
                        else
                        {
                            LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建失败");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("EmergencyEmptyMaterial:" + ex.Message + ex.StackTrace);
                LogHelper.Error("EmergencyEmptyMaterial:" + ex.Message, ex);
                throw;
            }
        }
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/LocCntrRel.cs
@@ -24,6 +24,10 @@
        public int N_BIND_ORDER { get; set; }
        //货架  zxx
        public string S_FRAME_CODE { get; set; }
        [SugarColumn(IsIgnore = true)]
        [Navigate(NavigateType.OneToMany, nameof(S_CNTR_CODE))]
        public List<CntrItemDetail> CntrItemRels { get; set; }
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/LocFrameRel.cs
New file
@@ -0,0 +1,35 @@
using HH.WCS.XiaoMi.models;
using SqlSugar;
using System;
using System.Collections.Generic;
namespace HH.WCS.XiaoMi
{
    //TN_Loc_Container
    //LocCntrRel
    [SugarTable("TN_Frame_Container")]
    public class LocFrameRel : BaseModel
    {
        [SugarColumn(IsPrimaryKey = true)]
        //货位
        public string S_LOC_CODE { get; set; }
        //货架
        public string S_FRAME_CODE { get; set; }
        //public string S_ACTION_SRC { get; set; }
        //public string S_BINDING_METHOD { get; set; }
        //public int N_BINDING_METHOD { get; set; }
        //public string S_STATE_PRE { get; set; }
        //public int N_REVIEW_RESULT { get; set; }
        //public int N_BIND_ORDER { get; set; }
        [SugarColumn(IsIgnore = true)]
        [Navigate(NavigateType.OneToMany, nameof(S_LOC_CODE))]
        public List<LocCntrRel> LocCntrRels { get; set; }
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/WCSTask.cs
@@ -47,6 +47,10 @@
        public int N_REVIEW_RESULT { get; set; }
        public string S_CNTR_CODE { get; set; }
        //货架号 zxx
        public string S_FRAME_CODE { get; set; }
        public string S_OP_NAME { get; set; }
        public string S_WORKSHOP_NO { get; set; }
        public string S_WORKSHOP_NAME { get; set; }
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/bigMaterial.cs
@@ -1,28 +1,44 @@
using HH.WCS.XiaoMi.models;
using SqlSugar;
using System;
using System.Collections.Generic;
namespace HH.WCS.XiaoMi
{
    public class bigMaterial : BaseModel
    public class smallMaterial : BaseModel
    {
        //订单TS名字
        public string ts_name { get; set; }
        public string createdNamne { get; set; }
        public parameters parameter { get; set; }
        public string routeType { get; set; }
        //订单优先级
        public string priority { get; set; }
        //任务类型 自动,人工
        public string taskType { get; set; }
        //料架编码
        public string rackCode { get; set; }
        //TS订单参数
        public List<Parameters> parameters { get; set; }
        public string taskID { get; set; }
        //任务明细号
        public string order_name { get; set; }
        //订单创建时间(传时间戳)
        public DateTime dead_line { get; set; }
        
    }
    public class parameters
    public class Parameters
    {
        //立库起点、大件起点
        public string src { get; set; }
        //料架仓位明细
        public string trayCode { get; set; }
        //流利料架位置
        public string dst { get; set; }
        //零件类
        public string sku { get; set; }
        //任务号
        public string BatchNo { get; set; }
        public int num { get; set; }
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/smallMaterial.cs
New file
@@ -0,0 +1,31 @@
using HH.WCS.XiaoMi.models;
using SqlSugar;
using System;
namespace HH.WCS.XiaoMi
{
    public class bigMaterial : BaseModel
    {
        public string ts_name { get; set; }
        public string createdNamne { get; set; }
        public parameters parameter { get; set; }
        public string taskID { get; set; }
        public string order_name { get; set; }
        public DateTime dead_line { get; set; }
    }
    public class parameters
    {
        public string src { get; set; }
        public string dst { get; set; }
        public string sku { get; set; }
        public string BatchNo { get; set; }
        public int num { get; set; }
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/process/TaskProcess.cs
@@ -46,13 +46,32 @@
            {
                Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}");
                LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}");
                if (mst.S_FRAME_CODE != null)
                {
                    LocationHelper.UnBindingLocHj(mst.S_START_LOC, mst.S_FRAME_CODE);
                }
                else
                {
                LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList());
                }
            }
            else
            {
                Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}");
                LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}");
                //如果货架有值则绑货架
                if (mst.S_FRAME_CODE!=null)
                {
                    LocationHelper.BindingLocHj(mst.S_END_LOC, mst.S_FRAME_CODE);
                }
                else
                {
                LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList());
                }
            }
        }
@@ -380,7 +399,24 @@
            }
            return result;
        }
        //小米货架任务
        public static bool CreateTransportHj(string start, string end, string taskType, string frame, int startLayer, int endLayer, int trayCarryCount = 1, int priority = 1)
        {
            var result = false;
            var trayCodes = frame;
            var taskNo = DateTime.Now.Ticks.ToString();
            var res = WCSHelper.CreateTaskHj(taskNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, trayCarryCount, startLayer, endLayer);
            if (res)
            {
                result = true;
                //任务创建成功,起点货位出库锁定,终点货位入库锁定
                LocationHelper.LockLoc(start, 2);
                LocationHelper.LockLoc(end, 1);
            }
            return result;
        }
        /// <summary>
        /// 创建搬运任务
        /// </summary>
@@ -1835,8 +1871,187 @@
        }
        
        /// <summary>
        /// 小件
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal static TaskResponse smallMaterial(smallMaterial model)
        {
            try
            {
                var startLoc = new Location();
                var endLoc = new Location();
                string Message = null;
                if (model.taskType=="自动")
                {
                    autoSmallMaterial(model);
                }
                else if (model.taskType == "人工")
                {
                    artificialSmallMaterial(model);
                }
                var result = new TaskResponse();
                if (Message != null)
                {
                    result = new TaskResponse
                    {
                        header = new ResponseHead { code = 0, desc = Message }
                    };
                }
                else
                {
                    result = new TaskResponse
                    {
                        header = new ResponseHead { code = 200, desc = "SUCCESS" },
                        body = new ResponseBody
                        {
                            msg = "success",
                            app_name = "Guozi client",
                            data = new List<ResponseData> { new ResponseData { in_order_id = model.taskID } },
                            version = ""
                        }
                    };
                }
                return result;
            }
            catch (Exception ex)
            {
                Console.WriteLine("bigMaterial:" + ex.Message + ex.StackTrace);
                LogHelper.Error("bigMaterial:" + ex.Message, ex);
                throw;
            }
        }
        //自动 拆分
        private static string autoSmallMaterial(smallMaterial model) {
            var db = new SqlHelper<Location>().GetInstance();
            string Message = null;
            //拆分成两条任务,一条是料架到指定的缓存区,料架上的托盘到指定的工位(小米wcs传)一对多
            var startFrame = db.Queryable<LocFrameRel>().Where(a => a.S_LOC_CODE == model.parameters[0].src).First();
            var startLoc = db.Queryable<Location>().Where(a => a.S_CODE == startFrame.S_FRAME_CODE).First();
            if (startLoc == null || startLoc.N_LOCK_STATE != 0)
            {
                Message = $"{model.parameters[0].src}库位已被锁定!";
            }
            var endReservoirs = Settings.ReservoirAreas.Where(s => s.areaName == model.routeType).FirstOrDefault();
            var endLoc = TaskProcess.InWorkTransport(endReservoirs.areaCode);
            if (endLoc != null)
            {
                //创建到缓存区任务
                var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First();
                //创建任务
                LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", model.ts_name);
                var res = TaskProcess.CreateTransportHj(startLoc.S_CODE, endLoc.S_CODE, model.ts_name, locCntrRel.S_FRAME_CODE, 1, 1);
                if (!res)
                {
                    return Message="自动上线任务创建失败";
                }
            }
            //料架上的托盘到指定的工位
            foreach (var parameter in model.parameters)
            {
                var startLocHj = db.Queryable<Location>().Where(a => a.S_CODE == parameter.src).First();
                if (startLocHj == null || startLocHj.N_LOCK_STATE != 0)
                {
                    Message = $"{model.parameters[0].src}库位已被锁定!";
                }
                //货架上的货判断一下货架有没有锁
                var startFrameParent = db.Queryable<LocFrameRel>().Where(a => a.S_LOC_CODE == parameter.src).First();
                if (startFrameParent != null)
                {
                    var startLocParent = db.Queryable<Location>().Where(a => a.S_CODE == startFrameParent.S_FRAME_CODE).First();
                    if (startLocParent == null || startLocParent.N_LOCK_STATE != 0)
                    {
                        Message = $"{startFrameParent.S_FRAME_CODE}库位已被锁定!";
                    }
                }
            }
            return Message;
            //switch (model.ts_name)
            //{
            //    case "p2p":
            //        startLoc = db.Queryable<Location>().Where(a => a.S_CODE == model.parameter.src).First();
            //        if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y")
            //        {
            //            Message = $"{model.parameter.src}库位已被锁定!";
            //        }
            //        endLoc = db.Queryable<Location>().Where(a => a.S_CODE == model.parameter.dst).First();
            //        if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y")
            //        {
            //            Message = $"{model.parameter.dst}库位已被锁定!";
            //        }
            //        break;
            //    case "p2a":
            //        startLoc = db.Queryable<Location>().Where(a => a.S_CODE == model.parameter.src).First();
            //        if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y")
            //        {
            //            Message = $"{model.parameter.src}库位已被锁定!";
            //        }
            //        endLoc = InWorkTransport(model.parameter.dst);
            //        if (endLoc == null)
            //        {
            //            Message = $"{model.parameter.dst}库区没有可入货位!";
            //        }
            //        break;
            //    case "a2p":
            //        startLoc = OutWorkTransport(model.parameter.src);
            //        if (startLoc == null)
            //        {
            //            Message = $"{model.parameter.dst}库区没有可出货位!";
            //        }
            //        endLoc = db.Queryable<Location>().Where(a => a.S_CODE == model.parameter.dst).First();
            //        if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y")
            //        {
            //            Message = $"{model.parameter.dst}库位已被锁定!";
            //        }
            //        break;
            //}
            //var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First();
            ////创建任务
            //LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", model.ts_name);
            //var res = TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, model.ts_name, locCntrRel.S_CNTR_CODE, 1, 1);
            //if (!res)
            //{
            //    return new TaskResponse
            //    {
            //        header = new ResponseHead { code = 1, desc = Message }
            //    };
            //}
        }
        //人工 不拆分
        private static void artificialSmallMaterial(smallMaterial model)
        {
            var db = new SqlHelper<Location>().GetInstance();
        }
    }
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/wms/LocationHelper.cs
@@ -1,4 +1,5 @@
using HH.WCS.XiaoMi.util;
using Opc.Ua;
using SqlSugar;
using System;
using System.Collections.Generic;
@@ -404,6 +405,29 @@
            }
            return res;
        }
        public static bool UnBindingLocHj(string loc, string frame)
        {
            var res = false;
            var db = new SqlHelper<object>().GetInstance();
            var location = db.Queryable<Location>().Where(a => a.S_CODE.Trim() == loc).First();
            try
            {
                db.BeginTran();
                var lcrList = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == loc).ToList();
                var count = db.Deleteable<LocCntrRel>().Where(it => frame==it.S_FRAME_CODE.Trim() && it.S_LOC_CODE.Trim() == loc).ExecuteCommand();
                location.N_CURRENT_NUM = lcrList.Count - count;
                location.S_LOCK_STATE = "无";
                location.N_LOCK_STATE = 0;
                db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand();
                db.CommitTran();
                res = true;
            }
            catch (Exception ex)
            {
                db.RollbackTran();
            }
            return res;
        }
        /// <summary>
        /// 货位绑定容器
        /// </summary>
@@ -443,7 +467,42 @@
            }
            return res;
        }
        /// <summary>
        /// 货位绑定货架 小米
        /// </summary>
        /// <param name="loc"></param>
        /// <param name="cntrs"></param>
        /// <returns></returns>
        public static bool BindingLocHj(string loc, string frame)
        {
            var res = false;
            var db = new SqlHelper<object>().GetInstance();
            var location = db.Queryable<Location>().Where(a => a.S_CODE.Trim() == loc).First();
            try
            {
                var lcrList = db.Queryable<LocCntrRel>().Includes(a => a.Container).Where(a => a.S_LOC_CODE.Trim() == loc).ToList();
                db.BeginTran();
                int count = 0;
                if (lcrList.Count(b => b.S_CNTR_CODE.Trim() == frame) == 0)
                {
                    db.Insertable<LocCntrRel>(new LocCntrRel { S_LOC_CODE = loc, S_FRAME_CODE = frame }).ExecuteCommand();
                    count++;
                }
                location.N_CURRENT_NUM = lcrList.Count + count;
                location.N_LOCK_STATE = 0;
                location.S_LOCK_STATE = "无";
                db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand();
                db.CommitTran();
                res = true;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                db.RollbackTran();
            }
            return res;
        }
        /// <summary>
        /// 判断逻辑库区是否有可用货位
        /// </summary>
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/wms/WCSHelper.cs
@@ -114,6 +114,33 @@
            return CreateTask(TN_Task);
        }
        //小米货架
        internal static bool CreateTaskHj(string no, string from, string to, string taskType, int pri, string cntrInfo, int cntrCount = 1, int startLayer = 1, int endLayer = 1)
        {
            var fromLoc = LocationHelper.GetLocation(from);
            var endLoc = LocationHelper.GetLocation(to);
            WCSTask TN_Task = new WCSTask()
            {
                S_CODE = GenerateTaskNo(),
                S_START_AREA = fromLoc.S_AREA_CODE,
                S_END_AREA = endLoc.S_AREA_CODE,
                S_START_LOC = from,
                S_END_LOC = to,
                S_TYPE = taskType,
                S_OP_CODE = no,
                N_PRIORITY = pri,
                N_SCHEDULE_TYPE = 1,
                N_B_STATE = 0,
                S_B_STATE = WCSTask.GetStateStr(0),
                S_FRAME_CODE = cntrInfo,
                //N_START_LAYER = startLayer,
                //N_END_LAYER = endLayer,
                //N_CNTR_COUNT = cntrCount
            };
            return CreateTask(TN_Task);
        }
        internal static bool CreateTask(string no, Location from, Location to, string taskType, int scheduleType, int pri, string cntrInfo, int cntrCount = 1, int startLayer = 1, int endLayer = 1)
        {
            WCSTask TN_Task = new WCSTask()