AdoS0MfgPreprocessElementsController.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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.Entity.S0.Sales;
  5. using Admin.NET.Plugin.AiDOP.Infrastructure;
  6. namespace Admin.NET.Plugin.AiDOP.Controllers.S0.Manufacturing;
  7. [ApiController]
  8. [Route("api/s0/manufacturing/preprocess-elements")]
  9. [AllowAnonymous]
  10. [NonUnify]
  11. public class AdoS0MfgPreprocessElementsController : ControllerBase
  12. {
  13. private readonly SqlSugarRepository<AdoS0MfgPreprocessElement> _headRep;
  14. private readonly SqlSugarRepository<AdoS0MfgPreprocessElementParam> _paramRep;
  15. private readonly SqlSugarRepository<AdoS0Material> _materialRep;
  16. private readonly SqlSugarRepository<AdoS0MfgElementParam> _elementParamRep;
  17. public AdoS0MfgPreprocessElementsController(
  18. SqlSugarRepository<AdoS0MfgPreprocessElement> headRep,
  19. SqlSugarRepository<AdoS0MfgPreprocessElementParam> paramRep,
  20. SqlSugarRepository<AdoS0Material> materialRep,
  21. SqlSugarRepository<AdoS0MfgElementParam> elementParamRep)
  22. {
  23. _headRep = headRep;
  24. _paramRep = paramRep;
  25. _materialRep = materialRep;
  26. _elementParamRep = elementParamRep;
  27. }
  28. [HttpGet]
  29. public async Task<IActionResult> GetPagedAsync([FromQuery] AdoS0MfgPreprocessElementQueryDto q)
  30. {
  31. var page = q.EffectivePage;
  32. var pageSize = q.PageSize;
  33. (page, pageSize) = PagingGuard.Normalize(page, pageSize);
  34. List<long>? materialFilterIds = null;
  35. if (!string.IsNullOrWhiteSpace(q.MaterialCode) || !string.IsNullOrWhiteSpace(q.MaterialName))
  36. {
  37. var mq = _headRep.Context.Queryable<AdoS0Material>()
  38. .WhereIF(q.CompanyRefId.HasValue, m => m.CompanyRefId == q.CompanyRefId!.Value)
  39. .WhereIF(q.FactoryRefId.HasValue, m => m.FactoryRefId == q.FactoryRefId!.Value)
  40. .WhereIF(!string.IsNullOrWhiteSpace(q.MaterialCode), m => m.Code.Contains(q.MaterialCode!))
  41. .WhereIF(!string.IsNullOrWhiteSpace(q.MaterialName), m => m.Name.Contains(q.MaterialName!))
  42. .Select(m => m.Id);
  43. materialFilterIds = await mq.ToListAsync();
  44. if (materialFilterIds.Count == 0)
  45. return Ok(new { total = 0, page, pageSize, list = Array.Empty<AdoS0MfgPreprocessElement>() });
  46. }
  47. var query = _headRep.AsQueryable()
  48. .WhereIF(q.CompanyRefId.HasValue, x => x.CompanyRefId == q.CompanyRefId!.Value)
  49. .WhereIF(q.FactoryRefId.HasValue, x => x.FactoryRefId == q.FactoryRefId!.Value)
  50. .WhereIF(materialFilterIds != null, x => x.MaterialId != null && materialFilterIds!.Contains(x.MaterialId.Value))
  51. .WhereIF(!string.IsNullOrWhiteSpace(q.Keyword),
  52. x => x.Code.Contains(q.Keyword!) || x.Name.Contains(q.Keyword!))
  53. .WhereIF(!string.IsNullOrWhiteSpace(q.ElementCode), x => x.Code.Contains(q.ElementCode!))
  54. .WhereIF(q.IsEnabled.HasValue, x => x.IsEnabled == q.IsEnabled!.Value);
  55. var total = await query.CountAsync();
  56. var list = await query.OrderByDescending(x => x.CreatedAt).Skip((page - 1) * pageSize).Take(pageSize).ToListAsync();
  57. return Ok(new { total, page, pageSize, list });
  58. }
  59. [HttpGet("{id:long}")]
  60. public async Task<IActionResult> GetDetailAsync(long id)
  61. {
  62. var header = await _headRep.GetByIdAsync(id);
  63. if (header == null) return NotFound();
  64. var @params = await _paramRep.AsQueryable()
  65. .Where(x => x.PreprocessElementId == id)
  66. .OrderBy(x => x.SortNo)
  67. .ToListAsync();
  68. return Ok(new { header, @params });
  69. }
  70. [HttpPost]
  71. public async Task<IActionResult> CreateAsync([FromBody] AdoS0MfgPreprocessElementUpsertDto dto)
  72. {
  73. var fkErr = await ValidatePreprocessFksAsync(dto);
  74. if (fkErr != null) return BadRequest(new { message = fkErr });
  75. var db = _headRep.Context;
  76. await db.Ado.BeginTranAsync();
  77. try
  78. {
  79. var head = new AdoS0MfgPreprocessElement
  80. {
  81. CompanyRefId = dto.CompanyRefId,
  82. FactoryRefId = dto.FactoryRefId,
  83. Code = dto.Code,
  84. Name = dto.Name,
  85. MaterialId = dto.MaterialId,
  86. OperationId = dto.OperationId,
  87. IsKeyElement = dto.IsKeyElement,
  88. Remark = dto.Remark,
  89. IsEnabled = dto.IsEnabled,
  90. CreatedAt = DateTime.Now
  91. };
  92. head = await _headRep.AsInsertable(head).ExecuteReturnEntityAsync();
  93. foreach (var p in dto.Params)
  94. {
  95. var row = MapParam(head.Id, dto.CompanyRefId, dto.FactoryRefId, p);
  96. await _paramRep.AsInsertable(row).ExecuteCommandAsync();
  97. }
  98. await db.Ado.CommitTranAsync();
  99. return await GetDetailAsync(head.Id);
  100. }
  101. catch
  102. {
  103. await db.Ado.RollbackTranAsync();
  104. throw;
  105. }
  106. }
  107. [HttpPut("{id:long}")]
  108. public async Task<IActionResult> UpdateAsync(long id, [FromBody] AdoS0MfgPreprocessElementUpsertDto dto)
  109. {
  110. var header = await _headRep.GetByIdAsync(id);
  111. if (header == null) return NotFound();
  112. var fkErr = await ValidatePreprocessFksAsync(dto);
  113. if (fkErr != null) return BadRequest(new { message = fkErr });
  114. var db = _headRep.Context;
  115. await db.Ado.BeginTranAsync();
  116. try
  117. {
  118. header.CompanyRefId = dto.CompanyRefId;
  119. header.FactoryRefId = dto.FactoryRefId;
  120. header.Code = dto.Code;
  121. header.Name = dto.Name;
  122. header.MaterialId = dto.MaterialId;
  123. header.OperationId = dto.OperationId;
  124. header.IsKeyElement = dto.IsKeyElement;
  125. header.Remark = dto.Remark;
  126. header.IsEnabled = dto.IsEnabled;
  127. header.UpdatedAt = DateTime.Now;
  128. await _headRep.AsUpdateable(header).ExecuteCommandAsync();
  129. await _paramRep.AsDeleteable().Where(x => x.PreprocessElementId == id).ExecuteCommandAsync();
  130. foreach (var p in dto.Params)
  131. {
  132. var row = MapParam(id, dto.CompanyRefId, dto.FactoryRefId, p);
  133. await _paramRep.AsInsertable(row).ExecuteCommandAsync();
  134. }
  135. await db.Ado.CommitTranAsync();
  136. return await GetDetailAsync(id);
  137. }
  138. catch
  139. {
  140. await db.Ado.RollbackTranAsync();
  141. throw;
  142. }
  143. }
  144. [HttpPatch("{id:long}/toggle-enabled")]
  145. public async Task<IActionResult> ToggleEnabledAsync(long id, [FromBody] AdoS0ToggleEnabledDto dto)
  146. {
  147. var entity = await _headRep.GetByIdAsync(id);
  148. if (entity == null) return NotFound();
  149. entity.IsEnabled = dto.IsEnabled;
  150. entity.UpdatedAt = DateTime.Now;
  151. await _headRep.AsUpdateable(entity).ExecuteCommandAsync();
  152. return Ok(entity);
  153. }
  154. [HttpDelete("{id:long}")]
  155. public async Task<IActionResult> DeleteAsync(long id)
  156. {
  157. var header = await _headRep.GetByIdAsync(id);
  158. if (header == null) return NotFound();
  159. var db = _headRep.Context;
  160. await db.Ado.BeginTranAsync();
  161. try
  162. {
  163. await _paramRep.AsDeleteable().Where(x => x.PreprocessElementId == id).ExecuteCommandAsync();
  164. await _headRep.DeleteAsync(header);
  165. await db.Ado.CommitTranAsync();
  166. return Ok(new { message = "删除成功" });
  167. }
  168. catch
  169. {
  170. await db.Ado.RollbackTranAsync();
  171. throw;
  172. }
  173. }
  174. private async Task<string?> ValidatePreprocessFksAsync(AdoS0MfgPreprocessElementUpsertDto dto)
  175. {
  176. if (dto.MaterialId.HasValue)
  177. {
  178. var ok = await _materialRep.IsAnyAsync(m =>
  179. m.Id == dto.MaterialId!.Value && m.CompanyRefId == dto.CompanyRefId && m.FactoryRefId == dto.FactoryRefId);
  180. if (!ok) return "物料主数据引用无效";
  181. }
  182. if (dto.Params == null || dto.Params.Count == 0)
  183. return null;
  184. var epIds = dto.Params.Select(p => p.ElementParamId).Distinct().ToList();
  185. var cnt = await _elementParamRep.AsQueryable()
  186. .Where(e => epIds.Contains(e.Id) && e.CompanyRefId == dto.CompanyRefId && e.FactoryRefId == dto.FactoryRefId)
  187. .CountAsync();
  188. return cnt == epIds.Count ? null : "存在无效的生产要素参数引用";
  189. }
  190. private static AdoS0MfgPreprocessElementParam MapParam(long preprocessElementId, long companyRefId, long factoryRefId, AdoS0MfgPreprocessElementParamLineUpsertDto p)
  191. {
  192. return new AdoS0MfgPreprocessElementParam
  193. {
  194. CompanyRefId = companyRefId,
  195. FactoryRefId = factoryRefId,
  196. PreprocessElementId = preprocessElementId,
  197. ElementParamId = p.ElementParamId,
  198. ParamValue = p.ParamValue,
  199. SortNo = p.SortNo,
  200. Remark = p.Remark,
  201. IsEnabled = p.IsEnabled,
  202. CreatedAt = DateTime.Now
  203. };
  204. }
  205. }