Преглед на файлове

流程设计页面上锁等节点提交表单tab下部分表单添加必填和必填校验功能

wyn преди 1 ден
родител
ревизия
6165ed880e
променени са 2 файла, в които са добавени 91 реда и са изтрити 6 реда
  1. 23 2
      src/components/ProcessDesigner.tsx
  2. 68 4
      src/utils/workflowNodeTypes.ts

+ 23 - 2
src/components/ProcessDesigner.tsx

@@ -152,6 +152,7 @@ import FormUploadField from './FormUploadField';
 import {
   isWorkflowCoLockFamilySubmitFormOptional,
   isWorkflowCoLockType,
+  isWorkflowDesignerIsolationSchemeFieldRequired,
   isWorkflowIsolationSchemePanelType,
   isWorkflowLockSchemeType,
   isWorkflowUnlockCoLockType,
@@ -3945,7 +3946,8 @@ export default function ProcessDesigner() {
                                 !!nodeConfig.isolationNodeUuid && (
                                 <div>
                                   <label className="block text-sm font-medium text-gray-700 mb-2">
-                                    共锁人(可多选)
+                                    共锁人(可多选){' '}
+                                    <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
                                   </label>
                                   <Select
                                     mode="multiple"
@@ -4055,7 +4057,8 @@ export default function ProcessDesigner() {
                                   </div>
                                   <div>
                                     <label className="block text-sm font-medium text-gray-700 mb-2">
-                                      共锁人(可多选)
+                                      共锁人(可多选){' '}
+                                      <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
                                     </label>
                                     <Select
                                       mode="multiple"
@@ -4083,6 +4086,12 @@ export default function ProcessDesigner() {
                                   <div>
                                     <label className="block text-sm font-medium text-gray-700 mb-2">
                                       隔离方式
+                                      {isWorkflowDesignerIsolationSchemeFieldRequired(selectedDataType) && (
+                                        <>
+                                          {' '}
+                                          <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
+                                        </>
+                                      )}
                                     </label>
                                     <Select
                                       value={nodeConfig.isolationType || undefined}
@@ -4105,6 +4114,12 @@ export default function ProcessDesigner() {
                                   <div>
                                     <label className="block text-sm font-medium text-gray-700 mb-2">
                                       隔离点选择(可多选)
+                                      {isWorkflowDesignerIsolationSchemeFieldRequired(selectedDataType) && (
+                                        <>
+                                          {' '}
+                                          <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
+                                        </>
+                                      )}
                                     </label>
                                     <Select
                                       mode="multiple"
@@ -4160,6 +4175,12 @@ export default function ProcessDesigner() {
                                       <div>
                                         <label className="block text-sm font-medium text-gray-700 mb-2">
                                           上锁人
+                                          {isWorkflowDesignerIsolationSchemeFieldRequired(selectedDataType) && (
+                                            <>
+                                              {' '}
+                                              <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
+                                            </>
+                                          )}
                                         </label>
                                         <Select
                                           value={nodeConfig.lockPerson || undefined}

+ 68 - 4
src/utils/workflowNodeTypes.ts

@@ -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;