|
@@ -6,9 +6,12 @@ using Admin.NET.Plugin.AiDOP.Infrastructure;
|
|
|
|
|
|
|
|
namespace Admin.NET.Plugin.AiDOP.Controllers.S0.Manufacturing;
|
|
namespace Admin.NET.Plugin.AiDOP.Controllers.S0.Manufacturing;
|
|
|
|
|
|
|
|
|
|
+/// <summary>
|
|
|
|
|
+/// S0 物料工序条件(ItemOpCondition 语义)。
|
|
|
|
|
+/// 多租户隔离:所有读写显式限定当前请求租户(AdoS0TenantScope.TryResolveRequired),不依赖全局 AOP 兜底。
|
|
|
|
|
+/// </summary>
|
|
|
[ApiController]
|
|
[ApiController]
|
|
|
[Route("api/s0/manufacturing/material-process-elements")]
|
|
[Route("api/s0/manufacturing/material-process-elements")]
|
|
|
-[AllowAnonymous]
|
|
|
|
|
[NonUnify]
|
|
[NonUnify]
|
|
|
public class AdoS0MfgMaterialProcessElementsController : ControllerBase
|
|
public class AdoS0MfgMaterialProcessElementsController : ControllerBase
|
|
|
{
|
|
{
|
|
@@ -22,12 +25,14 @@ public class AdoS0MfgMaterialProcessElementsController : ControllerBase
|
|
|
[HttpGet]
|
|
[HttpGet]
|
|
|
public async Task<IActionResult> GetPagedAsync([FromQuery] AdoS0ItemOpConditionQueryDto q)
|
|
public async Task<IActionResult> GetPagedAsync([FromQuery] AdoS0ItemOpConditionQueryDto q)
|
|
|
{
|
|
{
|
|
|
|
|
+ if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
|
|
|
var page = q.Page;
|
|
var page = q.Page;
|
|
|
var pageSize = q.PageSize;
|
|
var pageSize = q.PageSize;
|
|
|
(page, pageSize) = PagingGuard.Normalize(page, pageSize);
|
|
(page, pageSize) = PagingGuard.Normalize(page, pageSize);
|
|
|
|
|
|
|
|
- // 去 domain 化(S0-DOMAIN-FILTER-REMOVAL-READONLY-1):不再按 Domain 过滤,租户隔离由 ITenantIdFilter 自动生效;保留 CodeType 业务条件。
|
|
|
|
|
|
|
+ // 显式租户隔离:不依赖全局 AOP,直接按当前请求租户过滤;保留 CodeType 业务条件。
|
|
|
var query = _rep.AsQueryable()
|
|
var query = _rep.AsQueryable()
|
|
|
|
|
+ .Where(x => x.TenantId == tenantId)
|
|
|
.Where(x => x.CodeType == "Prod")
|
|
.Where(x => x.CodeType == "Prod")
|
|
|
.WhereIF(!string.IsNullOrWhiteSpace(q.Keyword),
|
|
.WhereIF(!string.IsNullOrWhiteSpace(q.Keyword),
|
|
|
x =>
|
|
x =>
|
|
@@ -49,7 +54,7 @@ public class AdoS0MfgMaterialProcessElementsController : ControllerBase
|
|
|
var itemNums = list.Select(x => x.ItemNum).Distinct().ToList();
|
|
var itemNums = list.Select(x => x.ItemNum).Distinct().ToList();
|
|
|
// 去 domain 化:物料名补显不再按 Domain 等值;ItemMaster 带 ITenantIdFilter,租户内 ItemNum 唯一,确定性以 IsActive/RecID 稳定排序兜底。
|
|
// 去 domain 化:物料名补显不再按 Domain 等值;ItemMaster 带 ITenantIdFilter,租户内 ItemNum 唯一,确定性以 IsActive/RecID 稳定排序兜底。
|
|
|
var items = await _rep.Context.Queryable<AdoS0ItemMaster>()
|
|
var items = await _rep.Context.Queryable<AdoS0ItemMaster>()
|
|
|
- .Where(m => itemNums.Contains(m.ItemNum))
|
|
|
|
|
|
|
+ .Where(m => m.TenantId == tenantId && itemNums.Contains(m.ItemNum))
|
|
|
.OrderByDescending(m => m.IsActive)
|
|
.OrderByDescending(m => m.IsActive)
|
|
|
.OrderBy(m => m.Id)
|
|
.OrderBy(m => m.Id)
|
|
|
.Select(m => new { m.ItemNum, m.Descr })
|
|
.Select(m => new { m.ItemNum, m.Descr })
|
|
@@ -67,7 +72,7 @@ public class AdoS0MfgMaterialProcessElementsController : ControllerBase
|
|
|
if (opKeys.Count > 0)
|
|
if (opKeys.Count > 0)
|
|
|
{
|
|
{
|
|
|
var r = await _rep.Context.Queryable<AdoS0MfgRoutingOpDetail>()
|
|
var r = await _rep.Context.Queryable<AdoS0MfgRoutingOpDetail>()
|
|
|
- .Where(x => x.MaterialCode != null && itemNums.Contains(x.MaterialCode))
|
|
|
|
|
|
|
+ .Where(x => x.TenantId == tenantId && x.MaterialCode != null && itemNums.Contains(x.MaterialCode))
|
|
|
.ToListAsync();
|
|
.ToListAsync();
|
|
|
foreach (var k in opKeys)
|
|
foreach (var k in opKeys)
|
|
|
{
|
|
{
|
|
@@ -103,16 +108,19 @@ public class AdoS0MfgMaterialProcessElementsController : ControllerBase
|
|
|
[HttpGet("{id:long}")]
|
|
[HttpGet("{id:long}")]
|
|
|
public async Task<IActionResult> GetAsync(long id)
|
|
public async Task<IActionResult> GetAsync(long id)
|
|
|
{
|
|
{
|
|
|
- var item = await _rep.GetByIdAsync(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);
|
|
return item == null ? NotFound() : Ok(item);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
[HttpPost]
|
|
[HttpPost]
|
|
|
public async Task<IActionResult> CreateAsync([FromBody] AdoS0ItemOpConditionUpsertDto dto)
|
|
public async Task<IActionResult> CreateAsync([FromBody] AdoS0ItemOpConditionUpsertDto dto)
|
|
|
{
|
|
{
|
|
|
|
|
+ if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
|
|
|
var now = DateTime.Now;
|
|
var now = DateTime.Now;
|
|
|
var entity = new AdoS0ItemOpCondition
|
|
var entity = new AdoS0ItemOpCondition
|
|
|
{
|
|
{
|
|
|
|
|
+ TenantId = tenantId,
|
|
|
Domain = dto.Domain.Trim(),
|
|
Domain = dto.Domain.Trim(),
|
|
|
CodeType = "Prod",
|
|
CodeType = "Prod",
|
|
|
ItemNum = dto.ItemNum.Trim(),
|
|
ItemNum = dto.ItemNum.Trim(),
|
|
@@ -134,7 +142,8 @@ public class AdoS0MfgMaterialProcessElementsController : ControllerBase
|
|
|
[HttpPut("{id:long}")]
|
|
[HttpPut("{id:long}")]
|
|
|
public async Task<IActionResult> UpdateAsync(long id, [FromBody] AdoS0ItemOpConditionUpsertDto dto)
|
|
public async Task<IActionResult> UpdateAsync(long id, [FromBody] AdoS0ItemOpConditionUpsertDto dto)
|
|
|
{
|
|
{
|
|
|
- var entity = await _rep.GetByIdAsync(id);
|
|
|
|
|
|
|
+ if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
|
|
|
|
|
+ var entity = await _rep.AsQueryable().Where(x => x.Id == id && x.TenantId == tenantId).FirstAsync();
|
|
|
if (entity == null) return NotFound();
|
|
if (entity == null) return NotFound();
|
|
|
entity.Domain = dto.Domain.Trim();
|
|
entity.Domain = dto.Domain.Trim();
|
|
|
entity.CodeType = "Prod";
|
|
entity.CodeType = "Prod";
|
|
@@ -154,7 +163,8 @@ public class AdoS0MfgMaterialProcessElementsController : ControllerBase
|
|
|
[HttpDelete("{id:long}")]
|
|
[HttpDelete("{id:long}")]
|
|
|
public async Task<IActionResult> DeleteAsync(long id)
|
|
public async Task<IActionResult> DeleteAsync(long id)
|
|
|
{
|
|
{
|
|
|
- var item = await _rep.GetByIdAsync(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();
|
|
if (item == null) return NotFound();
|
|
|
await _rep.DeleteAsync(item);
|
|
await _rep.DeleteAsync(item);
|
|
|
return Ok(new { message = "删除成功" });
|
|
return Ok(new { message = "删除成功" });
|