HolidayMasterService.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. namespace Admin.NET.Plugin.AiDOP.Production;
  2. /// <summary>
  3. /// 产线节假日(HolidayMaster)
  4. /// 路由前缀:/api/Production/holiday/...
  5. /// </summary>
  6. [ApiDescriptionSettings(Order = 269, Description = "产线节假日")]
  7. [Route("api/Production")]
  8. [AllowAnonymous]
  9. [NonUnify]
  10. public class HolidayMasterService : IDynamicApiController, ITransient
  11. {
  12. private readonly ISqlSugarClient _db;
  13. private readonly UserManager _userManager;
  14. public HolidayMasterService(ISqlSugarClient db, UserManager userManager)
  15. {
  16. _db = db;
  17. _userManager = userManager;
  18. }
  19. [DisplayName("产线节假日列表")]
  20. [HttpGet("holiday/list")]
  21. public async Task<object> GetList([FromQuery] HolidayMasterListInput input)
  22. {
  23. var tenantId = AidopTenantHelper.Resolve(App.HttpContext);
  24. var pars = new List<SugarParameter> { new("@TenantId", tenantId) };
  25. var where = "h.IsActive = 1 AND h.tenant_id = @TenantId";
  26. if (!string.IsNullOrWhiteSpace(input.HolidayType))
  27. {
  28. where += " AND h.Ufld1 = @Ufld1";
  29. pars.Add(new SugarParameter("@Ufld1", input.HolidayType.Trim()));
  30. }
  31. var orderClause = ResolveOrder(input.OrderBy, input.Sort);
  32. var offset = (input.Page - 1) * input.PageSize;
  33. var baseSql = $"""
  34. SELECT
  35. h.Dated AS Dated,
  36. h.Ufld1 AS Ufld1,
  37. h.Holiday AS Holiday,
  38. h.RecID AS Id,
  39. h.`Domain` AS Domain,
  40. h.Site AS Site
  41. FROM HolidayMaster h
  42. WHERE {where}
  43. """;
  44. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(*) FROM ({baseSql}) AS t", pars);
  45. var list = await _db.Ado.SqlQueryAsync<HolidayListRow>(
  46. $"SELECT * FROM ({baseSql}) AS t ORDER BY {orderClause} LIMIT {input.PageSize} OFFSET {offset}", pars);
  47. return new { total, page = input.Page, pageSize = input.PageSize, list };
  48. }
  49. [DisplayName("产线节假日详情")]
  50. [HttpGet("holiday/{id:long}")]
  51. public async Task<object> GetDetail(long id)
  52. {
  53. var tenantId = AidopTenantHelper.Resolve(App.HttpContext);
  54. var row = (await _db.Ado.SqlQueryAsync<HolidayDetailRow>(
  55. """
  56. SELECT RecID AS Id, Holiday, Dated, Ufld1, `Domain`, Site
  57. FROM HolidayMaster
  58. WHERE RecID = @Id AND tenant_id = @TenantId
  59. """,
  60. new List<SugarParameter> { new("@Id", id), new("@TenantId", tenantId) })).FirstOrDefault()
  61. ?? throw Oops.Oh("记录不存在");
  62. return row;
  63. }
  64. [DisplayName("保存产线节假日")]
  65. [HttpPost("holiday/save")]
  66. public async Task<object> Save([FromBody] HolidayMasterSaveInput input)
  67. {
  68. var tenantId = AidopTenantHelper.Resolve(App.HttpContext);
  69. var account = Truncate8(_userManager.Account ?? "system");
  70. var now = DateTime.Now;
  71. var holiday = Truncate(input.Holiday.Trim(), 8);
  72. var ufld1 = Truncate(input.Ufld1.Trim(), 8);
  73. var domain = Truncate(input.Domain.Trim(), 8);
  74. var site = Truncate(input.Site.Trim(), 4);
  75. var dated = input.Dated ?? throw Oops.Oh("日期不能为空");
  76. // 同一日期重复校验(编辑时排除自身)
  77. var dupWhere = "DATE(Dated) = DATE(@Dated) AND IsActive = 1 AND tenant_id = @TenantId";
  78. var dupPars = new List<SugarParameter>
  79. {
  80. new("@Dated", dated),
  81. new("@TenantId", tenantId)
  82. };
  83. if (input.Id is not null and not 0)
  84. {
  85. dupWhere += " AND RecID <> @ExcludeId";
  86. dupPars.Add(new SugarParameter("@ExcludeId", input.Id.Value));
  87. }
  88. var dupCount = await _db.Ado.GetIntAsync(
  89. $"SELECT COUNT(*) FROM HolidayMaster WHERE {dupWhere}", dupPars);
  90. if (dupCount > 0)
  91. throw Oops.Oh("该日期已配置节假日");
  92. if (input.Id is null or 0)
  93. {
  94. await _db.Ado.ExecuteCommandAsync(
  95. """
  96. INSERT INTO HolidayMaster (
  97. Holiday, Dated, Ufld1, `Domain`, Site,
  98. BusinessID, IsActive, IsConfirm, IsChanged,
  99. CreateUser, CreateTime, UpdateUser, UpdateTime, tenant_id
  100. ) VALUES (
  101. @Holiday, @Dated, @Ufld1, @Domain, @Site,
  102. 0, 1, 0, 0,
  103. @User, @Now, @User, @Now, @TenantId
  104. )
  105. """,
  106. new List<SugarParameter>
  107. {
  108. new("@Holiday", holiday),
  109. new("@Dated", dated),
  110. new("@Ufld1", ufld1),
  111. new("@Domain", domain),
  112. new("@Site", site),
  113. new("@User", account),
  114. new("@Now", now),
  115. new("@TenantId", tenantId)
  116. });
  117. var newId = await _db.Ado.GetIntAsync("SELECT LAST_INSERT_ID()");
  118. return new { id = (long)newId, message = "新增成功" };
  119. }
  120. var n = await _db.Ado.ExecuteCommandAsync(
  121. """
  122. UPDATE HolidayMaster
  123. SET Holiday = @Holiday,
  124. Dated = @Dated,
  125. Ufld1 = @Ufld1,
  126. `Domain` = @Domain,
  127. Site = @Site,
  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("@Holiday", holiday),
  136. new("@Dated", dated),
  137. new("@Ufld1", ufld1),
  138. new("@Domain", domain),
  139. new("@Site", site),
  140. new("@User", account),
  141. new("@Now", now),
  142. new("@TenantId", tenantId)
  143. });
  144. if (n == 0)
  145. throw Oops.Oh("记录不存在或未变更");
  146. return new { id = input.Id, message = "保存成功" };
  147. }
  148. [DisplayName("删除产线节假日")]
  149. [HttpPost("holiday/delete/{id:long}")]
  150. public async Task<object> Delete(long id)
  151. {
  152. var tenantId = AidopTenantHelper.Resolve(App.HttpContext);
  153. var n = await _db.Ado.ExecuteCommandAsync(
  154. "UPDATE HolidayMaster SET IsActive = 0, UpdateTime = @Now WHERE RecID = @Id AND tenant_id = @TenantId",
  155. new List<SugarParameter> { new("@Id", id), new("@Now", DateTime.Now), new("@TenantId", tenantId) });
  156. if (n == 0)
  157. throw Oops.Oh("记录不存在");
  158. return new { message = "已删除" };
  159. }
  160. private static string Truncate(string s, int maxLen) =>
  161. s.Length <= maxLen ? s : s[..maxLen];
  162. private static string Truncate8(string s) => Truncate(s, 8);
  163. private static string ResolveOrder(string? orderBy, string? sort)
  164. {
  165. var desc = string.Equals(sort?.Trim(), "desc", StringComparison.OrdinalIgnoreCase);
  166. var dir = desc ? "DESC" : "ASC";
  167. var key = orderBy?.Trim().ToLowerInvariant();
  168. var col = key switch
  169. {
  170. "holiday" => "t.Holiday",
  171. "dated" => "t.Dated",
  172. "ufld1" => "t.Ufld1",
  173. _ => "t.Dated"
  174. };
  175. return $"{col} {dir}, t.Id";
  176. }
  177. private sealed class HolidayListRow
  178. {
  179. public DateTime? Dated { get; set; }
  180. public string? Ufld1 { get; set; }
  181. public string? Holiday { get; set; }
  182. public long Id { get; set; }
  183. public string? Domain { get; set; }
  184. public string? Site { get; set; }
  185. }
  186. private sealed class HolidayDetailRow
  187. {
  188. public long Id { get; set; }
  189. public string? Holiday { get; set; }
  190. public DateTime? Dated { get; set; }
  191. public string? Ufld1 { get; set; }
  192. public string? Domain { get; set; }
  193. public string? Site { get; set; }
  194. }
  195. }