QualityLineWorkDetailService.cs 9.9 KB

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