数据库: - 新增 odf_checkin/odf_cables/odf_cable_faults/odf_cable_fault_images/odf_user_modules 5张表 - 新增菜单权限和角色分配 SQL 脚本 后台 API (.NET/SqlSugar): - 新增实体模型、DTO、Service、Controller (签到/光缆/故障/图片/用户模块) 前端 APP (UniApp): - 新增 portal/checkin/trunk/cable/fault-list/fault-detail/fault-add/trunk-search/route-plan 9个页面 - 新增 permission/checkin/trunk 服务层 - 新增 navigation/watermark 工具函数 后台管理前端 (ZR.Vue): - 新增光缆管理/干线故障管理/签到记录管理/用户模块权限 4个管理页面 - 新增对应 API 模块和表单组件
224 lines
7.3 KiB
C#
224 lines
7.3 KiB
C#
using Infrastructure;
|
|
using Infrastructure.Attribute;
|
|
using Microsoft.AspNetCore.Hosting;
|
|
using Microsoft.AspNetCore.Http;
|
|
using ZR.Model;
|
|
using ZR.Model.Business;
|
|
using ZR.Model.Business.Dto;
|
|
using ZR.Model.Dto;
|
|
using ZR.Repository;
|
|
using ZR.Service.Business.IBusinessService;
|
|
|
|
namespace ZR.Service.Business
|
|
{
|
|
/// <summary>
|
|
/// 干线故障Service业务层处理
|
|
/// </summary>
|
|
[AppService(ServiceType = typeof(IOdfCableFaultsService), ServiceLifetime = LifeTime.Transient)]
|
|
public class OdfCableFaultsService : BaseService<OdfCableFaults>, IOdfCableFaultsService
|
|
{
|
|
/// <summary>
|
|
/// 按 CableId 分页查询故障列表,联查光缆名称,按 FaultTime DESC 排序
|
|
/// </summary>
|
|
public PagedInfo<dynamic> GetList(OdfCableFaultsQueryDto parm)
|
|
{
|
|
var predicate = QueryExp(parm);
|
|
|
|
var response = Queryable()
|
|
.Where(predicate.ToExpression())
|
|
.LeftJoin<OdfCables>((f, c) => f.CableId == c.Id)
|
|
.OrderByDescending((f, c) => f.FaultTime)
|
|
.Select((f, c) => new
|
|
{
|
|
f.Id,
|
|
f.CableId,
|
|
f.FaultTime,
|
|
f.Personnel,
|
|
f.FaultReason,
|
|
f.Mileage,
|
|
f.Location,
|
|
f.Latitude,
|
|
f.Longitude,
|
|
f.Remark,
|
|
f.CreatedAt,
|
|
CableName = c.CableName
|
|
})
|
|
.ToPage<dynamic>(parm);
|
|
|
|
return response;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询故障详情,联查光缆名称和图片列表
|
|
/// </summary>
|
|
public object GetDetail(int id)
|
|
{
|
|
var fault = Queryable()
|
|
.LeftJoin<OdfCables>((f, c) => f.CableId == c.Id)
|
|
.Where((f, c) => f.Id == id)
|
|
.Select((f, c) => new
|
|
{
|
|
f.Id,
|
|
f.CableId,
|
|
f.FaultTime,
|
|
f.Personnel,
|
|
f.FaultReason,
|
|
f.Mileage,
|
|
f.Location,
|
|
f.Latitude,
|
|
f.Longitude,
|
|
f.Remark,
|
|
f.UserId,
|
|
f.CreatedAt,
|
|
CableName = c.CableName
|
|
})
|
|
.First();
|
|
|
|
if (fault == null)
|
|
{
|
|
throw new CustomException("故障记录不存在");
|
|
}
|
|
|
|
// 查询关联图片列表
|
|
var images = Context.Queryable<OdfCableFaultImages>()
|
|
.Where(img => img.FaultId == id)
|
|
.OrderBy(img => img.Id)
|
|
.Select(img => new { img.Id, img.ImageUrl })
|
|
.ToList();
|
|
|
|
return new
|
|
{
|
|
fault.Id,
|
|
fault.CableId,
|
|
fault.FaultTime,
|
|
fault.Personnel,
|
|
fault.FaultReason,
|
|
fault.Mileage,
|
|
fault.Location,
|
|
fault.Latitude,
|
|
fault.Longitude,
|
|
fault.Remark,
|
|
fault.CableName,
|
|
fault.CreatedAt,
|
|
Images = images
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// 新增故障(含图片上传)
|
|
/// </summary>
|
|
public async Task<int> AddFault(OdfCableFaultAddDto dto)
|
|
{
|
|
// 校验 CableId 存在
|
|
var cable = Context.Queryable<OdfCables>()
|
|
.Where(c => c.Id == dto.CableId)
|
|
.First();
|
|
if (cable == null)
|
|
{
|
|
throw new CustomException("光缆不存在");
|
|
}
|
|
|
|
// 校验至少 1 张图片
|
|
if (dto.Images == null || dto.Images.Length == 0)
|
|
{
|
|
throw new CustomException("请至少上传一张图片");
|
|
}
|
|
|
|
// 插入故障记录
|
|
var model = new OdfCableFaults
|
|
{
|
|
CableId = dto.CableId,
|
|
FaultTime = DateTime.Parse(dto.FaultTime),
|
|
Personnel = dto.Personnel,
|
|
FaultReason = dto.FaultReason,
|
|
Mileage = dto.Mileage,
|
|
Location = dto.Location,
|
|
Latitude = dto.Latitude,
|
|
Longitude = dto.Longitude,
|
|
Remark = dto.Remark,
|
|
UserId = dto.UserId,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
};
|
|
|
|
var faultEntity = Insertable(model).ExecuteReturnEntity();
|
|
int faultId = faultEntity.Id;
|
|
|
|
// 保存图片文件并插入图片记录
|
|
IWebHostEnvironment webHostEnvironment = App.WebHostEnvironment;
|
|
string webRootPath = webHostEnvironment.WebRootPath;
|
|
string uploadDir = Path.Combine("uploads", "fault");
|
|
string fullDir = Path.Combine(webRootPath, uploadDir);
|
|
|
|
if (!Directory.Exists(fullDir))
|
|
{
|
|
Directory.CreateDirectory(fullDir);
|
|
}
|
|
|
|
foreach (var image in dto.Images)
|
|
{
|
|
string fileExt = Path.GetExtension(image.FileName);
|
|
string fileName = $"{DateTime.Now:yyyyMMdd}_{Guid.NewGuid():N}{fileExt}";
|
|
string filePath = Path.Combine(fullDir, fileName);
|
|
|
|
using (var stream = new FileStream(filePath, FileMode.Create))
|
|
{
|
|
await image.CopyToAsync(stream);
|
|
}
|
|
|
|
string imageUrl = $"/{uploadDir}/{fileName}".Replace("\\", "/");
|
|
|
|
var imageRecord = new OdfCableFaultImages
|
|
{
|
|
FaultId = faultId,
|
|
ImageUrl = imageUrl,
|
|
CreatedAt = DateTime.Now
|
|
};
|
|
|
|
Context.Insertable(imageRecord).ExecuteCommand();
|
|
}
|
|
|
|
return faultId;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除故障记录并级联删除关联图片
|
|
/// </summary>
|
|
public int Delete(int id)
|
|
{
|
|
// 先删除关联图片记录
|
|
Context.Deleteable<OdfCableFaultImages>()
|
|
.Where(img => img.FaultId == id)
|
|
.ExecuteCommand();
|
|
|
|
// 再删除故障记录
|
|
return base.Delete(id);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 导出故障列表
|
|
/// </summary>
|
|
public PagedInfo<dynamic> ExportList(OdfCableFaultsQueryDto parm)
|
|
{
|
|
parm.PageNum = 1;
|
|
parm.PageSize = 100000;
|
|
return GetList(parm);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询表达式
|
|
/// </summary>
|
|
private static Expressionable<OdfCableFaults> QueryExp(OdfCableFaultsQueryDto parm)
|
|
{
|
|
var predicate = Expressionable.Create<OdfCableFaults>();
|
|
|
|
predicate = predicate.AndIF(parm.CableId != null, it => it.CableId == parm.CableId);
|
|
predicate = predicate.AndIF(parm.BeginFaultTime != null, it => it.FaultTime >= parm.BeginFaultTime);
|
|
predicate = predicate.AndIF(parm.EndFaultTime != null, it => it.FaultTime <= parm.EndFaultTime);
|
|
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.FaultReason), it => it.FaultReason.Contains(parm.FaultReason));
|
|
|
|
return predicate;
|
|
}
|
|
}
|
|
}
|