diff --git a/ZR.Admin.WebApi/Controllers/Business/OdfFramesController.cs b/ZR.Admin.WebApi/Controllers/Business/OdfFramesController.cs index 96804c9..85cf7c5 100644 --- a/ZR.Admin.WebApi/Controllers/Business/OdfFramesController.cs +++ b/ZR.Admin.WebApi/Controllers/Business/OdfFramesController.cs @@ -152,11 +152,29 @@ namespace ZR.Admin.WebApi.Controllers.Business [HttpPut] [ActionPermissionFilter(Permission = "odfframes:edit")] [Log(Title = "框-信息", BusinessType = BusinessType.UPDATE)] - public IActionResult UpdateOdfFrames([FromBody] OdfFramesDto parm) + public async Task UpdateOdfFrames([FromBody] OdfFramesDto parm) { var modal = parm.Adapt().ToUpdate(HttpContext); + var oldModel = _OdfFramesService.GetById(parm.Id); var response = _OdfFramesService.UpdateOdfFrames(modal); + if (response > 0) + { + var rortsName = oldModel.PortsName; + var frameId = modal.Id; + var rackId = modal.RackId; + if (oldModel.PortsName != modal.PortsName) + { + // 最直接的转换 + await _OdfPortsService.UpdateAsync( + it => it.FrameId == frameId && it.RackId == rackId, // WHERE条件 + it => new OdfPorts // SET部分 + { + FrameName = modal.PortsName, + } + ); + } + } return ToResponse(response); } diff --git a/ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs b/ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs index 1211ee5..12401cc 100644 --- a/ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs +++ b/ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs @@ -10,6 +10,7 @@ using static SKIT.FlurlHttpClient.Wechat.Api.Models.WxaBusinessGetLiveInfoRespon using System.Threading.Tasks; using ZR.Repository; using Aliyun.OSS; +using System.Linq; //创建时间:2025-08-05 namespace ZR.Admin.WebApi.Controllers.Business @@ -30,12 +31,16 @@ namespace ZR.Admin.WebApi.Controllers.Business private readonly IOdfRoomsService _OdfRoomsService; + private readonly ISysDeptService _SysDeptService; + /// /// /// private readonly ISysUserService _SysUserService; + + /// ///机架 /// @@ -51,13 +56,17 @@ namespace ZR.Admin.WebApi.Controllers.Business ISysUserService sysUserService, IOdfPortsService odfPortsService, IOdfFramesService odfFramesService, - IOdfRacksService odfRacksService) + IOdfRacksService odfRacksService + + ) { _OdfRoomsService = OdfRoomsService; _SysUserService = sysUserService; _OdfPortsService = odfPortsService; _OdfFramesService = odfFramesService; _OdfRacksService = odfRacksService; + _SysDeptService = sysDeptService; + } /// @@ -339,15 +348,143 @@ namespace ZR.Admin.WebApi.Controllers.Business [HttpPost("importData")] [Log(Title = "端口导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)] [ActionPermissionFilter(Permission = "odfports:import")] - public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile) + public async Task ImportData([FromForm(Name = "file")] IFormFile formFile) { - List list = new(); + List list = new(); using (var stream = formFile.OpenReadStream()) { - list = stream.Query(startCell: "A1").ToList(); + list = stream.Query(startCell: "A1").ToList(); } + int errorCount = 0; + int successCount = 0; + int addRoomCount = 0; + int addRackCount = 0; + int addFrameCount = 0; + int addPortCount = 0; + if (list.Count > 0) + { + List odfPorts = new List(); + var deptName = list.Select(it => it.DeptName.Trim()).Distinct().ToList(); + var deptInfo = _SysDeptService.AsQueryable().Where(it => deptName.Contains(it.DeptName)).Select(it => new { it.DeptId, it.DeptName }).ToList(); - return SUCCESS(_OdfPortsService.ImportOdfPorts(list.Adapt>())); + var roomNameList = list.Select(it => it.RoomName).Select(it => it.Trim()).Distinct().ToList(); + var roomList = _OdfRoomsService.AsQueryable().Where(it => roomNameList.Contains(it.RoomName)).ToList(); + foreach (var excelItem in list) + { + try + { + var dept = deptInfo.Find(it => it.DeptName == excelItem.DeptName); + if (dept == null) + { + //没有部门,下一个数据 + errorCount++; + continue; + } + var room = roomList.Find(it => it.RoomName == excelItem.RoomName); + if (room == null) + { + //添加机房 + var roomItem = new OdfRooms() + { + CreatedAt = DateTime.Now, + RoomAddress = "", + UpdatedAt = DateTime.Now, + DeptId = dept.DeptId, + DeptName = dept.DeptName, + RacksCount = 0, + Remarks = "", + RoomName = excelItem.RoomName + }; + await _OdfRoomsService.InsertReturnEntityAsync(roomItem); + addRoomCount++; + roomList.Add(roomItem); + room = roomItem; + } + //添加机架 + var rack = _OdfRacksService.AsQueryable().Where(it => it.RoomId == room.Id && it.RackName == excelItem.RackName).First(); + if (rack == null) + { + var sequenceNumber = _OdfRacksService.AsQueryable().Where(it => it.RoomId == room.Id).Max(it => (int?)it.SequenceNumber) ?? 0; + sequenceNumber++; + rack = new OdfRacks() + { + CreatedAt = DateTime.Now, + UpdatedAt = DateTime.Now, + RoomId = room.Id, + RackName = excelItem.RackName, + DeptId = dept.DeptId, + FrameCount = 0, + SequenceNumber = sequenceNumber, + }; + await _OdfRacksService.InsertReturnEntityAsync(rack); + addRackCount++; + } + //添加框 + var frame = _OdfFramesService.AsQueryable().Where(it => it.RackId == rack.Id && it.PortsName == excelItem.FrameName).First(); + if (frame == null) + { + var sequenceNumber = _OdfFramesService.AsQueryable().Where(it => it.RackId == rack.Id).Max(it => (int?)it.SequenceNumber) ?? 0; + sequenceNumber++; + frame = new OdfFrames() + { + CreatedAt = DateTime.Now, + UpdateAt = DateTime.Now, + RackId = rack.Id, + PortsName = excelItem.FrameName, + SequenceNumber = sequenceNumber, + PortsCol = 0, + PortsCount = 0, + DeptId = dept.DeptId, + PortsRow = 0, + }; + await _OdfFramesService.InsertReturnEntityAsync(frame); + addFrameCount++; + } + //添加端口 + var port = _OdfPortsService.AsQueryable().Where(it => it.FrameId == frame.Id && it.RowNumber == excelItem.RowNumber && it.PortNumber == excelItem.PortNumber).First(); + if (port == null) + { + port = new OdfPorts() + { + CreatedAt = DateTime.Now, + UpdatedAt = DateTime.Now, + DeptId = dept.DeptId, + DeptName = dept.DeptName, + FrameId = frame.Id, + FrameName = frame.PortsName, + RackId = rack.Id, + RackName = rack.RackName, + RoomId = room.Id, + RoomName = room.RoomName, + Name = excelItem.RowNumber + "-" + excelItem.PortNumber, + RowNumber = excelItem.RowNumber, + PortNumber = excelItem.PortNumber, + Status = excelItem.Status, + Remarks = excelItem.Remarks?.Trim(), + OpticalAttenuation = excelItem.OpticalAttenuation?.Trim(), + HistoryRemarks = excelItem.HistoryRemarks?.Trim(), + }; + await _OdfPortsService.InsertAsync(port); + addPortCount++; + } + else + { + port.HistoryRemarks = excelItem.HistoryRemarks?.Trim(); + port.Remarks = excelItem.Remarks?.Trim(); + port.OpticalAttenuation = excelItem.OpticalAttenuation?.Trim(); + port.Status = excelItem.Status; + await _OdfPortsService.UpdateAsync(port); + } + successCount++; + } + catch (Exception) + { + errorCount++; + } + } + + } + return SUCCESS($"共查询{list.Count}条数据,导入成功{successCount}条数据!导入失败{errorCount}条!{(addRoomCount > 0 ? "添加机房" + addRoomCount + "条," : "")}{(addRackCount > 0 ? "添加机架" + addRackCount + "条" : "")}{(addFrameCount > 0 ? "添加机框" + addFrameCount + "条" : "")}"); } /// diff --git a/ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs b/ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs index 1276ccb..d8f9f28 100644 --- a/ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs +++ b/ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs @@ -4,6 +4,7 @@ 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 @@ -207,11 +208,29 @@ namespace ZR.Admin.WebApi.Controllers.Business [HttpPut] [ActionPermissionFilter(Permission = "odfracks:edit")] [Log(Title = "机架列表", BusinessType = BusinessType.UPDATE)] - public IActionResult UpdateOdfRacks([FromBody] OdfRacksDto parm) + 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); } diff --git a/ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs b/ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs index 5edb8fc..995c1ae 100644 --- a/ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs +++ b/ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs @@ -7,6 +7,9 @@ using ZR.ServiceCore.Services; using System.Threading.Tasks; using ZR.Service.Business; using SqlSugar; +using static SKIT.FlurlHttpClient.Wechat.Api.Models.WxaBusinessGetLiveInfoResponse.Types; +using Aliyun.OSS; +using Azure; //创建时间:2025-08-05 namespace ZR.Admin.WebApi.Controllers.Business @@ -342,7 +345,7 @@ namespace ZR.Admin.WebApi.Controllers.Business } } } - + } @@ -378,14 +381,17 @@ namespace ZR.Admin.WebApi.Controllers.Business var response = _OdfRoomsService.UpdateOdfRooms(modal); if (response > 0) { + var deptId = modal.DeptId ?? 0; + var deptName = modal.DeptName; + var roomName = modal.RoomName; + var oldRoomId = oldModel.Id; + 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 => it.RoomId == oldRoomId, // WHERE条件 it => new OdfPorts // SET部分 { DeptId = deptId, @@ -394,14 +400,14 @@ namespace ZR.Admin.WebApi.Controllers.Business ); // 1. 更新 odf_racks var racksUpdated = await _OdfRacksService.UpdateAsync( - r => r.RoomId == roomId, + r => r.RoomId == oldRoomId, 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) + .Where(r => r.RoomId == oldRoomId && r.Id == f.RackId) .Any(), f => new OdfFrames { DeptId = deptId } ); @@ -410,6 +416,17 @@ namespace ZR.Admin.WebApi.Controllers.Business //_OdfFramesService //_OdfRacksService } + if (oldModel.RoomName != modal.RoomName) + { + // 最直接的转换 + await _OdfPortsService.UpdateAsync( + it => it.RoomId == oldRoomId, // WHERE条件 + it => new OdfPorts // SET部分 + { + RoomName = roomName, + } + ); + } } return ToResponse(response); } @@ -454,15 +471,179 @@ namespace ZR.Admin.WebApi.Controllers.Business [HttpPost("importData")] [Log(Title = "机房列表导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)] [ActionPermissionFilter(Permission = "odfrooms:import")] - public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile) + public async Task ImportData([FromForm(Name = "file")] IFormFile formFile) { - List list = new(); + List list = new(); using (var stream = formFile.OpenReadStream()) { - list = stream.Query(startCell: "A1").ToList(); + list = stream.Query(startCell: "A1").ToList(); } + int errorCount = 0; + int successCount = 0; + int addRoomCount = 0; + int addRackCount = 0; + int addFrameCount = 0; + int addPortCount = 0; + if (list.Count > 0) + { + List odfPorts = new List(); + var deptName = list.Select(it => it.DeptName.Trim()).Distinct().ToList(); + var deptInfo = sysDeptService.AsQueryable().Where(it => deptName.Contains(it.DeptName)).Select(it => new { it.DeptId, it.DeptName }).ToList(); - return SUCCESS(_OdfRoomsService.ImportOdfRooms(list.Adapt>())); + var roomNameList = list.Select(it => it.RoomName).Select(it => it.Trim()).Distinct().ToList(); + var roomList = _OdfRoomsService.AsQueryable().Where(it => roomNameList.Contains(it.RoomName)).ToList(); + foreach (var excelItem in list) + { + try + { + var dept = deptInfo.Find(it => it.DeptName == excelItem.DeptName); + if (dept == null) + { + //没有部门,下一个数据 + errorCount++; + continue; + } + var room = roomList.Find(it => it.RoomName == excelItem.RoomName); + if (room == null) + { + //添加机房 + var roomItem = new OdfRooms() + { + CreatedAt = DateTime.Now, + RoomAddress = "", + UpdatedAt = DateTime.Now, + DeptId = dept.DeptId, + DeptName = dept.DeptName, + RacksCount = excelItem.RacksCount, + Remarks = "", + RoomName = excelItem.RoomName + }; + await _OdfRoomsService.InsertReturnEntityAsync(roomItem); + addRoomCount++; + roomList.Add(roomItem); + room = roomItem; + } + else + { + room.RoomAddress = excelItem.RoomAddress?.Trim(); + room.Remarks = excelItem.Remarks?.Trim(); + room.RacksCount = excelItem.RacksCount ?? 0; + room.UpdatedAt = DateTime.Now; + await _OdfRoomsService.UpdateAsync(room); + continue; + } + if (excelItem.RacksCount > 0) + { + var roomId = room.Id; + var roomName = room.RoomName; + List racksList = new List(); + //添加机架 + for (int i = 0; i < excelItem.RacksCount; i++) + { + var t = await _OdfRacksService.InsertReturnEntityAsync(new OdfRacks + { + CreatedAt = DateTime.Now, + FrameCount = excelItem.FrameCount, + DeptId = room.DeptId ?? 0, + RackName = $"odf-{(i + 1)}", + RoomId = roomId, + SequenceNumber = i + 1, + UpdatedAt = DateTime.Now, + }); // 直接插入机架 + racksList.Add(t); + + } + + //机架添加完成 + //return Insertable(model).ExecuteReturnEntity(); + if (excelItem.FrameCount > 0) + { + + //添加机框 + List framesList = new List(); + + foreach (var rack in racksList) + { + for (int i = 0; i < excelItem.FrameCount; i++) + { + var t = await _OdfFramesService.InsertReturnEntityAsync(new OdfFrames() + { + CreatedAt = DateTime.Now, + UpdateAt = DateTime.Now, + PortsCol = 12, + PortsRow = 6, + PortsCount = 6 * 12, + DeptId = rack.DeptId, + PortsName = $"{(i + 1)}框", + RackId = rack.Id, + SequenceNumber = i + 1 + }); + framesList.Add(t); + } + } + 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 < 6; row++) + { + for (int port = 0; port < 12; port++) + { + ports.Add(new OdfPorts() + { + CreatedAt = DateTime.Now, + DeptId = frame.DeptId ?? 0, + DeptName = room.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 = 1, + UpdatedAt = DateTime.Now, + }); + } + } + await _OdfPortsService.AsInsertable(ports).ExecuteReturnEntityAsync(true); + //如果超过100个机框,则休眠一下,防止服务器死机 + index++; + if (index > 100) + { + Thread.Sleep(50); + index = 0; + } + } + + + + } + + } + + + successCount++; + } + catch (Exception) + { + errorCount++; + } + } + + } + return SUCCESS($"导入成功{successCount}条数据,失败{errorCount}"); } /// diff --git a/ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfPorts.xlsx b/ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfPorts.xlsx new file mode 100644 index 0000000..dca1078 Binary files /dev/null and b/ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfPorts.xlsx differ diff --git a/ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfRooms.xlsx b/ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfRooms.xlsx index ba92ad8..dd358d3 100644 Binary files a/ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfRooms.xlsx and b/ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfRooms.xlsx differ diff --git a/ZR.Model/Business/Dto/OdfPortsDto.cs b/ZR.Model/Business/Dto/OdfPortsDto.cs index 1f4c7f3..91a27f5 100644 --- a/ZR.Model/Business/Dto/OdfPortsDto.cs +++ b/ZR.Model/Business/Dto/OdfPortsDto.cs @@ -204,6 +204,69 @@ namespace ZR.Model.Business.Dto public string DeptName { get; set; } } + /// + /// 端口输入对象 + /// + public class OdfPortsImportDto + { + + + + [Required(ErrorMessage = "机房名称不能为空")] + [ExcelColumn(Name = "机房名称")] + [ExcelColumnName("机房名称")] + public string RoomName { get; set; } + + + + [Required(ErrorMessage = "机架名称不能为空")] + [ExcelColumn(Name = "机架名称")] + [ExcelColumnName("机架名称")] + public string RackName { get; set; } + + + + [Required(ErrorMessage = "机框名称不能为空")] + [ExcelColumn(Name = "机框名称")] + [ExcelColumnName("机框名称")] + public string FrameName { get; set; } + + + + [Required(ErrorMessage = "行号不能为空")] + [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 = "连接状态,1正常,0断开")] + [ExcelColumnName("连接状态,1正常,0断开")] + 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; } + + /// + /// 部门名称 + /// + [ExcelColumn(Name = "部门名称")] + public string DeptName { get; set; } + } + /// /// 端口输入输出对象 diff --git a/ZR.Model/Business/Dto/OdfRoomsDto.cs b/ZR.Model/Business/Dto/OdfRoomsDto.cs index e4c5ed1..a2baa12 100644 --- a/ZR.Model/Business/Dto/OdfRoomsDto.cs +++ b/ZR.Model/Business/Dto/OdfRoomsDto.cs @@ -105,9 +105,43 @@ namespace ZR.Model.Business.Dto [ExcelColumn(Name = "修改时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)] [ExcelColumnName("修改时间")] public DateTime? UpdatedAt { get; set; } + } + /// + /// 机房列表输入输出对象 + /// + public class OdfRoomsImDto + { + [ExcelColumn(Name = "部门名称")] + [ExcelColumnName("部门名称")] + public string DeptName { get; set; } + [Required(ErrorMessage = "机房名称不能为空")] + [ExcelColumn(Name = "机房名称")] + [ExcelColumnName("机房名称")] + public string RoomName { get; set; } + + [ExcelColumn(Name = "机房位置")] + [ExcelColumnName("机房位置")] + public string RoomAddress { get; set; } + + [ExcelColumn(Name = "备注")] + [ExcelColumnName("备注")] + public string Remarks { get; set; } + + [ExcelColumn(Name = "机架数量")] + [ExcelColumnName("机架数量")] + public int? RacksCount { get; set; } + + + [ExcelColumn(Name = "机框数量")] + [ExcelColumnName("机框数量")] + public int? FrameCount { get; set; } + + [ExcelColumn(Name = "是否生成端口数据,1生成,0只导入机房列表")] + [ExcelColumnName("是否生成端口数据,1生成,0只导入机房列表")] + public int? CreateRoomInfo { get; set; } } ///