From b46027e9b09800c1144edfe7aba3d130c513daa6 Mon Sep 17 00:00:00 2001 From: zpc Date: Thu, 7 Aug 2025 16:58:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Business/OdfFramesController.cs | 20 +- .../Business/OdfPortsController.cs | 147 ++++++++++++- .../Business/OdfRacksController.cs | 21 +- .../Business/OdfRoomsController.cs | 203 +++++++++++++++++- .../wwwroot/ImportTemplate/OdfPorts.xlsx | Bin 0 -> 10667 bytes .../wwwroot/ImportTemplate/OdfRooms.xlsx | Bin 4375 -> 10387 bytes ZR.Model/Business/Dto/OdfPortsDto.cs | 63 ++++++ ZR.Model/Business/Dto/OdfRoomsDto.cs | 34 +++ 8 files changed, 470 insertions(+), 18 deletions(-) create mode 100644 ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfPorts.xlsx 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 0000000000000000000000000000000000000000..dca1078c1aee51fa399b87801cc048c1e2cd53fb GIT binary patch literal 10667 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 literal 0 HcmV?d00001 diff --git a/ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfRooms.xlsx b/ZR.Admin.WebApi/wwwroot/ImportTemplate/OdfRooms.xlsx index ba92ad840031adcf25914e5e9d992b0daf1cc554..dd358d30e7838d527cefdbbaadd36488ad04f6a4 100644 GIT binary patch literal 10387 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 Vq@h3@1OO00pVuH7t5f{C`hQTU+jjr} literal 4375 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 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; } } ///