AdoS0MfgRoutingOpDetailsController.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using Admin.NET.Plugin.AiDOP.Dto.S0.Manufacturing;
  2. using Admin.NET.Plugin.AiDOP.Dto.S0.Sales;
  3. using Admin.NET.Plugin.AiDOP.Entity.S0.Manufacturing;
  4. using Admin.NET.Plugin.AiDOP.Infrastructure;
  5. namespace Admin.NET.Plugin.AiDOP.Controllers.S0.Manufacturing;
  6. [ApiController]
  7. [Route("api/s0/manufacturing/routing-op-details")]
  8. [AllowAnonymous]
  9. [NonUnify]
  10. public class AdoS0MfgRoutingOpDetailsController : ControllerBase
  11. {
  12. private readonly SqlSugarRepository<AdoS0MfgRoutingOpDetail> _rep;
  13. private readonly AdoS0ReferenceChecker _refChecker;
  14. public AdoS0MfgRoutingOpDetailsController(SqlSugarRepository<AdoS0MfgRoutingOpDetail> rep, AdoS0ReferenceChecker refChecker)
  15. {
  16. _rep = rep;
  17. _refChecker = refChecker;
  18. }
  19. [HttpGet]
  20. public async Task<IActionResult> GetPagedAsync([FromQuery] AdoS0MfgRoutingOpDetailQueryDto q)
  21. {
  22. var page = q.EffectivePage;
  23. var pageSize = q.PageSize;
  24. (page, pageSize) = PagingGuard.Normalize(page, pageSize);
  25. var query = _rep.AsQueryable()
  26. .WhereIF(q.CompanyRefId.HasValue, x => x.CompanyRefId == q.CompanyRefId!.Value)
  27. .WhereIF(q.FactoryRefId.HasValue, x => x.FactoryRefId == q.FactoryRefId!.Value)
  28. .WhereIF(!string.IsNullOrWhiteSpace(q.Keyword), x =>
  29. x.RouteCode.Contains(q.Keyword!) ||
  30. x.RouteName.Contains(q.Keyword!) ||
  31. x.MaterialCode.Contains(q.Keyword!) ||
  32. x.OperationCode.Contains(q.Keyword!) ||
  33. x.OperationDescription.Contains(q.Keyword!) ||
  34. x.WorkCenterCode.Contains(q.Keyword!))
  35. .WhereIF(q.IsEnabled.HasValue, x => x.IsEnabled == q.IsEnabled!.Value);
  36. var total = await query.CountAsync();
  37. var list = await query.OrderBy(x => x.RouteCode).OrderBy(x => x.SortNo).OrderBy(x => x.Id)
  38. .Skip((page - 1) * pageSize).Take(pageSize).ToListAsync();
  39. return Ok(new { total, page, pageSize, list });
  40. }
  41. [HttpGet("{id:long}")]
  42. public async Task<IActionResult> GetAsync(long id)
  43. {
  44. var item = await _rep.GetByIdAsync(id);
  45. return item == null ? NotFound() : Ok(item);
  46. }
  47. [HttpPost]
  48. public async Task<IActionResult> CreateAsync([FromBody] AdoS0MfgRoutingOpDetailUpsertDto dto)
  49. {
  50. var err = ValidateUpsert(dto);
  51. if (err != null) return BadRequest(new { message = err });
  52. if (!await _refChecker.MaterialExistsAsync(dto.MaterialCode))
  53. return AdoS0ApiErrors.InvalidReference(AdoS0ErrorCodes.ReferenceNotFound,
  54. $"物料编码 '{dto.MaterialCode}' 不存在于物料主数据");
  55. if (!await _refChecker.WorkCenterExistsAsync(dto.WorkCenterCode))
  56. return AdoS0ApiErrors.InvalidReference(AdoS0ErrorCodes.ReferenceNotFound,
  57. $"工作中心编码 '{dto.WorkCenterCode}' 不存在于工作中心主数据");
  58. var entity = MapToEntity(dto);
  59. entity.CreatedAt = DateTime.Now;
  60. await _rep.AsInsertable(entity).ExecuteReturnEntityAsync();
  61. return Ok(entity);
  62. }
  63. [HttpPut("{id:long}")]
  64. public async Task<IActionResult> UpdateAsync(long id, [FromBody] AdoS0MfgRoutingOpDetailUpsertDto dto)
  65. {
  66. var err = ValidateUpsert(dto);
  67. if (err != null) return BadRequest(new { message = err });
  68. if (!await _refChecker.MaterialExistsAsync(dto.MaterialCode))
  69. return AdoS0ApiErrors.InvalidReference(AdoS0ErrorCodes.ReferenceNotFound,
  70. $"物料编码 '{dto.MaterialCode}' 不存在于物料主数据");
  71. if (!await _refChecker.WorkCenterExistsAsync(dto.WorkCenterCode))
  72. return AdoS0ApiErrors.InvalidReference(AdoS0ErrorCodes.ReferenceNotFound,
  73. $"工作中心编码 '{dto.WorkCenterCode}' 不存在于工作中心主数据");
  74. var entity = await _rep.GetByIdAsync(id);
  75. if (entity == null) return NotFound();
  76. ApplyUpsert(entity, dto);
  77. entity.UpdatedAt = DateTime.Now;
  78. await _rep.AsUpdateable(entity).ExecuteCommandAsync();
  79. return Ok(entity);
  80. }
  81. [HttpPatch("{id:long}/toggle-enabled")]
  82. public async Task<IActionResult> ToggleEnabledAsync(long id, [FromBody] AdoS0ToggleEnabledDto dto)
  83. {
  84. var entity = await _rep.GetByIdAsync(id);
  85. if (entity == null) return NotFound();
  86. entity.IsEnabled = dto.IsEnabled;
  87. entity.UpdatedAt = DateTime.Now;
  88. await _rep.AsUpdateable(entity).ExecuteCommandAsync();
  89. return Ok(entity);
  90. }
  91. [HttpDelete("{id:long}")]
  92. public async Task<IActionResult> DeleteAsync(long id)
  93. {
  94. var item = await _rep.GetByIdAsync(id);
  95. if (item == null) return NotFound();
  96. await _rep.DeleteAsync(item);
  97. return Ok(new { message = "删除成功" });
  98. }
  99. private static string? ValidateUpsert(AdoS0MfgRoutingOpDetailUpsertDto dto)
  100. {
  101. if (string.IsNullOrWhiteSpace(dto.RouteCode)) return "工艺路线编码不能为空";
  102. if (string.IsNullOrWhiteSpace(dto.RouteName)) return "工艺路线名称不能为空";
  103. if (string.IsNullOrWhiteSpace(dto.MaterialCode)) return "物料编码不能为空";
  104. if (string.IsNullOrWhiteSpace(dto.OperationCode)) return "工序编码不能为空";
  105. return null;
  106. }
  107. private static AdoS0MfgRoutingOpDetail MapToEntity(AdoS0MfgRoutingOpDetailUpsertDto dto)
  108. {
  109. var e = new AdoS0MfgRoutingOpDetail();
  110. ApplyUpsert(e, dto);
  111. return e;
  112. }
  113. private static void ApplyUpsert(AdoS0MfgRoutingOpDetail e, AdoS0MfgRoutingOpDetailUpsertDto dto)
  114. {
  115. e.CompanyRefId = dto.CompanyRefId;
  116. e.FactoryRefId = dto.FactoryRefId;
  117. e.RouteCode = dto.RouteCode.Trim();
  118. e.RouteName = dto.RouteName.Trim();
  119. e.MaterialCode = dto.MaterialCode.Trim();
  120. e.OperationCode = dto.OperationCode.Trim();
  121. e.OperationDescription = (dto.OperationDescription ?? string.Empty).Trim();
  122. e.WorkCenterCode = (dto.WorkCenterCode ?? string.Empty).Trim();
  123. e.MilestoneOperation = string.IsNullOrWhiteSpace(dto.MilestoneOperation) ? null : dto.MilestoneOperation.Trim();
  124. e.Ufld1 = dto.Ufld1;
  125. e.Ufld2 = dto.Ufld2;
  126. e.UDeci1 = dto.UDeci1;
  127. e.Ufld3 = dto.Ufld3;
  128. e.Ufld4 = dto.Ufld4;
  129. e.Ufld5 = dto.Ufld5;
  130. e.UDeci2 = dto.UDeci2;
  131. e.Ufld6 = dto.Ufld6;
  132. e.Ufld7 = dto.Ufld7;
  133. e.Ufld8 = dto.Ufld8;
  134. e.UDeci3 = dto.UDeci3;
  135. e.Ufld9 = dto.Ufld9;
  136. e.UDeci4 = dto.UDeci4;
  137. e.UDeci5 = dto.UDeci5;
  138. e.SupplierCode = string.IsNullOrWhiteSpace(dto.SupplierCode) ? null : dto.SupplierCode.Trim();
  139. e.OutsourcedLeadTime = dto.OutsourcedLeadTime;
  140. e.SortNo = dto.SortNo;
  141. e.IsEnabled = dto.IsEnabled;
  142. e.IsConfirm = dto.IsConfirm;
  143. e.CommentIndex = dto.CommentIndex;
  144. e.CreateUser = dto.CreateUser;
  145. e.UpdateUser = dto.UpdateUser;
  146. }
  147. }