namespace Admin.NET.Plugin.AiDOP.Production; /// /// 产线休息时间(QualityLineWorkDetail) /// 路由前缀:/api/Production/line-rest/... /// [ApiDescriptionSettings(Order = 268, Description = "产线休息时间")] [Route("api/Production")] [AllowAnonymous] [NonUnify] public class QualityLineWorkDetailService : IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; private readonly UserManager _userManager; public QualityLineWorkDetailService(ISqlSugarClient db, UserManager userManager) { _db = db; _userManager = userManager; } [DisplayName("产线休息时间列表")] [HttpGet("line-rest/list")] public async Task GetList([FromQuery] QualityLineRestListInput input) { var pars = new List(); var where = "qd.IsActive = 1"; if (!string.IsNullOrWhiteSpace(input.ProdLine)) { where += " AND qd.ProdLine = @ProdLine"; pars.Add(new SugarParameter("@ProdLine", input.ProdLine.Trim())); } var orderClause = ResolveOrder(input.OrderBy, input.Sort); var offset = (input.Page - 1) * input.PageSize; var baseSql = $""" SELECT qd.ProdLine AS ProdLine, lm.line_describe AS LineDesc, qd.Line AS Line, qd.RestTimePoint AS RestTimePoint, qd.RestTime AS RestTime, qd.RecID AS Id, qd.Descr1 AS Descr1, qd.EndDateTime AS EndDateTime, qd.Ufld1 AS Remark, qd.`Domain` AS Domain, qd.Site AS Site FROM QualityLineWorkDetail qd LEFT JOIN LineMaster lm ON qd.`Domain` COLLATE utf8mb4_general_ci = lm.`Domain` COLLATE utf8mb4_general_ci AND qd.ProdLine COLLATE utf8mb4_general_ci = lm.`Line` COLLATE utf8mb4_general_ci 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("line-rest/{id:long}")] public async Task GetDetail(long id) { var row = (await _db.Ado.SqlQueryAsync( """ SELECT RecID AS Id, `Domain`, Site, ProdLine, WorkShift, Line, RestTimePoint, RestTime, Ufld1 AS Remark, Descr1, Descr2, Period, EndDateTime FROM QualityLineWorkDetail WHERE RecID = @Id """, new List { new("@Id", id) })).FirstOrDefault() ?? throw Oops.Oh("记录不存在"); return row; } [DisplayName("保存产线休息时间")] [HttpPost("line-rest/save")] public async Task Save([FromBody] QualityLineRestSaveInput input) { var account = Truncate8(_userManager.Account ?? "system"); var now = DateTime.Now; var domain = Truncate(input.Domain.Trim(), 8); var site = Truncate((input.Site ?? input.Domain).Trim(), 8); var prodLine = Truncate(input.ProdLine.Trim(), 12); var restPoint = Truncate(input.RestTimePoint.Trim(), 30); var remark = string.IsNullOrWhiteSpace(input.Remark) ? null : Truncate(input.Remark.Trim(), 8); const string defaultWorkShift = "-"; const string defaultEnd = "2999-12-31"; if (input.Id is null or 0) { await _db.Ado.ExecuteCommandAsync( """ INSERT INTO QualityLineWorkDetail ( `Domain`, Site, ProdLine, WorkShift, Line, RestTimePoint, RestTime, Descr1, Descr2, Period, EndDateTime, Ufld1, IsActive, IsConfirm, BusinessID, CreateUser, CreateTime, UpdateUser, UpdateTime ) VALUES ( @Domain, @Site, @ProdLine, @WorkShift, 0, @RestTimePoint, @RestTime, NULL, NULL, 0, @EndDateTime, @Ufld1, 1, 0, 0, @User, @Now, @User, @Now ) """, new List { new("@Domain", domain), new("@Site", site), new("@ProdLine", prodLine), new("@WorkShift", defaultWorkShift), new("@RestTimePoint", restPoint), new("@RestTime", input.RestTime), new("@EndDateTime", defaultEnd), new("@Ufld1", (object?)remark ?? DBNull.Value), new("@User", account), new("@Now", now) }); var newId = await _db.Ado.GetIntAsync("SELECT LAST_INSERT_ID()"); return new { id = (long)newId, message = "新增成功" }; } var n = await _db.Ado.ExecuteCommandAsync( """ UPDATE QualityLineWorkDetail SET `Domain` = @Domain, Site = @Site, ProdLine = @ProdLine, RestTimePoint = @RestTimePoint, RestTime = @RestTime, Ufld1 = @Ufld1, UpdateUser = @User, UpdateTime = @Now WHERE RecID = @Id """, new List { new("@Id", input.Id!.Value), new("@Domain", domain), new("@Site", site), new("@ProdLine", prodLine), new("@RestTimePoint", restPoint), new("@RestTime", input.RestTime), new("@Ufld1", (object?)remark ?? DBNull.Value), new("@User", account), new("@Now", now) }); if (n == 0) throw Oops.Oh("记录不存在或未变更"); return new { id = input.Id, message = "保存成功" }; } [DisplayName("删除产线休息时间")] [HttpPost("line-rest/delete/{id:long}")] public async Task Delete(long id) { var n = await _db.Ado.ExecuteCommandAsync( "UPDATE QualityLineWorkDetail SET IsActive = 0, UpdateTime = @Now WHERE RecID = @Id", new List { new("@Id", id), new("@Now", DateTime.Now) }); if (n == 0) throw Oops.Oh("记录不存在"); return new { message = "已删除" }; } [DisplayName("生产线列表(含 Domain)")] [HttpGet("line-rest/lines")] public async Task GetLines([FromQuery] string? domain) { var pars = new List(); var where = "IsActive = 1"; if (!string.IsNullOrWhiteSpace(domain)) { where += " AND `Domain` = @Domain"; pars.Add(new SugarParameter("@Domain", domain.Trim())); } var rows = await _db.Ado.SqlQueryAsync( $""" SELECT `Line` AS Value, `Line` AS Label, `Domain` AS Extra FROM LineMaster WHERE {where} ORDER BY `Domain`, `Line` """, pars); return new { list = rows }; } 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 { "prodline" => "t.ProdLine", "resttimepoint" => "t.RestTimePoint", "remark" => "t.Remark", _ => "t.Id" }; return $"{col} {dir}"; } private sealed class QualityLineRestListRow { public string? ProdLine { get; set; } public string? LineDesc { get; set; } public int Line { get; set; } public string? RestTimePoint { get; set; } public int RestTime { get; set; } public long Id { get; set; } public string? Descr1 { get; set; } public string? EndDateTime { get; set; } public string? Remark { get; set; } public string? Domain { get; set; } public string? Site { get; set; } } private sealed class QualityLineRestDetailRow { public long Id { get; set; } public string? Domain { get; set; } public string? Site { get; set; } public string? ProdLine { get; set; } public string? WorkShift { get; set; } public int Line { get; set; } public string? RestTimePoint { get; set; } public int RestTime { get; set; } public string? Remark { get; set; } public string? Descr1 { get; set; } public string? Descr2 { get; set; } public short Period { get; set; } public string? EndDateTime { get; set; } } private sealed class LineWithDomainRow { public string? Value { get; set; } public string? Label { get; set; } public string? Extra { get; set; } } }