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 SqlSugar; //创建时间: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 + 1, PortNumber = port + 1, 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 async Task UpdateOdfRacks([FromBody] OdfRacksDto parm) { var modal = parm.Adapt().ToUpdate(HttpContext); var oldModel = _OdfRacksService.GetById(parm.Id); var response = _OdfRacksService.UpdateOdfRacks(modal); if (response > 0) { var rackName = oldModel.RackName; var oldRoomId = modal.RoomId; var rackId = modal.Id; if (oldModel.RackName != modal.RackName) { // 最直接的转换 await _OdfPortsService.UpdateAsync( it => it.RoomId == oldRoomId && it.RackId == rackId, // WHERE条件 it => new OdfPorts // SET部分 { RackName = modal.RackName, } ); } } return ToResponse(response); } /// /// 删除机架列表 /// /// [HttpPost("delete/{ids}")] [ActionPermissionFilter(Permission = "odfracks:delete")] [Log(Title = "机架列表", BusinessType = BusinessType.DELETE)] public async Task DeleteOdfRacks([FromRoute] string ids) { var idArr = Tools.SplitAndConvert(ids); foreach (var racksId in idArr) { var racks = _OdfRacksService.GetById(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); } 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); } } }