using Admin.NET.Plugin.AiDOP.Manufacturing.Dto; namespace Admin.NET.Plugin.AiDOP.Manufacturing; /// /// S6 生产设备台账 只读 list 服务。 /// /// 数据源:aidopdev.EquipmentList(设备台账主表,单表直读,无 join)。 /// 参考本仓既有直读 + 接骨架范式:S7 FinishedWarehouse/ProductionInboundService、S5 LabelQueryService。 /// /// 本服务仅 SELECT:无新增/编辑/删除/启停用/状态流转/打印/标签打印/导出/部件明细;不写 EquipmentList;不建 MDP。 /// EquipmentList 含 tenant_id:TenantId>0 时按 tenant_id 过滤(不绕过)。当前 165 行全在 tenant 824585161322565; /// 默认租户 1300000000001 下 total=0 为正确隔离;真实数据渲染需切到 824585161322565。 /// sbzt 已是中文文本 raw 展示;zyd 为 A/B/C/D 等级码 raw 展示(中文映射后置)。 /// [ApiDescriptionSettings(Order = 311, Description = "生产设备台账")] [Route("api/S6ProductionEquipmentLedger")] [AllowAnonymous] [NonUnify] public class ProductionEquipmentLedgerService : IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; public ProductionEquipmentLedgerService(ISqlSugarClient db) { _db = db; } /// /// 生产设备台账列表(只读分页查询)。 /// [DisplayName("生产设备台账列表")] [HttpGet("list")] public async Task GetList([FromQuery] ProductionEquipmentLedgerListInput input) { var page = input.Page <= 0 ? 1 : input.Page; var pageSize = input.PageSize <= 0 ? 10 : input.PageSize; if (pageSize > 200) pageSize = 200; var offset = (page - 1) * pageSize; var where = new List { "1=1" }; var pars = new List(); if (input.TenantId is > 0) { where.Add("m.tenant_id = @TenantId"); pars.Add(new SugarParameter("@TenantId", input.TenantId)); } if (!string.IsNullOrWhiteSpace(input.EquipmentName)) { where.Add("m.MachineName LIKE @EquipmentName"); pars.Add(new SugarParameter("@EquipmentName", $"%{input.EquipmentName.Trim()}%")); } if (!string.IsNullOrWhiteSpace(input.EquipmentCode)) { where.Add("m.InternalEquipmentCode LIKE @EquipmentCode"); pars.Add(new SugarParameter("@EquipmentCode", $"%{input.EquipmentCode.Trim()}%")); } if (!string.IsNullOrWhiteSpace(input.EquipmentAssetId)) { where.Add("m.EquipmentAssetID LIKE @EquipmentAssetId"); pars.Add(new SugarParameter("@EquipmentAssetId", $"%{input.EquipmentAssetId.Trim()}%")); } var whereSql = string.Join(" AND ", where); var total = await _db.Ado.GetIntAsync( $"SELECT COUNT(1) FROM EquipmentList m WHERE {whereSql}", pars); var list = await _db.Ado.SqlQueryAsync( $""" SELECT m.id AS Id, m.MachineName AS EquipmentName, m.EquipmentAssetID AS EquipmentIdentCode, m.zyd AS Importance, m.ccrq AS FactoryDate, m.edgl AS RatedPower, m.zzcs AS Manufacturer, m.cj AS Workshop, m.bgr AS Keeper, m.StandardRepairDays AS Standard, m.sbczgc AS OperationProcedure, m.sbzt AS EquipmentStatus, m.yfynx AS ServedYears, m.bzm AS Remark, m.InternalEquipmentCode AS EquipmentCode, m.xh AS Model, m.fj AS Attachment, m.jysynx AS SuggestedUsageYears, m.TypeName AS EquipmentTypeName, m.bz AS Team, m.sbfl AS EquipmentCategory, m.IsSchedulable AS IsSchedulable, m.EstimatedMaintenanceReleaseTime AS EstimatedMaintenanceReleaseTime, m.tenant_id AS TenantId FROM EquipmentList m WHERE {whereSql} ORDER BY {BuildOrderBy(input.OrderBy, input.OrderDir)} LIMIT {pageSize} OFFSET {offset} """, pars); return new { total, page, pageSize, list }; } /// /// 排序白名单:仅允许按已展示列排序,杜绝 SQL 注入;非法字段回落默认。 /// private static string BuildOrderBy(string? orderBy, string? orderDir) { var column = orderBy switch { "equipmentName" => "m.MachineName", "equipmentCode" => "m.InternalEquipmentCode", "equipmentIdentCode" => "m.EquipmentAssetID", "importance" => "m.zyd", "factoryDate" => "m.ccrq", "ratedPower" => "m.edgl", "manufacturer" => "m.zzcs", "workshop" => "m.cj", "keeper" => "m.bgr", "standard" => "m.StandardRepairDays", "equipmentStatus" => "m.sbzt", "servedYears" => "m.yfynx", "suggestedUsageYears" => "m.jysynx", "equipmentTypeName" => "m.TypeName", _ => "m.id", }; var direction = string.Equals(orderDir, "asc", StringComparison.OrdinalIgnoreCase) ? "ASC" : "DESC"; return $"{column} {direction}, m.id DESC"; } }