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;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.WxaBusinessGetLiveInfoResponse.Types;
using Aliyun.OSS;
using Azure;
//创建时间: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)
{
var deptId = modal.DeptId ?? 0;
var deptName = modal.DeptName;
var roomName = modal.RoomName;
var oldRoomId = oldModel.Id;
if (oldModel.DeptId != modal.DeptId)
{
// 最直接的转换
await _OdfPortsService.UpdateAsync(
it => it.RoomId == oldRoomId, // WHERE条件
it => new OdfPorts // SET部分
{
DeptId = deptId,
DeptName = deptName
}
);
// 1. 更新 odf_racks
var racksUpdated = await _OdfRacksService.UpdateAsync(
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 == oldRoomId && 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
}
if (oldModel.RoomName != modal.RoomName)
{
// 最直接的转换
await _OdfPortsService.UpdateAsync(
it => it.RoomId == oldRoomId, // WHERE条件
it => new OdfPorts // SET部分
{
RoomName = roomName,
}
);
}
}
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 async Task ImportData([FromForm(Name = "file")] IFormFile formFile)
{
List list = new();
using (var stream = formFile.OpenReadStream())
{
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();
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 = excelItem.RoomAddress,
UpdatedAt = DateTime.Now,
DeptId = dept.DeptId,
DeptName = dept.DeptName,
RacksCount = excelItem.RacksCount,
Remarks = excelItem.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);
successCount++;
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}");
}
///
/// 机房列表导入模板下载
///
///
[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);
}
}
}