using Admin.NET.Plugin.AiDOP.Dto.S0.Warehouse; using Admin.NET.Plugin.AiDOP.Entity.S0.Warehouse; using Admin.NET.Plugin.AiDOP.Infrastructure; namespace Admin.NET.Plugin.AiDOP.Controllers.S0.Warehouse; /// /// S0 物料职责维护(EmpWorkDutyMaster 语义) /// [ApiController] [Route("api/s0/warehouse/emp-work-duties")] [AllowAnonymous] [NonUnify] public class AdoS0EmpWorkDutiesController : ControllerBase { private readonly SqlSugarRepository _rep; private readonly SqlSugarRepository _empRep; private readonly SqlSugarRepository _locRep; public AdoS0EmpWorkDutiesController( SqlSugarRepository rep, SqlSugarRepository empRep, SqlSugarRepository locRep) { _rep = rep; _empRep = empRep; _locRep = locRep; } [HttpGet] public async Task GetPagedAsync([FromQuery] AdoS0EmpWorkDutyQueryDto q) { (q.Page, q.PageSize) = PagingGuard.Normalize(q.Page, q.PageSize); var query = _rep.AsQueryable() .WhereIF(q.CompanyRefId.HasValue, x => x.CompanyRefId == q.CompanyRefId!.Value) .WhereIF(q.FactoryRefId.HasValue, x => x.FactoryRefId == q.FactoryRefId!.Value) .WhereIF(!string.IsNullOrWhiteSpace(q.DomainCode), x => x.DomainCode == q.DomainCode) .WhereIF(!string.IsNullOrWhiteSpace(q.Employee), x => x.Employee.Contains(q.Employee!)) .WhereIF(!string.IsNullOrWhiteSpace(q.Location), x => x.Location == q.Location) .WhereIF(!string.IsNullOrWhiteSpace(q.ItemNum), x => (x.ItemNum != null && x.ItemNum.Contains(q.ItemNum!)) || (x.ItemNum1 != null && x.ItemNum1.Contains(q.ItemNum!)) || (x.ItemNum2 != null && x.ItemNum2.Contains(q.ItemNum!))) .WhereIF(!string.IsNullOrWhiteSpace(q.Keyword), x => x.Employee.Contains(q.Keyword!) || (x.ItemNum != null && x.ItemNum.Contains(q.Keyword!)) || (x.ItemNum1 != null && x.ItemNum1.Contains(q.Keyword!)) || (x.ItemNum2 != null && x.ItemNum2.Contains(q.Keyword!))); var total = await query.CountAsync(); var list = await query .OrderBy(x => x.Employee) .Skip((q.Page - 1) * q.PageSize) .Take(q.PageSize) .ToListAsync(); await ApplyDisplayFieldsAsync(list); return Ok(new { total, page = q.Page, pageSize = q.PageSize, list }); } [HttpGet("{id:long}")] public async Task GetAsync(long id) { var item = await _rep.GetByIdAsync(id); if (item == null) return NotFound(); await ApplyDisplayFieldsAsync(new List { item }); return Ok(item); } [HttpPost] public async Task CreateAsync([FromBody] AdoS0EmpWorkDutyUpsertDto dto) { var scopeError = ValidateMaterialScope(dto, out var itemNum, out var itemNum1, out var itemNum2); if (scopeError != null) return AdoS0ApiErrors.InvalidRequest(scopeError); var entity = new AdoS0EmpWorkDutyMaster { CompanyRefId = dto.CompanyRefId, FactoryRefId = dto.FactoryRefId, DomainCode = dto.DomainCode ?? string.Empty, Employee = dto.Employee, ItemNum = itemNum, ItemNum1 = itemNum1, ItemNum2 = itemNum2, Location = dto.Location, ProdLine = dto.ProdLine, Duty = dto.Duty, EmpType = dto.EmpType, Ufld2 = dto.Ufld2, CreateUser = dto.CreateUser, CreateTime = DateTime.Now }; await _rep.AsInsertable(entity).ExecuteReturnEntityAsync(); return Ok(entity); } [HttpPut("{id:long}")] public async Task UpdateAsync(long id, [FromBody] AdoS0EmpWorkDutyUpsertDto dto) { var entity = await _rep.GetByIdAsync(id); if (entity == null) return NotFound(); var scopeError = ValidateMaterialScope(dto, out var itemNum, out var itemNum1, out var itemNum2); if (scopeError != null) return AdoS0ApiErrors.InvalidRequest(scopeError); entity.CompanyRefId = dto.CompanyRefId; entity.FactoryRefId = dto.FactoryRefId; entity.DomainCode = dto.DomainCode ?? string.Empty; entity.Employee = dto.Employee; entity.ItemNum = itemNum; entity.ItemNum1 = itemNum1; entity.ItemNum2 = itemNum2; entity.Location = dto.Location; entity.ProdLine = dto.ProdLine; entity.Duty = dto.Duty; entity.EmpType = dto.EmpType; entity.Ufld2 = dto.Ufld2; entity.UpdateUser = dto.UpdateUser; entity.UpdateTime = DateTime.Now; await _rep.AsUpdateable(entity).ExecuteCommandAsync(); return Ok(entity); } [HttpDelete("{id:long}")] public async Task DeleteAsync(long id) { var item = await _rep.GetByIdAsync(id); if (item == null) return NotFound(); await _rep.DeleteAsync(item); return Ok(new { message = "删除成功" }); } private static readonly Dictionary DutyMap = new(StringComparer.OrdinalIgnoreCase) { ["iss-po"] = "采购收货", ["iss-so"] = "销售发货", ["iss-wo"] = "发料", ["packing"] = "退料", ["rct-unp"] = "计划外入库", ["rct-wo"] = "入库", ["Up-Shelf"] = "上架" }; private async Task ApplyDisplayFieldsAsync(List duties) { if (duties.Count == 0) return; var domainCodes = duties.Select(d => d.DomainCode).Distinct().ToList(); var employees = await _empRep.AsQueryable() .Where(e => domainCodes.Contains(e.DomainCode)) .ToListAsync(); var locations = await _locRep.AsQueryable() .Where(l => domainCodes.Contains(l.DomainCode)) .ToListAsync(); foreach (var duty in duties) { var emp = employees.Find(e => string.Equals(e.DomainCode, duty.DomainCode, StringComparison.OrdinalIgnoreCase) && string.Equals(e.Employee, duty.Employee, StringComparison.OrdinalIgnoreCase)); duty.EmployeeName = emp?.Name; if (!string.IsNullOrWhiteSpace(duty.Location)) { var loc = locations.Find(l => string.Equals(l.DomainCode, duty.DomainCode, StringComparison.OrdinalIgnoreCase) && string.Equals(l.Location, duty.Location, StringComparison.OrdinalIgnoreCase)); duty.LocationName = $"{duty.Location} {loc?.Descr ?? ""}".Trim(); } // Duty 翻译(原始多值逗号/空格拼接场景兼容) if (!string.IsNullOrWhiteSpace(duty.Duty)) { var parts = duty.Duty.Split(new[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries); duty.DutyDisplay = string.Join("、", parts.Select(p => DutyMap.TryGetValue(p.Trim(), out var cn) ? cn : p.Trim())); } duty.ItemNumDisplay = !string.IsNullOrWhiteSpace(duty.ItemNum) ? duty.ItemNum : $"{duty.ItemNum1 ?? ""} ~ {duty.ItemNum2 ?? ""}".Trim(' ', '~'); } } private static string? ValidateMaterialScope( AdoS0EmpWorkDutyUpsertDto dto, out string? itemNum, out string? itemNum1, out string? itemNum2) { itemNum = string.IsNullOrWhiteSpace(dto.ItemNum) ? null : dto.ItemNum.Trim(); itemNum1 = string.IsNullOrWhiteSpace(dto.ItemNum1) ? null : dto.ItemNum1.Trim(); itemNum2 = string.IsNullOrWhiteSpace(dto.ItemNum2) ? null : dto.ItemNum2.Trim(); if (!string.IsNullOrWhiteSpace(itemNum)) { itemNum1 = null; itemNum2 = null; return null; } if (string.IsNullOrWhiteSpace(itemNum1) || string.IsNullOrWhiteSpace(itemNum2)) return "请填写单物料编码,或完整填写物料编码起/止区间"; if (string.Compare(itemNum1, itemNum2, StringComparison.OrdinalIgnoreCase) > 0) return "物料编码起不能大于物料编码止"; return null; } }