diff --git a/sys/Hh.Mes.POJO/WebEntity/base/base_sim.cs b/sys/Hh.Mes.POJO/WebEntity/base/base_sim.cs
new file mode 100644
index 0000000..45283e3
--- /dev/null
+++ b/sys/Hh.Mes.POJO/WebEntity/base/base_sim.cs
@@ -0,0 +1,70 @@
+using System;
+using SqlSugar;
+
+namespace Hh.Mes.POJO.Entity
+{
+    [SugarTable("base_sim")]
+    public partial class base_sim
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+        public int id { get; set; }
+ 
+        /// <summary>
+        /// 卡号
+        /// </summary>
+        [SugarColumn(Length = 50, ColumnDescription = "卡号", IsNullable = true)]
+        public string simNumber { get; set; }
+ 
+        /// <summary>
+        /// ip
+        /// </summary>
+        [SugarColumn(Length = 50, ColumnDescription = "ip", IsNullable = true)]
+        public string ip { get; set; }
+ 
+        /// <summary>
+        /// 供应商默认值长沙华恒机器人
+        /// </summary>
+        [SugarColumn(Length = 50, ColumnDescription = "供应商默认值长沙华恒机器人", IsNullable = true)]
+        public string suppliersInfo { get; set; }
+ 
+        /// <summary>
+        /// 出厂日期
+        /// </summary>
+        [SugarColumn(ColumnDescription = "出厂日期", IsNullable = true)]
+        public DateTime factoryDate { get; set; }
+ 
+        [SugarColumn(Length = 500, IsNullable = true)]
+        public string remarks { get; set; }
+ 
+        /// <summary>
+        /// 0删除 1启用
+        /// </summary>
+        [SugarColumn(ColumnDescription = "0删除 1启用", IsNullable = true)]
+        public int isDelete { get; set; }
+ 
+        [SugarColumn(IsNullable = true)]
+        public DateTime createTime { get; set; }
+ 
+        /// <summary>
+        /// createBy
+        /// </summary>
+        [SugarColumn(Length = 100, ColumnDescription = "createBy", IsNullable = true)]
+        public string createBy { get; set; }
+ 
+        /// <summary>
+        /// updateTime
+        /// </summary>
+        [SugarColumn(ColumnDescription = "updateTime", IsNullable = true)]
+        public DateTime updateTime { get; set; }
+ 
+        /// <summary>
+        /// updateBy
+        /// </summary>
+        [SugarColumn(Length = 100, ColumnDescription = "updateBy", IsNullable = true)]
+        public string updateBy { get; set; }
+ 
+     }
+}
\ No newline at end of file
diff --git a/sys/Hh.Mes.POJO/WebEntity/base/base_sim_equipment_rel.cs b/sys/Hh.Mes.POJO/WebEntity/base/base_sim_equipment_rel.cs
new file mode 100644
index 0000000..3e316f2
--- /dev/null
+++ b/sys/Hh.Mes.POJO/WebEntity/base/base_sim_equipment_rel.cs
@@ -0,0 +1,34 @@
+using System;
+using SqlSugar;
+
+namespace Hh.Mes.POJO.Entity
+{
+    [SugarTable("base_sim_equipment_rel")]
+    public partial class base_sim_equipment_rel
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+        public int id { get; set; }
+ 
+        /// <summary>
+        /// sim卡号
+        /// </summary>
+        [SugarColumn(Length = 50, ColumnDescription = "sim卡号", IsNullable = true)]
+        public string simNumber { get; set; }
+ 
+        /// <summary>
+        /// 项目keys
+        /// </summary>
+        [SugarColumn(ColumnDescription = "项目keys", IsNullable = true)]
+        public Guid projectKey { get; set; }
+ 
+        /// <summary>
+        /// 设备编码
+        /// </summary>
+        [SugarColumn(Length = 50, ColumnDescription = "设备编码", IsNullable = true)]
+        public string equipmentCode { get; set; }
+ 
+     }
+}
\ No newline at end of file
diff --git a/sys/Hh.Mes.POJO/WebEntity/equipment/base_equipment.cs b/sys/Hh.Mes.POJO/WebEntity/equipment/base_equipment.cs
index 5980167..a7cf085 100644
--- a/sys/Hh.Mes.POJO/WebEntity/equipment/base_equipment.cs
+++ b/sys/Hh.Mes.POJO/WebEntity/equipment/base_equipment.cs
@@ -30,12 +30,12 @@ namespace Hh.Mes.POJO.Entity
         [SugarColumn(Length = 100, ColumnDescription = "设备名称", IsNullable = true)]
         public string equipmentName { get; set; }
 
-        [SugarColumn(Length = 20, IsNullable = true)]
+        /// <summary>
+        /// 设备类型编码
+        /// </summary>
+        [SugarColumn(Length = 20, ColumnDescription = "设备类型编码", IsNullable = true)]
         public string equipmentTypeCode { get; set; }
 
-        [SugarColumn(Length = 20, IsNullable = true)]
-        public string equipmentTypeName { get; set; }
-
         /// <summary>
         /// 维护规则Id
         /// </summary>
@@ -95,5 +95,8 @@ namespace Hh.Mes.POJO.Entity
         /// </summary>
         [SugarColumn(Length = 100, ColumnDescription = "updateBy", IsNullable = true)]
         public string updateBy { get; set; }
+
+        [SugarColumn(ColumnDescription = "出厂时间", IsNullable = true)]
+        public DateTime startTime { get; set; }
     }
 }
\ No newline at end of file
diff --git a/sys/Hh.Mes.Service/ApiService/UpstreamDown/UpstreamSendEquipment.cs b/sys/Hh.Mes.Service/ApiService/UpstreamDown/UpstreamSendEquipment.cs
index 13e8077..cca7830 100644
--- a/sys/Hh.Mes.Service/ApiService/UpstreamDown/UpstreamSendEquipment.cs
+++ b/sys/Hh.Mes.Service/ApiService/UpstreamDown/UpstreamSendEquipment.cs
@@ -34,7 +34,6 @@ namespace Hh.Mes.Service.ApiService
                         equipmentCode = entity.equipment_code,
                         equipmentName = entity.equipment_name,
                         equipmentTypeCode = entity.equipmentType_code,
-                        equipmentTypeName = entity.equipmentType_Name,
                         ip = entity.ip,
                         destinationArea = entity.destination_area,
                         remark = entity.remark,
diff --git a/sys/Hh.Mes.Service/WebService/Base/BaseSimEquipmentRelService.cs b/sys/Hh.Mes.Service/WebService/Base/BaseSimEquipmentRelService.cs
new file mode 100644
index 0000000..a96b329
--- /dev/null
+++ b/sys/Hh.Mes.Service/WebService/Base/BaseSimEquipmentRelService.cs
@@ -0,0 +1,106 @@
+using Hh.Mes.Common.Infrastructure;
+using Hh.Mes.Common.log;
+using Hh.Mes.Common.Request;
+using Hh.Mes.POJO.Entity;
+using Hh.Mes.POJO.Response;
+using Hh.Mes.Service.Repository;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using Hh.Mes.Pojo.System;
+
+namespace Hh.Mes.Service.Base
+{
+    public class BaseSimEquipmentRelService : RepositorySqlSugar<base_sim_equipment_rel>
+    {
+        public dynamic Load(PageReq pageReq, base_sim_equipment_rel entity)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var result = new Response<List<base_sim_equipment_rel>>();
+                var expression = LinqWhere(entity);
+                //先组合查询表达式
+                var query = Context.Queryable<base_sim_equipment_rel>().Where(expression);
+                //Exel为ture就不分页,因为导出的话是全部导出
+                if (pageReq != null)
+                {
+                    int total = 0;
+                    result.Result = query.ToOffsetPage(pageReq.page, pageReq.limit, ref total);
+                    result.Count = total;
+                }
+                else
+                {
+                    result.Result = query.ToList();
+                    result.Count = result.Result.Count();
+                }
+                return result;
+            }, catchRetrunValue: "list");
+        }
+ 
+        public dynamic Ins(base_sim_equipment_rel entity)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var response = new Response();
+                //entity.createBy = sysWebUser?.Account;
+                //entity.createTime = DateTime.Now;
+                response.Status = Add(entity);
+                if (!response.Status)response.Message = SystemVariable.dataActionError;
+                return response;
+            });
+        }
+ 
+        public dynamic Upd(base_sim_equipment_rel entity)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var response = new Response();
+               //entity.updateBy = sysWebUser?.Account;
+                //entity.updateTime = DateTime.Now;
+                response.Status = Update(entity);
+                if (!response.Status) response.Message = SystemVariable.dataActionError;
+                return response;
+            });
+        }
+ 
+        public dynamic DelByIds(int[] ids)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var response = new Response();
+                Context.Deleteable<base_sim_equipment_rel>(t => ids.Contains(t.id)).ExecuteCommand();
+                return response;
+            });
+        }
+ 
+        public Response ExportData(base_sim_equipment_rel entity)
+        {
+            return Load(null, entity);
+        }
+ 
+        public Expression<Func<base_sim_equipment_rel, bool>> LinqWhere(base_sim_equipment_rel model)
+        {
+            try
+            {
+                var exp = Expressionable.Create<base_sim_equipment_rel>();
+                //数据过滤条件
+                //if (!string.IsNullOrWhiteSpace(model.XXX)) exp.And(x => x.XXX.Contains(model.XXX));
+                if (!string.IsNullOrWhiteSpace(model.simNumber))
+                {
+                    exp.And(x => x.simNumber.Contains(model.simNumber));
+                }
+                if (!string.IsNullOrWhiteSpace(model.equipmentCode))
+                {
+                    exp.And(x => x.equipmentCode.Contains(model.equipmentCode));
+                }
+                return exp.ToExpression();//拼接表达式
+            }
+            catch (Exception ex)
+            {
+                throw new Exception($"{ex.Message}");
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/sys/Hh.Mes.Service/WebService/Base/BaseSimService.cs b/sys/Hh.Mes.Service/WebService/Base/BaseSimService.cs
new file mode 100644
index 0000000..a15c0a6
--- /dev/null
+++ b/sys/Hh.Mes.Service/WebService/Base/BaseSimService.cs
@@ -0,0 +1,134 @@
+using Hh.Mes.Common.Infrastructure;
+using Hh.Mes.Common.log;
+using Hh.Mes.Common.Request;
+using Hh.Mes.POJO.Entity;
+using Hh.Mes.POJO.Response;
+using Hh.Mes.Service.Repository;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using Hh.Mes.Pojo.System;
+
+namespace Hh.Mes.Service.Base
+{
+    public class BaseSimService : RepositorySqlSugar<base_sim>
+    {
+        public dynamic Load(PageReq pageReq, base_sim entity)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var result = new Response<List<base_sim>>();
+                var expression = LinqWhere(entity);
+                //先组合查询表达式
+                var query = Context.Queryable<base_sim>().Where(expression);
+                //Exel为ture就不分页,因为导出的话是全部导出
+                if (pageReq != null)
+                {
+                    int total = 0;
+                    result.Result = query.ToOffsetPage(pageReq.page, pageReq.limit, ref total);
+                    result.Count = total;
+                }
+                else
+                {
+                    result.Result = query.ToList();
+                    result.Count = result.Result.Count();
+                }
+                return result;
+            }, catchRetrunValue: "list");
+        }
+
+        public dynamic Ins(base_sim entity)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var response = new Response();
+                //entity.createBy = sysWebUser?.Account;
+                //entity.createTime = DateTime.Now;
+                response.Status = Add(entity);
+                if (!response.Status) response.Message = SystemVariable.dataActionError;
+                return response;
+            });
+        }
+
+        public dynamic Upd(base_sim entity)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var response = new Response();
+                //entity.updateBy = sysWebUser?.Account;
+                //entity.updateTime = DateTime.Now;
+                response.Status = Update(entity);
+                if (!response.Status) response.Message = SystemVariable.dataActionError;
+                return response;
+            });
+        }
+
+        public dynamic DelByIds(int[] ids)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var response = new Response();
+                Context.Deleteable<base_sim>(t => ids.Contains(t.id)).ExecuteCommand();
+                return response;
+            });
+        }
+
+        public Response ExportData(base_sim entity)
+        {
+            return Load(null, entity);
+        }
+
+        public Expression<Func<base_sim, bool>> LinqWhere(base_sim model)
+        {
+            try
+            {
+                var exp = Expressionable.Create<base_sim>();
+                //数据过滤条件
+                //if (!string.IsNullOrWhiteSpace(model.XXX)) exp.And(x => x.XXX.Contains(model.XXX));
+                if (!string.IsNullOrWhiteSpace(model.simNumber))
+                {
+                    exp.And(x => x.simNumber.Contains(model.simNumber));
+                }
+                if (!string.IsNullOrWhiteSpace(model.ip))
+                {
+                    exp.And(x => x.ip.Contains(model.ip));
+                }
+                if (!string.IsNullOrWhiteSpace(model.suppliersInfo))
+                {
+                    exp.And(x => x.suppliersInfo.Contains(model.suppliersInfo));
+                }
+                return exp.ToExpression();//拼接表达式
+            }
+            catch (Exception ex)
+            {
+                throw new Exception($"{ex.Message}");
+            }
+        }
+
+        public dynamic BindEquipment(string simNumber, bool checkeds, string equipmentCode, string factoryCode)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var response = new Response();
+                var projectKey = Context.Queryable<base_factory>().Where(x => x.factoryCode == factoryCode).Select(x => new { projectKey = x.projectKeys }).ToList();
+                if (checkeds)
+                {
+                    //添加
+                    var simBindCount = Context.Queryable<base_sim_equipment_rel>().Where(x => x.simNumber == simNumber).ToList().Count;
+                    if (simBindCount > 250)
+                    {
+                        response.Message = "一张SIM卡只允许绑定250个设备,请选择其它SIM卡绑定";
+                    }
+                   // base_sim_equipment_rel baseSimEquipmentRel = new base_sim_equipment_rel() {simNumber=simNumber,projectKey=projectKey, };
+                }
+                else
+                {
+
+                }
+                return response;
+            });
+        }
+    }
+}
\ No newline at end of file
diff --git a/sys/Hh.Mes.Service/WebService/Equipment/BaseEquipmentService.cs b/sys/Hh.Mes.Service/WebService/Equipment/BaseEquipmentService.cs
index dee8483..1a35a1c 100644
--- a/sys/Hh.Mes.Service/WebService/Equipment/BaseEquipmentService.cs
+++ b/sys/Hh.Mes.Service/WebService/Equipment/BaseEquipmentService.cs
@@ -57,8 +57,8 @@ namespace Hh.Mes.Service.Equipment
             return ExceptionsHelp.Instance.ExecuteT(() =>
             {
                 var response = new Response();
-                //entity.createBy = sysWebUser?.Account;
-                //entity.createTime = DateTime.Now;
+                entity.createBy = sysWebUser?.Account;
+                entity.createTime = DateTime.Now;
                 response.Status = Add(entity);
                 if (!response.Status) response.Message = SystemVariable.dataActionError;
                 return response;
@@ -70,8 +70,8 @@ namespace Hh.Mes.Service.Equipment
             return ExceptionsHelp.Instance.ExecuteT(() =>
             {
                 var response = new Response();
-                //entity.updateBy = sysWebUser?.Account;
-                //entity.updateTime = DateTime.Now;
+                entity.updateBy = sysWebUser?.Account;
+                entity.updateTime = DateTime.Now;
                 response.Status = Update(entity);
                 if (!response.Status) response.Message = SystemVariable.dataActionError;
                 return response;
diff --git a/sys/Hh.Mes.Service/WebService/Equipment/BaseEquipmentTypeService.cs b/sys/Hh.Mes.Service/WebService/Equipment/BaseEquipmentTypeService.cs
new file mode 100644
index 0000000..d08dc84
--- /dev/null
+++ b/sys/Hh.Mes.Service/WebService/Equipment/BaseEquipmentTypeService.cs
@@ -0,0 +1,110 @@
+using Hh.Mes.Common.Infrastructure;
+using Hh.Mes.Common.log;
+using Hh.Mes.Common.Request;
+using Hh.Mes.POJO.Entity;
+using Hh.Mes.POJO.Response;
+using Hh.Mes.Service.Repository;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using Hh.Mes.Pojo.System;
+
+namespace Hh.Mes.Service.Equipment
+{
+    public class BaseEquipmentTypeService : RepositorySqlSugar<base_equipment_type>
+    {
+        public dynamic Load(PageReq pageReq, base_equipment_type entity)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var result = new Response<List<base_equipment_type>>();
+                var expression = LinqWhere(entity);
+                //先组合查询表达式
+                var query = Context.Queryable<base_equipment_type>().Where(expression);
+                //Exel为ture就不分页,因为导出的话是全部导出
+                if (pageReq != null)
+                {
+                    int total = 0;
+                    result.Result = query.ToOffsetPage(pageReq.page, pageReq.limit, ref total);
+                    result.Count = total;
+                }
+                else
+                {
+                    result.Result = query.ToList();
+                    result.Count = result.Result.Count();
+                }
+                return result;
+            }, catchRetrunValue: "list");
+        }
+ 
+        public dynamic Ins(base_equipment_type entity)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var response = new Response();
+                entity.createBy = sysWebUser?.Account;
+                entity.createTime = DateTime.Now;
+                response.Status = Add(entity);
+                if (!response.Status)response.Message = SystemVariable.dataActionError;
+                return response;
+            });
+        }
+ 
+        public dynamic Upd(base_equipment_type entity)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var response = new Response();
+                entity.updateBy = sysWebUser?.Account;
+                entity.updateTime = DateTime.Now;
+                response.Status = Update(entity);
+                if (!response.Status) response.Message = SystemVariable.dataActionError;
+                return response;
+            });
+        }
+ 
+        public dynamic DelByIds(int[] ids)
+        {
+            return ExceptionsHelp.Instance.ExecuteT(() =>
+            {
+                var response = new Response();
+                Context.Deleteable<base_equipment_type>(t => ids.Contains(t.id)).ExecuteCommand();
+                return response;
+            });
+        }
+ 
+        public Response ExportData(base_equipment_type entity)
+        {
+            return Load(null, entity);
+        }
+ 
+        public Expression<Func<base_equipment_type, bool>> LinqWhere(base_equipment_type model)
+        {
+            try
+            {
+                var exp = Expressionable.Create<base_equipment_type>();
+                //数据过滤条件
+                //if (!string.IsNullOrWhiteSpace(model.XXX)) exp.And(x => x.XXX.Contains(model.XXX));
+                if (!string.IsNullOrWhiteSpace(model.code))
+                {
+                    exp.And(x => x.code.Contains(model.code));
+                }
+                if (!string.IsNullOrWhiteSpace(model.name))
+                {
+                    exp.And(x => x.name.Contains(model.name));
+                }
+                if (!string.IsNullOrWhiteSpace(model.description))
+                {
+                    exp.And(x => x.description.Contains(model.description));
+                }
+                return exp.ToExpression();//拼接表达式
+            }
+            catch (Exception ex)
+            {
+                throw new Exception($"{ex.Message}");
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/web/WebMvc/Areas/base/Controllers/BaseSimController.cs b/web/WebMvc/Areas/base/Controllers/BaseSimController.cs
new file mode 100644
index 0000000..a4279a3
--- /dev/null
+++ b/web/WebMvc/Areas/base/Controllers/BaseSimController.cs
@@ -0,0 +1,108 @@
+using Hh.Mes.Common.Request;
+using Hh.Mes.POJO.Entity;
+using Hh.Mes.Service;
+using Hh.Mes.Service.Base;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Mvc;
+using Hh.Mes.Service.SystemAuth;
+using WebMvc.Aop;
+
+namespace WebMvc.Areas.Base.Controllers
+{
+    [Area("Base")]
+    public class BaseSimController : BaseController
+    {
+        private readonly BaseSimService _service;
+        protected readonly IHostingEnvironment hostingEnvironment;
+
+        public BaseSimController(IAuth authUtil, BaseSimService service) : base(authUtil)
+        {
+            _service = service;
+            _service.sysWebUser = authUtil.GetCurrentUser().User;
+        }
+ 
+        #region 视图功能
+        /// <summary>
+        /// 默认视图Action
+        /// </summary>
+        /// <returns></returns>
+        [Authenticate]
+        [ServiceFilter(typeof(OperLogFilter))]
+        public ActionResult Index()
+        {
+            return View();
+        }
+        #endregion
+ 
+        #region 数据操作
+ 
+        /// <summary>
+        /// 加载及分页查询
+        /// </summary>
+        /// <param name="pageRequest">表单请求信息</param>
+        /// <param name="entity">请求条件实例</param>
+        /// <returns></returns>
+        [HttpPost]
+        public string Load(PageReq pageRequest, base_sim entity)
+        {
+            return Serialize(_service.Load(pageRequest, entity));
+        }
+ 
+        /// <summary>
+        /// 新增数据
+        /// </summary>
+        /// <param name="entity">新增实例</param>
+        /// <returns></returns>
+        [HttpPost]
+        [ServiceFilter(typeof(OperLogFilter))]
+        public string Ins(base_sim entity)
+        {
+            return Serialize(_service.Ins(entity));
+        }
+ 
+        /// <summary>
+        /// 修改数据
+        /// </summary>
+        /// <param name="entity">修改实例</param>
+        /// <returns></returns>
+        [HttpPost]
+        [ServiceFilter(typeof(OperLogFilter))]
+        public string Upd(base_sim entity)
+        {
+            return Serialize(_service.Upd(entity));
+        }
+ 
+        /// <summary>
+        /// 删除数据
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ServiceFilter(typeof(OperLogFilter))]
+        public string DelByIds(int[] ids)
+        {
+            return Serialize(_service.DelByIds(ids));
+        }
+        #endregion
+ 
+        #region 导出数据
+        /// <summary>
+        /// 导出数据
+        /// </summary>
+        /// <param name="entity">请求条件实例</param>
+        /// <returns></returns>
+        [HttpPost]
+        public string Export(base_sim entity)
+        {
+            return Serialize(_service.ExportData(entity));
+        }
+        #endregion
+ 
+        #region 自定义方法
+        public string BindEquipment(string simNumber,bool checkeds,string equipmentCode,string factoryCode)
+        {
+            return Serialize(_service.BindEquipment(simNumber,checkeds,equipmentCode,factoryCode));
+        }
+        #endregion
+    }
+}
\ No newline at end of file
diff --git a/web/WebMvc/Areas/base/Controllers/BaseSimEquipmentRelController.cs b/web/WebMvc/Areas/base/Controllers/BaseSimEquipmentRelController.cs
new file mode 100644
index 0000000..0633431
--- /dev/null
+++ b/web/WebMvc/Areas/base/Controllers/BaseSimEquipmentRelController.cs
@@ -0,0 +1,105 @@
+using Hh.Mes.Common.Request;
+using Hh.Mes.POJO.Entity;
+using Hh.Mes.Service;
+using Hh.Mes.Service.Base;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Mvc;
+using Hh.Mes.Service.SystemAuth;
+using WebMvc.Aop;
+
+namespace WebMvc.Areas.Base.Controllers
+{
+    [Area("Base")]
+    public class BaseSimEquipmentRelController : BaseController
+    {
+        private readonly BaseSimEquipmentRelService _service;
+        protected readonly IHostingEnvironment hostingEnvironment;
+
+        public BaseSimEquipmentRelController(IAuth authUtil, BaseSimEquipmentRelService service) : base(authUtil)
+        {
+            _service = service;
+            _service.sysWebUser = authUtil.GetCurrentUser().User;
+        }
+ 
+        #region 视图功能
+        /// <summary>
+        /// 默认视图Action
+        /// </summary>
+        /// <returns></returns>
+        [Authenticate]
+        [ServiceFilter(typeof(OperLogFilter))]
+        public ActionResult Index()
+        {
+            return View();
+        }
+        #endregion
+ 
+        #region 数据操作
+ 
+        /// <summary>
+        /// 加载及分页查询
+        /// </summary>
+        /// <param name="pageRequest">表单请求信息</param>
+        /// <param name="entity">请求条件实例</param>
+        /// <returns></returns>
+        [HttpPost]
+        public string Load(PageReq pageRequest, base_sim_equipment_rel entity)
+        {
+            return Serialize(_service.Load(pageRequest, entity));
+        }
+ 
+        /// <summary>
+        /// 新增数据
+        /// </summary>
+        /// <param name="entity">新增实例</param>
+        /// <returns></returns>
+        [HttpPost]
+        [ServiceFilter(typeof(OperLogFilter))]
+        public string Ins(base_sim_equipment_rel entity)
+        {
+            return Serialize(_service.Ins(entity));
+        }
+ 
+        /// <summary>
+        /// 修改数据
+        /// </summary>
+        /// <param name="entity">修改实例</param>
+        /// <returns></returns>
+        [HttpPost]
+        [ServiceFilter(typeof(OperLogFilter))]
+        public string Upd(base_sim_equipment_rel entity)
+        {
+            return Serialize(_service.Upd(entity));
+        }
+ 
+        /// <summary>
+        /// 删除数据
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ServiceFilter(typeof(OperLogFilter))]
+        public string DelByIds(int[] ids)
+        {
+            return Serialize(_service.DelByIds(ids));
+        }
+        #endregion
+ 
+        #region 导出数据
+        /// <summary>
+        /// 导出数据
+        /// </summary>
+        /// <param name="entity">请求条件实例</param>
+        /// <returns></returns>
+        [HttpPost]
+        public string Export(base_sim_equipment_rel entity)
+        {
+            return Serialize(_service.ExportData(entity));
+        }
+        #endregion
+ 
+        #region 自定义方法
+ 
+        #endregion
+    }
+}
\ No newline at end of file
diff --git a/web/WebMvc/Areas/base/Views/BaseSim/Index.cshtml b/web/WebMvc/Areas/base/Views/BaseSim/Index.cshtml
new file mode 100644
index 0000000..8c77bbf
--- /dev/null
+++ b/web/WebMvc/Areas/base/Views/BaseSim/Index.cshtml
@@ -0,0 +1,119 @@
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+@{
+    ViewData["title"] = "sim管理";
+    Layout = "~/Views/Shared/_Layout.cshtml";
+}
+@section header
+{
+}
+
+<div id="listForm" class="layui-tab-item layui-show">
+    <form class="layui-form layui-form-pane" action="" lay-filter="listForm">
+        <div class="layui-form-item" id="panelSearch" hidden>
+            <fieldset class="layui-elem-field">
+
+                <div class="layui-field-box" id="qform">
+                    <div class="layui-form-item layui-col-sm12">
+                        <div class="layui-inline toolList">
+                            <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-radius" data-type="btnQuery"><i class="layui-icon">&#xe615;</i>查询</a>
+                            <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm" data-type="btnReset"><i class="layui-icon">&#xe66c;</i>重置</a>
+                            <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-danger" data-type="btnClose"><i class="layui-icon">&#xe6a7;</i>关闭</a>
+                        </div>
+                    </div>
+                    <div class="layui-row">
+                        <div class="layui-col-sm3">
+                            <label class="layui-form-label">SIM卡号</label>
+                            <div class="layui-input-inline">
+                                <input name="simNumber" type="text" autocomplete="off" maxlength="35" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-col-sm3">
+                            <label class="layui-form-label">IP地址</label>
+                            <div class="layui-input-inline">
+                                <input name="ip" type="text" autocomplete="off" maxlength="35" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-col-sm3">
+                            <label class="layui-form-label">供应商</label>
+                            <div class="layui-input-inline">
+                                <input name="suppliersInfo" type="text" autocomplete="off" maxlength="35" class="layui-input">
+                            </div>
+                        </div>
+ 
+                    </div>
+                </div>
+            </fieldset>
+        </div>
+    </form>
+    <table id="mainList" lay-filter="mainList"></table>
+</div>
+
+<div id="modifyForm" class="layui-tab-item">
+    <form class="layui-form layui-form-pane" action="" lay-filter="modifyForm" onsubmit="return false;">
+      <div class="layui-row">
+        <div class="layui-col-sm6">
+            <label class="layui-form-label layui-col-sm3">卡号<span class="lable-required">*</span></label>
+            <div class="layui-input-inline layui-col-sm6">
+                <input type="text" name="simNumber" lay-verify="required" autocomplete="off" maxlength="35"  class="layui-input">
+            </div>
+        </div>
+        <div class="layui-col-sm6">
+            <label class="layui-form-label layui-col-sm3">ip<span class="lable-required">*</span></label>
+            <div class="layui-input-inline layui-col-sm6">
+                <input type="text" name="ip" lay-verify="required" autocomplete="off" maxlength="35"  class="layui-input">
+            </div>
+        </div>
+        <div class="layui-col-sm6">
+            <label class="layui-form-label layui-col-sm3">供应商<span class="lable-required">*</span></label>
+            <div class="layui-input-inline layui-col-sm6">
+                <input type="text" name="suppliersInfo" value="长沙华恒机器人有限公司" lay-verify="required" autocomplete="off" maxlength="35"  class="layui-input">
+            </div>
+        </div>
+        <div class="layui-col-sm6">
+            <label class="layui-form-label layui-col-sm3">出厂日期<span class="lable-required">*</span></label>
+            <div class="layui-input-inline layui-col-sm6">
+                <input name="factoryDate" type="text" lay-verify="required" autocomplete="off" class="layui-input layui-date">
+            </div>
+        </div>
+        <div class="layui-col-sm6">
+            <label class="layui-form-label layui-col-sm3">备注</label>
+            <div class="layui-input-inline layui-col-sm6">
+                <input type="text" name="remarks"  autocomplete="off" maxlength="350"  class="layui-input">
+            </div>
+        </div>
+        <div class="layui-col-sm6">
+            <label class="layui-form-label layui-col-sm3">状态<span class="lable-required">*</span></label>
+            <div class="layui-input-inline layui-col-sm6">
+                <input name="isDelete" type="checkbox" lay-verify="required"  lay-skin="switch" lay-text="启用|删除" checked="checked" value="1">
+            </div>
+        </div>
+ 
+        <div class="layui-form-item">
+            <!--表单验证按钮-->
+            <button class="layui-btn" style="display:none" name="fromAdd" lay-filter="fromAdd" lay-submit>fromAdd</button>
+            <button class="layui-btn" style="display:none" name="fromUpdate" lay-filter="fromUpdate" lay-submit>fromUpdate</button>
+        </div>
+    </div>
+        <div hidden>
+            <input name="id" type="text" class="layui-input">
+
+            <input name="createBy" type="text" class="layui-input">
+            <input name="createTime" type="text" class="layui-input">
+            <input name="updateTime" type="text" class="layui-input">
+            <input name="updateBy" type="text" class="layui-input">
+        </div>
+    </form>
+</div>
+
+<script type="text/html" id="toolbarTable">
+    <div class="layui-btn-container">
+        <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-mini" lay-event="btnSelect"><i class="layui-icon">&#xe628;</i>检索</a>
+        <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-mini" lay-event="btnRefresh"><i class="layui-icon">&#xe9aa;</i>刷新</a>
+        {{ loadMenus("BaseSim", 1) }}
+    </div>
+</script>
+
+@section Scripts
+{
+    <script type="text/javascript" src="/productjs/base/BaseSim.js" asp-append-version="true"></script>
+}
\ No newline at end of file
diff --git a/web/WebMvc/Areas/base/Views/BaseSimEquipmentRel/Index.cshtml b/web/WebMvc/Areas/base/Views/BaseSimEquipmentRel/Index.cshtml
new file mode 100644
index 0000000..7c662f3
--- /dev/null
+++ b/web/WebMvc/Areas/base/Views/BaseSimEquipmentRel/Index.cshtml
@@ -0,0 +1,95 @@
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+@{
+    ViewData["title"] = "sim项目设备关系表";
+    Layout = "~/Views/Shared/_Layout.cshtml";
+}
+@section header
+{
+}
+
+<div id="listForm" class="layui-tab-item layui-show">
+    <form class="layui-form layui-form-pane" action="" lay-filter="listForm">
+        <div class="layui-form-item" id="panelSearch" hidden>
+            <fieldset class="layui-elem-field">
+
+                <div class="layui-field-box" id="qform">
+                    <div class="layui-form-item layui-col-sm12">
+                        <div class="layui-inline toolList">
+                            <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-radius" data-type="btnQuery"><i class="layui-icon">&#xe615;</i>查询</a>
+                            <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm" data-type="btnReset"><i class="layui-icon">&#xe66c;</i>重置</a>
+                            <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-danger" data-type="btnClose"><i class="layui-icon">&#xe6a7;</i>关闭</a>
+                        </div>
+                    </div>
+                    <div class="layui-row">
+                        <div class="layui-col-sm3">
+                            <label class="layui-form-label">sim卡号</label>
+                            <div class="layui-input-inline">
+                                <input name="simNumber" type="text" autocomplete="off" maxlength="35" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-col-sm3">
+                            <label class="layui-form-label">设备编码</label>
+                            <div class="layui-input-inline">
+                                <input name="equipmentCode" type="text" autocomplete="off" maxlength="35" class="layui-input">
+                            </div>
+                        </div>
+ 
+                    </div>
+                </div>
+            </fieldset>
+        </div>
+    </form>
+    <table id="mainList" lay-filter="mainList"></table>
+</div>
+
+<div id="modifyForm" class="layui-tab-item">
+    <form class="layui-form layui-form-pane" action="" lay-filter="modifyForm" onsubmit="return false;">
+      <div class="layui-row">
+        <div class="layui-col-sm6">
+            <label class="layui-form-label layui-col-sm3">sim卡号<span class="lable-required">*</span></label>
+            <div class="layui-input-inline layui-col-sm6">
+                <input type="text" name="simNumber" lay-verify="required" autocomplete="off" maxlength="35"  class="layui-input">
+            </div>
+        </div>
+        <div class="layui-col-sm6">
+            <label class="layui-form-label layui-col-sm3">项目keys<span class="lable-required">*</span></label>
+            <div class="layui-input-inline layui-col-sm6">
+                <input type="text" name="projectKey" lay-verify="required" autocomplete="off" maxlength="11"  class="layui-input">
+            </div>
+        </div>
+        <div class="layui-col-sm6">
+            <label class="layui-form-label layui-col-sm3">设备编码<span class="lable-required">*</span></label>
+            <div class="layui-input-inline layui-col-sm6">
+                <input type="text" name="equipmentCode" lay-verify="required" autocomplete="off" maxlength="35"  class="layui-input">
+            </div>
+        </div>
+ 
+        <div class="layui-form-item">
+            <!--表单验证按钮-->
+            <button class="layui-btn" style="display:none" name="fromAdd" lay-filter="fromAdd" lay-submit>fromAdd</button>
+            <button class="layui-btn" style="display:none" name="fromUpdate" lay-filter="fromUpdate" lay-submit>fromUpdate</button>
+        </div>
+    </div>
+        <div hidden>
+            <input name="id" type="text" class="layui-input">
+
+            <input name="createBy" type="text" class="layui-input">
+            <input name="createTime" type="text" class="layui-input">
+            <input name="updateTime" type="text" class="layui-input">
+            <input name="updateBy" type="text" class="layui-input">
+        </div>
+    </form>
+</div>
+
+<script type="text/html" id="toolbarTable">
+    <div class="layui-btn-container">
+        <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-mini" lay-event="btnSelect"><i class="layui-icon">&#xe628;</i>检索</a>
+        <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-mini" lay-event="btnRefresh"><i class="layui-icon">&#xe9aa;</i>刷新</a>
+        {{ loadMenus("BaseSimEquipmentRel", 1) }}
+    </div>
+</script>
+
+@section Scripts
+{
+    <script type="text/javascript" src="/productjs/base/BaseSimEquipmentRel.js" asp-append-version="true"></script>
+}
\ No newline at end of file
diff --git a/web/WebMvc/Areas/equipment/Controllers/BaseEquipmentTypeController.cs b/web/WebMvc/Areas/equipment/Controllers/BaseEquipmentTypeController.cs
new file mode 100644
index 0000000..083e726
--- /dev/null
+++ b/web/WebMvc/Areas/equipment/Controllers/BaseEquipmentTypeController.cs
@@ -0,0 +1,105 @@
+using Hh.Mes.Common.Request;
+using Hh.Mes.POJO.Entity;
+using Hh.Mes.Service;
+using Hh.Mes.Service.Equipment;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Mvc;
+using Hh.Mes.Service.SystemAuth;
+using WebMvc.Aop;
+
+namespace WebMvc.Areas.Equipment.Controllers
+{
+    [Area("Equipment")]
+    public class BaseEquipmentTypeController : BaseController
+    {
+        private readonly BaseEquipmentTypeService _service;
+        protected readonly IHostingEnvironment hostingEnvironment;
+
+        public BaseEquipmentTypeController(IAuth authUtil, BaseEquipmentTypeService service) : base(authUtil)
+        {
+            _service = service;
+            _service.sysWebUser = authUtil.GetCurrentUser().User;
+        }
+ 
+        #region 视图功能
+        /// <summary>
+        /// 默认视图Action
+        /// </summary>
+        /// <returns></returns>
+        [Authenticate]
+        [ServiceFilter(typeof(OperLogFilter))]
+        public ActionResult Index()
+        {
+            return View();
+        }
+        #endregion
+ 
+        #region 数据操作
+ 
+        /// <summary>
+        /// 加载及分页查询
+        /// </summary>
+        /// <param name="pageRequest">表单请求信息</param>
+        /// <param name="entity">请求条件实例</param>
+        /// <returns></returns>
+        [HttpPost]
+        public string Load(PageReq pageRequest, base_equipment_type entity)
+        {
+            return Serialize(_service.Load(pageRequest, entity));
+        }
+ 
+        /// <summary>
+        /// 新增数据
+        /// </summary>
+        /// <param name="entity">新增实例</param>
+        /// <returns></returns>
+        [HttpPost]
+        [ServiceFilter(typeof(OperLogFilter))]
+        public string Ins(base_equipment_type entity)
+        {
+            return Serialize(_service.Ins(entity));
+        }
+ 
+        /// <summary>
+        /// 修改数据
+        /// </summary>
+        /// <param name="entity">修改实例</param>
+        /// <returns></returns>
+        [HttpPost]
+        [ServiceFilter(typeof(OperLogFilter))]
+        public string Upd(base_equipment_type entity)
+        {
+            return Serialize(_service.Upd(entity));
+        }
+ 
+        /// <summary>
+        /// 删除数据
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ServiceFilter(typeof(OperLogFilter))]
+        public string DelByIds(int[] ids)
+        {
+            return Serialize(_service.DelByIds(ids));
+        }
+        #endregion
+ 
+        #region 导出数据
+        /// <summary>
+        /// 导出数据
+        /// </summary>
+        /// <param name="entity">请求条件实例</param>
+        /// <returns></returns>
+        [HttpPost]
+        public string Export(base_equipment_type entity)
+        {
+            return Serialize(_service.ExportData(entity));
+        }
+        #endregion
+ 
+        #region 自定义方法
+ 
+        #endregion
+    }
+}
\ No newline at end of file
diff --git a/web/WebMvc/Areas/equipment/Views/BaseEquipment/Index.cshtml b/web/WebMvc/Areas/equipment/Views/BaseEquipment/Index.cshtml
index 98aba0d..4ef3605 100644
--- a/web/WebMvc/Areas/equipment/Views/BaseEquipment/Index.cshtml
+++ b/web/WebMvc/Areas/equipment/Views/BaseEquipment/Index.cshtml
@@ -1,10 +1,10 @@
 @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
 @{
-    ViewData["title"] = "设备";
+    ViewData["title"] = "设备管理";
     Layout = "~/Views/Shared/_Layout.cshtml";
 }
 @section header
-{
+    {
 }
 
 <div id="listForm" class="layui-tab-item layui-show">
@@ -22,7 +22,7 @@
                     </div>
                     <div class="layui-row">
                         <div class="layui-col-sm3">
-                            <label class="layui-form-label">设备编码,唯一且有规律易识别</label>
+                            <label class="layui-form-label">设备编码</label>
                             <div class="layui-input-inline">
                                 <input name="equipmentCode" type="text" autocomplete="off" class="layui-input">
                             </div>
@@ -34,12 +34,12 @@
                             </div>
                         </div>
                         <div class="layui-col-sm3">
-                            <label class="layui-form-label">此处写到这台设备对应的IP,一般为PLC的IP</label>
+                            <label class="layui-form-label">IP</label>
                             <div class="layui-input-inline">
                                 <input name="ip" type="text" autocomplete="off" class="layui-input">
                             </div>
                         </div>
- 
+
                     </div>
                 </div>
             </fieldset>
@@ -50,92 +50,74 @@
 
 <div id="modifyForm" class="layui-tab-item">
     <form class="layui-form layui-form-pane" action="" lay-filter="modifyForm" onsubmit="return false;">
-      <div class="layui-row">
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">设备编码,唯一且有规律易识别<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input type="text" name="equipmentCode" lay-verify="required" autocomplete="off" class="layui-input">
-            </div>
-        </div>
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">设备名<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input type="text" name="equipmentName" lay-verify="required" autocomplete="off" class="layui-input">
-            </div>
-        </div>
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">关联到设备类型<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input name="equipmentTypeCode" type="number" lay-verify="required" autocomplete="off" class="layui-input">
+        <div class="layui-row">
+            <div class="layui-col-sm6">
+                <label class="layui-form-label layui-col-sm3">设备编码<span class="lable-required">*</span></label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input type="text" name="equipmentCode" lay-verify="required" autocomplete="off" class="layui-input">
+                </div>
             </div>
-        </div>
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">此处写到这台设备对应的IP,一般为PLC的IP<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input type="text" name="ip" lay-verify="required" autocomplete="off" class="layui-input">
+            <div class="layui-col-sm6">
+                <label class="layui-form-label layui-col-sm3">厂房编码<span class="lable-required">*</span></label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input type="text" name="factoryCode" lay-verify="required" autocomplete="off" class="layui-input">
+                </div>
             </div>
-        </div>
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">所在区域,出于调度目的或其他划分,比如:为兼容转轨堆垛机设定,正常情况下与巷道相同,转轨情况下对应虚拟划分巷道<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input type="text" name="destinationArea" lay-verify="required" autocomplete="off" class="layui-input">
+            <div class="layui-col-sm6">
+                <label class="layui-form-label layui-col-sm3">设备名<span class="lable-required">*</span></label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input type="text" name="equipmentName" lay-verify="required" autocomplete="off" class="layui-input">
+                </div>
             </div>
-        </div>
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">描述<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input type="text" name="remark" lay-verify="required" autocomplete="off" class="layui-input">
+            <div class="layui-col-sm6">
+                <label class="layui-form-label layui-col-sm3">设备类型<span class="lable-required">*</span></label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <select name="equipmentTypeCode" lay-verify="required" class="layui-select"></select>
+                </div>
             </div>
-        </div>
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">维护规则Id<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input name="equipmentMaintainRuleId" type="number" lay-verify="required" autocomplete="off" class="layui-input">
+            <div class="layui-col-sm6">
+                <label class="layui-form-label layui-col-sm3">PLC-IP</label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input type="text" name="ip"  autocomplete="off" class="layui-input">
+                </div>
             </div>
-        </div>
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">创建时间<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input name="createTime" type="text" lay-verify="required" autocomplete="off" class="layui-input layui-date">
+            <div class="layui-col-sm6">
+                <label class="layui-form-label layui-col-sm3">所在区域</label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input type="text" name="destinationArea" autocomplete="off" class="layui-input">
+                </div>
             </div>
-        </div>
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">createdBy<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input type="text" name="createBy" lay-verify="required" autocomplete="off" class="layui-input">
+            <div class="layui-col-sm6">
+                <label class="layui-form-label layui-col-sm3">描述</label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input type="text" name="remark"  autocomplete="off" class="layui-input">
+                </div>
             </div>
-        </div>
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">对于更新时间,不自动写入,允许为null<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input name="updateTime" type="text" lay-verify="required" autocomplete="off" class="layui-input layui-date">
+            <div class="layui-col-sm6">
+                <label class="layui-form-label layui-col-sm3">维护规则Id</label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input name="equipmentMaintainRuleId" type="number" autocomplete="off" class="layui-input">
+                </div>
             </div>
-        </div>
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">updatedBy<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input type="text" name="updateBy" lay-verify="required" autocomplete="off" class="layui-input">
+            <div class="layui-col-sm6">
+                <label class="layui-form-label layui-col-sm3">是否启用</label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input type="checkbox" name="isDelete" lay-skin="switch" lay-text="启用|禁用" checked="checked" value="1">
+                </div>
             </div>
-        </div>
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">是否启用<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input type="text" name="isDelete" lay-verify="required" autocomplete="off" class="layui-input">
+            <div class="layui-col-sm6">
+                <label class="layui-form-label layui-col-sm3">图片文件名称</label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input type="text" name="imgSrc"  autocomplete="off" class="layui-input">
+                </div>
             </div>
-        </div>
-        <div class="layui-col-sm6">
-            <label class="layui-form-label layui-col-sm3">图片文件名称<span class="lable-required">*</span></label>
-            <div class="layui-input-inline layui-col-sm6">
-                <input type="text" name="imgSrc" lay-verify="required" autocomplete="off" class="layui-input">
+
+            <div class="layui-form-item">
+                <!--表单验证按钮-->
+                <button class="layui-btn" style="display:none" name="fromAdd" lay-filter="fromAdd" lay-submit>fromAdd</button>
+                <button class="layui-btn" style="display:none" name="fromUpdate" lay-filter="fromUpdate" lay-submit>fromUpdate</button>
             </div>
         </div>
- 
-        <div class="layui-form-item">
-            <!--表单验证按钮-->
-            <button class="layui-btn" style="display:none" name="fromAdd" lay-filter="fromAdd" lay-submit>fromAdd</button>
-            <button class="layui-btn" style="display:none" name="fromUpdate" lay-filter="fromUpdate" lay-submit>fromUpdate</button>
-        </div>
-    </div>
         <div hidden>
             <input name="id" type="text" class="layui-input">
 
@@ -156,6 +138,6 @@
 </script>
 
 @section Scripts
-{
+    {
     <script type="text/javascript" src="/productjs/equipment/BaseEquipment.js" asp-append-version="true"></script>
 }
\ No newline at end of file
diff --git a/web/WebMvc/Areas/equipment/Views/BaseEquipmentType/Index.cshtml b/web/WebMvc/Areas/equipment/Views/BaseEquipmentType/Index.cshtml
new file mode 100644
index 0000000..b37cd45
--- /dev/null
+++ b/web/WebMvc/Areas/equipment/Views/BaseEquipmentType/Index.cshtml
@@ -0,0 +1,107 @@
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+@{
+    ViewData["title"] = "设备类型表";
+    Layout = "~/Views/Shared/_Layout.cshtml";
+}
+@section header
+    {
+}
+
+<div id="listForm" class="layui-tab-item layui-show">
+    <form class="layui-form layui-form-pane" action="" lay-filter="listForm">
+        <div class="layui-form-item" id="panelSearch" hidden>
+            <fieldset class="layui-elem-field">
+
+                <div class="layui-field-box" id="qform">
+                    <div class="layui-form-item layui-col-sm12">
+                        <div class="layui-inline toolList">
+                            <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-radius" data-type="btnQuery"><i class="layui-icon">&#xe615;</i>查询</a>
+                            <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm" data-type="btnReset"><i class="layui-icon">&#xe66c;</i>重置</a>
+                            <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-danger" data-type="btnClose"><i class="layui-icon">&#xe6a7;</i>关闭</a>
+                        </div>
+                    </div>
+                    <div class="layui-row">
+                        <div class="layui-col-sm3">
+                            <label class="layui-form-label">设备类型代号</label>
+                            <div class="layui-input-inline">
+                                <input name="code" type="text" autocomplete="off" maxlength="22" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-col-sm3">
+                            <label class="layui-form-label">类型名称</label>
+                            <div class="layui-input-inline">
+                                <input name="name" type="text" autocomplete="off" maxlength="22" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-col-sm3">
+                            <label class="layui-form-label">描述</label>
+                            <div class="layui-input-inline">
+                                <input name="description" type="text" autocomplete="off" maxlength="22" class="layui-input">
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </fieldset>
+        </div>
+    </form>
+    <table id="mainList" lay-filter="mainList"></table>
+</div>
+
+<div id="modifyForm" class="layui-tab-item">
+    <form class="layui-form layui-form-pane" action="" lay-filter="modifyForm" onsubmit="return false;">
+        <div class="layui-row">
+            <div class="layui-col-sm12">
+                <label class="layui-form-label layui-col-sm3">类型代号<span class="lable-required">*</span></label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input type="text" name="code" lay-verify="required" autocomplete="off" maxlength="22" class="layui-input">
+                </div>
+            </div>
+            <div class="layui-col-sm12">
+                <label class="layui-form-label layui-col-sm3">类型名称<span class="lable-required">*</span></label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input type="text" name="name" lay-verify="required" autocomplete="off" maxlength="22" class="layui-input">
+                </div>
+            </div>
+            <div class="layui-col-sm12">
+                <label class="layui-form-label layui-col-sm3">描述<span class="lable-required">*</span></label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input type="text" name="description" lay-verify="required" autocomplete="off" maxlength="22" class="layui-input">
+                </div>
+            </div>
+            <div class="layui-col-sm6">
+                <label class="layui-form-label layui-col-sm3">是否生效<span class="lable-required">*</span></label>
+                <div class="layui-input-inline layui-col-sm6">
+                    <input type="checkbox" name="enable" lay-verify="required" lay-skin="switch" lay-text="生效|失效" checked="checked" value="true">
+                </div>
+            </div>
+
+            <div class="layui-form-item">
+                <!--表单验证按钮-->
+                <button class="layui-btn" style="display:none" name="fromAdd" lay-filter="fromAdd" lay-submit>fromAdd</button>
+                <button class="layui-btn" style="display:none" name="fromUpdate" lay-filter="fromUpdate" lay-submit>fromUpdate</button>
+            </div>
+        </div>
+        <div hidden>
+            <input name="id" type="text" class="layui-input">
+
+            <input name="createBy" type="text" class="layui-input">
+            <input name="createTime" type="text" class="layui-input">
+            <input name="updateTime" type="text" class="layui-input">
+            <input name="updateBy" type="text" class="layui-input">
+        </div>
+    </form>
+</div>
+
+<script type="text/html" id="toolbarTable">
+    <div class="layui-btn-container">
+        <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-mini" lay-event="btnSelect"><i class="layui-icon">&#xe628;</i>检索</a>
+        <a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-mini" lay-event="btnRefresh"><i class="layui-icon">&#xe9aa;</i>刷新</a>
+        {{ loadMenus("BaseEquipmentType", 1) }}
+    </div>
+</script>
+
+@section Scripts
+    {
+    <script type="text/javascript" src="/productjs/equipment/BaseEquipmentType.js" asp-append-version="true"></script>
+}
\ No newline at end of file
diff --git a/web/WebMvc/WebMvc.csproj b/web/WebMvc/WebMvc.csproj
index b0095d2..930be0a 100644
--- a/web/WebMvc/WebMvc.csproj
+++ b/web/WebMvc/WebMvc.csproj
@@ -16,6 +16,7 @@
  </PropertyGroup>
 
  <ItemGroup>
+   <Compile Remove="Areas\base\Views\BaseSimEquipmentRel\**" />
    <Compile Remove="Areas\configure\Views\base_product_header\**" />
    <Compile Remove="logs\**" />
    <Compile Remove="wwwroot\css\新文件夹\**" />
@@ -26,6 +27,7 @@
    <Compile Remove="wwwroot\productjs\distribution\**" />
    <Compile Remove="wwwroot\productjs\production\**" />
    <Compile Remove="wwwroot\productjs\quality\**" />
+   <Content Remove="Areas\base\Views\BaseSimEquipmentRel\**" />
    <Content Remove="Areas\configure\Views\base_product_header\**" />
    <Content Remove="logs\**" />
    <Content Remove="wwwroot\css\新文件夹\**" />
@@ -36,6 +38,7 @@
    <Content Remove="wwwroot\productjs\distribution\**" />
    <Content Remove="wwwroot\productjs\production\**" />
    <Content Remove="wwwroot\productjs\quality\**" />
+   <EmbeddedResource Remove="Areas\base\Views\BaseSimEquipmentRel\**" />
    <EmbeddedResource Remove="Areas\configure\Views\base_product_header\**" />
    <EmbeddedResource Remove="logs\**" />
    <EmbeddedResource Remove="wwwroot\css\新文件夹\**" />
@@ -46,6 +49,7 @@
    <EmbeddedResource Remove="wwwroot\productjs\distribution\**" />
    <EmbeddedResource Remove="wwwroot\productjs\production\**" />
    <EmbeddedResource Remove="wwwroot\productjs\quality\**" />
+   <None Remove="Areas\base\Views\BaseSimEquipmentRel\**" />
    <None Remove="Areas\configure\Views\base_product_header\**" />
    <None Remove="logs\**" />
    <None Remove="wwwroot\css\新文件夹\**" />
@@ -59,6 +63,7 @@
  </ItemGroup>
 
  <ItemGroup>
+   <Compile Remove="Areas\base\Controllers\BaseSimEquipmentRelController.cs" />
    <Compile Remove="Areas\Planned\Controllers\FactoryCalendarController.cs" />
  </ItemGroup>
 
diff --git a/web/WebMvc/wwwroot/baseJs/projectMap.js b/web/WebMvc/wwwroot/baseJs/projectMap.js
index ddecf0d..49edb7f 100644
--- a/web/WebMvc/wwwroot/baseJs/projectMap.js
+++ b/web/WebMvc/wwwroot/baseJs/projectMap.js
@@ -128,7 +128,6 @@ layui.config({
 
         },
         init: function () {
-            debugger
             app.methods.initMap();
             app.methods.initVue();
             app.methods.getProjectDataList();
diff --git a/web/WebMvc/wwwroot/productjs/base/BaseSim.js b/web/WebMvc/wwwroot/productjs/base/BaseSim.js
new file mode 100644
index 0000000..adb14e5
--- /dev/null
+++ b/web/WebMvc/wwwroot/productjs/base/BaseSim.js
@@ -0,0 +1,257 @@
+let action = null;
+layui.config({
+    base: "/js/",
+    version: 1
+}).use(['system'], function () {
+    var form = layui.form,
+        $ = layui.jquery,
+        element = layui.element,
+        table = layui.table,
+        system = layui.system,
+        sysU = new system.u(),
+        sendDataWhere = null,
+        sendDataDescWhere = null,
+        areaName = "base",
+        controllerName = "BaseSim",
+        app = null;
+
+    action = {
+        addOptions: function () {
+            var options = {
+                fromId: "#modifyForm form",
+                url: `/${areaName}/${controllerName}/Ins`,
+                //sendDataWhere: null,
+                //isAddWhereExtend: "arbitrarily",
+                //mainTable: app.data.tableIns,
+                submit: "submit(fromAdd)"
+            }
+            return options;
+        },
+
+        editOptions: function () {
+            var options = {
+                fromId: "#modifyForm form",
+                url: `/${areaName}/${controllerName}/Upd`,
+                submit: "submit(fromUpdate)"
+            }
+            return options;
+        },
+
+        deleteOptions: function () {
+            var options = {
+                url: `/${areaName}/${controllerName}/DelByIds`,
+                keyId: "id"
+            }
+            return options;
+        },
+
+        exportOptions: function () {
+            var options = {
+                fromId: "listForm",
+                url: `/${areaName}/${controllerName}/Export`,
+                isDefault: false,
+                sendDataWhere: {},
+                excelCols: {
+                    head: app.data.cols,
+                    body: app.data.colsDesc
+                }
+            }
+            return options;
+        },
+
+        queryOptions: function () {
+            var options = {
+                resetFrom: "form[lay-filter=listForm]",
+                fromId: "listForm",
+                urlExport: `/${areaName}/${controllerName}/Export`,
+                urlQuery: `/${areaName}/${controllerName}/Load`,
+                sendDataWhere: {},
+                mainTable: app.data.tableIns
+            }
+            return options;
+        },
+        /*rowClickOptions: function () {
+            var options = {
+                //是否主子表
+                isDefault: true,
+                targetTableId: app.data.tableElem,
+                tabfilter: "tableTabBody",
+                tabId: 2,
+                customFn: app.methods.initTableDesc
+            }
+            return options;
+        },*/
+
+        uploadOptions: function () {
+            var options = {
+                url: `/${areaName}/${controllerName}/Import`,
+                fromFile: "#excelfile",
+                content: $("#ImportData")
+            }
+            return options;
+        },
+        addBefore: function (callBack) {
+            //callBack是回调函数,如果editBefore有ajax 放在成功之后
+            if (callBack != null) callBack();
+        },
+
+        addSaveBefore: function (data, callBack) {
+            if (callBack != null) callBack();
+        },
+        editBefore: function (data, callBack) {
+            //data.enable = data.enable.toString();
+            form.val("modifyForm", data);
+            if (callBack != null) callBack();
+        },
+        editSaveBefore: function (data, callBack) {
+            if (typeof data.field.isDelete == "undefined") data.field["isDelete"] = "0";
+            if (callBack != null) callBack();
+        },
+
+        btnBindEquipment: function () {
+            var checkStatus = table.checkStatus('mainList'),
+                data = checkStatus.data;
+            var edit = false;
+            if (data.length != 1) {
+                toplayer.msg("请选择要设备的Sim卡!");
+                return;
+            }
+
+            var url = `/equipment/BaseEquipment/Index?menuFlag=-2&selectColKeyCustom=keys&page=BaseSim&simNumber=${data[0].simNumber}`;//menuFlag=-2 菜单隐藏
+            var index = layer.open({
+                title: "为SIM卡【" + data[0].Name + "】绑定设备<span style='color:red;'>(一张sim卡可绑定最多250台设备,逐一勾选,禁止全选)</span>",
+                area: ["1000px", "600px"],
+                type: 2,
+                content: url,
+
+            });
+        },
+
+        checkboxMethod: function (obj) {
+            var page = "".GetUrlParam("page"),
+                xxx = "".GetUrlParam("xxx");
+            if (page == "xxx") {
+                var sendData = {
+
+                };
+                var ajaxConfig = {
+                    data: sendData,
+                    url: `${areaName}/${controllerName}/xxx`,
+                    success: function (result) {
+                        if (sysU.successBefore(result)) return false;
+                        layer.msg(result.Message);
+                    }
+                };
+                sysU.ajax(ajaxConfig);
+            }
+        },
+        //所有动作成功之后
+        actionSuccess: (flag) => {
+            sysU.refreshTable(app, sysU, null, flag);
+        },
+        closeAfter: function (callBack) {
+            if (callBack != null) callBack();
+        }
+    }
+
+    app = {
+        data: {
+            cols: [[
+                { checkbox: true, fixed: true },
+                { field: "id", width: 80, hide: true, title: "Id" },
+                { field: "simNumber", width: 150, title: "SIM卡号" },
+                { field: "ip", width: 150, title: "IP地址" },
+                { field: "suppliersInfo", width: 150, title: "供应商" },
+                { field: "factoryDate", width: 150, title: "出厂日期" },
+                { field: "remarks", width: 150, title: "备注" },
+                { field: "isDelete", width: 150, title: "状态" },
+                { field: "createTime", width: 150, title: "创建时间" },
+                { field: "createBy", width: 150, title: "创建人" },
+                { field: "updateTime", width: 150, title: "修改时间" },
+                { field: "updateBy", width: 150, title: "修改人" },
+            ]],
+            colsDesc: null,
+            tableIns: null,
+            tableElem: "mainList",
+            tableInsDesc: null,
+            tableElemDesc: "mainListDesc",
+
+            //下拉框配置
+            selectOption: {
+                //station: {
+                //    SelType: "FromUrl",
+                //    SelFrom: `/${areaName}/${controllerName}/StationLineSelect`,
+                //    SelLabel: "workStationName",
+                //    SelValue: "workStationCode",
+                //    OptGroup: true,
+                //    Dom: [$("[name='stationCode']")]
+                //},
+                //返回的数据 用于后续操作
+                selectData: {
+
+                }
+            },
+            //下拉框配置枚举
+            selectOptionEnum: {
+                type: {
+                    SelValue: "value",     //key or value
+                    SelFrom: "dataSource", //固定
+                    Dom: [$("select[name='xxx']")],
+                    dataSource: window.top.Enumxxx,
+                },
+                //返回的数据 用于后续操作
+                selectData: {
+
+                }
+            },
+        },
+        methods: {
+            initTable: function (opt) {
+                var config = {};
+                if (opt != undefined) $.extend(config, opt);
+                let options = {
+                    elem: "#" + app.data.tableElem,
+                    url: `/${areaName}/${controllerName}/Load`,
+                    cols: sysU.columnRecord(app.data.tableElem, app.data.cols),
+                    toolbar: '#toolbarTable',
+                    where: config,
+                    //height: "full-56",//如果是主明细页签,列表主体高度要设置,否则分页导航不直观展示
+                    doneExtend: function (res, obj) {
+
+                    }
+                }
+                app.data.tableIns = sysU.initTable(options);
+            },
+
+            initSelectTable: function () {
+                var opt1 = {
+                    elem: ".productCode",
+                    checkedKey: "productCode",
+                    doneKey: {
+                        key: "productCode",
+                        lableValue: "productName"
+                    },
+                    searchKey: "productCode",
+                    searchName: "产品编码"
+                };
+                sysU.initSelectProduct(opt1);
+            },
+
+            initFrom() {
+                //sysU.initSelect(app.data.selectOption);
+
+                //sysU.initSelecteByEnum(app.data.selectOptionEnum);
+            }
+        },
+        registerEvent: function () {
+
+        },
+        init: function () {
+            //var sendDataWhere = form.val("listForm")
+            app.methods.initTable();
+            app.methods.initFrom();
+            app.registerEvent();
+        }
+    };
+    app.init();
+});
\ No newline at end of file
diff --git a/web/WebMvc/wwwroot/productjs/base/BaseSimEquipmentRel.js b/web/WebMvc/wwwroot/productjs/base/BaseSimEquipmentRel.js
new file mode 100644
index 0000000..ae33ea7
--- /dev/null
+++ b/web/WebMvc/wwwroot/productjs/base/BaseSimEquipmentRel.js
@@ -0,0 +1,230 @@
+let action = null;
+layui.config({
+    base: "/js/",
+    version: 1
+}).use(['system'], function () {
+    var form = layui.form,
+        $ = layui.jquery,
+        element = layui.element,
+        table = layui.table,
+        system = layui.system,
+        sysU = new system.u(),
+        sendDataWhere = null,
+        sendDataDescWhere = null,
+        areaName = "base",
+        controllerName = "BaseSimEquipmentRel",
+        app = null;
+
+    action = {
+        addOptions: function () {
+            var options = {
+                fromId: "#modifyForm form",
+                url: `/${areaName}/${controllerName}/Ins`,
+                //sendDataWhere: null,
+                //isAddWhereExtend: "arbitrarily",
+                //mainTable: app.data.tableIns,
+                submit: "submit(fromAdd)"
+            }
+            return options;
+        },
+
+        editOptions: function () {
+            var options = {
+                fromId: "#modifyForm form",
+                url: `/${areaName}/${controllerName}/Upd`,
+                submit: "submit(fromUpdate)"
+            }
+            return options;
+        },
+
+        deleteOptions: function () {
+            var options = {
+                url: `/${areaName}/${controllerName}/DelByIds`,
+                keyId: "id"
+            }
+            return options;
+        },
+
+        exportOptions: function () {
+            var options = {
+                fromId: "listForm",
+                url: `/${areaName}/${controllerName}/Export`,
+                isDefault: false,
+                sendDataWhere:{},
+                excelCols: {
+                    head: app.data.cols,
+                    body: app.data.colsDesc
+                }
+            }
+            return options;
+        },
+
+        queryOptions: function () {
+            var options = {
+                resetFrom: "form[lay-filter=listForm]",
+                fromId: "listForm",
+                urlExport: `/${areaName}/${controllerName}/Export`,
+                urlQuery: `/${areaName}/${controllerName}/Load`,
+                sendDataWhere:{},
+                mainTable: app.data.tableIns
+            }
+            return options;
+        },
+        /*rowClickOptions: function () {
+            var options = {
+                //是否主子表
+                isDefault: true,
+                targetTableId: app.data.tableElem,
+                tabfilter: "tableTabBody",
+                tabId: 2,
+                customFn: app.methods.initTableDesc
+            }
+            return options;
+        },*/
+
+        uploadOptions: function () {
+            var options = {
+                url: `/${areaName}/${controllerName}/Import`,
+                fromFile: "#excelfile",
+                content: $("#ImportData")
+            }
+            return options;
+        },
+        addBefore: function (callBack) {
+            //callBack是回调函数,如果editBefore有ajax 放在成功之后
+            if (callBack != null) callBack();
+        },
+
+        addSaveBefore: function (data, callBack) {
+            if (callBack != null) callBack();
+        },
+        editBefore: function (data, callBack) {
+            //data.enable = data.enable.toString();
+            form.val("modifyForm", data);
+            if (callBack != null) callBack();
+        },
+        editSaveBefore: function (data, callBack) {
+            if (callBack != null) callBack();
+        },
+
+        checkboxMethod: function (obj) {
+            var page = "".GetUrlParam("page"),
+                xxx = "".GetUrlParam("xxx");
+            if (page == "xxx") {
+                var sendData = {
+                    
+                };
+                var ajaxConfig = {
+                    data: sendData,
+                    url: `${areaName}/${controllerName}/xxx`,
+                    success: function (result) {
+                        if (sysU.successBefore(result)) return false;
+                        layer.msg(result.Message);
+                    }
+                };
+                sysU.ajax(ajaxConfig);
+            }
+        },
+        //所有动作成功之后
+        actionSuccess: (flag) => {
+           sysU.refreshTable(app, sysU, null, flag);
+        },
+        closeAfter: function (callBack) {
+            if (callBack != null) callBack();
+        }
+    }
+
+    app = {
+        data: {
+            cols: [[
+                { checkbox: true, fixed: true },
+                { field: "id", width: 80, hide: true, title: "Id" },
+                { field: "simNumber", width: 150, title: "sim卡号" },
+                { field: "projectKey", width: 150, title: "项目keys" },
+                { field: "equipmentCode", width: 150, title: "设备编码" },
+            ]],
+            colsDesc:null,
+            tableIns: null,
+            tableElem: "mainList",
+            tableInsDesc: null,
+            tableElemDesc: "mainListDesc",
+
+            //下拉框配置
+            selectOption: {
+                //station: {
+                //    SelType: "FromUrl",
+                //    SelFrom: `/${areaName}/${controllerName}/StationLineSelect`,
+                //    SelLabel: "workStationName",
+                //    SelValue: "workStationCode",
+                //    OptGroup: true,
+                //    Dom: [$("[name='stationCode']")]
+                //},
+                //返回的数据 用于后续操作
+                selectData: {
+
+                }
+            },
+            //下拉框配置枚举
+            selectOptionEnum: {
+                 type: {
+                    SelValue: "value",     //key or value
+                    SelFrom: "dataSource", //固定
+                    Dom: [$("select[name='xxx']")],
+                    dataSource: window.top.Enumxxx,
+                },
+                //返回的数据 用于后续操作
+                selectData: {
+
+                }
+            },
+        },
+        methods: {
+            initTable: function (opt) {
+                var config = {};
+                if (opt != undefined) $.extend(config, opt);
+                let options = {
+                    elem: "#" + app.data.tableElem,
+                    url: `/${areaName}/${controllerName}/Load`,
+                    cols: sysU.columnRecord(app.data.tableElem, app.data.cols),
+                    toolbar: '#toolbarTable',
+                    where: config, 
+                    //height: "full-56",//如果是主明细页签,列表主体高度要设置,否则分页导航不直观展示
+                    doneExtend: function (res, obj) {
+                    
+                    }
+                }
+                app.data.tableIns = sysU.initTable(options);
+            },
+
+            initSelectTable: function () {
+              var opt1 = {
+                    elem: ".productCode",
+                    checkedKey: "productCode",
+                    doneKey: {
+                        key: "productCode",
+                        lableValue: "productName"
+                    },
+                    searchKey: "productCode",
+                    searchName: "产品编码"
+                };
+               sysU.initSelectProduct(opt1);
+            },
+
+            initFrom() {
+                //sysU.initSelect(app.data.selectOption);
+
+                //sysU.initSelecteByEnum(app.data.selectOptionEnum);
+            }
+        },
+        registerEvent: function () {
+
+        },
+        init: function () {
+            //var sendDataWhere = form.val("listForm")
+            app.methods.initTable();
+            app.methods.initFrom();
+            app.registerEvent();
+        }
+    };
+    app.init();
+});
\ No newline at end of file
diff --git a/web/WebMvc/wwwroot/productjs/equipment/BaseEquipment.js b/web/WebMvc/wwwroot/productjs/equipment/BaseEquipment.js
index 375dfec..f4781f1 100644
--- a/web/WebMvc/wwwroot/productjs/equipment/BaseEquipment.js
+++ b/web/WebMvc/wwwroot/productjs/equipment/BaseEquipment.js
@@ -16,7 +16,35 @@ layui.config({
         app = null;
 
     action = {
-     
+        addOptions: function () {
+            var options = {
+                fromId: "#modifyForm form",
+                url: `/${areaName}/${controllerName}/Ins`,
+                //sendDataWhere: null,
+                //isAddWhereExtend: "arbitrarily",
+                //mainTable: app.data.tableIns,
+                submit: "submit(fromAdd)"
+            }
+            return options;
+        },
+
+        editOptions: function () {
+            var options = {
+                fromId: "#modifyForm form",
+                url: `/${areaName}/${controllerName}/Upd`,
+                submit: "submit(fromUpdate)"
+            }
+            return options;
+        },
+
+        deleteOptions: function () {
+            var options = {
+                url: `/${areaName}/${controllerName}/DelByIds`,
+                keyId: "id"
+            }
+            return options;
+        },
+
         exportOptions: function () {
             var options = {
                 fromId: "listForm",
@@ -62,26 +90,47 @@ layui.config({
             }
             return options;
         },
-       
+        addBefore: function (callBack) {
+            //callBack是回调函数,如果editBefore有ajax 放在成功之后
+            if (callBack != null) callBack();
+        },
+
+        addSaveBefore: function (data, callBack) {
+            if (callBack != null) callBack();
+        },
+        editBefore: function (data, callBack) {
+            //data.enable = data.enable.toString();
+            form.val("modifyForm", data);
+            if (callBack != null) callBack();
+        },
+        editSaveBefore: function (data, callBack) {
+            if (typeof data.field.isDelete == "undefined") data.field["isDelete"] = 0;
+            if (callBack != null) callBack();
+        },
 
         checkboxMethod: function (obj) {
             var page = "".GetUrlParam("page"),
-                xxx = "".GetUrlParam("xxx");
-            if (page == "xxx") {
+                simNumber = "".GetUrlParam("simNumber");
+            if (page == "BaseSim") {
                 var sendData = {
-
+                    simNumber: simNumber,
+                    checkeds: obj.checked,
+                    equipmentCode: obj.data.equipmentCode,
+                    factoryCode: obj.data.factoryCode
                 };
                 var ajaxConfig = {
                     data: sendData,
-                    url: `${areaName}/${controllerName}/xxx`,
+                    url: "/base/BaseSim/BindEquipment",
                     success: function (result) {
                         if (sysU.successBefore(result)) return false;
                         layer.msg(result.Message);
+                        sysU.refreshTable(app, sysU, null, "main");
                     }
                 };
                 sysU.ajax(ajaxConfig);
             }
         },
+
         //所有动作成功之后
         actionSuccess: (flag) => {
             sysU.refreshTable(app, sysU, null, flag);
@@ -100,20 +149,16 @@ layui.config({
                 { field: "factoryCode", width: 150, title: "厂房编码", hide: true },
                 { field: "equipmentName", width: 150, title: "设备名" },
 
-                { field: "equipmentTypeCode", width: 150, title: "关联到设备类型编码", hide: true },
-                { field: "equipmentTypeName", width: 150, title: "关联到设备类型" },
+                { field: "equipmentTypeCode", width: 150, title: "设备类型编码", hide: true },
+                /*{ field: "equipmentTypeName", width: 150, title: "设备类型",},*/
                 { field: "ip", width: 150, title: "PLC-IP", hide: true },
                 { field: "destinationArea", width: 150, title: "所在区域" },
 
                 { field: "remark", width: 150, title: "描述" },
                 { field: "equipmentMaintainRuleId", width: 150, title: "维护规则Id", hide: true },
-                { field: "isDelete", width: 150, title: "是否启用" },
+                { field: "isDelete", width: 150, title: "是否启用", },
                 { field: "imgSrc", width: 150, title: "图片文件路径" },
 
-                { field: "createTime", width: 150, title: "创建时间" },
-                { field: "createBy", width: 150, title: "创建人" },
-                { field: "updateTime", width: 150, title: "更新时间" },
-                { field: "updateBy", width: 150, title: "更新人" },
             ]],
             colsDesc: null,
             tableIns: null,
@@ -123,14 +168,15 @@ layui.config({
 
             //下拉框配置
             selectOption: {
-                //station: {
-                //    SelType: "FromUrl",
-                //    SelFrom: `/${areaName}/${controllerName}/StationLineSelect`,
-                //    SelLabel: "workStationName",
-                //    SelValue: "workStationCode",
-                //    OptGroup: true,
-                //    Dom: [$("[name='stationCode']")]
-                //},
+                selectEquipmentTypeCode: {
+                    SelType: "FromUrl",
+                    SelFrom: `/${areaName}/BaseEquipmentType/Load`,
+                    //SelModel:"EquipmentTypeName",
+                    SelLabel: "name",
+                    SelValue: "code",
+                    Where: {},
+                    Dom: [$("[name='equipmentTypeCode']")]
+                },
                 //返回的数据 用于后续操作
                 selectData: {
 
@@ -183,7 +229,7 @@ layui.config({
             },
 
             initFrom() {
-                //sysU.initSelect(app.data.selectOption);
+                sysU.initSelect(app.data.selectOption);
 
                 //sysU.initSelecteByEnum(app.data.selectOptionEnum);
             }
diff --git a/web/WebMvc/wwwroot/productjs/equipment/BaseEquipmentType.js b/web/WebMvc/wwwroot/productjs/equipment/BaseEquipmentType.js
new file mode 100644
index 0000000..cfbd7ba
--- /dev/null
+++ b/web/WebMvc/wwwroot/productjs/equipment/BaseEquipmentType.js
@@ -0,0 +1,238 @@
+let action = null;
+layui.config({
+    base: "/js/",
+    version: 1
+}).use(['system'], function () {
+    var form = layui.form,
+        $ = layui.jquery,
+        element = layui.element,
+        table = layui.table,
+        system = layui.system,
+        sysU = new system.u(),
+        sendDataWhere = null,
+        sendDataDescWhere = null,
+        areaName = "equipment",
+        controllerName = "BaseEquipmentType",
+        app = null;
+
+    action = {
+        addOptions: function () {
+            var options = {
+                fromId: "#modifyForm form",
+                url: `/${areaName}/${controllerName}/Ins`,
+                //sendDataWhere: null,
+                //isAddWhereExtend: "arbitrarily",
+                //mainTable: app.data.tableIns,
+                submit: "submit(fromAdd)",
+                area: ['500px', '300px']
+            }
+            return options;
+        },
+
+        editOptions: function () {
+            var options = {
+                fromId: "#modifyForm form",
+                url: `/${areaName}/${controllerName}/Upd`,
+                submit: "submit(fromUpdate)",
+                area:['500px','300px']
+            }
+            return options;
+        },
+
+        deleteOptions: function () {
+            var options = {
+                url: `/${areaName}/${controllerName}/DelByIds`,
+                keyId: "id"
+            }
+            return options;
+        },
+
+        exportOptions: function () {
+            var options = {
+                fromId: "listForm",
+                url: `/${areaName}/${controllerName}/Export`,
+                isDefault: false,
+                sendDataWhere:{},
+                excelCols: {
+                    head: app.data.cols,
+                    body: app.data.colsDesc
+                }
+            }
+            return options;
+        },
+
+        queryOptions: function () {
+            var options = {
+                resetFrom: "form[lay-filter=listForm]",
+                fromId: "listForm",
+                urlExport: `/${areaName}/${controllerName}/Export`,
+                urlQuery: `/${areaName}/${controllerName}/Load`,
+                sendDataWhere:{},
+                mainTable: app.data.tableIns
+            }
+            return options;
+        },
+        /*rowClickOptions: function () {
+            var options = {
+                //是否主子表
+                isDefault: true,
+                targetTableId: app.data.tableElem,
+                tabfilter: "tableTabBody",
+                tabId: 2,
+                customFn: app.methods.initTableDesc
+            }
+            return options;
+        },*/
+
+        uploadOptions: function () {
+            var options = {
+                url: `/${areaName}/${controllerName}/Import`,
+                fromFile: "#excelfile",
+                content: $("#ImportData")
+            }
+            return options;
+        },
+        addBefore: function (callBack) {
+            //callBack是回调函数,如果editBefore有ajax 放在成功之后
+            if (callBack != null) callBack();
+        },
+
+        addSaveBefore: function (data, callBack) {
+            if (callBack != null) callBack();
+        },
+        editBefore: function (data, callBack) {
+            //data.enable = data.enable.toString();
+            form.val("modifyForm", data);
+            if (callBack != null) callBack();
+        },
+        editSaveBefore: function (data, callBack) {
+            if (typeof data.field.enable == "undefined") data.field["enable"] = 'false';
+            if (callBack != null) callBack();
+        },
+
+        checkboxMethod: function (obj) {
+            var page = "".GetUrlParam("page"),
+                xxx = "".GetUrlParam("xxx");
+            if (page == "xxx") {
+                var sendData = {
+                    
+                };
+                var ajaxConfig = {
+                    data: sendData,
+                    url: `${areaName}/${controllerName}/xxx`,
+                    success: function (result) {
+                        if (sysU.successBefore(result)) return false;
+                        layer.msg(result.Message);
+                    }
+                };
+                sysU.ajax(ajaxConfig);
+            }
+        },
+        //所有动作成功之后
+        actionSuccess: (flag) => {
+           sysU.refreshTable(app, sysU, null, flag);
+        },
+        closeAfter: function (callBack) {
+            if (callBack != null) callBack();
+        }
+    }
+
+    app = {
+        data: {
+            cols: [[
+                { checkbox: true, fixed: true },
+                { field: "id", width: 80, hide: true, title: "Id" },
+                { field: "code", width: 150, title: "设备类型代号" },
+                { field: "name", width: 150, title: "类型名称" },
+                { field: "description", width: 150, title: "描述" },
+                { field: "enable", width: 150, title: "是否生效" },
+                { field: "createTime", width: 150, title: "建立时间" },
+                { field: "createBy", width: 150, title: "建立者" },
+                { field: "updateTime", width: 150, title: "更新时间" },
+                { field: "updateBy", width: 150, title: "更新者" },
+            ]],
+            colsDesc:null,
+            tableIns: null,
+            tableElem: "mainList",
+            tableInsDesc: null,
+            tableElemDesc: "mainListDesc",
+
+            //下拉框配置
+            selectOption: {
+                //station: {
+                //    SelType: "FromUrl",
+                //    SelFrom: `/${areaName}/${controllerName}/StationLineSelect`,
+                //    SelLabel: "workStationName",
+                //    SelValue: "workStationCode",
+                //    OptGroup: true,
+                //    Dom: [$("[name='stationCode']")]
+                //},
+                //返回的数据 用于后续操作
+                selectData: {
+
+                }
+            },
+            //下拉框配置枚举
+            selectOptionEnum: {
+                 type: {
+                    SelValue: "value",     //key or value
+                    SelFrom: "dataSource", //固定
+                    Dom: [$("select[name='xxx']")],
+                    dataSource: window.top.Enumxxx,
+                },
+                //返回的数据 用于后续操作
+                selectData: {
+
+                }
+            },
+        },
+        methods: {
+            initTable: function (opt) {
+                var config = {};
+                if (opt != undefined) $.extend(config, opt);
+                let options = {
+                    elem: "#" + app.data.tableElem,
+                    url: `/${areaName}/${controllerName}/Load`,
+                    cols: sysU.columnRecord(app.data.tableElem, app.data.cols),
+                    toolbar: '#toolbarTable',
+                    where: config, 
+                    //height: "full-56",//如果是主明细页签,列表主体高度要设置,否则分页导航不直观展示
+                    doneExtend: function (res, obj) {
+                    
+                    }
+                }
+                app.data.tableIns = sysU.initTable(options);
+            },
+
+            initSelectTable: function () {
+              var opt1 = {
+                    elem: ".productCode",
+                    checkedKey: "productCode",
+                    doneKey: {
+                        key: "productCode",
+                        lableValue: "productName"
+                    },
+                    searchKey: "productCode",
+                    searchName: "产品编码"
+                };
+               sysU.initSelectProduct(opt1);
+            },
+
+            initFrom() {
+                //sysU.initSelect(app.data.selectOption);
+
+                //sysU.initSelecteByEnum(app.data.selectOptionEnum);
+            }
+        },
+        registerEvent: function () {
+
+        },
+        init: function () {
+            //var sendDataWhere = form.val("listForm")
+            app.methods.initTable();
+            app.methods.initFrom();
+            app.registerEvent();
+        }
+    };
+    app.init();
+});
\ No newline at end of file