WorkOrderProgressDashboardService.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. namespace Admin.NET.Plugin.AiDOP.Production;
  2. /// <summary>
  3. /// 工单执行进度看板(列表)📊
  4. /// 路由前缀:<c>/api/Production/work-order-progress/...</c>
  5. /// </summary>
  6. [ApiDescriptionSettings(Order = 266, Description = "工单执行进度看板")]
  7. [Route("api/Production")]
  8. [AllowAnonymous]
  9. [NonUnify]
  10. public class WorkOrderProgressDashboardService : IDynamicApiController, ITransient
  11. {
  12. private readonly ISqlSugarClient _db;
  13. private readonly UserManager _userManager;
  14. public WorkOrderProgressDashboardService(ISqlSugarClient db, UserManager userManager)
  15. {
  16. _db = db;
  17. _userManager = userManager;
  18. }
  19. /// <summary>工单执行进度看板分页列表</summary>
  20. [DisplayName("工单执行进度看板列表")]
  21. [HttpGet("work-order-progress/list")]
  22. public async Task<object> GetList([FromQuery] WorkOrderProgressDashboardListInput input)
  23. {
  24. const string C = "utf8mb4_general_ci";
  25. var tenantId = _userManager.TenantId;
  26. var pars = new List<SugarParameter> { new("@TenantId", tenantId) };
  27. var innerWhere = new List<string>
  28. {
  29. "IFNULL(wm.Status,'') <> ''",
  30. "wm.tenant_id = @TenantId"
  31. };
  32. if (!string.IsNullOrWhiteSpace(input.WorkOrd))
  33. {
  34. innerWhere.Add($"(wm.WorkOrd COLLATE {C}) LIKE @WorkOrd");
  35. pars.Add(new SugarParameter("@WorkOrd", $"%{input.WorkOrd.Trim()}%"));
  36. }
  37. if (!string.IsNullOrWhiteSpace(input.ItemNum))
  38. {
  39. innerWhere.Add($"(wm.ItemNum COLLATE {C}) = @ItemNum");
  40. pars.Add(new SugarParameter("@ItemNum", input.ItemNum.Trim()));
  41. }
  42. if (!string.IsNullOrWhiteSpace(input.OrdDateFrom))
  43. {
  44. innerWhere.Add("DATE(wm.OrdDate) >= @OrdDateFrom");
  45. pars.Add(new SugarParameter("@OrdDateFrom", input.OrdDateFrom.Trim()));
  46. }
  47. var baseSql = BuildListBaseSql(string.Join(" AND ", innerWhere), C);
  48. var offset = (input.Page - 1) * input.PageSize;
  49. var total = await _db.Ado.GetIntAsync(
  50. $"SELECT COUNT(*) FROM ({baseSql}) AS t", pars);
  51. var list = await _db.Ado.SqlQueryAsync<WorkOrderProgressDashboardListRow>(
  52. $"SELECT * FROM ({baseSql}) AS t ORDER BY t.OrdDate DESC, t.Id DESC LIMIT {input.PageSize} OFFSET {offset}",
  53. pars);
  54. return new { total, page = input.Page, pageSize = input.PageSize, list };
  55. }
  56. private static string BuildListBaseSql(string innerWhere, string C) => $"""
  57. SELECT
  58. wm.RecID AS Id,
  59. wm.WorkOrd AS WorkOrd,
  60. wm.Typed AS Typed,
  61. defaultLine.Workshop AS Workshop,
  62. wm.OrdDate AS OrdDate,
  63. wm.DueDate AS DueDate,
  64. wm.ItemNum AS ItemNum,
  65. im.Descr AS Descr,
  66. im.Descr1 AS Descr1,
  67. IFNULL(wm.QtyOrded, 0) AS QtyOrded,
  68. IFNULL(wm.QtyCompleted, 0) AS QtyCompleted,
  69. IFNULL(wm.QtyOrded, 0) - IFNULL(wm.QtyCompleted, 0) AS NoCompleted,
  70. mo.MaterialSituation AS MaterialSituation,
  71. LOWER(wm.Status) AS Status,
  72. CASE
  73. WHEN IFNULL(wm.QtyOrded, 0) = 0 THEN 0
  74. ELSE ROUND(100.0 * IFNULL(wm.QtyCompleted, 0) / wm.QtyOrded, 4)
  75. END AS Progress
  76. FROM WorkOrdMaster wm
  77. LEFT JOIN ItemMaster im
  78. ON wm.ItemNum COLLATE {C} = im.ItemNum COLLATE {C}
  79. AND wm.`Domain` COLLATE {C} = im.`Domain` COLLATE {C}
  80. LEFT JOIN mes_morder mo
  81. ON wm.WorkOrd COLLATE {C} = mo.morder_no COLLATE {C}
  82. AND wm.`Domain` COLLATE {C} = mo.factory_id COLLATE {C}
  83. LEFT JOIN LATERAL (
  84. SELECT psd0.`Line` AS `Line`
  85. FROM PeriodSequenceDet psd0
  86. WHERE psd0.ItemNum COLLATE {C} = wm.ItemNum COLLATE {C}
  87. AND psd0.`Domain` COLLATE {C} = wm.`Domain` COLLATE {C}
  88. LIMIT 1
  89. ) AS psd ON TRUE
  90. LEFT JOIN LATERAL (
  91. SELECT lm.Workshop AS Workshop
  92. FROM LineMaster lm
  93. WHERE lm.`Line` COLLATE {C} = psd.`Line` COLLATE {C}
  94. AND lm.`Domain` COLLATE {C} = wm.`Domain` COLLATE {C}
  95. LIMIT 1
  96. ) AS defaultLine ON TRUE
  97. WHERE {innerWhere}
  98. """;
  99. }