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 物料状态任务指派(wms_rwzp 语义)。
/// 多租户隔离:所有读写显式限定当前请求租户(AdoS0TenantScope.TryResolveRequired),不依赖全局 AOP 兜底。
///
[ApiController]
[Route("api/s0/warehouse/task-assignments")]
[NonUnify]
public class AdoS0TaskAssignmentsController : ControllerBase
{
private readonly SqlSugarRepository _rep;
public AdoS0TaskAssignmentsController(SqlSugarRepository rep)
{
_rep = rep;
}
[HttpGet]
public async Task GetPagedAsync([FromQuery] AdoS0TaskAssignmentQueryDto q)
{
if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
(q.Page, q.PageSize) = PagingGuard.Normalize(q.Page, q.PageSize);
var query = _rep.AsQueryable()
.Where(x => x.TenantId == tenantId)
.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.Rwlx), x => x.Rwlx == q.Rwlx)
.WhereIF(!string.IsNullOrWhiteSpace(q.Zt), x => x.Zt == q.Zt)
.WhereIF(!string.IsNullOrWhiteSpace(q.Sqr), x => x.Sqr != null && x.Sqr.Contains(q.Sqr!))
.WhereIF(!string.IsNullOrWhiteSpace(q.Keyword),
x => (x.Wlbm != null && x.Wlbm.Contains(q.Keyword!)) || (x.Sqr != null && x.Sqr.Contains(q.Keyword!)));
var total = await query.CountAsync();
var list = await query
.OrderByDescending(x => x.Tcrq)
.Skip((q.Page - 1) * q.PageSize)
.Take(q.PageSize)
.ToListAsync();
return Ok(new { total, page = q.Page, pageSize = q.PageSize, list });
}
[HttpGet("{id:long}")]
public async Task GetAsync(long id)
{
if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
var item = await _rep.AsQueryable().Where(x => x.Id == id && x.TenantId == tenantId).FirstAsync();
return item == null ? NotFound() : Ok(item);
}
[HttpPost]
public async Task CreateAsync([FromBody] AdoS0TaskAssignmentUpsertDto dto)
{
if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
if (string.IsNullOrWhiteSpace(dto.DomainCode))
return AdoS0ApiErrors.InvalidRequest("请填写域编码");
// 唯一口径对齐数据库 uk_wms_rwzp_tenant_org_task
// (tenant_id, company_ref_id, factory_ref_id, domain_code, rwlx, wlbm, rqpc, yskw, mdkw)
if (await IsDuplicateAsync(tenantId, dto, null))
return AdoS0ApiErrors.Conflict(AdoS0ErrorCodes.DuplicateCode, "相同工厂域下该物料任务指派已存在");
var entity = new AdoS0TaskAssignment
{
TenantId = tenantId,
CompanyRefId = dto.CompanyRefId,
FactoryRefId = dto.FactoryRefId,
DomainCode = dto.DomainCode ?? string.Empty,
Tcrq = dto.Tcrq,
Sqr = dto.Sqr,
Rwlx = dto.Rwlx,
Wlbm = dto.Wlbm,
Sl = dto.Sl,
Rqpc = dto.Rqpc,
Yskw = dto.Yskw,
Mdkw = dto.Mdkw,
Xqsj = dto.Xqsj,
Clr = dto.Clr,
Bz = dto.Bz,
Zt = dto.Zt,
CreateUser = dto.CreateUser,
CreateTime = DateTime.Now
};
await _rep.AsInsertable(entity).ExecuteReturnEntityAsync();
return Ok(entity);
}
[HttpPut("{id:long}")]
public async Task UpdateAsync(long id, [FromBody] AdoS0TaskAssignmentUpsertDto dto)
{
if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
if (string.IsNullOrWhiteSpace(dto.DomainCode))
return AdoS0ApiErrors.InvalidRequest("请填写域编码");
var entity = await _rep.AsQueryable().Where(x => x.Id == id && x.TenantId == tenantId).FirstAsync();
if (entity == null) return NotFound();
if (await IsDuplicateAsync(tenantId, dto, id))
return AdoS0ApiErrors.Conflict(AdoS0ErrorCodes.DuplicateCode, "相同工厂域下该物料任务指派已存在");
// entity.TenantId 保持不变(== tenantId);不接受前端修改 tenant
entity.CompanyRefId = dto.CompanyRefId;
entity.FactoryRefId = dto.FactoryRefId;
entity.DomainCode = dto.DomainCode ?? string.Empty;
entity.Tcrq = dto.Tcrq;
entity.Sqr = dto.Sqr;
entity.Rwlx = dto.Rwlx;
entity.Wlbm = dto.Wlbm;
entity.Sl = dto.Sl;
entity.Rqpc = dto.Rqpc;
entity.Yskw = dto.Yskw;
entity.Mdkw = dto.Mdkw;
entity.Xqsj = dto.Xqsj;
entity.Clr = dto.Clr;
entity.Bz = dto.Bz;
entity.Zt = dto.Zt;
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)
{
if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
var item = await _rep.AsQueryable().Where(x => x.Id == id && x.TenantId == tenantId).FirstAsync();
if (item == null) return NotFound();
await _rep.DeleteAsync(item);
return Ok(new { message = "删除成功" });
}
///
/// 租户内业务唯一校验:对齐 uk_wms_rwzp_tenant_org_task
/// (tenant_id, company_ref_id, factory_ref_id, domain_code, rwlx, wlbm, rqpc, yskw, mdkw)。
/// excludeId 非空时排除自身(更新场景)。
///
private async Task IsDuplicateAsync(long tenantId, AdoS0TaskAssignmentUpsertDto dto, long? excludeId)
{
var domainCode = dto.DomainCode ?? string.Empty;
return await _rep.AsQueryable()
.Where(x => x.TenantId == tenantId
&& x.CompanyRefId == dto.CompanyRefId
&& x.FactoryRefId == dto.FactoryRefId
&& x.DomainCode == domainCode
&& x.Rwlx == dto.Rwlx
&& x.Wlbm == dto.Wlbm
&& x.Rqpc == dto.Rqpc
&& x.Yskw == dto.Yskw
&& x.Mdkw == dto.Mdkw)
.WhereIF(excludeId.HasValue, x => x.Id != excludeId!.Value)
.AnyAsync();
}
}