|
@@ -27,6 +27,9 @@ namespace Admin.NET.Plugin.AiDOP.FinishedWarehouse;
|
|
|
[NonUnify]
|
|
[NonUnify]
|
|
|
public class FqcInspBillFlowService : IDynamicApiController, ITransient
|
|
public class FqcInspBillFlowService : IDynamicApiController, ITransient
|
|
|
{
|
|
{
|
|
|
|
|
+ /// <summary>主/系统租户哨兵:超管未选择目标租户时其 JWT TenantId 即此值,拒绝作为业务租户。</summary>
|
|
|
|
|
+ private const long MainTenantId = 1300000000001L;
|
|
|
|
|
+
|
|
|
private readonly ISqlSugarClient _db;
|
|
private readonly ISqlSugarClient _db;
|
|
|
private readonly FlowEngineService _flowEngine;
|
|
private readonly FlowEngineService _flowEngine;
|
|
|
private readonly UserManager _userManager;
|
|
private readonly UserManager _userManager;
|
|
@@ -38,6 +41,17 @@ public class FqcInspBillFlowService : IDynamicApiController, ITransient
|
|
|
_userManager = userManager;
|
|
_userManager = userManager;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /// <summary>严格可信租户解析:只来自认证后 JWT;无 Token(<=0) 或超管未选主租户 → 拒绝;不读前端 tenantId、无默认回退。</summary>
|
|
|
|
|
+ private long ResolveTenantOrThrow()
|
|
|
|
|
+ {
|
|
|
|
|
+ var tid = _userManager.TenantId;
|
|
|
|
|
+ if (tid <= 0)
|
|
|
|
|
+ throw Oops.Oh("无法确定当前租户,请重新登录或选择目标租户");
|
|
|
|
|
+ if (_userManager.SuperAdmin && tid == MainTenantId)
|
|
|
|
|
+ throw Oops.Oh("超级管理员操作前必须选择目标租户");
|
|
|
|
|
+ return tid;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/// <summary>检验单流程状态(只读,供前端按钮控制)。</summary>
|
|
/// <summary>检验单流程状态(只读,供前端按钮控制)。</summary>
|
|
|
[DisplayName("FQC检验单流程状态")]
|
|
[DisplayName("FQC检验单流程状态")]
|
|
|
[HttpGet("state")]
|
|
[HttpGet("state")]
|
|
@@ -95,7 +109,7 @@ public class FqcInspBillFlowService : IDynamicApiController, ITransient
|
|
|
if (myTask.NodeId != FqcInspBillFlowConst.NodeInspect)
|
|
if (myTask.NodeId != FqcInspBillFlowConst.NodeInspect)
|
|
|
throw Oops.Oh("当前不在检验录入节点,无法提交检验结果");
|
|
throw Oops.Oh("当前不在检验录入节点,无法提交检验结果");
|
|
|
|
|
|
|
|
- var tid = QmsTenantScope.Resolve(null, _userManager.TenantId);
|
|
|
|
|
|
|
+ var tid = ResolveTenantOrThrow();
|
|
|
|
|
|
|
|
// ① 检验业务结果 → qms_qcpp_inspbill(仅 pd/hgsl/bhgsl/clfs,不覆盖继承字段)
|
|
// ① 检验业务结果 → qms_qcpp_inspbill(仅 pd/hgsl/bhgsl/clfs,不覆盖继承字段)
|
|
|
await _db.Ado.ExecuteCommandAsync(
|
|
await _db.Ado.ExecuteCommandAsync(
|
|
@@ -217,11 +231,13 @@ public class FqcInspBillFlowService : IDynamicApiController, ITransient
|
|
|
.AnyAsync();
|
|
.AnyAsync();
|
|
|
if (hasEffective) throw Oops.Oh("该检验单已有有效 QE 处置,不可重复提交");
|
|
if (hasEffective) throw Oops.Oh("该检验单已有有效 QE 处置,不可重复提交");
|
|
|
|
|
|
|
|
|
|
+ // 写库前严格解析可信租户(无 Token / 超管未选主租户 → 抛错,不落库)
|
|
|
|
|
+ var tid = ResolveTenantOrThrow();
|
|
|
var now = DateTime.Now;
|
|
var now = DateTime.Now;
|
|
|
var disposition = new AdoS7FqcQeDisposition
|
|
var disposition = new AdoS7FqcQeDisposition
|
|
|
{
|
|
{
|
|
|
Id = YitIdHelper.NextId(),
|
|
Id = YitIdHelper.NextId(),
|
|
|
- TenantId = _userManager.TenantId,
|
|
|
|
|
|
|
+ TenantId = tid,
|
|
|
OrgId = inst.OrgId,
|
|
OrgId = inst.OrgId,
|
|
|
InspbillId = input.Id,
|
|
InspbillId = input.Id,
|
|
|
InspbillNo = billNo,
|
|
InspbillNo = billNo,
|
|
@@ -268,7 +284,7 @@ public class FqcInspBillFlowService : IDynamicApiController, ITransient
|
|
|
private async Task<(string billNo, string? sourceBillNo)> EnsureBillAsync(long id)
|
|
private async Task<(string billNo, string? sourceBillNo)> EnsureBillAsync(long id)
|
|
|
{
|
|
{
|
|
|
if (id <= 0) throw Oops.Oh("检验单 id 非法");
|
|
if (id <= 0) throw Oops.Oh("检验单 id 非法");
|
|
|
- var tid = QmsTenantScope.Resolve(null, _userManager.TenantId);
|
|
|
|
|
|
|
+ var tid = ResolveTenantOrThrow();
|
|
|
var rows = await _db.Ado.SqlQueryAsync<FqcBillKey>(
|
|
var rows = await _db.Ado.SqlQueryAsync<FqcBillKey>(
|
|
|
"SELECT FBILLNO AS BillNo, lydjbh AS SourceBillNo FROM qms_qcpp_inspbill WHERE id=@id AND tenant_id=@TenantFilter LIMIT 1",
|
|
"SELECT FBILLNO AS BillNo, lydjbh AS SourceBillNo FROM qms_qcpp_inspbill WHERE id=@id AND tenant_id=@TenantFilter LIMIT 1",
|
|
|
new List<SugarParameter> { new("@id", id), new("@TenantFilter", tid) });
|
|
new List<SugarParameter> { new("@id", id), new("@TenantFilter", tid) });
|
|
@@ -347,7 +363,7 @@ public class FqcInspBillFlowService : IDynamicApiController, ITransient
|
|
|
output.DispositionType = disp.DispositionType;
|
|
output.DispositionType = disp.DispositionType;
|
|
|
output.DispositionOpinion = disp.DispositionOpinion;
|
|
output.DispositionOpinion = disp.DispositionOpinion;
|
|
|
}
|
|
}
|
|
|
- var tid = QmsTenantScope.Resolve(null, _userManager.TenantId);
|
|
|
|
|
|
|
+ var tid = ResolveTenantOrThrow();
|
|
|
var pdRows = await _db.Ado.SqlQueryAsync<string>(
|
|
var pdRows = await _db.Ado.SqlQueryAsync<string>(
|
|
|
"SELECT pd FROM qms_qcpp_inspbill WHERE id=@id AND tenant_id=@TenantFilter LIMIT 1",
|
|
"SELECT pd FROM qms_qcpp_inspbill WHERE id=@id AND tenant_id=@TenantFilter LIMIT 1",
|
|
|
new List<SugarParameter> { new("@id", bizId), new("@TenantFilter", tid) });
|
|
new List<SugarParameter> { new("@id", bizId), new("@TenantFilter", tid) });
|
|
@@ -412,7 +428,7 @@ public class FqcInspBillFlowService : IDynamicApiController, ITransient
|
|
|
if (row == null || row.Pd != 0) return; // 仅合格回写
|
|
if (row == null || row.Pd != 0) return; // 仅合格回写
|
|
|
|
|
|
|
|
string billNo = string.IsNullOrWhiteSpace(row.BillNo) ? billId.ToString() : row.BillNo!;
|
|
string billNo = string.IsNullOrWhiteSpace(row.BillNo) ? billId.ToString() : row.BillNo!;
|
|
|
- long tenantId = _userManager.TenantId;
|
|
|
|
|
|
|
+ long tenantId = ResolveTenantOrThrow();
|
|
|
var payload = JsonSerializer.Serialize(new
|
|
var payload = JsonSerializer.Serialize(new
|
|
|
{
|
|
{
|
|
|
path = "/fqc/result",
|
|
path = "/fqc/result",
|