QualityLineWorkDetailService.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. namespace Admin.NET.Plugin.AiDOP.Production;
  2. /// <summary>
  3. /// 产线休息时间(QualityLineWorkDetail)
  4. /// 路由前缀:/api/Production/line-rest/...
  5. /// </summary>
  6. [ApiDescriptionSettings(Order = 268, Description = "产线休息时间")]
  7. [Route("api/Production")]
  8. [AllowAnonymous]
  9. [NonUnify]
  10. public class QualityLineWorkDetailService : IDynamicApiController, ITransient
  11. {
  12. private readonly ISqlSugarClient _db;
  13. private readonly UserManager _userManager;
  14. public QualityLineWorkDetailService(ISqlSugarClient db, UserManager userManager)
  15. {
  16. _db = db;
  17. _userManager = userManager;
  18. }
  19. [DisplayName("产线休息时间列表")]
  20. [HttpGet("line-rest/list")]
  21. public async Task<object> GetList([FromQuery] QualityLineRestListInput input)
  22. {
  23. var pars = new List<SugarParameter>();
  24. var where = "qd.IsActive = 1";
  25. if (!string.IsNullOrWhiteSpace(input.ProdLine))
  26. {
  27. where += " AND qd.ProdLine = @ProdLine";
  28. pars.Add(new SugarParameter("@ProdLine", input.ProdLine.Trim()));
  29. }
  30. var orderClause = ResolveOrder(input.OrderBy, input.Sort);
  31. var offset = (input.Page - 1) * input.PageSize;
  32. var baseSql = $"""
  33. SELECT
  34. qd.ProdLine AS ProdLine,
  35. lm.line_describe AS LineDesc,
  36. qd.Line AS Line,
  37. qd.RestTimePoint AS RestTimePoint,
  38. qd.RestTime AS RestTime,
  39. qd.RecID AS Id,
  40. qd.Descr1 AS Descr1,
  41. qd.EndDateTime AS EndDateTime,
  42. qd.Ufld1 AS Remark,
  43. qd.`Domain` AS Domain,
  44. qd.Site AS Site
  45. FROM QualityLineWorkDetail qd
  46. LEFT JOIN LineMaster lm
  47. ON qd.`Domain` COLLATE utf8mb4_general_ci = lm.`Domain` COLLATE utf8mb4_general_ci
  48. AND qd.ProdLine COLLATE utf8mb4_general_ci = lm.`Line` COLLATE utf8mb4_general_ci
  49. WHERE {where}
  50. """;
  51. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(*) FROM ({baseSql}) AS t", pars);
  52. var list = await _db.Ado.SqlQueryAsync<QualityLineRestListRow>(
  53. $"SELECT * FROM ({baseSql}) AS t ORDER BY {orderClause} LIMIT {input.PageSize} OFFSET {offset}", pars);
  54. return new { total, page = input.Page, pageSize = input.PageSize, list };
  55. }
  56. [DisplayName("产线休息时间详情")]
  57. [HttpGet("line-rest/{id:long}")]
  58. public async Task<object> GetDetail(long id)
  59. {
  60. var row = (await _db.Ado.SqlQueryAsync<QualityLineRestDetailRow>(
  61. """
  62. SELECT RecID AS Id, `Domain`, Site, ProdLine, WorkShift, Line, RestTimePoint, RestTime,
  63. Ufld1 AS Remark, Descr1, Descr2, Period, EndDateTime
  64. FROM QualityLineWorkDetail
  65. WHERE RecID = @Id
  66. """,
  67. new List<SugarParameter> { new("@Id", id) })).FirstOrDefault()
  68. ?? throw Oops.Oh("记录不存在");
  69. return row;
  70. }
  71. [DisplayName("保存产线休息时间")]
  72. [HttpPost("line-rest/save")]
  73. public async Task<object> Save([FromBody] QualityLineRestSaveInput input)
  74. {
  75. var account = Truncate8(_userManager.Account ?? "system");
  76. var now = DateTime.Now;
  77. var domain = Truncate(input.Domain.Trim(), 8);
  78. var site = Truncate((input.Site ?? input.Domain).Trim(), 8);
  79. var prodLine = Truncate(input.ProdLine.Trim(), 12);
  80. var restPoint = Truncate(input.RestTimePoint.Trim(), 30);
  81. var remark = string.IsNullOrWhiteSpace(input.Remark) ? null : Truncate(input.Remark.Trim(), 8);
  82. const string defaultWorkShift = "-";
  83. const string defaultEnd = "2999-12-31";
  84. if (input.Id is null or 0)
  85. {
  86. await _db.Ado.ExecuteCommandAsync(
  87. """
  88. INSERT INTO QualityLineWorkDetail (
  89. `Domain`, Site, ProdLine, WorkShift, Line, RestTimePoint, RestTime, Descr1, Descr2, Period, EndDateTime, Ufld1,
  90. IsActive, IsConfirm, BusinessID,
  91. CreateUser, CreateTime, UpdateUser, UpdateTime
  92. ) VALUES (
  93. @Domain, @Site, @ProdLine, @WorkShift, 0, @RestTimePoint, @RestTime, NULL, NULL, 0, @EndDateTime, @Ufld1,
  94. 1, 0, 0,
  95. @User, @Now, @User, @Now
  96. )
  97. """,
  98. new List<SugarParameter>
  99. {
  100. new("@Domain", domain),
  101. new("@Site", site),
  102. new("@ProdLine", prodLine),
  103. new("@WorkShift", defaultWorkShift),
  104. new("@RestTimePoint", restPoint),
  105. new("@RestTime", input.RestTime),
  106. new("@EndDateTime", defaultEnd),
  107. new("@Ufld1", (object?)remark ?? DBNull.Value),
  108. new("@User", account),
  109. new("@Now", now)
  110. });
  111. var newId = await _db.Ado.GetIntAsync("SELECT LAST_INSERT_ID()");
  112. return new { id = (long)newId, message = "新增成功" };
  113. }
  114. var n = await _db.Ado.ExecuteCommandAsync(
  115. """
  116. UPDATE QualityLineWorkDetail
  117. SET `Domain` = @Domain,
  118. Site = @Site,
  119. ProdLine = @ProdLine,
  120. RestTimePoint = @RestTimePoint,
  121. RestTime = @RestTime,
  122. Ufld1 = @Ufld1,
  123. UpdateUser = @User,
  124. UpdateTime = @Now
  125. WHERE RecID = @Id
  126. """,
  127. new List<SugarParameter>
  128. {
  129. new("@Id", input.Id!.Value),
  130. new("@Domain", domain),
  131. new("@Site", site),
  132. new("@ProdLine", prodLine),
  133. new("@RestTimePoint", restPoint),
  134. new("@RestTime", input.RestTime),
  135. new("@Ufld1", (object?)remark ?? DBNull.Value),
  136. new("@User", account),
  137. new("@Now", now)
  138. });
  139. if (n == 0)
  140. throw Oops.Oh("记录不存在或未变更");
  141. return new { id = input.Id, message = "保存成功" };
  142. }
  143. [DisplayName("删除产线休息时间")]
  144. [HttpPost("line-rest/delete/{id:long}")]
  145. public async Task<object> Delete(long id)
  146. {
  147. var n = await _db.Ado.ExecuteCommandAsync(
  148. "UPDATE QualityLineWorkDetail SET IsActive = 0, UpdateTime = @Now WHERE RecID = @Id",
  149. new List<SugarParameter> { new("@Id", id), new("@Now", DateTime.Now) });
  150. if (n == 0)
  151. throw Oops.Oh("记录不存在");
  152. return new { message = "已删除" };
  153. }
  154. [DisplayName("生产线列表(含 Domain)")]
  155. [HttpGet("line-rest/lines")]
  156. public async Task<object> GetLines([FromQuery] string? domain)
  157. {
  158. var pars = new List<SugarParameter>();
  159. var where = "IsActive = 1";
  160. if (!string.IsNullOrWhiteSpace(domain))
  161. {
  162. where += " AND `Domain` = @Domain";
  163. pars.Add(new SugarParameter("@Domain", domain.Trim()));
  164. }
  165. var rows = await _db.Ado.SqlQueryAsync<LineWithDomainRow>(
  166. $"""
  167. SELECT `Line` AS Value, `Line` AS Label, `Domain` AS Extra
  168. FROM LineMaster
  169. WHERE {where}
  170. ORDER BY `Domain`, `Line`
  171. """,
  172. pars);
  173. return new { list = rows };
  174. }
  175. private static string Truncate(string s, int maxLen) =>
  176. s.Length <= maxLen ? s : s[..maxLen];
  177. private static string Truncate8(string s) => Truncate(s, 8);
  178. private static string ResolveOrder(string? orderBy, string? sort)
  179. {
  180. var desc = string.Equals(sort?.Trim(), "desc", StringComparison.OrdinalIgnoreCase);
  181. var dir = desc ? "DESC" : "ASC";
  182. var key = orderBy?.Trim().ToLowerInvariant();
  183. var col = key switch
  184. {
  185. "prodline" => "t.ProdLine",
  186. "resttimepoint" => "t.RestTimePoint",
  187. "remark" => "t.Remark",
  188. _ => "t.Id"
  189. };
  190. return $"{col} {dir}";
  191. }
  192. private sealed class QualityLineRestListRow
  193. {
  194. public string? ProdLine { get; set; }
  195. public string? LineDesc { get; set; }
  196. public int Line { get; set; }
  197. public string? RestTimePoint { get; set; }
  198. public int RestTime { get; set; }
  199. public long Id { get; set; }
  200. public string? Descr1 { get; set; }
  201. public string? EndDateTime { get; set; }
  202. public string? Remark { get; set; }
  203. public string? Domain { get; set; }
  204. public string? Site { get; set; }
  205. }
  206. private sealed class QualityLineRestDetailRow
  207. {
  208. public long Id { get; set; }
  209. public string? Domain { get; set; }
  210. public string? Site { get; set; }
  211. public string? ProdLine { get; set; }
  212. public string? WorkShift { get; set; }
  213. public int Line { get; set; }
  214. public string? RestTimePoint { get; set; }
  215. public int RestTime { get; set; }
  216. public string? Remark { get; set; }
  217. public string? Descr1 { get; set; }
  218. public string? Descr2 { get; set; }
  219. public short Period { get; set; }
  220. public string? EndDateTime { get; set; }
  221. }
  222. private sealed class LineWithDomainRow
  223. {
  224. public string? Value { get; set; }
  225. public string? Label { get; set; }
  226. public string? Extra { get; set; }
  227. }
  228. }