.NETAdmin/ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs
2025-08-14 21:54:06 +08:00

610 lines
25 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
using ZR.Repository;
using Aliyun.OSS;
using System.Linq;
using ZR.Model.System.Dto;
//创建时间2025-08-05
namespace ZR.Admin.WebApi.Controllers.Business
{
/// <summary>
/// 端口
/// </summary>
[Route("business/OdfPorts")]
public class OdfPortsController : BaseController
{
/// <summary>
/// 端口接口
/// </summary>
private readonly IOdfPortsService _OdfPortsService;
/// <summary>
/// 机房列表接口
/// </summary>
private readonly IOdfRoomsService _OdfRoomsService;
private readonly ISysDeptService _SysDeptService;
/// <summary>
///
/// </summary>
private readonly ISysUserService _SysUserService;
/// <summary>
///机架
/// </summary>
private readonly IOdfRacksService _OdfRacksService;
/// <summary>
/// 框
/// </summary>
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;
_SysDeptService = sysDeptService;
}
/// <summary>
/// 查询端口列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("list")]
[ActionPermissionFilter(Permission = "odfports:list")]
public IActionResult QueryOdfPorts([FromQuery] OdfPortsQueryDto parm)
{
var response = _OdfPortsService.GetList(parm);
return SUCCESS(response);
}
/// <summary>
/// 查询端口列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("lists")]
[ActionPermissionFilter(Permission = "odfports:list")]
public IActionResult QueryOdfPorts([FromQuery] OdfPortsQuerysDto parm)
{
var response = _OdfPortsService.GetList(parm);
return SUCCESS(response);
}
/// <summary>
/// 查询端口列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("mlist")]
[ActionPermissionFilter(Permission = "odfports:list")]
public async Task<IActionResult> 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 OdfPortsMDtoc()
{
Id = it.Id,
Name = it.Name,
Status = it.Status,
PortNumber = it.PortNumber,
RowNumber = it.RowNumber
}).ToListAsync();
List<OdfPortsMDtot> row = new List<OdfPortsMDtot>();
l.GroupBy(it => it.RowNumber).ToList().ForEach(g =>
{
var li = l.Where(it => it.RowNumber == g.Key).OrderBy(it => it.PortNumber).Select(it => new OdfPortsMDto { Id = it.Id, Name = it.Name, Status = it.Status }).ToList();
row.Add(new OdfPortsMDtot() { RowList = li, Name = (g.Key + 1).ToString() });
});
item.OdfPortsList = row;
}
return SUCCESS(list);
}
/// <summary>
/// 查询端口详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[HttpGet("{Id}")]
[ActionPermissionFilter(Permission = "odfports:query")]
public IActionResult GetOdfPorts(int Id)
{
var response = _OdfPortsService.GetInfo(Id);
var info = response.Adapt<OdfPortsDto>();
return SUCCESS(info);
}
/// <summary>
/// 查询端口详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[HttpGet("search")]
[ActionPermissionFilter(Permission = "odfports:query")]
public async Task<IActionResult> GetOdfPortsInfo([FromQuery] OdfPortsSearchDto dto)
{
var key = dto.Key;
if (string.IsNullOrEmpty(key))
{
return SUCCESS(new List<OdfPortsQuDto>());
}
var predicate = Expressionable.Create<OdfPorts>();
var list = _OdfPortsService.AsQueryable().Where(it => it.Name.Contains(key) || it.Remarks.Contains(key) || it.HistoryRemarks.Contains(key) || it.OpticalAttenuation.Contains(key)).ToPage<OdfPorts, OdfPortsQuDto>(dto);
var roomId = list.Result.Select(it => it.RoomId).Distinct();
var roomList = await _OdfRoomsService.AsQueryable().Where(it => roomId.Contains(it.Id)).ToListAsync();
list.Result.ForEach(it =>
{
var t = roomList.Find(r => r.Id == it.RoomId);
if (t != null)
{
it.Address = t.RoomAddress;
}
//roomList
});
return SUCCESS(list);
}
/// <summary>
/// 查询端口详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[HttpGet("search2")]
[ActionPermissionFilter(Permission = "odfports:query")]
public async Task<IActionResult> GetOdfPortsInfo2([FromQuery] OdfPortsSearchDto dto)
{
var key = dto.Key;
if (string.IsNullOrEmpty(key))
{
return SUCCESS(new List<OdfPortsQuDto>());
}
var room = await _OdfRoomsService.AsQueryable().Where(it => it.Remarks.Contains(key) || it.RoomAddress.Contains(key) || it.RoomName.Contains(key)).Select((it) => new
{
RoomId = it.Id,
it.RoomName,
it.RoomAddress,
Remarks = string.IsNullOrEmpty(it.Remarks) ? "" : it.Remarks,
it.DeptName
}).ToListAsync();
var predicate = Expressionable.Create<OdfPorts>();
var list = _OdfPortsService.AsQueryable().Where(it => it.Name.Contains(key) || it.Remarks.Contains(key) || it.HistoryRemarks.Contains(key) || it.OpticalAttenuation.Contains(key)).ToPage<OdfPorts, OdfPortsQuDto>(dto);
var roomId = list.Result.Select(it => it.RoomId).Distinct();
var roomList = await _OdfRoomsService.AsQueryable().Where(it => roomId.Contains(it.Id)).ToListAsync();
list.Result.ForEach(it =>
{
var t = roomList.Find(r => r.Id == it.RoomId);
if (t != null)
{
it.Address = t.RoomAddress;
}
//roomList
});
return SUCCESS(new { Rooms = room, Ports = list });
}
/// <summary>
/// 修改端口
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[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);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpGet("odf")]
[ActionPermissionFilter(Permission = "odfports:edit")]
public IActionResult GetOdfTest()
{
return SUCCESS(new { update = true });
}
/// <summary>
/// 添加端口
/// </summary>
/// <returns></returns>
[HttpPost]
[ActionPermissionFilter(Permission = "odfports:add")]
[Log(Title = "端口", BusinessType = BusinessType.INSERT)]
public IActionResult AddOdfPorts([FromBody] OdfPortsDto parm)
{
var modal = parm.Adapt<OdfPorts>().ToCreate(HttpContext);
var response = _OdfPortsService.AddOdfPorts(modal);
return SUCCESS(response);
}
/// <summary>
/// 更新端口
/// </summary>
/// <returns></returns>
[HttpPut]
[ActionPermissionFilter(Permission = "odfports:edit")]
[Log(Title = "端口", BusinessType = BusinessType.UPDATE)]
public IActionResult UpdateOdfPorts([FromBody] OdfPortsDto parm)
{
var modal = parm.Adapt<OdfPorts>().ToUpdate(HttpContext);
var response = _OdfPortsService.UpdateOdfPorts(modal);
return ToResponse(response);
}
/// <summary>
/// 更新端口
/// </summary>
/// <returns></returns>
[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;
port.UpdatedAt = DateTime.Now;
port.OpticalCableOffRemarks = parm.OpticalCableOffRemarks;
if (port.Status == 0)
{
port.Remarks = "";
}
var response = _OdfPortsService.UpdateOdfPorts(port);
return ToResponse(response);
}
/// <summary>
/// 修改端口
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[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);
}
/// <summary>
/// 删除端口
/// </summary>
/// <returns></returns>
[HttpPost("delete/{ids}")]
[ActionPermissionFilter(Permission = "odfports:delete")]
[Log(Title = "端口", BusinessType = BusinessType.DELETE)]
public IActionResult DeleteOdfPorts([FromRoute] string ids)
{
var idArr = Tools.SplitAndConvert<int>(ids);
return ToResponse(_OdfPortsService.Delete(idArr, "删除端口"));
}
/// <summary>
/// 导出端口
/// </summary>
/// <returns></returns>
[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);
}
/// <summary>
/// 导出端口
/// </summary>
/// <returns></returns>
[Log(Title = "导出端口数据", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
[HttpGet("exports")]
[ActionPermissionFilter(Permission = "odfports:export")]
public IActionResult Export([FromQuery] OdfPortsQuerysDto 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);
}
/// <summary>
/// 导入
/// </summary>
/// <param name="formFile"></param>
/// <returns></returns>
[HttpPost("importData")]
[Log(Title = "端口导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
[ActionPermissionFilter(Permission = "odfports:import")]
public async Task<IActionResult> ImportData([FromForm(Name = "file")] IFormFile formFile)
{
List<OdfPortsImportDto> list = new();
using (var stream = formFile.OpenReadStream())
{
list = stream.Query<OdfPortsImportDto>(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> odfPorts = new List<OdfPorts>();
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 = "",
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(),
OpticalCableOffRemarks = excelItem.OpticalCableOffRemarks
};
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;
port.OpticalCableOffRemarks = excelItem.OpticalCableOffRemarks;
port.UpdatedAt = DateTime.Now;
await _OdfPortsService.UpdateAsync(port);
}
successCount++;
}
catch (Exception)
{
errorCount++;
}
}
}
return SUCCESS($"共查询{list.Count}条数据,导入成功{successCount}条数据!导入失败{errorCount}条!{(addRoomCount > 0 ? "" + addRoomCount + "," : "")}{(addRackCount > 0 ? "" + addRackCount + "" : "")}{(addFrameCount > 0 ? "" + addFrameCount + "" : "")}");
}
/// <summary>
/// 端口导入模板下载
/// </summary>
/// <returns></returns>
[HttpGet("importTemplate")]
[Log(Title = "端口模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
[AllowAnonymous]
public IActionResult ImportTemplateExcel()
{
var result = DownloadImportTemplate(new List<OdfPortsDto>() { }, "OdfPorts");
return ExportExcel(result.Item2, result.Item1);
}
/// <summary>
/// 删除端口
/// </summary>
/// <returns></returns>
[HttpPost("deleteAll")]
[ActionPermissionFilter(Permission = "odfports:delete")]
[Log(Title = "删除端口数据", BusinessType = BusinessType.DELETE)]
public async Task<IActionResult> 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<OdfRacks>()
.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);
}
}
}