216 lines
7.4 KiB
C#
216 lines
7.4 KiB
C#
using Infrastructure;
|
||
using Infrastructure.Attribute;
|
||
using ZR.Model;
|
||
using ZR.Model.Business;
|
||
using ZR.Model.Business.Dto;
|
||
using ZR.Model.System;
|
||
using ZR.Repository;
|
||
using ZR.Service.Business.IBusinessService;
|
||
|
||
namespace ZR.Service.Business
|
||
{
|
||
/// <summary>
|
||
/// 标石/杆号牌Service业务层处理
|
||
/// </summary>
|
||
[AppService(ServiceType = typeof(IOdfMarkerPolesService), ServiceLifetime = LifeTime.Transient)]
|
||
public class OdfMarkerPolesService : BaseService<OdfMarkerPoles>, IOdfMarkerPolesService
|
||
{
|
||
/// <summary>
|
||
/// 分页查询标石/杆号牌列表,应用部门数据隔离
|
||
/// </summary>
|
||
public PagedInfo<OdfMarkerPoleListDto> GetList(OdfMarkerPolesQueryDto parm, long deptId)
|
||
{
|
||
var predicate = Expressionable.Create<OdfMarkerPoles>();
|
||
|
||
// 部门数据隔离
|
||
var visibleDeptIds = DeptDataScopeHelper.GetVisibleDeptIds(Context, deptId);
|
||
predicate = predicate.And(it => visibleDeptIds.Contains(it.DeptId));
|
||
|
||
// 按 CableId 过滤
|
||
predicate = predicate.AndIF(parm.CableId != null, it => it.CableId == parm.CableId);
|
||
|
||
// 按名称关键字过滤
|
||
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Keyword), it => it.Name.Contains(parm.Keyword));
|
||
|
||
var total = 0;
|
||
var list = Queryable()
|
||
.LeftJoin<OdfCables>((mp, c) => mp.CableId == c.Id)
|
||
.Where(predicate.ToExpression())
|
||
.OrderByDescending((mp, c) => mp.RecordTime)
|
||
.Select((mp, c) => new OdfMarkerPoleListDto
|
||
{
|
||
Id = mp.Id,
|
||
CableId = mp.CableId,
|
||
Name = mp.Name,
|
||
RecordTime = mp.RecordTime,
|
||
Personnel = mp.Personnel,
|
||
Latitude = mp.Latitude,
|
||
Longitude = mp.Longitude,
|
||
ActualMileage = mp.ActualMileage,
|
||
DeptName = mp.DeptName,
|
||
CableName = c.CableName
|
||
})
|
||
.ToPageList(parm.PageNum, parm.PageSize, ref total);
|
||
|
||
return new PagedInfo<OdfMarkerPoleListDto>
|
||
{
|
||
Result = list,
|
||
TotalNum = total,
|
||
PageIndex = parm.PageNum,
|
||
PageSize = parm.PageSize
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询标石/杆号牌详情,含图片 URL 列表
|
||
/// </summary>
|
||
public OdfMarkerPoleDetailDto GetDetail(int id)
|
||
{
|
||
var entity = GetFirst(it => it.Id == id);
|
||
if (entity == null)
|
||
{
|
||
throw new CustomException("标石记录不存在");
|
||
}
|
||
|
||
var cable = Context.Queryable<OdfCables>()
|
||
.Where(c => c.Id == entity.CableId)
|
||
.First();
|
||
|
||
var images = Context.Queryable<OdfMarkerPoleImages>()
|
||
.Where(img => img.MarkerPoleId == id)
|
||
.OrderBy(img => img.Id)
|
||
.Select(img => img.ImageUrl)
|
||
.ToList();
|
||
|
||
return new OdfMarkerPoleDetailDto
|
||
{
|
||
Id = entity.Id,
|
||
CableId = entity.CableId,
|
||
Name = entity.Name,
|
||
RecordTime = entity.RecordTime,
|
||
Personnel = entity.Personnel,
|
||
Latitude = entity.Latitude,
|
||
Longitude = entity.Longitude,
|
||
ActualMileage = entity.ActualMileage,
|
||
DeptId = entity.DeptId,
|
||
DeptName = entity.DeptName ?? Context.Queryable<SysDept>()
|
||
.Where(d => d.DeptId == entity.DeptId)
|
||
.Select(d => d.DeptName)
|
||
.First(),
|
||
CableName = cable?.CableName,
|
||
UserId = entity.UserId,
|
||
CreatedAt = entity.CreatedAt,
|
||
UpdatedAt = entity.UpdatedAt,
|
||
ImageUrls = images
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// 新增标石/杆号牌,自动填充 DeptId/DeptName
|
||
/// </summary>
|
||
public int Add(OdfMarkerPoleAddDto dto, long deptId)
|
||
{
|
||
// 校验 CableId 存在
|
||
var cable = Context.Queryable<OdfCables>()
|
||
.Where(c => c.Id == dto.CableId)
|
||
.First();
|
||
if (cable == null)
|
||
{
|
||
throw new CustomException("光缆不存在");
|
||
}
|
||
|
||
// 校验至少 1 张图片
|
||
if (dto.ImageUrls == null || dto.ImageUrls.Length == 0)
|
||
{
|
||
throw new CustomException("请至少上传一张图片");
|
||
}
|
||
|
||
// 查询部门名称;若当前用户无部门(如超级管理员 DeptId=0),从光缆继承
|
||
var actualDeptId = deptId;
|
||
string actualDeptName = null;
|
||
if (deptId > 0)
|
||
{
|
||
var dept = Context.Queryable<SysDept>()
|
||
.Where(d => d.DeptId == deptId)
|
||
.First();
|
||
actualDeptName = dept?.DeptName;
|
||
}
|
||
else
|
||
{
|
||
actualDeptId = cable.DeptId;
|
||
actualDeptName = cable.DeptName;
|
||
}
|
||
|
||
var model = new OdfMarkerPoles
|
||
{
|
||
CableId = dto.CableId,
|
||
Name = dto.Name,
|
||
RecordTime = DateTime.Parse(dto.RecordTime),
|
||
Personnel = dto.Personnel,
|
||
Latitude = dto.Latitude,
|
||
Longitude = dto.Longitude,
|
||
ActualMileage = dto.ActualMileage,
|
||
DeptId = actualDeptId,
|
||
DeptName = actualDeptName,
|
||
UserId = dto.UserId,
|
||
CreatedAt = DateTime.Now,
|
||
UpdatedAt = DateTime.Now
|
||
};
|
||
|
||
var entity = Insertable(model).ExecuteReturnEntity();
|
||
|
||
// 插入图片记录
|
||
foreach (var imageUrl in dto.ImageUrls)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(imageUrl)) continue;
|
||
|
||
var imageRecord = new OdfMarkerPoleImages
|
||
{
|
||
MarkerPoleId = entity.Id,
|
||
ImageUrl = imageUrl,
|
||
CreatedAt = DateTime.Now
|
||
};
|
||
Context.Insertable(imageRecord).ExecuteCommand();
|
||
}
|
||
|
||
return entity.Id;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 编辑标石/杆号牌
|
||
/// </summary>
|
||
public int Update(OdfMarkerPoleEditDto dto)
|
||
{
|
||
var entity = GetFirst(it => it.Id == dto.Id);
|
||
if (entity == null)
|
||
{
|
||
throw new CustomException("标石记录不存在");
|
||
}
|
||
|
||
entity.Name = dto.Name;
|
||
entity.Personnel = dto.Personnel;
|
||
entity.Latitude = dto.Latitude;
|
||
entity.Longitude = dto.Longitude;
|
||
entity.ActualMileage = dto.ActualMileage;
|
||
entity.CableId = dto.CableId;
|
||
entity.UpdatedAt = DateTime.Now;
|
||
|
||
return base.Update(entity, true);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 删除标石/杆号牌及关联图片
|
||
/// </summary>
|
||
public int Delete(int id)
|
||
{
|
||
// 删除关联图片记录
|
||
Context.Deleteable<OdfMarkerPoleImages>()
|
||
.Where(img => img.MarkerPoleId == id)
|
||
.ExecuteCommand();
|
||
|
||
// 删除标石记录
|
||
return base.Delete(id);
|
||
}
|
||
}
|
||
}
|