Explorar el Código

call meta api

hi-cactus! hace 3 años
padre
commit
938e308149

+ 114 - 90
app/containers/DataGovernanceQualityAudit/components/QualityTaskFormModal.tsx

@@ -13,7 +13,7 @@ import {
   Menu,
   Popconfirm,
   Icon,
-  Modal
+  Modal, Spin
 } from 'antd'
 import { IClassification, IMetaParam, IQualityTask } from '../types'
 import { ColumnProps } from 'antd/lib/table'
@@ -21,6 +21,8 @@ import MetadataModal from 'containers/DataGovernanceQualityAudit/components/Meta
 import { IViewBase } from 'containers/View/types'
 import SubjectModal from 'containers/DataGovernanceQualityAudit/components/SubjectModal'
 import { IDataSubject } from 'containers/DataGovernanceMarkRule/types'
+import request from 'utils/request'
+import api from 'utils/api'
 
 interface IQualityTaskFormModalProps {
   pId: number
@@ -33,32 +35,22 @@ 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)
 
   const [taskName, setTaskName] = useState<IQualityTask['taskName']>()
   // @ts-ignore
   const [selection, setSelection] = useState<IViewBase[]>([])
 
   const [tableData, setTableData] = useState<IMetaParam[]>([])
-
-  // const tableData = useMemo<IMetaParam[]>(() => {
-  //   return selection?.map((s) => s?.metadataConfig).reduce((c, n) => {
-  //     let next = []
-  //     try {
-  //       next = JSON.parse(n ?? '[]')
-  //     } catch (e) {
-  //       console.log(e)
-  //     }
-  //     return [...c, ...next]
-  //   }, [] as IMetaParam[])
-  // }, [selection])
+  const [metaDataConfig, setMateDataConfig] = useState<IMetaParam[]>([])
 
   const [smVisible, setSmVisible] = useState(false)
   const [smFormView, setSmFormView] = useState<IMetaParam>()
@@ -92,12 +84,12 @@ const QualityTaskFormModal = ({
           >
             关联标准
           </a>
-          {data.fieldAlias && (
+          {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>
@@ -111,50 +103,80 @@ const QualityTaskFormModal = ({
 
   const handleSave = () => {
     onSave({
+      taskName,
       viewId: selection?.[0]?.id,
       metadataName: selection?.[0]?.name,
-      metadataConfig: JSON.stringify(tableData),
+      metadataConfig: JSON.stringify(metaDataConfig),
       pId
     })
   }
 
   const handleSaveSmForm = (data: IDataSubject) => {
-    setTableData([
-      ...tableData.filter((s) => s.fieldName !== smFormView.fieldName),
-      {
-        ...smFormView,
-        fieldAlias: data.id + ''
-      }
-    ])
+    setMateDataConfig((meta) => {
+      return [
+        ...meta.filter((s) => s.fieldName !== smFormView.fieldName),
+        {
+          ...smFormView
+        }
+      ]
+    })
+
     setSmVisible(false)
   }
   const handleResetSmForm = (data: IMetaParam) => {
     // selection
-    setTableData([
-      ...tableData.filter((s) => s.fieldName !== data.fieldName),
-      {
-        ...data,
-        fieldAlias: ''
+    setMateDataConfig((meta) => {
+      return [
+        ...meta.filter((s) => s.fieldName !== smFormView.fieldName)
+      ]
+    })
+  }
+
+  const queryViewByID = async() => {
+    try {
+      setTaskName(formView?.taskName)
+
+      setViewLoading(true)
+      if (formView?.viewId) {
+        const data = await request(api.view + '/' + formView.viewId)
+        setSelection(
+          // @ts-ignore
+          [{
+            name: formView?.metadataName,
+            metadataConfig: formView?.metadataConfig,
+            // @ts-ignore
+            model: data.payload.model
+          }]
+        )
+      } else {
+        setSelection([])
       }
-    ])
+    } finally {
+      setViewLoading(false)
+    }
   }
 
   useEffect(() => {
-    setTaskName(formView?.taskName)
-    setSelection(
-      // @ts-ignore
-      formView?.metadataName
-        ? [
-            {
-              name: formView?.metadataName,
-              metadataConfig: formView?.metadataConfig
-            }
-          ]
-        : []
-    )
+    queryViewByID()
   }, [formView])
 
   useEffect(() => {
+    const d = selection?.map((s) => s?.model)?.[0] || '{}'
+    let next = {}
+    try {
+      next = JSON.parse(d)
+    } catch (e) {
+      console.log(e)
+    }
+    const model = Object.keys(next)?.map((k) => ({
+      fieldName: k,
+      fieldType: next?.[k]?.visualType
+    })) as IMetaParam[] || []
+    setTableData(model)
+
+  }, [selection])
+
+  useEffect(() => {
     const d = selection
       ?.map((s) => s?.metadataConfig)
       .reduce((c, n) => {
@@ -166,7 +188,7 @@ const QualityTaskFormModal = ({
         }
         return [...c, ...next]
       }, [] as IMetaParam[])
-    setTableData(d)
+    setMateDataConfig(d)
   }, [selection])
 
   return (
@@ -175,63 +197,65 @@ 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>
         </>
       }
       // placement={'bottom'}
     >
-      <div
-        style={{
-          display: 'flex',
-          alignItems: 'center',
-          justifyContent: 'space-between'
-        }}
-      >
-        <h3>质量任务</h3>
-      </div>
-      <div style={{ margin: '10px 0', display: 'flex', alignItems: 'center' }}>
-        <label>质量任务名称:</label>
-        <Input
-          value={taskName}
-          onChange={(e) => setTaskName(e.target.value)}
-          style={{ width: 300 }}
-        />
-      </div>
-      <div style={{ margin: '10px 0', display: 'flex', alignItems: 'center' }}>
-        <label>元数据:</label>
-        <Button onClick={() => setMetaVisible(true)}>选择元数据</Button>
+      <Spin spinning={viewLoading}>
         <div
           style={{
-            margin: '0 10px',
             display: 'flex',
             alignItems: 'center',
-            flexWrap: 'wrap',
-            flex: 1
+            justifyContent: 'space-between'
           }}
         >
-          {selection.map((c, idx) => (
-            <Tag key={c.id || idx} closable onClose={() => setSelection([])}>
-              {c.name}
-            </Tag>
-          ))}
+          <h3>质量任务</h3>
+        </div>
+        <div style={{ margin: '10px 0', display: 'flex', alignItems: 'center' }}>
+          <label>质量任务名称:</label>
+          <Input
+            value={taskName}
+            onChange={(e) => setTaskName(e.target.value)}
+            style={{ width: 300 }}
+          />
+        </div>
+        <div style={{ margin: '10px 0', display: 'flex', alignItems: 'center' }}>
+          <label>元数据:</label>
+          <Button onClick={() => setMetaVisible(true)}>选择元数据</Button>
+          <div
+            style={{
+              margin: '0 10px',
+              display: 'flex',
+              alignItems: 'center',
+              flexWrap: 'wrap',
+              flex: 1
+            }}
+          >
+            {selection.map((c, idx) => (
+              <Tag key={c.id || idx} closable onClose={() => setSelection([])}>
+                {c.name}
+              </Tag>
+            ))}
+          </div>
+        </div>
+        <div>
+          <p style={{ margin: '10px 0' }}>字段映射</p>
+          <Table
+            columns={paramsColumns}
+            rowKey='fieldName'
+            dataSource={tableData}
+          />
         </div>
-      </div>
-      <div>
-        <p style={{ margin: '10px 0' }}>字段映射</p>
-        <Table
-          columns={paramsColumns}
-          rowKey="fieldName"
-          dataSource={tableData}
-        />
-      </div>
+      </Spin>
       <MetadataModal
         selection={selection}
         onSave={(e) => {

+ 16 - 11
app/containers/DataGovernanceQualityAudit/components/ScheduleFormModal.tsx

@@ -35,22 +35,22 @@ const getCronExpressionByPartition = (partition: {
   let cronExpression = ''
   switch (periodUnit as SchedulePeriodUnit) {
     case 'Minute':
-      cronExpression = `0 */${interval} * * * ?`
+      cronExpression = `0 0/${interval} * * * *`
       break
     case 'Hour':
-      cronExpression = `0 0 */${interval} * * ?`
+      cronExpression = `0 0 0/${interval} * * *`
       break
     case 'Day':
-      cronExpression = `0 0 0 */${interval} * ?`
+      cronExpression = `0 0 0 1/${interval} * *`
       break
     case 'Week':
       cronExpression = `0 0 0 ? * ${interval}`
       break
     case 'Month':
-      cronExpression = `0 0 0 ${interval} * ?`
+      cronExpression = `0 0 0 ? 1/${interval} *`
       break
     case 'Year':
-      cronExpression = `0 0 0 0 0 0 0/${interval}`
+      cronExpression = `* * * * * * 0/${interval}`
       break
   }
   return cronExpression
@@ -70,7 +70,13 @@ class ScheduleFormModal extends React.PureComponent<IScheduleFormModalProps> {
         return
       }
       const copyView: ISchedule = { ...fieldsValue }
-      onSave(copyView)
+      onSave({
+        ...fieldsValue,
+        cronExpression: getCronExpressionByPartition({
+          periodUnit: fieldsValue.periodUnit,
+          interval: fieldsValue.interval
+        })
+      })
     })
   }
 
@@ -136,7 +142,7 @@ class ScheduleFormModal extends React.PureComponent<IScheduleFormModalProps> {
           </FormItem>
 
           <FormItem label={'起止日期'} {...this.formItemStyle} required>
-            {getFieldDecorator<ISchedule>('name', {
+            {getFieldDecorator<ISchedule>('startDate', {
               initialValue: [formView?.startDate, formView.endDate],
               rules: [
                 {
@@ -153,7 +159,7 @@ class ScheduleFormModal extends React.PureComponent<IScheduleFormModalProps> {
           </FormItem>
 
           <FormItem label={'是否激活'} {...this.formItemStyle} required>
-            {getFieldDecorator<ISchedule>('name', {
+            {getFieldDecorator<ISchedule>('jobStatus', {
               initialValue: formView?.jobStatus === 'started',
               rules: [
                 {
@@ -163,9 +169,8 @@ class ScheduleFormModal extends React.PureComponent<IScheduleFormModalProps> {
               ]
             })(
               <Switch
-                checkedChildren="开"
-                unCheckedChildren="关"
-                defaultChecked
+                checkedChildren='开'
+                unCheckedChildren='关'
               />
             )}
           </FormItem>

+ 76 - 32
app/containers/DataGovernanceQualityAudit/index.tsx

@@ -26,7 +26,6 @@ import ClassificationsFormModal from 'containers/DataGovernanceQualityAudit/comp
 import QualityTaskFormModal from 'containers/DataGovernanceQualityAudit/components/QualityTaskFormModal'
 import ScheduleFormModal from 'containers/DataGovernanceQualityAudit/components/ScheduleFormModal'
 import header from 'containers/Display/Editor/Header'
-import SubjectModal from 'containers/DataGovernanceQualityAudit/components/SubjectModal'
 
 export default function DataGovernanceQualityAudit() {
   const [tableLoading, setTableLoading] = useState(false)
@@ -60,7 +59,7 @@ export default function DataGovernanceQualityAudit() {
     },
     {
       title: '稽核字段个数',
-      dataIndex: 'standardName'
+      dataIndex: 'auditorCount'
     },
     {
       title: '操作',
@@ -74,28 +73,33 @@ export default function DataGovernanceQualityAudit() {
           >
             编辑
           </a>
-          <Divider type="vertical" />
+          <Divider type='vertical' />
           <Dropdown
             overlay={
               <Menu>
-                <Menu.Item key="0" onClick={() => setScVisible(true)}>
+                <Menu.Item
+                  key='0'
+                  onClick={() => {
+                    setQtForm(data)
+                    setScVisible(true)
+                  }}
+                >
                   设置调度
                 </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="2">修改</Menu.Item>
-                <Menu.Item key="3">
+                <Menu.Item key='3'>
                   <Popconfirm
-                    title="确定删除?"
-                    placement="bottom"
-                    // onConfirm
+                    title='确定删除?'
+                    placement='bottom'
+                    onConfirm={() => handleDeleteTask(data.id)}
                   >
                     <a>删除</a>
                   </Popconfirm>
@@ -105,7 +109,7 @@ export default function DataGovernanceQualityAudit() {
           >
             <a>
               {' '}
-              更多 <Icon type="down" />
+              更多 <Icon type='down' />
             </a>
           </Dropdown>
         </>
@@ -118,7 +122,7 @@ export default function DataGovernanceQualityAudit() {
     setCfVisible(true)
   }
 
-  const handleDeleteTreeItem = async (c: IClassification) => {
+  const handleDeleteTreeItem = async(c: IClassification) => {
     try {
       setTreeLoading(true)
       const data = await request(`${api.deleteAuditClassification}${c.id}`, {
@@ -153,19 +157,19 @@ export default function DataGovernanceQualityAudit() {
               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>
@@ -175,20 +179,19 @@ export default function DataGovernanceQualityAudit() {
             )}
             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}`, {
         method: 'GET'
       })
-      console.log(result)
       // @ts-ignore
       if (result.header.code === 200) {
         message.success({ content: '立即稽核完成' })
@@ -202,7 +205,32 @@ export default function DataGovernanceQualityAudit() {
     }
   }
 
-  const queryClassifications = async () => {
+  const handleDispatch = async(form) => {
+    try {
+      setTableLoading(true)
+      setSCLoading(true)
+      const result = await request(`${api.setDispatch}${qtForm.id}`, {
+        method: 'PUT',
+        data: {
+          cronExpression: form.cronExpression,
+          startDate: form.startDate[0].format('YYYY-MM-DD hh:mm:ss'),
+          endDate: form.startDate[1].format('YYYY-MM-DD hh:mm:ss'),
+          periodUnit: form.periodUnit,
+          jobStatus: form.jobStatus ? 'started' : 'new'
+        }
+      })
+      // @ts-ignore
+      if (result.header.code === 200) {
+        message.success({ content: '设置调度成功' })
+        queryQualityTasks()
+      }
+    } finally {
+      setTableLoading(false)
+      setSCLoading(false)
+    }
+  }
+
+  const queryClassifications = async() => {
     try {
       setTreeLoading(true)
       const data = await request(api.getAuditClassification, { method: 'GET' })
@@ -215,7 +243,7 @@ export default function DataGovernanceQualityAudit() {
     }
   }
 
-  const queryQualityTasks = async () => {
+  const queryQualityTasks = async() => {
     try {
       setTableLoading(true)
       const data = await request(`${api.getQualityTask}?pId=${selectedKey}`, {
@@ -228,7 +256,7 @@ export default function DataGovernanceQualityAudit() {
     }
   }
 
-  const handleSaveCfForm = async (form: IClassification) => {
+  const handleSaveCfForm = async(form: IClassification) => {
     try {
       setCfLoading(true)
       const url = cfForm.id
@@ -248,7 +276,7 @@ export default function DataGovernanceQualityAudit() {
     }
   }
 
-  const handleSaveQtForm = async (view) => {
+  const handleSaveQtForm = async(view) => {
     try {
       setQtLoading(true)
       const url = qtForm?.id
@@ -268,6 +296,22 @@ export default function DataGovernanceQualityAudit() {
     }
   }
 
+  const handleDeleteTask = async(id: number) => {
+    try {
+      setTableLoading(true)
+      const data = await request(`${api.deleteQualityTask}${id}`, {
+        method: 'DELETE'
+      })
+      // @ts-ignore
+      if (data.header.code === 200) {
+        message.success({ content: '删除成功' })
+        queryQualityTasks()
+      }
+    } finally {
+      setTableLoading(false)
+    }
+  }
+
   useEffect(() => {
     queryClassifications()
   }, [])
@@ -280,7 +324,7 @@ export default function DataGovernanceQualityAudit() {
 
   return (
     <Container>
-      <Helmet title="质量稽核" />
+      <Helmet title='质量稽核' />
       <ContainerBody>
         <Box>
           <Box.Header>
@@ -298,7 +342,7 @@ export default function DataGovernanceQualityAudit() {
                       setCfVisible(true)
                     }}
                   >
-                    <Icon type="plus" />
+                    <Icon type='plus' />
                   </div>
                 </div>
                 <div className={styles.treeContent}>
@@ -311,8 +355,8 @@ export default function DataGovernanceQualityAudit() {
               <div style={{ flex: 1 }}>
                 <div style={{ padding: '0 0 20px' }}>
                   <Button
-                    type="primary"
-                    icon="plus"
+                    type='primary'
+                    icon='plus'
                     onClick={() => {
                       setQtVisible(true)
                       setQtForm(null)
@@ -324,7 +368,7 @@ export default function DataGovernanceQualityAudit() {
                 <Table
                   style={{ flex: 1 }}
                   bordered
-                  rowKey="id"
+                  rowKey='id'
                   loading={tableLoading}
                   dataSource={qualityTasks}
                   columns={tableColumns}
@@ -356,7 +400,7 @@ export default function DataGovernanceQualityAudit() {
         visible={scVisible}
         loading={scLoading}
         formView={scForm}
-        onSave={undefined}
+        onSave={handleDispatch}
         onCancel={() => setScVisible(false)}
       />
     </Container>

+ 1 - 0
app/containers/Main/Sidebar.tsx

@@ -136,6 +136,7 @@ const MainSidebar: React.FC<PropsWithChildren<{}>> = (props) => {
         const active = routes.some((route) => pathname.includes(route))
         const AuthorizedSidebarOption = AuthorizedSidebarOptions[idx]
         return (
+          // @ts-ignore
           <AuthorizedSidebarOption
             key={permissionName}
             active={active}

+ 1 - 0
app/containers/View/types.ts

@@ -37,6 +37,7 @@ export interface IViewBase {
   metadataConfig?: string
   typeName?: string
   updateTime?: string
+  model?: string;
 }
 
 type IViewTemp = Omit<IViewBase, 'sourceName'>