|
@@ -12,11 +12,12 @@ namespace Admin.NET.Plugin.AiDOP.Infrastructure;
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// S6 过程检验单(IPQC)检验员+主管流程种子(幂等)。
|
|
/// S6 过程检验单(IPQC)检验员+主管流程种子(幂等)。
|
|
|
///
|
|
///
|
|
|
-/// 顺序:① 扩展表 ado_s6_ipqc_inspection_flow_state(CodeFirst 建表,无 SQL)
|
|
|
|
|
-/// ② 角色 ROLE_S6_IPQC_INSPECTOR / ROLE_S6_IPQC_SUPERVISOR ③ UAT 成员绑定(superAdmin.NET 同绑两角色,仅 UAT 自审)
|
|
|
|
|
-/// ④ ApprovalBizType(IPQC_INSPECTION) ⑤ ApprovalFlow 已发布定义(start→N1_INSPECT→N2_SUP_REVIEW→end,节点绑角色)。
|
|
|
|
|
-/// 全部幂等:存在则跳过,不覆盖、不删除既有角色/流程。superAdmin.NET 不存在时仅告警不崩溃。
|
|
|
|
|
-/// 本批不含网关/SQE/不合格处置。
|
|
|
|
|
|
|
+/// 顺序:① 扩展表 ado_s6_ipqc_inspection_flow_state + 处置表 ado_s6_ipqc_quality_disposition(CodeFirst 建表,无 SQL)
|
|
|
|
|
+/// ② 角色 ROLE_S6_IPQC_INSPECTOR / SUPERVISOR / QUALITY_ENGINEER ③ UAT 成员绑定(superAdmin.NET 同绑三角色,仅 UAT 自审)
|
|
|
|
|
+/// ④ ApprovalBizType(IPQC_INSPECTION) ⑤ ApprovalFlow v2 已发布定义
|
|
|
|
|
+/// (start→N1_INSPECT→N2_SUP_REVIEW→GW_RESULT(disposition_required==1→N3 / 否则→end)→N3_QUALITY_DISPOSITION→end)。
|
|
|
|
|
+/// v1→v2 幂等升级:已发布定义含 N3 则跳过;仍为 v1 则下架旧版发布 v2;历史 Running 实例用各自 FlowJsonSnapshot 冻结不受影响。
|
|
|
|
|
+/// superAdmin.NET 不存在时仅告警不崩溃。
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
public static class IpqcInspectionFlowSeed
|
|
public static class IpqcInspectionFlowSeed
|
|
|
{
|
|
{
|
|
@@ -28,8 +29,9 @@ public static class IpqcInspectionFlowSeed
|
|
|
typeof(ApprovalBizType),
|
|
typeof(ApprovalBizType),
|
|
|
typeof(ApprovalFlowEntity),
|
|
typeof(ApprovalFlowEntity),
|
|
|
typeof(ApprovalFlowVersion));
|
|
typeof(ApprovalFlowVersion));
|
|
|
- // 流程状态轻量扩展表(CodeFirst 建表,无 SQL)
|
|
|
|
|
|
|
+ // 流程状态轻量扩展表 + 质量处置表(CodeFirst 建表,无 SQL)
|
|
|
db.CodeFirst.InitTables(typeof(AdoS6IpqcInspectionFlowState));
|
|
db.CodeFirst.InitTables(typeof(AdoS6IpqcInspectionFlowState));
|
|
|
|
|
+ db.CodeFirst.InitTables(typeof(AdoS6IpqcQualityDisposition));
|
|
|
EnsureRoles(db);
|
|
EnsureRoles(db);
|
|
|
EnsureUatMembers(db);
|
|
EnsureUatMembers(db);
|
|
|
EnsureBizType(db);
|
|
EnsureBizType(db);
|
|
@@ -45,6 +47,7 @@ public static class IpqcInspectionFlowSeed
|
|
|
{
|
|
{
|
|
|
EnsureRole(db, IpqcInspectionFlowConst.RoleInspectorId, IpqcInspectionFlowConst.RoleInspectorCode, "过程检验员", 820);
|
|
EnsureRole(db, IpqcInspectionFlowConst.RoleInspectorId, IpqcInspectionFlowConst.RoleInspectorCode, "过程检验员", 820);
|
|
|
EnsureRole(db, IpqcInspectionFlowConst.RoleSupervisorId, IpqcInspectionFlowConst.RoleSupervisorCode, "过程检验主管", 821);
|
|
EnsureRole(db, IpqcInspectionFlowConst.RoleSupervisorId, IpqcInspectionFlowConst.RoleSupervisorCode, "过程检验主管", 821);
|
|
|
|
|
+ EnsureRole(db, IpqcInspectionFlowConst.RoleQualityEngineerId, IpqcInspectionFlowConst.RoleQualityEngineerCode, "过程检验质量工程师", 822);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private static void EnsureRole(ISqlSugarClient db, long id, string code, string name, int orderNo)
|
|
private static void EnsureRole(ISqlSugarClient db, long id, string code, string name, int orderNo)
|
|
@@ -77,6 +80,7 @@ public static class IpqcInspectionFlowSeed
|
|
|
}
|
|
}
|
|
|
EnsureUserRole(db, user.Id, IpqcInspectionFlowConst.RoleInspectorId);
|
|
EnsureUserRole(db, user.Id, IpqcInspectionFlowConst.RoleInspectorId);
|
|
|
EnsureUserRole(db, user.Id, IpqcInspectionFlowConst.RoleSupervisorId);
|
|
EnsureUserRole(db, user.Id, IpqcInspectionFlowConst.RoleSupervisorId);
|
|
|
|
|
+ EnsureUserRole(db, user.Id, IpqcInspectionFlowConst.RoleQualityEngineerId);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private static void EnsureUserRole(ISqlSugarClient db, long userId, long roleId)
|
|
private static void EnsureUserRole(ISqlSugarClient db, long userId, long roleId)
|
|
@@ -125,9 +129,22 @@ public static class IpqcInspectionFlowSeed
|
|
|
.Where(x => x.BizType == IpqcInspectionFlowConst.BizType && x.OrgId == orgId && x.IsPublished && !x.IsDelete)
|
|
.Where(x => x.BizType == IpqcInspectionFlowConst.BizType && x.OrgId == orgId && x.IsPublished && !x.IsDelete)
|
|
|
.OrderByDescending(x => x.Version)
|
|
.OrderByDescending(x => x.Version)
|
|
|
.First();
|
|
.First();
|
|
|
- // 已有已发布定义则跳过(幂等,不覆盖)。历史实例用各自 FlowJsonSnapshot。
|
|
|
|
|
- if (existing != null) continue;
|
|
|
|
|
|
|
|
|
|
|
|
+ // v1→v2 幂等升级:已发布定义若已含 N3/GW_RESULT(v2)则跳过;若仍为 v1(无 N3)则下架旧版、发布 v2。
|
|
|
|
|
+ // 历史 Running/Approved 实例使用各自 FlowJsonSnapshot 冻结,不受本次 republish 影响。
|
|
|
|
|
+ if (existing != null)
|
|
|
|
|
+ {
|
|
|
|
|
+ var isV2 = (existing.FlowJson ?? "").Contains(IpqcInspectionFlowConst.NodeDisposition)
|
|
|
|
|
+ && (existing.FlowJson ?? "").Contains(IpqcInspectionFlowConst.GatewayResult);
|
|
|
|
|
+ if (isV2) continue;
|
|
|
|
|
+ db.Updateable<ApprovalFlowEntity>()
|
|
|
|
|
+ .SetColumns(x => x.IsPublished == false)
|
|
|
|
|
+ .SetColumns(x => x.UpdateTime == now)
|
|
|
|
|
+ .Where(x => x.Id == existing.Id)
|
|
|
|
|
+ .ExecuteCommand();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var nextVersion = (existing?.Version ?? 0) + 1;
|
|
|
var flow = new ApprovalFlowEntity
|
|
var flow = new ApprovalFlowEntity
|
|
|
{
|
|
{
|
|
|
Id = YitIdHelper.NextId(),
|
|
Id = YitIdHelper.NextId(),
|
|
@@ -137,8 +154,8 @@ public static class IpqcInspectionFlowSeed
|
|
|
FormJson = "{}",
|
|
FormJson = "{}",
|
|
|
FlowJson = flowJson,
|
|
FlowJson = flowJson,
|
|
|
Status = 1,
|
|
Status = 1,
|
|
|
- Remark = "系统默认流程 v1:开始-检验员检验-检验主管审核-结束",
|
|
|
|
|
- Version = 1,
|
|
|
|
|
|
|
+ Remark = "系统默认流程 v2:开始-检验员检验-检验主管审核-网关(整批判定)-质量处置-结束",
|
|
|
|
|
+ Version = nextVersion,
|
|
|
IsPublished = true,
|
|
IsPublished = true,
|
|
|
OrgId = orgId,
|
|
OrgId = orgId,
|
|
|
CreateTime = now,
|
|
CreateTime = now,
|
|
@@ -208,20 +225,67 @@ public static class IpqcInspectionFlowSeed
|
|
|
Text = new FlowTextItem { X = 500, Y = 154, Value = "检验主管审核" },
|
|
Text = new FlowTextItem { X = 500, Y = 154, Value = "检验主管审核" },
|
|
|
},
|
|
},
|
|
|
new()
|
|
new()
|
|
|
|
|
+ {
|
|
|
|
|
+ Id = IpqcInspectionFlowConst.GatewayResult,
|
|
|
|
|
+ Type = "bpmn:exclusiveGateway",
|
|
|
|
|
+ X = 660,
|
|
|
|
|
+ Y = 120,
|
|
|
|
|
+ Properties = new FlowProperties
|
|
|
|
|
+ {
|
|
|
|
|
+ NodeName = "整批判定分流",
|
|
|
|
|
+ Conditions = new List<GatewayCondition>
|
|
|
|
|
+ {
|
|
|
|
|
+ new()
|
|
|
|
|
+ {
|
|
|
|
|
+ Expression = "disposition_required == 1",
|
|
|
|
|
+ TargetNodeId = IpqcInspectionFlowConst.NodeDisposition,
|
|
|
|
|
+ IsDefault = false,
|
|
|
|
|
+ Label = "整批不合格转处置",
|
|
|
|
|
+ },
|
|
|
|
|
+ new()
|
|
|
|
|
+ {
|
|
|
|
|
+ TargetNodeId = "end",
|
|
|
|
|
+ IsDefault = true,
|
|
|
|
|
+ Label = "整批合格完成",
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ Text = new FlowTextItem { X = 660, Y = 154, Value = "整批判定分流" },
|
|
|
|
|
+ },
|
|
|
|
|
+ new()
|
|
|
|
|
+ {
|
|
|
|
|
+ Id = IpqcInspectionFlowConst.NodeDisposition,
|
|
|
|
|
+ Type = "bpmn:userTask",
|
|
|
|
|
+ X = 820,
|
|
|
|
|
+ Y = 120,
|
|
|
|
|
+ Properties = new FlowProperties
|
|
|
|
|
+ {
|
|
|
|
|
+ NodeName = "质量处置",
|
|
|
|
|
+ ApproverType = nameof(ApproverTypeEnum.Role),
|
|
|
|
|
+ ApproverIds = IpqcInspectionFlowConst.RoleQualityEngineerId.ToString(),
|
|
|
|
|
+ ApproverNames = "过程检验质量工程师",
|
|
|
|
|
+ MultiApproveMode = "Any",
|
|
|
|
|
+ },
|
|
|
|
|
+ Text = new FlowTextItem { X = 820, Y = 154, Value = "质量处置" },
|
|
|
|
|
+ },
|
|
|
|
|
+ new()
|
|
|
{
|
|
{
|
|
|
Id = "end",
|
|
Id = "end",
|
|
|
Type = "bpmn:endEvent",
|
|
Type = "bpmn:endEvent",
|
|
|
- X = 700,
|
|
|
|
|
|
|
+ X = 980,
|
|
|
Y = 120,
|
|
Y = 120,
|
|
|
Properties = new FlowProperties { NodeName = "结束" },
|
|
Properties = new FlowProperties { NodeName = "结束" },
|
|
|
- Text = new FlowTextItem { X = 700, Y = 154, Value = "结束" },
|
|
|
|
|
|
|
+ Text = new FlowTextItem { X = 980, Y = 154, Value = "结束" },
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
Edges = new List<ApprovalFlowEdgeItem>
|
|
Edges = new List<ApprovalFlowEdgeItem>
|
|
|
{
|
|
{
|
|
|
BuildEdge("edge-start-n1", "start", IpqcInspectionFlowConst.NodeInspect, 140, 120, 260, 120),
|
|
BuildEdge("edge-start-n1", "start", IpqcInspectionFlowConst.NodeInspect, 140, 120, 260, 120),
|
|
|
BuildEdge("edge-n1-n2", IpqcInspectionFlowConst.NodeInspect, IpqcInspectionFlowConst.NodeSupervisor, 340, 120, 460, 120),
|
|
BuildEdge("edge-n1-n2", IpqcInspectionFlowConst.NodeInspect, IpqcInspectionFlowConst.NodeSupervisor, 340, 120, 460, 120),
|
|
|
- BuildEdge("edge-n2-end", IpqcInspectionFlowConst.NodeSupervisor, "end", 540, 120, 660, 120),
|
|
|
|
|
|
|
+ BuildEdge("edge-n2-gw", IpqcInspectionFlowConst.NodeSupervisor, IpqcInspectionFlowConst.GatewayResult, 540, 120, 640, 120),
|
|
|
|
|
+ BuildEdge("edge-gw-n3", IpqcInspectionFlowConst.GatewayResult, IpqcInspectionFlowConst.NodeDisposition, 680, 120, 780, 120),
|
|
|
|
|
+ BuildEdge("edge-gw-end", IpqcInspectionFlowConst.GatewayResult, "end", 680, 120, 960, 120),
|
|
|
|
|
+ BuildEdge("edge-n3-end", IpqcInspectionFlowConst.NodeDisposition, "end", 860, 120, 960, 120),
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
return JsonSerializer.Serialize(item);
|
|
return JsonSerializer.Serialize(item);
|