林豪 左 2 年之前
父節點
當前提交
10f70bf825

+ 0 - 49
DBHelper/DbContext.cs

@@ -1,49 +0,0 @@
-using SqlSugar;
-
-namespace DBHelper
-{
-    public class DbContext
-    {
-        private static ConnectionConfig? _config = null;
-
-        public static void SetConfig(ConnectionConfig value)
-        {
-            _config = value;
-        }
-
-        /// <summary>
-        /// 用单例模式
-        /// </summary>
-        private static readonly SqlSugarScope SqlSugarScope = new SqlSugarScope(new ConnectionConfig()
-        {
-            ConnectionString = _config!.ConnectionString, //连接符字串
-            DbType = _config.DbType, //数据库类型
-            IsAutoCloseConnection = true //不设成true要手动close
-        }, db =>
-        {
-            //(A)全局生效配置点
-            //调试SQL事件,可以删掉
-            db.Aop.OnLogExecuting = (sql, pars) =>
-            {
-                DbLog.DBEX(sql);
-                //输出sql,查看执行sql
-                //5.0.8.2 获取无参数化 SQL
-                //UtilMethods.GetSqlString(DbType.SqlServer,sql,pars)
-            };
-        });
-
-        /// <summary>
-        /// 获取db链接
-        /// </summary>
-        /// <returns></returns>
-        /// <exception cref="Exception"></exception>
-        public static SqlSugarScope Db
-        {
-            get
-            {
-                if (_config == null) throw new Exception("请使用SetConfig方法写入数据库链接信息");
-                return SqlSugarScope;
-            }
-        }
-    }
-}

+ 16 - 0
DBHelper/SqlSugarHelper.cs

@@ -0,0 +1,16 @@
+using SqlSugar;
+
+namespace DBHelper
+{
+    /// <summary>
+    ///  DB,禁止跨上下文使用
+    /// </summary>
+    public class SqlSugarHelper
+    {
+        //如果是固定多库可以传 new SqlSugarScope(List<ConnectionConfig>,db=>{}) 文档:多租户
+        //如果是不固定多库 可以看文档Saas分库
+
+        //用单例模式
+        public static SqlSugarScope Db = null;
+    }
+}

+ 38 - 0
ServiceCenter/Redis/RedisClientList.cs

@@ -0,0 +1,38 @@
+using FreeRedis;
+
+namespace ServiceCenter.Redis
+{
+    /// <summary>
+    /// 链接集合
+    /// </summary>
+    public class RedisClientList
+    {
+        /// <summary>
+        /// 连接集合
+        /// </summary>
+        /// <param name="key">连接标识</param>
+        /// <param name="client">连接</param>
+        /// <param name="connectionConfig">连接字符串</param>
+        public RedisClientList(string key, RedisClient client, string connectionConfig)
+        {
+            Key = key;
+            Client = client;
+            ConnectionConfig = connectionConfig;
+        }
+
+        /// <summary>
+        /// 连接标识
+        /// </summary>
+        public string Key { get; set; }
+
+        /// <summary>
+        /// 连接
+        /// </summary>
+        public RedisClient Client { get; set; }
+
+        /// <summary>
+        /// 连接字符串
+        /// </summary>
+        public string ConnectionConfig { get; set; }
+    }
+}

+ 153 - 0
ServiceCenter/Redis/RedisHub.cs

@@ -0,0 +1,153 @@
+using FreeRedis;
+
+namespace ServiceCenter.Redis
+{
+    /// <summary>
+    /// Redis
+    /// </summary>
+    public static class RedisHub
+    {
+        /// <summary>
+        /// 连接集合
+        /// </summary>
+        private static List<RedisClientList> RedisClients = new List<RedisClientList>();
+
+        /// <summary>
+        /// 默认上下文类类型
+        /// </summary>
+        public static string DefaultContextType { get; private set; } = null!;
+
+        /// <summary>
+        /// 默认监控上下文类类型
+        /// </summary>
+        public static string MonitorContextType { get; private set; } = null!;
+
+        /// <summary>
+        /// 默认调试上下文类类型
+        /// </summary>
+        public static string DebugContextType { get; private set; } = null!;
+
+        /// <summary>
+        /// 设置默认链接
+        /// </summary>
+        /// <param name="key"></param>
+        public static void SetDefaultContextType(string key)
+        {
+            DefaultContextType = key;
+        }
+
+        /// <summary>
+        /// 设置监控链接
+        /// </summary>
+        /// <param name="key"></param>
+        public static void SetMonitorContextType(string key)
+        {
+            MonitorContextType = key;
+        }
+
+        /// <summary>
+        /// 设置监控链接
+        /// </summary>
+        /// <param name="key"></param>
+        public static void SetDebugContextType(string key)
+        {
+            DebugContextType = key;
+        }
+
+        /// <summary>
+        /// 默认链接
+        /// </summary>
+        public static RedisClient Default
+        {
+            get
+            {
+                {
+                    if (DefaultContextType == null)
+                        throw new Exception("请先设置默认RedisDB库,调用静态方法SetDefaultDbContextType()");
+                    return Context(DefaultContextType);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 监控连接
+        /// </summary>
+        public static RedisClient Monitor
+        {
+            get
+            {
+                {
+                    if (MonitorContextType == null)
+                        throw new Exception("请先设置监控RedisDB库,调用静态方法SetMonitorContextType()");
+                    return Context(MonitorContextType);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 监控连接
+        /// </summary>
+        public static RedisClient Debug
+        {
+            get
+            {
+                {
+                    if (MonitorContextType == null)
+                        throw new Exception("请先设置DebugRedisDB库,调用静态方法SetDebugContextType()");
+                    return Context(MonitorContextType);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 创建一个连接
+        /// </summary>
+        /// <param name="connectionString"> 连接字符串</param>
+        /// <param name="key">标识</param>
+        /// <param name="defaultClient"> 是否为默认连接,默认为false</param>
+        /// <returns></returns>
+        public static RedisClient CreateContext(string connectionString, string key, bool defaultClient = false)
+        {
+            var ctx = RedisClients.FirstOrDefault(v => v.Key == key);
+            if (ctx != null) return ctx.Client;
+            ctx = new RedisClientList(key, new RedisClient(connectionString), connectionString);
+            RedisClients.Add(ctx);
+            if (defaultClient)
+            {
+                SetDefaultContextType(key);
+            }
+            return ctx.Client;
+        }
+
+        /// <summary>
+        /// 获取指定的连接
+        /// </summary>
+        /// <param name="key"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        public static RedisClient Context(string key)
+        {
+            var ctx = RedisClients.FirstOrDefault(v => v.Key == key);
+            if (ctx == null) throw new Exception("没有对应的链接,请先调用创建");
+            return ctx.Client;
+        }
+
+        /// <summary>
+        /// 检查Redis中是否有对应key且value不为空
+        /// </summary>
+        /// <param name="redisClient">redis连接</param>
+        /// <param name="key">要检查的Key</param>
+        /// <returns>
+        /// 1.key不存在,创建这个key value默认为三个空格符。返回null
+        /// 2.key存在单value为空 返回null
+        /// 3.key存在value不为空 返回获取到的值
+        /// </returns>
+        public static string? Check(this RedisClient redisClient, string key)
+        {
+            var result = redisClient.Get(key);
+            if (!string.IsNullOrEmpty(result)) return result;
+            redisClient.Set(key, "   ");
+            return null;
+        }
+    }
+}

+ 1 - 2
ServiceCenter/ServiceCenter.csproj

@@ -8,11 +8,10 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="DBHelper" Version="1.0.0.2" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.5" />
     <PackageReference Include="PlcSiemens" Version="1.0.0.2" />
     <PackageReference Include="WCS.Core" Version="1.0.0.5" />
-    <PackageReference Include="WCS.Entity" Version="1.0.0.10" />
+    <PackageReference Include="WCS.Entity" Version="1.0.0.12" />
   </ItemGroup>
 
 </Project>

+ 64 - 0
ServiceCenter/SqlSugars/SqlSugarHelper.cs

@@ -0,0 +1,64 @@
+using SqlSugar;
+
+namespace ServiceCenter.SqlSugars
+{
+    /// <summary>
+    ///  ORM
+    /// </summary>
+    public class SqlSugarHelper
+    {
+        //如果是固定多库可以传 new SqlSugarScope(List<ConnectionConfig>,db=>{}) 文档:多租户
+        //如果是不固定多库 可以看文档Saas分库
+
+        /// <summary>
+        /// 数据库连接
+        /// </summary>
+        private static SqlSugarScope? _Db { get; set; } = null;
+
+        /// <summary>
+        ///  设置数据库连接
+        /// </summary>
+        /// <param name="sqlSugarScope"></param>
+        public static void SetDb(SqlSugarScope sqlSugarScope)
+        {
+            _Db = sqlSugarScope;
+        }
+
+        /// <summary>
+        /// 数据库连接
+        /// </summary>
+        public SqlSugarScope Db
+        {
+            get
+            {
+                return _Db ?? throw new Exception("请调用[SqlSugarHelper.SetDb]方法设置设置数据库连接");
+            }
+        }
+
+        /// <summary>
+        /// 指定连接连接
+        /// </summary>
+        /// <typeparam name="T">业务代码</typeparam>
+        /// <param name="func">业务逻辑</param>
+        /// <param name="key">连接对应的Key</param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        public static T Do<T>(Func<SqlSugarHelper, T> func)
+        {
+            var db = new SqlSugarHelper();
+
+            try
+            {
+                //开始事务
+                db.Db.BeginTran();
+                var res = func(db);
+                db.Db.CommitTran();
+                return res;
+            }
+            catch (Exception ex)
+            {
+                db.Db.RollbackTran();
+            }
+        }
+    }
+}

+ 2 - 2
ServiceCenter/Virtual_PLC/PlcData.cs

@@ -1,6 +1,6 @@
-using DBHelper.Redis;
-using FreeRedis;
+using FreeRedis;
 using Newtonsoft.Json;
+using ServiceCenter.Redis;
 
 namespace ServiceCenter.Virtual_PLC
 {

+ 1 - 1
WCS.Entity/WCS.Entity.csproj

@@ -7,7 +7,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="SqlSugarCore" Version="5.1.4.67" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.4.72" />
     <PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
   </ItemGroup>
 

+ 5 - 4
WCS.WorkEngineering/Extensions/TaskExtension.cs

@@ -1,4 +1,4 @@
-using DBHelper;
+using ServiceCenter.SqlSugars;
 using WCS.Entity;
 
 namespace WCS.WorkEngineering.Extensions
@@ -15,9 +15,10 @@ namespace WCS.WorkEngineering.Extensions
         /// <param name="db">数据库上下文</param>
         /// <param name="curPoint">当前地址</param>
         /// <param name="desc">描述</param>
-        public static void AddWCS_TASK_DTL(this WCS_TASK task, Db db, string curPoint, string desc)
+        public static void AddWCS_TASK_DTL(this WCS_TASK task,SqlSugarHelper db, string curPoint, string desc)
         {
-            db.Default.Insertable(new WCS_TASK_DTL
+            
+            db.Insertable(new WCS_TASK_DTL
             {
                 ParentTaskCode = task.ID,
                 CurPoint = "",
@@ -37,7 +38,7 @@ namespace WCS.WorkEngineering.Extensions
         /// <param name="curPoint">当前地址</param>
         /// <param name="NextPoint">下一个地址</param>
         /// <param name="desc">描述</param>
-        public static void AddWCS_TASK_DTL(this WCS_TASK task, Db db, string curPoint, string NextPoint, string desc)
+        public static void AddWCS_TASK_DTL(this WCS_TASK task, SqlSugarHelper.Db db, string curPoint, string NextPoint, string desc)
         {
             db.Default.Insertable(new WCS_TASK_DTL
             {

+ 89 - 90
WCS.WorkEngineering/Systems/SrmSystems.cs

@@ -1,5 +1,4 @@
-using DBHelper;
-using ServiceCenter.Extensions;
+using ServiceCenter.Extensions;
 using System.ComponentModel;
 using WCS.Core;
 using WCS.Entity;
@@ -63,41 +62,41 @@ namespace WCS.WorkEngineering.Systems
             //判断完成任务号是否大于0
             if (obj.Data2.TaskFinishiId > 0)
             {
-                Db.Do(db =>
-                {
-                    //根据DB521任务号获取对应任务
-                    var task = db.Default.Queryable<WCS_TASK>().First(v => v.ID == obj.Data2.TaskFinishiId) ?? throw new KnownException($"未找到任务{obj.Data2.TaskFinishiId}", LogLevelEnum.High);
-                    if (task.STATUS != Entity.TaskStatus.StackerExecution)
-                        throw new KnownException($"任务{task.ID}状态是{task.STATUS.Description()}.堆垛机完成任务需要对应任务状态处于堆垛机执行中", LogLevelEnum.High);
-                    //根据任务类型做不同的处理
-                    switch (task.TYPE)
-                    {
-                        case TaskType.EnterDepot:
-                            //完成任务
-                            task.STATUS = Entity.TaskStatus.Finish;
-                            task.UPDATETIME = DateTime.Now;
-                            task.ENDTIME = DateTime.Now;
-                            task.AddWCS_TASK_DTL(db, task.ADDRTO, "入库任务结束");
-                            break;
-
-                        case TaskType.OutDepot:
-                            task.STATUS = Entity.TaskStatus.ConveyorInProgress;
-                            task.UPDATETIME = DateTime.Now;
-                            task.AddWCS_TASK_DTL(db, task.SRMSTATION, "出库任务到达放货站台");
-                            break;
-
-                        case TaskType.TransferDepot:
-                            task.STATUS = Entity.TaskStatus.Finish;
-                            task.UPDATETIME = DateTime.Now;
-                            task.ENDTIME = DateTime.Now;
-                            task.AddWCS_TASK_DTL(db, task.ADDRTO, "移库任务结束");
-                            break;
-                    }
-
-                    db.Default.Updateable(task).AddQueue();
-                    db.Default.SaveQueues();
-                    obj.Data.OkAck = 1;
-                });
+                //Db.Do(db =>
+                //{
+                //    //根据DB521任务号获取对应任务
+                //    var task = db.Default.Queryable<WCS_TASK>().First(v => v.ID == obj.Data2.TaskFinishiId) ?? throw new KnownException($"未找到任务{obj.Data2.TaskFinishiId}", LogLevelEnum.High);
+                //    if (task.STATUS != Entity.TaskStatus.StackerExecution)
+                //        throw new KnownException($"任务{task.ID}状态是{task.STATUS.Description()}.堆垛机完成任务需要对应任务状态处于堆垛机执行中", LogLevelEnum.High);
+                //    //根据任务类型做不同的处理
+                //    switch (task.TYPE)
+                //    {
+                //        case TaskType.EnterDepot:
+                //            //完成任务
+                //            task.STATUS = Entity.TaskStatus.Finish;
+                //            task.UPDATETIME = DateTime.Now;
+                //            task.ENDTIME = DateTime.Now;
+                //            task.AddWCS_TASK_DTL(db, task.ADDRTO, "入库任务结束");
+                //            break;
+
+                //        case TaskType.OutDepot:
+                //            task.STATUS = Entity.TaskStatus.ConveyorInProgress;
+                //            task.UPDATETIME = DateTime.Now;
+                //            task.AddWCS_TASK_DTL(db, task.SRMSTATION, "出库任务到达放货站台");
+                //            break;
+
+                //        case TaskType.TransferDepot:
+                //            task.STATUS = Entity.TaskStatus.Finish;
+                //            task.UPDATETIME = DateTime.Now;
+                //            task.ENDTIME = DateTime.Now;
+                //            task.AddWCS_TASK_DTL(db, task.ADDRTO, "移库任务结束");
+                //            break;
+                //    }
+
+                //    db.Default.Updateable(task).AddQueue();
+                //    db.Default.SaveQueues();
+                //    obj.Data.OkAck = 1;
+                //});
             }
 
             //堆垛机是否可以下发任务
@@ -112,64 +111,64 @@ namespace WCS.WorkEngineering.Systems
             int enterOrOut = 1;
 
             //再检查是否有等待执行的货物
-            Db.Do(db =>
-            {
-                //获取当前堆垛机的所有未完成任务
-                var tasks = db.Default.Queryable<WCS_TASK>().Where(v => v.STATUS < Entity.TaskStatus.Finish && (v.DEVICE == obj.Entity.Code));
-                //任务集合是否有处于堆垛机执行状态的任务
-                if (tasks.Any(v => v.STATUS == Entity.TaskStatus.StackerExecution)) throw new KnownException($"有任务处于堆垛机执行状态", LogLevelEnum.High);
-
-                //判断是否存在调整优先级任务
-                if (!tasks.Any(v => v.TYPE != TaskType.TransferDepot && v.STATUS < Entity.TaskStatus.StackerExecution && v.Priority > 0))
-                {
-                    //不存在调整优先级任务,判断是否存在移库任务
-                    isTransfer = tasks.Any(v => v.TYPE == TaskType.TransferDepot && v.STATUS == Entity.TaskStatus.NewBuild);
-                }
-                else //存在调整优先级任务
-                {
-                    //获取出库任务中新建状态最大优先级
-                    var outPriorityNewBuild = tasks.Where(v => v.TYPE == TaskType.OutDepot && v.STATUS == Entity.TaskStatus.NewBuild).Max(v => v.Priority);
-                    //获取入库任务中最后一个交互点是取货点任务的最大优先级
-                    var enterPriority = tasks.Where(v => v.TYPE == TaskType.EnterDepot && v.STATUS < Entity.TaskStatus.StackerExecution && PickUpDevices.Any(p => p.Entity.Code == v.LastInteractionPoint))
-                                             .Max(v => v.Priority);
-                    //出入库最大优先级相加大于零
-                    if (outPriorityNewBuild + enterPriority > 0)
-                    {
-                        //出入库优先级任务 1:无优先 2:入库 3:出库
-                        enterOrOut = enterPriority > outPriorityNewBuild ? 2 : 3;
-                    }
-                }
-            });
+            //Db.Do(db =>
+            //{
+            //    //获取当前堆垛机的所有未完成任务
+            //    var tasks = db.Default.Queryable<WCS_TASK>().Where(v => v.STATUS < Entity.TaskStatus.Finish && (v.DEVICE == obj.Entity.Code));
+            //    //任务集合是否有处于堆垛机执行状态的任务
+            //    if (tasks.Any(v => v.STATUS == Entity.TaskStatus.StackerExecution)) throw new KnownException($"有任务处于堆垛机执行状态", LogLevelEnum.High);
+
+            //    //判断是否存在调整优先级任务
+            //    if (!tasks.Any(v => v.TYPE != TaskType.TransferDepot && v.STATUS < Entity.TaskStatus.StackerExecution && v.Priority > 0))
+            //    {
+            //        //不存在调整优先级任务,判断是否存在移库任务
+            //        isTransfer = tasks.Any(v => v.TYPE == TaskType.TransferDepot && v.STATUS == Entity.TaskStatus.NewBuild);
+            //    }
+            //    else //存在调整优先级任务
+            //    {
+            //        //获取出库任务中新建状态最大优先级
+            //        var outPriorityNewBuild = tasks.Where(v => v.TYPE == TaskType.OutDepot && v.STATUS == Entity.TaskStatus.NewBuild).Max(v => v.Priority);
+            //        //获取入库任务中最后一个交互点是取货点任务的最大优先级
+            //        var enterPriority = tasks.Where(v => v.TYPE == TaskType.EnterDepot && v.STATUS < Entity.TaskStatus.StackerExecution && PickUpDevices.Any(p => p.Entity.Code == v.LastInteractionPoint))
+            //                                 .Max(v => v.Priority);
+            //        //出入库最大优先级相加大于零
+            //        if (outPriorityNewBuild + enterPriority > 0)
+            //        {
+            //            //出入库优先级任务 1:无优先 2:入库 3:出库
+            //            enterOrOut = enterPriority > outPriorityNewBuild ? 2 : 3;
+            //        }
+            //    }
+            //});
 
             #region 移库
 
             if (isTransfer)
             {
-                Db.Do(db =>
-                {
-                    //获取一条当前堆垛机优先级最高的新建移库任务
-                    var task = db.Default.Queryable<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.Code && v.TYPE == TaskType.TransferDepot && v.STATUS == Entity.TaskStatus.NewBuild)
-                                                               .OrderByDescending(v => v.Priority)
-                                                               .First() ?? throw new KnownException("未找到移库任务", LogLevelEnum.High);
-                    //任务状态改为堆垛机执行中
-                    task.STATUS = Entity.TaskStatus.StackerExecution;
-                    task.STARTTIME = DateTime.Now;
-                    task.UPDATETIME = DateTime.Now;
-                    task.AddWCS_TASK_DTL(db, task.ADDRFROM, task.DEVICE, $"堆垛机{obj.Entity.Code}开始执行任务");
-                    db.Default.Updateable(task).AddQueue();
-                    db.Default.SaveQueues();
-                    var addrFrom = task.ADDRFROM.Split("-");
-                    var addrTo = task.ADDRTO.Split("-");
-                    //下发任务
-                    obj.Data.TaskNumber = task.ID;
-                    obj.Data.RowPos1 = addrFrom[0].ToShort();
-                    obj.Data.TravelPos1 = addrFrom[1].ToShort();
-                    obj.Data.LiftPos1 = addrFrom[2].ToShort();
-                    obj.Data.RowPos2 = addrTo[0].ToShort();
-                    obj.Data.TravelPos2 = addrTo[1].ToShort();
-                    obj.Data.LiftPos2 = addrTo[2].ToShort();
-                    obj.Data.VoucherNo++;
-                });
+                //Db.Do(db =>
+                //{
+                //    //获取一条当前堆垛机优先级最高的新建移库任务
+                //    var task = db.Default.Queryable<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.Code && v.TYPE == TaskType.TransferDepot && v.STATUS == Entity.TaskStatus.NewBuild)
+                //                                               .OrderByDescending(v => v.Priority)
+                //                                               .First() ?? throw new KnownException("未找到移库任务", LogLevelEnum.High);
+                //    //任务状态改为堆垛机执行中
+                //    task.STATUS = Entity.TaskStatus.StackerExecution;
+                //    task.STARTTIME = DateTime.Now;
+                //    task.UPDATETIME = DateTime.Now;
+                //    task.AddWCS_TASK_DTL(db, task.ADDRFROM, task.DEVICE, $"堆垛机{obj.Entity.Code}开始执行任务");
+                //    db.Default.Updateable(task).AddQueue();
+                //    db.Default.SaveQueues();
+                //    var addrFrom = task.ADDRFROM.Split("-");
+                //    var addrTo = task.ADDRTO.Split("-");
+                //    //下发任务
+                //    obj.Data.TaskNumber = task.ID;
+                //    obj.Data.RowPos1 = addrFrom[0].ToShort();
+                //    obj.Data.TravelPos1 = addrFrom[1].ToShort();
+                //    obj.Data.LiftPos1 = addrFrom[2].ToShort();
+                //    obj.Data.RowPos2 = addrTo[0].ToShort();
+                //    obj.Data.TravelPos2 = addrTo[1].ToShort();
+                //    obj.Data.LiftPos2 = addrTo[2].ToShort();
+                //    obj.Data.VoucherNo++;
+                //});
             }
 
             #endregion 移库

+ 1 - 1
WCS.WorkEngineering/WCS.WorkEngineering.csproj

@@ -8,7 +8,7 @@
 
   <ItemGroup>
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.5" />
-    <PackageReference Include="ServiceCenter" Version="1.0.0.17" />
+    <PackageReference Include="ServiceCenter" Version="1.0.0.19" />
   </ItemGroup>
 
   <ItemGroup>