namespace Admin.NET.Plugin.AiDOP.Production; /// /// 产线节假日(HolidayMaster) /// 路由前缀:/api/Production/holiday/... /// [ApiDescriptionSettings(Order = 269, Description = "产线节假日")] [Route("api/Production")] [AllowAnonymous] [NonUnify] public class HolidayMasterService : IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; private readonly UserManager _userManager; public HolidayMasterService(ISqlSugarClient db, UserManager userManager) { _db = db; _userManager = userManager; } [DisplayName("产线节假日列表")] [HttpGet("holiday/list")] public async Task GetList([FromQuery] HolidayMasterListInput input) { var tenantId = _userManager.TenantId; var pars = new List { new("@TenantId", tenantId) }; var where = "h.IsActive = 1 AND h.tenant_id = @TenantId"; if (!string.IsNullOrWhiteSpace(input.HolidayType)) { where += " AND h.Ufld1 = @Ufld1"; pars.Add(new SugarParameter("@Ufld1", input.HolidayType.Trim())); } var orderClause = ResolveOrder(input.OrderBy, input.Sort); var offset = (input.Page - 1) * input.PageSize; var baseSql = $""" SELECT h.Dated AS Dated, h.Ufld1 AS Ufld1, h.Holiday AS Holiday, h.RecID AS Id, h.`Domain` AS Domain, h.Site AS Site FROM HolidayMaster h WHERE {where} """; var total = await _db.Ado.GetIntAsync($"SELECT COUNT(*) FROM ({baseSql}) AS t", pars); var list = await _db.Ado.SqlQueryAsync( $"SELECT * FROM ({baseSql}) AS t ORDER BY {orderClause} LIMIT {input.PageSize} OFFSET {offset}", pars); return new { total, page = input.Page, pageSize = input.PageSize, list }; } [DisplayName("产线节假日详情")] [HttpGet("holiday/{id:long}")] public async Task GetDetail(long id) { var tenantId = _userManager.TenantId; var row = (await _db.Ado.SqlQueryAsync( """ SELECT RecID AS Id, Holiday, Dated, Ufld1, `Domain`, Site FROM HolidayMaster WHERE RecID = @Id AND tenant_id = @TenantId """, new List { new("@Id", id), new("@TenantId", tenantId) })).FirstOrDefault() ?? throw Oops.Oh("记录不存在"); return row; } [DisplayName("保存产线节假日")] [HttpPost("holiday/save")] public async Task Save([FromBody] HolidayMasterSaveInput input) { var tenantId = _userManager.TenantId; var account = Truncate8(_userManager.Account ?? "system"); var now = DateTime.Now; var holiday = Truncate(input.Holiday.Trim(), 8); var ufld1 = Truncate(input.Ufld1.Trim(), 8); var domain = Truncate(input.Domain.Trim(), 8); var site = Truncate(input.Site.Trim(), 4); var dated = input.Dated ?? throw Oops.Oh("日期不能为空"); if (input.Id is null or 0) { await _db.Ado.ExecuteCommandAsync( """ INSERT INTO HolidayMaster ( Holiday, Dated, Ufld1, `Domain`, Site, BusinessID, IsActive, IsConfirm, IsChanged, CreateUser, CreateTime, UpdateUser, UpdateTime, tenant_id ) VALUES ( @Holiday, @Dated, @Ufld1, @Domain, @Site, 0, 1, 0, 0, @User, @Now, @User, @Now, @TenantId ) """, new List { new("@Holiday", holiday), new("@Dated", dated), new("@Ufld1", ufld1), new("@Domain", domain), new("@Site", site), new("@User", account), new("@Now", now), new("@TenantId", tenantId) }); var newId = await _db.Ado.GetIntAsync("SELECT LAST_INSERT_ID()"); return new { id = (long)newId, message = "新增成功" }; } var n = await _db.Ado.ExecuteCommandAsync( """ UPDATE HolidayMaster SET Holiday = @Holiday, Dated = @Dated, Ufld1 = @Ufld1, `Domain` = @Domain, Site = @Site, UpdateUser = @User, UpdateTime = @Now WHERE RecID = @Id AND tenant_id = @TenantId """, new List { new("@Id", input.Id!.Value), new("@Holiday", holiday), new("@Dated", dated), new("@Ufld1", ufld1), new("@Domain", domain), new("@Site", site), new("@User", account), new("@Now", now), new("@TenantId", tenantId) }); if (n == 0) throw Oops.Oh("记录不存在或未变更"); return new { id = input.Id, message = "保存成功" }; } [DisplayName("删除产线节假日")] [HttpPost("holiday/delete/{id:long}")] public async Task Delete(long id) { var tenantId = _userManager.TenantId; var n = await _db.Ado.ExecuteCommandAsync( "UPDATE HolidayMaster SET IsActive = 0, UpdateTime = @Now WHERE RecID = @Id AND tenant_id = @TenantId", new List { new("@Id", id), new("@Now", DateTime.Now), new("@TenantId", tenantId) }); if (n == 0) throw Oops.Oh("记录不存在"); return new { message = "已删除" }; } private static string Truncate(string s, int maxLen) => s.Length <= maxLen ? s : s[..maxLen]; private static string Truncate8(string s) => Truncate(s, 8); private static string ResolveOrder(string? orderBy, string? sort) { var desc = string.Equals(sort?.Trim(), "desc", StringComparison.OrdinalIgnoreCase); var dir = desc ? "DESC" : "ASC"; var key = orderBy?.Trim().ToLowerInvariant(); var col = key switch { "holiday" => "t.Holiday", "dated" => "t.Dated", "ufld1" => "t.Ufld1", _ => "t.Dated" }; return $"{col} {dir}, t.Id"; } private sealed class HolidayListRow { public DateTime? Dated { get; set; } public string? Ufld1 { get; set; } public string? Holiday { get; set; } public long Id { get; set; } public string? Domain { get; set; } public string? Site { get; set; } } private sealed class HolidayDetailRow { public long Id { get; set; } public string? Holiday { get; set; } public DateTime? Dated { get; set; } public string? Ufld1 { get; set; } public string? Domain { get; set; } public string? Site { get; set; } } }