1- import { Form , message , Modal } from "antd" ;
1+ import { Alert , Descriptions , Form , message , Modal } from "antd" ;
22import React from "react" ;
33import { Upload } from "./upload" ;
4- import { importWorkflow } from "@/api/workflow" ;
4+ import { importWorkflow , type WorkflowImportRequest , workflowCodeExists } from "@/api/workflow" ;
55import { FlowMessageKey , FlowMessageRegistry } from "@coding-flow/flow-core" ;
6+ import {
7+ readImportWorkflowInfo ,
8+ validateResetImportCode ,
9+ type WorkflowImportFileInfo
10+ } from "./import-file" ;
11+ import styles from "./design_import.module.scss" ;
612
13+ export type WorkflowImportScene = 'MANAGEMENT' | 'RESET' ;
714
815interface DesignImportProps {
916 open : boolean ;
1017 onClose : ( ) => void ;
18+ scene ?: WorkflowImportScene ;
19+ currentWorkflowCode ?: string ;
20+ onImported ?: ( workId : string ) => void ;
1121}
1222
23+ type ImportFormValues = Pick < WorkflowImportRequest , 'file' > ;
24+
1325export const DesignImport :React . FC < DesignImportProps > = ( props ) => {
1426
1527 const [ form ] = Form . useForm ( ) ;
28+ const [ submitting , setSubmitting ] = React . useState ( false ) ;
29+ const [ fileInfo , setFileInfo ] = React . useState < WorkflowImportFileInfo > ( ) ;
30+ const resetImport = props . scene === 'RESET' ;
31+
32+ React . useEffect ( ( ) => {
33+ if ( ! props . open ) {
34+ form . resetFields ( ) ;
35+ setFileInfo ( undefined ) ;
36+ }
37+ } , [ form , props . open ] ) ;
38+
39+ const executeImport = async ( values : ImportFormValues ) => {
40+ setSubmitting ( true ) ;
41+ try {
42+ const result = await importWorkflow ( {
43+ file : values . file ,
44+ mode : resetImport ? 'REPLACE' : 'INCREMENTAL'
45+ } ) ;
46+ if ( result . success ) {
47+ message . success (
48+ FlowMessageRegistry . getInstance ( ) . get ( FlowMessageKey . DESIGN_IMPORT_SUCCESS )
49+ ) ;
50+ props . onImported ?.( result . data as string ) ;
51+ props . onClose ( ) ;
52+ }
53+ } finally {
54+ setSubmitting ( false ) ;
55+ }
56+ } ;
57+
58+ const confirmImport = ( values : ImportFormValues , info : WorkflowImportFileInfo ) => {
59+ Modal . confirm ( {
60+ title : resetImport ? '确认重置导入' : '确认导入流程' ,
61+ content : resetImport
62+ ? `重置导入将使用“${ info . title } (${ info . code } )”完全覆盖当前流程的全部版本和配置。该操作不可撤销,确认继续吗?`
63+ : `流程编码“${ info . code } ”已存在,系统将自动生成新编码并创建一条独立流程。确认继续吗?` ,
64+ okText : resetImport ? '确认重置' : '确认导入' ,
65+ cancelText : '取消' ,
66+ okButtonProps : resetImport ? { danger : true } : undefined ,
67+ onOk : ( ) => executeImport ( values )
68+ } ) ;
69+ } ;
70+
71+ const submitImport = async ( values : ImportFormValues ) => {
72+ let info : WorkflowImportFileInfo ;
73+ try {
74+ info = readImportWorkflowInfo ( values . file ) ;
75+ if ( resetImport ) {
76+ validateResetImportCode ( values . file , props . currentWorkflowCode || '' ) ;
77+ }
78+ } catch ( error ) {
79+ message . error ( error instanceof Error ? error . message : '无法解析导入流程信息' ) ;
80+ return ;
81+ }
1682
83+ if ( resetImport ) {
84+ confirmImport ( values , info ) ;
85+ return ;
86+ }
87+
88+ setSubmitting ( true ) ;
89+ try {
90+ const existsResult = await workflowCodeExists ( info . code ) ;
91+ if ( existsResult . data === true ) {
92+ confirmImport ( values , info ) ;
93+ return ;
94+ }
95+ } finally {
96+ setSubmitting ( false ) ;
97+ }
98+ await executeImport ( values ) ;
99+ } ;
100+
101+ const handleFileChange = ( changedValues : Partial < ImportFormValues > ) => {
102+ if ( changedValues . file === undefined ) {
103+ return ;
104+ }
105+ if ( ! changedValues . file ) {
106+ setFileInfo ( undefined ) ;
107+ return ;
108+ }
109+ try {
110+ setFileInfo ( readImportWorkflowInfo ( changedValues . file ) ) ;
111+ } catch ( error ) {
112+ setFileInfo ( undefined ) ;
113+ message . error ( error instanceof Error ? error . message : '无法解析导入流程信息' ) ;
114+ }
115+ } ;
17116
18117 return (
19118 < Modal
20- title = { " 流程导入" }
119+ title = { resetImport ? '重置导入' : ' 流程导入' }
21120 open = { props . open }
22121 onCancel = { props . onClose }
23122 destroyOnHidden = { true }
123+ okText = { resetImport ? '重置导入' : '导入' }
124+ confirmLoading = { submitting }
24125 onOk = { ( ) => {
25126 form . submit ( ) ;
26127 } }
27128 >
129+ < Alert
130+ className = { styles . notice }
131+ type = { resetImport ? 'warning' : 'info' }
132+ showIcon = { true }
133+ message = { resetImport ? '重置导入说明' : '流程导入说明' }
134+ description = { resetImport
135+ ? '仅允许导入与当前流程编码一致的文件。确认后,当前流程的全部版本和配置将被导入数据覆盖。'
136+ : '系统会检测导入流程的编码。编码未占用时保留原编码;编码已存在时自动生成新编码,并创建一条独立流程。' }
137+ />
28138 < Form
29139 form = { form }
30140 layout = "vertical"
31- onFinish = { ( values ) => {
32- importWorkflow ( values ) . then ( ( res ) => {
33- if ( res . success ) {
34- message . success (
35- FlowMessageRegistry . getInstance ( ) . get ( FlowMessageKey . DESIGN_IMPORT_SUCCESS )
36- ) ;
37- props . onClose ( ) ;
38- }
39- } )
40- } }
141+ onFinish = { submitImport }
142+ onValuesChange = { handleFileChange }
41143 >
42144 < Form . Item
43145 name = "file"
44146 label = { "流程设计文件" }
45147 help = { "请选择导出的设计文件,文件格式为json格式" }
148+ rules = { [ { required : true , message : '请选择流程设计文件' } ] }
46149 >
47150 < Upload />
48151 </ Form . Item >
49-
152+ { fileInfo && (
153+ < Descriptions
154+ size = "small"
155+ bordered = { true }
156+ column = { 1 }
157+ items = { [
158+ { key : 'title' , label : '流程名称' , children : fileInfo . title } ,
159+ { key : 'code' , label : '流程编码' , children : fileInfo . code }
160+ ] }
161+ />
162+ ) }
50163 </ Form >
51164 </ Modal >
52165 )
53- }
166+ }
0 commit comments