using System.Text.Json; using Admin.NET.Plugin.AiDOP.Dto.S0.Sales; using Admin.NET.Plugin.AiDOP.Entity.S0.Sales; using Admin.NET.Plugin.AiDOP.Infrastructure; using Yitter.IdGenerator; namespace Admin.NET.Plugin.AiDOP.Controllers.S0.Sales; /// /// S0 工单齐套检查排除规则(一个租户一条配置) /// [ApiController] [Route("api/s0/sales/kitting-exclude-rule")] [AllowAnonymous] [NonUnify] public class AdoS0KittingExcludeRuleController : ControllerBase { private readonly SqlSugarRepository _rep; public AdoS0KittingExcludeRuleController(SqlSugarRepository rep) => _rep = rep; /// 获取当前租户的齐套检查排除规则 [HttpGet] public async Task GetAsync() { if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var error)) return error!; var entity = await _rep.GetFirstAsync(x => x.TenantId == tenantId); if (entity == null) { return Ok(new AdoS0KittingExcludeRuleDto { Id = 0, IsActive = true, ExcludedItemTypes = Array.Empty(), ExcludedOwnerApps = Array.Empty(), }); } return Ok(ToDto(entity)); } /// 获取当前物料类型和物料属性的可选项(从 ItemMaster 去重) [HttpGet("options")] public async Task GetOptionsAsync() { if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var error)) return error!; var itemTypes = await _rep.AsQueryable() .InnerJoin((r, im) => im.TenantId == tenantId) .Where((r, im) => im.ItemType != null && im.ItemType != "") .Select((r, im) => im.ItemType) .Distinct() .ToListAsync(); var ownerApps = await _rep.AsQueryable() .InnerJoin((r, im) => im.TenantId == tenantId) .Where((r, im) => im.OwnerApplication != null && im.OwnerApplication != "") .Select((r, im) => im.OwnerApplication) .Distinct() .ToListAsync(); return Ok(new { itemTypes, ownerApps }); } /// 保存/更新当前租户的齐套检查排除规则 [HttpPost] public async Task UpsertAsync([FromBody] AdoS0KittingExcludeRuleUpsertDto dto) { if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var error)) return error!; var entity = await _rep.GetFirstAsync(x => x.TenantId == tenantId); var now = DateTime.Now; var jsonTypes = JsonSerializer.Serialize(dto.ExcludedItemTypes ?? Array.Empty()); var jsonApps = JsonSerializer.Serialize(dto.ExcludedOwnerApps ?? Array.Empty()); if (entity == null) { entity = new AdoS0KittingExcludeRule { Id = YitIdHelper.NextId(), TenantId = tenantId, ExcludedItemTypes = jsonTypes, ExcludedOwnerApps = jsonApps, IsActive = dto.IsActive, Remark = dto.Remark, CreateTime = now, UpdateTime = null, }; await _rep.AsInsertable(entity).ExecuteReturnEntityAsync(); } else { entity.ExcludedItemTypes = jsonTypes; entity.ExcludedOwnerApps = jsonApps; entity.IsActive = dto.IsActive; entity.Remark = dto.Remark; entity.UpdateTime = now; await _rep.AsUpdateable(entity).ExecuteCommandAsync(); } return Ok(ToDto(entity)); } private static AdoS0KittingExcludeRuleDto ToDto(AdoS0KittingExcludeRule entity) { return new AdoS0KittingExcludeRuleDto { Id = entity.Id, IsActive = entity.IsActive, ExcludedItemTypes = ParseJsonArray(entity.ExcludedItemTypes), ExcludedOwnerApps = ParseJsonArray(entity.ExcludedOwnerApps), Remark = entity.Remark, UpdateTime = entity.UpdateTime, }; } private static string[] ParseJsonArray(string? json) { if (string.IsNullOrWhiteSpace(json)) return Array.Empty(); try { return JsonSerializer.Deserialize(json) ?? Array.Empty(); } catch { return Array.Empty(); } } }