From 6941b6c1f8a9eaee76fff40a823f0327256cc33c Mon Sep 17 00:00:00 2001 From: zpc Date: Wed, 6 Aug 2025 09:46:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Business/OdfFramesController.cs | 178 +++++++ .../Business/OdfPortsController.cs | 340 ++++++++++++ .../Business/OdfRacksController.cs | 283 ++++++++++ .../Business/OdfRoomsController.cs | 482 ++++++++++++++++++ .../Controllers/System/SysLoginController.cs | 41 +- ZR.Admin.WebApi/appsettings.json | 4 +- .../wwwroot/ImportTemplate/OdfRooms.xlsx | Bin 0 -> 4375 bytes ZR.Model/Business/Dto/OdfFramesDto.cs | 61 +++ ZR.Model/Business/Dto/OdfPortsDto.cs | 190 +++++++ ZR.Model/Business/Dto/OdfRacksDto.cs | 76 +++ ZR.Model/Business/Dto/OdfRoomsDto.cs | 137 +++++ ZR.Model/Business/OdfFrames.cs | 62 +++ ZR.Model/Business/OdfPorts.cs | 102 ++++ ZR.Model/Business/OdfRacks.cs | 51 ++ ZR.Model/Business/OdfRooms.cs | 57 +++ ZR.Model/System/Model/Dto/LoginBodyDto.cs | 27 + .../IBusinessService/IOdfFramesService.cs | 21 + .../IBusinessService/IOdfPortsService.cs | 23 + .../IBusinessService/IOdfRacksService.cs | 23 + .../IBusinessService/IOdfRoomsService.cs | 24 + ZR.Service/Business/OdfFramesService.cs | 82 +++ ZR.Service/Business/OdfPortsService.cs | 171 +++++++ ZR.Service/Business/OdfRacksService.cs | 138 +++++ ZR.Service/Business/OdfRoomsService.cs | 173 +++++++ ZR.ServiceCore/Services/SysDictDataService.cs | 1 + ZR.ServiceCore/Services/SysDictService.cs | 51 ++ ZR.ServiceCore/SqlSugar/DataPermi.cs | 16 +- 27 files changed, 2808 insertions(+), 6 deletions(-) create mode 100644 ZR.Admin.WebApi/Controllers/Business/OdfFramesController.cs create mode 100644 ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs create mode 100644 ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs create mode 100644 ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs create mode 100644 ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfRooms.xlsx create mode 100644 ZR.Model/Business/Dto/OdfFramesDto.cs create mode 100644 ZR.Model/Business/Dto/OdfPortsDto.cs create mode 100644 ZR.Model/Business/Dto/OdfRacksDto.cs create mode 100644 ZR.Model/Business/Dto/OdfRoomsDto.cs create mode 100644 ZR.Model/Business/OdfFrames.cs create mode 100644 ZR.Model/Business/OdfPorts.cs create mode 100644 ZR.Model/Business/OdfRacks.cs create mode 100644 ZR.Model/Business/OdfRooms.cs create mode 100644 ZR.Service/Business/IBusinessService/IOdfFramesService.cs create mode 100644 ZR.Service/Business/IBusinessService/IOdfPortsService.cs create mode 100644 ZR.Service/Business/IBusinessService/IOdfRacksService.cs create mode 100644 ZR.Service/Business/IBusinessService/IOdfRoomsService.cs create mode 100644 ZR.Service/Business/OdfFramesService.cs create mode 100644 ZR.Service/Business/OdfPortsService.cs create mode 100644 ZR.Service/Business/OdfRacksService.cs create mode 100644 ZR.Service/Business/OdfRoomsService.cs 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 0000000000000000000000000000000000000000..ba92ad840031adcf25914e5e9d992b0daf1cc554 GIT binary patch literal 4375 zcmZ`-2{_d27amzNW8cd@3fX1LzGln5CX;RKj6%%NE!kphW8VhZvlB*0wva3%5t5~t zkewn${-gR|UAH^){N^|Fd~@Ds-t(RBea{&~T|y#y0Dz1PkQ7XOEw3It*A4&x1PA~C zApUOS?dahnB7F23jTM7+a?%IAE0b?g=vL8AGVQ+FKzCn#jL0727jR^Qw z6jDyz{cHH}U{4Z#ZDT{fQ6`qW0TQSDa$~AX`(6H<0UGSw4X&!PIZLNh^14|EBbl*` z>!Ey3MGtg)BJF|G-jq!#vD-WeQc>Aj&z~wq>`%7Q0Bms`pVJqWE?ip%wLC%)AwN@D zmjgq~2IP25AF3(45&H?O{$A$K@@tY>h#vd%LZf#6shp4=fC&oT2UzMpAEP= z&P{X!xX=^4aM=91%xahLPaO7*76;_;E7?>40L3p3z6cM;A3uJ@VhZ+3l>TW>oqzRh zY(ffU(S;=Kh?eRbhTCUuiRqAosigQah5v7= zaP|m0G}YS{P^2CDzQr`P!$Vr1?n@tMs>~_$YEWDX8w6Eu>%F>wx#Dmg4fFiX8qJmv zA)!lsY#EAm$gO_Oo-a^wgo0w`mntr3D-(Py-)6hxbmxIk!HbeJFj3Gd42X+PGN%6C zSko&Ou|A&_V2JUsK7&9Rn_h6_P*MBr!S2>0i^U*eM`~o1LMhc9PrMemV zIMHCUYrZX?7b^g8NeS@79Qv4bEw^F>o@}|n40szjC007KCPno}$ zx4Vyvqoc16UNrDGu_LuWkEnRz4;)~&)xJeeFS7!2Z8Yn}iwCr%1==_K=!)wZC*xN! z_XO^*inkMt5Ju3^D(EFDCyq;e#+IiCycgjtUb56^QZa~}+r1=$FjybM)zzHcrlu$v zzCsQvRHdP2$o`bRXvds3YsBD}8S_{%;iKU$za-y>+@V`xxn5UH{aIH(^Yb=wf-l&! zlNjH$_f;v)28RS8>V#SdiaTUrHI_H&DI)ER7Zsx-Wjp<=k8<>Q8C@W*+Ima znS+&K*a4&R2*S-vruhlHSIjS57ndCt5P)j!28EAY9O*G6f-2Pr;BqNe3*tO(s}pHd zQRSgnKNxN;d<&}M3b!Xqx~)bmD6VbeoLE;} z87emr?!!AeYL@Ysw-d*3(d($ zloES}DNg_wc-V}GIeT5h+!S-k2Q1+Rt0y)+Us1er+J=R2ERbSn^gqmL7iVeitbuEH zd8KCtw=Csy&gFm&o;PXl!Vr$dm&L`nGg#qW$X3D`VmYIFLZ2!CB0O?C;6u#0P;xF*eii3LF`5)Pm$WKT9_3=mD{cvZ~eih1K zQEEV&-08dHD-a}mv>5&OSt_Y&Wrt?ZrmopZ`7b=Jvt|nf+lZECJ1TZ|^r%J++{20} zMND6xG3r`66%&yV58WQ0$7U~5&BkIXMuCAz!y=V_XI4X~vap~`Otz9$D>KbB^@)91Dt@kFHYtG|xW--Ldr5{*@H z>lCF{epwbVG3MRO*EK%a&BRh(BZPA5j~?c8?#t8s$e^QrimS|ecJpu@SFALGek)y~ z@s40RlaX~(kZVh}twzwxX11J@^h$?BTRMo+!6w9yH*;hZJub^?E8w{Pqydp1{rb7S zwU3qhMMigZ3l4gN_%Zap=H#8P(edq<{K20XR8!6kO7!0De}?59Y)} zWuV$BsI!qy4O)*MdiE_L8A32h2b^nUwcr7n*J@OirjQuY@Xx_6w71@Ygde1E-!@D} zP1sh+64|FNv`x=We)_r*$~my*;ou|=Ki_^J!^;1LQM~UAvMq%>s=dB`tGxbkasop# za5Lq7g8L&q)5_~i%hMISEz3=skh^DPP66IFie>>1Gza=W$XAfSmRgm9m-LQb(98sFE95a zy^KaF=sy#s4h!U2v(+;|D^-{qp*>w(-VwzrOj|DJJfDNymL`vV#$b5rlui?3d-}FP zMqI=0rs)$0=_^nN>LF7}QP2gqvxBE9C*)b*NyIq9W0u5w;C5Zj%4)RL^G_(ziB?0p zrSFlsaA*51aTA7D>6#AZ9X$^#+0{OHLO9^6ytOg+7@KKDyPw{}DJfgg>F5FNch;g7 z3MoWA(KVoEwdSwQb}9k%8;_;#g*xAF8@8WXs1I zlO8qC*zv_XYrZqugwY1O{(+>2C2V`^nMDSFED_Co)hIH2UILDcsYB>4NF*VvOV0^AA-Q z3&x3U(>hFd>+np8ed4jzWs zKxo-s^(tFOwPMbh>@+Y4Jq{WO=byM+EsQ*a0PLj&`*nIvZhfMv`F>ss`dMX4?vMH7 z2+@A<7e0UIhyegP{5P(tdBJ=gVZJt|h#QVRkfZvlOVY(Bjyk-G77=xZiIFU~NDwYa zaM}_~XFzKb=z%Em43J`EjTGQ4Hq$6o1hfk$ZYs^}&-L_7ep}4DC6%edGgm|1vu6km zDjXwOR+U$n1`VoTE;kfdrXjBZ&@#=voZ|*KR@7>RxukVACYegj(&H2Xm_c(z*{-B- zmVFOiM3$;#gYFkU`t&?Ve%4eiTGPU?qy)F(y{D8c97^7vVO+Dx=loC_NqO5WowiP- zm=fhfPLotb5|lNdCh?q_BWS`_kGmPha${+u>j7%U7Bjfx%RgOsQ5X?OVYtgvm8-~k zdfcJ_u2djp78m~>f+Pf6uWGZm`#BVK6Un~$#MW-i{dR!!a{fEb<~q`wRopWdNW)Or zNG=l&o<}ozJM3g`rbGvAVr=&dyF~V1znBhwlG%PJ(E$Wb$}Nf?Mr41JSrUFOb-2va z3me$Xk;==@I9uLu&w@XpEUuM!Hz#cH>RM8}XI25t6S&eVGo$q#zy#yW;xK^61n50FBTm1ONa4 literal 0 HcmV?d00001 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); } }