|
|
@@ -1,6 +1,7 @@
|
|
|
using Admin.NET.Plugin.AiDOP.Dto.S0.Warehouse;
|
|
|
using Admin.NET.Plugin.AiDOP.Entity.S0.Warehouse;
|
|
|
using Admin.NET.Plugin.AiDOP.Infrastructure;
|
|
|
+using Microsoft.Extensions.Logging;
|
|
|
|
|
|
namespace Admin.NET.Plugin.AiDOP.Controllers.S0.Warehouse;
|
|
|
|
|
|
@@ -16,15 +17,18 @@ public class AdoS0EmployeesController : ControllerBase
|
|
|
private readonly SqlSugarRepository<AdoS0EmployeeMaster> _rep;
|
|
|
private readonly SqlSugarRepository<AdoS0DepartmentMaster> _deptRep;
|
|
|
private readonly AdoS0ReferenceChecker _refChecker;
|
|
|
+ private readonly ILogger<AdoS0EmployeesController> _logger;
|
|
|
|
|
|
public AdoS0EmployeesController(
|
|
|
SqlSugarRepository<AdoS0EmployeeMaster> rep,
|
|
|
SqlSugarRepository<AdoS0DepartmentMaster> deptRep,
|
|
|
- AdoS0ReferenceChecker refChecker)
|
|
|
+ AdoS0ReferenceChecker refChecker,
|
|
|
+ ILogger<AdoS0EmployeesController> logger)
|
|
|
{
|
|
|
_rep = rep;
|
|
|
_deptRep = deptRep;
|
|
|
_refChecker = refChecker;
|
|
|
+ _logger = logger;
|
|
|
}
|
|
|
|
|
|
[HttpGet]
|
|
|
@@ -68,9 +72,17 @@ public class AdoS0EmployeesController : ControllerBase
|
|
|
if (await _rep.IsAnyAsync(x => x.FactoryRefId == dto.FactoryRefId && x.Employee == dto.Employee))
|
|
|
return AdoS0ApiErrors.Conflict(AdoS0ErrorCodes.DuplicateCode, "员工编码已存在");
|
|
|
|
|
|
- if (!await _refChecker.DepartmentExistsAsync(dto.Department))
|
|
|
- return AdoS0ApiErrors.InvalidReference(AdoS0ErrorCodes.ReferenceNotFound,
|
|
|
- $"部门编码 '{dto.Department}' 不存在于部门主数据");
|
|
|
+ // B2:Create 一律严格作用域校验,禁止降级(参 AdoS0MfgRoutingOpDetailsController)。
|
|
|
+ var deptResult = await _refChecker.DepartmentExistsInScopeAsync(dto.Department, dto.CompanyRefId, dto.FactoryRefId);
|
|
|
+ switch (deptResult)
|
|
|
+ {
|
|
|
+ case MaterialScopeCheck.NotFound:
|
|
|
+ return AdoS0ApiErrors.InvalidReference(AdoS0ErrorCodes.ReferenceNotFound,
|
|
|
+ $"部门编码 '{dto.Department}' 不存在于部门主数据");
|
|
|
+ case MaterialScopeCheck.ScopeMiss:
|
|
|
+ return AdoS0ApiErrors.InvalidReference(AdoS0ErrorCodes.InvalidReferenceScope,
|
|
|
+ $"部门编码 '{dto.Department}' 不属于当前公司/工厂 (CompanyRefId={dto.CompanyRefId}, FactoryRefId={dto.FactoryRefId})");
|
|
|
+ }
|
|
|
|
|
|
var entity = MapToEntity(dto);
|
|
|
entity.CreateTime = DateTime.Now;
|
|
|
@@ -87,10 +99,40 @@ public class AdoS0EmployeesController : ControllerBase
|
|
|
if (await _rep.IsAnyAsync(x => x.Id != id && x.FactoryRefId == dto.FactoryRefId && x.Employee == dto.Employee))
|
|
|
return AdoS0ApiErrors.Conflict(AdoS0ErrorCodes.DuplicateCode, "员工编码已存在");
|
|
|
|
|
|
- if (!await _refChecker.DepartmentExistsAsync(dto.Department))
|
|
|
+ // B2 + 历史兼容降级(D-03 严格条件,参 AdoS0MfgRoutingOpDetailsController)
|
|
|
+ var deptResult = await _refChecker.DepartmentExistsInScopeAsync(dto.Department, dto.CompanyRefId, dto.FactoryRefId);
|
|
|
+ if (deptResult == MaterialScopeCheck.NotFound)
|
|
|
return AdoS0ApiErrors.InvalidReference(AdoS0ErrorCodes.ReferenceNotFound,
|
|
|
$"部门编码 '{dto.Department}' 不存在于部门主数据");
|
|
|
|
|
|
+ if (deptResult == MaterialScopeCheck.ScopeMiss)
|
|
|
+ {
|
|
|
+ // 降级条件(全部满足才允许):
|
|
|
+ // 1. 是 Update(已满足)
|
|
|
+ // 2. DB 原记录 scope 为 0/0
|
|
|
+ // 3. 本次未修改 Department 引用值
|
|
|
+ var originScopeEmpty = entity.CompanyRefId == 0 && entity.FactoryRefId == 0;
|
|
|
+ var departmentUnchanged = string.Equals(entity.Department, dto.Department?.Trim(), StringComparison.Ordinal);
|
|
|
+
|
|
|
+ if (originScopeEmpty && departmentUnchanged)
|
|
|
+ {
|
|
|
+ _logger.LogWarning(
|
|
|
+ "[B2 Downgrade] Table={TableName} PrimaryKey={PrimaryKey} ReferenceField={ReferenceField} " +
|
|
|
+ "OldValue={OldValue} NewValue={NewValue} CompanyRefId={CompanyRefId} FactoryRefId={FactoryRefId} " +
|
|
|
+ "DowngradeReason={DowngradeReason}",
|
|
|
+ "EmployeeMaster", entity.Id, "Department",
|
|
|
+ entity.Department, dto.Department,
|
|
|
+ dto.CompanyRefId, dto.FactoryRefId,
|
|
|
+ "LegacyRecord_OriginScopeZero_DepartmentUnchanged");
|
|
|
+ // 放行,继续执行写入
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return AdoS0ApiErrors.InvalidReference(AdoS0ErrorCodes.InvalidReferenceScope,
|
|
|
+ $"部门编码 '{dto.Department}' 不属于当前公司/工厂 (CompanyRefId={dto.CompanyRefId}, FactoryRefId={dto.FactoryRefId})");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
entity.CompanyRefId = dto.CompanyRefId;
|
|
|
entity.FactoryRefId = dto.FactoryRefId;
|
|
|
entity.DomainCode = dto.DomainCode ?? string.Empty;
|