|
|
@@ -43,12 +43,61 @@ export type WorkflowDesignerMergedNodeInput = {
|
|
|
mergedData: Record<string, unknown>;
|
|
|
};
|
|
|
|
|
|
+function hasNonEmptyWorkflowIdList(value: unknown): boolean {
|
|
|
+ if (Array.isArray(value)) return value.length > 0;
|
|
|
+ if (typeof value === 'string' && value.trim() !== '') {
|
|
|
+ try {
|
|
|
+ const parsed = JSON.parse(value);
|
|
|
+ return Array.isArray(parsed) && parsed.length > 0;
|
|
|
+ } catch {
|
|
|
+ return value.split(',').some((s) => s.trim() !== '');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+/** 上锁/解锁:提交表单页签中隔离方式、隔离点、上锁人(挂牌时)是否标必填 */
|
|
|
+export function isWorkflowDesignerIsolationSchemeFieldRequired(
|
|
|
+ t: string | undefined | null
|
|
|
+): boolean {
|
|
|
+ return isWorkflowLockSchemeType(t) || isWorkflowUnlockSchemeType(t);
|
|
|
+}
|
|
|
+
|
|
|
+function validateWorkflowDesignerIsolationSchemeFields(
|
|
|
+ mergedData: Record<string, unknown>,
|
|
|
+ nodeName: string
|
|
|
+): string | null {
|
|
|
+ const isolationType = mergedData.isolationType;
|
|
|
+ if (
|
|
|
+ isolationType === undefined ||
|
|
|
+ isolationType === null ||
|
|
|
+ String(isolationType).trim() === ''
|
|
|
+ ) {
|
|
|
+ return `节点「${nodeName}」未选择隔离方式,请在「提交表单」页签中完善`;
|
|
|
+ }
|
|
|
+ if (!hasNonEmptyWorkflowIdList(mergedData.isolationPoints)) {
|
|
|
+ return `节点「${nodeName}」未选择隔离点,请在「提交表单」页签中完善`;
|
|
|
+ }
|
|
|
+ if (String(isolationType) === '1') {
|
|
|
+ const lockPerson = mergedData.lockPerson;
|
|
|
+ if (
|
|
|
+ lockPerson === undefined ||
|
|
|
+ lockPerson === null ||
|
|
|
+ String(lockPerson).trim() === ''
|
|
|
+ ) {
|
|
|
+ return `节点「${nodeName}」未选择上锁人,请在「提交表单」页签中完善`;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* 流程设计器保存前校验「提交表单」页签:
|
|
|
* - 除创建作业、共锁/解除共锁族外,提交表单必填;
|
|
|
- * - 共锁须选择关联上锁任务(isolationNodeUuid,与面板红星一致);
|
|
|
+ * - 上锁/解锁须选择隔离方式、隔离点;隔离方式为「上锁挂牌」时须选择上锁人(与面板红星一致);
|
|
|
+ * - 共锁须选择关联上锁任务(isolationNodeUuid)、共锁人(与面板红星一致);
|
|
|
* - 解锁须选择关联上锁任务(isolationNodeUuid);
|
|
|
- * - 解除共锁须选择关联共锁任务(isolationNodeUuid)。
|
|
|
+ * - 解除共锁须选择关联共锁任务(isolationNodeUuid)、共锁人(与面板红星一致)。
|
|
|
*/
|
|
|
export function validateWorkflowDesignerSubmitTabForSave(
|
|
|
items: WorkflowDesignerMergedNodeInput[]
|
|
|
@@ -65,28 +114,43 @@ export function validateWorkflowDesignerSubmitTabForSave(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (isWorkflowLockSchemeType(dataType)) {
|
|
|
+ const name = String(mergedData.label ?? id);
|
|
|
+ const isolationErr = validateWorkflowDesignerIsolationSchemeFields(mergedData, name);
|
|
|
+ if (isolationErr) return isolationErr;
|
|
|
+ }
|
|
|
+
|
|
|
if (isWorkflowCoLockType(dataType)) {
|
|
|
const iso = mergedData.isolationNodeUuid;
|
|
|
if (iso === undefined || iso === null || String(iso).trim() === '') {
|
|
|
const name = String(mergedData.label ?? id);
|
|
|
return `节点「${name}」未选择上锁任务,请在「提交表单」页签中完善`;
|
|
|
}
|
|
|
+ if (!hasNonEmptyWorkflowIdList(mergedData.coLockPersons)) {
|
|
|
+ const name = String(mergedData.label ?? id);
|
|
|
+ return `节点「${name}」未选择共锁人,请在「提交表单」页签中完善`;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (isWorkflowUnlockSchemeType(dataType)) {
|
|
|
+ const name = String(mergedData.label ?? id);
|
|
|
const iso = mergedData.isolationNodeUuid;
|
|
|
if (iso === undefined || iso === null || String(iso).trim() === '') {
|
|
|
- const name = String(mergedData.label ?? id);
|
|
|
return `节点「${name}」未选择上锁任务,请在「提交表单」页签中完善`;
|
|
|
}
|
|
|
+ const isolationErr = validateWorkflowDesignerIsolationSchemeFields(mergedData, name);
|
|
|
+ if (isolationErr) return isolationErr;
|
|
|
}
|
|
|
|
|
|
if (isWorkflowUnlockCoLockType(dataType)) {
|
|
|
+ const name = String(mergedData.label ?? id);
|
|
|
const iso = mergedData.isolationNodeUuid;
|
|
|
if (iso === undefined || iso === null || String(iso).trim() === '') {
|
|
|
- const name = String(mergedData.label ?? id);
|
|
|
return `节点「${name}」未选择共锁任务,请在「提交表单」页签中完善`;
|
|
|
}
|
|
|
+ if (!hasNonEmptyWorkflowIdList(mergedData.coLockPersons)) {
|
|
|
+ return `节点「${name}」未选择共锁人,请在「提交表单」页签中完善`;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
return null;
|