diff --git a/ZR.Admin.WebApi/Controllers/Business/OdfFramesController.cs b/ZR.Admin.WebApi/Controllers/Business/OdfFramesController.cs
new file mode 100644
index 0000000..96804c9
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/Business/OdfFramesController.cs
@@ -0,0 +1,178 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.Business.Dto;
+using ZR.Model.Business;
+using ZR.Service.Business.IBusinessService;
+using ZR.Service.Business;
+
+//创建时间:2025-08-05
+namespace ZR.Admin.WebApi.Controllers.Business
+{
+ ///
+ /// 框-信息
+ ///
+ [Route("business/OdfFrames")]
+ public class OdfFramesController : BaseController
+ {
+ ///
+ /// 框-信息接口
+ ///
+ private readonly IOdfFramesService _OdfFramesService;
+
+ ///
+ /// 端口
+ ///
+ private readonly IOdfPortsService _OdfPortsService;
+ ///
+ /// 机架列表接口
+ ///
+ private readonly IOdfRacksService _OdfRacksService;
+ private readonly IOdfRoomsService _odfRooms;
+
+ public OdfFramesController(IOdfRacksService OdfRacksService, IOdfRoomsService odfRooms,
+ IOdfFramesService odfFramesService,
+ IOdfPortsService odfPortsService)
+ {
+ _OdfRacksService = OdfRacksService;
+ _odfRooms = odfRooms;
+ _OdfFramesService = odfFramesService;
+ _OdfPortsService = odfPortsService;
+ }
+
+ ///
+ /// 查询框-信息列表
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ [ActionPermissionFilter(Permission = "odfframes:list")]
+ public IActionResult QueryOdfFrames([FromQuery] OdfFramesQueryDto parm)
+ {
+ var response = _OdfFramesService.GetList(parm);
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 查询框-信息详情
+ ///
+ ///
+ ///
+ [HttpGet("{Id}")]
+ [ActionPermissionFilter(Permission = "odfframes:query")]
+ public IActionResult GetOdfFrames(int Id)
+ {
+ var response = _OdfFramesService.GetInfo(Id);
+
+ var info = response.Adapt();
+ return SUCCESS(info);
+ }
+
+ ///
+ /// 添加框-信息
+ ///
+ ///
+ [HttpPost]
+ [ActionPermissionFilter(Permission = "odfframes:add")]
+ [Log(Title = "框-信息", BusinessType = BusinessType.INSERT)]
+ public async Task AddOdfFrames([FromBody] OdfFramesExpertDto parm)
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+ var rooms = _odfRooms.GetById(parm.RoomId);
+ if (rooms == null)
+ {
+ return ToResponse(ResultCode.FAIL, "机房不存在");
+ }
+ modal.DeptId = rooms.DeptId ?? 0;
+ modal.RackId = parm.RackId;
+ modal.PortsRow = parm.RowCount;
+ modal.PortsCol = parm.PortsCount;
+ modal.PortsCount = parm.RowCount * parm.PortsCount;
+ modal.UpdateAt = DateTime.Now;
+ modal.CreatedAt = DateTime.Now;
+ var response = _OdfFramesService.AddOdfFrames(modal);
+ var roomId = rooms.Id;
+ var roomName = rooms.RoomName;
+
+ var ra = _OdfRacksService.GetById(modal.RackId);
+ //添加机框结束
+ if (parm.RowCount > 0)
+ {
+ //添加行
+ if (parm.PortsCount > 0)
+ {
+ int index = 0;
+ //添加端口
+
+ var frame = response;
+ List ports = new List();
+ for (int row = 0; row < parm.RowCount; row++)
+ {
+ for (int port = 0; port < parm.PortsCount; port++)
+ {
+ ports.Add(new OdfPorts()
+ {
+ CreatedAt = DateTime.Now,
+ DeptId = rooms.DeptId ?? 0,
+ DeptName = rooms.DeptName,
+ RackId = frame.RackId,
+ RackName = ra.RackName,
+ RoomId = roomId,
+ RoomName = roomName,
+ FrameId = frame.Id,
+ FrameName = frame.PortsName,
+ Name = $"{(row + 1)}-{(port + 1)}",
+ RowNumber = row,
+ PortNumber = port,
+ OpticalAttenuation = "",
+ HistoryRemarks = "",
+ Remarks = "",
+ Status = parm.DefaultStatus,
+ UpdatedAt = DateTime.Now,
+ });
+ }
+ }
+ await _OdfPortsService.AsInsertable(ports).ExecuteReturnEntityAsync(true);
+ //如果超过100个机框,则休眠一下,防止服务器死机
+ index++;
+ if (index > 100)
+ {
+ Thread.Sleep(50);
+ index = 0;
+ }
+ }
+ }
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 更新框-信息
+ ///
+ ///
+ [HttpPut]
+ [ActionPermissionFilter(Permission = "odfframes:edit")]
+ [Log(Title = "框-信息", BusinessType = BusinessType.UPDATE)]
+ public IActionResult UpdateOdfFrames([FromBody] OdfFramesDto parm)
+ {
+ var modal = parm.Adapt().ToUpdate(HttpContext);
+ var response = _OdfFramesService.UpdateOdfFrames(modal);
+
+ return ToResponse(response);
+ }
+
+ ///
+ /// 删除框-信息
+ ///
+ ///
+ [HttpPost("delete/{ids}")]
+ [ActionPermissionFilter(Permission = "odfframes:delete")]
+ [Log(Title = "框-信息", BusinessType = BusinessType.DELETE)]
+ public IActionResult DeleteOdfFrames([FromRoute] string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_OdfFramesService.Delete(idArr, "删除框-信息"));
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs b/ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs
new file mode 100644
index 0000000..e712445
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs
@@ -0,0 +1,340 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.Business.Dto;
+using ZR.Model.Business;
+using ZR.Service.Business.IBusinessService;
+using MiniExcelLibs;
+using ZR.Service.Business;
+using System.Collections.Generic;
+using SqlSugar;
+using static SKIT.FlurlHttpClient.Wechat.Api.Models.WxaBusinessGetLiveInfoResponse.Types;
+using System.Threading.Tasks;
+
+//创建时间:2025-08-05
+namespace ZR.Admin.WebApi.Controllers.Business
+{
+ ///
+ /// 端口
+ ///
+ [Route("business/OdfPorts")]
+ public class OdfPortsController : BaseController
+ {
+ ///
+ /// 端口接口
+ ///
+ private readonly IOdfPortsService _OdfPortsService;
+ ///
+ /// 机房列表接口
+ ///
+ private readonly IOdfRoomsService _OdfRoomsService;
+
+
+
+ ///
+ ///
+ ///
+ private readonly ISysUserService _SysUserService;
+
+ ///
+ ///机架
+ ///
+ private readonly IOdfRacksService _OdfRacksService;
+ ///
+ /// 框
+ ///
+ private readonly IOdfFramesService _OdfFramesService;
+
+
+ public OdfPortsController(IOdfRoomsService OdfRoomsService,
+ ISysDeptService sysDeptService,
+ ISysUserService sysUserService,
+ IOdfPortsService odfPortsService,
+ IOdfFramesService odfFramesService,
+ IOdfRacksService odfRacksService)
+ {
+ _OdfRoomsService = OdfRoomsService;
+ _SysUserService = sysUserService;
+ _OdfPortsService = odfPortsService;
+ _OdfFramesService = odfFramesService;
+ _OdfRacksService = odfRacksService;
+ }
+
+ ///
+ /// 查询端口列表
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ [ActionPermissionFilter(Permission = "odfports:list")]
+ public IActionResult QueryOdfPorts([FromQuery] OdfPortsQueryDto parm)
+ {
+ var response = _OdfPortsService.GetList(parm);
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 查询端口列表
+ ///
+ ///
+ ///
+ [HttpGet("mlist")]
+ [ActionPermissionFilter(Permission = "odfports:list")]
+ public async Task GetQueryOdfPorts([FromQuery] OdfPortsMQueryDto parm)
+ {
+ var list = await _OdfFramesService.AsQueryable().Where(it => it.RackId == parm.RackId)
+ .Select(it => new OdfPortsMListDto() { Id = it.Id, Name = it.PortsName }).ToListAsync();
+ foreach (var item in list)
+ {
+ var l = await _OdfPortsService.AsQueryable().Where(it => it.FrameId == item.Id).Select(it => new OdfPortsMDto() { Id = it.Id, Name = it.Name, Status = it.Status }).ToListAsync();
+ item.odfPortsList = l;
+ }
+ return SUCCESS(list);
+ }
+
+
+
+ ///
+ /// 查询端口详情
+ ///
+ ///
+ ///
+ [HttpGet("{Id}")]
+ [ActionPermissionFilter(Permission = "odfports:query")]
+ public IActionResult GetOdfPorts(int Id)
+ {
+ var response = _OdfPortsService.GetInfo(Id);
+
+ var info = response.Adapt();
+ return SUCCESS(info);
+ }
+
+ ///
+ /// 修改端口
+ ///
+ ///
+ ///
+ [HttpGet("status/{Id}/{status}")]
+ [ActionPermissionFilter(Permission = "odfports:edit")]
+ [Log(Title = "更新端口状态", BusinessType = BusinessType.UPDATE)]
+ public IActionResult GetOdfPortsStatus(int Id, int status)
+ {
+ var response = _OdfPortsService.GetInfo(Id);
+ response.Status = status;
+ response.UpdatedAt = DateTime.Now;
+ var s = _OdfPortsService.Update(response);
+ return SUCCESS(s);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ [HttpGet("odf")]
+ [ActionPermissionFilter(Permission = "odfports:edit")]
+ public IActionResult GetOdfTest()
+ {
+
+ return SUCCESS(new { update = true });
+ }
+
+ ///
+ /// 添加端口
+ ///
+ ///
+ [HttpPost]
+ [ActionPermissionFilter(Permission = "odfports:add")]
+ [Log(Title = "端口", BusinessType = BusinessType.INSERT)]
+ public IActionResult AddOdfPorts([FromBody] OdfPortsDto parm)
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+
+ var response = _OdfPortsService.AddOdfPorts(modal);
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 更新端口
+ ///
+ ///
+ [HttpPut]
+ [ActionPermissionFilter(Permission = "odfports:edit")]
+ [Log(Title = "端口", BusinessType = BusinessType.UPDATE)]
+ public IActionResult UpdateOdfPorts([FromBody] OdfPortsDto parm)
+ {
+ var modal = parm.Adapt().ToUpdate(HttpContext);
+ var response = _OdfPortsService.UpdateOdfPorts(modal);
+
+ return ToResponse(response);
+ }
+
+ ///
+ /// 更新端口
+ ///
+ ///
+ [HttpPost("save")]
+ [ActionPermissionFilter(Permission = "odfports:edit")]
+ [Log(Title = "APP更新端口", BusinessType = BusinessType.UPDATE)]
+ public IActionResult SaveMOdfPorts([FromBody] OdfPortsMMDto parm)
+ {
+ var port = _OdfPortsService.GetById(parm.Id);
+ if (port == null)
+ {
+ return ToResponse(ResultCode.FAIL, "保存失败");
+ }
+ port.Status = parm.Status;
+ port.HistoryRemarks = parm.HistoryRemarks;
+ port.Remarks = parm.Remarks;
+ port.OpticalAttenuation = parm.OpticalAttenuation;
+ var response = _OdfPortsService.UpdateOdfPorts(port);
+
+ return ToResponse(response);
+ }
+
+
+
+ ///
+ /// 修改端口
+ ///
+ ///
+ ///
+ [HttpGet("empty/{Id}")]
+ [ActionPermissionFilter(Permission = "odfports:edit")]
+ [Log(Title = "清空数据", BusinessType = BusinessType.UPDATE)]
+ public IActionResult GetOdfPortsEmpty(int Id)
+ {
+ var response = _OdfPortsService.GetInfo(Id);
+ response.Status = 0;
+ response.Remarks = "";
+ response.HistoryRemarks = "";
+ response.OpticalAttenuation = "";
+ response.UpdatedAt = DateTime.Now;
+ var s = _OdfPortsService.Update(response);
+ return SUCCESS(s);
+ }
+
+ ///
+ /// 删除端口
+ ///
+ ///
+ [HttpPost("delete/{ids}")]
+ [ActionPermissionFilter(Permission = "odfports:delete")]
+ [Log(Title = "端口", BusinessType = BusinessType.DELETE)]
+ public IActionResult DeleteOdfPorts([FromRoute] string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_OdfPortsService.Delete(idArr, "删除端口"));
+ }
+
+ ///
+ /// 导出端口
+ ///
+ ///
+ [Log(Title = "导出端口数据", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [HttpGet("export")]
+ [ActionPermissionFilter(Permission = "odfports:export")]
+
+ public IActionResult Export([FromQuery] OdfPortsQueryDto parm)
+ {
+ var list = _OdfPortsService.ExportList(parm).Result;
+ if (list == null || list.Count <= 0)
+ {
+ return ToResponse(ResultCode.FAIL, "没有要导出的数据");
+ }
+ var result = ExportExcelMini(list, "端口", "端口");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ ///
+ /// 导入
+ ///
+ ///
+ ///
+ [HttpPost("importData")]
+ [Log(Title = "端口导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ [ActionPermissionFilter(Permission = "odfports:import")]
+ public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
+ {
+ List list = new();
+ using (var stream = formFile.OpenReadStream())
+ {
+ list = stream.Query(startCell: "A1").ToList();
+ }
+
+ return SUCCESS(_OdfPortsService.ImportOdfPorts(list.Adapt>()));
+ }
+
+ ///
+ /// 端口导入模板下载
+ ///
+ ///
+ [HttpGet("importTemplate")]
+ [Log(Title = "端口模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [AllowAnonymous]
+ public IActionResult ImportTemplateExcel()
+ {
+ var result = DownloadImportTemplate(new List() { }, "OdfPorts");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+ ///
+ /// 删除端口
+ ///
+ ///
+ [HttpPost("deleteAll")]
+ [ActionPermissionFilter(Permission = "odfports:delete")]
+ [Log(Title = "删除端口数据", BusinessType = BusinessType.DELETE)]
+ public async Task DeleteAll([FromBody] OdfRoomsTreeDto treeDto)
+ {
+ if (treeDto.Level == 2)
+ {
+ //删除全部
+ var room = _OdfRoomsService.GetById(treeDto.RoomId);
+ if (room == null)
+ {
+ return ToResponse(ResultCode.FAIL, "删除失败");
+ }
+ //删除机房下的所有端口
+ await _OdfPortsService.AsDeleteable().Where(it => it.RoomId == room.Id).ExecuteCommandAsync();
+ // delete odf_frames where exists ( select id from odf_racks where roomid=1 and id=odf_frames.RackId )
+ //删除机房下所有的框
+ var deletedCount = await _OdfFramesService.AsDeleteable()
+ .Where(f => SqlFunc.Subqueryable()
+ .Where(r => r.RoomId == room.Id && r.Id == f.RackId)
+ .Any())
+ .ExecuteCommandAsync();
+
+ //删除机房下所有的机架
+ await _OdfRacksService.AsDeleteable().Where(it => it.RoomId == room.Id).ExecuteCommandAsync();
+
+ _OdfRoomsService.Delete(room.Id, "删除机房");
+ }
+ else if (treeDto.Level == 3)
+ {
+ var racks = _OdfRacksService.GetById(treeDto.RacksId);
+ if (racks == null)
+ {
+ return ToResponse(ResultCode.FAIL, "删除失败");
+ }
+ //删除机房下的所有端口
+ await _OdfPortsService.AsDeleteable().Where(it => it.RackId == racks.Id).ExecuteCommandAsync();
+ //删除机房下所有的框
+ var deletedCount = await _OdfFramesService.AsDeleteable().Where(it => it.RackId == racks.Id).ExecuteCommandAsync();
+ //删除机架
+ _OdfRacksService.Delete(racks);
+ }
+ else if (treeDto.Level == 4)
+ {
+ var frames = _OdfFramesService.GetById(treeDto.FramesId);
+ if (frames == null)
+ {
+ return ToResponse(ResultCode.FAIL, "删除失败");
+ }
+ //删除机房下的所有端口
+ await _OdfPortsService.AsDeleteable().Where(it => it.FrameId == frames.Id).ExecuteCommandAsync();
+ _OdfFramesService.Delete(frames);
+ }
+ return SUCCESS(1);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs b/ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs
new file mode 100644
index 0000000..1276ccb
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs
@@ -0,0 +1,283 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.Business.Dto;
+using ZR.Model.Business;
+using ZR.Service.Business.IBusinessService;
+using MiniExcelLibs;
+using ZR.Service.Business;
+
+//创建时间:2025-08-05
+namespace ZR.Admin.WebApi.Controllers.Business
+{
+ ///
+ /// 机架列表
+ ///
+ [Route("business/OdfRacks")]
+ public class OdfRacksController : BaseController
+ {
+ ///
+ /// 机架列表接口
+ ///
+ private readonly IOdfRacksService _OdfRacksService;
+ private readonly IOdfRoomsService _odfRooms;
+ ///
+ /// 框
+ ///
+ private readonly IOdfFramesService _OdfFramesService;
+ ///
+ /// 端口
+ ///
+ private readonly IOdfPortsService _OdfPortsService;
+
+ public OdfRacksController(IOdfRacksService OdfRacksService, IOdfRoomsService odfRooms,
+ IOdfFramesService odfFramesService,
+ IOdfPortsService odfPortsService)
+ {
+ _OdfRacksService = OdfRacksService;
+ _odfRooms = odfRooms;
+ _OdfFramesService = odfFramesService;
+ _OdfPortsService = odfPortsService;
+ }
+
+ ///
+ /// 查询机架列表列表
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ [ActionPermissionFilter(Permission = "odfracks:list")]
+ public IActionResult QueryOdfRacks([FromQuery] OdfRacksQueryDto parm)
+ {
+ var response = _OdfRacksService.GetList(parm);
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 查询机架列表详情
+ ///
+ ///
+ ///
+ [HttpGet("{Id}")]
+ [ActionPermissionFilter(Permission = "odfracks:query")]
+ public IActionResult GetOdfRacks(int Id)
+ {
+ var response = _OdfRacksService.GetInfo(Id);
+
+ var info = response.Adapt();
+ return SUCCESS(info);
+ }
+
+ ///
+ /// 添加机架列表
+ ///
+ ///
+ [HttpPost]
+ [ActionPermissionFilter(Permission = "odfracks:add")]
+ [Log(Title = "机架列表", BusinessType = BusinessType.INSERT)]
+ public IActionResult AddOdfRacks([FromBody] OdfRacksDto parm)
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+ if (modal.RoomId > 0)
+ {
+ var rooms = _odfRooms.GetById(modal.RoomId);
+ if (rooms == null)
+ {
+ return ToResponse(ResultCode.FAIL, "机房不存在");
+ }
+ modal.DeptId = rooms.DeptId ?? 0;
+ }
+ var response = _OdfRacksService.AddOdfRacks(modal);
+
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 添加机架列表
+ ///
+ ///
+ [HttpPost("expert")]
+ [ActionPermissionFilter(Permission = "odfracks:add")]
+ [Log(Title = "机架列表", BusinessType = BusinessType.INSERT)]
+ public async Task AddOdfRacksExpert([FromBody] OdfRacksExpertDto parm)
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+
+ if (modal.RoomId == 0)
+ {
+ return ToResponse(ResultCode.FAIL, "机房不存在");
+
+ }
+ var rooms = _odfRooms.GetById(modal.RoomId);
+ if (rooms == null)
+ {
+ return ToResponse(ResultCode.FAIL, "机房不存在");
+ }
+ modal.DeptId = rooms.DeptId ?? 0;
+ modal.FrameCount = parm.FramesCount;
+ var response = _OdfRacksService.AddOdfRacks(modal);
+ var roomId = rooms.Id;
+ var roomName = rooms.RoomName;
+
+ if (parm.FramesCount > 0)
+ {
+
+ //添加机框
+ List framesList = new List();
+ var rack = response;
+ for (int i = 0; i < parm.FramesCount; i++)
+ {
+ var t = await _OdfFramesService.InsertReturnEntityAsync(new OdfFrames()
+ {
+ CreatedAt = DateTime.Now,
+ UpdateAt = DateTime.Now,
+ PortsCol = parm.PortsCount,
+ PortsCount = parm.PortsCount,
+ DeptId = rack.DeptId,
+ PortsRow = parm.PortsCount,
+ PortsName = $"{(i + 1)}框",
+ RackId = rack.Id,
+ SequenceNumber = i + 1
+ });
+ framesList.Add(t);
+ }
+ //添加机框结束
+ if (parm.RowCount > 0)
+ {
+ //添加行
+ if (parm.PortsCount > 0)
+ {
+ int index = 0;
+ //添加端口
+ foreach (var frame in framesList)
+ {
+ var ra = rack;
+ if (ra == null)
+ {
+ continue;
+ }
+ List ports = new List();
+ for (int row = 0; row < parm.RowCount; row++)
+ {
+ for (int port = 0; port < parm.PortsCount; port++)
+ {
+ ports.Add(new OdfPorts()
+ {
+ CreatedAt = DateTime.Now,
+ DeptId = rooms.DeptId ?? 0,
+ DeptName = rooms.DeptName,
+ RackId = frame.RackId,
+ RackName = ra.RackName,
+ RoomId = roomId,
+ RoomName = roomName,
+ FrameId = frame.Id,
+ FrameName = frame.PortsName,
+ Name = $"{(row + 1)}-{(port + 1)}",
+ RowNumber = row,
+ PortNumber = port,
+ OpticalAttenuation = "",
+ HistoryRemarks = "",
+ Remarks = "",
+ Status = parm.DefaultStatus,
+ UpdatedAt = DateTime.Now,
+ });
+ }
+ }
+ await _OdfPortsService.AsInsertable(ports).ExecuteReturnEntityAsync(true);
+ //如果超过100个机框,则休眠一下,防止服务器死机
+ index++;
+ if (index > 100)
+ {
+ Thread.Sleep(50);
+ index = 0;
+ }
+ }
+
+ }
+ }
+ }
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 更新机架列表
+ ///
+ ///
+ [HttpPut]
+ [ActionPermissionFilter(Permission = "odfracks:edit")]
+ [Log(Title = "机架列表", BusinessType = BusinessType.UPDATE)]
+ public IActionResult UpdateOdfRacks([FromBody] OdfRacksDto parm)
+ {
+ var modal = parm.Adapt().ToUpdate(HttpContext);
+ var response = _OdfRacksService.UpdateOdfRacks(modal);
+
+ return ToResponse(response);
+ }
+
+ ///
+ /// 删除机架列表
+ ///
+ ///
+ [HttpPost("delete/{ids}")]
+ [ActionPermissionFilter(Permission = "odfracks:delete")]
+ [Log(Title = "机架列表", BusinessType = BusinessType.DELETE)]
+ public IActionResult DeleteOdfRacks([FromRoute] string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_OdfRacksService.Delete(idArr, "删除机架列表"));
+ }
+
+ ///
+ /// 导出机架列表
+ ///
+ ///
+ [Log(Title = "机架列表", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [HttpGet("export")]
+ [ActionPermissionFilter(Permission = "odfracks:export")]
+ public IActionResult Export([FromQuery] OdfRacksQueryDto parm)
+ {
+ var list = _OdfRacksService.ExportList(parm).Result;
+ if (list == null || list.Count <= 0)
+ {
+ return ToResponse(ResultCode.FAIL, "没有要导出的数据");
+ }
+ var result = ExportExcelMini(list, "机架列表", "机架列表");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ ///
+ /// 导入
+ ///
+ ///
+ ///
+ [HttpPost("importData")]
+ [Log(Title = "机架列表导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ [ActionPermissionFilter(Permission = "odfracks:import")]
+ public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
+ {
+ List list = new();
+ using (var stream = formFile.OpenReadStream())
+ {
+ list = stream.Query(startCell: "A1").ToList();
+ }
+
+ return SUCCESS(_OdfRacksService.ImportOdfRacks(list.Adapt>()));
+ }
+
+ ///
+ /// 机架列表导入模板下载
+ ///
+ ///
+ [HttpGet("importTemplate")]
+ [Log(Title = "机架列表模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [AllowAnonymous]
+ public IActionResult ImportTemplateExcel()
+ {
+ var result = DownloadImportTemplate(new List() { }, "OdfRacks");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs b/ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs
new file mode 100644
index 0000000..5edb8fc
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs
@@ -0,0 +1,482 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.Business.Dto;
+using ZR.Model.Business;
+using ZR.Service.Business.IBusinessService;
+using MiniExcelLibs;
+using ZR.ServiceCore.Services;
+using System.Threading.Tasks;
+using ZR.Service.Business;
+using SqlSugar;
+
+//创建时间:2025-08-05
+namespace ZR.Admin.WebApi.Controllers.Business
+{
+ ///
+ /// 机房列表
+ ///
+ [Route("business/OdfRooms")]
+ public class OdfRoomsController : BaseController
+ {
+ ///
+ /// 机房列表接口
+ ///
+ private readonly IOdfRoomsService _OdfRoomsService;
+
+ ///
+ /// 部门接口
+ ///
+ private readonly ISysDeptService sysDeptService;
+
+ ///
+ ///
+ ///
+ private readonly ISysUserService _SysUserService;
+
+ ///
+ ///机架
+ ///
+ private readonly IOdfRacksService _OdfRacksService;
+ ///
+ /// 框
+ ///
+ private readonly IOdfFramesService _OdfFramesService;
+ ///
+ /// 端口
+ ///
+ private readonly IOdfPortsService _OdfPortsService;
+
+ public OdfRoomsController(IOdfRoomsService OdfRoomsService,
+ ISysDeptService sysDeptService,
+ ISysUserService sysUserService,
+ IOdfPortsService odfPortsService,
+ IOdfFramesService odfFramesService,
+ IOdfRacksService odfRacksService)
+ {
+ _OdfRoomsService = OdfRoomsService;
+ this.sysDeptService = sysDeptService;
+ _SysUserService = sysUserService;
+ _OdfPortsService = odfPortsService;
+ _OdfFramesService = odfFramesService;
+ _OdfRacksService = odfRacksService;
+ }
+
+ ///
+ /// 查询机房列表列表
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ [ActionPermissionFilter(Permission = "odfrooms:list")]
+ public IActionResult QueryOdfRooms([FromQuery] OdfRoomsQueryDto parm)
+ {
+ //long userId = HttpContext.GetUId();
+ //var user = _SysUserService.SelectUserById(userId);
+ ////user.RoleIds
+ //if (!user.IsAdmin && user.Roles.Any(it => it.DataScope == 4))
+ //{
+ // //user.DeptId;
+ // //parm.DeptIds = user.DeptIds;
+ //}
+ //else if (!user.IsAdmin && user.Roles.Any(it => it.DataScope == 3))
+ //{
+ // parm.DeptIds = new List() { user.DeptId };
+ //}
+ var response = _OdfRoomsService.GetList(parm);
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 查询机房列表列表
+ ///
+ ///
+ ///
+ [HttpGet("tree")]
+ [ActionPermissionFilter(Permission = "odfrooms:list")]
+ public IActionResult GetTreeList([FromQuery] OdfRoomsTreeQueryDto parm)
+ {
+ List list = new List();
+ if (parm.Level == 1)
+ {
+ var response = _OdfRoomsService.GetList(parm);
+ response.ForEach(it =>
+ {
+ list.Add(new OdfRoomsTreeDto
+ {
+ Key = it.Id.ToString(),
+ Id = it.Id.ToString(),
+ Name = it.RoomName,
+ DeptId = it.DeptId ?? 0,
+ Level = 2,
+ Leaf = false,
+ RoomId = it.Id,
+ });
+ });
+ }
+ else if (parm.Level == 2)
+ {
+ var response = _OdfRacksService.AsQueryable().Where(it => it.RoomId == parm.RoomId).OrderBy(it => it.SequenceNumber).ToList();
+ response.ForEach(it =>
+ {
+ list.Add(new OdfRoomsTreeDto
+ {
+ Key = parm.RoomId + "_" + it.Id.ToString(),
+ Id = parm.RoomId + "_" + it.Id.ToString(),
+ Name = it.RackName,
+ DeptId = it.DeptId,
+ Level = 3,
+ Leaf = false,
+ RoomId = parm.RoomId,
+ RacksId = it.Id,
+ });
+ });
+ }
+ else if (parm.Level == 3)
+ {
+ var response = _OdfFramesService.AsQueryable().Where(it => it.RackId == parm.RacksId).OrderBy(it => it.SequenceNumber).ToList();
+ response.ForEach(it =>
+ {
+ list.Add(new OdfRoomsTreeDto
+ {
+ Key = parm.RoomId + "_" + parm.RacksId + "_" + it.Id.ToString(),
+ Id = parm.RoomId + "_" + parm.RacksId + "_" + it.Id.ToString(),
+ Name = it.PortsName,
+ DeptId = it.DeptId ?? 0,
+ Level = 4,
+ Leaf = true,
+ RoomId = parm.RoomId,
+ RacksId = parm.RacksId,
+ FramesId = it.Id,
+ });
+ });
+ }
+
+
+ return SUCCESS(list);
+ }
+
+
+
+
+
+
+ ///
+ /// 查询机房列表详情
+ ///
+ ///
+ ///
+ [HttpGet("{Id}")]
+ [ActionPermissionFilter(Permission = "odfrooms:query")]
+ public IActionResult GetOdfRooms(int Id)
+ {
+ var response = _OdfRoomsService.GetInfo(Id);
+
+ var info = response.Adapt();
+ return SUCCESS(info);
+ }
+
+ ///
+ /// 添加机房列表
+ ///
+ ///
+ [HttpPost]
+ [ActionPermissionFilter(Permission = "odfrooms:add")]
+ [Log(Title = "机房列表", BusinessType = BusinessType.INSERT)]
+ public async Task AddOdfRooms([FromBody] OdfRoomsDto parm)
+ {
+ parm.CreatedAt = DateTime.Now;
+ parm.UpdatedAt = DateTime.Now;
+ if (parm.DeptId == 0)
+ {
+ parm.DeptName = "未知部门";
+ }
+ else
+ {
+ var dept = await sysDeptService.AsQueryable().Where(it => it.DeptId == parm.DeptId).FirstAsync();
+ if (dept == null)
+ {
+ return ToResponse(ResultCode.CUSTOM_ERROR, "部门不存在,请选择正确的部门!");
+ }
+ //var dept = _DeptService.GetInfo(parm.DeptId);
+ parm.DeptName = dept.DeptName;
+ }
+
+ var modal = parm.Adapt().ToCreate(HttpContext);
+ var response = _OdfRoomsService.AddOdfRooms(modal);
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 添加机房列表
+ ///
+ ///
+ [HttpPost("expert")]
+ [ActionPermissionFilter(Permission = "odfrooms:add")]
+ [Log(Title = "机房列表", BusinessType = BusinessType.INSERT)]
+ public async Task AddExpertOdfRooms([FromBody] OdfRoomsExpertDto parm)
+ {
+ parm.CreatedAt = DateTime.Now;
+ parm.UpdatedAt = DateTime.Now;
+ if (parm.DeptId == 0)
+ {
+ parm.DeptName = "未知部门";
+ }
+ else
+ {
+ var dept = await sysDeptService.AsQueryable().Where(it => it.DeptId == parm.DeptId).FirstAsync();
+ if (dept == null)
+ {
+ return ToResponse(ResultCode.CUSTOM_ERROR, "部门不存在,请选择正确的部门!");
+ }
+ //var dept = _DeptService.GetInfo(parm.DeptId);
+ parm.DeptName = dept.DeptName;
+ }
+
+ var modal = parm.Adapt().ToCreate(HttpContext);
+ modal.DeptId = parm.DeptId;
+ modal.DeptName = parm.DeptName;
+ var response = _OdfRoomsService.AddOdfRooms(modal);
+ if (parm.RacksCount > 0)
+ {
+ var roomId = response.Id;
+ var roomName = response.RoomName;
+ List racksList = new List();
+ //添加机架
+ for (int i = 0; i < parm.RacksCount; i++)
+ {
+ var t = await _OdfRacksService.InsertReturnEntityAsync(new OdfRacks
+ {
+ CreatedAt = DateTime.Now,
+ FrameCount = parm.FramesCount,
+ DeptId = response.DeptId ?? 0,
+ RackName = $"odf-{(i + 1)}",
+ RoomId = roomId,
+ SequenceNumber = i + 1,
+ UpdatedAt = DateTime.Now,
+ }); // 直接插入机架
+ racksList.Add(t);
+
+ }
+
+ //机架添加完成
+ //return Insertable(model).ExecuteReturnEntity();
+ if (parm.FramesCount > 0)
+ {
+
+ //添加机框
+ List framesList = new List();
+
+ foreach (var rack in racksList)
+ {
+ for (int i = 0; i < parm.FramesCount; i++)
+ {
+ var t = await _OdfFramesService.InsertReturnEntityAsync(new OdfFrames()
+ {
+ CreatedAt = DateTime.Now,
+ UpdateAt = DateTime.Now,
+ PortsCol = parm.PortsCount,
+ PortsCount = parm.PortsCount,
+ DeptId = rack.DeptId,
+ PortsRow = parm.PortsCount,
+ PortsName = $"{(i + 1)}框",
+ RackId = rack.Id,
+ SequenceNumber = i + 1
+ });
+ framesList.Add(t);
+ }
+ }
+
+ //添加机框结束
+ if (parm.RowCount > 0)
+ {
+ //添加行
+ if (parm.PortsCount > 0)
+ {
+ int index = 0;
+ //添加端口
+ foreach (var frame in framesList)
+ {
+ var ra = racksList.Find(it => it.Id == frame.RackId);
+ if (ra == null)
+ {
+ continue;
+ }
+ List ports = new List();
+ for (int row = 0; row < parm.RowCount; row++)
+ {
+ for (int port = 0; port < parm.PortsCount; port++)
+ {
+ ports.Add(new OdfPorts()
+ {
+ CreatedAt = DateTime.Now,
+ DeptId = frame.DeptId ?? 0,
+ DeptName = modal.DeptName,
+ RackId = frame.RackId,
+ RackName = ra.RackName,
+ RoomId = roomId,
+ RoomName = roomName,
+ FrameId = frame.Id,
+ FrameName = frame.PortsName,
+ Name = $"{(row + 1)}-{(port + 1)}",
+ RowNumber = row,
+ PortNumber = port,
+ OpticalAttenuation = "",
+ HistoryRemarks = "",
+ Remarks = "",
+ Status = parm.DefaultStatus,
+ UpdatedAt = DateTime.Now,
+ });
+ }
+ }
+ await _OdfPortsService.AsInsertable(ports).ExecuteReturnEntityAsync(true);
+ //如果超过100个机框,则休眠一下,防止服务器死机
+ index++;
+ if (index > 100)
+ {
+ Thread.Sleep(50);
+ index = 0;
+ }
+ }
+
+ }
+ }
+ }
+
+ }
+
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 更新机房列表
+ ///
+ ///
+ [HttpPut]
+ [ActionPermissionFilter(Permission = "odfrooms:edit")]
+ [Log(Title = "机房列表", BusinessType = BusinessType.UPDATE)]
+ public async Task UpdateOdfRooms([FromBody] OdfRoomsDto parm)
+ {
+ parm.UpdatedAt = DateTime.Now;
+ if (parm.DeptId == 0)
+ {
+ parm.DeptName = "未知部门";
+ }
+ else
+ {
+ var dept = await sysDeptService.AsQueryable().Where(it => it.DeptId == parm.DeptId).FirstAsync();
+ if (dept == null)
+ {
+ return ToResponse(ResultCode.CUSTOM_ERROR, "部门不存在,请选择正确的部门!");
+ }
+ //var dept = _DeptService.GetInfo(parm.DeptId);
+ parm.DeptName = dept.DeptName;
+ }
+ var oldModel = _OdfRoomsService.GetById(parm.Id);
+ var modal = parm.Adapt().ToUpdate(HttpContext);
+ var response = _OdfRoomsService.UpdateOdfRooms(modal);
+ if (response > 0)
+ {
+ if (oldModel.DeptId != modal.DeptId)
+ {
+ var deptId = modal.DeptId ?? 0;
+ var deptName = modal.DeptName;
+ var roomId = oldModel.Id;
+ // 最直接的转换
+ await _OdfPortsService.UpdateAsync(
+ it => it.RoomId == roomId, // WHERE条件
+ it => new OdfPorts // SET部分
+ {
+ DeptId = deptId,
+ DeptName = deptName
+ }
+ );
+ // 1. 更新 odf_racks
+ var racksUpdated = await _OdfRacksService.UpdateAsync(
+ r => r.RoomId == roomId,
+ r => new OdfRacks { DeptId = deptId }
+ );
+
+ // 2. 更新 odf_frames(方法1:子查询)
+ var framesUpdated = await _OdfFramesService.UpdateAsync(
+ f => SqlFunc.Subqueryable()
+ .Where(r => r.RoomId == roomId && r.Id == f.RackId)
+ .Any(),
+ f => new OdfFrames { DeptId = deptId }
+ );
+ // update odf_frames f set DeptId=0 where RackId exists ( select id from odf_racks where roomid=1 and id=f.RackId )
+ // update odf_racks set DeptId=0 where roomid=1
+ //_OdfFramesService
+ //_OdfRacksService
+ }
+ }
+ return ToResponse(response);
+ }
+
+ ///
+ /// 删除机房列表
+ ///
+ ///
+ [HttpPost("delete/{ids}")]
+ [ActionPermissionFilter(Permission = "odfrooms:delete")]
+ [Log(Title = "机房列表", BusinessType = BusinessType.DELETE)]
+ public IActionResult DeleteOdfRooms([FromRoute] string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_OdfRoomsService.Delete(idArr, "删除机房列表"));
+ }
+
+ ///
+ /// 导出机房列表
+ ///
+ ///
+ [Log(Title = "机房列表", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [HttpGet("export")]
+ [ActionPermissionFilter(Permission = "odfrooms:export")]
+ public IActionResult Export([FromQuery] OdfRoomsQueryDto parm)
+ {
+ var list = _OdfRoomsService.ExportList(parm).Result;
+ if (list == null || list.Count <= 0)
+ {
+ return ToResponse(ResultCode.FAIL, "没有要导出的数据");
+ }
+ var result = ExportExcelMini(list, "机房列表", "机房列表");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ ///
+ /// 导入
+ ///
+ ///
+ ///
+ [HttpPost("importData")]
+ [Log(Title = "机房列表导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ [ActionPermissionFilter(Permission = "odfrooms:import")]
+ public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
+ {
+ List list = new();
+ using (var stream = formFile.OpenReadStream())
+ {
+ list = stream.Query(startCell: "A1").ToList();
+ }
+
+ return SUCCESS(_OdfRoomsService.ImportOdfRooms(list.Adapt>()));
+ }
+
+ ///
+ /// 机房列表导入模板下载
+ ///
+ ///
+ [HttpGet("importTemplate")]
+ [Log(Title = "机房列表模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [AllowAnonymous]
+ public IActionResult ImportTemplateExcel()
+ {
+ var result = DownloadImportTemplate(new List() { }, "OdfRooms");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Admin.WebApi/Controllers/System/SysLoginController.cs b/ZR.Admin.WebApi/Controllers/System/SysLoginController.cs
index 0fed083..cfacb33 100644
--- a/ZR.Admin.WebApi/Controllers/System/SysLoginController.cs
+++ b/ZR.Admin.WebApi/Controllers/System/SysLoginController.cs
@@ -1,5 +1,7 @@
using Lazy.Captcha.Core;
+
using Microsoft.AspNetCore.Mvc;
+
using ZR.Model.Models;
using ZR.Model.System;
using ZR.Model.System.Dto;
@@ -67,8 +69,8 @@ namespace ZR.Admin.WebApi.Controllers.System
List roles = roleService.SelectUserRoleListByUserId(user.UserId);
//权限集合 eg *:*:*,system:user:list
- List permissions = permissionService.GetMenuPermission(new SysUserDto() { UserId = user.UserId});
-
+ List permissions = permissionService.GetMenuPermission(new SysUserDto() { UserId = user.UserId });
+
TokenModel loginUser = new(user.Adapt(), roles.Adapt>())
{
TenantId = loginBody.TenantId,
@@ -78,6 +80,39 @@ namespace ZR.Admin.WebApi.Controllers.System
return SUCCESS(JwtUtil.GenerateJwtToken(JwtUtil.AddClaims(loginUser)));
}
+ ///
+ /// 登录
+ ///
+ /// 登录对象
+ ///
+ [Route("appLogin")]
+ [HttpPost]
+ [Log(Title = "登录")]
+ [AllowAnonymous]
+ public IActionResult AppLogin([FromBody] LoginBodyDto loginBody)
+ {
+ if (loginBody == null) { throw new CustomException("请求参数错误"); }
+ loginBody.LoginIP = HttpContextExtension.GetClientUserIp(HttpContext);
+
+ sysLoginService.CheckLockUser(loginBody.Username);
+ string location = HttpContextExtension.GetIpInfo(loginBody.LoginIP);
+ var user = sysLoginService.Login(loginBody, new SysLogininfor() { LoginLocation = location });
+
+ List roles = roleService.SelectUserRoleListByUserId(user.UserId);
+ //权限集合 eg *:*:*,system:user:list
+ List permissions = permissionService.GetMenuPermission(new SysUserDto() { UserId = user.UserId });
+
+ TokenModel loginUser = new(user.Adapt(), roles.Adapt>())
+ {
+ TenantId = loginBody.TenantId,
+ Permissions = permissions,
+ };
+ //CacheService.SetUserPerms(GlobalConstant.UserPermKEY + user.UserId, permissions);
+ var jwt = JwtUtil.GenerateJwtToken(JwtUtil.AddClaims(loginUser));
+ return SUCCESS(new { jwt, user.UserId, user.UserName });
+ }
+ //
+
///
/// 注销
///
@@ -103,7 +138,7 @@ namespace ZR.Admin.WebApi.Controllers.System
{
long userId = HttpContext.GetUId();
var user = sysUserService.SelectUserById(userId);
-
+
//前端校验按钮权限使用
//角色集合 eg: admin,yunying,common
List roles = permissionService.GetRolePermission(user);
diff --git a/ZR.Admin.WebApi/appsettings.json b/ZR.Admin.WebApi/appsettings.json
index 50a7e56..341eb7d 100644
--- a/ZR.Admin.WebApi/appsettings.json
+++ b/ZR.Admin.WebApi/appsettings.json
@@ -36,8 +36,8 @@
"Issuer": "ZRAdmin.NET", //即token的签发者。
"Audience": "ZRAdmin.NET", //指该token是服务于哪个群体的(群体范围)
"SecretKey": "SecretKey-ZRADMIN.NET-202311281883838",
- "Expire": 1440, //jwt登录过期时间(分)
- "RefreshTokenTime": 30, //分钟
+ "Expire": 60, //jwt登录过期时间(分)
+ "RefreshTokenTime": 7200, //分钟
"TokenType": "Bearer"
},
"MainDb": "0", // 多租户主库配置ID
diff --git a/ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfRooms.xlsx b/ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfRooms.xlsx
new file mode 100644
index 0000000..ba92ad8
Binary files /dev/null and b/ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfRooms.xlsx differ
diff --git a/ZR.Model/Business/Dto/OdfFramesDto.cs b/ZR.Model/Business/Dto/OdfFramesDto.cs
new file mode 100644
index 0000000..9c730c6
--- /dev/null
+++ b/ZR.Model/Business/Dto/OdfFramesDto.cs
@@ -0,0 +1,61 @@
+
+namespace ZR.Model.Business.Dto
+{
+ ///
+ /// 框-信息查询对象
+ ///
+ public class OdfFramesQueryDto : PagerInfo
+ {
+ public int? RackId { get; set; }
+ public string PortsName { get; set; }
+ }
+
+ ///
+ /// 框-信息输入输出对象
+ ///
+ public class OdfFramesDto
+ {
+ [Required(ErrorMessage = "Id不能为空")]
+ public int Id { get; set; }
+
+ [Required(ErrorMessage = "ODF机架ID不能为空")]
+ public int RackId { get; set; }
+
+ public string PortsName { get; set; }
+
+ public long? DeptId { get; set; }
+
+ public int? SequenceNumber { get; set; }
+
+ public int? PortsCount { get; set; }
+
+ public int? PortsCol { get; set; }
+
+ public int? PortsRow { get; set; }
+
+ public DateTime? CreatedAt { get; set; }
+
+ public DateTime? UpdateAt { get; set; }
+
+
+
+ }
+
+ public class OdfFramesExpertDto : OdfFramesDto
+ {
+ public int RoomId { get; set; }
+ ///
+ /// 行数
+ ///
+ public int RowCount { get; set; }
+ ///
+ /// 端口数量
+ ///
+ public int PortsCount { get; set; }
+ ///
+ ///
+ ///
+
+ public int DefaultStatus { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/ZR.Model/Business/Dto/OdfPortsDto.cs b/ZR.Model/Business/Dto/OdfPortsDto.cs
new file mode 100644
index 0000000..0cb4fa1
--- /dev/null
+++ b/ZR.Model/Business/Dto/OdfPortsDto.cs
@@ -0,0 +1,190 @@
+
+namespace ZR.Model.Business.Dto
+{
+ ///
+ /// 端口查询对象
+ ///
+ public class OdfPortsQueryDto : PagerInfo
+ {
+ ///
+ ///
+ ///
+ public long? DeptId { get; set; }
+ ///
+ ///
+ ///
+ public string Name { get; set; }
+
+ ///
+ /// 备注
+ ///
+ public string Remarks { get; set; }
+ ///
+ /// 历史故障记录
+ ///
+ public string HistoryRemarks { get; set; }
+
+
+ ///
+ /// 机房id
+ ///
+ public int? RoomId { get; set; }
+ ///
+ /// 机架id
+ ///
+ public int? RacksId { get; set; }
+ ///
+ /// 框id
+ ///
+ public int? FramesId { get; set; }
+ }
+
+ public class OdfPortsMQueryDto
+ {
+ ///
+ /// 机房id
+ ///
+ public int? RoomId { get; set; }
+
+ ///
+ /// 机架id
+ ///
+ public int? RackId { get; set; }
+ }
+ public class OdfPortsMListDto
+ {
+ public int Id { get; set; }
+
+ public string Name { get; set; }
+ public List odfPortsList { get; set; } = new List();
+ }
+ public class OdfPortsMDto
+ {
+
+ public int Id { get; set; }
+ public string Name { get; set; }
+ public int Status { get; set; }
+ }
+ ///
+ /// 端口输入输出对象
+ ///
+ public class OdfPortsDto
+ {
+ [Required(ErrorMessage = "Id不能为空")]
+ [ExcelColumn(Name = "Id")]
+ [ExcelColumnName("Id")]
+ public int Id { get; set; }
+
+ [Required(ErrorMessage = "端口名称不能为空")]
+ [ExcelColumn(Name = "端口名称")]
+ [ExcelColumnName("端口名称")]
+ public string Name { get; set; }
+
+ [Required(ErrorMessage = "机房ID不能为空")]
+ [ExcelColumn(Name = "机房ID")]
+ [ExcelColumnName("机房ID")]
+ public int RoomId { get; set; }
+
+ [Required(ErrorMessage = "机房名称不能为空")]
+ [ExcelColumn(Name = "机房名称")]
+ [ExcelColumnName("机房名称")]
+ public string RoomName { get; set; }
+
+ [Required(ErrorMessage = "机架ID不能为空")]
+ [ExcelColumn(Name = "机架ID")]
+ [ExcelColumnName("机架ID")]
+ public int RackId { get; set; }
+
+ [Required(ErrorMessage = "机架名称不能为空")]
+ [ExcelColumn(Name = "机架名称")]
+ [ExcelColumnName("机架名称")]
+ public string RackName { get; set; }
+
+ [Required(ErrorMessage = "框ID不能为空")]
+ [ExcelColumn(Name = "框ID")]
+ [ExcelColumnName("框ID")]
+ public int FrameId { get; set; }
+
+ [Required(ErrorMessage = "框名称不能为空")]
+ [ExcelColumn(Name = "框名称")]
+ [ExcelColumnName("框名称")]
+ public string FrameName { get; set; }
+
+ [Required(ErrorMessage = "部门ID不能为空")]
+ [ExcelColumn(Name = "部门ID")]
+ [ExcelColumnName("部门ID")]
+ public long DeptId { get; set; }
+
+ [Required(ErrorMessage = "行号(1-6)不能为空")]
+ [ExcelColumn(Name = "行号(1-6)")]
+ [ExcelColumnName("行号(1-6)")]
+ public int RowNumber { get; set; }
+
+ [Required(ErrorMessage = "端口号(1-12)不能为空")]
+ [ExcelColumn(Name = "端口号(1-12)")]
+ [ExcelColumnName("端口号(1-12)")]
+ public int PortNumber { get; set; }
+
+ [Required(ErrorMessage = "连接状态,0正常,1断开不能为空")]
+ [ExcelColumn(Name = "连接状态,0正常,1断开")]
+ [ExcelColumnName("连接状态,0正常,1断开")]
+ public int Status { get; set; }
+
+ [ExcelColumn(Name = "备注")]
+ [ExcelColumnName("备注")]
+ public string Remarks { get; set; }
+
+ [ExcelColumn(Name = "光衰值(dB)")]
+ [ExcelColumnName("光衰值(dB)")]
+ public string OpticalAttenuation { get; set; }
+
+ [ExcelColumn(Name = "历史故障表")]
+ [ExcelColumnName("历史故障表")]
+ public string HistoryRemarks { get; set; }
+
+ [Required(ErrorMessage = "创建时间不能为空")]
+ [ExcelColumn(Name = "创建时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
+ [ExcelColumnName("创建时间")]
+ public DateTime? CreatedAt { get; set; }
+
+ [Required(ErrorMessage = "修改时间不能为空")]
+ [ExcelColumn(Name = "修改时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
+ [ExcelColumnName("修改时间")]
+ public DateTime? UpdatedAt { get; set; }
+
+
+
+ [ExcelColumn(Name = "连接状态,0正常,1断开")]
+ public string StatusLabel { get; set; }
+
+ ///
+ /// 部门名称
+ ///
+ [ExcelColumn(Name = "部门名称")]
+ public string DeptName { get; set; }
+ }
+
+ ///
+ /// 端口输入输出对象
+ ///
+ public class OdfPortsMMDto
+ {
+ [Required(ErrorMessage = "Id不能为空")]
+ [ExcelColumn(Name = "Id")]
+ [ExcelColumnName("Id")]
+ public int Id { get; set; }
+
+
+ public int Status { get; set; }
+
+
+ public string Remarks { get; set; }
+
+ public string OpticalAttenuation { get; set; }
+
+ [ExcelColumn(Name = "历史故障表")]
+ [ExcelColumnName("历史故障表")]
+ public string HistoryRemarks { get; set; }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Model/Business/Dto/OdfRacksDto.cs b/ZR.Model/Business/Dto/OdfRacksDto.cs
new file mode 100644
index 0000000..1f79057
--- /dev/null
+++ b/ZR.Model/Business/Dto/OdfRacksDto.cs
@@ -0,0 +1,76 @@
+
+namespace ZR.Model.Business.Dto
+{
+ ///
+ /// 机架列表查询对象
+ ///
+ public class OdfRacksQueryDto : PagerInfo
+ {
+ public int? RoomId { get; set; }
+ public string RackName { get; set; }
+ }
+
+ ///
+ /// 机架列表输入输出对象
+ ///
+ public class OdfRacksDto
+ {
+ [Required(ErrorMessage = "Id不能为空")]
+ [ExcelColumn(Name = "Id")]
+ [ExcelColumnName("Id")]
+ public int Id { get; set; }
+
+
+ [Required(ErrorMessage = "机房不能为空")]
+ [ExcelColumn(Name = "机房")]
+ [ExcelColumnName("机房")]
+ public int RoomId { get; set; }
+
+ [Required(ErrorMessage = "序号不能为空")]
+ [ExcelColumn(Name = "序号")]
+ [ExcelColumnName("序号")]
+ public int SequenceNumber { get; set; }
+
+ [Required(ErrorMessage = "ODF名称不能为空")]
+ [ExcelColumn(Name = "ODF名称")]
+ [ExcelColumnName("ODF名称")]
+ public string RackName { get; set; }
+
+ [ExcelColumn(Name = "框数量(固定9框)")]
+ [ExcelColumnName("框数量(固定9框)")]
+ public int? FrameCount { get; set; }
+
+ [ExcelColumn(Name = "CreatedAt", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
+ [ExcelColumnName("CreatedAt")]
+ public DateTime? CreatedAt { get; set; }
+
+ [ExcelColumn(Name = "UpdatedAt", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
+ [ExcelColumnName("UpdatedAt")]
+ public DateTime? UpdatedAt { get; set; }
+
+
+
+ }
+
+ public class OdfRacksExpertDto : OdfRacksDto
+ {
+
+ ///
+ /// 机框数量
+ ///
+ public int FramesCount { get; set; }
+ ///
+ /// 行数
+ ///
+ public int RowCount { get; set; }
+ ///
+ /// 端口数量
+ ///
+ public int PortsCount { get; set; }
+ ///
+ ///
+ ///
+
+ public int DefaultStatus { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/ZR.Model/Business/Dto/OdfRoomsDto.cs b/ZR.Model/Business/Dto/OdfRoomsDto.cs
new file mode 100644
index 0000000..e4c5ed1
--- /dev/null
+++ b/ZR.Model/Business/Dto/OdfRoomsDto.cs
@@ -0,0 +1,137 @@
+
+namespace ZR.Model.Business.Dto
+{
+ ///
+ /// 机房列表查询对象
+ ///
+ public class OdfRoomsQueryDto : PagerInfo
+ {
+ public string RoomName { get; set; }
+ public string RoomAddress { get; set; }
+ public string Remarks { get; set; }
+
+ public List DeptIds { get; set; }
+ }
+
+ ///
+ /// 机房列表查询对象
+ ///
+ public class OdfRoomsTreeQueryDto : PagerInfo
+ {
+ public string Name { get; set; }
+
+ public int? DeptId { get; set; }
+ public int Level { get; set; }
+
+ ///
+ /// 机房id
+ ///
+ public int? RoomId { get; set; }
+ ///
+ /// 机架id
+ ///
+ public int? RacksId { get; set; }
+ ///
+ /// 框id
+ ///
+ public int? FramesId { get; set; }
+ }
+
+ ///
+ /// 机房树结构
+ ///
+ public class OdfRoomsTreeDto
+ {
+ public string Key { get; set; }
+ public string Id { get; set; }
+ public string Name { get; set; }
+ public long DeptId { get; set; }
+ public int Level { get; set; }
+ public bool Leaf { get; set; }
+ ///
+ /// 机房id
+ ///
+ public int? RoomId { get; set; }
+ ///
+ /// 机架id
+ ///
+ public int? RacksId { get; set; }
+ ///
+ /// 框id
+ ///
+ public int? FramesId { get; set; }
+ }
+
+ ///
+ /// 机房列表输入输出对象
+ ///
+ public class OdfRoomsDto
+ {
+ [Required(ErrorMessage = "Id不能为空")]
+ [ExcelColumn(Name = "Id")]
+ [ExcelColumnName("Id")]
+ public int Id { get; set; }
+
+ [ExcelColumn(Name = "部门ID")]
+ [ExcelColumnName("部门ID")]
+ public long? DeptId { get; set; }
+
+ [ExcelColumn(Name = "部门名称")]
+ [ExcelColumnName("部门名称")]
+ public string DeptName { get; set; }
+
+ [Required(ErrorMessage = "机房名称不能为空")]
+ [ExcelColumn(Name = "机房名称")]
+ [ExcelColumnName("机房名称")]
+ public string RoomName { get; set; }
+
+ [Required(ErrorMessage = "机房位置不能为空")]
+ [ExcelColumn(Name = "机房位置")]
+ [ExcelColumnName("机房位置")]
+ public string RoomAddress { get; set; }
+
+ [ExcelColumn(Name = "机架数量")]
+ [ExcelColumnName("机架数量")]
+ public int? RacksCount { get; set; }
+
+ [ExcelColumn(Name = "备注")]
+ [ExcelColumnName("备注")]
+ public string Remarks { get; set; }
+
+ [ExcelColumn(Name = "创建时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
+ [ExcelColumnName("创建时间")]
+ public DateTime? CreatedAt { get; set; }
+
+ [ExcelColumn(Name = "修改时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
+ [ExcelColumnName("修改时间")]
+ public DateTime? UpdatedAt { get; set; }
+
+
+
+ }
+
+ ///
+ ///
+ ///
+ public class OdfRoomsExpertDto : OdfRoomsDto
+ {
+ ///
+ /// 机框数量
+ ///
+ public int FramesCount { get; set; }
+ ///
+ /// 行数
+ ///
+ public int RowCount { get; set; }
+ ///
+ /// 端口数量
+ ///
+ public int PortsCount { get; set; }
+ ///
+ ///
+ ///
+
+ public int DefaultStatus { get; set; }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Model/Business/OdfFrames.cs b/ZR.Model/Business/OdfFrames.cs
new file mode 100644
index 0000000..9ffea41
--- /dev/null
+++ b/ZR.Model/Business/OdfFrames.cs
@@ -0,0 +1,62 @@
+
+namespace ZR.Model.Business
+{
+ ///
+ /// 框-信息
+ ///
+ [SugarTable("odf_frames")]
+ public class OdfFrames
+ {
+ ///
+ /// Id
+ ///
+ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+ public int Id { get; set; }
+
+ ///
+ /// ODF机架ID
+ ///
+ public int RackId { get; set; }
+
+ ///
+ /// 名称
+ ///
+ public string PortsName { get; set; }
+
+ ///
+ /// 所属部门
+ ///
+ public long? DeptId { get; set; }
+
+ ///
+ /// 序号
+ ///
+ public int? SequenceNumber { get; set; }
+
+ ///
+ /// 端口数量
+ ///
+ public int? PortsCount { get; set; }
+
+ ///
+ /// 列数量
+ ///
+ public int? PortsCol { get; set; }
+
+ ///
+ /// 行数量
+ ///
+ public int? PortsRow { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime? CreatedAt { get; set; }
+
+ ///
+ /// 修改时间
+ ///
+ public DateTime? UpdateAt { get; set; }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Model/Business/OdfPorts.cs b/ZR.Model/Business/OdfPorts.cs
new file mode 100644
index 0000000..4915935
--- /dev/null
+++ b/ZR.Model/Business/OdfPorts.cs
@@ -0,0 +1,102 @@
+
+namespace ZR.Model.Business
+{
+ ///
+ /// 端口
+ ///
+ [SugarTable("odf_ports")]
+ public class OdfPorts
+ {
+ ///
+ /// Id
+ ///
+ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+ public int Id { get; set; }
+
+ ///
+ /// 端口名称
+ ///
+ public string Name { get; set; }
+
+ ///
+ /// 机房ID
+ ///
+ public int RoomId { get; set; }
+
+ ///
+ /// 机房名称
+ ///
+ public string RoomName { get; set; }
+
+ ///
+ /// 机架ID
+ ///
+ public int RackId { get; set; }
+
+ ///
+ /// 机架名称
+ ///
+ public string RackName { get; set; }
+
+ ///
+ /// 框ID
+ ///
+ public int FrameId { get; set; }
+
+ ///
+ /// 框名称
+ ///
+ public string FrameName { get; set; }
+
+ ///
+ /// 部门ID
+ ///
+ public long DeptId { get; set; }
+
+ ///
+ /// 部门名称
+ ///
+ public string DeptName { get; set; }
+
+ ///
+ /// 行号(1-6)
+ ///
+ public int RowNumber { get; set; }
+
+ ///
+ /// 端口号(1-12)
+ ///
+ public int PortNumber { get; set; }
+
+ ///
+ /// 连接状态,0正常,1断开
+ ///
+ public int Status { get; set; }
+
+ ///
+ /// 备注
+ ///
+ public string Remarks { get; set; }
+
+ ///
+ /// 光衰值(dB)
+ ///
+ public string OpticalAttenuation { get; set; }
+
+ ///
+ /// 历史故障表
+ ///
+ public string HistoryRemarks { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime? CreatedAt { get; set; }
+
+ ///
+ /// 修改时间
+ ///
+ public DateTime? UpdatedAt { get; set; }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Model/Business/OdfRacks.cs b/ZR.Model/Business/OdfRacks.cs
new file mode 100644
index 0000000..f58a41b
--- /dev/null
+++ b/ZR.Model/Business/OdfRacks.cs
@@ -0,0 +1,51 @@
+
+namespace ZR.Model.Business
+{
+ ///
+ /// 机架列表
+ ///
+ [SugarTable("odf_racks")]
+ public class OdfRacks
+ {
+ ///
+ /// Id
+ ///
+ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+ public int Id { get; set; }
+
+ ///
+ /// 机房
+ ///
+ public int RoomId { get; set; }
+
+ ///
+ /// 序号
+ ///
+ public int SequenceNumber { get; set; }
+
+ ///
+ /// ODF名称
+ ///
+ public string RackName { get; set; }
+
+ ///
+ /// 框数量(固定9框)
+ ///
+ public int? FrameCount { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime? CreatedAt { get; set; }
+
+ ///
+ /// 修改时间
+ ///
+ public DateTime? UpdatedAt { get; set; }
+
+ ///
+ /// 部门
+ ///
+ public long DeptId { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/ZR.Model/Business/OdfRooms.cs b/ZR.Model/Business/OdfRooms.cs
new file mode 100644
index 0000000..63da638
--- /dev/null
+++ b/ZR.Model/Business/OdfRooms.cs
@@ -0,0 +1,57 @@
+
+namespace ZR.Model.Business
+{
+ ///
+ /// 机房列表
+ ///
+ [SugarTable("odf_rooms")]
+ public class OdfRooms
+ {
+ ///
+ /// Id
+ ///
+ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+ public int Id { get; set; }
+
+ ///
+ /// 部门ID
+ ///
+ public long? DeptId { get; set; }
+
+ ///
+ /// 部门名称
+ ///
+ public string DeptName { get; set; }
+
+ ///
+ /// 机房名称
+ ///
+ public string RoomName { get; set; }
+
+ ///
+ /// 机房位置
+ ///
+ public string RoomAddress { get; set; }
+
+ ///
+ /// 机架数量
+ ///
+ public int? RacksCount { get; set; }
+
+ ///
+ /// 备注
+ ///
+ public string Remarks { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime? CreatedAt { get; set; }
+
+ ///
+ /// 修改时间
+ ///
+ public DateTime? UpdatedAt { get; set; }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Model/System/Model/Dto/LoginBodyDto.cs b/ZR.Model/System/Model/Dto/LoginBodyDto.cs
index c1c354d..c530220 100644
--- a/ZR.Model/System/Model/Dto/LoginBodyDto.cs
+++ b/ZR.Model/System/Model/Dto/LoginBodyDto.cs
@@ -32,4 +32,31 @@ namespace ZR.Model.System.Dto
///
public string TenantId { get; set; }
}
+
+ public class LoginMBodyDto
+ {
+ ///
+ /// 用户名
+ ///
+ [Required(ErrorMessage = "用户名不能为空")]
+ public string Username { get; set; }
+
+ ///
+ /// 用户密码
+ ///
+ [Required(ErrorMessage = "密码不能为空")]
+ public string Password { get; set; }
+
+ ///
+ /// 验证码
+ ///
+ public string Code { get; set; }
+
+ ///
+ /// 唯一标识
+ ///
+ public string Uuid { get; set; } = "";
+
+ }
+
}
diff --git a/ZR.Service/Business/IBusinessService/IOdfFramesService.cs b/ZR.Service/Business/IBusinessService/IOdfFramesService.cs
new file mode 100644
index 0000000..021d24a
--- /dev/null
+++ b/ZR.Service/Business/IBusinessService/IOdfFramesService.cs
@@ -0,0 +1,21 @@
+using ZR.Model.Business.Dto;
+using ZR.Model.Business;
+
+namespace ZR.Service.Business.IBusinessService
+{
+ ///
+ /// 框-信息service接口
+ ///
+ public interface IOdfFramesService : IBaseService
+ {
+ PagedInfo GetList(OdfFramesQueryDto parm);
+
+ OdfFrames GetInfo(int Id);
+
+
+ OdfFrames AddOdfFrames(OdfFrames parm);
+ int UpdateOdfFrames(OdfFrames parm);
+
+
+ }
+}
diff --git a/ZR.Service/Business/IBusinessService/IOdfPortsService.cs b/ZR.Service/Business/IBusinessService/IOdfPortsService.cs
new file mode 100644
index 0000000..41df880
--- /dev/null
+++ b/ZR.Service/Business/IBusinessService/IOdfPortsService.cs
@@ -0,0 +1,23 @@
+using ZR.Model.Business.Dto;
+using ZR.Model.Business;
+
+namespace ZR.Service.Business.IBusinessService
+{
+ ///
+ /// 端口service接口
+ ///
+ public interface IOdfPortsService : IBaseService
+ {
+ PagedInfo GetList(OdfPortsQueryDto parm);
+
+ OdfPorts GetInfo(int Id);
+
+
+ OdfPorts AddOdfPorts(OdfPorts parm);
+ int UpdateOdfPorts(OdfPorts parm);
+
+ (string, object, object) ImportOdfPorts(List list);
+
+ PagedInfo ExportList(OdfPortsQueryDto parm);
+ }
+}
diff --git a/ZR.Service/Business/IBusinessService/IOdfRacksService.cs b/ZR.Service/Business/IBusinessService/IOdfRacksService.cs
new file mode 100644
index 0000000..4d4d5a1
--- /dev/null
+++ b/ZR.Service/Business/IBusinessService/IOdfRacksService.cs
@@ -0,0 +1,23 @@
+using ZR.Model.Business.Dto;
+using ZR.Model.Business;
+
+namespace ZR.Service.Business.IBusinessService
+{
+ ///
+ /// 机架列表service接口
+ ///
+ public interface IOdfRacksService : IBaseService
+ {
+ PagedInfo GetList(OdfRacksQueryDto parm);
+
+ OdfRacks GetInfo(int Id);
+
+
+ OdfRacks AddOdfRacks(OdfRacks parm);
+ int UpdateOdfRacks(OdfRacks parm);
+
+ (string, object, object) ImportOdfRacks(List list);
+
+ PagedInfo ExportList(OdfRacksQueryDto parm);
+ }
+}
diff --git a/ZR.Service/Business/IBusinessService/IOdfRoomsService.cs b/ZR.Service/Business/IBusinessService/IOdfRoomsService.cs
new file mode 100644
index 0000000..716fef9
--- /dev/null
+++ b/ZR.Service/Business/IBusinessService/IOdfRoomsService.cs
@@ -0,0 +1,24 @@
+using ZR.Model.Business.Dto;
+using ZR.Model.Business;
+
+namespace ZR.Service.Business.IBusinessService
+{
+ ///
+ /// 机房列表service接口
+ ///
+ public interface IOdfRoomsService : IBaseService
+ {
+ PagedInfo GetList(OdfRoomsQueryDto parm);
+
+ List GetList(OdfRoomsTreeQueryDto parm);
+ OdfRooms GetInfo(int Id);
+
+
+ OdfRooms AddOdfRooms(OdfRooms parm);
+ int UpdateOdfRooms(OdfRooms parm);
+
+ (string, object, object) ImportOdfRooms(List list);
+
+ PagedInfo ExportList(OdfRoomsQueryDto parm);
+ }
+}
diff --git a/ZR.Service/Business/OdfFramesService.cs b/ZR.Service/Business/OdfFramesService.cs
new file mode 100644
index 0000000..103672c
--- /dev/null
+++ b/ZR.Service/Business/OdfFramesService.cs
@@ -0,0 +1,82 @@
+using Infrastructure.Attribute;
+using Infrastructure.Extensions;
+using ZR.Model.Business.Dto;
+using ZR.Model.Business;
+using ZR.Repository;
+using ZR.Service.Business.IBusinessService;
+
+namespace ZR.Service.Business
+{
+ ///
+ /// 框-信息Service业务层处理
+ ///
+ [AppService(ServiceType = typeof(IOdfFramesService), ServiceLifetime = LifeTime.Transient)]
+ public class OdfFramesService : BaseService, IOdfFramesService
+ {
+ ///
+ /// 查询框-信息列表
+ ///
+ ///
+ ///
+ public PagedInfo GetList(OdfFramesQueryDto parm)
+ {
+ var predicate = QueryExp(parm);
+
+ var response = Queryable()
+ //.OrderBy("SequenceNumber asc")
+ .Where(predicate.ToExpression())
+ .ToPage(parm);
+
+ return response;
+ }
+
+
+ ///
+ /// 获取详情
+ ///
+ ///
+ ///
+ public OdfFrames GetInfo(int Id)
+ {
+ var response = Queryable()
+ .Where(x => x.Id == Id)
+ .First();
+
+ return response;
+ }
+
+ ///
+ /// 添加框-信息
+ ///
+ ///
+ ///
+ public OdfFrames AddOdfFrames(OdfFrames model)
+ {
+ return Insertable(model).ExecuteReturnEntity();
+ }
+
+ ///
+ /// 修改框-信息
+ ///
+ ///
+ ///
+ public int UpdateOdfFrames(OdfFrames model)
+ {
+ return Update(model, true, "修改框-信息");
+ }
+
+ ///
+ /// 查询导出表达式
+ ///
+ ///
+ ///
+ private static Expressionable QueryExp(OdfFramesQueryDto parm)
+ {
+ var predicate = Expressionable.Create();
+
+ predicate = predicate.AndIF(parm.RackId != null, it => it.RackId == parm.RackId);
+ predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.PortsName), it => it.PortsName.Contains(parm.PortsName));
+ return predicate;
+ }
+ }
+}
\ No newline at end of file
diff --git a/ZR.Service/Business/OdfPortsService.cs b/ZR.Service/Business/OdfPortsService.cs
new file mode 100644
index 0000000..ec56eb5
--- /dev/null
+++ b/ZR.Service/Business/OdfPortsService.cs
@@ -0,0 +1,171 @@
+using Infrastructure.Attribute;
+using Infrastructure.Extensions;
+using ZR.Model.Business.Dto;
+using ZR.Model.Business;
+using ZR.Repository;
+using ZR.Service.Business.IBusinessService;
+
+namespace ZR.Service.Business
+{
+ ///
+ /// 端口Service业务层处理
+ ///
+ [AppService(ServiceType = typeof(IOdfPortsService), ServiceLifetime = LifeTime.Transient)]
+ public class OdfPortsService : BaseService, IOdfPortsService
+ {
+ ///
+ /// 查询端口列表
+ ///
+ ///
+ ///
+ public PagedInfo GetList(OdfPortsQueryDto parm)
+ {
+ var predicate = QueryExp(parm);
+
+ var response = Queryable()
+ //.OrderBy("Id asc")
+ .Where(predicate.ToExpression())
+ .OrderBy("RoomId asc,RackId asc,FrameId asc,RowNumber asc,PortNumber Asc")
+ //.OrderBy(it => it.RoomId)
+ //.OrderBy(it => it.RackId)
+ //.OrderBy(it => it.Id)
+ //.OrderBy(it => it.Name)
+ .ToPage(parm);
+
+ return response;
+ }
+
+
+ ///
+ /// 获取详情
+ ///
+ ///
+ ///
+ public OdfPorts GetInfo(int Id)
+ {
+ var response = Queryable()
+ .Where(x => x.Id == Id)
+ .First();
+
+ return response;
+ }
+
+ ///
+ /// 添加端口
+ ///
+ ///
+ ///
+ public OdfPorts AddOdfPorts(OdfPorts model)
+ {
+ return Insertable(model).ExecuteReturnEntity();
+ }
+
+ ///
+ /// 修改端口
+ ///
+ ///
+ ///
+ public int UpdateOdfPorts(OdfPorts model)
+ {
+ return Update(model, true, "修改端口");
+ }
+
+ ///
+ /// 导入端口
+ ///
+ ///
+ public (string, object, object) ImportOdfPorts(List list)
+ {
+ var x = Context.Storageable(list)
+ .SplitInsert(it => !it.Any())
+ .SplitError(x => x.Item.Name.IsEmpty(), "端口名称不能为空")
+ .SplitError(x => x.Item.RoomId.IsEmpty(), "机房ID不能为空")
+ .SplitError(x => x.Item.RoomName.IsEmpty(), "机房名称不能为空")
+ .SplitError(x => x.Item.RackId.IsEmpty(), "机架ID不能为空")
+ .SplitError(x => x.Item.RackName.IsEmpty(), "机架名称不能为空")
+ .SplitError(x => x.Item.FrameId.IsEmpty(), "框ID不能为空")
+ .SplitError(x => x.Item.FrameName.IsEmpty(), "框名称不能为空")
+ .SplitError(x => x.Item.DeptId.IsEmpty(), "部门ID不能为空")
+ .SplitError(x => x.Item.RowNumber.IsEmpty(), "行号(1-6)不能为空")
+ .SplitError(x => x.Item.PortNumber.IsEmpty(), "端口号(1-12)不能为空")
+ .SplitError(x => x.Item.Status.IsEmpty(), "连接状态,0正常,1断开不能为空")
+ .SplitError(x => x.Item.CreatedAt.IsEmpty(), "创建时间不能为空")
+ .SplitError(x => x.Item.UpdatedAt.IsEmpty(), "修改时间不能为空")
+ //.WhereColumns(it => it.UserName)//如果不是主键可以这样实现(多字段it=>new{it.x1,it.x2})
+ .ToStorage();
+ var result = x.AsInsertable.ExecuteCommand();//插入可插入部分;
+
+ string msg = $"插入{x.InsertList.Count} 更新{x.UpdateList.Count} 错误数据{x.ErrorList.Count} 不计算数据{x.IgnoreList.Count} 删除数据{x.DeleteList.Count} 总共{x.TotalList.Count}";
+ Console.WriteLine(msg);
+
+ //输出错误信息
+ foreach (var item in x.ErrorList)
+ {
+ Console.WriteLine("错误" + item.StorageMessage);
+ }
+ foreach (var item in x.IgnoreList)
+ {
+ Console.WriteLine("忽略" + item.StorageMessage);
+ }
+
+ return (msg, x.ErrorList, x.IgnoreList);
+ }
+
+ ///
+ /// 导出端口
+ ///
+ ///
+ ///
+ public PagedInfo ExportList(OdfPortsQueryDto parm)
+ {
+ parm.PageNum = 1;
+ parm.PageSize = 100000;
+ var predicate = QueryExp(parm);
+
+ var response = Queryable()
+ .Where(predicate.ToExpression())
+ .OrderBy("RoomId asc,RackId asc,FrameId asc,Name asc")
+ .Select((it) => new OdfPortsDto()
+ {
+ }, true)
+ .ToPage(parm);
+
+ return response;
+ }
+
+ ///
+ /// 查询导出表达式
+ ///
+ ///
+ ///
+ private static Expressionable QueryExp(OdfPortsQueryDto parm)
+ {
+ var predicate = Expressionable.Create();
+ if (parm.RoomId != null)
+ {
+ predicate = predicate.And(f => f.RoomId == parm.RoomId);
+ }
+ if (parm.RacksId != null)
+ {
+ predicate = predicate.And(f => f.RackId == parm.RacksId);
+ }
+ if (parm.FramesId != null)
+ {
+ predicate = predicate.And(f => f.FrameId == parm.FramesId);
+ }
+ if (!string.IsNullOrEmpty(parm.Name))
+ {
+ predicate = predicate.And(f => f.Name.Contains(parm.Name));
+ }
+ if (!string.IsNullOrEmpty(parm.Remarks))
+ {
+ predicate = predicate.And(f => f.Remarks.Contains(parm.Remarks));
+ }
+ if (!string.IsNullOrEmpty(parm.HistoryRemarks))
+ {
+ predicate = predicate.And(f => f.HistoryRemarks.Contains(parm.HistoryRemarks));
+ }
+ return predicate;
+ }
+ }
+}
\ No newline at end of file
diff --git a/ZR.Service/Business/OdfRacksService.cs b/ZR.Service/Business/OdfRacksService.cs
new file mode 100644
index 0000000..8846766
--- /dev/null
+++ b/ZR.Service/Business/OdfRacksService.cs
@@ -0,0 +1,138 @@
+using Infrastructure.Attribute;
+using Infrastructure.Extensions;
+using ZR.Model.Business.Dto;
+using ZR.Model.Business;
+using ZR.Repository;
+using ZR.Service.Business.IBusinessService;
+
+namespace ZR.Service.Business
+{
+ ///
+ /// 机架列表Service业务层处理
+ ///
+ [AppService(ServiceType = typeof(IOdfRacksService), ServiceLifetime = LifeTime.Transient)]
+ public class OdfRacksService : BaseService, IOdfRacksService
+ {
+ ///
+ /// 查询机架列表列表
+ ///
+ ///
+ ///
+ public PagedInfo GetList(OdfRacksQueryDto parm)
+ {
+ var predicate = QueryExp(parm);
+
+ var response = Queryable()
+ .OrderBy("RoomId asc,SequenceNumber asc")
+ .Where(predicate.ToExpression())
+ .ToPage(parm);
+
+ return response;
+ }
+
+
+ ///
+ /// 获取详情
+ ///
+ ///
+ ///
+ public OdfRacks GetInfo(int Id)
+ {
+ var response = Queryable()
+ .Where(x => x.Id == Id)
+ .First();
+
+ return response;
+ }
+
+ ///
+ /// 添加机架列表
+ ///
+ ///
+ ///
+ public OdfRacks AddOdfRacks(OdfRacks model)
+ {
+ model.CreatedAt = DateTime.Now;
+ model.UpdatedAt=DateTime.Now;
+
+ return Insertable(model).ExecuteReturnEntity();
+ }
+
+ ///
+ /// 修改机架列表
+ ///
+ ///
+ ///
+ public int UpdateOdfRacks(OdfRacks model)
+ {
+ model.UpdatedAt = DateTime.Now;
+ return Update(model, true, "修改机架列表");
+ }
+
+ ///
+ /// 导入机架列表
+ ///
+ ///
+ public (string, object, object) ImportOdfRacks(List list)
+ {
+ var x = Context.Storageable(list)
+ .SplitInsert(it => !it.Any())
+ .SplitError(x => x.Item.RoomId.IsEmpty(), "机房不能为空")
+ .SplitError(x => x.Item.SequenceNumber.IsEmpty(), "序号不能为空")
+ .SplitError(x => x.Item.RackName.IsEmpty(), "ODF名称不能为空")
+ //.WhereColumns(it => it.UserName)//如果不是主键可以这样实现(多字段it=>new{it.x1,it.x2})
+ .ToStorage();
+ var result = x.AsInsertable.ExecuteCommand();//插入可插入部分;
+
+ string msg = $"插入{x.InsertList.Count} 更新{x.UpdateList.Count} 错误数据{x.ErrorList.Count} 不计算数据{x.IgnoreList.Count} 删除数据{x.DeleteList.Count} 总共{x.TotalList.Count}";
+ Console.WriteLine(msg);
+
+ //输出错误信息
+ foreach (var item in x.ErrorList)
+ {
+ Console.WriteLine("错误" + item.StorageMessage);
+ }
+ foreach (var item in x.IgnoreList)
+ {
+ Console.WriteLine("忽略" + item.StorageMessage);
+ }
+
+ return (msg, x.ErrorList, x.IgnoreList);
+ }
+
+ ///
+ /// 导出机架列表
+ ///
+ ///
+ ///
+ public PagedInfo ExportList(OdfRacksQueryDto parm)
+ {
+ parm.PageNum = 1;
+ parm.PageSize = 100000;
+ var predicate = QueryExp(parm);
+
+ var response = Queryable()
+ .Where(predicate.ToExpression())
+ .Select((it) => new OdfRacksDto()
+ {
+ }, true)
+ .ToPage(parm);
+
+ return response;
+ }
+
+ ///
+ /// 查询导出表达式
+ ///
+ ///
+ ///
+ private static Expressionable QueryExp(OdfRacksQueryDto parm)
+ {
+ var predicate = Expressionable.Create();
+
+ predicate = predicate.AndIF(parm.RoomId != null, it => it.RoomId == parm.RoomId);
+ predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.RackName), it => it.RackName.Contains(parm.RackName));
+ return predicate;
+ }
+ }
+}
\ No newline at end of file
diff --git a/ZR.Service/Business/OdfRoomsService.cs b/ZR.Service/Business/OdfRoomsService.cs
new file mode 100644
index 0000000..dac05ad
--- /dev/null
+++ b/ZR.Service/Business/OdfRoomsService.cs
@@ -0,0 +1,173 @@
+using Infrastructure.Attribute;
+using Infrastructure.Extensions;
+using ZR.Model.Business.Dto;
+using ZR.Model.Business;
+using ZR.Repository;
+using ZR.Service.Business.IBusinessService;
+using Infrastructure;
+using SqlSugar.IOC;
+
+namespace ZR.Service.Business
+{
+ ///
+ /// 机房列表Service业务层处理
+ ///
+ [AppService(ServiceType = typeof(IOdfRoomsService), ServiceLifetime = LifeTime.Transient)]
+ public class OdfRoomsService : BaseService, IOdfRoomsService
+ {
+ ///
+ /// 查询机房列表列表
+ ///
+ ///
+ ///
+ public PagedInfo GetList(OdfRoomsQueryDto parm)
+ {
+ var predicate = QueryExp(parm);
+
+ var response = Queryable()
+ //.OrderBy("Id desc")
+ .Where(predicate.ToExpression())
+ .ToPage(parm);
+
+ return response;
+ }
+
+
+ ///
+ /// 获取详情
+ ///
+ ///
+ ///
+ public OdfRooms GetInfo(int Id)
+ {
+ var response = Queryable()
+ .Where(x => x.Id == Id)
+ .First();
+
+ return response;
+ }
+
+ ///
+ /// 添加机房列表
+ ///
+ ///
+ ///
+ public OdfRooms AddOdfRooms(OdfRooms model)
+ {
+ return Insertable(model).ExecuteReturnEntity();
+ }
+
+ ///
+ /// 修改机房列表
+ ///
+ ///
+ ///
+ public int UpdateOdfRooms(OdfRooms model)
+ {
+ return Update(model, true, "修改机房列表");
+ }
+
+ ///
+ /// 导入机房列表
+ ///
+ ///
+ public (string, object, object) ImportOdfRooms(List list)
+ {
+ var x = Context.Storageable(list)
+ .SplitInsert(it => !it.Any())
+ .SplitError(x => x.Item.RoomName.IsEmpty(), "机房名称不能为空")
+ .SplitError(x => x.Item.RoomAddress.IsEmpty(), "机房位置不能为空")
+ //.WhereColumns(it => it.UserName)//如果不是主键可以这样实现(多字段it=>new{it.x1,it.x2})
+ .ToStorage();
+ var result = x.AsInsertable.ExecuteCommand();//插入可插入部分;
+
+ string msg = $"插入{x.InsertList.Count} 更新{x.UpdateList.Count} 错误数据{x.ErrorList.Count} 不计算数据{x.IgnoreList.Count} 删除数据{x.DeleteList.Count} 总共{x.TotalList.Count}";
+ Console.WriteLine(msg);
+
+ //输出错误信息
+ foreach (var item in x.ErrorList)
+ {
+ Console.WriteLine("错误" + item.StorageMessage);
+ }
+ foreach (var item in x.IgnoreList)
+ {
+ Console.WriteLine("忽略" + item.StorageMessage);
+ }
+
+ return (msg, x.ErrorList, x.IgnoreList);
+ }
+
+ ///
+ /// 导出机房列表
+ ///
+ ///
+ ///
+ public PagedInfo ExportList(OdfRoomsQueryDto parm)
+ {
+ parm.PageNum = 1;
+ parm.PageSize = 100000;
+ var predicate = QueryExp(parm);
+
+ var response = Queryable()
+ .Where(predicate.ToExpression())
+ .Select((it) => new OdfRoomsDto()
+ {
+ }, true)
+ .ToPage(parm);
+
+ return response;
+ }
+
+ ///
+ /// 查询导出表达式
+ ///
+ ///
+ ///
+ private static Expressionable QueryExp(OdfRoomsQueryDto parm)
+ {
+ var predicate = Expressionable.Create();
+
+ predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.RoomName), it => it.RoomName.Contains(parm.RoomName));
+ predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.RoomAddress), it => it.RoomAddress.Contains(parm.RoomAddress));
+ predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Remarks), it => it.Remarks.Contains(parm.Remarks));
+ predicate = predicate.AndIF(parm.DeptIds != null && parm.DeptIds.Count > 0, it => parm.DeptIds.Contains(it.DeptId ?? 0));
+ return predicate;
+ }
+ ///
+ /// 查询导出表达式
+ ///
+ ///
+ ///
+ private static Expressionable QueryExp(OdfRoomsTreeQueryDto parm)
+ {
+ var predicate = Expressionable.Create();
+
+ predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Name), it => (it.RoomName.Contains(parm.Name) || it.RoomAddress.Contains(parm.Name) || it.DeptName.Contains(parm.Name)));
+ if (parm.DeptId != null)
+ {
+ if (parm.DeptId == 0)
+ {
+ predicate = predicate.AndIF(parm.DeptId != null, it => parm.DeptId == (it.DeptId ?? 0));
+ }
+ else
+ {
+ var db = DbScoped.SugarScope.GetConnectionScope("0");
+ string sql = "WITH DeptCTE AS( SELECT DeptId, ParentId, DeptName FROM sys_dept WHERE DeptId =" + parm.DeptId + " UNION ALL SELECT d.DeptId, d.ParentId, d.DeptName FROM sys_dept d INNER JOIN DeptCTE cte ON d.ParentId = cte.DeptId WHERE d.DelFlag = 0) SELECT DeptId FROM DeptCTE ORDER BY DeptId";
+ var list = db.Ado.SqlQuery(sql);
+ predicate = predicate.And(it => list.Contains(it.DeptId ?? 0));
+ }
+ }
+ return predicate;
+ }
+ public List GetList(OdfRoomsTreeQueryDto parm)
+ {
+ var predicate = QueryExp(parm);
+
+ var response = Queryable()
+ .Where(predicate.ToExpression())
+ .ToList();
+
+ return response;
+ }
+ }
+}
\ No newline at end of file
diff --git a/ZR.ServiceCore/Services/SysDictDataService.cs b/ZR.ServiceCore/Services/SysDictDataService.cs
index c124593..366f9f2 100644
--- a/ZR.ServiceCore/Services/SysDictDataService.cs
+++ b/ZR.ServiceCore/Services/SysDictDataService.cs
@@ -156,6 +156,7 @@ namespace ZR.ServiceCore.Services
///
public List SelectDictDataByCustomSql(SysDictType sysDictType)
{
+
return Context.Ado.SqlQuery(sysDictType?.CustomSql).ToList();
}
}
diff --git a/ZR.ServiceCore/Services/SysDictService.cs b/ZR.ServiceCore/Services/SysDictService.cs
index ac0c08d..6f13a4b 100644
--- a/ZR.ServiceCore/Services/SysDictService.cs
+++ b/ZR.ServiceCore/Services/SysDictService.cs
@@ -1,8 +1,12 @@
using Infrastructure;
using Infrastructure.Attribute;
+
+using SqlSugar.IOC;
+
using ZR.Model;
using ZR.Model.System;
using ZR.Model.System.Dto;
+using ZR.ServiceCore.SqlSugar;
namespace ZR.ServiceCore.Services
{
@@ -123,12 +127,59 @@ namespace ZR.ServiceCore.Services
///
public List SelectDictDataByCustomSql(string dictType)
{
+
var dictInfo = Queryable()
.Where(f => f.DictType == dictType).First();
if (dictInfo == null || !dictInfo.CustomSql.StartsWith("select", StringComparison.OrdinalIgnoreCase))
{
return null;
}
+
+ if (dictInfo.DictType == "sql_odf_room")
+ {
+ //获取当前用户的信息
+ var user = JwtUtil.GetLoginUser(App.HttpContext);
+ if (user == null)
+ {
+ dictInfo.CustomSql += " and DeptId = 0";
+ }
+ else
+ {
+ //管理员不过滤
+ if (!user.RoleKeys.Any(f => f.Equals(GlobalConstant.AdminRole)))
+ {
+ foreach (var role in user.Roles.OrderBy(f => f.DataScope))
+ {
+ var dataScope = (DataPermiEnum)role.DataScope;
+ if (DataPermiEnum.All.Equals(dataScope))//所有权限
+ {
+ break;
+ }
+ else if (DataPermiEnum.CUSTOM.Equals(dataScope))//自定数据权限
+ {
+
+ }
+ else if (DataPermiEnum.DEPT.Equals(dataScope))//本部门数据
+ {
+ //user.DeptId
+ dictInfo.CustomSql += " and DeptId = " + user.DeptId;
+ }
+ else if (DataPermiEnum.DEPT_CHILD.Equals(dataScope))//本部门及以下数据
+ {
+ //SQl OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )
+
+ var db = DbScoped.SugarScope.GetConnectionScope("0");
+ var allChildDepts = db.Queryable().ToChildList(it => it.ParentId, user.DeptId);
+ var allDeptId = allChildDepts.Select(f => f.DeptId).ToList();
+ dictInfo.CustomSql += " and DeptId in ( " + string.Join(",", allDeptId) + ")";
+ }
+
+ }
+ }
+ }
+
+ }
+
return DictDataService.SelectDictDataByCustomSql(dictInfo);
}
}
diff --git a/ZR.ServiceCore/SqlSugar/DataPermi.cs b/ZR.ServiceCore/SqlSugar/DataPermi.cs
index 357d481..b3961ad 100644
--- a/ZR.ServiceCore/SqlSugar/DataPermi.cs
+++ b/ZR.ServiceCore/SqlSugar/DataPermi.cs
@@ -1,6 +1,9 @@
using Infrastructure;
+
using SqlSugar.IOC;
+
using ZR.Model;
+using ZR.Model.Business;
using ZR.Model.Models;
using ZR.Model.System;
@@ -51,7 +54,9 @@ namespace ZR.ServiceCore.SqlSugar
var expLoginlog = Expressionable.Create();
var expSysMsg = Expressionable.Create().And(it => it.IsDelete == 0);
var expDept = Expressionable.Create();
-
+ var expOdfRooms = Expressionable.Create();
+ var expOdfRacks = Expressionable.Create();
+ var expOdfPorts = Expressionable.Create();
db.QueryFilter.AddTableFilter(expSysMsg.ToExpression());
//管理员不过滤
if (user.RoleKeys.Any(f => f.Equals(GlobalConstant.AdminRole))) return;
@@ -73,6 +78,9 @@ namespace ZR.ServiceCore.SqlSugar
{
expUser.And(it => it.DeptId == user.DeptId);
expDept.And(it => it.DeptId == user.DeptId);
+ expOdfRooms.And(it => (it.DeptId == user.DeptId || it.DeptId == 0));
+ expOdfRacks.And(it => (it.DeptId == user.DeptId || it.DeptId == 0));
+ expOdfPorts.And(it => (it.DeptId == user.DeptId || it.DeptId == 0));
}
else if (DataPermiEnum.DEPT_CHILD.Equals(dataScope))//本部门及以下数据
{
@@ -82,6 +90,9 @@ namespace ZR.ServiceCore.SqlSugar
expUser.Or(it => allDeptId.Contains(it.DeptId));
expDept.And(it => allDeptId.Contains(it.DeptId));
+ expOdfRooms.And(it => (allDeptId.Contains(it.DeptId ?? 0) || it.DeptId == 0));
+ expOdfRacks.And(it => (allDeptId.Contains(it.DeptId) || it.DeptId == 0));
+ expOdfPorts.And(it => (allDeptId.Contains(it.DeptId) || it.DeptId == 0));
}
else if (DataPermiEnum.SELF.Equals(dataScope))//仅本人数据
{
@@ -95,6 +106,9 @@ namespace ZR.ServiceCore.SqlSugar
db.QueryFilter.AddTableFilter(expUser.ToExpression());
db.QueryFilter.AddTableFilter(expRole.ToExpression());
db.QueryFilter.AddTableFilter(expLoginlog.ToExpression());
+ db.QueryFilter.AddTableFilter(expOdfRooms.ToExpression());
+ db.QueryFilter.AddTableFilter(expOdfRacks.ToExpression());
+ db.QueryFilter.AddTableFilter(expOdfPorts.ToExpression());
db.QueryFilter.AddTableFilter(f => f.UserId == user.UserId, QueryFilterProvider.FilterJoinPosition.Where);
}
}