Bladeren bron

fix: update ruled

hi-cactus! 2 jaren geleden
bovenliggende
commit
d1307167e7

+ 14 - 11
app/containers/DataGovernanceAuaitAnalysis/AnalysisReportDetailModal.tsx

@@ -14,14 +14,18 @@ export interface AnalysisReportDetailModalProps {
   // eslint-disable-next-line no-undef
   formView: Partial<IReport>
   tableColumns: Array<ColumnProps<IReport>>
+  onClose: () => void
+  dateRange: [string, string]
 }
 
 const DEFAULT_COLORS = ['#52c41a', '#fa8c16', '#1890ff', '#722ed1']
 
 export const AnalysisReportDetailModal = ({
+  onClose,
   visible,
   formView,
-  tableColumns
+  tableColumns,
+  dateRange
 }: AnalysisReportDetailModalProps) => {
   const lineChartRef = useRef<ECharts>()
   const lineChartElementRef = useRef<HTMLDivElement>()
@@ -76,9 +80,7 @@ export const AnalysisReportDetailModal = ({
     [lineDataSource]
   )
   const disableDate = (current: Moment) =>
-    current &&
-    (current < moment(formView?.startTime) ||
-      current > moment(formView?.endTime))
+    current && (current < moment(dateRange[0]) || current > moment(dateRange[1]))
 
   const queryLineReports = async (startTime: string, endTime: string) => {
     try {
@@ -86,7 +88,7 @@ export const AnalysisReportDetailModal = ({
 
       const data = await request(
         `${
-          api.qualityReportDetail + formView?.cronJobId
+          api.qualityReportDetail + formView?.id
         }?startTime=${startTime}&endTime=${endTime}`,
         { method: 'GET' }
       )
@@ -102,7 +104,7 @@ export const AnalysisReportDetailModal = ({
 
       const data = await request(
         `${
-          api.qualityReportDetail + formView?.cronJobId
+          api.qualityReportDetail + formView?.id
         }?startTime=${startTime}&endTime=${endTime}`,
         { method: 'GET' }
       )
@@ -140,17 +142,17 @@ export const AnalysisReportDetailModal = ({
   useEffect(() => {
     setLineDateRange([
       // @ts-ignore
-      formView?.startTime ? moment(formView.startTime) : undefined,
+      dateRange[0] ? moment(dateRange[0]) : undefined,
       // @ts-ignore
-      formView?.endTime ? moment(formView.endTime) : undefined
+      dateRange[1] ? moment(dateRange[1]) : undefined
     ])
     setTableDateRange([
       // @ts-ignore
-      formView?.startTime ? moment(formView.startTime) : undefined,
+      dateRange[0] ? moment(dateRange[0]) : undefined,
       // @ts-ignore
-      formView?.endTime ? moment(formView.endTime) : undefined
+      dateRange[1] ? moment(dateRange[1]) : undefined
     ])
-  }, [formView?.startTime, formView?.endTime])
+  }, [dateRange])
 
   useEffect(() => {
     if (formView?.startTime && formView?.endTime) {
@@ -173,6 +175,7 @@ export const AnalysisReportDetailModal = ({
       height="100%"
       destroyOnClose
       title="质量任务结果"
+      onClose={onClose}
     >
       <div>
         <div

+ 48 - 22
app/containers/DataGovernanceAuaitAnalysis/index.tsx

@@ -12,10 +12,11 @@ import { AnalysisReportDetailModal } from 'containers/DataGovernanceAuaitAnalysi
 import { IClassification } from 'containers/DataGovernanceQualityAudit/types'
 import moment, { Moment } from 'moment'
 import * as querystring from 'querystring'
+import { RouteComponentProps } from 'react-router'
 
-export default function DataGovernanceAuaitAnalysis(props: {
-  location: Location
-}) {
+export default function DataGovernanceAuaitAnalysis(
+  props: RouteComponentProps
+) {
   const qs: any = querystring.decode(
     props?.location?.search?.replace('?', '') ?? ''
   )
@@ -34,6 +35,7 @@ export default function DataGovernanceAuaitAnalysis(props: {
     qs.starTime ? moment(qs.starTime) : moment(),
     qs.endTime ? moment(qs.endTime) : moment()
   ])
+  const [detailRange, setDetailRange] = useState<[string, string]>(['', ''])
 
   const workbench = useMemo(() => {
     const total = reports
@@ -249,25 +251,29 @@ export default function DataGovernanceAuaitAnalysis(props: {
           dataIndex: 'accuracyErrorProbability'
         }
       ]
-    },
-    {
-      title: '操作',
-      fixed: 'right',
-      width: 50,
-      render: (_, data) => (
-        <span
-          onClick={() => {
-            setDetailVisible(true)
-            setDetailForm(data)
-          }}
-        >
-          详情
-        </span>
-      )
     }
   ]
+  const cloumns = tableColumns.concat({
+    title: '操作',
+    fixed: 'right',
+    width: 50,
+    render: (_, data) => (
+      <span onClick={() => handleClickDetail(data)}>详情</span>
+    )
+  })
 
-  const queryReports = async function(id?: number) {
+  const handleClickDetail = (data: IReport) => {
+    console.log(data, '~~~~~~')
+
+    setDetailVisible(true)
+    setDetailForm(data)
+    setDetailRange([
+      detailForm?.startTime || time[0].format('YYYY-MM-DD'),
+      detailForm?.endTime || time[1].format('YYYY-MM-DD')
+    ])
+  }
+
+  const queryReports = async function (id?: number) {
     const sysId = id || systemId
     if (!sysId || !time) {
       return
@@ -276,19 +282,31 @@ export default function DataGovernanceAuaitAnalysis(props: {
       setTableLoading(true)
       const selfTime = time.map((t) => t.format('YYYY-MM-DD'))
       const data = await request(
-        `${api.qualityReport}?systemId=${sysId}&starTime=${selfTime[0]}&endTime=${selfTime[1]}`,
+        `${api.qualityReport}?systemId=${sysId}&starTime=${
+          selfTime[0] ?? ''
+        }&endTime=${selfTime[1] ?? ''}`,
         {
           method: 'GET'
         }
       )
       // @ts-ignore
       setReports(data?.payload ?? [])
+
+      if (qs.taskId) {
+        // @ts-ignore
+        const detail = (data?.payload ?? [])?.find(
+          (o) => String(o.id) === qs.taskId
+        )
+        console.log(qs, detail, data?.payload, '-----')
+
+        detail && handleClickDetail(detail)
+      }
     } finally {
       setTableLoading(false)
     }
   }
 
-  const querySystem = async() => {
+  const querySystem = async () => {
     try {
       setTableLoading(true)
       const data = await request(`${api.getAuditClassification}`, {
@@ -405,14 +423,22 @@ export default function DataGovernanceAuaitAnalysis(props: {
               rowKey="id"
               loading={tableLoading}
               dataSource={reports}
-              columns={tableColumns}
+              columns={cloumns}
               pagination={false}
             />
             <div style={{ padding: 20 }} />
             <AnalysisReportDetailModal
               visible={detailVisible}
               tableColumns={tableColumns}
+              onClose={() => {
+                setDetailVisible(false)
+                if (qs.taskId) {
+                  // @ts-ignore
+                  props.history.replace(props.match.url)
+                }
+              }}
               formView={detailForm}
+              dateRange={detailRange}
             />
           </Box.Body>
         </Box>

+ 1 - 0
app/containers/DataGovernanceMarkRule/index.tsx

@@ -190,6 +190,7 @@ function DataDictionary() {
     if (isNumber(selectedSubjectsKey)) {
       queryDataBySelectedSubject()
     }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
   }, [selectedSubjectsKey])
 
   return (

+ 1 - 3
app/containers/DataGovernanceQualityAudit/components/MetadataModal.tsx

@@ -19,7 +19,7 @@
  */
 
 import React, { useEffect, useState } from 'react'
-import { Modal, Button, Table, Divider, Icon, Spin } from 'antd'
+import { Modal, Button, Table, Icon, Spin } from 'antd'
 import { ColumnProps } from 'antd/lib/table'
 import api from 'utils/api'
 import request from 'utils/request'
@@ -28,8 +28,6 @@ import classnames from 'classnames'
 import { ICatalogue, IViewBase } from 'containers/DataManagerView/types'
 import { RouteComponentWithParams } from 'utils/types'
 import { withRouter } from 'react-router-dom'
-import SubjectModal from 'containers/DataGovernanceQualityAudit/components/SubjectModal'
-import { IMetaParam } from 'containers/DataGovernanceQualityAudit/types'
 
 interface IMetadataModalProps extends RouteComponentWithParams {
   visible: boolean

+ 52 - 40
app/containers/DataGovernanceQualityAudit/components/QualityTaskFormModal.tsx

@@ -1,21 +1,15 @@
-import React, { useEffect, useMemo, useState } from 'react'
+import React, { useEffect, useState } from 'react'
 import {
-  Drawer,
-  Form,
   Button,
   Input,
-  Switch,
-  Select,
   Tag,
   Table,
   Divider,
-  Dropdown,
-  Menu,
   Popconfirm,
-  Icon,
-  Modal, Spin
+  Modal,
+  Spin
 } from 'antd'
-import { IClassification, IMetaParam, IQualityTask } from '../types'
+import { IMetaParam, IQualityTask } from '../types'
 import { ColumnProps } from 'antd/lib/table'
 import MetadataModal from 'containers/DataGovernanceQualityAudit/components/MetadataModal'
 import { IViewBase } from 'containers/View/types'
@@ -35,13 +29,13 @@ interface IQualityTaskFormModalProps {
 }
 
 const QualityTaskFormModal = ({
-                                formView,
-                                visible,
-                                loading,
-                                onCancel,
-                                pId,
-                                onSave
-                              }: IQualityTaskFormModalProps) => {
+  formView,
+  visible,
+  loading,
+  onCancel,
+  pId,
+  onSave
+}: IQualityTaskFormModalProps) => {
   const [metaVisible, setMetaVisible] = useState(false)
   const [viewLoading, setViewLoading] = useState(false)
 
@@ -79,17 +73,25 @@ const QualityTaskFormModal = ({
           <a
             onClick={() => {
               setSmVisible(true)
-              setSmFormView(data)
+              console.log(data,metaDataConfig,{
+                ...data,
+                subjectId: metaDataConfig.find((o) => o.fieldName === data.fieldName)?.subjectId
+              },'+++');
+
+              setSmFormView({
+                ...data,
+                subjectId: metaDataConfig.find((o) => o.fieldName === data.fieldName)?.subjectId
+              })
             }}
           >
             关联标准
           </a>
           {metaDataConfig.find((m) => m.fieldName === data.fieldName) && (
             <>
-              <Divider type='vertical' />
+              <Divider type="vertical" />
               <Popconfirm
-                title='确定取消关联?'
-                placement='bottom'
+                title="确定取消关联?"
+                placement="bottom"
                 onConfirm={() => handleResetSmForm(data)}
               >
                 <a>取消关联</a>
@@ -106,17 +108,21 @@ const QualityTaskFormModal = ({
       taskName,
       viewId: selection?.[0]?.id,
       metadataName: selection?.[0]?.name,
-      metadataConfig: JSON.stringify(metaDataConfig),
+      metadataConfig: JSON.stringify(metaDataConfig.filter((m) => m.subjectId)),
       pId
     })
   }
 
   const handleSaveSmForm = (data: IDataSubject) => {
+    console.log(smFormView, '===')
+
     setMateDataConfig((meta) => {
       return [
         ...meta.filter((s) => s.fieldName !== smFormView.fieldName),
         {
-          ...smFormView
+          ...smFormView,
+          subjectId: data.id,
+          subjectName: data.standardName
         }
       ]
     })
@@ -127,27 +133,29 @@ const QualityTaskFormModal = ({
     // selection
     setMateDataConfig((meta) => {
       return [
-        ...meta.filter((s) => s.fieldName !== (smFormView?.fieldName || data?.fieldName))
+        ...meta.filter(
+          (s) => s.fieldName !== (smFormView?.fieldName || data?.fieldName)
+        )
       ]
     })
   }
 
-  const queryViewByID = async() => {
+  const queryViewByID = async () => {
     try {
       setTaskName(formView?.taskName)
 
       setViewLoading(true)
       if (formView?.viewId) {
         const data = await request(api.view + '/' + formView.viewId)
-        setSelection(
+        setSelection([
           // @ts-ignore
-          [{
+          {
             name: formView?.metadataName,
             metadataConfig: formView?.metadataConfig,
             // @ts-ignore
             model: data.payload.model
-          }]
-        )
+          }
+        ])
       } else {
         setSelection([])
       }
@@ -168,19 +176,19 @@ const QualityTaskFormModal = ({
     } catch (e) {
       console.log(e)
     }
-    const model = Object.keys(next)?.map((k) => ({
-      fieldName: k,
-      fieldType: next?.[k]?.visualType
-    })) as IMetaParam[] || []
+    const model =
+      (Object.keys(next)?.map((k) => ({
+        fieldName: k,
+        fieldType: next?.[k]?.visualType
+      })) as unknown as IMetaParam[]) || []
     setTableData(model)
-
   }, [selection])
 
   useEffect(() => {
     if (!visible) {
-      console.log(111)
       setTableData([])
       setSelection([])
+      setTaskName('')
     }
   }, [visible])
 
@@ -205,13 +213,13 @@ const QualityTaskFormModal = ({
       visible={visible}
       onCancel={onCancel}
       destroyOnClose
-      width='80%'
+      width="80%"
       footer={
         <>
           <Button onClick={onCancel} style={{ marginRight: 6 }}>
             取 消
           </Button>
-          <Button disabled={loading} type='primary' onClick={handleSave}>
+          <Button disabled={loading} type="primary" onClick={handleSave}>
             保 存
           </Button>
         </>
@@ -228,7 +236,9 @@ const QualityTaskFormModal = ({
         >
           <h3>质量任务</h3>
         </div>
-        <div style={{ margin: '10px 0', display: 'flex', alignItems: 'center' }}>
+        <div
+          style={{ margin: '10px 0', display: 'flex', alignItems: 'center' }}
+        >
           <label>质量任务名称:</label>
           <Input
             value={taskName}
@@ -236,7 +246,9 @@ const QualityTaskFormModal = ({
             style={{ width: 300 }}
           />
         </div>
-        <div style={{ margin: '10px 0', display: 'flex', alignItems: 'center' }}>
+        <div
+          style={{ margin: '10px 0', display: 'flex', alignItems: 'center' }}
+        >
           <label>元数据:</label>
           <Button onClick={() => setMetaVisible(true)}>选择元数据</Button>
           <div
@@ -259,7 +271,7 @@ const QualityTaskFormModal = ({
           <p style={{ margin: '10px 0' }}>字段映射</p>
           <Table
             columns={paramsColumns}
-            rowKey='fieldName'
+            rowKey="fieldName"
             dataSource={tableData}
           />
         </div>

+ 5 - 5
app/containers/DataGovernanceQualityAudit/components/ScheduleFormModal.tsx

@@ -35,22 +35,22 @@ const getCronExpressionByPartition = (partition: {
   let cronExpression = ''
   switch (periodUnit as SchedulePeriodUnit) {
     case 'Minute':
-      cronExpression = `0 0/${interval} * * * *`
+      cronExpression = `0 */${interval} * * * ?`
       break
     case 'Hour':
-      cronExpression = `0 0 0/${interval} * * *`
+      cronExpression = `0 0 0/${interval} * * ?`
       break
     case 'Day':
-      cronExpression = `0 0 0 1/${interval} * *`
+      cronExpression = `0 0 0 1/${interval} * ?`
       break
     case 'Week':
       cronExpression = `0 0 0 ? * ${interval}`
       break
     case 'Month':
-      cronExpression = `0 0 0 ? 1/${interval} *`
+      cronExpression = `0 0 0 1 1/${interval} ? *`
       break
     case 'Year':
-      cronExpression = `* * * * * * 0/${interval}`
+      cronExpression = `0 0 0 1 1 ? 1/${interval}`
       break
   }
   return cronExpression

+ 7 - 1
app/containers/DataGovernanceQualityAudit/components/SubjectModal.tsx

@@ -51,7 +51,7 @@ interface ISubjectModalProps extends RouteComponentWithParams {
 }
 
 const SubjectModal = (props: ISubjectModalProps) => {
-  const { visible, onCancel, onSave, match } = props
+  const { visible, onCancel, onSave, match, formView } = props
 
   const [tableLoading, setTableLoading] = useState(false)
   const [dataSubject, setDataSubject] = useState<IDataSubject[]>([])
@@ -162,6 +162,12 @@ const SubjectModal = (props: ISubjectModalProps) => {
   }, [])
 
   useEffect(() => {
+    console.log(formView, '====');
+
+      setTableRowSelection(formView?.subjectId as unknown as number)
+  }, [formView])
+
+  useEffect(() => {
     if (isNumber(selectedSubjectsKey)) {
       queryDataBySelectedSubject()
     }

+ 45 - 35
app/containers/DataGovernanceQualityAudit/index.tsx

@@ -1,3 +1,4 @@
+/* eslint-disable space-before-function-paren */
 import React, { useEffect, useState } from 'react'
 import Container, { ContainerBody } from 'components/Container'
 import Helmet from 'react-helmet'
@@ -28,7 +29,9 @@ import ScheduleFormModal from 'containers/DataGovernanceQualityAudit/components/
 // import header from 'containers/Display/Editor/Header'
 import { RouteComponentProps, withRouter } from 'react-router-dom'
 
-function DataGovernanceQualityAudit(props: RouteComponentProps) {
+function DataGovernanceQualityAudit(
+  props: RouteComponentProps<{ projectId: string }>
+) {
   const { history, match } = props
 
   const [tableLoading, setTableLoading] = useState(false)
@@ -49,7 +52,7 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
 
   const [scVisible, setScVisible] = useState(false)
   const [scLoading, setSCLoading] = useState(false)
-  const [scForm, setSCForm] = useState<IClassification>({})
+  const [scForm] = useState<IClassification>({})
 
   const tableColumns: Array<ColumnProps<IQualityTask>> = [
     {
@@ -76,21 +79,24 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
           >
             编辑
           </a>
-          <Divider type='vertical' />
+          <Divider type="vertical" />
           <Dropdown
             overlay={
               <Menu>
                 <Menu.Item
-                  key='00'
+                  key="00"
                   onClick={() => {
                     // eslint-disable-next-line react/prop-types
-                    history.push(`/project/${match.params.projectId}/dataGovernance/auditAnalysiss?systemId=${data.pId}&starTime=${data.startTime}&endTime=${data.endTime}`)
+                    history.push(
+                      // eslint-disable-next-line react/prop-types
+                      `/project/${match.params.projectId}/dataGovernance/auditAnalysiss?systemId=${data.pId}&starTime=${data.startTime}&endTime=${data.endTime}&taskId=${data.id}`
+                    )
                   }}
                 >
                   稽查历史
                 </Menu.Item>
                 <Menu.Item
-                  key='0'
+                  key="0"
                   onClick={() => {
                     setQtForm(data)
                     setScVisible(true)
@@ -98,19 +104,19 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
                 >
                   设置调度
                 </Menu.Item>
-                <Menu.Item key='1'>
+                <Menu.Item key="1">
                   <Popconfirm
-                    title='确定立即稽查吗?'
-                    placement='bottom'
+                    title="确定立即稽查吗?"
+                    placement="bottom"
                     onConfirm={() => handleSetDispatchRightNow(data)}
                   >
                     <a>立即稽查</a>
                   </Popconfirm>
                 </Menu.Item>
-                <Menu.Item key='3'>
+                <Menu.Item key="3">
                   <Popconfirm
-                    title='确定删除?'
-                    placement='bottom'
+                    title="确定删除?"
+                    placement="bottom"
                     onConfirm={() => handleDeleteTask(data.id)}
                   >
                     <a>删除</a>
@@ -121,7 +127,7 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
           >
             <a>
               {' '}
-              更多 <Icon type='down' />
+              更多 <Icon type="down" />
             </a>
           </Dropdown>
         </>
@@ -134,10 +140,10 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
     setCfVisible(true)
   }
 
-  const handleDeleteTreeItem = async(c: IClassification) => {
+  const handleDeleteTreeItem = async (c: IClassification) => {
     try {
       setTreeLoading(true)
-      const data = await request(`${api.deleteAuditClassification}${c.id}`, {
+      const data = await request(`${api.deleteDataRules}${c.id}`, {
         method: 'DELETE'
       })
       // @ts-ignore
@@ -169,19 +175,19 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
               setSelectedKey(c.id)
             }}
           >
-            <Icon type='file' />
+            <Icon type="file" />
             {c.name}
           </span>
           <Dropdown
             overlay={() => (
               <Menu>
-                <Menu.Item key='0' onClick={() => handleEditTreeItem(c)}>
+                <Menu.Item key="0" onClick={() => handleEditTreeItem(c)}>
                   编辑
                 </Menu.Item>
-                <Menu.Item key='1'>
+                <Menu.Item key="1">
                   <Popconfirm
-                    title='确定删除?'
-                    placement='bottom'
+                    title="确定删除?"
+                    placement="bottom"
                     onConfirm={() => handleDeleteTreeItem(c)}
                   >
                     <a>删除</a>
@@ -191,14 +197,14 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
             )}
             trigger={['click']}
           >
-            <Icon type='more' />
+            <Icon type="more" />
           </Dropdown>
         </div>
       ))}
     </>
   )
 
-  const handleSetDispatchRightNow = async(data: IQualityTask) => {
+  const handleSetDispatchRightNow = async (data: IQualityTask) => {
     try {
       setTableLoading(true)
       const result = await request(`${api.setDispatchRightNow}${data.id}`, {
@@ -217,7 +223,7 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
     }
   }
 
-  const handleDispatch = async(form) => {
+  const handleDispatch = async (form) => {
     try {
       setSCLoading(true)
       const result = await request(`${api.setDispatch}${qtForm.id}`, {
@@ -237,7 +243,7 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
       })
       // @ts-ignore
       if (result.header.code === 200) {
-        setScVisible(false);
+        setScVisible(false)
         message.success({ content: '设置调度成功' })
         queryQualityTasks()
       }
@@ -246,7 +252,7 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
     }
   }
 
-  const queryClassifications = async() => {
+  const queryClassifications = async () => {
     try {
       setTreeLoading(true)
       const data = await request(api.getAuditClassification, { method: 'GET' })
@@ -259,7 +265,7 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
     }
   }
 
-  const queryQualityTasks = async() => {
+  const queryQualityTasks = async () => {
     try {
       setTableLoading(true)
       const data = await request(`${api.getQualityTask}?pId=${selectedKey}`, {
@@ -272,7 +278,7 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
     }
   }
 
-  const handleSaveCfForm = async(form: IClassification) => {
+  const handleSaveCfForm = async (form: IClassification) => {
     try {
       setCfLoading(true)
       const url = cfForm.id
@@ -292,7 +298,7 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
     }
   }
 
-  const handleSaveQtForm = async(view) => {
+  const handleSaveQtForm = async (view) => {
     try {
       setQtLoading(true)
       const url = qtForm?.id
@@ -312,7 +318,7 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
     }
   }
 
-  const handleDeleteTask = async(id: number) => {
+  const handleDeleteTask = async (id: number) => {
     try {
       setTableLoading(true)
       const data = await request(`${api.deleteQualityTask}${id}`, {
@@ -336,11 +342,12 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
     if (selectedKey) {
       queryQualityTasks()
     }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
   }, [selectedKey])
 
   return (
     <Container>
-      <Helmet title='质量稽核' />
+      <Helmet title="质量稽核" />
       <ContainerBody>
         <Box>
           <Box.Header>
@@ -358,7 +365,7 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
                       setCfVisible(true)
                     }}
                   >
-                    <Icon type='plus' />
+                    <Icon type="plus" />
                   </div>
                 </div>
                 <div className={styles.treeContent}>
@@ -371,8 +378,8 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
               <div style={{ flex: 1 }}>
                 <div style={{ padding: '0 0 20px' }}>
                   <Button
-                    type='primary'
-                    icon='plus'
+                    type="primary"
+                    icon="plus"
                     onClick={() => {
                       setQtVisible(true)
                       setQtForm(null)
@@ -384,7 +391,7 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
                 <Table
                   style={{ flex: 1 }}
                   bordered
-                  rowKey='id'
+                  rowKey="id"
                   loading={tableLoading}
                   dataSource={qualityTasks}
                   columns={tableColumns}
@@ -410,7 +417,10 @@ function DataGovernanceQualityAudit(props: RouteComponentProps) {
         formView={qtForm}
         onSave={handleSaveQtForm}
         loading={qtLoading}
-        onCancel={() => setQtVisible(false)}
+        onCancel={() => {
+          setQtVisible(false)
+          setQtForm(null)
+        }}
       />
       <ScheduleFormModal
         visible={scVisible}

+ 1 - 1
app/containers/DataGovernanceQualityAudit/types.ts

@@ -48,6 +48,6 @@ export interface IMetaParam {
   fieldAlias: string
   fieldName: string
   fieldType: string
-  subjectId: string
+  subjectId: string | number
   subjectName: string
 }