odf_new/server/ZR.Service/Business/OdfMarkerPolesService.cs
zpc be824e7f06
All checks were successful
continuous-integration/drone/push Build is passing
修复1.2.0的问题
2026-04-20 16:25:36 +08:00

216 lines
7.4 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 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);
}
}
}