Forráskód Böngészése

feat: 删除多余页面

@dayan_hjm 2 év óta
szülő
commit
402d8304cc
100 módosított fájl, 6 hozzáadás és 21535 törlés
  1. 1 1
      config/webpack.common.js
  2. 2 2
      config/webpack.dev.js
  3. BIN
      src/assets/imgs/dataVImg/一次合格率.png
  4. BIN
      src/assets/imgs/dataVImg/一次合格率@2x.png
  5. BIN
      src/assets/imgs/dataVImg/光环 1.png
  6. BIN
      src/assets/imgs/dataVImg/光环 1@2x.png
  7. BIN
      src/assets/imgs/dataVImg/光环.png
  8. BIN
      src/assets/imgs/dataVImg/光环@2x.png
  9. BIN
      src/assets/imgs/dataVImg/工厂.png
  10. BIN
      src/assets/imgs/dataVImg/工厂@2x.png
  11. BIN
      src/assets/imgs/dataVImg/底部栏.png
  12. BIN
      src/assets/imgs/dataVImg/底部栏@2x.png
  13. BIN
      src/assets/imgs/dataVImg/总产值底盘.png
  14. BIN
      src/assets/imgs/dataVImg/总产值底盘@2x.png
  15. BIN
      src/assets/imgs/dataVImg/悬浮内容.png
  16. BIN
      src/assets/imgs/dataVImg/悬浮内容@2x.png
  17. BIN
      src/assets/imgs/dataVImg/损工率右.png
  18. BIN
      src/assets/imgs/dataVImg/损工率右@2x.png
  19. BIN
      src/assets/imgs/dataVImg/损工率左.png
  20. BIN
      src/assets/imgs/dataVImg/损工率左@2x.png
  21. BIN
      src/assets/imgs/dataVImg/损工率底座.png
  22. BIN
      src/assets/imgs/dataVImg/损工率底座@2x.png
  23. BIN
      src/assets/imgs/dataVImg/矿场.png
  24. BIN
      src/assets/imgs/dataVImg/矿场@2x.png
  25. BIN
      src/assets/imgs/dataVImg/计划完成率底座1.png
  26. BIN
      src/assets/imgs/dataVImg/计划完成率底座1@2x.png
  27. BIN
      src/assets/imgs/dataVImg/计划完成率底座2.png
  28. BIN
      src/assets/imgs/dataVImg/计划完成率底座2@2x.png
  29. BIN
      src/assets/imgs/dataVImg/计划完成率底座3.png
  30. BIN
      src/assets/imgs/dataVImg/计划完成率底座3@2x.png
  31. BIN
      src/assets/imgs/dataVImg/顶部栏.png
  32. BIN
      src/assets/imgs/dataVImg/顶部栏@2x.png
  33. BIN
      src/assets/imgs/dataVImg/飞光.png
  34. BIN
      src/assets/imgs/dataVImg/飞光@2x.png
  35. BIN
      src/assets/imgs/dataVImg/驾驶舱 9.png
  36. BIN
      src/assets/imgs/dataVImg/驾驶舱 9@2x.png
  37. 2 2
      src/index.js
  38. 0 31
      src/pages/SqlIndex/FilesPopUp/style.less
  39. 0 187
      src/pages/SqlIndex/FilesPopUp/view.jsx
  40. 0 516
      src/pages/SqlIndex/LeftTableList.jsx
  41. 0 13
      src/pages/SqlIndex/SearchInput/SearchInput.jsx
  42. 0 33
      src/pages/SqlIndex/SearchInput/SearchInputStyle.less
  43. 0 36
      src/pages/SqlIndex/SqlEditor/ButtonWithIcon.jsx
  44. 0 167
      src/pages/SqlIndex/SqlEditor/style.less
  45. 0 558
      src/pages/SqlIndex/SqlEditor/view.jsx
  46. 0 398
      src/pages/SqlIndex/SqlEditorTabs/style.less
  47. 0 341
      src/pages/SqlIndex/SqlEditorTabs/view.jsx
  48. 0 1361
      src/pages/SqlIndex/SqlIndexMod.js
  49. 0 193
      src/pages/SqlIndex/SqlIndexServ.js
  50. 0 536
      src/pages/SqlIndex/SqlIndexStyle.less
  51. 0 306
      src/pages/SqlIndex/SqlIndexView.jsx
  52. 0 493
      src/pages/SqlIndex/SqlResultView.jsx
  53. 0 10
      src/pages/SqlIndex/mock/key.js
  54. 0 318
      src/pages/SqlIndex/mock/leftb.js
  55. 0 1582
      src/pages/SqlIndex/mock/listColumnsArr.js
  56. 0 20
      src/pages/SqlIndex/mock/test.js
  57. 0 112
      src/pages/businessWarning/list/businessWarningLess.less
  58. 0 340
      src/pages/businessWarning/list/businessWarningMod.js
  59. 0 138
      src/pages/businessWarning/list/businessWarningServ.js
  60. 0 439
      src/pages/businessWarning/list/businessWarningView.jsx
  61. 0 120
      src/pages/businessWarning/monitoringList/monitoringLess.less
  62. 0 428
      src/pages/businessWarning/monitoringList/monitoringMod.js
  63. 0 195
      src/pages/businessWarning/monitoringList/monitoringServ.js
  64. 0 857
      src/pages/businessWarning/monitoringList/monitoringView.jsx
  65. 0 304
      src/pages/client/index.js
  66. 0 924
      src/pages/client/index.jsx
  67. 0 223
      src/pages/client/index.scss
  68. 0 270
      src/pages/clush/style.less
  69. 0 1655
      src/pages/clush/view.jsx
  70. 0 310
      src/pages/dataApply/applyModal.jsx
  71. 0 126
      src/pages/dataApply/dataApplyLess.less
  72. 0 466
      src/pages/dataApply/dataApplyMod.js
  73. 0 169
      src/pages/dataApply/dataApplyServ.js
  74. 0 666
      src/pages/dataApply/dataApplyView.jsx
  75. 0 105
      src/pages/dataSourceManage/dsListLess.less
  76. 0 335
      src/pages/dataSourceManage/dsListMod.js
  77. 0 109
      src/pages/dataSourceManage/dsListServ.js
  78. 0 1296
      src/pages/dataSourceManage/dsListView.jsx
  79. 0 6
      src/pages/drive/view.jsx
  80. 0 22
      src/pages/fileUpload/style.less
  81. 0 255
      src/pages/fileUpload/view.jsx
  82. 0 105
      src/pages/fileUploadDetail/fileUploadDetailLess.less
  83. 0 335
      src/pages/fileUploadDetail/fileUploadDetailMod.js
  84. 0 109
      src/pages/fileUploadDetail/fileUploadDetailServ.js
  85. 0 624
      src/pages/fileUploadDetail/fileUploadDetailView.jsx
  86. 0 238
      src/pages/fileUploadNew/api.js
  87. 0 151
      src/pages/fileUploadNew/components/index.jsx
  88. 0 105
      src/pages/fileUploadNew/fileUploadNewLess.less
  89. 0 339
      src/pages/fileUploadNew/fileUploadNewMod.js
  90. 0 126
      src/pages/fileUploadNew/fileUploadNewServ.js
  91. 0 823
      src/pages/fileUploadNew/fileUploadNewView.jsx
  92. 0 274
      src/pages/fileUploadNew/msgLoad/ConfigurationModal.jsx
  93. 0 159
      src/pages/fileUploadNew/msgLoad/index.jsx
  94. 1 1
      src/pages/frame/component/top/view.jsx
  95. 0 57
      src/pages/frame/view.jsx
  96. 0 396
      src/pages/labelSystem/index.jsx
  97. 0 136
      src/pages/labelSystem/index.scss
  98. 0 138
      src/pages/myManage/DataSearchPermisssion/IndexLess.less
  99. 0 445
      src/pages/myManage/DataSearchPermisssion/IndexMod.js
  100. 0 0
      src/pages/myManage/DataSearchPermisssion/IndexServ.js

+ 1 - 1
config/webpack.common.js

@@ -16,7 +16,7 @@ const plugins = [
16 16
     languages: ['sql', 'javascript']
17 17
   }),
18 18
   new HtmlWebpackPlugin({
19
-    title: "统一数据门户",
19
+    title: "运营数据中心",
20 20
     filename: "transfer.html",
21 21
     stylefile: path.resolve(__dirname, "../src/assets/css/common.css"),
22 22
     template: path.resolve(__dirname, "../public/index.html"),

+ 2 - 2
config/webpack.dev.js

@@ -128,14 +128,14 @@ module.exports = merge(common, {
128 128
     // inline: true, // 实时刷新
129 129
     // contentBase: join(__dirname, "../dist"),
130 130
     compress: true,
131
-    port: 9003,
131
+    port: 9008,
132 132
     host: "0.0.0.0",
133 133
     hot: true,
134 134
     proxy: {
135 135
       "/api": {
136 136
         // target: "http://47.96.100.195:9081"
137 137
         // target: "http://dataportal-test.agile.com.cn:8081"
138
-        target: "http://14.29.205.92:9081",
138
+        target: "http://106.52.242.177:9081",
139 139
         // target:"http://dataportal.dtyunxi.cn/demo",
140 140
         changeOrigin:true,
141 141
 

BIN
src/assets/imgs/dataVImg/一次合格率.png


BIN
src/assets/imgs/dataVImg/一次合格率@2x.png


BIN
src/assets/imgs/dataVImg/光环 1.png


BIN
src/assets/imgs/dataVImg/光环 1@2x.png


BIN
src/assets/imgs/dataVImg/光环.png


BIN
src/assets/imgs/dataVImg/光环@2x.png


BIN
src/assets/imgs/dataVImg/工厂.png


BIN
src/assets/imgs/dataVImg/工厂@2x.png


BIN
src/assets/imgs/dataVImg/底部栏.png


BIN
src/assets/imgs/dataVImg/底部栏@2x.png


BIN
src/assets/imgs/dataVImg/总产值底盘.png


BIN
src/assets/imgs/dataVImg/总产值底盘@2x.png


BIN
src/assets/imgs/dataVImg/悬浮内容.png


BIN
src/assets/imgs/dataVImg/悬浮内容@2x.png


BIN
src/assets/imgs/dataVImg/损工率右.png


BIN
src/assets/imgs/dataVImg/损工率右@2x.png


BIN
src/assets/imgs/dataVImg/损工率左.png


BIN
src/assets/imgs/dataVImg/损工率左@2x.png


BIN
src/assets/imgs/dataVImg/损工率底座.png


BIN
src/assets/imgs/dataVImg/损工率底座@2x.png


BIN
src/assets/imgs/dataVImg/矿场.png


BIN
src/assets/imgs/dataVImg/矿场@2x.png


BIN
src/assets/imgs/dataVImg/计划完成率底座1.png


BIN
src/assets/imgs/dataVImg/计划完成率底座1@2x.png


BIN
src/assets/imgs/dataVImg/计划完成率底座2.png


BIN
src/assets/imgs/dataVImg/计划完成率底座2@2x.png


BIN
src/assets/imgs/dataVImg/计划完成率底座3.png


BIN
src/assets/imgs/dataVImg/计划完成率底座3@2x.png


BIN
src/assets/imgs/dataVImg/顶部栏.png


BIN
src/assets/imgs/dataVImg/顶部栏@2x.png


BIN
src/assets/imgs/dataVImg/飞光.png


BIN
src/assets/imgs/dataVImg/飞光@2x.png


BIN
src/assets/imgs/dataVImg/驾驶舱 9.png


BIN
src/assets/imgs/dataVImg/驾驶舱 9@2x.png


+ 2 - 2
src/index.js

@@ -78,9 +78,9 @@ if (ticket && ssoEmpId) {
78 78
 // reportWebVitals();
79 79
 
80 80
 if (process.env.NODE_ENV === "production") {
81
-  document.title = "统一数据门户";
81
+  document.title = "运营数据中心";
82 82
 } else {
83
-  document.title = "(测试)统一数据门户";
83
+  document.title = "(测试)运营数据中心";
84 84
 }
85 85
 
86 86
 // 获取socket id , 建立socket连接

+ 0 - 31
src/pages/SqlIndex/FilesPopUp/style.less

@@ -1,31 +0,0 @@
1
-.sqlIndexFiles {
2
-    max-height: calc(100vh - 170px);
3
-    padding: 0 !important;
4
-
5
-    :global {
6
-        // 默认隐藏滚动条
7
-        .ant-table-body {
8
-            overflow: hidden !important;
9
-
10
-            &:hover {
11
-                overflow: auto !important;
12
-            }
13
-        }
14
-
15
-        // 组件消除内边距(Modal, Popover)
16
-        .ant-modal-body,
17
-        .ant-popover-inner-content,
18
-        .ant-card-body {
19
-            padding: 0 !important;
20
-        }
21
-
22
-        // 弹出窗,SQL 文件列表的表格样式
23
-        .tablePading {
24
-
25
-            .ant-table-tbody>tr>td,
26
-            .ant-table-thead>tr>th {
27
-                padding: 13px 16px !important;
28
-            }
29
-        }
30
-    }
31
-}

+ 0 - 187
src/pages/SqlIndex/FilesPopUp/view.jsx

@@ -1,187 +0,0 @@
1
-import React, { Component } from 'react'
2
-import { DeleteOutlined } from '@ant-design/icons'
3
-import { Card, Input, Table, Modal,Tooltip } from 'antd'
4
-const { confirm } = Modal
5
-import { observer, inject } from 'mobx-react'
6
-import SqlIndexMod from '../SqlIndexMod'
7
-
8
-import styles from './style.less'
9
-import { SearchInput } from '../SearchInput/SearchInput'
10
-
11
-/**
12
- * sql文件列表弹出窗
13
- */
14
-// 在视图注入module层数据
15
-// 将组件设置为响应式组件,成为观察者,以便响应被观察数据的变化
16
-@observer
17
-export default class FilesPopUp extends Component {
18
-  selfRef = React.createRef()
19
-
20
-  static fixWidth = 330
21
-
22
-  constructor(props) {
23
-    super(props)
24
-    this.stores = SqlIndexMod
25
-
26
-    this.state = {
27
-      focusIndex: '-1',
28
-      fileList: []
29
-    }
30
-  }
31
-
32
-
33
-  resetFileList = () => {
34
-    this.setState({
35
-      fileList: this.originFileList()
36
-    })
37
-  }
38
-
39
-  componentDidMount() {
40
-    console.log(document.getElementById('outerContainer'))
41
-    const rect = document.getElementById('outerContainer') ? document.getElementById('outerContainer').getBoundingClientRect() : 0
42
-    this.tableScrollHeight = document.body.offsetHeight - rect.top - 168
43
-    this.updateFileList()
44
-  }
45
-
46
-  updateFileList = () => {
47
-    this.stores.getFileList(((data)=>{
48
-      this.setState({
49
-        fileList: data
50
-      })  
51
-    }))
52
-  }
53
-
54
-  deleteFileAndUpdate = (fileId) => {
55
-    this.stores.deleteFile({ id: fileId }).then(() => {
56
-      this.updateFileList()
57
-    })
58
-  }
59
-
60
-  getFileList = (fileList) => {
61
-    const list = []
62
-    for (let i = 0; i < fileList.length; i++) {
63
-      list.push({ key: i, ...fileList[i] })
64
-    }
65
-
66
-    return list
67
-  }
68
-
69
-  doSearch = (text) => {
70
-    const { fileList } = this.stores.state;
71
-    const filterFileList = fileList.filter((value) => {
72
-      return value.sqlFileName.indexOf(text) != -1
73
-    })
74
-
75
-    this.setState({
76
-      fileList: filterFileList
77
-    })
78
-  }
79
-    /**
80
-   * 表名列表
81
-   */
82
-     columnsTableName = [
83
-        {
84
-          title: '文件名称',
85
-          dataIndex: 'sqlFileName',
86
-          key: 'key',
87
-          ellipsis: true,
88
-          render: (text) => {
89
-            return (
90
-              <Tooltip title={text}>
91
-                <span className="textEllipsis">{text}</span>
92
-              </Tooltip>
93
-            )
94
-          }
95
-        },
96
-        {
97
-          title: '创建时间',
98
-          dataIndex: 'createTime',
99
-          key: 'key',
100
-          width: 200,
101
-          render: (text, item, index) => (
102
-            <span style={{ width: '100%' }}>
103
-              {text ? text : ' - '}
104
-              <DeleteOutlined
105
-                style={{
106
-                  marginLeft: '10px',
107
-                  width: '30px',
108
-                  visibility: this.state.focusIndex == item.key ? 'visible' : 'hidden'
109
-                }}
110
-                onClick={(e) => {
111
-                  e.stopPropagation()
112
-    
113
-                  confirm({
114
-                    centered: true,
115
-                    title: '确认要删除SQL文件吗?',
116
-                    content: `${item.sqlFileName}`,
117
-                    okText: '删除',
118
-                    okType: 'primary',
119
-                    cancelText: '取消',
120
-                    onOk: () => {
121
-                      this.deleteFileAndUpdate(item.id)
122
-                    }
123
-                  })
124
-                }}
125
-              />
126
-            </span>
127
-          )
128
-        }
129
-      ]
130
-    
131
-      render() {
132
-        const { fileList } = this.state
133
-    
134
-        return (
135
-          <Card
136
-            ref={(dom) => {
137
-              this.selfRef = dom
138
-            }}
139
-            id="outerContainer"
140
-            className={styles.sqlIndexFiles}
141
-            style={{ width: FilesPopUp.fixWidth }}
142
-            title="SQL文件"
143
-          >
144
-            <SearchInput
145
-              size={'middle'}
146
-              placeholder="请输入名称搜索"
147
-              allowClear
148
-              onSearch={(text) => {
149
-                this.doSearch(text)
150
-              }}
151
-              onChange={(e) => {
152
-                const { value } = e.target
153
-                if (value.length == 0) {
154
-                  this.resetFileList()
155
-                } else {
156
-                  this.doSearch(value)
157
-                }
158
-              }}
159
-            />
160
-                    <Table
161
-          className={styles.tablePading}
162
-          pagination={false}
163
-          columns={this.columnsTableName}
164
-          dataSource={this.getFileList(fileList)}
165
-          onRow={(record) => {
166
-            return {
167
-              onMouseEnter: () => {
168
-                this.setState({
169
-                  focusIndex: record.key
170
-                })
171
-              },
172
-              onMouseLeave: () => {
173
-                this.setState({
174
-                  focusIndex: '-1'
175
-                })
176
-              },
177
-              onClick: () => {
178
-                this.props.onFileSelect(record)
179
-              }
180
-            }
181
-          }}
182
-          scroll={{ y: this.tableScrollHeight }}
183
-        />
184
-      </Card>
185
-    )
186
-  }
187
-}

+ 0 - 516
src/pages/SqlIndex/LeftTableList.jsx

@@ -1,516 +0,0 @@
1
-import React, { Component } from 'react'
2
-import { observer, inject } from 'mobx-react'
3
-import { Tree, TreeSelect, Typography, Input, Table, Tooltip, Modal } from 'antd'
4
-import { Form } from '@ant-design/compatible';
5
-
6
-import DynamicTooltip from '@widget/DynamicTooltip/DynamicTooltip'
7
-import { SearchInput } from './SearchInput/SearchInput'
8
-import SqlIndexMod from './SqlIndexMod'
9
-const { TreeNode } = Tree
10
-const { Search } = Input
11
-const { warn } = Modal
12
-// 
13
-// 工具方法
14
-import { cloneDeep, debounce, isEmpty } from 'lodash'
15
-
16
-// 引入当前页样式 - 模块化
17
-import styles from './sqlIndexStyle.less'
18
-
19
-import { FixedSizeList as List } from 'react-window'
20
-import AutoSizer from 'react-virtualized-auto-sizer'
21
-
22
-/**
23
- * 数据查询主页
24
- */
25
-// 将组件设置为响应式组件,成为观察者,以便响应被观察数据的变化
26
-@observer
27
-export default class extends Component {
28
-  // 构造函数,组件的实例创建时,最先执行
29
-  constructor(props, context) {
30
-    super(props, context)
31
-    this.stores = SqlIndexMod
32
-
33
-    this.state = {
34
-      treeMaxHeight: 0,
35
-      query: this.props.query,
36
-
37
-      // 用于虚拟滚动的高度计算,bottom的暂时没用到
38
-      leftTopListHeight: 0,
39
-      leftBottomListHeight: 0
40
-    }
41
-
42
-    this.leftTopDataListContainer = React.createRef()
43
-  }
44
-
45
-  componentDidMount() {
46
-    this.stores.resetAll()
47
-    this.getContainersId()
48
-    this.addListener()
49
-
50
-    // 页面加载完不会触发resize,这里手动调用一次
51
-    this.debounceResizeHandler()
52
-  }
53
-
54
-  // 标记首次渲染状态,避免多次渲染触发了多次首次渲染的逻辑
55
-  isDataExist = false
56
-
57
-  componentWillUnmount() {
58
-    this.isDataExist = false
59
-    this.removeListener()
60
-  }
61
-
62
-  componentWillReceiveProps(nextProps) {
63
-    /**
64
-     * 由于渲染顺序的问题,首次打开数据查询页面时,
65
-     * 这里的componentDidMount和componentWillReceiveProps都会触发一次
66
-     * 所以用isDataExist来区分
67
-     */
68
-    if (this.isDataExist) {
69
-      this.handleDataFromProps(nextProps.query)
70
-    } else {
71
-      this.isDataExist = true
72
-      this.stores.getAllDsAndDbsAndTables().then(() => {
73
-        this.stores.recoveryEditorTabsFromLocalStorage().then(() => {
74
-          this.stores.updateTablesAndSetDefault()
75
-          this.getTreeDefaultExpandedKeys()
76
-          this.handleDataFromProps(this.state.query)
77
-          this.dbsTreeNode = this.treeNodeChildRender(this.getDbsTreeData())
78
-        })
79
-      })
80
-    }
81
-  }  
82
-  getStyle = (element, attr) => {
83
-    // 兼容IE浏览器
84
-    if (element.currentStyle) {
85
-      return element.currentStyle[attr]
86
-    } else {
87
-      return getComputedStyle(element, false)[attr]
88
-    }
89
-  }
90
-
91
-  debounceResizeHandler = debounce(() => {
92
-    const { clientHeight } = document.body
93
-
94
-    const treeRect = this.dsTreeContainer.getBoundingClientRect()
95
-    const treeMaxHeight = clientHeight - treeRect.top - 60
96
-
97
-    this.setState({
98
-      treeMaxHeight: treeMaxHeight
99
-    })
100
-  }, 100)
101
-
102
-  // 虚拟列表会实时自动计算宽高,在拉动分割线调整高度时会有比较严重的卡顿,这里用防抖避免该问题
103
-  debounceResizeListHeight = debounce((newTopHeight, newBottomHeight) => {
104
-    this.setState({
105
-      leftTopListHeight: newTopHeight,
106
-      leftBottomListHeight: newBottomHeight
107
-    })
108
-  }, 200)
109
-
110
-  getStyle = (element, attr) => {
111
-    // 兼容IE浏览器
112
-    if (element.currentStyle) {
113
-      return element.currentStyle[attr]
114
-    } else {
115
-      return getComputedStyle(element, false)[attr]
116
-    }
117
-  }
118
-
119
-  getContainersId() {
120
-    this.dsTreeContainer = document.getElementById('sqlIndexDsTreeSelectContainer')
121
-    this.bottomDataList = document.getElementById('bottomDataList')
122
-
123
-    this.sqlIndexLeftResizeLine = document.getElementById('sqlIndexLeftResizeLine')
124
-  }
125
-
126
-  addListener() {
127
-    window.addEventListener('resize', this.debounceResizeHandler)
128
-
129
-    this.sqlIndexLeftResizeLine.addEventListener('mousedown', this.handleLeftResizeLineMouseDown)
130
-  }
131
-
132
-  removeListener() {
133
-    window.removeEventListener('resize', this.debounceResizeHandler)
134
-
135
-    this.sqlIndexLeftResizeLine.removeEventListener('mousedown', this.handleLeftResizeLineMouseDown)
136
-  }
137
-  handleLeftResizeLineMouseDown = (e) => {
138
-    e.preventDefault()
139
-
140
-    const startY = e.clientY
141
-    const oldHeight = parseInt(window.getComputedStyle(this.bottomDataList).height)
142
-    const oldTopHeight = parseInt(window.getComputedStyle(this.leftTopDataListContainer.current).height)
143
-
144
-    document.onmousemove = (evt) => {
145
-      const offset = evt.clientY - startY
146
-      const newTopHeight = oldTopHeight + offset
147
-      const newBottomHeight = oldHeight - offset
148
-      this.leftTopDataListContainer.current.style.height = newTopHeight + 'px'
149
-      this.bottomDataList.style.height = newBottomHeight + 'px'
150
-
151
-      if (newTopHeight < 100) {
152
-        return
153
-      }
154
-
155
-      this.debounceResizeListHeight(newTopHeight, newBottomHeight)
156
-    }
157
-
158
-    document.onmouseup = (evt) => {
159
-      evt.stopPropagation()
160
-      document.onmousemove = null
161
-      document.onmouseup = null
162
-    }
163
-  }
164
-
165
-  /**
166
-   * 处理路由跳转过来携带的参数
167
-   * @param {*} query
168
-   */
169
-  handleDataFromProps(query) {
170
-    if (query) {
171
-      // 跳转过来前已经做了权限判断,这里不需要再判断权限
172
-      this.stores.addEditorTabFromQuery(query)
173
-    }
174
-  }
175
-
176
-  // 防抖处理,避免每次双击都触发两次选中逻辑
177
-  debounceTableRowClick = debounce(
178
-    (row) => {
179
-      const { dbInfo } = row
180
-
181
-      // 已选择当前项,不再重复触发选择操作
182
-      if (this.stores.isRowSelected(row)) {
183
-        return
184
-      }
185
-
186
-      this.stores.updateSelectedTableRow(dbInfo)
187
-    },
188
-    300,
189
-    {
190
-      trailing: true
191
-    }
192
-  )
193
-
194
-  handleFieldClickRow = (row, index) => {
195
-    return {
196
-      onClick: () => {
197
-        this.stores.updateFieldSelectedId(row.key)
198
-      }
199
-    }
200
-  }
201
-
202
-  doSearch = (text) => {
203
-    this.stores.updateTableNameFilter(text)
204
-  }
205
-  
206
-  // 把数据转成Tree组件的可用数据格式
207
-  getDbsTreeData = () => {
208
-    const { allDsAndDbs } = this.stores.state
209
-    const result = allDsAndDbs.map((parentValue) => {
210
-      return {
211
-        title: (
212
-          // <DynamicTooltip placement="right" title={parentValue.name}>
213
-            <Typography.Text ellipsis={true}>{parentValue.name}</Typography.Text>
214
-          // </DynamicTooltip> 
215
-        ),
216
-        value: parentValue.dsId,
217
-        key: parentValue.dsId,
218
-        selectable: false,
219
-        children: parentValue.dbs.map((value) => {
220
-          const fullName = `${parentValue.name}.${value.dataBaseName}`
221
-          return {
222
-            title: (
223
-              // <DynamicTooltip placement="right" title={value.dataBaseName}>
224
-                <Typography.Text ellipsis={true}>{value.dataBaseName}</Typography.Text>
225
-              // </DynamicTooltip>
226
-            ),
227
-            value: fullName,
228
-            key: fullName,
229
-            parentId: parentValue.dsId,
230
-            parentName: parentValue.name,
231
-            // 用于回显
232
-            selectedFullDbName: fullName
233
-          }
234
-        })
235
-      }
236
-    })
237
-
238
-    result.unshift({
239
-      title: (
240
-        <Tooltip placement="right" title="列出全部表名">
241
-          全部
242
-        </Tooltip>
243
-      ),
244
-      value: '全部',
245
-      key: 'all',
246
-      selectable: true
247
-    })
248
-
249
-    return result
250
-  }
251
-
252
-  /**
253
-   * 数据源下拉框默认展开第一项
254
-   */
255
-  getTreeDefaultExpandedKeys = () => {
256
-    let result = null
257
-    this.dbsTreeData = this.getDbsTreeData()
258
-    const treeData = this.dbsTreeData
259
-    if (treeData && treeData.length > 1) {
260
-      const firstItem = treeData[0]
261
-
262
-      // 0是全部
263
-      result = [firstItem.key]
264
-    }
265
-
266
-    this.defaultExpandedKeys = result
267
-  }
268
-
269
-  treeNodeChildRender = (treeData) => {
270
-    if (!treeData || !treeData.length) {
271
-      return
272
-    }
273
-
274
-    return treeData.map((v, i) => {
275
-      return (
276
-        <TreeNode blockNode key={v.key} {...v}>
277
-          {v.children && this.treeNodeChildRender(v.children)}
278
-        </TreeNode>
279
-      )
280
-    })
281
-  }
282
-  
283
-  getFieldDS = () => {
284
-    const { curTableFields } = this.stores.state
285
-
286
-    return curTableFields
287
-      ? curTableFields.map((value, index) => {
288
-          return {
289
-            key: index,
290
-            ...value
291
-          }
292
-        })
293
-      : []
294
-  }
295
-
296
-  /**
297
-   * 字段列表
298
-   */
299
-  fieldColumns = [
300
-    {
301
-      title: 'name',
302
-      dataIndex: 'columnName',
303
-      key: 'columnName',
304
-      width: '35%',
305
-      ellipsis: true,
306
-      render: (text) => (
307
-        // <DynamicTooltip placement="topLeft" title={text}>
308
-          <Typography.Text ellipsis={true}>{text}</Typography.Text>
309
-        // </DynamicTooltip>
310
-      )
311
-    },
312
-    {
313
-      title: 'name',
314
-      dataIndex: 'columnType',
315
-      key: 'columnType',
316
-      width: '25%',
317
-      ellipsis: true,
318
-      render: (text) => (
319
-        // <DynamicTooltip placement="topLeft" title={text}>
320
-          <Typography.Text ellipsis={true}>{text}</Typography.Text>
321
-        // </DynamicTooltip>
322
-      )
323
-    },
324
-    {
325
-      title: 'name',
326
-      dataIndex: 'columnRemarks',
327
-      key: 'columnRemarks',
328
-      width: '25%',
329
-      ellipsis: true,
330
-      render: (text) => (
331
-        // <DynamicTooltip placement="topLeft" title={text}>
332
-          <Typography.Text ellipsis={true}>{text}</Typography.Text>
333
-        // </DynamicTooltip>
334
-      )
335
-    }
336
-  ]
337
-
338
-  parseDbInfoToKey = (dbInfo) => {
339
-    const { dsId, dsName, dbName, tableName } = dbInfo
340
-    return `${dsId}.${dbName}.${tableName}`
341
-  }
342
-
343
-  getTableDS = (selectedDbTables) => {
344
-    return selectedDbTables
345
-      ? selectedDbTables.map((value, index) => {
346
-          return {
347
-            key: this.parseDbInfoToKey(value),
348
-            name: value.tableName,
349
-            dbInfo: value
350
-          }
351
-        })
352
-      : []
353
-  }
354
-  topRowRenderer = ({ index, style }) => {
355
-    const { selectedDbTables } = this.stores
356
-    const { selectedFullDbName } = this.stores.state
357
-    const list = this.getTableDS(selectedDbTables)
358
-    const item = list[index]
359
-    const { dsName, dbName, tableName } = item.dbInfo
360
-    const tooltip = selectedFullDbName == '全部' ? `${dsName}.${dbName}.${tableName}` : tableName
361
-    return (
362
-      <div
363
-        className={`${[styles.tableRow]} ${this.stores.isRowSelected(item) ? styles.tableRowSelected : null}`}
364
-        style={{ ...style }}
365
-        onClick={() => this.debounceTableRowClick(item)}
366
-        onDoubleClick={() => this.stores.updateTabOrAddTab(item.dbInfo)}
367
-      >
368
-        <div className={[styles.rowInner]}>
369
-          {/* <DynamicTooltip placement="right" title={tooltip}> */}
370
-            <Typography.Text ellipsis={true}>{tableName}</Typography.Text>
371
-          {/* </DynamicTooltip> */}
372
-        </div>
373
-      </div>
374
-    )
375
-  }
376
-
377
-  getTableColumns = () => {
378
-    const { selectedFullDbName } = this.stores.state
379
-    return [
380
-      {
381
-        title: 'name',
382
-        dataIndex: 'name',
383
-        key: 'key',
384
-        ellipsis: true,
385
-        render: (text, item, index) => {
386
-          const { dsName, dbName } = item.dbInfo
387
-          const tooltip = selectedFullDbName == '全部' ? `${dsName}.${dbName}.${text}` : text
388
-          return (
389
-            <div>
390
-              {/* <DynamicTooltip placement="right" title={tooltip}> */}
391
-                <Typography.Text ellipsis={true}>{text}</Typography.Text>
392
-              {/* </DynamicTooltip> */}
393
-            </div>
394
-          )
395
-        }
396
-      }
397
-    ]
398
-  }
399
-  render() {
400
-    const { selectedFullDbName, treeExpandKeys, fieldSelectedId, selectedTableRow } = this.stores.state
401
-    const { selectedDbTables } = this.stores
402
-    const { treeMaxHeight } = this.state
403
-    return (
404
-        <div className={[styles.containerInside]}>
405
-          <div id="sqlIndexDsTreeSelectContainer" className={[styles.top]}>
406
-            <TreeSelect
407
-              showSearch
408
-              className={[styles.containerContent]}
409
-              dropdownStyle={{
410
-                textOverflow: 'clip',
411
-                maxHeight: treeMaxHeight,
412
-                maxWidth: 225,
413
-                marginBottom: 16,
414
-                overflowX: 'hidden'
415
-              }}
416
-              // 留出与底部的距离
417
-              listHeight={treeMaxHeight - 20}
418
-              placeholder="请选择"
419
-              // 下拉框显示的内容对应的变量名
420
-              treeNodeLabelProp={'selectedFullDbName'}
421
-              treeDefaultExpandedKeys={this.defaultExpandedKeys}
422
-              treeExpandedKeys={treeExpandKeys}
423
-              value={selectedFullDbName}
424
-              onChange={(value, label, extra) => {
425
-                if (value == '全部') {
426
-                  this.stores.getTables().then(() => {
427
-                    this.stores.updateTablesAndSetDefault(true)
428
-                  })
429
-                } else {
430
-                  const parentData = extra.triggerNode.props
431
-                  const dsId = parentData.parentId
432
-                  const dsName = parentData.parentName
433
-                  // value=数据源名+数据库名
434
-                  const dbName = value.split('.')[1]
435
-  
436
-                  this.stores.updateSelectedFullName(value)
437
-                  this.stores
438
-                    .getTables({
439
-                      dsId: dsId,
440
-                      dataBaseName: dbName
441
-                    })
442
-                    .then(() => {
443
-                      this.stores.resetSelectedTables()
444
-                      this.stores.getFirstTableFields()
445
-                    })
446
-                  this.stores.updateDbInfo({
447
-                    dsId: dsId,
448
-                    dsName: dsName,
449
-                    dbName: dbName
450
-                  })
451
-                }
452
-              }}
453
-              onTreeExpand={(keys) => {
454
-                this.stores.updateTreeExpandedKeys(keys)
455
-              }}
456
-            >
457
-              {this.dbsTreeNode}
458
-            </TreeSelect>
459
-            <SearchInput
460
-              size={'small'}
461
-              placeholder="请输入表名搜索"
462
-              allowClear
463
-              onSearch={(text) => {
464
-                this.doSearch(text)
465
-              }}
466
-              onChange={(e) => {
467
-                const { value } = e.target
468
-                if (value.length == 0) {
469
-                  this.stores.resetSelectedTables()
470
-                }
471
-  
472
-                this.doSearch(value)
473
-              }}
474
-            />
475
-                      <div ref={this.leftTopDataListContainer} className={[styles.dataList]}>
476
-            <AutoSizer>
477
-              {({ height, width }) => {
478
-                return (
479
-                  <List
480
-                    className={[styles.autoHideScroller]}
481
-                    height={height}
482
-                    itemCount={this.getTableDS(selectedDbTables).length}
483
-                    itemSize={34}
484
-                    width={width}
485
-                  >
486
-                    {(item) => {
487
-                      // 第二个参数在这里没有实际用到,只是为了在selectedTableRow发生变化时触发mobx的渲染机制,切勿去掉
488
-                      return this.topRowRenderer(item, selectedTableRow)
489
-                    }}
490
-                  </List>
491
-                )
492
-              }}
493
-            </AutoSizer>
494
-          </div>
495
-        </div>
496
-        <span id="sqlIndexLeftResizeLine" className={[styles.resizableLine]}></span>
497
-        <div id="bottomDataList" className={[styles.bottomDataList]}>
498
-          <div className={[styles.innerTableContainer]}>
499
-            {/* <Spin spinning={tableFieldsLoading}> */}
500
-            <Table
501
-              showHeader={false}
502
-              pagination={false}
503
-              columns={this.fieldColumns}
504
-              dataSource={this.getFieldDS()}
505
-              onRow={this.handleFieldClickRow}
506
-              rowClassName={(record, index) => {
507
-                return fieldSelectedId == index ? styles.tableRowSelected : null
508
-              }}
509
-            />
510
-            {/* </Spin> */}
511
-          </div>
512
-        </div>
513
-      </div>
514
-    )
515
-  }
516
-}

+ 0 - 13
src/pages/SqlIndex/SearchInput/SearchInput.jsx

@@ -1,13 +0,0 @@
1
-import React from 'react'
2
-import { Input } from 'antd'
3
-import { SearchOutlined } from '@ant-design/icons'
4
-import styles from './SearchInputStyle.less'
5
-
6
-// 自定义搜索图标的输入框,antd4自带的搜索框太难调样式
7
-export const SearchInput = (props) => {
8
-  return (
9
-    <div className={styles.rootContainer}>
10
-      <Input className={styles.container} {...props} suffix={<SearchOutlined />}></Input>
11
-    </div>
12
-  )
13
-}

+ 0 - 33
src/pages/SqlIndex/SearchInput/SearchInputStyle.less

@@ -1,33 +0,0 @@
1
-.rootContainer {
2
-
3
-    :global {
4
-        .ant-input-suffix {
5
-            display: inline-flex;
6
-            position: absolute;
7
-            right: 10px;
8
-        }
9
-
10
-        // 覆盖输入框宽度样式,默认是100%
11
-        .ant-input-group-wrapper {
12
-            width: auto;
13
-        }
14
-
15
-        & .ant-input-affix-wrapper {
16
-            width: auto;
17
-            white-space: nowrap;
18
-        }
19
-
20
-        .anticon-search {
21
-            cursor: pointer;
22
-        }
23
-
24
-    }
25
-
26
-    .container {
27
-        display: flex;
28
-        height: 32px;
29
-        margin: 10px 16px;
30
-        position: relative;
31
-        align-items: center;
32
-    }
33
-}

+ 0 - 36
src/pages/SqlIndex/SqlEditor/ButtonWithIcon.jsx

@@ -1,36 +0,0 @@
1
-import React, { Component } from 'react'
2
-import { Button } from 'antd'
3
-import styles from './style.less'
4
-
5
-export default class ButtonWithIcon extends Component {
6
-  constructor(props) {
7
-    super(props)
8
-    this.state = {
9
-      formatBtnIconType: this.props.normalicontype
10
-    }
11
-  }
12
-
13
-  render() {
14
-    const { formatBtnIconType } = this.state
15
-
16
-    return (
17
-      <Button
18
-        className={styles.sqlButton}
19
-        type="default"
20
-        onMouseEnter={() => {
21
-          this.setState({
22
-            formatBtnIconType: this.props.hovericontype
23
-          })
24
-        }}
25
-        onMouseLeave={() => {
26
-          this.setState({
27
-            formatBtnIconType: this.props.normalicontype
28
-          })
29
-        }}
30
-        {...this.props}
31
-      >
32
-        {this.props.children}
33
-      </Button>
34
-    )
35
-  }
36
-}

+ 0 - 167
src/pages/SqlIndex/SqlEditor/style.less

@@ -1,167 +0,0 @@
1
-.rootContainer {
2
-    height: 100%;
3
-
4
-    // 父容器是display: flex
5
-    flex: 1;
6
-    display: flex;
7
-    flex-direction: column;
8
-
9
-    .nameBar {
10
-        width: 100%;
11
-        height: 40px;
12
-
13
-        background: #fafbfc;
14
-
15
-        // .content {
16
-        //     vertical-align: middle;
17
-        //     display: inline-block;
18
-        //     line-height: 40px;
19
-
20
-        //     margin-left: 10px;
21
-
22
-        //     width: 300px;
23
-            
24
-        //     white-space: nowrap;
25
-        //     text-overflow: ellipsis;
26
-        //     overflow: hidden;
27
-        // }
28
-    }
29
-
30
-    .operationBar {
31
-        width: 100%;
32
-        height: 52px;
33
-
34
-        display: flex;
35
-        align-items: center;
36
-        justify-content: space-between;
37
-
38
-        .leftIcons {
39
-            height: 100%;
40
-
41
-            padding-top: 12px;
42
-            padding-bottom: 12px;
43
-            margin-left: 16px;
44
-
45
-            display: flex;
46
-            align-items: center;
47
-            justify-content: space-between;
48
-
49
-            & :not(:first-child) {
50
-                margin-left: 8px;
51
-            }
52
-
53
-            .sqlButton {
54
-                transition: all 0.3s;
55
-                height: 28px;
56
-
57
-                &:hover {
58
-                    opacity: 0.7;
59
-                }
60
-            }
61
-
62
-            .sqlRunningButton {
63
-                background-color: white;
64
-                border-color: red;
65
-                color: red;
66
-            }
67
-
68
-            .iconContainer {
69
-                margin-left: 20px;
70
-                cursor: pointer;
71
-                transform: scale(1.1);
72
-
73
-                &:hover {
74
-                    opacity: 0.8;
75
-                }
76
-
77
-                .text {
78
-                    margin-left: 3px;
79
-                    color: #5a89cf;
80
-                }
81
-            }
82
-        }
83
-
84
-        .innerRight {
85
-            display: flex;
86
-            flex-direction: row-reverse;
87
-            margin-right: 16px;
88
-            width: 60%;
89
-
90
-            .seperator {
91
-                color: #e1e1e1;
92
-                margin: 0 8px;
93
-            }
94
-
95
-            .content {
96
-                margin-right: 0;
97
-                max-width: 70%;
98
-            }
99
-
100
-            .executeTime {
101
-                margin-right: 0;
102
-                white-space: nowrap;
103
-            }
104
-        }
105
-    }
106
-    
107
-    .editorContainer {
108
-        // SQL编辑器的右下角菜单使用了absolute,所以这里必须用relative
109
-        position: relative;
110
-        min-height: 50px;
111
-        margin: 16px;
112
-        margin-top: 0;
113
-        flex: 1;
114
-
115
-        :global {
116
-
117
-            // 覆盖sql编辑器默认样式
118
-            .monaco-editor,
119
-            .monaco-editor-background,
120
-            .monaco-editor .inputarea.ime-input,
121
-            .monaco-editor .margin {
122
-                background-color: #f8f8f8;
123
-            }
124
-
125
-            .decorationsOverviewRuler {
126
-                display: none
127
-            }
128
-        }
129
-    }
130
-
131
-    .hoverArea {
132
-        position: absolute;
133
-        bottom: 0;
134
-
135
-        width: 100%;
136
-        height: 30px;
137
-        display: flex;
138
-        flex-direction: column;
139
-        opacity: 0;
140
-        transition: all 0.3s;
141
-
142
-        .operationButton {
143
-            position: absolute;
144
-            width: 64px;
145
-            height: 20px;
146
-            bottom: 16px;
147
-            left: 50%;
148
-            transform: translateX(-50%);
149
-
150
-            display: flex;
151
-            justify-content: center;
152
-            align-items: center;
153
-
154
-            background-color: #EAEDF0;
155
-            border-radius: 4px;
156
-
157
-            &:hover {
158
-                cursor: pointer;
159
-            }
160
-        }
161
-
162
-        &:hover {
163
-            opacity: 1;
164
-        }
165
-    }
166
-
167
-}

+ 0 - 558
src/pages/SqlIndex/SqlEditor/view.jsx

@@ -1,558 +0,0 @@
1
-import React, { Component } from 'react'
2
-import { message, Button, Col, Row, Input, Modal, Tooltip } from 'antd'
3
-import { inject, observer } from 'mobx-react'
4
-import { Editor, CompletionItemKind } from 'bravo-editor'
5
-import styles from './style.less'
6
-import { isEmpty, debounce } from 'lodash'
7
-import { computed } from 'mobx'
8
-import ButtonWithIcon from './ButtonWithIcon'
9
-import SqlIndexMod from '../SqlIndexMod'
10
-import { UpOutlined, } from '@ant-design/icons'
11
-import { format } from 'sql-formatter';
12
-const { confirm } = Modal
13
-let sqlResultCache = {} //对sql请求的结果进行缓存,防止频发请求
14
-
15
-// 在视图注入module层数据
16
-
17
-// 将组件设置为响应式组件,成为观察者,以便响应被观察数据的变化
18
-@observer
19
-class SqlEditorTabs extends Component {
20
-  constructor(props, context) {
21
-    super(props, context)
22
-    this.stores = SqlIndexMod
23
-    this.rootContainerRef = React.createRef()
24
-    this.editorRef = React.createRef()
25
-    this.hoverAreaRef = React.createRef()
26
-
27
-    this.state = {
28
-      isVerticalExpanded: false,
29
-      isShowSqlFileSaveModel: false,
30
-      maxExpandHeightOfEditor: props.maxExpandHeightOfEditor,
31
-      useStandardFormat: false
32
-    }
33
-  }
34
-
35
-  oldActiveTabKey = ''
36
-
37
-  componentDidMount() {
38
-    /**
39
-     * bravo-editor(版本1.3.11)源码中useStandardFormat为false时,getSelections()不会返回选中的内容。
40
-     * 不能初始化useStandardFormat为true,因为那样会导致handleFormat的格式化功能失效。
41
-     * 如果在编辑器实例化(渲染)完成后修改它的useStandardFormat属性,使其可以返回选中内容。
42
-     *
43
-     * useStandardFormat为true的情况下,不能直接使用默认的handleFormat(),因为此时在有选中内容的情况下可能产生问题
44
-     * 所以,格式化时需要调用editor.getAction('editor.action.formatDocument').run()对全量内容进行格式化
45
-     */
46
-    this.setState({
47
-      useStandardFormat: true
48
-    })
49
-
50
-    this.editorContainer = document.getElementById('sqlEditor')
51
-    this.editorContainer.addEventListener('mousedown', this.handleEditorMouseDown)
52
-
53
-    this.editorContainer.addEventListener('keyup', (e) => {
54
-      this.debounceCheckCursorPosAndShowButton()
55
-    })
56
-
57
-    this.hoverAreaRef.current.addEventListener('mouseenter', this.handleHoverAreaMouseEnter)
58
-    this.hoverAreaRef.current.addEventListener('mouseleave', this.handleHoverAreaMouseLeave)
59
-  }
60
-
61
-  handleHoverAreaMouseEnter = () => {
62
-    this.showHoverArea()
63
-  }
64
-
65
-  showHoverArea = () => {
66
-    this.hoverAreaRef.current.style.opacity = 1
67
-  }
68
-
69
-  handleHoverAreaMouseLeave = () => {
70
-    this.hideHoverArea()
71
-  }
72
-
73
-  hideHoverArea = () => {
74
-    this.hoverAreaRef.current.style.opacity = 0
75
-  }
76
-  componentWillUnmount() {
77
-    this.editorContainer.removeEventListener('mousedown', this.handleEditorMouseDown)
78
-    this.hoverAreaRef.current.removeEventListener('mouseenter', this.handleHoverAreaMouseEnter)
79
-    this.hoverAreaRef.current.addEventListener('mouseleave', this.handleHoverAreaMouseLeave)
80
-  }
81
-
82
-  componentWillReceiveProps(nextProps) {
83
-    const { maxExpandHeightOfEditor } = this.state
84
-    const newMaxHeight = nextProps.maxExpandHeightOfEditor
85
-    if (newMaxHeight != maxExpandHeightOfEditor) {
86
-      this.setState({
87
-        maxExpandHeightOfEditor: newMaxHeight
88
-      })
89
-
90
-      this.checkVerticalExpandState(newMaxHeight)
91
-    }
92
-  }
93
-
94
-  checkVerticalExpandState(maxHeight) {
95
-    const { maxExpandHeightOfEditor, isVerticalExpanded } = this.state
96
-    const newMaxHeight = maxHeight || maxExpandHeightOfEditor
97
-
98
-    if (!isVerticalExpanded && this.rootHeight >= newMaxHeight) {
99
-      this.setState({
100
-        isVerticalExpanded: true
101
-      })
102
-    } else if (isVerticalExpanded && this.rootHeight < newMaxHeight) {
103
-      this.setState({
104
-        isVerticalExpanded: false
105
-      })
106
-    }
107
-  }
108
-
109
-  componentWillUpdate() {
110
-    if (this.oldActiveTabKey != this.stores.activeTabKey) {
111
-      this.oldActiveTabKey = this.stores.activeTabKey
112
-      sqlResultCache = {}
113
-    }
114
-  }
115
-
116
-  rootHeight = 0
117
-  editorHeight = 0
118
-  componentDidUpdate() {
119
-    this.editorHeight = 200
120
-    // this.editorHeight = this.editorContainer.getElementsByClassName('dt-monaco-editor')[0].clientHeight
121
-    this.rootHeight = this.rootContainerRef.current.clientHeight
122
-
123
-    this.checkVerticalExpandState()
124
-  }
125
-
126
-  /**
127
-   * 这里必须使用箭头函数来保证this的正确性
128
-   */
129
-  updateSelectedTextAfterMouseUp = () => {
130
-    document.removeEventListener('mouseup', this.updateSelectedTextAfterMouseUp)
131
-
132
-    const selectedText = this.editorRef.current.editorRef.getSelections().selectionText
133
-    if (selectedText != this.selectedTextInEditor) {
134
-      this.selectedTextInEditor = selectedText
135
-    }
136
-
137
-    this.debounceCheckCursorPosAndShowButton()
138
-  }
139
-
140
-  handleEditorMouseDown = (e) => {
141
-    document.addEventListener('mouseup', this.updateSelectedTextAfterMouseUp)
142
-  }
143
-
144
-  @computed get completionTables() {
145
-    const { dsId, dbName } = this.stores.curActiveTab.dbInfo
146
-    const tables = this.stores.getTablesInSilence({ dsId: dsId, dataBaseName: dbName })
147
-
148
-    return tables.map((value) => {
149
-      return value.tableName
150
-    })
151
-  }
152
-  /**
153
- * 延时触发保存
154
- */
155
-  debounceUpdateSqlEditorContent = debounce(this.updateSqlEditorContent, 300)
156
-
157
-  updateSqlEditorContent(editValue) {
158
-    this.stores.updateSqlEditorValue(editValue)
159
-  }
160
-
161
-  /**
162
-   * 延时触发光标位置检查
163
-   */
164
-  debounceCheckCursorPosAndShowButton = debounce(this.checkCursorPosAndShowButton, 300)
165
-
166
-  /**
167
-   * 根据光标距离编辑器底部的距离来展示折叠/展开的按钮
168
-   */
169
-  checkCursorPosAndShowButton() {
170
-    if (this.state.isVerticalExpanded) {
171
-      this.hoverAreaRef.current.style.opacity = 0
172
-      return
173
-    }
174
-
175
-    const currentLines = this.editorContainer.getElementsByClassName('current-line')
176
-
177
-    if (currentLines && currentLines.length > 0) {
178
-      // 光标所在位置距离顶部的距离
179
-      const cursorPosY = currentLines[0].getBoundingClientRect().top
180
-      if (cursorPosY - this.editorHeight > 110) {
181
-        this.hoverAreaRef.current.style.opacity = 1
182
-      } else {
183
-        this.hoverAreaRef.current.style.opacity = 0
184
-      }
185
-    }
186
-  }
187
-  renderSqlEdit() {
188
-    const { useStandardFormat } = this.state
189
-    const { data, dbInfo } = this.stores.curActiveTab
190
-    const types = {
191
-      SAMPLE_TYPE_ONE: {
192
-        text: '样例类型1',
193
-        kind: CompletionItemKind.Method
194
-      },
195
-      SAMPLE_TYPE_TWO: {
196
-        text: '样例类型2',
197
-        kind: CompletionItemKind.Method
198
-      },
199
-      KEYWORD: {
200
-        text: '关键词',
201
-        kind: CompletionItemKind.Keyword
202
-      },
203
-      CONSTS: {
204
-        text: '常量',
205
-        kind: CompletionItemKind.Snippet
206
-      },
207
-      FUNCTION: {
208
-        text: '函数',
209
-        kind: CompletionItemKind.Function
210
-      },
211
-      TABLE: {
212
-        text: '表名',
213
-        kind: CompletionItemKind.Method
214
-      },
215
-      TABLEALIAS: {
216
-        text: '表别名',
217
-        kind: CompletionItemKind.Method
218
-      },
219
-      FIELD: {
220
-        text: '表字段',
221
-        kind: CompletionItemKind.Field
222
-      },
223
-      FIELDALIAS: {
224
-        text: '表字段别名',
225
-        kind: CompletionItemKind.Field
226
-      },
227
-      SNIPPET: {
228
-        text: '代码块',
229
-        kind: CompletionItemKind.Snippet
230
-      },
231
-      STREAM_FUNCTION: {
232
-        text: '函数',
233
-        kind: CompletionItemKind.Function
234
-      },
235
-      STREAM_TABLE_FIELD: {
236
-        text: '表字段',
237
-        kind: CompletionItemKind.Field
238
-      }
239
-    }
240
-    // 编辑器配置
241
-    const editorOpts = {
242
-      operation: false,
243
-      readOnly: false,
244
-
245
-      // onFormat是在默认格式化执行完成后,对编辑框内的所有内容进行二次处理
246
-      // onFormat: (value) => {
247
-      // },
248
-      onChange: (val) => {
249
-        this.debounceUpdateSqlEditorContent(val)
250
-
251
-        // 只要编辑了内容就清除选中文本(很多时候鼠标选中内容是为了直接删掉并编辑新的内容)
252
-        this.selectedTextInEditor = ''
253
-      },
254
-      options: {
255
-        theme: `white`,
256
-        language: 'sql',
257
-        value: data ? data.value : '',
258
-        useStandardFormat: useStandardFormat,
259
-        // formatOnPaste: true,
260
-      },
261
-      completionTypes: types,
262
-      sorter: (type) => {
263
-        switch (type) {
264
-          case 'TABLEALIAS':
265
-          case 'TABLE':
266
-            return 'c'
267
-          case 'FIELD':
268
-          case 'FIELDALIAS':
269
-            return 'd'
270
-          case 'KEYWORD':
271
-          case 'CONSTS':
272
-            return 'e'
273
-          case 'FUNCTION':
274
-            return 'f'
275
-          case 'BIZ_MODULE':
276
-            return 'g'
277
-        }
278
-      },
279
-      // 智能提示表名
280
-      onSuggestTables: (keyword, options) => {
281
-        /**
282
-         * 因为同一个tab中,数据源和数据库都是固定的,所以表名列表也是固定的
283
-         */
284
-        // completionTables只是一个表名的数组
285
-        const entities = this.completionTables.map((value) => {
286
-          const item = {}
287
-          item.label = value
288
-          item.insertText = value
289
-          item.type = 'TABLE'
290
-          item.kind = CompletionItemKind.Method
291
-          item.sortText = 'a'
292
-          return item
293
-        })
294
-        // sqlResultCache[dbInfo.dsId + '_table_' + keyword] = entities
295
-
296
-        return entities
297
-      },
298
-      // 智能提示字段名
299
-      onSuggestFields: (keyword, options) => {
300
-        keyword = keyword.replace('.', '')
301
-        if (sqlResultCache && sqlResultCache[dbInfo.dsId + '_fields_' + keyword]) {
302
-          return sqlResultCache[dbInfo.dsId + '_fields_' + keyword]
303
-        }
304
-
305
-        return this.stores
306
-          .getFieldsInSilence({
307
-            dsId: dbInfo.dsId,
308
-            dataBaseName: dbInfo.dbName,
309
-            tableName: keyword
310
-          })
311
-          .then((curTableFields) => {
312
-            if (curTableFields) {
313
-              // 子项的结构: {columnName: string, columnType: string, columnRemarks: string}
314
-              const entities = curTableFields.map((value) => {
315
-                const item = {}
316
-                item.label = `${value.columnName}  ${value.columnRemarks}`
317
-                item.insertText = value.columnName
318
-                item.type = 'FIELD'
319
-                item.kind = CompletionItemKind.Field
320
-                item.sortText = 'b'
321
-                return item
322
-              })
323
-
324
-              sqlResultCache[dbInfo.dsId + '_fields_' + keyword] = entities
325
-              return entities
326
-            } else {
327
-              return []
328
-            }
329
-          })
330
-      }
331
-    }
332
-
333
-    return <Editor ref={this.editorRef} {...editorOpts} />
334
-  }
335
-  /**
336
- * 执行sql语句, 默认查第一页
337
- * @param {*} dbInfo 数据库信息
338
- * @param {*} sql sql语句
339
- * @param {*} page 查询的页码
340
- */
341
-  executeSql = (dbInfo, sql = null, page = 1) => {
342
-    const { executingSql } = this.stores.curActiveTab
343
-
344
-    let dbInfo_ = dbInfo
345
-    if (isEmpty(dbInfo)) {
346
-      dbInfo_ = this.stores.curActiveTab.dbInfo
347
-    }
348
-
349
-    // 没有传入sql则默认使用之前执行过的语句
350
-    let sqlStr = sql
351
-    if (!sqlStr) {
352
-      sqlStr = executingSql
353
-    }
354
-
355
-    if (!sqlStr) {
356
-      message.warn('请输入sql语句')
357
-      return
358
-    }
359
-    this.stores.getSqlKeyAndExecute({
360
-      dataSourceId: dbInfo_.dsId,
361
-      dataBaseName: dbInfo_.dbName,
362
-      sql: sqlStr,
363
-      pageNum: page,
364
-      pageSize: 10
365
-    })
366
-  }
367
-
368
-  // inputSqlFileName = ''
369
-
370
-  render() {
371
-    const { isVerticalExpanded, isShowSqlFileSaveModel } = this.state
372
-    const { data, dbInfo, executingSqlKey } = this.stores.curActiveTab
373
-    const { curTabSqlLoading } = this.stores
374
-    const tooltipVar = '{city_name}' //tooltip中变量的对应字符串,防止转义
375
-    const scoreVar = '{score}'
376
-    const idVar = '{id}'
377
-    const aidVar = '{aid}'
378
-    const anameVar = '{aname}'
379
-    return (
380
-      <div ref={this.rootContainerRef} className={styles.rootContainer}>
381
-        <div className={styles.operationBar}>
382
-          <div className={styles.leftIcons}>
383
-            <Button
384
-              // loading={curTabSqlLoading}
385
-              type={curTabSqlLoading ? 'danger' : 'primary'}
386
-              onClick={() => {
387
-                if (curTabSqlLoading) {
388
-                  this.stores.cancelExecuteSql(executingSqlKey)
389
-                } else {
390
-                  const editValue = data.value.trim()
391
-                  if (!(dbInfo && dbInfo.dsId)) {
392
-                    message.error('请选择数据源')
393
-                    return
394
-                  }
395
-
396
-                  if (editValue.length == 0) {
397
-                    message.error('请输入SQL内容')
398
-                    return
399
-                  }
400
-
401
-                  this.executeSql(dbInfo, this.selectedTextInEditor ? this.selectedTextInEditor : editValue)
402
-                }
403
-              }}
404
-            >
405
-              {curTabSqlLoading ? '暂停' : '运行'}
406
-            </Button>
407
-            <ButtonWithIcon
408
-              onClick={() => {
409
-                const editorRef_s = this.editorRef.current.editorRef.editor;
410
-                editorRef_s.setValue(
411
-                  format(editorRef_s.getValue(), {
412
-                    indentStyle: 'tabularLeft',
413
-                  }),
414
-                )
415
-              }}
416
-              normalicontype="geshihua"
417
-              hovericontype="geshihua-2"
418
-            >
419
-              格式化
420
-            </ButtonWithIcon>
421
-            <ButtonWithIcon
422
-              onClick={() => {
423
-                const editValue = data.value.trim()
424
-                if (editValue.length == 0) {
425
-                  message.error('请输入SQL内容')
426
-                  return
427
-                }
428
-
429
-                const activeTab = this.stores.curActiveTab
430
-                if (isEmpty(activeTab.dbInfo) || isEmpty(activeTab.dbInfo.dsId) || isEmpty(activeTab.dbInfo.dbName)) {
431
-                  message.error('请选择数据源')
432
-                  return
433
-                }
434
-
435
-                const { fileId, dbInfo, data: editorData, tabName } = this.stores.curActiveTab
436
-                if (fileId) {
437
-                  confirm({
438
-                    title: '确认保存文件吗?',
439
-                    content: `文件名:${tabName}`,
440
-                    okText: '确定',
441
-                    cancelText: '取消',
442
-                    onOk: () => {
443
-                      this.stores.modifyFile({
444
-                        id: fileId,
445
-                        dataBaseName: dbInfo.dbName,
446
-                        dataSourceId: dbInfo.dsId,
447
-                        sqlFileName: tabName,
448
-                        sqlContent: editorData.value
449
-                      })
450
-                    }
451
-                  })
452
-
453
-                  return
454
-                }
455
-
456
-                this.setState({
457
-                  isShowSqlFileSaveModel: true
458
-                })
459
-              }}
460
-              normalicontype="baocun"
461
-              hovericontype="baocun-2"
462
-            >
463
-              保存
464
-            </ButtonWithIcon>
465
-          </div>
466
-          <div className={styles.innerRight}>
467
-            <span className={styles.executeTime}>执行时间:{data && data.time} s</span>
468
-            <span className={styles.seperator}>|</span>
469
-            <span className={styles.content}>
470
-              <Tooltip title={dbInfo && dbInfo.dsName ? `${dbInfo.dsName}.${dbInfo.dbName}` : ''}>
471
-                <span className="textEllipsis">
472
-                  {dbInfo && dbInfo.dsName ? `${dbInfo.dsName}.${dbInfo.dbName}` : ''}
473
-                </span>
474
-              </Tooltip>
475
-            </span>
476
-          </div>
477
-        </div>
478
-        <div id="sqlEditor" className={styles.editorContainer}>
479
-          {this.renderSqlEdit()}
480
-        </div>
481
-        <div ref={this.hoverAreaRef} className={styles.hoverArea}>
482
-          <div
483
-            className={styles.operationButton}
484
-            onClick={() => {
485
-              // 展开,收回
486
-              this.setState(
487
-                {
488
-                  isVerticalExpanded: !isVerticalExpanded
489
-                },
490
-                () => {
491
-                  this.props.onEditorExpand(this.state.isVerticalExpanded)
492
-                }
493
-              )
494
-            }}
495
-          >
496
-            <UpOutlined />
497
-          </div>
498
-        </div>
499
-        {/** 保存SQL文件弹窗 */}
500
-        <Modal
501
-          centered
502
-          destroyOnClose
503
-          title="保存SQL"
504
-          visible={isShowSqlFileSaveModel}
505
-          onOk={() => {
506
-            const fileName = this.inputSqlFileName.trim()
507
-            if (fileName.length == 0) {
508
-              message.error('请输入文件名')
509
-              return
510
-            }
511
-
512
-            this.setState({
513
-              isShowSqlFileSaveModel: false
514
-            })
515
-
516
-            // // 前面已经做过容错判断
517
-            const { dbInfo, data: editorData } = this.stores.curActiveTab
518
-            this.stores
519
-              .addFile({
520
-                dataBaseName: dbInfo.dbName,
521
-                dataSourceId: dbInfo.dsId,
522
-                sqlFileName: fileName,
523
-                sqlContent: editorData.value
524
-              })
525
-              .then((value) => {
526
-                this.stores.updateTabNameAndFileId(fileName, value)
527
-              })
528
-          }}
529
-          onCancel={() => {
530
-            this.setState({
531
-              isShowSqlFileSaveModel: false
532
-            })
533
-          }}
534
-        >
535
-          <div>
536
-            <Row type="flex" align="middle">
537
-              <Col span={3}>
538
-                <span>SQL名称: </span>
539
-              </Col>
540
-              <Col span={21}>
541
-                <Input
542
-                  allowClear
543
-                  placeholder="编写SQL名称"
544
-                  onChange={(e) => {
545
-                    this.inputSqlFileName = e.target.value
546
-                  }}
547
-                ></Input>
548
-              </Col>
549
-            </Row>
550
-          </div>
551
-        </Modal>
552
-      </div>
553
-    )
554
-  }
555
-}
556
-export default SqlEditorTabs
557
-
558
-

+ 0 - 398
src/pages/SqlIndex/SqlEditorTabs/style.less

@@ -1,398 +0,0 @@
1
-@import url("../../../themes/themes.less");
2
-
3
-.subMenuPop {
4
-    ul {
5
-        max-height: 500px;
6
-        overflow: auto;
7
-    }
8
-}
9
-
10
-.sqlFilesModal {
11
-    padding: 0 !important;
12
-
13
-    :global {
14
-
15
-        .ant-modal-body,
16
-        .ant-popover-inner-content,
17
-        .ant-card-body {
18
-            padding: 0 !important;
19
-        }
20
-    }
21
-}
22
-
23
-// 隐藏tabs 显示title
24
-.pageTitle {
25
-    // .yx_yxFont_heading;
26
-    padding: 8 * @yx_yxHd 8 * @yx_yxHd @yx_yxHd 8 * @yx_yxHd;
27
-}
28
-
29
-//页签栏类型
30
-.yx_yxTabsbar_navigation {
31
-    .more {
32
-        color: @yx_yxColor_neutral_2;
33
-    }
34
-
35
-    //更多选项颜色
36
-    .leftBorderColor {
37
-        border-left: 1px @yx_yxColor_neutral_6 solid !important;
38
-    }
39
-
40
-    .backgrioundColor {
41
-        background-color: @yx_yxColor_neutral_8  !important;
42
-    }
43
-}
44
-
45
-//页签
46
-.yx_yxTabs_navigation {
47
-
48
-    //默认状态
49
-    .yx_yxTabs_navigation_normal {
50
-        .text {
51
-            // .yx_yxFont_base(inherit);
52
-        }
53
-
54
-        //文字类型
55
-        .textColor {
56
-            color: @yx_yxColor_neutral_3  !important;
57
-        }
58
-
59
-        //文字颜色
60
-        .closeColor {
61
-            color: @yx_yxColor_brand_10  !important;
62
-        }
63
-
64
-        //关闭图标颜色
65
-        .rightBorderColor {
66
-            // border-right: 1px @yx_yxColor_neutral_6 solid !important;
67
-        }
68
-
69
-        .tabsLeftLine {
70
-            &:before {
71
-                content: "";
72
-                background-color: @yx_yxColor_neutral_6;
73
-                width: 1px;
74
-                height: 16px;
75
-                display: block;
76
-                margin-left: -16px;
77
-                margin-top: 10px;
78
-                float: left;
79
-            }
80
-
81
-            &:after {
82
-                content: "";
83
-                margin-top: -3px;
84
-            }
85
-        }
86
-
87
-        //右侧隔线颜色
88
-        .backgrioundCOlor {
89
-            background-color: @yx_yxColor_neutral_9  !important;
90
-        }
91
-
92
-        //小圆圈边框颜色
93
-        .tipsBorder {
94
-            border: 1px @yx_yxColor_brand_9 solid !important;
95
-        }
96
-
97
-        //背景颜色
98
-        .tipsBackgroundColor {
99
-            background-color: @yx_yxColor_neutral_8  !important;
100
-        }
101
-
102
-        //小圆圈背景颜色
103
-    }
104
-    
105
-    //鼠标移过
106
-    .yx_yxTabs_navigation_hover {
107
-        .textColor {
108
-            color: @yx_yxColor_neutral_1  !important;
109
-        }
110
-
111
-        //文字类型
112
-        .closeColor {
113
-            color: @yx_yxColor_brand_2  !important;
114
-        }
115
-
116
-        //小圆圈边框颜色
117
-        .tipsBorder {
118
-            border: 1px @yx_yxColor_brand_10 solid !important;
119
-        }
120
-
121
-        //关闭图标颜色
122
-    }
123
-
124
-    .yx_yxTabs_navigation_press {
125
-        .closeColor {
126
-            color: @yx_yxColor_brand_1  !important;
127
-        }
128
-
129
-        //关闭图标颜色
130
-    }
131
-
132
-    //选中状态
133
-    .yx_yxTabs_navigation_selected {
134
-        .text {
135
-            // .yx_yxFont_subhead(inherit);
136
-        }
137
-
138
-        //文字类型
139
-        .textColor {
140
-            color: @yx_yxColor_neutral_1  !important;
141
-        }
142
-
143
-        //文字颜色
144
-        .tipsBackgroundColor {
145
-            background-color: @yx_yxColor_brand_1  !important;
146
-        }
147
-
148
-        //文字类型
149
-        .closeColor {
150
-            color: @yx_yxColor_brand_2  !important;
151
-        }
152
-
153
-        //小圆圈背景颜色
154
-        .yuanBg {
155
-            background-color: @yx_yxColor_brand_1  !important;
156
-        }
157
-
158
-        //小圆圈边框颜色
159
-        .tipsBorder {
160
-            border: 1px @yx_yxColor_brand_1 solid !important;
161
-        }
162
-
163
-        .backgroundColor {
164
-            background-color: #fff !important;
165
-        }
166
-    }
167
-}
168
-
169
-//页签大小
170
-.yx_yxTabs_size_navigation {
171
-    height: 18 * @yx_yxHd;
172
-    line-height: 18 * @yx_yxHd;
173
-    padding-left: 8 * @yx_yxHd;
174
-    padding-right: 8 * @yx_yxHd;
175
-}
176
-.router-tabs {
177
-
178
-    .clickableIcon {
179
-        cursor: pointer;
180
-        padding: 10px;
181
-
182
-        :hover {
183
-            opacity: 0.8 !important;
184
-        }
185
-    }
186
-
187
-    // .yx_yxShadow_down;
188
-    // border-bottom  : 1px @yx_yxColor_neutral_6 solid;
189
-    user-select: none;
190
-    display: flex;
191
-    justify-content: space-between;
192
-    transition: all 0.3s;
193
-    position: relative;
194
-    z-index: 10;
195
-    padding: 0 !important;
196
-
197
-    >div>div {
198
-        padding: 0 !important;
199
-    }
200
-
201
-    .yx_yxTabs_size_navigation;
202
-    .yx_yxTabsbar_navigation.backgrioundColor;
203
-    .yx_yxTabsbar_navigation.leftBorderColor;
204
-
205
-    :global {
206
-        .ant-tag {
207
-            background: none;
208
-            transition: none;
209
-        }
210
-    }
211
-    .tag {
212
-        // border-bottom: 1px @yx_yxColor_neutral_5 solid;
213
-        .yx_yxTabs_size_navigation;
214
-        .yx_yxTabs_navigation.yx_yxTabs_navigation_normal.rightBorderColor;
215
-        .yx_yxTabs_navigation.yx_yxTabs_navigation_normal.tabsLeftLine;
216
-        .yx_yxTabs_navigation.yx_yxTabs_navigation_normal.text;
217
-        .yx_yxTabs_navigation.yx_yxTabs_navigation_normal.textColor;
218
-        .yx_yxTabs_navigation.yx_yxTabs_navigation_normal.backgrioundCOlor;
219
-        border: 0;
220
-        border-radius: 0;
221
-        cursor: pointer;
222
-        margin: 0;
223
-        padding-top: 4px;
224
-
225
-        span:not(span[role="img"]) {
226
-            .yx_yxTabs_navigation.yx_yxTabs_navigation_normal.tipsBorder;
227
-            .yx_yxTabs_navigation.yx_yxTabs_navigation_normal.backgrioundCOlor;
228
-        }
229
-
230
-        &:hover {
231
-            .yx_yxTabs_navigation.yx_yxTabs_navigation_hover.textColor;
232
-
233
-            span:not(span[role="img"]) {
234
-                .yx_yxTabs_navigation.yx_yxTabs_navigation_hover.tipsBorder;
235
-            }
236
-        }
237
-
238
-        .icon {
239
-            display: inline-block;
240
-            .yx_yxCircle_sm;
241
-            margin-right: 4 * @yx_yxHd;
242
-            border-radius: 50%;
243
-            border-color: @yx_yxColor_brand_9;
244
-            background-color: @yx_yxColor_neutral_8;
245
-        }
246
-
247
-        span[role="img"] {
248
-            margin-left: 8 * @yx_yxHd;
249
-            font-size: 10px;
250
-            position: relative;
251
-            // top        : 2px;
252
-            .yx_yxTabs_navigation.yx_yxTabs_navigation_normal.closeColor;
253
-
254
-            &:hover {
255
-                .yx_yxTabs_navigation.yx_yxTabs_navigation_hover.closeColor;
256
-            }
257
-
258
-            &:active {
259
-                .yx_yxTabs_navigation.yx_yxTabs_navigation_press.closeColor;
260
-            }
261
-        }
262
-        
263
-        background-position: -120px -3px;
264
-
265
-        &.active {
266
-            &+.tag {
267
-                &:before {
268
-                    background-color: #fff;
269
-                }
270
-            }
271
-
272
-            .yx_yxTabs_navigation.yx_yxTabs_navigation_selected.text;
273
-            .yx_yxTabs_navigation.yx_yxTabs_navigation_selected.textColor;
274
-            // .yx_yxTabs_navigation.yx_yxTabs_navigation_selected.backgroundColor;
275
-            border-bottom: 0;
276
-
277
-            &:before {
278
-                content: "";
279
-                margin-top: -3px;
280
-                width: 16px;
281
-                height: 36px;
282
-                // background-image: url("assets/imgs/tabsAction.png");
283
-                background-size: 134px;
284
-                background-position: -1px 0px;
285
-                background-color: #fff;
286
-            }
287
-
288
-            &:after {
289
-                content: "";
290
-                margin-top: -3px;
291
-                width: 16px;
292
-                height: 36px;
293
-                float: right;
294
-                margin-right: -16px;
295
-                background-size: 134px;
296
-                background-position: -117px 0px;
297
-                // background-image: url("assets/imgs/tabsAction.png");
298
-                background-color: #fff;
299
-            }
300
-
301
-            height: 36px; //覆盖外层阴影
302
-            // background-image: url("assets/imgs/tabsActionCenter.png");
303
-            background-size: 6px;
304
-            background-position: -120px -3px;
305
-            background-repeat: repeat-x;
306
-
307
-            .icon {
308
-                .yx_yxTabs_navigation.yx_yxTabs_navigation_selected.yuanBg;
309
-                .yx_yxTabs_navigation.yx_yxTabs_navigation_selected.tipsBorder;
310
-            }
311
-        }
312
-
313
-        &[ant-click-animating-without-extra-node="true"] {
314
-            position: static;
315
-            transition: none;
316
-
317
-            &:after {
318
-                position: static;
319
-                opacity: 1;
320
-                transition: none;
321
-                animation: none;
322
-            }
323
-        }
324
-    }
325
-
326
-    >div:nth-child(2) {
327
-        width: 40px !important;
328
-        border-top: 0 !important;
329
-        line-height: 0 !important;
330
-        padding: 0 !important;
331
-    }
332
-    
333
-    :global {
334
-        .close-box {
335
-            // 固定宽度,避免被flex挤压
336
-            width: 39px;
337
-
338
-            border-left: 1px solid @yx_yxColor_brand_9;
339
-            border-bottom: 3px #f3f4f6 solid;
340
-            height: 39px;
341
-        }
342
-
343
-        .ant-dropdown-trigger {
344
-            background-color: #fff !important;
345
-            width: 100%;
346
-            height: 100%;
347
-            cursor: pointer;
348
-            position: relative;
349
-
350
-            &:hover {
351
-                .icon {
352
-                    border-color: @yx_yxColor_brand_10;
353
-                }
354
-
355
-                span[role="img"] {
356
-                    color: @yx_yxColor_brand_2;
357
-                }
358
-            }
359
-
360
-            span[role="img"] {
361
-                color: @yx_yxColor_brand_10  !important;
362
-            }
363
-        }
364
-    }
365
-}
366
-
367
-:global {
368
-
369
-    .close-box-mune,
370
-    .close-box-sub-menu {
371
-
372
-        .ant-dropdown-menu-item:hover,
373
-        .ant-dropdown-menu-submenu-title:hover {
374
-            background-color: #fff;
375
-            color: @yx_yxColor_brand_1;
376
-
377
-            span[role="img"] {
378
-                color: @yx_yxColor_brand_1;
379
-            }
380
-        }
381
-    }
382
-    
383
-    .close-icon {
384
-        margin-left: 8 * @yx_yxHd;
385
-        font-size: 10px;
386
-        position: relative;
387
-        // top        : 2px;
388
-        .yx_yxTabs_navigation.yx_yxTabs_navigation_normal.closeColor;
389
-
390
-        &:hover {
391
-            .yx_yxTabs_navigation.yx_yxTabs_navigation_hover.closeColor;
392
-        }
393
-
394
-        &:active {
395
-            .yx_yxTabs_navigation.yx_yxTabs_navigation_press.closeColor;
396
-        }
397
-    }
398
-}

+ 0 - 341
src/pages/SqlIndex/SqlEditorTabs/view.jsx

@@ -1,341 +0,0 @@
1
-import React, { Component } from 'react'
2
-import { observer, inject } from 'mobx-react'
3
-import { checkIsIe10 } from "@utils/util";
4
-import { SnippetsOutlined, PlusOutlined, QuestionCircleOutlined, DeleteOutlined,DashOutlined } from '@ant-design/icons'
5
-import { Tag, Dropdown, Tooltip, Menu, Modal } from 'antd'
6
-import classNames from 'classnames'
7
-
8
-import styles from './style.less'
9
-import SqlIndexMod from '../SqlIndexMod'
10
-// import { YxAction, YxText } from 'yx-widget'
11
-import CubeI8N from '@utils/cubeI8N'
12
-import { autorun, computed } from 'mobx'
13
-
14
-import FilesPopUp from '../FilesPopUp/view'
15
-/**
16
- * 关联了sql编辑器与查询结果的tab菜单
17
- */
18
-// 在视图注入module层数据
19
-// 将组件设置为响应式组件,成为观察者,以便响应被观察数据的变化
20
-@observer
21
-export default class extends Component {
22
-  constructor(props) {
23
-    super(props)
24
-
25
-    this.tabsRef = React.createRef()
26
-    this.stores = SqlIndexMod
27
-    this.state = {
28
-      isShowFileListPanel: false
29
-    }
30
-
31
-    this.CubeI8N = new CubeI8N()
32
-  }
33
-
34
-  componentDidUpdate() {
35
-    this.scrollIntoTags(this.activeTabKey)
36
-  }
37
-
38
-  isLastTab(tabKey) {
39
-    return tabKey == this.stores.lastTabKey
40
-  }
41
-
42
-  @computed get activeTabKey() {
43
-    return this.stores.activeTabKey
44
-  }
45
-
46
-  scrollIntoTags(tabKey) {
47
-    let dom
48
-    try {
49
-      if (this.isLastTab(tabKey)) {
50
-        dom = this.tabsRef.current.querySelector(`[id="iconAdd"]`)
51
-      } else {
52
-        dom = this.tabsRef.current.querySelector(`[data-key="${tabKey}"]`)
53
-      }
54
-
55
-      if (dom === null) {
56
-        // 菜单 还没有加入 导航条(横)
57
-      } else {
58
-        // 菜单 已经加入 导航条(横)
59
-        dom.scrollIntoView(false)
60
-      }
61
-    } catch (e) {
62
-      console.error(e)
63
-    }
64
-  }
65
-
66
-  /**
67
-   * 点击加号新增标签
68
-   * @param {*} e
69
-   * @returns
70
-   */
71
-  handleAdd = (e) => {
72
-    if (e && e.target.tagName.toLowerCase() === 'i') {
73
-      return
74
-    }
75
-
76
-    if (e) {
77
-      // 阻止事件冒泡
78
-      e.stopPropagation()
79
-      e.nativeEvent.stopImmediatePropagation()
80
-    }
81
-
82
-    this.stores.addNewEmptyTab()
83
-  }
84
-
85
-  handleClose = (e, tabKey) => {
86
-    if (e) {
87
-      // 阻止事件冒泡
88
-      e.stopPropagation()
89
-      e.nativeEvent.stopImmediatePropagation()
90
-    }
91
-
92
-    this.stores.closeEditorTab(tabKey).then((value) => {
93
-      this.stores.updateTablesAndSetDefault()
94
-    })
95
-  }
96
-
97
-  handleClickTag = (tabKey, e) => {
98
-    if (e && e.target.tagName.toLowerCase() === 'i') {
99
-      return
100
-    }
101
-
102
-    const { tabKey: activeTabKey } = this.stores.curActiveTab
103
-    if (tabKey !== activeTabKey) {
104
-      this.stores
105
-        .updateState({
106
-          activeTabKey: tabKey
107
-        })
108
-        .then((value) => {
109
-          this.stores.updateTablesAndSetDefault()
110
-        })
111
-    }
112
-  }
113
-
114
-  /**
115
-   * 右侧的【···】菜单
116
-   * @param {*} e
117
-   * @returns
118
-   */
119
-  handleMenuClick = (e) => {
120
-    const eKey = e.key
121
-
122
-    if (0 === this.stores.tabsLength) {
123
-      return false
124
-    }
125
-
126
-    // 关闭其它
127
-    if (eKey === '1') {
128
-      this.stores.closeOtherEditorTabs(this.stores.curActiveTab.tabKey)
129
-    } else {
130
-      this.handleClickTag(eKey)
131
-      return
132
-    }
133
-  }
134
-
135
-  maxTabNameLength = 20
136
-
137
-  /**
138
-   *
139
-   * @param {*} tabKey
140
-   * @param {*} activeTabKey 当前活动页面标题
141
-   * @param {*} tabName 要渲染的页面标题
142
-   * @returns
143
-   */
144
-  renderTag = (tabKey, activeTabKey, tabName, len) => {
145
-    const isLongTag = tabName.length > this.maxTabNameLength
146
-    const iconParam = {
147
-      className: 'close-icon',
148
-      type: 'iconguanbi',
149
-      iconfont: true,
150
-      onClick: (e) => this.handleClose(e, tabKey)
151
-    }
152
-    const DOM = (
153
-      <Tag
154
-        key={tabKey}
155
-        data-key={tabKey}
156
-        className={classNames(styles.tag, {
157
-          [styles.active]: tabKey == activeTabKey
158
-        })}
159
-        onClick={(e) => this.handleClickTag(tabKey, e)}
160
-      >
161
-        <span className={styles.icon} />
162
-        {isLongTag ? `${tabName.slice(0, this.maxTabNameLength)}...` : tabName}
163
-        {len == 1 ? <span style={{ width: '4px', display: 'inline-block', opacity: '0' }}></span> : ''}
164
-        {/* 设计特殊要求当一个时候加宽 */}
165
-        {len > 1 && <DeleteOutlined className="close-icon"
166
-          onClick={(e) => {
167
-            this.handleClose(e, tabKey)
168
-          }}
169
-        />}
170
-      </Tag>
171
-    )
172
-    return DOM
173
-  }
174
-  supportFuncs = (
175
-    <span>
176
-      1、编辑器支持函数如下:
177
-      <br />
178
-      聚合函数:AVG、COUNT、MAX、MIN、SUM。
179
-      <br />
180
-      内置时间函数:DAY、MDY、MONTH、WEEKDAY、YEAR、CURRENT、EXTEND。
181
-      <br />
182
-      字符串操作函数:LOWER、UPPER、INITCAP、REPLACE、SUBSTR、SUBSTRING、LPAD、RPAD。
183
-      <br />
184
-      2、使用数据查询功能时,尽量在sql后面添加: limit 限定查询量,方便快速返回数据。
185
-      <br />
186
-      3、使用下载功能时,sql不需要添加 limit 限定条件。系统默认最多返回的30万的下载数据。
187
-      <br /> 
188
-      4、sql附带注释说明的注释 -- 符号前需要保持空格。
189
-      <br />
190
-      5、遇到超时或者内存不足的查询结果返回时,请加 limit 限定条件,并低频重试几次。
191
-    </span>
192
-  )
193
-
194
-  render() {
195
-    const { editorTabs, activeTabKey } = this.stores.state
196
-    const { isShowFileListPanel } = this.state
197
-
198
-    const cls = classNames(styles['router-tabs'])
199
-    const isIe10 = checkIsIe10()
200
-    const len = this.stores.tabsLength
201
-
202
-    const tags = editorTabs.map((item, index) => {
203
-      if (!item) {
204
-        console.error('your page has incorrect syntax!')
205
-        return <span>&nbsp;</span>
206
-      }
207
-      const { tabKey, tabName } = item
208
-      const isLongTag = tabName.length > this.maxTabNameLength
209
-      const tagElem = this.renderTag(tabKey, activeTabKey, tabName, len)
210
-      return isLongTag ? (
211
-        <Tooltip title={tabName} key={`tooltip_${tabKey}`}>
212
-          {tagElem}
213
-        </Tooltip>
214
-      ) : (
215
-        tagElem
216
-      )
217
-    })
218
-
219
-    /* eslint-disable */
220
-    return (
221
-      <div
222
-        className={cls}
223
-        style={{
224
-          width: '100%'
225
-        }}
226
-      >
227
-        <div
228
-          style={{
229
-            flex: '1',
230
-            height: '39px',
231
-            position: 'relative',
232
-            overflow: 'hidden',
233
-            padding: '0px 0px',
234
-            borderBottom: '3px #f3f4f6 solid'
235
-          }}
236
-        >
237
-          <div
238
-            ref={this.tabsRef}
239
-            style={{
240
-              position: `${isIe10 ? 'inline-block' : 'absolute'}`,
241
-              whiteSpace: 'nowrap',
242
-              marginRight: `${isIe10 ? '-3px' : 0}`,
243
-              width: '100%',
244
-              top: '0px',
245
-              padding: '0px 10px 0px 10px',
246
-              overflowX: 'auto',
247
-              overflowY: 'hidden',
248
-              clear: 'both'
249
-            }}
250
-          >
251
-            {tags}
252
-            {
253
-              <PlusOutlined
254
-                id="iconAdd"
255
-                onClick={(e) => {
256
-                  this.handleAdd(e)
257
-                }}
258
-              />
259
-            }
260
-          </div>
261
-        </div>
262
-        {this.props.children}
263
-        <Tooltip placement="leftTop" title={this.supportFuncs}>
264
-          <QuestionCircleOutlined className={styles.clickableIcon} />
265
-        </Tooltip>
266
-        <Tooltip title="SQL文件">
267
-          <SnippetsOutlined  className={styles.clickableIcon}
268
-            onClick={(e) => {
269
-              this.setState({
270
-                isShowFileListPanel: true
271
-              })
272
-            }}
273
-          />
274
-        </Tooltip>
275
-        <div className="close-box">
276
-          <Dropdown
277
-            overlayClassName={styles.subMenuPop}
278
-            overlay={
279
-              <Menu
280
-                onClick={(e) => {
281
-                  this.handleMenuClick(e)
282
-                }}
283
-                className={`close-box-mune`}
284
-              >
285
-                <Menu.Item key="1">{this.CubeI8N.getString('basic.code-002')}</Menu.Item>
286
-                {tags.map((item) => (
287
-                  <Menu.Item key={item.key}>{item.props.children}</Menu.Item>
288
-                ))}
289
-              </Menu>
290
-            }
291
-          >
292
-            <DashOutlined />
293
-          </Dropdown>
294
-        </div>
295
-
296
-        {/* 文件列表弹窗 */}
297
-        <Modal
298
-          className={styles.sqlFilesModal}
299
-          visible={isShowFileListPanel}
300
-          style={{
301
-            position: 'absolute',
302
-            top: '130px',
303
-            right: '8px'
304
-          }}
305
-          footer={null}
306
-          closable={false}
307
-          mask={false}
308
-          width={FilesPopUp.fixWidth}
309
-          destroyOnClose
310
-          onCancel={() => {
311
-            this.setState({
312
-              isShowFileListPanel: false
313
-            })
314
-          }}
315
-        >
316
-          <FilesPopUp
317
-            onFileSelect={(data) => {
318
-              const tabInfo = {
319
-                tabKey: data.sqlFileName,
320
-                tabName: data.sqlFileName,
321
-                fileId: data.id,
322
-                data: {
323
-                  value: data.sqlContent,
324
-                  time: 0
325
-                },
326
-                dbInfo: {
327
-                  dsId: data.dataSourceId,
328
-                  dsName: data.dataSourceName,
329
-                  dbName: data.dataBaseName
330
-                }
331
-              }
332
-
333
-              this.stores.checkExistAndAddTab(data.sqlFileName, tabInfo)
334
-            }}
335
-          ></FilesPopUp>
336
-        </Modal>
337
-      </div>
338
-    )
339
-  }
340
-}
341
-

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 1361
src/pages/SqlIndex/SqlIndexMod.js


+ 0 - 193
src/pages/SqlIndex/SqlIndexServ.js

@@ -1,193 +0,0 @@
1
-import request from '@utils/request'
2
-import { CancelToken } from 'axios'
3
-
4
-export default class {
5
-  /**
6
-   * 查询用户拥有的所有数据源、数据库、数据表的所有信息
7
-   */
8
-  static getAllDsAndDbsAndTables() {
9
-    return request({
10
-      url: 'api/os/datasource/sqlData/listDsAndDbTables',
11
-      method: 'post',
12
-      // 对应后端的应用工程名
13
-      app: 'ide-op-mgmt-application'
14
-    })
15
-  }
16
-
17
-  /**
18
-   * 查询当前用户所拥有的数据源-数据库列表
19
-   */
20
-  static getAllDsAndDbs() {
21
-    return request({
22
-      url: 'sqlData/listDsAndDbs',
23
-      method: 'GET',
24
-      // 对应后端的应用工程名
25
-      app: 'ide-op-mgmt-application'
26
-    })
27
-  }
28
-
29
-  /**
30
-   * 查询当前用户某个 数据源 某个库 拥有权限的表列表
31
-   * dsId 数据源Id,dataBaseName 数据库名
32
-   * @param {{dsId: number, dataBaseName: string}} params
33
-   */
34
-  static getTables(params) {
35
-    return request({
36
-      url: 'sqlData/listTables',
37
-      method: 'GET',
38
-      data: params,
39
-      // 对应后端的应用工程名
40
-      app: 'ide-op-mgmt-application'
41
-    })
42
-  }
43
-
44
-  /**
45
-   * 查询当前用户 某个数据源 某个库 某个表 的字段列表
46
-   * dsId 数据源Id,dataBaseName 数据库名,tableName 表名
47
-   * @param {{dsId: number, dataBaseName: string, tableName: stirng}} params
48
-   */
49
-  static getFields(params) {
50
-    return request({
51
-      url: 'api/os/datasource/sqlData/listColumns',
52
-      method: 'post',
53
-      data: params,
54
-      // 对应后端的应用工程名
55
-      app: 'ide-op-mgmt-application'
56
-    })
57
-  }
58
-
59
-  /**
60
-   * 查询Sql文件列表
61
-   */
62
-  static getFileList(params) {
63
-    return request({
64
-      url: 'api/os/datasource/sqlData/listSqlFilesByUserAccount',
65
-      method: 'GET',
66
-      data: params,
67
-      // 对应后端的应用工程名
68
-      app: 'ide-op-mgmt-application'
69
-    })
70
-  }
71
-
72
-  static addFile(params) {
73
-    return request({
74
-      url: 'api/os/datasource/sqlData/addSqlFile',
75
-      method: 'POST',
76
-      data: params,
77
-      headers: {
78
-        'Content-type': 'application/json'
79
-      },
80
-      // 对应后端的应用工程名
81
-      app: 'ide-op-mgmt-application'
82
-    })
83
-  }
84
-
85
-  /**
86
-   * 修改Sql文件
87
-   */
88
-  static modifyFile(params) {
89
-    return request({
90
-      url: 'api/os/datasource/sqlData/modSqlFile',
91
-      method: 'POST',
92
-      data: params,
93
-      headers: {
94
-        'Content-type': 'application/json'
95
-      },
96
-      // 对应后端的应用工程名
97
-      app: 'ide-op-mgmt-application'
98
-    })
99
-  }
100
-
101
-  /**
102
-   * 删除Sql文件
103
-   */
104
-  static deleteFile(params) {
105
-    return request({
106
-      url: 'api/os/datasource/sqlData/deleteSqlFile?id=' + params.id,
107
-      method: 'post',
108
-      // 对应后端的应用工程名
109
-      app: 'ide-op-mgmt-application'
110
-    })
111
-  }
112
-
113
-  /**
114
-   * 获取执行sql语句的key
115
-   * 后端执行sql语句和中止sql语句需要根据key来确定对应关系
116
-   * @param {*} params
117
-   * @returns
118
-   */
119
-  static getSqlExecuteKey() {
120
-    return request({
121
-      url: 'api/os/datasource/sqlData/getExecuteSqlKey',
122
-      method: 'GET',
123
-      // 对应后端的应用工程名
124
-      app: 'ide-op-mgmt-application'
125
-    })
126
-  }
127
-
128
-  static preCheckExportExcel(params) {
129
-    return request({
130
-      url: 'api/os/datasource/sqlData/executeSql/preCheckExportExcel',
131
-      method: 'post',
132
-      data: params,
133
-      // 对应后端的应用工程名
134
-      app: 'ide-op-mgmt-application'
135
-    })
136
-  }
137
-
138
-  
139
-  /**
140
-   * 执行sql语句
141
-   */
142
-   static executeSql(params, extraData) {
143
-    params.pageSize = 200
144
-    return request({
145
-      url: 'api/os/datasource/sqlData/executeSql',
146
-      method: 'POST',
147
-      data: params,
148
-      headers: {
149
-        'Content-type': 'application/json'
150
-      },
151
-      // 对应后端的应用工程名
152
-      app: 'ide-op-mgmt-application',
153
-      extraData: extraData
154
-    })
155
-  }
156
-
157
-  /**
158
-   * 中止执行sql语句
159
-   * @param {{executeKey: string}} params
160
-   */
161
-  static cancelExecuteSql(params) {
162
-    return request({
163
-      url: 'api/os/datasource/sqlData/cancelExecute?executeKey=' + params.executeKey,
164
-      method: 'POST',
165
-      data: params,
166
-      headers: {
167
-        'Content-type': 'application/json'
168
-      },
169
-      // 对应后端的应用工程名
170
-      app: 'ide-op-mgmt-application'
171
-    })
172
-  }
173
-
174
-  /**
175
-   * 记录下载操作的日志
176
-   */
177
-  static recordLogOfDownload(params) {
178
-    const urls = params.type == "csv" ? 'api/os/datasource/sqlData/executeSql/exportCvs' : 'api/os/datasource/sqlData/executeSql/exportExcel';
179
-    delete params.type
180
-    return request({
181
-      url: urls,
182
-      method: 'POST',
183
-      responseType: 'arraybuffer',
184
-      data: params,
185
-      headers: {
186
-        'Content-type': 'application/json'
187
-      },
188
-      // 对应后端的应用工程名
189
-      app: 'ide-op-mgmt-application'
190
-    })
191
-  }
192
-}
193
-

+ 0 - 536
src/pages/SqlIndex/SqlIndexStyle.less

@@ -1,536 +0,0 @@
1
-@import url("../../themes/themes.less");
2
-
3
-
4
-:global {
5
-    #dy-table{
6
-        .ant-pagination-simple-pager{
7
-            display:none;
8
-        }
9
-    }
10
-    .ant-btn {
11
-        line-height: 1;
12
-    }
13
-
14
-    .ant-select-tree .ant-select-tree-treenode {
15
-        padding: 4px 0 4px;
16
-    }
17
-
18
-    .ant-select-tree .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected {
19
-        background-color: rgba(24, 97, 242, 0.1);
20
-    }
21
-
22
-    .ant-select-tree .ant-select-tree-node-content-wrapper:hover {
23
-        background-color: rgba(24, 97, 242, 0.1);
24
-    }
25
-
26
-    // 下拉框样式
27
-    .ant-select-tree .ant-select-tree-node-content-wrapper {
28
-        text-overflow: ellipsis;
29
-        vertical-align: bottom;
30
-        overflow: hidden;
31
-    }
32
-
33
-    .ant-select-tree-list-holder {
34
-        overflow: auto !important;
35
-    }
36
-
37
-    .ant-select-tree-list-scrollbar-thumb {
38
-        display: none;
39
-    }
40
-
41
-    .ant-select-tree-node-content-wrapper {
42
-        overflow: hidden;
43
-    }
44
-}
45
-
46
-@globalStylesInResult: {
47
-    :global {
48
-
49
-        .ant-select-tree-list-holder {
50
-            overflow: auto !important;
51
-        }
52
-
53
-        //  .ant-select-tree-list-scrollbar-thumb {
54
-        //     display: none;
55
-        //     height: 0px;
56
-        //  }
57
-
58
-        .ant-select-tree-list-scrollbar,
59
-        .ant-select-tree-list-scrollbar-show {
60
-            display: none;
61
-
62
-        }
63
-
64
-        // 表格“暂无数据”的边框
65
-        .ant-table-placeholder {
66
-            border: none;
67
-        }
68
-
69
-        // 标题栏字段分割线
70
-        .ant-table-thead>tr>th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan]):before {
71
-            width: 0;
72
-        }
73
-
74
-        // 表格标题:“结果”
75
-        .ant-card-head {
76
-            padding: 0 19px;
77
-            font-weight: 700;
78
-            font-size: 14px;
79
-            min-height: 24px;
80
-            margin-bottom: 0;
81
-        }
82
-
83
-        .ant-card-head-title {
84
-            padding: 10px 0;
85
-        }
86
-
87
-        .ant-card-body {
88
-            padding: 0;
89
-            overflow: hidden;
90
-        }
91
-
92
-        .ant-card-extra {
93
-            padding: 0;
94
-        }
95
-
96
-        .ant-card-bordered {
97
-            border: none;
98
-            height: 100%;
99
-        }
100
-
101
-        // 默认隐藏滚动条
102
-        .ant-table-body {
103
-            overflow: auto !important;
104
-            border-bottom: 1px solid #ebebeb;
105
-        }
106
-
107
-        .ant-table.ant-table-bordered>.ant-table-container {
108
-            border-left: none;
109
-        }
110
-
111
-        .ant-table-thead>tr>th,
112
-        .ant-table-tbody>tr>td {
113
-            padding: 6px;
114
-            padding-left: 15px;
115
-        }
116
-
117
-        // 最后一列固定列的标题文本左对齐
118
-        .ant-table-fixed-right .ant-table-fixed .ant-table-thead th {
119
-            text-align: left !important;
120
-        }
121
-
122
-        // 页数指示器右边距
123
-        .ant-table-pagination.ant-pagination {
124
-            margin-right: 16px;
125
-        }
126
-    }
127
-}
128
-
129
-.show {
130
-    display: block;
131
-}
132
-
133
-.hide {
134
-    display: none;
135
-}
136
-
137
-.iconRightBottom {
138
-    position: absolute;
139
-    right: 30px;
140
-    bottom: 30px;
141
-}
142
-
143
-// 分割线宽度
144
-@splitLineWidth: 3px;
145
-// 右上角编辑器模块的高度
146
-@leftTopHeight: 355px;
147
-.sqlIndexView {
148
-    display: flex;
149
-    box-sizing: border-box;
150
-    border-radius: 4px;
151
-
152
-    .tableRowSelected {
153
-        background: #fbfbfc !important;
154
-        color: #5a89cf;
155
-
156
-        :global {
157
-            .ant-typography {
158
-                color: #5a89cf;
159
-            }
160
-        }
161
-
162
-        // 选中行时覆盖hover样式,才能在选中时马上切换样式
163
-        :hover {
164
-            background: #fbfbfc !important;
165
-        }
166
-    }
167
-
168
-    :global {
169
-
170
-        // 表格“暂无数据”的边框
171
-        .ant-table-placeholder {
172
-            border: none;
173
-        }
174
-
175
-        // table 调节单元格高度
176
-        .ant-table-tbody>tr>td,
177
-        .ant-table-thead>tr>th {
178
-            padding: 6px;
179
-
180
-            // 关闭动画
181
-            -webkit-transition: all 0s, border 0s;
182
-            transition: all 0s, border 0s;
183
-        }
184
-    }
185
-
186
-    .containerContent {
187
-        display: flex;
188
-        height: 32px;
189
-        margin: 10px 16px;
190
-        position: relative;
191
-
192
-    }
193
-    @leftContainerWidth: 245px;
194
-
195
-    .containerLeft {
196
-        width: @leftContainerWidth;
197
-        height: 100%;
198
-        background-color: white;
199
-        min-width: 200px;
200
-
201
-        :global {
202
-
203
-            // 覆盖输入框宽度样式,默认是100%
204
-            .ant-input-affix-wrapper {
205
-                width: auto;
206
-            }
207
-        }
208
-    }
209
-
210
-    .containerRight {
211
-        position: relative;
212
-        flex: 1;
213
-        height: 100%;
214
-        min-width: 400px;
215
-        display: flex;
216
-        flex-direction: column;
217
-        background-color: white;
218
-
219
-        .tabBar {
220
-            width: 100%;
221
-            height: 36px;
222
-
223
-            display: flex;
224
-            align-items: center;
225
-        }
226
-
227
-        .containerRightExceptTabbar {
228
-            flex: 1;
229
-
230
-            display: flex;
231
-            flex-direction: column;
232
-            overflow: hidden;
233
-
234
-            .containerSqlEditor {
235
-                flex: 1;
236
-                position: relative;
237
-                width: 100%;
238
-                // 40是tabbar高度,这里的高度是为了使左右两边的分割线对齐
239
-                height: calc(~'@{leftTopHeight} - 41px');
240
-
241
-                // sql编辑器有最小高度限制,这个是它的父容器,也要做限制,否则调节分割线时,超过sql编辑器的最小高度后会把内容挡住
242
-                min-height: 180px;
243
-
244
-                // 解决margin折叠导致容器整体下移的问题,两种方式均可
245
-                // border-top: 1px solid transparent;
246
-                // display: inline-block;
247
-                display: flex;
248
-                flex-direction: column;
249
-
250
-                :global {
251
-                    .ant-empty .ant-empty-normal {
252
-                        margin: 0
253
-                    }
254
-                }
255
-            }
256
-
257
-            .containerSearchResult {
258
-                height: 300px;
259
-                // transition: all 0.3s;
260
-
261
-                .fullScreenIcon {
262
-                    right: 10px;
263
-                    top: 14px;
264
-                }
265
-
266
-                .downloadIcon {
267
-                    margin-right: 20px;
268
-                    color: #9DA1A7;
269
-
270
-                    &:hover {
271
-                        color: #70767F;
272
-                    }
273
-                }
274
-
275
-                .emptyStyle {
276
-                    :global {
277
-                        .ant-table-body {
278
-                            border-bottom: none;
279
-                        }
280
-
281
-                        .ant-table-thead>tr>th {
282
-                            padding: 0;
283
-                        }
284
-
285
-                        .ant-table-tbody>tr>td {
286
-                            border-bottom: none
287
-                        }
288
-                    }
289
-                }
290
-
291
-                @globalStylesInResult();
292
-            }
293
-
294
-            .noTransitions {
295
-                transition: all 0s;
296
-            }
297
-        }
298
-    }
299
-        // 可调节分割线
300
-        .resizableLine {
301
-            display: block;
302
-            width: 100%;
303
-            // 使用min-height来避免调节过程线条宽度被各种原因影响
304
-            min-height: @splitLineWidth;
305
-            border-radius: 2px;
306
-            background-color: #ebedf0;
307
-            z-index: 10;
308
-    
309
-            cursor: s-resize;
310
-    
311
-            &:hover {
312
-                box-shadow: 0 0 5px rgba(71, 109, 171, 1);
313
-                background-color: rgba(71, 109, 171, 1);
314
-            }
315
-        }
316
-    
317
-        // 可调节分割线,垂直方向
318
-        .resizableVerticalLine {
319
-            display: block;
320
-            height: 100%;
321
-            // 使用min-width来避免调节过程线条宽度被各种原因影响
322
-            min-width: @splitLineWidth;
323
-            border-radius: 2px;
324
-            background-color: #ebedf0;
325
-            z-index: 10;
326
-    
327
-            cursor: e-resize;
328
-    
329
-            &:hover {
330
-                box-shadow: 0 0 5px rgba(71, 109, 171, 1);
331
-                background-color: rgba(71, 109, 171, 1);
332
-            }
333
-        }
334
-        .containerInside {
335
-            display: flex;
336
-            flex-direction: column;
337
-    
338
-            width: 100%;
339
-            height: 100%;
340
-    
341
-            // 解决margin折叠导致容器整体下移的问题,两种方式均可
342
-            // border-top: 1px solid transparent;
343
-            // display: inline-block;
344
-    
345
-            :global {
346
-                .ant-table-tbody>tr>td {
347
-                    padding-left: 0;
348
-                    border: none;
349
-                }
350
-            }
351
-    
352
-            .iconLeft {
353
-                display: inline-block;
354
-                width: 10px;
355
-                height: 10px;
356
-                margin: auto 10px;
357
-                margin-left: 0;
358
-                margin-right: 15px;
359
-            }
360
-    
361
-            .top {
362
-                position: relative;
363
-                display: flex;
364
-                flex-direction: column;
365
-    
366
-                height: @leftTopHeight;
367
-                min-height: 200px;
368
-                flex: 1;
369
-    
370
-                :global {
371
-                    .ant-btn {
372
-                        border-left: none;
373
-                    }
374
-                }
375
-            }
376
-            
377
-        .tableRow {
378
-            padding: 6px 16px;
379
-
380
-            .rowInner {
381
-                margin-right: 24px;
382
-                white-space: nowrap;
383
-            }
384
-
385
-            &:hover {
386
-                cursor: pointer;
387
-                background-color: rgba(24, 97, 242, 0.1);
388
-            }
389
-        }
390
-
391
-        .tableRow {
392
-            padding: 6px 16px;
393
-
394
-            .rowInner {
395
-                margin-right: 24px;
396
-                white-space: nowrap;
397
-            }
398
-
399
-            &:hover {
400
-                cursor: pointer;
401
-                background-color: rgba(24, 97, 242, 0.1);
402
-            }
403
-        }
404
-
405
-        .innerTableContainer {
406
-            margin: 8px 0;
407
-            flex: 1;
408
-            overflow: hidden;
409
-
410
-            &:hover {
411
-                overflow: auto;
412
-            }
413
-
414
-            :global {
415
-                .ant-table-tbody>tr>td {
416
-                    cursor: pointer;
417
-                }
418
-            }
419
-
420
-        }
421
-
422
-        .autoHideScroller {
423
-            overflow: hidden !important;
424
-
425
-            &:hover {
426
-                overflow: auto !important;
427
-            }
428
-        }
429
-        .dataList {
430
-            margin: 8px 0;
431
-            padding: 0;
432
-            flex: 1;
433
-
434
-            overflow: hidden;
435
-            display: flex;
436
-
437
-            :global {
438
-
439
-                // 左侧表格不显示边框
440
-                .ant-table-tbody>tr>td {
441
-                    // border-bottom: 0;
442
-                    padding-left: 16px !important;
443
-                    padding-right: 16px !important;
444
-                }
445
-            }
446
-        }
447
-
448
-        .bottomDataList {
449
-            min-height: 100px;
450
-            height: 300px;
451
-
452
-            display: flex;
453
-
454
-            :global {
455
-
456
-                // 三个字段不同的边距
457
-                .ant-table .ant-table-tbody .ant-table-row {
458
-                    &>:nth-child(1) {
459
-                        padding-left: 16px !important;
460
-                        padding-right: 0 !important;
461
-                    }
462
-
463
-                    &>:nth-child(2) {
464
-                        padding-left: 5px !important;
465
-                        padding-right: 5px !important;
466
-                    }
467
-
468
-                    &>:nth-child(3) {
469
-                        padding-left: 0 !important;
470
-                        padding-right: 16px !important;
471
-                    }
472
-                }
473
-            }
474
-        }
475
-    }
476
-
477
-    .topBorder {
478
-        border-top: 1px solid rgba(143, 143, 143, 0.2);
479
-    }
480
-    
481
-    .bottomBorder {
482
-        border-bottom: 1px solid rgba(143, 143, 143, 0.2);
483
-    }
484
-
485
-    .rightBorder {
486
-        border-right: 1px solid rgba(143, 143, 143, 0.2);
487
-    }
488
-
489
-    .iconDropdown {
490
-        flex: none !important;
491
-        width: 40px !important;
492
-    }
493
-
494
-
495
-    .hoverArea {
496
-        position: absolute;
497
-        left: 0;
498
-        top: 10%;
499
-
500
-        width: 20px;
501
-        height: 80%;
502
-        display: flex;
503
-        flex-direction: column;
504
-        opacity: 0;
505
-        transition: all 0.3s;
506
-        z-index: 100;
507
-
508
-        .iconRotate {
509
-            transform: rotate(90deg);
510
-        }
511
-
512
-        .operationButton {
513
-            position: absolute;
514
-            width: 20px;
515
-            height: 64px;
516
-            left: 0;
517
-            top: 50%;
518
-            transform: translateY(-50%);
519
-
520
-            display: flex;
521
-            justify-content: center;
522
-            align-items: center;
523
-
524
-            background-color: #EAEDF0;
525
-            border-radius: 4px;
526
-
527
-            &:hover {
528
-                cursor: pointer;
529
-            }
530
-        }
531
-
532
-        &:hover {
533
-            opacity: 1;
534
-        }
535
-    }
536
-}

+ 0 - 306
src/pages/SqlIndex/SqlIndexView.jsx

@@ -1,306 +0,0 @@
1
-import React, { useState, useEffect, Component } from "react";
2
-import { withRouter } from 'react-router-dom'
3
-// import { createFromIconfontCN } from '@ant-design/icons'
4
-// const IconFont = createFromIconfontCN({
5
-//   scriptUrl: '../../../../assets/iconfont/iconfont.js'
6
-// })
7
-import { LeftOutlined, } from '@ant-design/icons'
8
-
9
-import { cloneDeep, debounce, isEqual } from 'lodash'
10
-
11
-import SqlEditor from "./SqlEditor/view.jsx";
12
-import SqlEditorTabs from './SqlEditorTabs/view.jsx'
13
-import SqlResultView from './SqlResultView.jsx'
14
-import LeftTableList from './LeftTableList.jsx'
15
-
16
-// // 引入当前页样式 - 模块化
17
-import styles from './sqlIndexStyle.less'
18
-const resultMinHeight = '42px'
19
-
20
-/**
21
- * 数据查询主页
22
- */
23
-// 在组件中可通过this.props.history.push跳转路由
24
-@withRouter
25
-class SqlIndexView extends Component {
26
-  // defaultResultHeight = -999
27
-
28
-  constructor(props, context) {
29
-    super(props, context)
30
-    this.query = this.props.location.query
31
-    this.state = {
32
-      sqlResultTableScrollHeight: this.defaultResultHeight,
33
-      isHorizonExpanded: false,
34
-      maxExpandHeightOfEditor: 0,
35
-
36
-      // 仅用于触发渲染,true与false无所谓
37
-      updateTrigger: true
38
-    }
39
-  }
40
-
41
-  componentDidMount() {
42
-    // this.stores.resetAll()
43
-
44
-    this.getContainersId()
45
-    // this.addListener()
46
-
47
-    // 页面加载完不会触发resize,这里手动调用一次
48
-    this.debounceResizeHandler()
49
-  }
50
-
51
-  query = null
52
-  componentWillReceiveProps(nextProps) {
53
-    const oldQuery = this.state.query
54
-    const newQuery = nextProps.location.query
55
-
56
-    if (!isEqual(oldQuery, newQuery)) {
57
-      this.query = newQuery
58
-      this.setState({
59
-        updateTrigger: true
60
-      })
61
-    }
62
-  }
63
-
64
-  componentDidUpdate() {
65
-    // 渲染完成后把query清掉,避免因其它条件触发渲染时,再次传入query
66
-    this.query = null
67
-  }
68
-
69
-  componentWillUnmount() {
70
-    this.removeListener()
71
-  }
72
-
73
-  handleVerticalExpand = (isExpand) => {
74
-    if (isExpand) {
75
-      this.sqlIndexContainerResult.style.height = resultMinHeight
76
-    } else {
77
-      this.sqlIndexContainerResult.style.height = this.initailHeightOfSqlResult
78
-      this.updateSqlResultTableSize()
79
-    }
80
-  }
81
-
82
-  handleHorizonExpand = (isExpand) => {
83
-    if (isExpand) {
84
-      this.containerLeft.style.display = 'none'
85
-      this.sqlIndexVerticalResizeLine.style.display = 'none'
86
-    } else {
87
-      this.containerLeft.style.display = 'block'
88
-      this.sqlIndexVerticalResizeLine.style.display = 'block'
89
-    }
90
-  }
91
-
92
-  getStyle = (element, attr) => {
93
-    // 兼容IE浏览器
94
-    if (element.currentStyle) {
95
-      return element.currentStyle[attr]
96
-    } else {
97
-      return getComputedStyle(element, false)[attr]
98
-    }
99
-  }
100
-
101
-  debounceResizeHandler = debounce(() => {
102
-    const { clientHeight } = document.body
103
-
104
-    const rootContainerHeight = clientHeight - 101
105
-    this.rootContainer.style.height = `${rootContainerHeight}px`
106
-
107
-    // 限制sqlresult区域的高度,最大可以展开到只保留查询结果的标题栏
108
-    const editorMaxHeight = `${rootContainerHeight - 84}px`
109
-    this.containerTopRight.style.maxHeight = editorMaxHeight
110
-
111
-    if (!this.initailHeightOfSqlResult) {
112
-      this.initailHeightOfSqlResult = this.getStyle(this.sqlIndexContainerResult, 'height')
113
-    }
114
-    this.setState({
115
-      // 除去底部结果的标题栏高度42和顶部tab栏的高度42,才是编辑器组件的高度。这里多预留4个像素的误差范围
116
-      maxExpandHeightOfEditor: this.containerRight.getBoundingClientRect().height - 88
117
-    })
118
-
119
-    this.updateSqlResultTableSize()
120
-  }, 100)
121
-
122
-  isResultFullScreen = false
123
-
124
-  handleOnSmall = () => {
125
-    this.isResultFullScreen = false
126
-    this.updateSqlResultTableSize()
127
-  }
128
-  handleOnFull = () => {
129
-    this.isResultFullScreen = true
130
-    this.updateSqlResultTableSize()
131
-  }
132
-
133
-  debounceResizeSqlResultTable = debounce(
134
-    () => {
135
-      this.updateSqlResultTableSize()
136
-    },
137
-    200,
138
-    {
139
-      trailing: true
140
-    }
141
-  )
142
-
143
-  updateSqlResultTableSize = () => {
144
-    // 动态计算右下方表格容器的滚动高度(以及全屏模式的表格滚动高度),预留了页脚的高度64
145
-    const rect = this.containerTopRight.getBoundingClientRect()
146
-    let sqlResultTableScrollHeight = this.rootContainer.getBoundingClientRect().bottom - rect.bottom - 144
147
-
148
-    if (this.isResultFullScreen) {
149
-      const { clientHeight } = document.body
150
-      sqlResultTableScrollHeight = clientHeight - 144
151
-    }
152
-
153
-    this.setState({
154
-      sqlResultTableScrollHeight: sqlResultTableScrollHeight
155
-    })
156
-  }
157
-
158
-  getContainersId() {
159
-    this.rootContainer = document.getElementById('sqlIndexRootContainer')
160
-    this.containerTopRight = document.getElementById('sqlIndexContainerTopRight')
161
-    this.sqlIndexContainerResult = document.getElementById('sqlIndexContainerResult')
162
-    this.containerLeft = document.getElementsByClassName(styles.containerLeft)[0]
163
-    this.containerRight = document.getElementsByClassName(styles.containerRight)[0]
164
-
165
-    this.sqlIndexRightResizeLine = document.getElementById('sqlIndexRightResizeLine')
166
-    this.sqlIndexVerticalResizeLine = document.getElementById('sqlIndexVerticalResizeLine')
167
-  }
168
-
169
-  addListener() {
170
-    window.addEventListener('resize', this.debounceResizeHandler)
171
-
172
-    this.sqlIndexRightResizeLine.addEventListener('mousedown', this.handleRightResizeLineMouseDown)
173
-    this.sqlIndexVerticalResizeLine.addEventListener('mousedown', this.handleVerticalResizeLineMouseDown)
174
-  }
175
-  removeListener() {
176
-    window.removeEventListener('resize', this.debounceResizeHandler)
177
-
178
-    this.sqlIndexRightResizeLine.removeEventListener('mousedown', this.handleRightResizeLineMouseDown)
179
-    this.sqlIndexVerticalResizeLine.removeEventListener('mousedown', this.handleVerticalResizeLineMouseDown)
180
-  }
181
-
182
-  handleRightResizeLineMouseDown = (e) => {
183
-    e.preventDefault()
184
-
185
-    // 手动拖拽的时候关闭动画
186
-    this.disableTransitions()
187
-
188
-    const startY = e.clientY
189
-    const oldHeight = parseInt(window.getComputedStyle(this.sqlIndexContainerResult).height)
190
-
191
-    document.onmousemove = (evt) => {
192
-      evt.stopPropagation()
193
-      const offset = evt.clientY - startY
194
-      this.sqlIndexContainerResult.style.height = oldHeight - offset + 'px'
195
-      this.debounceResizeSqlResultTable()
196
-    }
197
-    document.onmouseup = (evt) => {
198
-      evt.stopPropagation()
199
-      document.onmousemove = null
200
-      document.onmouseup = null
201
-
202
-      this.enableTransitions()
203
-    }
204
-  }
205
-
206
-  handleVerticalResizeLineMouseDown = (e) => {
207
-    e.preventDefault()
208
-
209
-    // x是分割线的最左侧,当反方向移动时,需要加上分割线的宽度去计算
210
-    const startX = e.clientX
211
-    const oldWidth = parseInt(window.getComputedStyle(this.containerLeft).width)
212
-
213
-    document.onmousemove = (evt) => {
214
-      evt.stopPropagation()
215
-      const offset = evt.clientX - startX
216
-      this.containerLeft.style.width = oldWidth + offset + 'px'
217
-    }
218
-    document.onmouseup = (evt) => {
219
-      evt.stopPropagation()
220
-      document.onmousemove = null
221
-      document.onmouseup = null
222
-    }
223
-  }
224
-
225
-  enableTransitions = () => {
226
-    const { className } = this.sqlIndexContainerResult
227
-    const classNames = className.split(' ')
228
-    const index = classNames.indexOf(styles.noTransitions)
229
-    if (index > -1) {
230
-      classNames.splice(index, 1)
231
-    }
232
-    this.sqlIndexContainerResult.className = classNames.join(' ')
233
-  }
234
-
235
-  disableTransitions = () => {
236
-    const { className } = this.sqlIndexContainerResult
237
-    this.sqlIndexContainerResult.className = className + ' ' + styles.noTransitions
238
-  }
239
-
240
-  render() {
241
-    const { sqlResultTableScrollHeight, isHorizonExpanded, maxExpandHeightOfEditor } = this.state
242
-
243
-    return (
244
-      <div>
245
-        {/* <Spin spinning={loading}> */}
246
-        <div id="sqlIndexRootContainer" className={[styles.sqlIndexView]}>
247
-          <div className={[styles.containerLeft]}>
248
-            <LeftTableList query={this.query}></LeftTableList>
249
-          </div>
250
-          <span id="sqlIndexVerticalResizeLine" className={[styles.resizableVerticalLine]}></span>
251
-          <div className={[styles.containerRight]}>
252
-            <div id="sqlIndexTabDiv" className={[styles.tabBar]}>
253
-              <SqlEditorTabs></SqlEditorTabs>
254
-            </div>
255
-            <div className={[styles.containerRightExceptTabbar]}>
256
-              <div id="sqlIndexContainerTopRight" className={[styles.containerSqlEditor]}>
257
-                {/* sql编辑器---start */}
258
-                <div style={{ height: '100%' }}>
259
-                  <SqlEditor
260
-                    className={[styles.bottomBorder]}
261
-                    style={{ height: '100%' }}
262
-                    maxExpandHeightOfEditor={maxExpandHeightOfEditor}
263
-                    onEditorExpand={(isExpand) => {
264
-                      this.handleVerticalExpand(isExpand)
265
-                    }}
266
-                  ></SqlEditor>
267
-                </div>
268
-                {/* sql编辑器---end */}
269
-              </div>
270
-              <span id="sqlIndexRightResizeLine" className={[styles.resizableLine]}></span>
271
-              <div id="sqlIndexContainerResult" className={[styles.containerSearchResult]}>
272
-                <SqlResultView
273
-                  sqlResultTableScrollHeight={sqlResultTableScrollHeight}
274
-                  onSmall={this.handleOnSmall}
275
-                  onFull={this.handleOnFull}
276
-                ></SqlResultView>
277
-              </div>
278
-            </div>
279
-
280
-            {/* hover显示左右收缩图标 */}
281
-            <div className={[styles.hoverArea]}>
282
-              <div
283
-                className={[styles.operationButton]}
284
-                onClick={() => {
285
-                  // 展开,收回
286
-                  this.setState(
287
-                    {
288
-                      isHorizonExpanded: !isHorizonExpanded
289
-                    },
290
-                    () => {
291
-                      this.handleHorizonExpand(this.state.isHorizonExpanded)
292
-                    }
293
-                  )
294
-                }}
295
-              >
296
-                <LeftOutlined />
297
-              </div>
298
-            </div>
299
-          </div>
300
-        </div>
301
-        {/* </Spin> */}
302
-      </div>
303
-    )
304
-  }
305
-}
306
-export default SqlIndexView;

+ 0 - 493
src/pages/SqlIndex/SqlResultView.jsx

@@ -1,493 +0,0 @@
1
-import React, { Component } from 'react'
2
-import { Table, Select, Spin, Card, Popover, Button, message,Modal } from 'antd'
3
-import { VerticalAlignBottomOutlined } from '@ant-design/icons'
4
-import { isEmpty } from 'lodash'
5
-import { inject, observer } from 'mobx-react'
6
-import { toJS } from 'mobx'
7
-import XLSX from 'xlsx'
8
-import SqlIndexMod from './SqlIndexMod'
9
-import moment from 'moment'
10
-const { Option } = Select;
11
-import FullScreen from '@widget/FullScreen'
12
-import styles from './sqlIndexStyle.less'
13
-
14
-/**
15
- * sql查询结果表格
16
- */
17
-// 将组件设置为响应式组件,成为观察者,以便响应被观察数据的变化
18
-@observer
19
-export default class extends Component {
20
-  constructor(props) {
21
-    super(props)
22
-    this.stores = SqlIndexMod
23
-    this.state = {
24
-      visible: false,
25
-      showMassagepop:false,
26
-      iconLoding:false,
27
-      fileType: 'excel',
28
-      sqlResultTableScrollHeight: props.sqlResultTableScrollHeight,
29
-
30
-      // 这个值只是用来触发渲染的手段,true和false都无所谓
31
-      activeRender: false,
32
-
33
-      // 全屏模式下的当前页码,因为全屏模式和普通模式的pageSize不同,页码也要区分开
34
-      fullScreenCurPage: 1,
35
-      pageSize: 10,
36
-      pageNum: 1,
37
-      isSizeChange: false,
38
-    }
39
-
40
-    this.sqlResultPageSize = this.minPageSize
41
-  }
42
-
43
-  // 查询结果最少的pageSize
44
-  minPageSize = 10
45
-
46
-  componentWillReceiveProps(nextProps) {
47
-    this.setState({
48
-      sqlResultTableScrollHeight: nextProps.sqlResultTableScrollHeight
49
-    })
50
-  }
51
-
52
-  // 为了降低切换tab时的卡顿感,将渲染查询结果的时机延迟到切换tab完成后,这个变量用于此标记
53
-  allowRender = false
54
-  delayRenderTimer = null
55
-
56
-  /**
57
-   * 通过willupdatge 和 didupdate将渲染Table延迟到tab切换完成之后
58
-   * 减小pageSize之后,这个优化就可以不需要了
59
-   */
60
-  componentWillUpdate(nextProps, nextState) {
61
-    // 对于改变表格大小引起的渲染(拖拽分割线,全屏按钮),不需要延时渲染
62
-    if (nextState.sqlResultTableScrollHeight != this.state.sqlResultTableScrollHeight) {
63
-      this.allowRender = true
64
-      return
65
-    }
66
-
67
-    // 避免陷入死循环
68
-    if (this.allowRender == true) {
69
-      return
70
-    }
71
-
72
-    clearTimeout(this.delayRenderTimer)
73
-
74
-    this.delayRenderTimer = setTimeout(() => {
75
-      this.allowRender = true
76
-      this.setState({
77
-        activeRender: true
78
-      })
79
-    }, 0)
80
-  }
81
-
82
-  componentDidUpdate() {
83
-    this.allowRender = false
84
-  }
85
-
86
-  componentWillUnmount() {
87
-    this.allowRender = false
88
-    clearTimeout(this.delayRenderTimer)
89
-    this.delayRenderTimer = null
90
-  }
91
-
92
-  /**
93
-   * 动态计算分页。例如:当前高度可以展示24条数据,那么分页就按30每页来
94
-   */
95
-  getPageSize = () => {
96
-    const { sqlResultTableScrollHeight } = this.state
97
-    const rowHeight = 34
98
-
99
-    let pageSize = sqlResultTableScrollHeight / rowHeight
100
-    if (pageSize <= this.minPageSize) {
101
-      pageSize = this.minPageSize
102
-    } else {
103
-      pageSize = (Math.floor(pageSize / 10) + 1) * 10
104
-    }
105
-
106
-    return pageSize
107
-  }
108
-
109
-  getCurPage = () => {
110
-    const { sqlResultPage } = this.stores.curActiveTab
111
-
112
-    let curPage = sqlResultPage
113
-    if (this.isFullScreen) {
114
-      curPage = this.state.fullScreenCurPage
115
-    }
116
-
117
-    return curPage
118
-  }
119
-
120
-  getSqlResultList = () => {
121
-    const { sqlResult } = this.stores.curActiveTab
122
-
123
-    // allowRender为false时返回空列表,把Table的子节点清除。切换tab的瞬间卡顿主要是table的子节点一直保留着的缘故
124
-    if (!isEmpty(sqlResult) && this.allowRender) {
125
-      return sqlResult.data
126
-      // return this.stores.getSqlResult(sqlResult.data, this.state.pageNum, this.state.pageSize)
127
-    } else {
128
-      return []
129
-    }
130
-  }
131
-
132
-  updateCurPage = (page) => {
133
-    if (this.isFullScreen) {
134
-      this.setState({
135
-        fullScreenCurPage: page
136
-      })
137
-    } else {
138
-      this.stores.updateTabSqlCurPage(page)
139
-    }
140
-  }
141
-
142
-  paginationProps = (num) => {
143
-    // return false
144
-    const { sqlResult } = this.stores.curActiveTab
145
-    const { executeSqlpar } = this.stores.state;
146
-    const curPage = this.getCurPage()
147
-
148
-    return {
149
-      // showQuickJumper: true,
150
-      // showSizeChanger: true,
151
-      // size:"small",
152
-      simple: true,
153
-      defaultCurrent: 1,
154
-      // showSizeChanger: false, //隐藏条数切换器,固定20条,解决切换无效
155
-      // // 切换数据源时,页码不会自动重置为1,需要跟踪设置current来确保页码正确显示
156
-      // current: this.state.pageNum,
157
-      // pageSize: this.getPageSize(),
158
-      // pageSizeOptions: [10, 20, 50, 100, 500, 1000],//分页器下拉选择 指定每页可以显示多少条
159
-      total: num
160
-    }
161
-  }
162
-
163
-
164
-  getSqlResultTableColumns = () => {
165
-    const { sqlResult: sqlResultData } = this.stores.curActiveTab
166
-    const curPage = this.getCurPage()
167
-
168
-    if (!isEmpty(sqlResultData)) {
169
-      const { tableHeaders = [], tableHeadersRemarks = {} } = sqlResultData
170
-
171
-      const itemBeginIndex = this.getPageSize() * (curPage - 1) + 1
172
-
173
-      const columns = []
174
-      for (const fieldName of tableHeaders) {
175
-        // 30给padding,字符宽度按8计算(都是英文字符)
176
-        const width = fieldName.length * 8 + 30
177
-        columns.push({
178
-          // title: (
179
-          //   <Tooltip
180
-          //     placement="top"
181
-          //     title={tableHeadersRemarks && tableHeadersRemarks[fieldName] ? tableHeadersRemarks[fieldName] : fieldName}
182
-          //   >
183
-          //     <Typography.Text ellipsis={true}>{fieldName}</Typography.Text>
184
-          //   </Tooltip>
185
-          // ),
186
-          title: fieldName,
187
-          dataIndex: fieldName,
188
-          width: width,
189
-          ellipsis: {
190
-            showTitle: false
191
-          },
192
-          render: (text) => (<span>{text}</span>)
193
-          // (
194
-          //   <Tooltip
195
-          //     placement="top"
196
-          //     title={text}
197
-          //   >
198
-          //     <Typography.Text ellipsis={true}>{text}</Typography.Text>
199
-          //   </Tooltip>
200
-          // )
201
-        })
202
-      }
203
-
204
-      if (columns.length > 0) {
205
-        columns.unshift({
206
-          title: '序号',
207
-          dataIndex: 'itemOrderNum',
208
-          width: 60,
209
-          ellipsis: true,
210
-          render: (text, item, index) => itemBeginIndex + index + ''
211
-        })
212
-      }
213
-
214
-      return columns
215
-    } else {
216
-      return null
217
-    }
218
-  }
219
-
220
-  getResultFailedText = () => {
221
-    const { sqlResult } = this.stores.curActiveTab
222
-    const sqlResultData = toJS(sqlResult)
223
-    if (!isEmpty(sqlResultData)) {
224
-      const { tableHeaders = [], data: sqlResultList = [] } = sqlResultData
225
-
226
-      // 后端在执行sql失败时,没有返回特殊标记,只能通过这种硬编码来判断
227
-      if (tableHeaders && tableHeaders.length == 2 && tableHeaders[0] == '查询结果' && tableHeaders[1] == '原因') {
228
-        const str = typeof (sqlResultList[0]['原因']) == 'object' && sqlResultList[0]['原因']['resultMsg'] ? sqlResultList[0]['原因']['resultMsg'] : sqlResultList[0]['原因']
229
-        return '查询失败:' + str
230
-      }
231
-    }
232
-    return false
233
-  }
234
-
235
-  getNowTimeFormat = () => {
236
-    // 大写HH是24小时制
237
-    return moment(new Date()).format('YYYYMMDD_HHmmss')
238
-  }
239
-
240
-  load_ = () => {
241
-    // this.setState({ showMassagepop: false,iconLoding:true });
242
-    message.info('即将开始下载,请稍候...');
243
-    this.downloading = true
244
-    const { dbInfo, sqlResult, executingSql } = this.stores.curActiveTab;
245
-    const { executingSqlKey } = this.stores.state;
246
-    this.setState({ visible: false });
247
-    this.stores
248
-      .recordLogOfDownload({
249
-        type: this.state.fileType,
250
-        sql: executingSql,
251
-        dataSourceId: dbInfo.dsId,
252
-        dataBaseName: dbInfo.dbName,
253
-        executeKey: executingSqlKey
254
-        // data: sqlResult.data
255
-      }, ((data, fileName) => {
256
-        this.setState({ iconLoding:false });
257
-        var blob = new Blob([data], {
258
-          type: "application/vnd.ms-excel",
259
-        });
260
-        var downloadElement = document.createElement("a");
261
-        // 下载的文件名
262
-        // downloadElement.download = fileName.replace('.csv','.xls');
263
-        downloadElement.download = fileName;
264
-        // 创建下载的链接
265
-        downloadElement.href = window.URL.createObjectURL(blob);
266
-        // 点击下载
267
-        downloadElement.click();
268
-        document.body.appendChild(downloadElement);
269
-        // 下载完成移除元素
270
-        document.body.removeChild(downloadElement);
271
-        // 释放掉blob对象
272
-        window.URL.revokeObjectURL(downloadElement.href);
273
-        // this.handleExportToExcel()
274
-      }))
275
-      .then((data) => {
276
-      })
277
-      .catch(() => {
278
-        this.downloading = false
279
-      })
280
-
281
-  }
282
-  handleDownload = () => {
283
-    // if(Number(this.stores.state.sql_total) >= 65000 && this.state.fileType == 'excel'){
284
-    //   message.error('数据量大于65000条,请使用csv方式导出!');
285
-    //   return
286
-    // }
287
-    const { dbInfo, sqlResult, executingSql } = this.stores.curActiveTab;
288
-    const { executingSqlKey } = this.stores.state;
289
-
290
-    // if (this.state.fileType == 'excel') {
291
-    //   this.stores.preCheckExportExcel({
292
-    //     sql: executingSql,
293
-    //     dataSourceId: dbInfo.dsId,
294
-    //     dataBaseName: dbInfo.dbName,
295
-    //   }, ((data) => {
296
-    //     if (data && Number(data) >= 65000) {
297
-    //       this.setState({ showMassagepop: true });
298
-    //     } else {
299
-    //       this.load_()
300
-    //     }
301
-    //   }))
302
-    // } else {
303
-    //   this.load_()
304
-    // }
305
-    this.load_()
306
-
307
-  }
308
-
309
-  handleExportToExcel = () => {
310
-    const { sqlResult } = this.stores.curActiveTab
311
-    const sqlResultData = toJS(sqlResult)
312
-
313
-    if (!isEmpty(sqlResultData)) {
314
-      const { tableHeaders = [], data: sqlResultList = [] } = sqlResultData
315
-
316
-      // columns 是二维数组
317
-      const columns = [[...tableHeaders]]
318
-      // 数据和表头字段名顺序不一致,需要对齐一下
319
-      for (const item of sqlResultList) {
320
-        const row = []
321
-        for (const header of tableHeaders) {
322
-          row.push(item[header])
323
-        }
324
-        columns.push(row)
325
-      }
326
-
327
-      const wb = XLSX.utils.book_new()
328
-      const ws = XLSX.utils.aoa_to_sheet(columns)
329
-      XLSX.utils.book_append_sheet(wb, ws, '数据')
330
-      const fileName = '数据服务平台_' + this.getNowTimeFormat() + '.xlsx'
331
-      XLSX.writeFile(wb, fileName) //导出Excel
332
-    }
333
-    this.downloading = false
334
-  }
335
-
336
-  handleOnSmall = () => {
337
-    this.isFullScreen = false
338
-    this.props.onSmall()
339
-  }
340
-
341
-  handleOnFull = () => {
342
-    this.isFullScreen = true
343
-    this.props.onFull()
344
-
345
-    this.setState({
346
-      fullScreenCurPage: 1
347
-    })
348
-  }
349
-
350
-  isFullScreen = false
351
-
352
-  // 用来标记当次渲染是否在原本的tab上查询导致的render,是的话不需要延迟渲染
353
-  oldTabKey = ''
354
-  render() {
355
-    const { sqlResultTableScrollHeight,iconLoding } = this.state
356
-    const { curTabSqlLoading } = this.stores
357
-    const { tabKey, sqlResult } = this.stores.curActiveTab
358
-
359
-    if (this.oldTabKey == tabKey) {
360
-      this.allowRender = true
361
-    }
362
-    this.oldTabKey = tabKey
363
-    const resultFailText = this.getResultFailedText()
364
-    let resultList = []
365
-    if (!resultFailText) {
366
-      resultList = this.getSqlResultList()
367
-      // console.log(resultList)
368
-    }
369
-    return (
370
-      <Spin spinning={curTabSqlLoading} id={"dy-table"}>
371
-        <FullScreen
372
-          small={{ icon: { position: styles.fullScreenIcon } }}
373
-          max={{ icon: { position: styles.fullScreenIcon } }}
374
-          onSmall={this.handleOnSmall}
375
-          onFull={this.handleOnFull}
376
-        >
377
-          <Card
378
-            // style={{
379
-            //   // card标题栏和页码栏高度106
380
-            //   minHeight: sqlResultTableScrollHeight + 106
381
-            // }}
382
-            title={'结果'}
383
-            extra={
384
-              sqlResult && sqlResult.extendResp && sqlResult.extendResp.canDownload && resultList.length > 0 ? (
385
-                <Popover
386
-                  placement="left"
387
-                  content={
388
-                    <div>
389
-                      <span style={{ marginRight: '10px' }}>下载文件格式:</span><Select value={this.state.fileType} style={{ width: 120 }} disabled={iconLoding} onChange={(val) => { this.setState({ fileType: val }); }}>
390
-                        <Option value="csv">csv</Option>
391
-                        <Option value="excel">excel</Option>
392
-                      </Select>
393
-                      <p style={{ display: 'block', textAlign: 'right', marginTop: '5px' }}><Button type="primary" size={'small'} onClick={() => { this.handleDownload(); }} loading={iconLoding} disabled={iconLoding}>
394
-                        导出
395
-                      </Button></p>
396
-                    </div>
397
-                  }
398
-                  title="导出"
399
-                  trigger="click"
400
-                  visible={this.state.visible}
401
-                  onVisibleChange={(visible) => { 
402
-                    if(iconLoding){return}
403
-                    if(visible){this.setState({fileType:'excel' }); }
404
-                    this.setState({ visible }); 
405
-                  }}
406
-                >
407
-                  {
408
-                    !iconLoding ? <VerticalAlignBottomOutlined className={styles.downloadIcon} />  : <Button shape="round" icon="download" size={'small'} loading={iconLoding} disabled={iconLoding}/>
409
-                  }
410
-                </Popover>
411
-
412
-              ) : (sqlResult && sqlResult.extendResp && sqlResult.extendResp.canDownload && resultList.length == 0 ? (
413
-                <VerticalAlignBottomOutlined className={styles.downloadIcon} onClick={() => {
414
-                  message.warning('数据为空,请核对!')
415
-                }} />
416
-              ) : (
417
-                ""
418
-              ))
419
-            }
420
-          >
421
-            {resultFailText ? (
422
-              <p
423
-                style={{
424
-                  padding: '16px',
425
-                  height: sqlResultTableScrollHeight + 80,
426
-                  wordWrap: 'break-word',
427
-                  wordBreak: 'breakAll',
428
-                  overflow: 'auto',
429
-                  fontWeight: '700',
430
-                  color: 'red'
431
-                }}
432
-              >
433
-                {resultFailText}
434
-              </p>
435
-            ) : (
436
-              <Table
437
-                className={resultList.length == 0 ? styles.emptyStyle : ''}
438
-                ref={this.resultTableRef}
439
-                style={{
440
-                  userSelect: 'none'
441
-                }}
442
-                dataSource={resultList}
443
-                pagination={this.paginationProps(resultList.length)}
444
-                columns={this.getSqlResultTableColumns() || []}
445
-                rowKey={(record, index) => {
446
-                  return index
447
-                }}
448
-                scroll={{
449
-                  y: sqlResultTableScrollHeight
450
-                }}
451
-              />
452
-            )}
453
-          </Card>
454
-        </FullScreen>
455
-        <Modal
456
-          className="xxpop"
457
-          title="提示"
458
-          centered
459
-          maskClosable={false}
460
-          visible={this.state.showMassagepop}
461
-          footer={[
462
-            <Button
463
-              onClick={() => {
464
-                this.load_()
465
-                this.setState({ showMassagepop: false,iconLoding:true })
466
-              }}
467
-            >
468
-              继续Excel导出
469
-            </Button>,
470
-            <Button
471
-            type="primary"
472
-            onClick={() => {
473
-              this.setState({ fileType: 'csv',showMassagepop: false,iconLoding:true });
474
-              setTimeout(()=>{
475
-                this.load_()
476
-              },100)
477
-            }}
478
-          >
479
-            Csv导出
480
-          </Button>,
481
-        ]}
482
-          onCancel={() => {
483
-            this.setState({ showMassagepop: false })
484
-          }}
485
-
486
-        >
487
-          <p>导出数据量大于65000条,建议使用csv方式导出!</p>
488
-        </Modal>
489
-
490
-      </Spin>
491
-    )
492
-  }
493
-}

+ 0 - 10
src/pages/SqlIndex/mock/key.js

@@ -1,10 +0,0 @@
1
-let key = {
2
-	"extFields": {},
3
-	"exceptCauseIp": null,
4
-	"exceptCauseApp": null,
5
-	"exceptClass": null,
6
-	"resultCode": "0",
7
-	"resultMsg": "success",
8
-	"data": "execute_7091920910191797289"
9
-}
10
-export default key;

+ 0 - 318
src/pages/SqlIndex/mock/leftb.js

@@ -1,318 +0,0 @@
1
-let leftb = {
2
-	"extFields": {},
3
-	"exceptCauseIp": null,
4
-	"exceptCauseApp": null,
5
-	"exceptClass": null,
6
-	"resultCode": "0",
7
-	"resultMsg": "success",
8
-	"data": [{
9
-		"columnName": "business_date",
10
-		"columnType": "DATE",
11
-		"columnRemarks": "日期"
12
-	}, {
13
-		"columnName": "oper_center_name",
14
-		"columnType": "STRING",
15
-		"columnRemarks": "营运中心"
16
-	}, {
17
-		"columnName": "region_name",
18
-		"columnType": "STRING",
19
-		"columnRemarks": "大区"
20
-	}, {
21
-		"columnName": "prov_id",
22
-		"columnType": "BIGINT",
23
-		"columnRemarks": "省份编码"
24
-	}, {
25
-		"columnName": "prov_name",
26
-		"columnType": "STRING",
27
-		"columnRemarks": "省份名称"
28
-	}, {
29
-		"columnName": "city_id",
30
-		"columnType": "BIGINT",
31
-		"columnRemarks": "城市编码"
32
-	}, {
33
-		"columnName": "city_name",
34
-		"columnType": "STRING",
35
-		"columnRemarks": "城市名称"
36
-	}, {
37
-		"columnName": "city_level",
38
-		"columnType": "STRING",
39
-		"columnRemarks": "城市等级"
40
-	}, {
41
-		"columnName": "district_id",
42
-		"columnType": "BIGINT",
43
-		"columnRemarks": "区县编码"
44
-	}, {
45
-		"columnName": "district_name",
46
-		"columnType": "STRING",
47
-		"columnRemarks": "区县名称"
48
-	}, {
49
-		"columnName": "busi_area_type",
50
-		"columnType": "STRING",
51
-		"columnRemarks": "商圈"
52
-	}, {
53
-		"columnName": "channel_name",
54
-		"columnType": "STRING",
55
-		"columnRemarks": "渠道"
56
-	}, {
57
-		"columnName": "business_type",
58
-		"columnType": "STRING",
59
-		"columnRemarks": "业务类型"
60
-	}, {
61
-		"columnName": "user_type",
62
-		"columnType": "STRING",
63
-		"columnRemarks": "用户类型"
64
-	}, {
65
-		"columnName": "time_name",
66
-		"columnType": "STRING",
67
-		"columnRemarks": "时段"
68
-	}, {
69
-		"columnName": "total_amount",
70
-		"columnType": "DECIMAL",
71
-		"columnRemarks": "流水金额"
72
-	}, {
73
-		"columnName": "total_amount_last_day",
74
-		"columnType": "DECIMAL",
75
-		"columnRemarks": "流水金额上一天金额"
76
-	}, {
77
-		"columnName": "total_amount_last_week",
78
-		"columnType": "DECIMAL",
79
-		"columnRemarks": "流水金额上周同期金额"
80
-	}, {
81
-		"columnName": "total_amount_last_year",
82
-		"columnType": "DECIMAL",
83
-		"columnRemarks": "流水金额去年同期金额"
84
-	}, {
85
-		"columnName": "order_count",
86
-		"columnType": "BIGINT",
87
-		"columnRemarks": "订单量"
88
-	}, {
89
-		"columnName": "order_count_last_day",
90
-		"columnType": "BIGINT",
91
-		"columnRemarks": "订单量上一天值"
92
-	}, {
93
-		"columnName": "order_count_last_week",
94
-		"columnType": "BIGINT",
95
-		"columnRemarks": "订单量上周值"
96
-	}, {
97
-		"columnName": "order_count_last_year",
98
-		"columnType": "BIGINT",
99
-		"columnRemarks": "订单量去年同期值"
100
-	}, {
101
-		"columnName": "pay_amount",
102
-		"columnType": "DECIMAL",
103
-		"columnRemarks": "实收金额"
104
-	}, {
105
-		"columnName": "pay_amount_last_day",
106
-		"columnType": "DECIMAL",
107
-		"columnRemarks": "实收金额上一天值"
108
-	}, {
109
-		"columnName": "pay_amount_last_week",
110
-		"columnType": "DECIMAL",
111
-		"columnRemarks": "实收金额上周值"
112
-	}, {
113
-		"columnName": "pay_amount_last_year",
114
-		"columnType": "DECIMAL",
115
-		"columnRemarks": "实收金额去年同期值"
116
-	}, {
117
-		"columnName": "return_total_amount",
118
-		"columnType": "DECIMAL",
119
-		"columnRemarks": "退单金额"
120
-	}, {
121
-		"columnName": "return_total_amount_last_day",
122
-		"columnType": "DECIMAL",
123
-		"columnRemarks": "退单金额上一天值"
124
-	}, {
125
-		"columnName": "return_total_amount_last_week",
126
-		"columnType": "DECIMAL",
127
-		"columnRemarks": "退单金额上周值"
128
-	}, {
129
-		"columnName": "return_total_amount_last_year",
130
-		"columnType": "DECIMAL",
131
-		"columnRemarks": "退单金额去年同期值"
132
-	}, {
133
-		"columnName": "return_order_count",
134
-		"columnType": "BIGINT",
135
-		"columnRemarks": "退订单量"
136
-	}, {
137
-		"columnName": "return_order_count_last_day",
138
-		"columnType": "BIGINT",
139
-		"columnRemarks": "退订单量上一天值"
140
-	}, {
141
-		"columnName": "return_order_count_last_week",
142
-		"columnType": "BIGINT",
143
-		"columnRemarks": "退订单量上周值"
144
-	}, {
145
-		"columnName": "return_order_count_last_year",
146
-		"columnType": "BIGINT",
147
-		"columnRemarks": "退订单量去年同期值"
148
-	}, {
149
-		"columnName": "trade_people_count",
150
-		"columnType": "BIGINT",
151
-		"columnRemarks": "交易用户数"
152
-	}, {
153
-		"columnName": "trade_people_count_last_day",
154
-		"columnType": "BIGINT",
155
-		"columnRemarks": "交易用户数上一天值"
156
-	}, {
157
-		"columnName": "trade_people_count_last_week",
158
-		"columnType": "BIGINT",
159
-		"columnRemarks": "交易用户数上周值"
160
-	}, {
161
-		"columnName": "trade_people_count_last_year",
162
-		"columnType": "BIGINT",
163
-		"columnRemarks": "交易用户数去年同期值"
164
-	}, {
165
-		"columnName": "trade_shop_count",
166
-		"columnType": "BIGINT",
167
-		"columnRemarks": "交易门店数"
168
-	}, {
169
-		"columnName": "trade_shop_count_last_day",
170
-		"columnType": "BIGINT",
171
-		"columnRemarks": "交易门店数上一天值"
172
-	}, {
173
-		"columnName": "trade_shop_count_last_week",
174
-		"columnType": "BIGINT",
175
-		"columnRemarks": "交易门店数上周值"
176
-	}, {
177
-		"columnName": "trade_shop_count_last_year",
178
-		"columnType": "BIGINT",
179
-		"columnRemarks": "交易门店数去年同期值"
180
-	}, {
181
-		"columnName": "item_count",
182
-		"columnType": "BIGINT",
183
-		"columnRemarks": "商品销量"
184
-	}, {
185
-		"columnName": "item_count_last_day",
186
-		"columnType": "BIGINT",
187
-		"columnRemarks": "商品销量上周值"
188
-	}, {
189
-		"columnName": "item_count_last_week",
190
-		"columnType": "BIGINT",
191
-		"columnRemarks": "商品销量上周值"
192
-	}, {
193
-		"columnName": "item_count_last_year",
194
-		"columnType": "BIGINT",
195
-		"columnRemarks": "商品销量去年同期值"
196
-	}, {
197
-		"columnName": "mkt_total_amount",
198
-		"columnType": "DECIMAL",
199
-		"columnRemarks": "营销流水金额"
200
-	}, {
201
-		"columnName": "mkt_total_amount_last_day",
202
-		"columnType": "DECIMAL",
203
-		"columnRemarks": "营销流水金额上一天值"
204
-	}, {
205
-		"columnName": "mkt_total_amount_last_week",
206
-		"columnType": "DECIMAL",
207
-		"columnRemarks": "营销流水金额上周值"
208
-	}, {
209
-		"columnName": "mkt_total_amount_last_year",
210
-		"columnType": "DECIMAL",
211
-		"columnRemarks": "营销流水金额去年同期值"
212
-	}, {
213
-		"columnName": "mkt_extend_amount",
214
-		"columnType": "DECIMAL",
215
-		"columnRemarks": "营销带动金额"
216
-	}, {
217
-		"columnName": "mkt_extend_amount_last_day",
218
-		"columnType": "DECIMAL",
219
-		"columnRemarks": "营销带动金额上一天值"
220
-	}, {
221
-		"columnName": "mkt_extend_amount_last_week",
222
-		"columnType": "DECIMAL",
223
-		"columnRemarks": "营销带动金额上周值"
224
-	}, {
225
-		"columnName": "mkt_extend_amount_last_year",
226
-		"columnType": "DECIMAL",
227
-		"columnRemarks": "营销带动金额去年同期值"
228
-	}, {
229
-		"columnName": "add_mements",
230
-		"columnType": "BIGINT",
231
-		"columnRemarks": "新增会员数"
232
-	}, {
233
-		"columnName": "add_mements_last_day",
234
-		"columnType": "BIGINT",
235
-		"columnRemarks": "新增会员数上周值"
236
-	}, {
237
-		"columnName": "add_mements_last_week",
238
-		"columnType": "BIGINT",
239
-		"columnRemarks": "新增会员数上周值"
240
-	}, {
241
-		"columnName": "add_mements_last_year",
242
-		"columnType": "BIGINT",
243
-		"columnRemarks": "新增会员数去年同期值"
244
-	}, {
245
-		"columnName": "ispassstring",
246
-		"columnType": "DECIMAL",
247
-		"columnRemarks": "常规QSC区域内巡检累计分"
248
-	}, {
249
-		"columnName": "ispassstring_last_day",
250
-		"columnType": "DECIMAL",
251
-		"columnRemarks": "常规QSC区域内巡检累计分上一天值"
252
-	}, {
253
-		"columnName": "ispassstring_last_week",
254
-		"columnType": "DECIMAL",
255
-		"columnRemarks": "常规QSC区域内巡检累计分上周值"
256
-	}, {
257
-		"columnName": "ispassstring_last_year",
258
-		"columnType": "DECIMAL",
259
-		"columnRemarks": "常规QSC区域内巡检累计分去年同期值"
260
-	}, {
261
-		"columnName": "ispass_report_count",
262
-		"columnType": "BIGINT",
263
-		"columnRemarks": "常规QSC区域内巡检累计报告数"
264
-	}, {
265
-		"columnName": "ispass_report_count_last_day",
266
-		"columnType": "BIGINT",
267
-		"columnRemarks": "常规QSC区域内巡检累计报告数上一天值"
268
-	}, {
269
-		"columnName": "ispass_report_count_last_week",
270
-		"columnType": "BIGINT",
271
-		"columnRemarks": "常规QSC区域内巡检累计报告数上周值"
272
-	}, {
273
-		"columnName": "ispass_report_count_last_year",
274
-		"columnType": "BIGINT",
275
-		"columnRemarks": "常规QSC区域内巡检累计报告数去年同期值"
276
-	}, {
277
-		"columnName": "ispass_shop_count",
278
-		"columnType": "BIGINT",
279
-		"columnRemarks": "巡检门店数"
280
-	}, {
281
-		"columnName": "ispass_shop_count_last_day",
282
-		"columnType": "BIGINT",
283
-		"columnRemarks": "巡检门店数上一天值"
284
-	}, {
285
-		"columnName": "ispass_shop_count_last_week",
286
-		"columnType": "BIGINT",
287
-		"columnRemarks": "巡检门店数上周值"
288
-	}, {
289
-		"columnName": "ispass_shop_count_last_year",
290
-		"columnType": "BIGINT",
291
-		"columnRemarks": "巡检门店数去年同期值"
292
-	}, {
293
-		"columnName": "shop_count",
294
-		"columnType": "BIGINT",
295
-		"columnRemarks": "区域内门店总数"
296
-	}, {
297
-		"columnName": "shop_count_last_day",
298
-		"columnType": "BIGINT",
299
-		"columnRemarks": "区域内门店总数上一天值"
300
-	}, {
301
-		"columnName": "shop_count_last_week",
302
-		"columnType": "BIGINT",
303
-		"columnRemarks": "区域内门店总数上周值"
304
-	}, {
305
-		"columnName": "shop_count_last_year",
306
-		"columnType": "BIGINT",
307
-		"columnRemarks": "区域内门店总数去年同期值"
308
-	}, {
309
-		"columnName": "load_time",
310
-		"columnType": "STRING",
311
-		"columnRemarks": "数据更新时间"
312
-	}, {
313
-		"columnName": "pt",
314
-		"columnType": "STRING",
315
-		"columnRemarks": ""
316
-	}]
317
-}
318
-export default leftb;

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 1582
src/pages/SqlIndex/mock/listColumnsArr.js


+ 0 - 20
src/pages/SqlIndex/mock/test.js

@@ -1,20 +0,0 @@
1
-let arr = {
2
-	"extFields": {},
3
-	"exceptCauseIp": null,
4
-	"exceptCauseApp": null,
5
-	"exceptClass": null,
6
-	"resultCode": "0",
7
-	"resultMsg": "success",
8
-	"data": [{
9
-		"dsId": "1602960297754152962",
10
-		"name": "hive185IP",
11
-		"dbs": [{
12
-			"dataBaseName": "beifeng_test",
13
-			"tableNames": ["ods_lgzk_projbld_df", "ods_lgzk_projbld_df1", "test_abc"]
14
-		}, {
15
-			"dataBaseName": "cbd_dw_dev",
16
-			"tableNames": ["ads_dbs_trade_time_di"]
17
-		}]
18
-	}]
19
-}
20
-export default arr;

+ 0 - 112
src/pages/businessWarning/list/businessWarningLess.less

@@ -1,112 +0,0 @@
1
-// 其中assets文件夹已经做了webpack别名配置,不需要再使用../../访问,直接加个波浪线
2
-
3
-.sys_account {
4
-  min-width: 1000px; //设置内容区域最小宽度为1000px,防止表格不断被挤压重叠
5
-
6
-  :global {
7
-    .timeSetting {
8
-      .ant-time-picker {
9
-        width: 110px;
10
-        margin: 0px 4px;
11
-      }
12
-
13
-      .saveBtn {
14
-        cursor: pointer;
15
-        padding-right: 4px;
16
-      }
17
-
18
-      .closeBtn {
19
-        cursor: pointer;
20
-      }
21
-
22
-      .editBtn {
23
-        cursor: pointer;
24
-      }
25
-    }
26
-
27
-    //此处主要是使表格内滚动能根据屏幕高度自适应
28
-    .ant-table-fixed-header>.ant-table-container>.ant-table-body {
29
-      max-height: calc(100vh - 330px) !important
30
-    }
31
-
32
-    //处理Badge,与按钮,不对齐
33
-    .ant-table-tbody .yx_table_row_tr td .table_cell_box .ant-typography {
34
-      line-height: 20px;
35
-      height: 20px;
36
-    }
37
-  }
38
-}
39
-
40
-:global {
41
-  .ant-modal {
42
-    top: 50px;
43
-  }
44
-}
45
-
46
-.sys_account {
47
-  :global {
48
-    background-color: #fff;
49
-    padding: 12px 16px 16px 16px;
50
-
51
-    .module_search,
52
-    .module_line {
53
-      border-bottom: 8px solid #f5f5f5;
54
-      padding-bottom: 20px;
55
-    }
56
-
57
-    .cursor {
58
-      cursor: pointer;
59
-    }
60
-
61
-    .col_blue {
62
-      color: #009F95;
63
-    }
64
-
65
-    .flex {
66
-      display: flex;
67
-    }
68
-
69
-    .module_body {
70
-      .list_top {
71
-        display: flex;
72
-        justify-content: space-between;
73
-
74
-        .module_button_area {
75
-          button {
76
-            float: right;
77
-            margin-left: 10px;
78
-          }
79
-        }
80
-      }
81
-    }
82
-
83
-    .ckxq_but {
84
-      cursor: pointer;
85
-      color: skyblue;
86
-    }
87
-
88
-  }
89
-}
90
-
91
-.DataSourceAddModal {
92
-  :global {
93
-    .ant-form-item-children>div {
94
-      display: inline-block !important;
95
-    }
96
-
97
-    .ant-form-explain {
98
-      font-weight: 400;
99
-      font-size: 12px;
100
-      line-height: normal;
101
-      color: #e54747;
102
-      padding-top: 4px;
103
-    }
104
-
105
-    .has-error .ant-input,
106
-    .has-error .ant-select-selector {
107
-      color: rgba(0, 0, 0, 0.6);
108
-      background-color: #fff;
109
-      border: 1px #e54747 solid;
110
-    }
111
-  }
112
-}

+ 0 - 340
src/pages/businessWarning/list/businessWarningMod.js

@@ -1,340 +0,0 @@
1
-// 状态管理方法
2
-import { observable, action, configure, runInAction, autorun, toJS, computed, makeObservable } from 'mobx'
3
-// 工具方法
4
-import { isEqual, cloneDeep, trim, get } from 'lodash'
5
-// 引入Serv
6
-import Serv from './businessWarningServ'
7
-import { message } from 'antd'
8
-
9
-
10
-// 严格模式
11
-configure({
12
-  enforceActions: 'observed'
13
-});
14
-
15
-const defaultForm = {
16
-  dsId:'',
17
-  bizTableConfigName:'',
18
-  endTime:'',
19
-  dayTime:'',
20
-}
21
-
22
-/**
23
- * mod层 - 业务逻辑,数据逻辑应该存储于此
24
- */
25
-class BusinessWarningMod {
26
-  constructor() {
27
-    makeObservable(this);
28
-  }
29
-
30
-  // 监视状态
31
-  @observable state = {
32
-    visible: false,
33
-    createType: 'add', //创建类型,add:新增,edit:修改
34
-    formData: cloneDeep(defaultForm),
35
-    version: '',
36
-    loading: false,
37
-    dbTypeList: [],
38
-    tableArr: [{bizTableKey:1}]
39
-  }
40
-
41
-  /*
42
-   * 如果设定了useStrict严格模式,那么所有observable的值的修改必须在action定义的方法内,否则可以直接修改
43
-   * 设置内容可视性
44
-   */
45
-  @action updateState = async (payload) => {
46
-    // 设置到状态机 - 如果是异步,必须在runInAction
47
-    runInAction(() => {
48
-      this.state = {
49
-        ...this.state,
50
-        ...payload,
51
-        formData: {
52
-          ...this.state.formData,
53
-          ...payload.formData
54
-        }
55
-      }
56
-    })
57
-    /*
58
-     * Mod中跳转使用  window.app.router.push(url);
59
-     * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
60
-     */
61
-    autorun(() => {
62
-      // console.info("visible: ", this.state.visible);
63
-    })
64
-  }
65
-  // 重置from表单
66
-  @action restForm = async (payload) => {
67
-    this.state.formData = cloneDeep(defaultForm)
68
-    /*
69
-     * Mod中跳转使用  window.app.router.push(url);
70
-     * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
71
-     */
72
-    autorun(() => {
73
-      // console.info("visible: ", this.state.visible);
74
-    })
75
-  }
76
-  // 创建数据源
77
-  @action addDs = async (payload, _callbck) => {
78
-    // 请求参数
79
-    const params = payload
80
-    try {
81
-      // 异步请求方法
82
-      this.updateState({ loading: true })
83
-      const { resultCode, resultMsg, data } = await Serv.addDs(params)
84
-      this.updateState({ loading: false })
85
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
86
-      if (resultMsg == 'success') {
87
-        this.updateState({ version: +new Date(), visible: false })
88
-        message.success('保存成功!')
89
-        if (_callbck) {
90
-          _callbck()
91
-        }
92
-      } else {
93
-        message.warn(resultMsg)
94
-      }
95
-    } catch (error) {
96
-      this.updateState({ loading: false })
97
-      //message.error({ content: '发生异常,保存失败!' })
98
-    }
99
-  }
100
-
101
-  // 根据id查询业务预警定义详情
102
-  @action selectById = async (payload, _callbck) => {
103
-    // 请求参数
104
-    const params = payload
105
-    try {
106
-      const { resultCode, resultMsg, data } = await Serv.selectById(params)
107
-      if (resultCode == '0') {
108
-        if (_callbck) {
109
-          _callbck()
110
-        }
111
-      } else {
112
-        message.warn(resultMsg)
113
-      }
114
-    } catch (error) {
115
-      this.updateState({ loading: false })
116
-    }
117
-  }
118
-
119
-  /**
120
-   * 记录下载操作的日志
121
-   */
122
-  @action recordLogOfDownload = async (params, callback) => {
123
-    try {
124
-      const res = await Serv.recordLogOfDownload(params);
125
-      const { resultCode, resultMsg, data } = res;
126
-      const fileName = decodeURI(res.headers['content-disposition'].split(";")[1].split("filename=")[1]);
127
-      callback && callback(data, fileName)
128
-    } catch (error) {
129
-      // message.error('请求异常!')
130
-    }
131
-  }
132
-
133
-
134
-  // 获取数据源类型
135
-  @action queryDbType = async (payload) => {
136
-    // 请求参数
137
-    const params = payload
138
-    try {
139
-      // 异步请求方法
140
-      const { resultCode, resultMsg, data } = await Serv.queryDbType(params)
141
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
142
-      if (resultMsg == 'success') {
143
-        const dbTypeList = data ? data : []
144
-        this.updateState({
145
-          dbTypeList: dbTypeList
146
-        })
147
-      }
148
-    } catch (error) { }
149
-  }
150
-
151
-  // 分页查询数据源信息
152
-  @action pageQueryDsInfoMod = async (payload, callback) => {
153
-    // 请求参数
154
-    const params = payload
155
-    try {
156
-      // 异步请求方法
157
-      const { resultCode, resultMsg, data } = await Serv.pageQueryDsInfo(params)
158
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
159
-      if (resultCode == '0') {
160
-        const tableArr = get(data,"records",[]);
161
-        this.updateState({
162
-          tableArr: tableArr
163
-        })
164
-        callback && callback(data.total)
165
-      }
166
-    } catch (error) { }
167
-  }
168
-
169
-
170
-  // 修改数据源
171
-  @action updateDs = async (payload, _callbck) => {
172
-    // 请求参数
173
-    const params = payload
174
-    try {
175
-      // 异步请求方法
176
-      this.updateState({ loading: true })
177
-      const { resultCode, resultMsg, data } = await Serv.updateDs(params)
178
-      this.updateState({ loading: false })
179
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
180
-      if (resultMsg == 'success') {
181
-        this.updateState({ version: +new Date(), visible: false })
182
-        message.success('保存成功!')
183
-        if (_callbck) {
184
-          _callbck()
185
-        }
186
-      } else {
187
-        message.warn(resultMsg)
188
-      }
189
-    } catch (error) {
190
-      this.updateState({ loading: false })
191
-      //message.error({ content: '发生异常,保存失败!' })
192
-    }
193
-  }
194
-  // 删除数据源记录
195
-  @action deleteDs = async (payload, callback) => {
196
-    // 请求参数
197
-    const params = payload
198
-    message.destroy()
199
-    const loaddingDialog = message.loading('删除中,请稍等...', 0)
200
-    try {
201
-      // 异步请求方法
202
-      const { resultCode, resultMsg, data } = await Serv.deleteDs(params)
203
-      setTimeout(loaddingDialog, 0)
204
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
205
-      if (resultMsg == 'success') {
206
-        message.success('删除成功!')
207
-        callback && callback()
208
-      } else {
209
-        message.warn(resultMsg || '删除失败!')
210
-      }
211
-    } catch (error) {
212
-      setTimeout(loaddingDialog, 0)
213
-      //message.error({ content: '发生异常,删除失败!', key: 'deleteDs' })
214
-    }
215
-  }
216
-
217
-  // 测试数据源连通性
218
-  @action testDs = async (payload, _callbck) => {
219
-    // 请求参数
220
-    const params = payload
221
-    message.destroy()
222
-    const loaddingDialog = message.loading('测试中,请稍等...', 0)
223
-    try {
224
-      // 异步请求方法
225
-      const { resultCode, resultMsg, data } = await Serv.testDs(params)
226
-      setTimeout(loaddingDialog, 0)
227
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
228
-      if (resultMsg == 'success') {
229
-        message.success('测试成功!')
230
-        if (_callbck) {
231
-          _callbck(resultCode)
232
-        }
233
-      } else {
234
-        if (_callbck) {
235
-          _callbck()
236
-        }
237
-        message.warn('链接失败!')
238
-      }
239
-    } catch (error) {
240
-      setTimeout(loaddingDialog, 0)
241
-      if (_callbck) {
242
-        _callbck()
243
-      }
244
-      //message.error({ content: '发生异常,操作失败!', key: 'testDs' })
245
-    }
246
-  }
247
-  // 潍柴项目设置调度时间
248
-  @action setDataSourceTask = async (payload, _callbck) => {
249
-    // 请求参数
250
-    const params = payload
251
-    try {
252
-      message.loading({ content: '设置中,请稍等...', key: 'setDataSourceTask' })
253
-      // 异步请求方法
254
-      const { resultCode, resultMsg, data } = await Serv.setDataSourceTask(params)
255
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
256
-      if (resultMsg == 'success') {
257
-        this.updateState({ version: +new Date() })
258
-        message.success({ content: '设置成功!', key: 'setDataSourceTask' })
259
-        if (_callbck) {
260
-          _callbck(resultMsg)
261
-        }
262
-      } else {
263
-        if (_callbck) {
264
-          _callbck()
265
-        }
266
-        message.warn({ content: '设置失败!', key: 'setDataSourceTask' })
267
-      }
268
-    } catch (error) {
269
-      if (_callbck) {
270
-        _callbck()
271
-      }
272
-      //message.error({ content: '发生异常,操作失败!', key: 'setDataSourceTask' })
273
-    }
274
-  }
275
-  // 潍柴手动同步数据源信息
276
-  @action manualSyncDataSourceMeta = async (payload, _callbck) => {
277
-    // 请求参数
278
-    const params = payload
279
-    try {
280
-      //message.loading({ content: '设置中,请稍等...', key: 'manualSyncDataSourceMeta' })
281
-      const loaddingDialog = message.loading('设置中,请稍等...', 5)
282
-      // 异步请求方法
283
-      const { resultCode, resultMsg, data } = await Serv.manualSyncDataSourceMeta(params)
284
-      setTimeout(loaddingDialog, 0)
285
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
286
-      if (resultMsg == 'success') {
287
-        /*
288
-         * 设置成功,不需要进行提示
289
-         * message.success({ content: '设置成功!', key: 'manualSyncDataSourceMeta' })
290
-         */
291
-        if (_callbck) {
292
-          _callbck(resultMsg)
293
-        }
294
-      } else {
295
-        if (_callbck) {
296
-          _callbck()
297
-        }
298
-        message.warn({ content: '设置失败!', key: 'manualSyncDataSourceMeta' })
299
-      }
300
-    } catch (error) {
301
-      if (_callbck) {
302
-        _callbck()
303
-      }
304
-      //message.error({ content: '发生异常,操作失败!', key: 'manualSyncDataSourceMeta' })
305
-    }
306
-  }
307
-  // 潍柴获取数据源同步状态
308
-  @action queryDsSyncStatus = async (payload, _callbck) => {
309
-    // 请求参数
310
-    const params = payload
311
-    try {
312
-      // 异步请求方法
313
-      const { resultCode, resultMsg, data } = await Serv.queryDsSyncStatus(params)
314
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
315
-      if (resultMsg == 'success') {
316
-        if (data && data.latestSyncStatus == 'success') {
317
-          message.success({ content: '数据同步成功!' })
318
-        } else if (data && data.latestSyncStatus == 'fail') {
319
-          message.success({ content: '数据同步失败!' })
320
-        }
321
-        if (_callbck) {
322
-          _callbck(resultMsg, data)
323
-        }
324
-      } else {
325
-        if (_callbck) {
326
-          _callbck()
327
-        }
328
-      }
329
-    } catch (error) {
330
-      if (_callbck) {
331
-        _callbck()
332
-      }
333
-      //message.error({ content: '发生异常,操作失败!', key: 'manualSyncDataSourceMeta' })
334
-    }
335
-  }
336
-}
337
-
338
-// 将组件实例化,这意味着组件将不能从别处实例化
339
-const businessWarningMod = new BusinessWarningMod()
340
-export default businessWarningMod

+ 0 - 138
src/pages/businessWarning/list/businessWarningServ.js

@@ -1,138 +0,0 @@
1
-import request from '@utils/request'
2
-
3
-export default class {
4
-  //创建数据源
5
-  static addDs(params) {
6
-    return request({
7
-      url: 'api/biz/table/config/insertBizTableConfigEntity',
8
-      method: 'POST',
9
-      data: params,
10
-      headers: {
11
-        'Content-type': 'application/json'
12
-      },
13
-      // 对应后端的应用工程名
14
-      app: 'ide-op-mgmt-application'
15
-      //isLocMock: true
16
-    })
17
-  }
18
-
19
-  // 根据id查询业务预警定义详情
20
-  static selectById(alarmDefId) {
21
-    return request({
22
-      url: `api/bus/alarm/def/selectById/${alarmDefId}`,
23
-      method: 'get',
24
-      headers: {
25
-        'Content-type': 'application/json'
26
-      },
27
-      app: 'ide-op-mgmt-application'
28
-    })
29
-  }
30
-
31
-  /**
32
- * 记录下载操作的日志
33
- */
34
-  static recordLogOfDownload(params) {
35
-    return request({
36
-      url: `api/biz/table/config/downloadTempFile/${params}`,
37
-      method: 'POST',
38
-      responseType: 'arraybuffer',
39
-      // data: params,
40
-      headers: {
41
-        'Content-type': 'application/json'
42
-      },
43
-      // 对应后端的应用工程名
44
-      app: 'ide-op-mgmt-application'
45
-    })
46
-  }
47
-
48
-  //更新数据源
49
-  static updateDs(params) {
50
-    return request({
51
-      url: 'api/bus/alarm/def/updateBusAlarmDefEntity',
52
-      method: 'POST',
53
-      data: params,
54
-      headers: {
55
-        'Content-type': 'application/json'
56
-      },
57
-      // 对应后端的应用工程名
58
-      app: 'ide-op-mgmt-application'
59
-      //isLocMock: true
60
-    })
61
-  }
62
-  // 删除数据源
63
-  static deleteDs(params) {
64
-    return request({
65
-      url: 'api/os/datasource/info/deleteById/' + params.id,
66
-      method: 'DELETE',
67
-      //data: params,
68
-      app: 'ide-op-mgmt-application'
69
-      //isLocMock: true
70
-    })
71
-  }
72
-  // 测试数据源连通性
73
-  static testDs(params) {
74
-    return request({
75
-      url: 'api/os/datasource/info/testConnect',
76
-      method: 'POST',
77
-      data: params,
78
-      headers: {
79
-        'Content-type': 'application/json'
80
-      },
81
-      // 对应后端的应用工程名
82
-      app: 'ide-op-mgmt-application'
83
-      //isLocMock: true
84
-    })
85
-  }
86
-  // 查询数据源类型
87
-  static queryDbType(params) {
88
-    return request({
89
-      url: 'api/biz/table/config/queryDsListForBizConf',
90
-      method: 'GET',
91
-      // 对应后端的应用工程名
92
-      app: 'ide-op-mgmt-application'
93
-      //isLocMock: true
94
-    })
95
-  }
96
-
97
-  // 查询数据源类型
98
-  static pageQueryDsInfo(params) {
99
-    return request({
100
-      url: `api/bus/alarm/def/pageQueryBusAlarmDef`,
101
-      method: 'post',
102
-      data: params,
103
-      // 对应后端的应用工程名
104
-      app: 'ide-op-mgmt-application'
105
-      //isLocMock: true
106
-    })
107
-  }
108
-
109
-  //潍柴项目,设置调度任务
110
-  static setDataSourceTask(params) {
111
-    return request({
112
-      url: 'api/os/datasource/info/setDataSourceTask',
113
-      method: 'POST',
114
-      data: params,
115
-      headers: {
116
-        'Content-type': 'application/json'
117
-      }
118
-    })
119
-  }
120
-
121
-  //潍柴项目,手动同步数据源
122
-  static manualSyncDataSourceMeta(params) {
123
-    return request({
124
-      url: 'api/os/datasource/info/manualSyncDataSourceMeta?dsId=' + params.dsId,
125
-      method: 'GET',
126
-      headers: {
127
-        'Content-type': 'application/json'
128
-      }
129
-    })
130
-  }
131
-  //潍柴项目,获取数据源同步状态
132
-  static queryDsSyncStatus(params) {
133
-    return request({
134
-      url: `api/os/datasource/info/queryDetail/${params}`,
135
-      method: 'GET',
136
-    })
137
-  }
138
-}

+ 0 - 439
src/pages/businessWarning/list/businessWarningView.jsx

@@ -1,439 +0,0 @@
1
-/*
2
- * 业务预警列表
3
- * @Author: dayan_hjm 
4
- * @Date: 2023-06-14 15:57:57 
5
- * @Last Modified by: dayan_hjm
6
- * @Last Modified time: 2023-07-07 16:02:11
7
- */
8
-
9
-import React, { Component } from "react";
10
-import { useHistory, useLocation, withRouter } from "react-router-dom";
11
-import { Table, Button, Radio, Modal, Input, Select, message, DatePicker, TimePicker, Upload, Row, Col } from 'antd'
12
-import { Form } from '@ant-design/compatible';
13
-import { QuestionCircleOutlined, UploadOutlined, EditOutlined, CloseOutlined, DeleteOutlined } from '@ant-design/icons';
14
-import '@ant-design/compatible/assets/index.css';
15
-import { observer } from 'mobx-react'
16
-import { isEmpty, uniqueId, get } from 'lodash'
17
-import { Encrypt, Decrypt } from "@utils/util"
18
-import moment from 'moment'
19
-const FormItem = Form.Item;
20
-import utils from "@utils/index";
21
-import {
22
-    getAllTableConfigs, // 文件上传分页
23
-    preViewFillInData
24
-} from "@apis/system";
25
-
26
-// 站点配置
27
-import config from '@config/config';
28
-import TreeSelectModel from "@pages/frame/component/TreeSelectModel/view.jsx";
29
-
30
-// 引入当前页样式 - 模块化
31
-import styles from './businessWarningless.less'
32
-// 多类名样式管理工具
33
-import { toJS } from 'mobx'
34
-import businessWarningMod from './businessWarningMod';
35
-
36
-@withRouter
37
-class businessWarningView extends Component {
38
-    // 构造函数,组件的实例创建时,最先执行
39
-    constructor(props, context) {
40
-        super(props, context)
41
-        // 注入的businessWarningMod
42
-        this.stores = businessWarningMod;
43
-        this.state = {
44
-            total_: {
45
-                total: 0,
46
-                pageNum: 1,
47
-                pageSize: 10,
48
-            },
49
-            bizTableConfigId: 0,
50
-            total: 0,
51
-            searchParam: {
52
-                alarmName: '',
53
-                pageNum: 1,
54
-                pageSize: 10,
55
-            },
56
-            visible: false,
57
-            resetRoom: [
58
-                "excludeShopInfos",
59
-                "startDate",
60
-                "endDate",
61
-                "alarmHour",
62
-            ],
63
-        }
64
-        this.TreeSelectRef = null;
65
-    }
66
-
67
-    componentDidMount() {
68
-        this.loadRoles()
69
-        this.stores.queryDbType()
70
-    }
71
-
72
-    loadRoles(attrs = []) {
73
-        const { searchParam } = this.state;
74
-        let params = { ...searchParam, ...attrs };
75
-        this.stores.pageQueryDsInfoMod(params, (res = 0) => {
76
-            this.setState({ total: res })
77
-        })
78
-    };
79
-
80
-    inputChange(key, value) {
81
-        this.stores.updateState({
82
-            formData: {
83
-                [key]: value
84
-            }
85
-        })
86
-    }
87
-
88
-    // 渲染新增修改表单
89
-    renderForm() {
90
-        const { getFieldDecorator } = this.props.form
91
-        const { formData = {}, dbTypeList } = toJS(this.stores.state);
92
-        const timeList = [];
93
-        for (let index = 1; index < 25; index++) {
94
-            timeList.push({ key: index+'', name: '每天' + index + '点' })
95
-        }
96
-
97
-        return (
98
-            <Form layout="horizontal" labelCol={{ span: 5 }} wrapperCol={{ span: 19 }} form={this.props.form}>
99
-
100
-                <FormItem label="预警开始日期">
101
-                    {getFieldDecorator('startDate', {
102
-                        rules: [
103
-                            { required: true, message: '请选择预警开始日期' },
104
-                        ],
105
-                        initialValue: formData.startDate
106
-                    })(
107
-                        <DatePicker style={{ width: "100%" }} format={'YYYY-MM-DD'} onChange={(e, dateString) => this.inputChange('startDate', dateString)} />
108
-                    )}
109
-                </FormItem>
110
-                <FormItem label="预警结束日期">
111
-                    {getFieldDecorator('endDate', {
112
-                        rules: [
113
-                            { required: true, message: '请选择预警结束日期' },
114
-                        ],
115
-                        initialValue: formData.endDate
116
-                    })(
117
-                        <DatePicker style={{ width: "100%" }} format={'YYYY-MM-DD'} onChange={(e, dateString) => this.inputChange('endDate', dateString)} />
118
-                    )}
119
-                </FormItem>
120
-                <FormItem label="预警周期">
121
-                    {getFieldDecorator('alarmHour', {
122
-                        rules: [
123
-                            { required: true, message: '请选择预警周期' },
124
-                        ],
125
-                        initialValue: formData.alarmHour
126
-                    })(
127
-                        <Select placeholder="选择时间" style={{ width: "calc(100% - 40px)" }} onChange={(e) =>
128
-                            this.inputChange('alarmHour', e)}>
129
-                            {timeList.map((item) => (
130
-                                <Option key={item.key} value={item.key}>{item.name}</Option>
131
-                            ))}
132
-                        </Select>
133
-
134
-                        // <div style={{ display: "flex", "justify-content": "space-between" }}>
135
-                        //     <span style={{ color: "#ccc", "font-size": "12px" }}>每天</span>
136
-                        //     <Select placeholder="选择时间" style={{ width: "calc(100% - 40px)" }} onChange={(e) => 
137
-                        //         this.inputChange('alarmHour', e)}>
138
-                        //         {timeList.map((item) => (
139
-                        //             <Option key={item.key} value={item.key}>{item.name}</Option>
140
-                        //         ))}
141
-                        //     </Select>
142
-                        //     {/* <TimePicker format={'h:mm:ss'} style={{ width: "95%" }} onChange={(e) => {
143
-                        //         this.inputChange('alarmHour', e)
144
-                        //     }} defaultOpenValue={moment('00:00:00', 'HH:mm:ss')} /> */}
145
-                        // </div>
146
-                    )}
147
-                </FormItem>
148
-                <FormItem label="是否通知">
149
-                    {getFieldDecorator('ifNotify', {
150
-                        rules: [
151
-                            { required: true, message: '是否通知' },
152
-                        ],
153
-                        initialValue: formData.ifNotify
154
-                    })(
155
-                        <Radio.Group onChange={(e) => this.inputChange('ifNotify', e.target.value)}>
156
-                            <Radio value={true}>是</Radio>
157
-                            <Radio value={false}>否</Radio>
158
-                        </Radio.Group>)}
159
-                </FormItem>
160
-                <FormItem label='排除门店'>
161
-                    {getFieldDecorator('excludeShopInfos', {
162
-                        rules: [{ required: false, message: '请选择排除门店' }],
163
-                        initialValue: formData.excludeShopInfos
164
-                    })(
165
-                        <TreeSelectModel onRef={(ref) => {
166
-                            this.TreeSelectRef = ref
167
-                        }} avtiveId={''} justQy={true} />
168
-                    )}
169
-                </FormItem>
170
-            </Form>
171
-        )
172
-    }
173
-
174
-    handleCancel() {
175
-        this.setState({ visible: false })
176
-        this.props.form.resetFields(this.state.resetRoom)
177
-        // 延期清除表单数据,处理关闭时,闪烁问题
178
-        setTimeout(() => {
179
-            this.stores.restForm({})
180
-        }, 100)
181
-    }
182
-
183
-    handleOk() {
184
-        const { validateFieldsAndScroll } = this.props.form
185
-        const { formData } = toJS(this.stores.state)
186
-        validateFieldsAndScroll((err, valus) => {
187
-            if (isEmpty(err)) {
188
-                if (formData.alarmDefId) {
189
-                    let excludeShopInfos = [];
190
-                    get(this.TreeSelectRef.state, "shop", []).map(x => {
191
-                        const hasNum =x.indexOf('@') > -1 ? x.split('@')[1] : x ? true : false;
192
-                        let activeTree = utils.findNodeTree(this.TreeSelectRef.state.shopData, x, "dataResourceName", "children",hasNum ? "dataResourceType" : '');
193
-                        if (activeTree) { excludeShopInfos.push({ shopCode: activeTree.shopCode, shopName: activeTree.dataResourceName }) }
194
-                    })
195
-
196
-                    formData.excludeShopInfos = excludeShopInfos;
197
-                    //处理未更改的时间格式x
198
-                    formData.endDate = moment(formData.endDate).format('YYYY-MM-DD')
199
-                    formData.startDate = moment(formData.startDate).format('YYYY-MM-DD')
200
-                    // if(formData.endDate.indexOf('T') > -1){
201
-                    //     formData.endDate = formData.endDate.split('T')[0]
202
-                    // }
203
-                    // if(formData.startDate.indexOf('T') > -1){
204
-                    //     formData.startDate = formData.startDate.split('T')[0]
205
-                    // }
206
-                    this.stores.updateDs(formData, () => {
207
-                        // this.props.form.resetFields()
208
-                        // 延期清除表单数据,处理关闭时,闪烁问题
209
-                        setTimeout(() => {
210
-                            this.stores.restForm();
211
-                            this.setState({ visible: false })
212
-                        }, 100)
213
-                        this.loadRoles()
214
-                    })
215
-                } else {
216
-                    this.stores.addDs(formData, () => {
217
-                        this.props.form.resetFields()
218
-                        // 延期清除表单数据,处理关闭时,闪烁问题
219
-                        setTimeout(() => {
220
-                            this.stores.restForm({})
221
-                            this.setState({ visible: false })
222
-                        }, 100)
223
-                        this.loadRoles()
224
-                    })
225
-                }
226
-            }
227
-        })
228
-    }
229
-    renderModalFooter() {
230
-        const { loading, formData } = this.stores.state
231
-
232
-        return (
233
-            <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
234
-                <div>
235
-                    <Button key="back" style={{ display: 'inline' }} onClick={() => this.handleCancel()}>
236
-                        取消
237
-                    </Button>
238
-
239
-                    <Button
240
-                        key="submit"
241
-                        type="primary"
242
-                        style={{ display: 'inline', marginLeft: '10px' }}
243
-                        loading={loading}
244
-                        onClick={() => this.handleOk()}
245
-                    >
246
-                        确定
247
-                    </Button>
248
-                </div>
249
-            </div>
250
-        )
251
-    }
252
-
253
-    getParam() {
254
-        const { searchParam, total_, bizTableConfigId, total } = this.state;
255
-
256
-        return {
257
-            scroll: { x: 1000 },
258
-            pagination: {
259
-                onChange: (pageNum) => {
260
-                    searchParam.pageNum = pageNum;
261
-                    this.setState({ ...searchParam });
262
-                    this.loadRoles();
263
-                },
264
-                current: searchParam.pageNum,
265
-                total,
266
-                pageSize: searchParam.pageSize,
267
-            },
268
-            columns: [
269
-                //key=one的表头
270
-                {
271
-                    title: '监控名称',
272
-                    dataIndex: 'alarmName'
273
-                },
274
-                {
275
-                    title: '监控周期',
276
-                    dataIndex: 'alarmHour',
277
-                    render: (data, row) => {
278
-                        return <span>每日{data}点</span>
279
-                    }
280
-                },
281
-                {
282
-                    title: '监控开始日期',
283
-                    dataIndex: 'startDate'
284
-                },
285
-                {
286
-                    title: '监控结束日期',
287
-                    dataIndex: 'endDate'
288
-                },
289
-                {
290
-                    title: '创建时间',
291
-                    dataIndex: 'createTime'
292
-                },
293
-                {
294
-                    title: '操作',
295
-                    // fixed: 'right',
296
-                    // width: 250,
297
-                    render: (val, record) => {
298
-                        let data = record;
299
-                        return (
300
-                            <span style={{ marginRight: "24px" }}>
301
-                                <a
302
-                                    onClick={() => {
303
-                                        this.stores.selectById(record.alarmDefId, (res => {
304
-                                            this.setState({ bizTableConfigId: data.alarmDefId })
305
-                                            const {
306
-                                                ifNotify,
307
-                                                startDate = "",
308
-                                                endDate = "",
309
-                                                alarmHour,
310
-                                                alarmDefId,
311
-                                                excludeShopInfos = []
312
-                                            } = data
313
-                                            console.log(moment(startDate, 'YYYY-MM-DD'));
314
-                                            const editData = {
315
-                                                ifNotify,
316
-                                                startDate: moment(startDate, 'YYYY-MM-DD'),
317
-                                                endDate: moment(endDate, 'YYYY-MM-DD'),
318
-                                                alarmHour,
319
-                                                alarmDefId,
320
-                                                excludeShopInfos
321
-                                            }
322
-                                            let shopArr = [];
323
-                                            const exclude_ = excludeShopInfos && excludeShopInfos.length > 0 ? excludeShopInfos.map(x => {
324
-                                                shopArr.push({ value: x.shopName, title: x.shopName, key: x.shopName,dataResourceName:x.shopName, ...x })
325
-                                                return x.shopName
326
-                                            }) : [];
327
-                                            this.stores.updateState({ createType: 'edit', formData: editData });
328
-                                            setTimeout(() => {
329
-                                                this.setState({ visible: true });
330
-                                                if (exclude_ && exclude_.length > 0) {
331
-                                                    setTimeout(() => {
332
-                                                        this.TreeSelectRef.setState({ shopData:shopArr,shop: exclude_ })
333
-                                                    }, 1000)
334
-                                                }
335
-                                            }, 500)
336
-                                        }))
337
-                                    }}
338
-                                >
339
-                                    配置预警规则
340
-                                </a>
341
-                            </span>
342
-                        )
343
-                    }
344
-                }
345
-            ],
346
-            dataSource: toJS(this.stores.state.tableArr)
347
-        }
348
-    }
349
-    render() {
350
-        const { createType } = this.stores.state;
351
-        const { searchParam, visible } = this.state;
352
-        const param = this.getParam();
353
-
354
-        return (
355
-            <div className={styles.sys_account}>
356
-                <div className="module_search">
357
-                    <div className="module_title space">查询条件</div>
358
-                    <Row type="flex" justify="start" align="middle">
359
-                        <Col>
360
-                            <span>监控名称:</span>
361
-                            <Input
362
-                                style={{ width: "180px" }}
363
-                                value={searchParam.alarmName}
364
-                                placeholder="请输入监控名称"
365
-                                onChange={(e) => {
366
-                                    searchParam.alarmName = e.target.value;
367
-                                    this.setState({ ...searchParam });
368
-                                }}
369
-                                onKeyDown={(e) => {
370
-                                    if (e.keyCode === 13) {
371
-                                        searchParam.pageNum = 1;
372
-                                        this.setState(searchParam);
373
-                                        this.loadRoles();
374
-                                    }
375
-                                }}
376
-                            ></Input>
377
-                        </Col>
378
-                    </Row>
379
-                    <Row type="flex" justify="end" align="middle">
380
-                        <Col>
381
-                            <Button
382
-                                type="primary"
383
-                                onClick={(e) => {
384
-                                    this.loadRoles();
385
-                                }}
386
-                            >
387
-                                搜索
388
-                            </Button>
389
-                        </Col>
390
-                        <Col>
391
-                            <Button
392
-                                // type="text"
393
-                                style={{ marginLeft: 14 }}
394
-                                onClick={(e) => {
395
-                                    searchParam.alarmName = "";
396
-                                    searchParam.pageNum = 1;
397
-                                    this.setState({ ...searchParam });
398
-                                    this.loadRoles();
399
-                                }}
400
-                            >
401
-                                重置
402
-                            </Button>
403
-                        </Col>
404
-                    </Row>
405
-                </div>
406
-
407
-                <div className="module_body">
408
-                    <div className="title_with_btn list_top">
409
-                        <div className="module_title">业务预警列表</div>
410
-                    </div>
411
-                    <Table style={{ marginTop: "16px" }} {...param}></Table>
412
-                </div>
413
-
414
-
415
-                <Modal
416
-                    destroyOnClose
417
-                    width="900px"
418
-                    title={createType === 'add' ? '预警规则' : '预警规则'}
419
-                    className={styles.DataSourceAddModal}
420
-                    visible={visible}
421
-                    onCancel={() => {
422
-                        this.setState({ visible: false })
423
-                        this.props.form.resetFields()
424
-                        // 延期清除表单数据,处理关闭时,闪烁问题
425
-                        setTimeout(() => {
426
-                            this.stores.restForm({})
427
-                        }, 100)
428
-                    }}
429
-                    footer={this.renderModalFooter()}
430
-                >
431
-                    {this.renderForm()}
432
-                </Modal>
433
-
434
-            </div>
435
-        )
436
-    }
437
-}
438
-export default Form.create()(businessWarningView)
439
-// export default businessWarningView;

+ 0 - 120
src/pages/businessWarning/monitoringList/monitoringLess.less

@@ -1,120 +0,0 @@
1
-// 其中assets文件夹已经做了webpack别名配置,不需要再使用../../访问,直接加个波浪线
2
-
3
-:global {
4
-  .ant-modal {
5
-    top: 50px;
6
-  }
7
-  .dy_module_search{
8
-    display: flex;
9
-    align-items: center;
10
-    justify-content: space-between;
11
-    .ant-row{
12
-      width: 80%;
13
-    }
14
-  }
15
-
16
-}
17
-
18
-.sys_account {
19
-  min-width: 1000px; //设置内容区域最小宽度为1000px,防止表格不断被挤压重叠
20
-
21
-  :global {
22
-    .timeSetting {
23
-      .ant-time-picker {
24
-        width: 110px;
25
-        margin: 0px 4px;
26
-      }
27
-
28
-      .saveBtn {
29
-        cursor: pointer;
30
-        padding-right: 4px;
31
-      }
32
-
33
-      .closeBtn {
34
-        cursor: pointer;
35
-      }
36
-
37
-      .editBtn {
38
-        cursor: pointer;
39
-      }
40
-    }
41
-
42
-    //此处主要是使表格内滚动能根据屏幕高度自适应
43
-    .ant-table-fixed-header>.ant-table-container>.ant-table-body {
44
-      max-height: calc(100vh - 330px) !important
45
-    }
46
-
47
-    //处理Badge,与按钮,不对齐
48
-    .ant-table-tbody .yx_table_row_tr td .table_cell_box .ant-typography {
49
-      line-height: 20px;
50
-      height: 20px;
51
-    }
52
-  }
53
-}
54
-
55
-.sys_account {
56
-  :global {
57
-    background-color: #fff;
58
-    padding: 12px 16px 16px 16px;
59
-    .module_search,
60
-    .module_line {
61
-      border-bottom: 8px solid #f5f5f5;
62
-      padding-bottom: 20px;
63
-    }
64
-    
65
-    .cursor {
66
-      cursor: pointer;
67
-    }
68
-
69
-    .col_blue {
70
-      color: #009F95;
71
-    }
72
-
73
-    .flex {
74
-      display: flex;
75
-    }
76
-
77
-    .module_body {
78
-      .list_top {
79
-        display: flex;
80
-        justify-content: space-between;
81
-
82
-        .module_button_area {
83
-          button {
84
-            float: right;
85
-            margin-left: 10px;
86
-          }
87
-        }
88
-      }
89
-    }
90
-
91
-    .ckxq_but {
92
-      cursor: pointer;
93
-      color: skyblue;
94
-    }
95
-
96
-  }
97
-}
98
-
99
-.DataSourceAddModal {
100
-  :global {
101
-    .ant-form-item-children>div {
102
-      display: inline-block !important;
103
-    }
104
-
105
-    .ant-form-explain {
106
-      font-weight: 400;
107
-      font-size: 12px;
108
-      line-height: normal;
109
-      color: #e54747;
110
-      padding-top: 4px;
111
-    }
112
-
113
-    .has-error .ant-input,
114
-    .has-error .ant-select-selector {
115
-      color: rgba(0, 0, 0, 0.6);
116
-      background-color: #fff;
117
-      border: 1px #e54747 solid;
118
-    }
119
-  }
120
-}

+ 0 - 428
src/pages/businessWarning/monitoringList/monitoringMod.js

@@ -1,428 +0,0 @@
1
-// 状态管理方法
2
-import { observable, action, configure, runInAction, autorun, toJS, computed, makeObservable } from 'mobx'
3
-// 工具方法
4
-import { isEqual, cloneDeep, trim, get } from 'lodash'
5
-// 引入Serv
6
-import Serv from './monitoringServ'
7
-import { message } from 'antd'
8
-
9
-
10
-// 严格模式
11
-configure({
12
-  enforceActions: 'observed'
13
-});
14
-
15
-const defaultForm = {
16
-  dsId: '',
17
-  bizTableConfigName: '',
18
-  endTime: '',
19
-  dayTime: '',
20
-}
21
-
22
-/**
23
- * mod层 - 业务逻辑,数据逻辑应该存储于此
24
- */
25
-class MonitoringMod {
26
-  constructor() {
27
-    makeObservable(this);
28
-  }
29
-
30
-  // 监视状态
31
-  @observable state = {
32
-    visible: false,
33
-    createType: 'add', //创建类型,add:新增,edit:修改
34
-    formData: cloneDeep(defaultForm),
35
-    version: '',
36
-    loading: false,
37
-    dbTypeList: [],
38
-    tableArr: [{ bizTableKey: 1 }],
39
-    shengList:[],
40
-    shiList:[],
41
-    quList:[],
42
-    shopList:[],
43
-    activeData: {
44
-      type: 1,
45
-      num1: 0,
46
-      num2: 0,
47
-      title: ''
48
-    }
49
-  }
50
-
51
-  /*
52
-   * 如果设定了useStrict严格模式,那么所有observable的值的修改必须在action定义的方法内,否则可以直接修改
53
-   * 设置内容可视性
54
-   */
55
-  @action updateState = async (payload) => {
56
-    // 设置到状态机 - 如果是异步,必须在runInAction
57
-    runInAction(() => {
58
-      this.state = {
59
-        ...this.state,
60
-        ...payload,
61
-        formData: {
62
-          ...this.state.formData,
63
-          ...payload.formData
64
-        }
65
-      }
66
-    })
67
-    /*
68
-     * Mod中跳转使用  window.app.router.push(url);
69
-     * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
70
-     */
71
-    autorun(() => {
72
-      // console.info("visible: ", this.state.visible);
73
-    })
74
-  }
75
-  // 重置from表单
76
-  @action restForm = async (payload) => {
77
-    this.state.formData = cloneDeep(defaultForm)
78
-    /*
79
-     * Mod中跳转使用  window.app.router.push(url);
80
-     * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
81
-     */
82
-    autorun(() => {
83
-      // console.info("visible: ", this.state.visible);
84
-    })
85
-  }
86
-  // 创建数据源
87
-  @action addDs = async (payload, _callbck) => {
88
-    // 请求参数
89
-    const params = payload
90
-    try {
91
-      // 异步请求方法
92
-      this.updateState({ loading: true })
93
-      const { resultCode, resultMsg, data } = await Serv.addDs(params)
94
-      this.updateState({ loading: false })
95
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
96
-      if (resultMsg == 'success') {
97
-        this.updateState({ version: +new Date(), visible: false })
98
-        message.success('保存成功!')
99
-        if (_callbck) {
100
-          _callbck()
101
-        }
102
-      } else {
103
-        message.warn(resultMsg)
104
-      }
105
-    } catch (error) {
106
-      this.updateState({ loading: false })
107
-      //message.error({ content: '发生异常,保存失败!' })
108
-    }
109
-  }
110
-
111
-    /**
112
-   * 记录下载操作的日志
113
-   */
114
-    @action recordLogOfDownload = async (params, callback) => {
115
-      try {
116
-        const res = await Serv.recordLogOfDownload(params);
117
-        const { resultCode, resultMsg, data } = res;
118
-        const fileName = decodeURI(res.headers['content-disposition'].split(";")[1].split("filename=")[1]);
119
-        callback && callback(data, fileName)
120
-      } catch (error) {
121
-        // message.error('请求异常!')
122
-      }
123
-    }
124
-
125
-
126
-  // 获取数据源类型
127
-  @action queryDbType = async (payload) => {
128
-    // 请求参数
129
-    const params = payload
130
-    try {
131
-      // 异步请求方法
132
-      const { resultCode, resultMsg, data } = await Serv.queryDbType(params)
133
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
134
-      if (resultMsg == 'success') {
135
-        const dbTypeList = data ? data : []
136
-        this.updateState({
137
-          dbTypeList: dbTypeList
138
-        })
139
-      }
140
-    } catch (error) { }
141
-  }
142
-
143
-  // 获取省份
144
-  @action queryDbTypeSheng = async (payload) => {
145
-    // 请求参数
146
-    const params = payload
147
-    try {
148
-      // 异步请求方法
149
-      const { resultCode, resultMsg, data } = await Serv.queryDbTypeSheng(params)
150
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
151
-      if (resultMsg == 'success') {
152
-        const shengList = data ? data.filter((ele) => ele !== null && ele !== 'null') : []
153
-        this.updateState({
154
-          shengList: shengList
155
-        })
156
-      }
157
-    } catch (error) { }
158
-  }
159
-
160
-  // 获取区域
161
-  @action queryDbTypeQu = async (payload) => {
162
-    // 请求参数
163
-    const params = payload
164
-    try {
165
-      // 异步请求方法
166
-      const { resultCode, resultMsg, data } = await Serv.queryDbTypeQu(params)
167
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
168
-      if (resultMsg == 'success') {
169
-        const quList = data ? data.filter((ele) => ele !== null && ele !== 'null') : []
170
-        this.updateState({
171
-          quList: quList
172
-        })
173
-      }
174
-    } catch (error) { }
175
-  }
176
-  // 获取市
177
-  @action queryDbTypeShi = async (payload) => {
178
-    // 请求参数
179
-    const params = payload
180
-    try {
181
-      // 异步请求方法
182
-      const { resultCode, resultMsg, data } = await Serv.queryDbTypeShi(params)
183
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
184
-      if (resultMsg == 'success') {
185
-        const shiList = data ? data.filter((ele) => ele !== null && ele !== 'null') : []
186
-        this.updateState({
187
-          shiList: shiList
188
-        })
189
-      }
190
-    } catch (error) { }
191
-  }
192
-
193
-  // 获取门店
194
-  @action queryDbTypeShop = async (payload) => {
195
-    // 请求参数
196
-    const params = payload
197
-    try {
198
-      // 异步请求方法
199
-      const { resultCode, resultMsg, data } = await Serv.queryDbTypeShop(params)
200
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
201
-      if (resultMsg == 'success') {
202
-        const shopList = data ? data : []
203
-        this.updateState({
204
-          shopList: shopList
205
-        })
206
-      }
207
-    } catch (error) { }
208
-  }
209
-
210
-  // 分页查询数据源信息
211
-  @action pageQueryDsInfoMod = async (payload, callback) => {
212
-    // 请求参数
213
-    const params = payload
214
-    try {
215
-      // 异步请求方法
216
-      const { resultCode, resultMsg, data } = await Serv.pageQueryDsInfo(params)
217
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
218
-      if (resultCode == '0') {
219
-        const tableArr = get(data, "records", []);
220
-        this.updateState({
221
-          tableArr: tableArr
222
-        })
223
-        callback && callback(data.total)
224
-        callback && callback(data.total)
225
-      }
226
-    } catch (error) { }
227
-  }
228
-
229
-
230
-  // 修改数据源
231
-  @action updateDs = async (payload, _callbck) => {
232
-    // 请求参数
233
-    const params = payload
234
-    try {
235
-      // 异步请求方法
236
-      this.updateState({ loading: true })
237
-      const { resultCode, resultMsg, data } = await Serv.updateDs(params)
238
-      this.updateState({ loading: false })
239
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
240
-      if (resultMsg == 'success') {
241
-        this.updateState({ version: +new Date(), visible: false })
242
-        message.success('保存成功!')
243
-        if (_callbck) {
244
-          _callbck()
245
-        }
246
-      } else {
247
-        message.warn(resultMsg)
248
-      }
249
-    } catch (error) {
250
-      this.updateState({ loading: false })
251
-      //message.error({ content: '发生异常,保存失败!' })
252
-    }
253
-  }
254
-
255
-  // 根据id查询业务预警定义详情
256
-  @action selectById = async (payload, _callbck) => {
257
-    // 请求参数
258
-    const params = payload
259
-    try {
260
-      const { resultCode, resultMsg, data } = await Serv.selectById(params)
261
-      if (resultCode == '0') {
262
-        if (_callbck) {
263
-          _callbck(data)
264
-        }
265
-      } else {
266
-        message.warn(resultMsg)
267
-      }
268
-    } catch (error) {
269
-      this.updateState({ loading: false })
270
-    }
271
-  }
272
-
273
-  // 实例预警数据重推企业微信
274
-  @action rePushBusAlarmInstanceToQw = async (payload, _callbck) => {
275
-    // 请求参数
276
-    const params = payload
277
-    try {
278
-      const { resultCode, resultMsg, data } = await Serv.rePushBusAlarmInstanceToQw(params)
279
-      if (resultCode == '0') {
280
-        message.success('操作成功!');
281
-        if (_callbck) {
282
-          _callbck(data)
283
-        }
284
-      } else {
285
-        message.warn(resultMsg)
286
-      }
287
-    } catch (error) {
288
-      this.updateState({ loading: false })
289
-    }
290
-  }
291
-
292
-
293
-  @action pageQueryBusAlarmDetail = async (payload, callback) => {
294
-    // 请求参数
295
-    const params = payload
296
-    try {
297
-      // 异步请求方法
298
-      const { resultCode, resultMsg, data } = await Serv.pageQueryBusAlarmDetail(params)
299
-      if (resultCode == '0') {
300
-        callback && callback(data)
301
-      } else {
302
-        message.warn(resultMsg || '删除失败!')
303
-      }
304
-    } catch (error) {
305
-      //message.error({ content: '发生异常,删除失败!', key: 'deleteDs' })
306
-    }
307
-  }
308
-
309
-  // 测试数据源连通性
310
-  @action testDs = async (payload, _callbck) => {
311
-    // 请求参数
312
-    const params = payload
313
-    message.destroy()
314
-    try {
315
-      // 异步请求方法
316
-      const { resultCode, resultMsg, data } = await Serv.testDs(params)
317
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
318
-      if (resultMsg == 'success') {
319
-        message.success('测试成功!')
320
-        if (_callbck) {
321
-          _callbck(resultCode)
322
-        }
323
-      } else {
324
-        if (_callbck) {
325
-          _callbck()
326
-        }
327
-        message.warn('链接失败!')
328
-      }
329
-    } catch (error) {
330
-      if (_callbck) {
331
-        _callbck()
332
-      }
333
-      //message.error({ content: '发生异常,操作失败!', key: 'testDs' })
334
-    }
335
-  }
336
-  // 潍柴项目设置调度时间
337
-  @action setDataSourceTask = async (payload, _callbck) => {
338
-    // 请求参数
339
-    const params = payload
340
-    try {
341
-      message.loading({ content: '设置中,请稍等...', key: 'setDataSourceTask' })
342
-      // 异步请求方法
343
-      const { resultCode, resultMsg, data } = await Serv.setDataSourceTask(params)
344
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
345
-      if (resultMsg == 'success') {
346
-        this.updateState({ version: +new Date() })
347
-        message.success({ content: '设置成功!', key: 'setDataSourceTask' })
348
-        if (_callbck) {
349
-          _callbck(resultMsg)
350
-        }
351
-      } else {
352
-        if (_callbck) {
353
-          _callbck()
354
-        }
355
-        message.warn({ content: '设置失败!', key: 'setDataSourceTask' })
356
-      }
357
-    } catch (error) {
358
-      if (_callbck) {
359
-        _callbck()
360
-      }
361
-      //message.error({ content: '发生异常,操作失败!', key: 'setDataSourceTask' })
362
-    }
363
-  }
364
-  
365
-  // 潍柴手动同步数据源信息
366
-  @action manualSyncDataSourceMeta = async (payload, _callbck) => {
367
-    // 请求参数
368
-    const params = payload
369
-    try {
370
-      //message.loading({ content: '设置中,请稍等...', key: 'manualSyncDataSourceMeta' })
371
-      // 异步请求方法
372
-      const { resultCode, resultMsg, data } = await Serv.manualSyncDataSourceMeta(params)
373
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
374
-      if (resultMsg == 'success') {
375
-        /*
376
-         * 设置成功,不需要进行提示
377
-         * message.success({ content: '设置成功!', key: 'manualSyncDataSourceMeta' })
378
-         */
379
-        if (_callbck) {
380
-          _callbck(resultMsg)
381
-        }
382
-      } else {
383
-        if (_callbck) {
384
-          _callbck()
385
-        }
386
-        message.warn({ content: '设置失败!', key: 'manualSyncDataSourceMeta' })
387
-      }
388
-    } catch (error) {
389
-      if (_callbck) {
390
-        _callbck()
391
-      }
392
-      //message.error({ content: '发生异常,操作失败!', key: 'manualSyncDataSourceMeta' })
393
-    }
394
-  }
395
-  // 潍柴获取数据源同步状态
396
-  @action queryDsSyncStatus = async (payload, _callbck) => {
397
-    // 请求参数
398
-    const params = payload
399
-    try {
400
-      // 异步请求方法
401
-      const { resultCode, resultMsg, data } = await Serv.queryDsSyncStatus(params)
402
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
403
-      if (resultMsg == 'success') {
404
-        if (data && data.latestSyncStatus == 'success') {
405
-          message.success({ content: '数据同步成功!' })
406
-        } else if (data && data.latestSyncStatus == 'fail') {
407
-          message.success({ content: '数据同步失败!' })
408
-        }
409
-        if (_callbck) {
410
-          _callbck(resultMsg, data)
411
-        }
412
-      } else {
413
-        if (_callbck) {
414
-          _callbck()
415
-        }
416
-      }
417
-    } catch (error) {
418
-      if (_callbck) {
419
-        _callbck()
420
-      }
421
-      //message.error({ content: '发生异常,操作失败!', key: 'manualSyncDataSourceMeta' })
422
-    }
423
-  }
424
-}
425
-
426
-// 将组件实例化,这意味着组件将不能从别处实例化
427
-const monitoringMod = new MonitoringMod()
428
-export default monitoringMod

+ 0 - 195
src/pages/businessWarning/monitoringList/monitoringServ.js

@@ -1,195 +0,0 @@
1
-import request from '@utils/request'
2
-
3
-export default class {
4
-  //创建数据源
5
-  static addDs(params) {
6
-    return request({
7
-      url: 'api/biz/table/config/insertBizTableConfigEntity',
8
-      method: 'POST',
9
-      data: params,
10
-      headers: {
11
-        'Content-type': 'application/json'
12
-      },
13
-      // 对应后端的应用工程名
14
-      app: 'ide-op-mgmt-application'
15
-      //isLocMock: true
16
-    })
17
-  }
18
-
19
-  /**
20
- * 记录下载操作的日志
21
- */
22
-  static recordLogOfDownload(params) {
23
-    return request({
24
-      url: `api/bus/alarm/detail/pageQueryBusAlarmDetailForExport`,
25
-      method: 'POST',
26
-      responseType: 'arraybuffer',
27
-      data: params,
28
-      headers: {
29
-        'Content-type': 'application/json'
30
-      },
31
-      // 对应后端的应用工程名
32
-      app: 'ide-op-mgmt-application'
33
-    })
34
-  }
35
-
36
-  //更新数据源
37
-  static updateDs(params) {
38
-    return request({
39
-      url: 'api/biz/table/config/updateBizTableConfigEntity',
40
-      method: 'POST',
41
-      data: params,
42
-      headers: {
43
-        'Content-type': 'application/json'
44
-      },
45
-      // 对应后端的应用工程名
46
-      app: 'ide-op-mgmt-application'
47
-      //isLocMock: true
48
-    })
49
-  }
50
-  // 删除数据源
51
-  static deleteDs(params) {
52
-    return request({
53
-      url: 'api/os/datasource/info/deleteById/' + params.id,
54
-      method: 'DELETE',
55
-      //data: params,
56
-      app: 'ide-op-mgmt-application'
57
-      //isLocMock: true
58
-    })
59
-  }
60
-  // 测试数据源连通性
61
-  static testDs(params) {
62
-    return request({
63
-      url: 'api/os/datasource/info/testConnect',
64
-      method: 'POST',
65
-      data: params,
66
-      headers: {
67
-        'Content-type': 'application/json'
68
-      },
69
-      // 对应后端的应用工程名
70
-      app: 'ide-op-mgmt-application'
71
-      //isLocMock: true
72
-    })
73
-  }
74
-  // 查询数据源类型
75
-  static queryDbType(params) {
76
-    return request({
77
-      url: 'api/biz/table/config/queryDsListForBizConf',
78
-      method: 'GET',
79
-      // 对应后端的应用工程名
80
-      app: 'ide-op-mgmt-application'
81
-      //isLocMock: true
82
-    })
83
-  }
84
-
85
-  // 查询省份
86
-  static queryDbTypeSheng(params) {
87
-    return request({
88
-      url: 'api/bus/alarm/detail/listProvNameByAlarmInstanceId',
89
-      method: 'GET',
90
-      data:params,
91
-      // 对应后端的应用工程名
92
-      app: 'ide-op-mgmt-application'
93
-      //isLocMock: true
94
-    })
95
-  }
96
-  // 查询省份
97
-  static queryDbTypeQu(params) {
98
-    return request({
99
-      url: 'api/bus/alarm/detail/listOperCenterNameByAlarmInstanceId',
100
-      method: 'GET',
101
-      data:params,
102
-      // 对应后端的应用工程名
103
-      app: 'ide-op-mgmt-application'
104
-      //isLocMock: true
105
-    })
106
-  }
107
-
108
-  // 查询市
109
-  static queryDbTypeShi(params) {
110
-    return request({
111
-      data:params,
112
-      url: 'api/bus/alarm/detail/listCityNameByAlarmInstanceId',
113
-      method: 'GET',
114
-      // 对应后端的应用工程名
115
-      app: 'ide-op-mgmt-application'
116
-      //isLocMock: true
117
-    })
118
-  }
119
-  // 查询门店
120
-  static queryDbTypeShop(params) {
121
-    return request({
122
-      url: 'api/biz/table/config/queryDsListForBizConf',
123
-      method: 'GET',
124
-      // 对应后端的应用工程名
125
-      app: 'ide-op-mgmt-application'
126
-      //isLocMock: true
127
-    })
128
-  }
129
-
130
-  // 查询数据源类型
131
-  static pageQueryDsInfo(params) {
132
-    return request({
133
-      url: `api/bus/alarm/instance/pageQueryBusAlarmInstance`,
134
-      method: 'post',
135
-      data: params,
136
-      // 对应后端的应用工程名
137
-      app: 'ide-op-mgmt-application'
138
-      //isLocMock: true
139
-    })
140
-  }
141
-
142
-  // 根据id查询业务预警定义详情
143
-  static selectById(alarmDefId) {
144
-    return request({
145
-      url: `api/bus/alarm/def/selectById/${alarmDefId}`,
146
-      method: 'get',
147
-      headers: {
148
-        'Content-type': 'application/json'
149
-      },
150
-      app: 'ide-op-mgmt-application'
151
-    })
152
-  }
153
-  // 实例预警数据重推企业微信
154
-  static rePushBusAlarmInstanceToQw(params) {
155
-    return request({
156
-      url: `api/bus/alarm/instance/rePushBusAlarmInstanceToQw?instanceId=${params}`,
157
-      method: 'post',
158
-      headers: {
159
-        'Content-type': 'application/json'
160
-      },
161
-      app: 'ide-op-mgmt-application'
162
-    })
163
-  }
164
-
165
-
166
-  //分页查询业务预警明细信息
167
-  static pageQueryBusAlarmDetail(params) {
168
-    return request({
169
-      url: 'api/bus/alarm/detail/pageQueryBusAlarmDetail',
170
-      method: 'POST',
171
-      data: params,
172
-      headers: {
173
-        'Content-type': 'application/json'
174
-      }
175
-    })
176
-  }
177
-
178
-  //潍柴项目,手动同步数据源
179
-  static manualSyncDataSourceMeta(params) {
180
-    return request({
181
-      url: 'api/os/datasource/info/manualSyncDataSourceMeta?dsId=' + params.dsId,
182
-      method: 'GET',
183
-      headers: {
184
-        'Content-type': 'application/json'
185
-      }
186
-    })
187
-  }
188
-  //潍柴项目,获取数据源同步状态
189
-  static queryDsSyncStatus(params) {
190
-    return request({
191
-      url: `api/os/datasource/info/queryDetail/${params}`,
192
-      method: 'GET',
193
-    })
194
-  }
195
-}

+ 0 - 857
src/pages/businessWarning/monitoringList/monitoringView.jsx

@@ -1,857 +0,0 @@
1
-/*
2
- * 业务预警监控列表
3
- * @Author: dayan_hjm 
4
- * @Date: 2023-06-14 15:57:57 
5
- * @Last Modified by: dayan_hjm
6
- * @Last Modified time: 2023-08-11 17:14:02
7
- */
8
-
9
-import React, { Component } from "react";
10
-import { useHistory, useLocation, withRouter } from "react-router-dom";
11
-import { Table, message, Button, Alert, Modal, Input, Select, Radio, DatePicker, TimePicker, Drawer, Row, Col } from 'antd'
12
-import { Form } from '@ant-design/compatible';
13
-import { QuestionCircleOutlined, UploadOutlined, EditOutlined, CloseOutlined, DeleteOutlined } from '@ant-design/icons';
14
-import '@ant-design/compatible/assets/index.css';
15
-import { observer } from 'mobx-react'
16
-import { isEmpty, get } from 'lodash'
17
-import moment from 'moment'
18
-const FormItem = Form.Item;
19
-const { TextArea } = Input;
20
-import { preRecordViewFillInData } from "@apis/system";
21
-
22
-// 引入当前页样式 - 模块化
23
-import styles from './monitoringless.less'
24
-// 多类名样式管理工具
25
-import { toJS } from 'mobx'
26
-import monitoringMod from './monitoringMod';
27
-
28
-@withRouter
29
-class monitoringView extends Component {
30
-    // 构造函数,组件的实例创建时,最先执行
31
-    constructor(props, context) {
32
-        super(props, context)
33
-        // 注入的monitoringMod
34
-        this.stores = monitoringMod;
35
-        this.state = {
36
-            searchParam2: {
37
-                operCenterName: '',
38
-                cityName: '',
39
-                provName: '',
40
-            },
41
-            activeTIP: {},
42
-            drawerVisible: false,
43
-            activeDrawer: {
44
-                message: '',
45
-                description: ''
46
-            },
47
-            total_: {
48
-                total: 0,
49
-                pageNum: 1,
50
-                pageSize: 10,
51
-            },
52
-            total_2: {
53
-                total: 0,
54
-                pageNum: 1,
55
-                pageSize: 10,
56
-            },
57
-            alarmInstanceId: '',
58
-            bizTableConfigId: 0,
59
-            total: 0,
60
-            searchParam: {
61
-                alarmName: '',
62
-                ifAlarm: "",
63
-                monitorDateStr: moment(moment(new Date(new Date(new Date().toLocaleDateString()).getTime() - 24 * 60 * 60 * 1000)).format('YYYY-MM-DD'), 'YYYY-MM-DD'),
64
-                pageNum: 1,
65
-                pageSize: 10,
66
-            },
67
-            visible: false,
68
-            resetRoom: [
69
-                "dsId",
70
-                "bizTableConfigName",
71
-                "endTime",
72
-                "dayTime",
73
-            ],
74
-        }
75
-    }
76
-
77
-    componentDidMount() {
78
-        this.loadRoles();
79
-        //获取省份数据
80
-        this.stores.queryDbType();
81
-    }
82
-
83
-    loadRoles(attrs = []) {
84
-        const { searchParam } = this.state;
85
-        let params = { ...searchParam, ...attrs };
86
-        params.monitorDateStr = params.monitorDateStr ? moment(params.monitorDateStr).format('YYYY-MM-DD') : ''
87
-        this.stores.pageQueryDsInfoMod(params, (res = 0) => {
88
-            this.setState({ total: res })
89
-        })
90
-    };
91
-
92
-    inputChange(key, value) {
93
-        this.stores.updateState({
94
-            formData: {
95
-                [key]: value
96
-            }
97
-        })
98
-    }
99
-
100
-    // 渲染新增修改表单
101
-    renderForm() {
102
-        const { getFieldDecorator } = this.props.form
103
-        const { formData = {}, dbTypeList } = toJS(this.stores.state)
104
-        return (
105
-            <Form layout="horizontal" labelCol={{ span: 5 }} wrapperCol={{ span: 19 }} form={this.props.form}>
106
-
107
-                <FormItem label="预警开始日期">
108
-                    {getFieldDecorator('bizTableConfigName', {
109
-                        rules: [
110
-                            { required: true, message: '请选择预警开始日期' },
111
-                        ],
112
-                        initialValue: formData.bizTableConfigName
113
-                    })(
114
-                        <DatePicker style={{ width: "100%" }} format={'YYYY/MM/DD'} onChange={(e) => this.inputChange('bizTableConfigName', e)} />
115
-                    )}
116
-                </FormItem>
117
-                <FormItem label="预警结束日期">
118
-                    {getFieldDecorator('endTime', {
119
-                        rules: [
120
-                            { required: true, message: '请选择预警结束日期' },
121
-                        ],
122
-                        initialValue: formData.endTime
123
-                    })(
124
-                        <DatePicker style={{ width: "100%" }} format={'YYYY/MM/DD'} onChange={(e) => this.inputChange('endTime', e)} />
125
-                    )}
126
-                </FormItem>
127
-                <FormItem label="预警周期">
128
-                    {getFieldDecorator('dayTime', {
129
-                        rules: [
130
-                            { required: true, message: '请选择预警周期' },
131
-                        ],
132
-                        initialValue: formData.dayTime
133
-                    })(
134
-                        <div style={{ display: "flex", "justify-content": "space-between" }}>
135
-                            <span style={{ color: "#ccc", "font-size": "12px" }}>每天</span><TimePicker format={'h:mm:ss'} style={{ width: "95%" }} onChange={(e) => {
136
-                                this.inputChange('dayTime', e)
137
-                            }} defaultOpenValue={moment('00:00:00', 'HH:mm:ss')} />
138
-                        </div>
139
-                    )}
140
-                </FormItem>
141
-                <FormItem label='预警对象'>
142
-                    {getFieldDecorator('dsId', {
143
-                        rules: [{ required: false, message: '请选择预警对象' }],
144
-                        initialValue: formData.dsId
145
-                    })(
146
-                        <Select
147
-                            // disabled={formData.id ? true : false}
148
-                            placeholder={'请选择预警对象'}
149
-                            onChange={(value) => {
150
-                                this.inputChange('dsId', value)
151
-                            }}
152
-                            filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
153
-                        >
154
-                            {dbTypeList.map((item) => {
155
-                                return (
156
-                                    <Select.Option key={item.id} value={item.id}>
157
-                                        {item.name}
158
-                                    </Select.Option>
159
-                                )
160
-                            })}
161
-                        </Select>
162
-                    )}
163
-                </FormItem>
164
-            </Form>
165
-        )
166
-    }
167
-
168
-    handleCancel() {
169
-        const { searchParam2 } = this.state;
170
-        searchParam2.provName = "";
171
-        searchParam2.operCenterName = '';
172
-        searchParam2.cityName = '';
173
-        this.setState({ ...searchParam2 });
174
-
175
-        this.setState({ visible: false })
176
-        this.props.form.resetFields(this.state.resetRoom)
177
-        // 延期清除表单数据,处理关闭时,闪烁问题
178
-        setTimeout(() => {
179
-            this.stores.restForm({})
180
-        }, 100)
181
-    }
182
-
183
-    handleOk() {
184
-        const { validateFieldsAndScroll } = this.props.form
185
-        const { formData } = toJS(this.stores.state)
186
-        validateFieldsAndScroll((err, valus) => {
187
-            if (isEmpty(err)) {
188
-                if (formData.bizTableConfigId) {
189
-                    this.stores.updateDs(formData, () => {
190
-                        this.props.form.resetFields()
191
-                        // 延期清除表单数据,处理关闭时,闪烁问题
192
-                        setTimeout(() => {
193
-                            this.stores.restForm({})
194
-                            this.setState({ visible: false })
195
-                        }, 100)
196
-                        this.loadRoles()
197
-                    })
198
-                } else {
199
-                    this.stores.addDs(formData, () => {
200
-                        this.props.form.resetFields()
201
-                        // 延期清除表单数据,处理关闭时,闪烁问题
202
-                        setTimeout(() => {
203
-                            this.stores.restForm({})
204
-                            this.setState({ visible: false })
205
-                        }, 100)
206
-                        this.loadRoles()
207
-                    })
208
-                }
209
-            }
210
-        })
211
-    }
212
-    renderModalFooter() {
213
-        const { loading, formData } = this.stores.state
214
-
215
-        return (
216
-            <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
217
-                <div>
218
-                    <Button key="back" style={{ display: 'inline' }} onClick={() => this.handleCancel()}>
219
-                        关闭
220
-                    </Button>
221
-                </div>
222
-            </div>
223
-        )
224
-    }
225
-
226
-    handleDownload = (par) => {
227
-        message.info('即将开始下载,请稍候...')
228
-        this.stores
229
-            .recordLogOfDownload(par, ((data, fileName) => {
230
-                var blob = new Blob([data], {
231
-                    type: "application/vnd.ms-excel",
232
-                });
233
-                var downloadElement = document.createElement("a");
234
-                downloadElement.download = fileName;
235
-                downloadElement.href = window.URL.createObjectURL(blob);
236
-                downloadElement.click();
237
-                document.body.appendChild(downloadElement);
238
-                document.body.removeChild(downloadElement);
239
-                window.URL.revokeObjectURL(downloadElement.href);
240
-            }))
241
-            .then((data) => {
242
-            })
243
-            .catch(() => {
244
-            })
245
-    }
246
-
247
-
248
-    getParam() {
249
-        const { searchParam, total_, bizTableConfigId, total } = this.state;
250
-
251
-        return {
252
-            scroll: { x: 1000 },
253
-            pagination: {
254
-                onChange: (pageNum) => {
255
-                    searchParam.pageNum = pageNum;
256
-                    this.setState({ ...searchParam });
257
-                    this.loadRoles();
258
-                },
259
-                current: searchParam.pageNum,
260
-                total,
261
-                pageSize: searchParam.pageSize,
262
-            },
263
-            columns: [
264
-                //key=one的表头
265
-                {
266
-                    title: '预警名称',
267
-                    dataIndex: 'alarmName'
268
-                },
269
-                {
270
-                    title: '预警周期',
271
-                    dataIndex: 'alarmHour',
272
-                    render: (data, row) => {
273
-                        return <span>每日{data}点</span>
274
-                    }
275
-                },
276
-                {
277
-                    title: '监控日期',
278
-                    dataIndex: 'monitorDate',
279
-                },
280
-                {
281
-                    title: '任务运行时间',
282
-                    dataIndex: 'monitorDateTime'
283
-                },
284
-                // {
285
-                //     title: '任务结束日期',
286
-                //     dataIndex: 'endDate'
287
-                // },
288
-
289
-                {
290
-                    title: '运行状态',
291
-                    dataIndex: 'ifSuccess',
292
-                    render: (data, row) => {
293
-                        return <span>{data ? '运行成功' : "运行失败"}</span>
294
-                    }
295
-                },
296
-                {
297
-                    title: '是否触发预警',
298
-                    dataIndex: 'ifAlarm',
299
-                    render: (data, row) => {
300
-                        return <span>{data ? '是' : "否"}</span>
301
-                    }
302
-                },
303
-                {
304
-                    title: '推送企微结果',
305
-                    dataIndex: 'ifPushQwSuccess',
306
-                    render: (data, row) => {
307
-                        if (row.ifSuccess && row.ifPushQwSuccess) {
308
-                            return <span>成功</span>
309
-                        } else if (row.ifSuccess && !row.ifPushQwSuccess) {
310
-                            return <span type="link" style={{ "text-decoration": "underline", "color": "blue", "cursor": "pointer" }} onClick={() => {
311
-                                this.setState({
312
-                                    drawerVisible: true, activeDrawer: {
313
-                                        message: `${row.alarmName}-推送企微错误原因`,
314
-                                        style: {
315
-                                            width: 600,
316
-                                        },
317
-                                        description: `${row.pushQwDesc}`,
318
-                                    }
319
-                                })
320
-                            }}>失败</span>
321
-                        } else if (!row.ifSuccess) {
322
-                            return <span>-</span>
323
-                        }
324
-                    }
325
-                },
326
-                {
327
-                    title: '操作',
328
-                    // fixed: 'right',
329
-                    // width: 250,
330
-                    render: (val, record) => {
331
-                        let data = record;
332
-                        const { total_2 } = this.state;
333
-                        const { activeData } = this.stores.state;
334
-                        return (
335
-                            <span style={{ marginRight: "24px" }}>
336
-                                {
337
-                                    record.ifAlarm ? <a
338
-                                        onClick={() => {
339
-                                            let str = "";
340
-                                            this.stores.selectById(record.alarmDefId, (res) => {
341
-                                                this.stores.queryDbTypeSheng({ alarmInstanceId: record.alarmInstanceId })
342
-                                                this.stores.queryDbTypeQu({ alarmInstanceId: record.alarmInstanceId })
343
-                                                this.stores.queryDbTypeShi({ alarmInstanceId: record.alarmInstanceId })
344
-
345
-                                                str = res ? (record.alarmType == 4 ? `GMV比上周涨幅阈值>${res.gmvThreshold || 0}元 或 单均价>${res.orderAvgPriceThreshold || 0}元 或 杯均价>${res.cupAvgPriceThreshold || 0}元 或 单均销量>${res.orderCupNumThreshold || 0}元` :
346
-                                                    `店均(堂食/外卖)环比、同比降幅(全国业绩大屏)< ${res.decreaseThreshold}%`) : "";
347
-                                                this.setState({ activeTIP: res });
348
-                                                this.stores.pageQueryBusAlarmDetail({
349
-                                                    alarmInstanceId: record.alarmInstanceId,
350
-                                                    pageSize: total_2.pageSize,
351
-                                                    pageNum: total_2.pageNum,
352
-                                                }, (res => {
353
-                                                    this.setState({ alarmInstanceId: record.alarmInstanceId, uploadList: get(res, "records", []), total_2: { ...total_2, total: res.total } })
354
-                                                    this.stores.updateState({
355
-                                                        activeData: {
356
-                                                            ...activeData,
357
-                                                            ...record,
358
-                                                            regulation: str,
359
-                                                            type: record.alarmType,//1、营运中心业绩2、省份业绩3、城市业绩4、门店业绩
360
-                                                        }
361
-                                                    });
362
-                                                    console.log(activeData)
363
-                                                    setTimeout(() => {
364
-                                                        this.setState({ visible: true });
365
-                                                    }, 200)
366
-                                                }))
367
-                                            })
368
-                                        }}
369
-                                    >
370
-                                        查看监控结果
371
-                                    </a>
372
-                                        : null
373
-                                }
374
-                                {
375
-                                    record.ifSuccess && !record.ifPushQwSuccess ? <a style={{ "margin-left": record.ifAlarm ? "10px" : 0 }} onClick={() => {
376
-                                        this.stores.rePushBusAlarmInstanceToQw(record.alarmInstanceId, (res) => {
377
-                                            this.loadRoles()
378
-                                        })
379
-                                    }}
380
-                                    >
381
-                                        重推企微
382
-                                    </a>
383
-                                        : null
384
-                                }
385
-                            </span>
386
-                        )
387
-                    }
388
-                }
389
-            ],
390
-            dataSource: toJS(this.stores.state.tableArr)
391
-
392
-        }
393
-    }
394
-
395
-    getRed(data, type) {
396
-        const arr_ = ["", "gmvThreshold", "orderAvgPriceThreshold", "cupAvgPriceThreshold", "", "decreaseThreshold"]
397
-        let color_ = "unset";
398
-        const { activeTIP } = this.state;
399
-        if (data && activeTIP) {
400
-            if (type != 5) {
401
-                color_ = Number(data) > Number(activeTIP[arr_[type]]) ? "red" : 'unset';
402
-            } else {
403
-                color_ = Number(data) < Number(activeTIP[arr_[type]]) ? "red" : 'unset';
404
-            }
405
-        }
406
-        return <span style={{ color: color_ }}>{data}</span>
407
-    }
408
-
409
-    noticeTableOPt() {
410
-        const { total_2, alarmInstanceId } = this.state;
411
-        const q_ = ["", "监控区域", "监控省份", "监控城市"];
412
-        const d_ = ["", "operCenterName", "provName", "cityName"];
413
-        const noticeTableOPt_modal = {
414
-            dataSource: this.state.uploadList,
415
-            columns: this.stores.state.activeData.type != 4 ? [
416
-                ...(() => {
417
-                    return this.stores.state.activeData.type != 1 ? [
418
-                        {
419
-                            title: '营运中心',
420
-                            dataIndex: 'operCenterName',
421
-                        }
422
-                    ] : []
423
-                })(),
424
-                ...(() => {
425
-                    return this.stores.state.activeData.type != 1 && this.stores.state.activeData.type != 2 ? [
426
-                        {
427
-                            title: '省份',
428
-                            dataIndex: 'provName',
429
-                        }
430
-                    ] : []
431
-                })(),
432
-                {
433
-                    title: q_[this.stores.state.activeData.type],
434
-                    dataIndex: d_[this.stores.state.activeData.type],
435
-                },
436
-                {
437
-                    title: '本月预警次数',
438
-                    dataIndex: 'warningNumberOfMonth',
439
-                },
440
-                {
441
-                    title: '堂食店均',
442
-                    dataIndex: 'averageShopDine',
443
-                },
444
-                {
445
-                    title: '堂食店均周环比',
446
-                    dataIndex: 'averageShopDineWeekRatio',
447
-                    render: (data, row) => {
448
-                        return this.getRed(data, 5);
449
-                    }
450
-                },
451
-                {
452
-                    title: '堂食店均年同比',
453
-                    dataIndex: 'averageShopDineYearRatio',
454
-                    render: (data, row) => {
455
-                        return this.getRed(data, 5);
456
-                    }
457
-                },
458
-                {
459
-                    title: '外卖店均',
460
-                    dataIndex: 'averageShopTakeout',
461
-                },
462
-                {
463
-                    title: '外卖店均周环比',
464
-                    dataIndex: 'averageShopTakeoutWeekRatio',
465
-                    render: (data, row) => {
466
-                        return this.getRed(data, 5);
467
-                    }
468
-                },
469
-                {
470
-                    title: '外卖店均年同比',
471
-                    dataIndex: 'averageShopTakeoutYearRatio',
472
-                    render: (data, row) => {
473
-                        return this.getRed(data, 5);
474
-                    }
475
-                },
476
-            ] : [
477
-                {
478
-                    title: '门店ID',
479
-                    dataIndex: 'shopCode',
480
-                },
481
-                {
482
-                    title: '门店名称',
483
-                    dataIndex: 'shopName',
484
-                },
485
-                {
486
-                    title: '营运中心',
487
-                    dataIndex: 'operCenterName',
488
-                },
489
-                {
490
-                    title: '省份',
491
-                    dataIndex: 'provName',
492
-                },
493
-                {
494
-                    title: '城市',
495
-                    dataIndex: 'cityName',
496
-                },                
497
-                {
498
-                    title: '本月预警次数',
499
-                    dataIndex: 'warningNumberOfMonth',
500
-                },
501
-                {
502
-                    title: '流水金额',
503
-                    dataIndex: 'turnoverAmount',
504
-                },
505
-                {
506
-                    title: '流水金额相比上周波动',
507
-                    dataIndex: 'turnoverAmountFluctuates',
508
-                    render: (data, row) => {
509
-                        return this.getRed(data, 1);
510
-                    }
511
-                },
512
-                {
513
-                    title: '单均价',
514
-                    dataIndex: 'averagePriceOfTurnoverAmount',
515
-                    render: (data, row) => {
516
-                        return this.getRed(data, 2);
517
-                    }
518
-                },
519
-                {
520
-                    title: '杯均价',
521
-                    dataIndex: 'averageCupOfTurnoverAmount',
522
-                    render: (data, row) => {
523
-                        return this.getRed(data, 3);
524
-                    }
525
-                },
526
-                {
527
-                    title: '异常杯量的订单量',
528
-                    dataIndex: 'singleCupNumber',
529
-                    render: (data, row) => {
530
-                        return <span style={{ color: data && Number(data) > 0 ? 'red' : 'unset' }}>{data}</span>
531
-                    }
532
-                },
533
-            ],
534
-            pagination: {
535
-                showSizeChanger: false,
536
-                onChange: (pageNum) => {
537
-                    this.stores.pageQueryBusAlarmDetail({
538
-                        alarmInstanceId: alarmInstanceId,
539
-                        pageSize: total_2.pageSize,
540
-                        pageNum: pageNum,
541
-                    }, (res => {
542
-                        this.setState({ uploadList: get(res, "records", []), total_2: { ...total_2, total: res.total, pageNum: pageNum } })
543
-                    }))
544
-                },
545
-                total: total_2.total,
546
-                pageSize: total_2.pageSize,
547
-                current: Number(total_2.pageNum),
548
-            },
549
-
550
-            scroll: { x: 1000 },
551
-        };
552
-        return noticeTableOPt_modal
553
-    }
554
-    render() {
555
-        const { activeData, shengList = [], quList = [], shiList = [], shopList = [], } = this.stores.state;
556
-        const { searchParam, visible, activeDrawer, searchParam2, total_,total_2, alarmInstanceId } = this.state;
557
-        const param = this.getParam();
558
-
559
-        return (
560
-            <div className={styles.sys_account}>
561
-                <div className="module_search">
562
-                    <div className="module_title space">查询条件</div>
563
-                    <Row type="flex" justify="start" align="middle">
564
-                        <Col span={6}>
565
-                            <span>监控日期:</span>
566
-                            <DatePicker style={{ width: "180px" }} format={'YYYY-MM-DD'}
567
-                                defaultValue={searchParam.monitorDateStr}
568
-                                onChange={(e, dateString) => {
569
-                                    searchParam.monitorDateStr = dateString;
570
-                                    this.setState({ ...searchParam });
571
-                                }}
572
-                                onKeyDown={(e, dateString) => {
573
-                                    if (e.keyCode === 13) {
574
-                                        searchParam.pageNum = 1;
575
-                                        this.setState(searchParam);
576
-                                        this.loadRoles();
577
-                                    }
578
-                                }}
579
-                            />
580
-                            {/* <Input
581
-                                style={{ width: "180px" }}
582
-                                value={searchParam.monitorDateStr}
583
-                                placeholder="请输入监控日期"
584
-                                onChange={(e) => {
585
-                                    searchParam.monitorDateStr = e.target.value;
586
-                                    this.setState({ ...searchParam });
587
-                                }}
588
-                                onKeyDown={(e) => {
589
-                                    if (e.keyCode === 13) {
590
-                                        searchParam.pageNum = 1;
591
-                                        this.setState(searchParam);
592
-                                        this.loadRoles();
593
-                                    }
594
-                                }}
595
-                            ></Input> */}
596
-                        </Col>
597
-                        <Col span={6}>
598
-                            <span>预警名称:</span>
599
-                            <Input
600
-                                style={{ width: "180px" }}
601
-                                value={searchParam.alarmName}
602
-                                placeholder="请输入预警名称"
603
-                                onChange={(e) => {
604
-                                    searchParam.alarmName = e.target.value;
605
-                                    this.setState({ ...searchParam });
606
-                                }}
607
-                                onKeyDown={(e) => {
608
-                                    if (e.keyCode === 13) {
609
-                                        searchParam.pageNum = 1;
610
-                                        this.setState(searchParam);
611
-                                        this.loadRoles();
612
-                                    }
613
-                                }}
614
-                            ></Input>
615
-                        </Col>
616
-                        <Col span={6}>
617
-                            <span>是否预警:</span>
618
-                            <Radio.Group value={searchParam.ifAlarm} onKeyDown={(e) => {
619
-                                if (e.keyCode === 13) {
620
-                                    searchParam.pageNum = 1;
621
-                                    this.setState(searchParam);
622
-                                    this.loadRoles();
623
-                                }
624
-                            }}
625
-                                onChange={(e) => {
626
-                                    searchParam.ifAlarm = e.target.value;
627
-                                    this.setState({ ...searchParam });
628
-                                }}>
629
-                                <Radio value={true}>是</Radio>
630
-                                <Radio value={false}>否</Radio>
631
-                            </Radio.Group>
632
-                        </Col>
633
-                    </Row>
634
-                    <Row type="flex" justify="end" align="middle">
635
-                        <Col>
636
-                            <Button
637
-                                type="primary"
638
-                                onClick={(e) => {
639
-                                    this.loadRoles();
640
-                                }}
641
-                            >
642
-                                搜索
643
-                            </Button>
644
-                        </Col>
645
-                        <Col>
646
-                            <Button
647
-                                // type="text"
648
-                                style={{ marginLeft: 14 }}
649
-                                onClick={(e) => {
650
-                                    searchParam.alarmName = "";
651
-                                    searchParam.monitorDateStr = '';
652
-                                    searchParam.pageNum = 1;
653
-                                    searchParam.ifAlarm = "";
654
-                                    this.setState({ ...searchParam });
655
-                                    this.loadRoles();
656
-                                }}
657
-                            >
658
-                                重置
659
-                            </Button>
660
-                        </Col>
661
-                    </Row>
662
-                </div>
663
-
664
-                <div className="module_body">
665
-                    <div className="title_with_btn list_top">
666
-                        <div className="module_title">业务预警监控列表</div>
667
-                    </div>
668
-                    <Table style={{ marginTop: "16px" }} {...param}></Table>
669
-                </div>
670
-
671
-
672
-                <Modal
673
-                    destroyOnClose
674
-                    width="1300px"
675
-                    title={'监控结果'}
676
-                    className={styles.DataSourceAddModal}
677
-                    visible={visible}
678
-                    onCancel={() => {
679
-                        searchParam2.provName = "";
680
-                        searchParam2.operCenterName = '';
681
-                        searchParam2.cityName = '';
682
-                        this.setState({ ...searchParam2 });
683
-
684
-                        this.setState({ visible: false, })
685
-                        
686
-                        this.props.form.resetFields()
687
-                        // 延期清除表单数据,处理关闭时,闪烁问题
688
-                        setTimeout(() => {
689
-                            this.stores.restForm({})
690
-                        }, 100)
691
-                    }}
692
-                    footer={this.renderModalFooter()}
693
-                >
694
-                    <Alert message={<p><strong style={{ marginRight: '5px' }}>{activeData.monitorDate}</strong><strong>{activeData.alarmName}</strong></p>
695
-                    } type="info" showIcon />
696
-                    <p style={{ margin: '0 0 8px 17px', fontSize: '12px' }}>预警规则: {activeData.regulation}</p>
697
-                    {/* <p style={{margin:'0 0 8px 17px',fontSize: '12px'}}>已监控区域: <strong style={{ color: "#358dcf", marginRight: '5px' }}>{activeData.num1}</strong>告警区域: <strong style={{ color: "red" }}>{activeData.num2}</strong></p>
698
-                    <p style={{margin:'0 0 8px 17px',fontSize: '12px'}}>周环比日期: {activeData.regulation}</p> */}
699
-                    <div className="module_search dy_module_search" style={{ 'padding-left': '15px' }}>
700
-                        <Row type="flex" justify="start" align="middle">
701
-                            {
702
-                                this.stores.state.activeData.type != 1 ? <Col span={8}>
703
-                                    <span>营运中心:</span>
704
-                                    <Select
705
-                                        getPopupContainer={(triggerNode) => triggerNode.parentNode}
706
-                                        defaultValue=""
707
-                                        style={{ width: "120px" }}
708
-                                        value={searchParam2.operCenterName}
709
-                                        placeholder="全部"
710
-                                        onChange={(val) => {
711
-                                            this.setState({ searchParam2: { ...searchParam2, ...{ operCenterName: val } } });
712
-                                        }}
713
-                                    >
714
-                                        <Select.Option value="">全部</Select.Option>
715
-                                        {quList.map((item, i) => {
716
-                                            return (
717
-                                                <Select.Option key={item + i} value={item}>
718
-                                                    {item}
719
-                                                </Select.Option>
720
-                                            );
721
-                                        })}
722
-                                    </Select>
723
-
724
-                                </Col> : null
725
-                            }
726
-                            {
727
-                                this.stores.state.activeData.type != 1 && this.stores.state.activeData.type != 2 ? <Col span={8}>
728
-                                    <span>省份:</span>
729
-                                    <Select
730
-                                        getPopupContainer={(triggerNode) => triggerNode.parentNode}
731
-                                        defaultValue=""
732
-                                        style={{ width: "120px" }}
733
-                                        value={searchParam2.provName}
734
-                                        placeholder="全部"
735
-                                        onChange={(val) => {
736
-                                            this.setState({ searchParam2: { ...searchParam2, ...{ provName: val } } });
737
-                                        }}
738
-                                    >
739
-                                        <Select.Option value="">全部</Select.Option>
740
-                                        {shengList.map((item, i) => {
741
-                                            return (
742
-                                                <Select.Option key={item + i} value={item}>
743
-                                                    {item}
744
-                                                </Select.Option>
745
-                                            );
746
-                                        })}
747
-                                    </Select>
748
-
749
-                                </Col> : null
750
-                            }
751
-                            {
752
-                                this.stores.state.activeData.type == 4 ? <Col span={8}>
753
-                                    <span>城市:</span>
754
-                                    <Select
755
-                                        getPopupContainer={(triggerNode) => triggerNode.parentNode}
756
-                                        defaultValue=""
757
-                                        style={{ width: "120px" }}
758
-                                        value={searchParam2.cityName}
759
-                                        placeholder="全部"
760
-                                        onChange={(val) => {
761
-                                            this.setState({ searchParam2: { ...searchParam2, ...{ cityName: val } } });
762
-                                        }}
763
-                                    >
764
-                                        <Select.Option value="">全部</Select.Option>
765
-                                        {shiList.map((item, i) => {
766
-                                            return (
767
-                                                <Select.Option key={item + i} value={item}>
768
-                                                    {item}
769
-                                                </Select.Option>
770
-                                            );
771
-                                        })}
772
-                                    </Select>
773
-
774
-                                </Col> : null
775
-                            }
776
-
777
-                        </Row>
778
-                        <Row type="flex" justify="end" align="middle">
779
-                            <Col>
780
-                                <Button
781
-                                    type="primary"
782
-                                    onClick={(e) => {
783
-                                        this.stores.pageQueryBusAlarmDetail({
784
-                                            alarmInstanceId: alarmInstanceId,
785
-                                            pageSize: total_2.pageSize,
786
-                                            pageNum: 1,
787
-                                            ...searchParam2
788
-                                        }, (res => {
789
-                                            this.setState({ uploadList: get(res, "records", []), total_2: { ...total_2, total: res.total, pageNum: total_2.pageNum } })
790
-                                        }))
791
-                                    }}
792
-                                >
793
-                                    搜索
794
-                                </Button>
795
-                            </Col>
796
-                            <Col>
797
-                                <Button
798
-                                    // type="text"
799
-                                    style={{ marginLeft: 14 }}
800
-                                    onClick={(e) => {
801
-                                        searchParam2.provName = "";
802
-                                        searchParam2.operCenterName = '';
803
-                                        searchParam2.cityName = '';
804
-                                        this.setState({ ...searchParam2 });
805
-                                        this.stores.pageQueryBusAlarmDetail({
806
-                                            alarmInstanceId: alarmInstanceId,
807
-                                            pageSize: total_2.pageSize,
808
-                                            pageNum: total_2.pageNum,
809
-                                            ...searchParam2
810
-                                        }, (res => {
811
-                                            this.setState({ uploadList: get(res, "records", []), total_2: { ...total_2, total: res.total, pageNum: total_2.pageNum } })
812
-                                        }))
813
-                                    }}
814
-                                >
815
-                                    重置
816
-                                </Button>
817
-                            </Col>
818
-                            <Col>
819
-                                <Button
820
-                                    // type="text"
821
-                                    style={{ marginLeft: 14 }}
822
-                                    onClick={(e) => {
823
-                                        this.handleDownload({
824
-                                            alarmInstanceId: alarmInstanceId,
825
-                                            pageSize: total_2.pageSize,
826
-                                            pageNum: total_2.pageNum,
827
-                                            ...searchParam2
828
-                                        });
829
-                                    }}
830
-                                >
831
-                                    导出Excel
832
-                                </Button>
833
-                            </Col>
834
-                        </Row>
835
-                    </div>
836
-
837
-                    <Table {...this.noticeTableOPt()} scroll={{ y: 300 }} />
838
-                </Modal>
839
-
840
-                <Drawer
841
-                    title={activeDrawer.message}
842
-                    placement="left"
843
-                    closable={false}
844
-                    onClose={() => { this.setState({ drawerVisible: false }) }}
845
-                    visible={this.state.drawerVisible}
846
-                >
847
-                    <div>
848
-                        {activeDrawer.description}
849
-                    </div>
850
-                </Drawer>
851
-
852
-            </div>
853
-        )
854
-    }
855
-}
856
-export default Form.create()(monitoringView)
857
-// export default monitoringView;

+ 0 - 304
src/pages/client/index.js

@@ -1,304 +0,0 @@
1
-import $store from "@store/";
2
-import {
3
-  getTrendYearData, // 近一年客户量趋势
4
-  getCrossCustomerStatus,
5
-  getCustomerFeatureList,
6
-  getCustomerNativePlaceList,
7
-  getCustomerBuyPurposeList, // 购房分布等级
8
-  getIntentionRankList, // 购房意向等级
9
-  getCustomerServiceStatusList, // 物业工单状态分布
10
-  getCustomerEducateLevelList, // 家长文化程度分布
11
-  getCustomerIndustryList, // 家长工作职位分布
12
-  getCustomerServiceInfoList, // 物业工单汇总
13
-} from "@apis/client";
14
-
15
-export function loadTrend() {
16
-  getTrendYearData({ type: $store.client.clientType }).then(
17
-    ({ data, resultCode }) => {
18
-      if (+resultCode === 0) {
19
-        let trendXData = [];
20
-        let trendYData = [];
21
-        let rateXData = [];
22
-        let rateYData = [];
23
-        data.map((item) => {
24
-          rateXData.push(item.monthNo);
25
-          rateYData.push(item.lastRate);
26
-          trendXData.push(item.monthNo);
27
-          trendYData.push(item.allNum);
28
-        });
29
-
30
-        $store.client.setTrendObj({
31
-          rateXData,
32
-          rateYData,
33
-          trendXData,
34
-          trendYData,
35
-        });
36
-      }
37
-    }
38
-  );
39
-}
40
-
41
-export function loadWish() {
42
-  getIntentionRankList({ type: $store.client.clientType }).then(
43
-    ({ data, resultCode }) => {
44
-      if (+resultCode === 0) {
45
-        $store.client.setWishObj({
46
-          data: data.map((item) => {
47
-            return {
48
-              name: item.intentionRank,
49
-              value: item.allNum,
50
-              rate: item.rate,
51
-            };
52
-          }),
53
-        });
54
-      }
55
-    }
56
-  );
57
-}
58
-
59
-export function loadEffect() {
60
-  getCustomerBuyPurposeList({ type: $store.client.clientType }).then(
61
-    ({ data, resultCode }) => {
62
-      if (+resultCode === 0) {
63
-        let xData = [];
64
-        let yData = [];
65
-        let rates = [];
66
-        data.map((item) => {
67
-          xData.push(item.buyPurpose);
68
-          yData.push(item.allNum);
69
-          rates.push(`${item.rate}%`);
70
-        });
71
-        $store.client.setEffectObj({ xData, yData, rates });
72
-      }
73
-    }
74
-  );
75
-}
76
-
77
-export function loadCharac() {
78
-  getCustomerFeatureList({ type: $store.client.clientType }).then(
79
-    ({ data, resultCode }) => {
80
-      if (+resultCode === 0) {
81
-        let males = [];
82
-        let females = [];
83
-        let femaleRate = "";
84
-        let maleRate = "";
85
-        let femaleTotal = 0;
86
-        let maleTotal = 0;
87
-        data.map((item) => {
88
-          let obj = {
89
-            rate: `${item.sexBirthRate}%`,
90
-            name: item.dateBirth,
91
-            value: item.sexBirthNum,
92
-            sexRate: item.sexRate,
93
-            sexDataNum: item.sexNum,
94
-          };
95
-          let index = 0;
96
-
97
-          switch (item.dateBirth) {
98
-            case "60前":
99
-              index = 0;
100
-              break;
101
-            case "60后":
102
-              index = 1;
103
-              break;
104
-            case "70后":
105
-              index = 2;
106
-              break;
107
-            case "80后":
108
-              index = 3;
109
-              break;
110
-            case "90后":
111
-              index = 4;
112
-              break;
113
-            case "00后":
114
-              index = 5;
115
-              break;
116
-            case "10后":
117
-              index = 6;
118
-              break;
119
-            case "20后":
120
-              index = 7;
121
-              break;
122
-          }
123
-
124
-          if (item.sex === "女") {
125
-            females[index] = obj;
126
-          } else {
127
-            males[index] = obj;
128
-          }
129
-        });
130
-
131
-        femaleRate = ((females[0] || {}).sexRate || -1) + "%";
132
-        maleRate = ((males[0] || {}).sexRate || -1) + "%";
133
-        femaleTotal = (females[0] || {}).sexDataNum || -1;
134
-        maleTotal = (males[0] || {}).sexDataNum || -1;
135
-
136
-        $store.client.setCharacObj({
137
-          females,
138
-          males,
139
-          femaleRate,
140
-          maleRate,
141
-          femaleTotal,
142
-          maleTotal,
143
-        });
144
-      }
145
-    }
146
-  );
147
-}
148
-
149
-export function loadOrigin() {
150
-  getCustomerNativePlaceList({ type: $store.client.clientType }).then(
151
-    ({ data, resultCode }) => {
152
-      if (+resultCode === 0) {
153
-        $store.client.setOriginObj({
154
-          data: data.map((item) => {
155
-            return {
156
-              name: item.nativePlace.replace(/省|市|区|自治区/g, ""),
157
-              value: +item.allNum,
158
-              key: item.nativePlace,
159
-              rate: item.rate + '%',
160
-            };
161
-          }),
162
-        });
163
-      }
164
-    }
165
-  );
166
-}
167
-
168
-export function loadCross() {
169
-  getCrossCustomerStatus({ type: $store.client.clientType }).then(
170
-    ({ data, resultCode }) => {
171
-      if (+resultCode === 0) {
172
-        let [setData] = data || [];
173
-        if (setData) {
174
-          let sets = [
175
-            {
176
-              label: "地产",
177
-              size: +setData.cstNum,
178
-              sets: ["地产"],
179
-              content: "",
180
-              data: +setData.cstNum
181
-            },
182
-            {
183
-              label: "雅生活",
184
-              size: +setData.xscNum,
185
-              sets: ["雅生活"],
186
-              content: "",
187
-              data: +setData.xscNum,
188
-            },
189
-            {
190
-              label: "教育",
191
-              size: +setData.eduNum,
192
-              content: "",
193
-              sets: ["教育"],
194
-              data: +setData.eduNum,
195
-            },
196
-            {
197
-              label: "",
198
-              size: +setData.ceNum,
199
-              content: "地产&教育",
200
-              sets: ["地产", "教育"],
201
-              data: ''
202
-            },
203
-            {
204
-              label: "",
205
-              size: +setData.cxNum,
206
-              content: "地产&雅生活",
207
-              sets: ["地产", "雅生活"],
208
-              data: ''
209
-            },
210
-            {
211
-              label: "",
212
-              size: +setData.xeNum,
213
-              content: "雅生活&教育",
214
-              sets: ["雅生活", "教育"],
215
-              data: ''
216
-            },
217
-            {
218
-              label: "",
219
-              size: +setData.cxeNum,
220
-              content: "地产&雅生活&教育",
221
-              sets: ["地产", "雅生活", "教育"],
222
-              data: ''
223
-            },
224
-          ];
225
-
226
-          $store.client.setMergerObj({ data: sets });
227
-        }
228
-      }
229
-    }
230
-  );
231
-}
232
-
233
-export function loadOrder() {
234
-  getCustomerServiceStatusList({ type: $store.client.clientType }).then(
235
-    ({ data, resultCode }) => {
236
-      if (+resultCode === 0) {
237
-        let xData = [];
238
-        let yData = [];
239
-        let rates = [];
240
-        data.map((item) => {
241
-          xData.push(item.sevicestate);
242
-          yData.push(item.num);
243
-          rates.push(`${item.rate}%`);
244
-        });
245
-        $store.client.setOrderObj({ xData, yData, rates });
246
-      }
247
-    }
248
-  );
249
-}
250
-
251
-export function loadEducation() {
252
-  getCustomerEducateLevelList({ type: $store.client.clientType }).then(
253
-    ({ data, resultCode }) => {
254
-      if (+resultCode === 0) {
255
-        let xData = [];
256
-        let yData = [];
257
-        let rates = [];
258
-        data.map((item) => {
259
-          xData.push(item.educateLevel);
260
-          yData.push(item.num);
261
-          rates.push(`${item.rate}%`);
262
-        });
263
-        $store.client.setEduObj({ xData, yData, rates });
264
-      }
265
-    }
266
-  );
267
-}
268
-
269
-export function loadPosition() {
270
-  getCustomerIndustryList({ type: $store.client.clientType }).then(
271
-    ({ data, resultCode }) => {
272
-      if (+resultCode === 0) {
273
-        let xData = [];
274
-        let yData = [];
275
-        let rates = [];
276
-        data.map((item) => {
277
-          xData.push(item.industry);
278
-          yData.push(item.num);
279
-          rates.push(`${item.rate}%`);
280
-        });
281
-        $store.client.setPosiObj({ xData, yData, rates });
282
-      }
283
-    }
284
-  );
285
-}
286
-
287
-export function loadOrderSum() {
288
-  getCustomerServiceInfoList({ type: $store.client.clientType }).then(
289
-    ({ data, resultCode }) => {
290
-      if (+resultCode === 0) {
291
-        $store.client.setOrderSumObj({
292
-          orderTotal: data.allNum,
293
-          completeRate: data.completeRate,
294
-          completeNum: data.completeNum,
295
-          orderNew: data.newNum,
296
-        });
297
-      }
298
-    }
299
-  );
300
-}
301
-
302
-export function changeType(payload = 0) {
303
-  $store.client.setType(payload);
304
-}

+ 0 - 924
src/pages/client/index.jsx

@@ -1,924 +0,0 @@
1
-import "./index.scss";
2
-import { useState, useEffect } from "react";
3
-import {
4
-  Form,
5
-  Button,
6
-  Input,
7
-  Select,
8
-  message,
9
-  Spin,
10
-  Tooltip,
11
-  Table,
12
-} from "antd";
13
-import { useHistory } from "react-router-dom";
14
-import { maxBy, minBy } from "lodash";
15
-import { formatNum } from "@utils/";
16
-import $store from "@store/";
17
-import { observer } from "mobx-react";
18
-import "@libs/map/js/china.js";
19
-import "@utils/chartTheme.js";
20
-import { toJS } from "mobx";
21
-
22
-import Venen from "@components/venen/";
23
-import Chart from "@components/chart";
24
-
25
-import IconClient from "@images/icon-client.png";
26
-
27
-import {
28
-  loadWish,
29
-  loadTrend,
30
-  loadEffect,
31
-  loadCharac,
32
-  loadOrigin,
33
-  loadCross,
34
-  loadOrder,
35
-  loadPosition,
36
-  loadEducation,
37
-  loadOrderSum,
38
-  changeType,
39
-} from "./";
40
-
41
-import imgFemale from "@images/female.png";
42
-import imgMale from "@images/male.png";
43
-import { configure } from "mobx";
44
-configure({ useProxies: "never" });
45
-
46
-function handdleMarker(marker = "") {
47
-  return marker.replace(/10px/g, "6px");
48
-}
49
-
50
-export default observer(function (props) {
51
-  const history = useHistory();
52
-  const [form] = Form.useForm();
53
-
54
-  let {
55
-    trendObj,
56
-    mergerObj,
57
-    originObj,
58
-    characObj,
59
-    wishObj,
60
-    effectObj,
61
-    orderObj,
62
-    orderSumObj,
63
-    posiObj,
64
-    eduObj,
65
-    clientType,
66
-  } = $store.client;
67
-
68
-  useEffect(() => {
69
-    switch (clientType) {
70
-      case 0:
71
-        loadTrend();
72
-        loadCross();
73
-        loadCharac();
74
-        loadOrigin();
75
-        break;
76
-      case 1:
77
-        loadTrend();
78
-        loadCharac();
79
-        loadOrigin();
80
-        loadEffect();
81
-        loadWish();
82
-        break;
83
-      case 2:
84
-        loadTrend();
85
-        loadCharac();
86
-        loadOrigin();
87
-        loadOrder();
88
-        loadOrderSum();
89
-        break;
90
-      case 3:
91
-        loadTrend();
92
-        loadCharac();
93
-        loadOrigin();
94
-        loadEducation();
95
-        loadPosition();
96
-        break;
97
-    }
98
-  }, []);
99
-
100
-  let trendGraphOption = {
101
-    color: ["skyblue", "#006699"],
102
-    tooltip: {
103
-      trigger: "axis",
104
-      axisPointer: {
105
-        type: "shadow",
106
-      },
107
-      formatter: function (params) {
108
-        var result = "";
109
-        result = params[0].axisValue;
110
-        params.forEach(function (item) {
111
-          var dotHtml = `<span style="display:inline-block;margin-right:5px;border-radius:8px;width:8px;height:8px;background-color:${item.color};margin-top:5px;"></span>`;
112
-          result +=
113
-            "</br>" +
114
-            dotHtml +
115
-            item.seriesName +
116
-            ":" +
117
-            (formatNum(item.data) || 0) +
118
-            (item.seriesName === "增长率" ? "%" : "人");
119
-        });
120
-        return result;
121
-      },
122
-    },
123
-
124
-    legend: {},
125
-    xAxis: [
126
-      {
127
-        type: "category",
128
-        axisTick: {
129
-          show: false,
130
-        },
131
-        data: trendObj.trendXData,
132
-      },
133
-      {
134
-        show: false,
135
-      },
136
-    ],
137
-    yAxis: [
138
-      {
139
-        type: "value",
140
-        position: "left",
141
-        // min(value) {
142
-        //   return value;
143
-        // },
144
-        min: clientType >> 1 === 0 ? 2000000 : 0,
145
-      },
146
-      {
147
-        type: "value",
148
-        splitLine: {
149
-          show: false,
150
-        },
151
-      },
152
-    ],
153
-    series: [
154
-      {
155
-        name: /* 系列名称 */ "客户数",
156
-        type: "bar",
157
-        seriesLayoutBy: "row",
158
-        data: trendObj.trendYData,
159
-        barWidth: 20,
160
-        yAxisIndex: 0,
161
-      },
162
-      {
163
-        name: /* 系列名称 */ "增长率",
164
-        type: "line",
165
-        seriesLayoutBy: "row",
166
-        data: trendObj.rateYData,
167
-        yAxisIndex: 1,
168
-      },
169
-    ],
170
-  };
171
-
172
-  let femaleGraphOption = {
173
-    title: {
174
-      show: false,
175
-    },
176
-    tooltip: {
177
-      trigger: "item",
178
-      formatter(params) {
179
-        // debugger
180
-        return `${params.data.name}:${formatNum(
181
-          params.data.value
182
-        )}人<br/>女性中占比:${params.data.rate}`;
183
-      },
184
-    },
185
-    legend: {
186
-      orient: "horizontal",
187
-      left: "center",
188
-      top: 0,
189
-    },
190
-    series: [
191
-      {
192
-        name: "female",
193
-        type: "pie",
194
-        radius: ["35%", "60%"],
195
-        top: 0,
196
-        left: 100,
197
-        label: {
198
-          show: true,
199
-          width: 50,
200
-          formatter(params) {
201
-            // debugger
202
-            return params.data.rate;
203
-          },
204
-        },
205
-        labelLine: {
206
-          show: true,
207
-        },
208
-        data: /* name,value组成的元数组 */ characObj.females,
209
-        emphasis: {
210
-          itemStyle: {
211
-            shadowBlur: 10,
212
-            shadowOffsetX: 0,
213
-            shadowColor: "rgba(0, 0, 0, 0.5)",
214
-          },
215
-        },
216
-      },
217
-    ],
218
-  };
219
-
220
-  let colors = [
221
-    "#1890ff",
222
-    "#2fc25b",
223
-    "#facc14",
224
-    "#999",
225
-    "#999",
226
-    "#999",
227
-    "#999",
228
-    "#999",
229
-  ];
230
-
231
-  let maleGraphOption = {
232
-    title: {
233
-      show: false,
234
-    },
235
-    tooltip: {
236
-      trigger: "item",
237
-      formatter(params) {
238
-        return `${params.data.name}:${formatNum(
239
-          params.data.value
240
-        )}人<br/>男性中占比:${params.data.rate}`;
241
-      },
242
-    },
243
-    legend: {
244
-      orient: "horizontal",
245
-      left: "center",
246
-      top: 0,
247
-    },
248
-    series: [
249
-      {
250
-        name: "",
251
-        type: "pie",
252
-        radius: ["35%", "60%"],
253
-        top: "20",
254
-        left: "-100",
255
-        label: {
256
-          show: true,
257
-          width: 50,
258
-          formatter(params) {
259
-            return params.data.rate;
260
-          },
261
-        },
262
-        labelLine: {
263
-          show: true,
264
-        },
265
-        data: /* name,value组成的元数组 */ characObj.males,
266
-        emphasis: {
267
-          itemStyle: {
268
-            shadowBlur: 10,
269
-            shadowOffsetX: 0,
270
-            shadowColor: "rgba(0, 0, 0, 0.5)",
271
-          },
272
-        },
273
-      },
274
-    ],
275
-  };
276
-
277
-  let originGraphOption = {
278
-    color: ["#35C635", "#FAD337", "#FA5469"],
279
-    title: {
280
-      show: false,
281
-    },
282
-    tooltip: {
283
-      show: true,
284
-      formatter: function (params) {
285
-        let label = "客户数";
286
-        let unit = "人";
287
-        let { name = "", value = "0", rate = "0.00" } = params.data || {};
288
-        params.marker = handdleMarker(params.marker);
289
-        return `${params.name} </br>${params.marker} ${label}:${
290
-          formatNum(value) || 0
291
-        }${unit}`;
292
-      },
293
-    },
294
-    legend: {
295
-      show: false,
296
-      icon: "circle",
297
-      top: "0",
298
-      left: "center",
299
-      textStyle: {
300
-        rich: {
301
-          title: {},
302
-        },
303
-      },
304
-    },
305
-    toolbox: {
306
-      show: false,
307
-    },
308
-    visualMap: {
309
-      show: true,
310
-      type: "continuous",
311
-      min: 0,
312
-      max:
313
-        originObj.data.length > 0
314
-          ? +maxBy(originObj.data, "value").value
315
-          : 1000,
316
-      itemWidth: 12,
317
-      itemHeight: 110,
318
-      orient: "horizontal",
319
-      left: "4%",
320
-      bottom: "0",
321
-      text: ["高", "低"], // 文本,默认为数值文本
322
-      calculable: true,
323
-      inRange: {
324
-        color: ["#BAE7FF", "#3FA3FC"],
325
-        // symbolSize: [5, 5],
326
-      },
327
-      textStyle: {
328
-        color: "#666",
329
-      },
330
-    },
331
-    grid: {
332
-      containLabel: false,
333
-    },
334
-    series: [
335
-      {
336
-        name: "区域分布",
337
-        type: "map",
338
-        mapType: "china",
339
-        top: "20",
340
-        left: "50",
341
-        bottom: "20",
342
-        normal: {
343
-          areaColor: "#D4EAFF",
344
-          borderColor: "#eeeeee",
345
-          borderWidth: 1,
346
-        },
347
-        emphasis: {
348
-          areaColor: "#35C635",
349
-        },
350
-        label: {
351
-          show: true,
352
-          formatter: "{b}",
353
-          color: "#444",
354
-        },
355
-        data: originObj.data,
356
-      },
357
-    ],
358
-  };
359
-
360
-  let originTableOption = {
361
-    scroll: { y: 240 },
362
-    dataSource: toJS(originObj.data),
363
-    pagination: false,
364
-    columns: [
365
-      {
366
-        title: "省份",
367
-        dataIndex: "name",
368
-        width: "150",
369
-      },
370
-      {
371
-        title: "客户数",
372
-        dataIndex: "value",
373
-        width: "120",
374
-        render(val, record) {
375
-          return formatNum(val);
376
-        },
377
-      },
378
-      {
379
-        title: "占比",
380
-        dataIndex: "rate",
381
-        width: "120",
382
-      },
383
-    ],
384
-  };
385
-
386
-  let wishGraphOption = {
387
-    title: {
388
-      show: false,
389
-    },
390
-    tooltip: {
391
-      trigger: "item",
392
-      formatter(params) {
393
-        return `${params.data.name}:${params.data.value}人<br/>占比:${params.data.rate}%`;
394
-      },
395
-    },
396
-    legend: {
397
-      orient: "verticle",
398
-      left: "left",
399
-      top: 0,
400
-    },
401
-    series: [
402
-      {
403
-        name: "",
404
-        type: "pie",
405
-        radius: ["50%", "70%"],
406
-        top: 30,
407
-        left: 100,
408
-        label: {
409
-          show: false,
410
-          width: 50,
411
-          formatter(params) {
412
-            return params.data.rate;
413
-          },
414
-        },
415
-        labelLine: {
416
-          show: false,
417
-        },
418
-        data: /* name,value组成的元数组 */ wishObj.data,
419
-        emphasis: {
420
-          itemStyle: {
421
-            shadowBlur: 10,
422
-            shadowOffsetX: 0,
423
-            shadowColor: "rgba(0, 0, 0, 0.5)",
424
-          },
425
-        },
426
-      },
427
-    ],
428
-  };
429
-
430
-  let clientTypes = [
431
-    {
432
-      label: "客户总览",
433
-      value: 0,
434
-    },
435
-    {
436
-      label: "地产客户",
437
-      value: 1,
438
-    },
439
-    {
440
-      label: "雅生活客户",
441
-      value: 2,
442
-    },
443
-    {
444
-      label: "教育客户",
445
-      value: 3,
446
-    },
447
-  ];
448
-
449
-  let effectGraphOption = {
450
-    color: ["skyblue"],
451
-    tooltip: {
452
-      trigger: "axis",
453
-      axisPointer: {
454
-        type: "shadow",
455
-      },
456
-      formatter: function (params) {
457
-        var result = "";
458
-        result = params[0].axisValue;
459
-        params.forEach(function (item) {
460
-          var dotHtml = `<span style="display:inline-block;margin-right:5px;border-radius:8px;width:8px;height:8px;background-color:${item.color};margin-top:5px;"></span>`;
461
-          result +=
462
-            "</br>" +
463
-            dotHtml +
464
-            item.seriesName +
465
-            ":" +
466
-            (item.data || 0) +
467
-            (item.seriesName === "占比" ? "" : "人");
468
-        });
469
-        return result;
470
-      },
471
-    },
472
-    xAxis: [
473
-      {
474
-        type: "category",
475
-        axisTick: {
476
-          show: false,
477
-        },
478
-        data: effectObj.xData,
479
-      },
480
-    ],
481
-    yAxis: [
482
-      {
483
-        type: "value",
484
-        show: true,
485
-        axisLine: /* 轴线 */ {
486
-          show: true,
487
-        },
488
-        axisTick: /* 刻度 */ {
489
-          show: false,
490
-        },
491
-        axisLabel: {
492
-          show: false,
493
-        },
494
-      },
495
-      { type: "value" },
496
-    ],
497
-    series: [
498
-      {
499
-        name: /* 系列名称 */ "客户数",
500
-        type: "bar",
501
-        data: effectObj.yData,
502
-        barWidth: 20,
503
-      },
504
-      {
505
-        show: false,
506
-        name: /* 系列名称 */ "占比",
507
-        type: "line",
508
-        data: effectObj.rates,
509
-      },
510
-    ],
511
-  };
512
-
513
-  let orderGraphOption = {
514
-    color: ["skyblue"],
515
-    tooltip: {
516
-      trigger: "axis",
517
-      axisPointer: {
518
-        type: "shadow",
519
-      },
520
-      formatter: function (params) {
521
-        var result = "";
522
-        result = params[0].axisValue;
523
-        params.forEach(function (item) {
524
-          var dotHtml = `<span style="display:inline-block;margin-right:5px;border-radius:8px;width:8px;height:8px;background-color:${item.color};margin-top:5px;"></span>`;
525
-          result +=
526
-            "</br>" +
527
-            dotHtml +
528
-            item.seriesName +
529
-            ":" +
530
-            formatNum(item.data || 0) +
531
-            (item.seriesName === "占比" ? "" : "件");
532
-        });
533
-        return result;
534
-      },
535
-    },
536
-    grid: {
537
-      width: '100%',
538
-    },
539
-    xAxis: [
540
-      {
541
-        type: "category",
542
-        axisTick: {
543
-          show: false,
544
-        },
545
-        data: orderObj.xData,
546
-      },
547
-    ],
548
-    yAxis: [
549
-      {
550
-        type: "value",
551
-        show: true,
552
-        axisLine: /* 轴线 */ {
553
-          show: true,
554
-        },
555
-        axisTick: /* 刻度 */ {
556
-          show: false,
557
-        },
558
-        axisLabel: {
559
-          show: false,
560
-        },
561
-      },
562
-      { type: "value" },
563
-    ],
564
-    series: [
565
-      {
566
-        name: /* 系列名称 */ "工单数",
567
-        type: "bar",
568
-        data: orderObj.yData,
569
-        barWidth: 20,
570
-        left: "80",
571
-      },
572
-      {
573
-        show: false,
574
-        name: /* 系列名称 */ "占比",
575
-        type: "line",
576
-        data: orderObj.rates,
577
-      },
578
-    ],
579
-  };
580
-
581
-  let posiGraphOption = {
582
-    color: ["skyblue"],
583
-    tooltip: {
584
-      trigger: "axis",
585
-      axisPointer: {
586
-        type: "shadow",
587
-      },
588
-      formatter: function (params) {
589
-        var result = "";
590
-        result = params[0].axisValue;
591
-        params.forEach(function (item) {
592
-          var dotHtml = `<span style="display:inline-block;margin-right:5px;border-radius:8px;width:8px;height:8px;background-color:${item.color};margin-top:5px;"></span>`;
593
-          result +=
594
-            "</br>" +
595
-            dotHtml +
596
-            item.seriesName +
597
-            ":" +
598
-            (item.data || 0) +
599
-            (item.seriesName === "占比" ? "" : "人");
600
-        });
601
-        return result;
602
-      },
603
-    },
604
-    xAxis: [
605
-      {
606
-        type: "category",
607
-        axisTick: {
608
-          show: false,
609
-        },
610
-        data: posiObj.xData,
611
-      },
612
-    ],
613
-    yAxis: [
614
-      {
615
-        type: "value",
616
-        show: true,
617
-        axisLine: /* 轴线 */ {
618
-          show: true,
619
-        },
620
-        axisTick: /* 刻度 */ {
621
-          show: false,
622
-        },
623
-        axisLabel: {
624
-          show: false,
625
-        },
626
-      },
627
-      { type: "value" },
628
-    ],
629
-    series: [
630
-      {
631
-        name: /* 系列名称 */ "客户数",
632
-        type: "bar",
633
-        data: posiObj.yData,
634
-        barWidth: 20,
635
-      },
636
-      {
637
-        show: false,
638
-        name: /* 系列名称 */ "占比",
639
-        type: "line",
640
-        data: posiObj.rates,
641
-      },
642
-    ],
643
-  };
644
-
645
-  let eduGraphOption = {
646
-    color: ["skyblue"],
647
-    tooltip: {
648
-      trigger: "axis",
649
-      axisPointer: {
650
-        type: "shadow",
651
-      },
652
-      formatter: function (params) {
653
-        var result = "";
654
-        result = params[0].axisValue;
655
-        params.forEach(function (item) {
656
-          var dotHtml = `<span style="display:inline-block;margin-right:5px;border-radius:8px;width:8px;height:8px;background-color:${item.color};margin-top:5px;"></span>`;
657
-          result +=
658
-            "</br>" +
659
-            dotHtml +
660
-            item.seriesName +
661
-            ":" +
662
-            (item.data || 0) +
663
-            (item.seriesName === "占比" ? "" : "人");
664
-        });
665
-        return result;
666
-      },
667
-    },
668
-    xAxis: [
669
-      {
670
-        type: "category",
671
-        axisTick: {
672
-          show: false,
673
-        },
674
-        data: eduObj.xData,
675
-      },
676
-    ],
677
-    yAxis: [
678
-      {
679
-        type: "value",
680
-        show: true,
681
-        axisLine: /* 轴线 */ {
682
-          show: true,
683
-        },
684
-        axisTick: /* 刻度 */ {
685
-          show: false,
686
-        },
687
-        axisLabel: {
688
-          show: false,
689
-        },
690
-      },
691
-      { type: "value" },
692
-    ],
693
-    series: [
694
-      {
695
-        name: /* 系列名称 */ "客户数",
696
-        type: "bar",
697
-        data: eduObj.yData,
698
-        barWidth: 20,
699
-      },
700
-      {
701
-        show: false,
702
-        name: /* 系列名称 */ "占比",
703
-        type: "line",
704
-        data: eduObj.rates,
705
-      },
706
-    ],
707
-  };
708
-
709
-  let summaryArr = toJS(trendObj.trendYData);
710
-
711
-  let summaryTotal = formatNum(
712
-    +summaryArr[summaryArr.length - 1] || +summaryArr[summaryArr.length - 2]
713
-  );
714
-
715
-  return (
716
-    <div className="client_home">
717
-      <div
718
-        className="navs"
719
-        onClick={(e) => {
720
-          let type = +e.target.dataset.type;
721
-
722
-          if (type === clientType) {
723
-            return;
724
-          }
725
-          changeType(type);
726
-          switch (type) {
727
-            case 0:
728
-              loadTrend();
729
-              loadCross();
730
-              loadCharac();
731
-              loadOrigin();
732
-              break;
733
-            case 1:
734
-              loadTrend();
735
-              loadCharac();
736
-              loadOrigin();
737
-              loadEffect();
738
-              loadWish();
739
-              loadEffect();
740
-              break;
741
-            case 2:
742
-              loadTrend();
743
-              loadCharac();
744
-              loadOrigin();
745
-              loadEffect();
746
-              loadOrder();
747
-              loadOrderSum();
748
-              break;
749
-            case 3:
750
-              loadTrend();
751
-              loadCharac();
752
-              loadOrigin();
753
-              loadEducation();
754
-              loadPosition();
755
-              break;
756
-          }
757
-        }}
758
-      >
759
-        {clientTypes.map((type) => (
760
-          <li
761
-            className={clientType === type.value ? "actived" : ""}
762
-            data-type={type.value}
763
-          >
764
-            {type.label}
765
-          </li>
766
-        ))}
767
-      </div>
768
-
769
-      {/* 客户总数 */}
770
-      {clientType !== 0 && (
771
-        <div
772
-          className="chart"
773
-          data-title={`${
774
-            clientType === 1 ? "地产" : clientType === 2 ? "雅生活" : "教育"
775
-          }客户总数`}
776
-        >
777
-          <div className="flex summary">
778
-            <img src={IconClient} alt="" />
779
-            <div>{summaryTotal}人</div>
780
-          </div>
781
-        </div>
782
-      )}
783
-
784
-      {/* 近一年客户量趋势 */}
785
-      <div className="chart" data-title="近一年客户量趋势">
786
-        <Chart Option={trendGraphOption}></Chart>
787
-      </div>
788
-
789
-      {/* 事业部交叉客户数 */}
790
-      {clientType === 0 && (
791
-        <div className="chart" data-title="事业部交叉客户数">
792
-          <Venen sets={mergerObj.data}></Venen>
793
-          <div className="list">
794
-            {toJS(mergerObj.data)
795
-              .filter((item) => item.content !== "")
796
-              .map((item, index) => {
797
-                return (
798
-                  <li>
799
-                    <span
800
-                      className="point"
801
-                      style={{ background: "#999" }}
802
-                    ></span>
803
-                    <span className="label">{item.content}:</span>
804
-                    <span className="polulation" style={{ color: "#999" }}>
805
-                      {formatNum(item.size)}
806
-                    </span>
807
-                    人
808
-                  </li>
809
-                );
810
-              })}
811
-          </div>
812
-        </div>
813
-      )}
814
-
815
-      {/* 客户特征分布 */}
816
-      <div className="chart" data-title="客户特征分布">
817
-        <div className="flex" style={{ maxWidth: 1080, margin: "auto" }}>
818
-          <div className="chart2" data-title="">
819
-            <Chart Option={maleGraphOption} height={400} width={500}></Chart>
820
-            <div className="male">
821
-              <img src={imgMale} alt="" />
822
-              <div className="rate">{characObj.maleRate}</div>
823
-              <div className="block2">
824
-                <div className="content">
825
-                  男性客户数:
826
-                  <br />
827
-                  {formatNum(characObj.maleTotal)}人
828
-                </div>
829
-                <div className="angle"></div>
830
-              </div>
831
-            </div>
832
-          </div>
833
-          <div className="chart2" data-title="">
834
-            <Chart Option={femaleGraphOption} height={400} width={500}></Chart>
835
-            <div className="female">
836
-              <img src={imgFemale} alt="" />
837
-              <div className="rate">{characObj.femaleRate}</div>
838
-              <div className="block1">
839
-                <div className="content">
840
-                  女性客户数:
841
-                  <br />
842
-                  {formatNum(characObj.femaleTotal)}人
843
-                </div>
844
-                <div className="angle"></div>
845
-              </div>
846
-            </div>
847
-          </div>
848
-        </div>
849
-      </div>
850
-
851
-      {/* 客户籍贯分布 */}
852
-      <div className="chart" data-title="客户籍贯分布">
853
-        <Chart Option={originGraphOption} theme="myTheme" height={460}></Chart>
854
-        <div className="rank">
855
-          <Table {...originTableOption}></Table>
856
-        </div>
857
-      </div>
858
-
859
-      {/* 意向等级分布 & 购房用途分布 */}
860
-      {clientType === 1 && (
861
-        <div className="flex">
862
-          <div className="chart mr" data-title="意向等级分布">
863
-            <Chart Option={wishGraphOption} theme="myTheme" width={500}></Chart>
864
-          </div>
865
-          <div className="chart" data-title="购房用途分布">
866
-            <Chart
867
-              Option={effectGraphOption}
868
-              theme="myTheme"
869
-              width={500}
870
-            ></Chart>
871
-          </div>
872
-        </div>
873
-      )}
874
-
875
-      {/* 工单模块 */}
876
-      {clientType === 2 && (
877
-        <div className="flex">
878
-          <div
879
-            className="chart mr"
880
-            data-title="汇总信息"
881
-            style={{ flexGrow: 3 }}
882
-          >
883
-            <div className="order">
884
-              <li>
885
-                <div>工单总数:</div>
886
-                <div>{formatNum(orderSumObj.orderTotal)}</div>
887
-              </li>
888
-              <li>
889
-                <div>工单完成率:</div>
890
-                <div>{formatNum(orderSumObj.completeRate)}</div>
891
-              </li>
892
-              <li>
893
-                <div>新增工单:</div>
894
-                <div>{formatNum(orderSumObj.orderNew)}</div>
895
-              </li>
896
-            </div>
897
-          </div>
898
-          <div
899
-            className="chart"
900
-            data-title="物业工单状态分布"
901
-            style={{ flexGrow: 7 }}
902
-          >
903
-            <Chart
904
-              Option={orderGraphOption}
905
-              // theme="myTheme"
906
-              width={640}
907
-            ></Chart>
908
-          </div>
909
-        </div>
910
-      )}
911
-
912
-      {clientType === 3 && (
913
-        <div className="flex">
914
-          <div className="chart mr" data-title="家长工作职位分布">
915
-            <Chart Option={posiGraphOption} theme="myTheme" width={520}></Chart>
916
-          </div>
917
-          <div className="chart" data-title="家长文化程度分布">
918
-            <Chart Option={eduGraphOption} theme="myTheme" width={520}></Chart>
919
-          </div>
920
-        </div>
921
-      )}
922
-    </div>
923
-  );
924
-});

+ 0 - 223
src/pages/client/index.scss

@@ -1,223 +0,0 @@
1
-.client_home {
2
-  padding: 12px 12px 60px 12px;
3
-  background-color: #f8f8f8;
4
-  .mr {
5
-    margin-right: 12px;
6
-  }
7
-  .mt {
8
-    margin-top: 30px;
9
-  }
10
-
11
-  .navs {
12
-    display: flex;
13
-    margin-bottom: 12px;
14
-    // background-color: #fff;
15
-    // padding: 8px 0;
16
-    li {
17
-      list-style: none;
18
-      padding: 0;
19
-      border-radius: 32px;
20
-      line-height: 32px;
21
-      text-align: center;
22
-      border: #e7e7e7 1px solid;
23
-      width: 120px;
24
-      margin-right: 10px;
25
-      cursor: pointer;
26
-
27
-      &.actived {
28
-        background-color: skyblue;
29
-        color: #fff;
30
-      }
31
-      &:hover {
32
-        background-color: lightskyblue;
33
-      }
34
-    }
35
-  }
36
-  .chart {
37
-    border-radius: 5px;
38
-    position: relative;
39
-    padding: 10px;
40
-    margin-bottom: 12px;
41
-    background-color: #fff;
42
-    &::before {
43
-      content: attr(data-title);
44
-      font-size: 16px;
45
-      font-weight: bold;
46
-      display: block;
47
-      padding-bottom: 6px;
48
-      border-bottom: 1px solid #e7e7e7;
49
-      color: #333;
50
-    }
51
-    .list {
52
-      top: 20px;
53
-      position: absolute;
54
-      right: 80px;
55
-      padding-top: 40px;
56
-      font-size: 14px;
57
-      li {
58
-        list-style: none;
59
-        margin-bottom: 10px;
60
-      }
61
-      .point {
62
-        opacity: 0;
63
-        border-radius: 50%;
64
-        margin-right: 5px;
65
-        width: 10px;
66
-        height: 10px;
67
-        display: inline-block;
68
-        vertical-align: middle;
69
-      }
70
-      .label {
71
-        width: 150px;
72
-        display: inline-block;
73
-        text-align: right;
74
-      }
75
-      .polulation{
76
-        width: 80px;
77
-        text-align: right;
78
-        display: inline-block;
79
-      }
80
-    }
81
-  }
82
-  .chart2 {
83
-    position: relative;
84
-    &::before {
85
-      content: attr(data-title);
86
-      font-size: 16px;
87
-      font-weight: bold;
88
-      display: block;
89
-      padding-bottom: 6px;
90
-      padding-top: 6px;
91
-    }
92
-  }
93
-  .flex {
94
-    display: flex;
95
-    justify-content: space-between;
96
-    & > div {
97
-      flex-grow: 1;
98
-    }
99
-  }
100
-  .female,
101
-  .male {
102
-    position: absolute;
103
-    bottom: 0;
104
-    img {
105
-      width: 80px;
106
-      height: 180px;
107
-      position: relative;
108
-      z-index: 1;
109
-    }
110
-
111
-    .rate {
112
-      position: inherit;
113
-      bottom: 3px;
114
-      color: #fff;
115
-      width: 100%;
116
-      text-align: center;
117
-      z-index: 3;
118
-    }
119
-    .block1 {
120
-      color: #999;
121
-      position: absolute;
122
-      bottom: 50px;
123
-      right: 60px;
124
-      .content {
125
-        width: 120px;
126
-        height: 60px;
127
-        line-height: 2;
128
-        box-shadow: 0 0 6px 0 #d9d9d9;
129
-        border-radius: 12px;
130
-        background-color: #fff;
131
-        z-index: 4;
132
-        padding: 2px 8px;
133
-        position: relative;
134
-      }
135
-      .angle {
136
-        position: absolute;
137
-        box-shadow: 0 0 6px 0 #d9d9d9;
138
-        width: 10px;
139
-        height: 10px;
140
-        transform: rotate(45deg);
141
-        right: -5px;
142
-        top: 50%;
143
-        z-index: 3;
144
-      }
145
-    }
146
-    .block2 {
147
-      color: #999;
148
-      position: absolute;
149
-      bottom: 150px;
150
-      left: 80px;
151
-      .content {
152
-        width: 120px;
153
-        height: 60px;
154
-        line-height: 2;
155
-        box-shadow: 0 0 6px 0 #d9d9d9;
156
-        border-radius: 12px;
157
-        background-color: #fff;
158
-        z-index: 4;
159
-        padding: 2px 8px;
160
-        position: relative;
161
-      }
162
-      .angle {
163
-        position: absolute;
164
-        box-shadow: 0 0 6px 0 #d9d9d9;
165
-        width: 10px;
166
-        height: 10px;
167
-        transform: rotate(45deg);
168
-        left: -5px;
169
-        top: 50%;
170
-        z-index: 3;
171
-      }
172
-    }
173
-  }
174
-  .male {
175
-    right: 80px;
176
-  }
177
-  .female {
178
-    left: 40px;
179
-  }
180
-  .order {
181
-    display: flex;
182
-    flex-direction: column;
183
-    justify-content: space-around;
184
-    align-items: center;
185
-    height: 90%;
186
-    li {
187
-      border-bottom: 1px solid #f8f8f8;
188
-      padding: 20px;
189
-      list-style: none;
190
-      width: 100%;
191
-      text-align: center;
192
-      & > div:first-child {
193
-        color: #666;
194
-        font-size: 14px;
195
-      }
196
-      &>div:last-child{
197
-        color: skyblue;
198
-        font-size: 32px;
199
-        font-weight: 700;
200
-      }
201
-    }
202
-  }
203
-  .rank{
204
-    width: 400px;
205
-    right: 12px;
206
-    position: absolute;
207
-    top: 120px;
208
-    height: 300px;
209
-    overflow: auto;
210
-    border: 1px solid #e5e5e5;
211
-    border-radius: 5px;
212
-  }
213
-  .summary{
214
-    // display: flex;
215
-    color: #333;
216
-    align-items: center;
217
-    padding: 15px 20px;
218
-    img{margin-right: 70px;}
219
-    font-size: 40px;
220
-    font-weight: bold;
221
-  }
222
-  
223
-}

+ 0 - 270
src/pages/clush/style.less

@@ -1,270 +0,0 @@
1
-.fetch_data {
2
-  padding-bottom: 80px;
3
-
4
-  .hidden {
5
-    display: none !important;
6
-  }
7
-
8
-  &.disabled {
9
-    color: rgba(0, 0, 0, 0.25) !important;
10
-    cursor: not-allowed !important;
11
-  }
12
-
13
-  .loading {
14
-    position: absolute;
15
-    top: 50%;
16
-    left: 50%;
17
-    margin-top: -30px;
18
-  }
19
-
20
-  .pageView {
21
-    //background: #fff;
22
-    //padding: 16px;
23
-    border-radius: 3px;
24
-    padding: 0px;
25
-    min-height: e("calc(100vh - 168px)");
26
-    position: relative;
27
-    //padding-bottom: 33px;
28
-  }
29
-
30
-  .toolTipIcon {
31
-    display: inline-block;
32
-    width: 8px;
33
-    height: 8px;
34
-    // background-color: @primary-color;
35
-    border-radius: 50%;
36
-    vertical-align: middle;
37
-    margin-right: 8px;
38
-  }
39
-
40
-  .labelItem {
41
-    background: #ffffff;
42
-    border: 1px solid #e8e8e8;
43
-    border-radius: 2px;
44
-    padding: 8px 18px;
45
-    //margin-bottom: 16px;
46
-    // cursor: pointer;
47
-    line-height: normal;
48
-
49
-    &:not(:last-child) {
50
-      margin-right: 16px;
51
-    }
52
-
53
-    &:hover {
54
-      background: rgba(34, 152, 103, 0.1);
55
-      border: 1px solid #229867;
56
-      color: #229867;
57
-      //font-weight: bold;
58
-    }
59
-
60
-    &.active {
61
-      background: rgba(34, 152, 103, 0.1);
62
-      border: 1px solid #229867;
63
-      border-radius: 2px;
64
-      color: #229867;
65
-      //font-weight: bold;
66
-    }
67
-  }
68
-  :global{
69
-
70
-  
71
-  .pageContainer {
72
-    display: flex;
73
-
74
-    & > .section {
75
-      //height: e("calc(100vh - 186px)");
76
-      overflow-y: auto;
77
-    }
78
-
79
-    .section {
80
-      background-color: #fff;
81
-
82
-      &:first-child {
83
-        //width: 80%;
84
-        flex: 1;
85
-      }
86
-
87
-      & ~ .section {
88
-        //margin-left: 16px;
89
-        flex: 0.1 1 280px;
90
-      }
91
-    }
92
-
93
-    .formBox {
94
-      //width: 20%;
95
-      padding: 16px;
96
-    }
97
-  }
98
-
99
-  .btnList {
100
-    text-align: center;
101
-    /* margin-top: 16px; */
102
-    background: #ffffff;
103
-    box-shadow: 0 -6px 7px 0 rgba(0, 0, 0, 0.04);
104
-    padding: 8px 0;
105
-    position: fixed;
106
-    bottom: 0;
107
-    width: 100vw;
108
-    left: 0;
109
-    display: flex;
110
-    justify-content: flex-end;
111
-    padding-right: 16px;
112
-
113
-    button {
114
-      & ~ button {
115
-        margin-left: 16px;
116
-      }
117
-    }
118
-  }
119
-
120
-  .conBox {
121
-    display: flex;
122
-    min-height: e("calc(100vh - 168px)");
123
-  }
124
-
125
-  .tabBar {
126
-    background-color: #fafafa;
127
-    width: 18%;
128
-    min-width: 150px;
129
-
130
-    .list {
131
-      font-size: 14px;
132
-      color: rgba(0, 0, 0, 0.85);
133
-
134
-      .item {
135
-        height: 62px;
136
-        line-height: 62px;
137
-        //text-align: center;
138
-        cursor: pointer;
139
-        padding-left: 24px;
140
-        text-align: left;
141
-        font-weight: 600;
142
-
143
-        &.active {
144
-          background-color: #fff;
145
-          color: #229867;
146
-          font-weight: bold;
147
-        }
148
-
149
-        &:hover {
150
-          color: #229867;
151
-          //border-color: rgba(34,152,103,1);
152
-        }
153
-      }
154
-    }
155
-  }
156
-
157
-  .labelBox {
158
-    margin-top: 20px;
159
-    margin-left: 32px;
160
-    // height: calc(100vh - 188px);
161
-    // overflow: auto;
162
-    overflow: auto;
163
-    // max-height: 350px;
164
-    flex: 1;
165
-
166
-    .group {
167
-      .groupName {
168
-        font-size: 14px;
169
-        color: rgba(0, 0, 0, 0.85);
170
-        margin-bottom: 16px;
171
-        font-weight: bold;
172
-      }
173
-
174
-      & ~ .group {
175
-        margin-top: 12px;
176
-      }
177
-    }
178
-
179
-    .list {
180
-      display: flex;
181
-      flex-wrap: wrap;
182
-      font-size: 14px;
183
-      color: rgba(0, 0, 0, 0.65);
184
-
185
-      .item {
186
-        background: #ffffff;
187
-        border: 1px solid #e8e8e8;
188
-        border-radius: 2px;
189
-        padding: 8px 18px;
190
-        margin-bottom: 16px;
191
-        cursor: pointer;
192
-        position: relative;
193
-
194
-        &:not(:last-child) {
195
-          margin-right: 16px;
196
-        }
197
-
198
-        &:hover {
199
-          color: #229867;
200
-        }
201
-
202
-        &.active {
203
-          background: rgba(34, 152, 103, 0.1);
204
-          border: 1px solid #229867;
205
-          border-radius: 2px;
206
-          color: #229867;
207
-          //font-weight: bold;
208
-        }
209
-      }
210
-    }
211
-  }
212
-
213
-  .formBox {
214
-    .section-title {
215
-      font-family: PingFangSC-Semibold;
216
-      font-size: 14px;
217
-      color: rgba(0, 0, 0, 0.85);
218
-      font-weight: bold;
219
-      margin-bottom: 24px;
220
-    }
221
-
222
-    .fetchHistory {
223
-      text-align: right;
224
-    }
225
-
226
-    .selectLabelList {
227
-      display: flex;
228
-      flex-wrap: wrap;
229
-      align-items: center;
230
-      margin-top: 16px;
231
-
232
-      .item {
233
-        position: relative;
234
-        & ~ .item {
235
-          margin-left: 16px;
236
-          margin-bottom: 16px;
237
-        }
238
-        .icon_close {
239
-          position: absolute;
240
-          right: 2px;
241
-          top: -1px;
242
-          cursor: pointer;
243
-        }
244
-      }
245
-    }
246
-  }
247
-
248
-  .applyForm {
249
-    line-height: normal;
250
-
251
-    .selectLabelList {
252
-      display: flex;
253
-      flex-wrap: wrap;
254
-      align-items: center;
255
-      //margin-top: 16px;
256
-      line-height: normal;
257
-
258
-      .item {
259
-        margin-bottom: 12px;
260
-        height: 32px;
261
-        line-height: 32px;
262
-
263
-        & ~ .item {
264
-          margin-left: 12px;
265
-          //margin-bottom: 12px;
266
-        }
267
-      }
268
-    }
269
-  }
270
-}}

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 1655
src/pages/clush/view.jsx


+ 0 - 310
src/pages/dataApply/applyModal.jsx

@@ -1,310 +0,0 @@
1
-/*
2
-    权限申请
3
- * @Author: dayan_hjm 
4
- * @Date: 2023-02-03 17:09:46 
5
- * @Last Modified by: dayan_hjm
6
- * @Last Modified time: 2023-02-24 14:30:30
7
- */
8
-
9
-import React, { Component } from "react";
10
-import { withRouter } from "react-router-dom";
11
-import { Table, Button, Input, Modal, TreeSelect, Select, message, Tooltip, InputNumber, Checkbox, Tabs, Row, Col } from 'antd';
12
-const { TabPane } = Tabs;
13
-const { SHOW_CHILD } = TreeSelect;
14
-
15
-import { Form } from '@ant-design/compatible';
16
-import '@ant-design/compatible/assets/index.css';
17
-import { get, isEmpty, uniqueId } from 'lodash'
18
-import utils from "@utils/index";
19
-const FormItem = Form.Item;
20
-// 多类名样式管理工具
21
-import { toJS } from 'mobx'
22
-import dataApplyMod from './dataApplyMod';
23
-// 引入当前页样式 - 模块化
24
-import styles from './dataApplyLess.less'
25
-import { mapTree2 } from "@utils/util";
26
-
27
-@withRouter
28
-class ApplyModalView extends Component {
29
-    // 构造函数,组件的实例创建时,最先执行
30
-    constructor(props, context) {
31
-        super(props, context)
32
-        // 注入的DataApplyMod
33
-        this.stores = dataApplyMod;
34
-        this.state = {
35
-            visible: this.props.visible,
36
-            treeDatas: [],
37
-            treeValue: [],
38
-            extraArr: [],
39
-            resetRoom: [
40
-                'tableNames',
41
-                'applyReason',
42
-                'bizTableConfigName',
43
-            ],
44
-        }
45
-    }
46
-
47
-    componentDidMount() {
48
-        this.props.onRef(this);
49
-        // this.getTree()
50
-    }
51
-
52
-    getTree(name = "data_portal", id) {
53
-        const { isDetails } = this.props;
54
-        this.stores.listDbTables({
55
-            accountId: sessionStorage.getItem("accountId"),
56
-            tableType: 'biz',
57
-            dsId: id,
58
-            dbs: [name]
59
-        }).then((res) => {
60
-            let treeData_s = [{
61
-                title: name,
62
-                value: id,
63
-                key: id,
64
-                disabled:isDetails,
65
-                children: get(res, "tableNames", []).map(x => {
66
-                    return {
67
-                        title: x,
68
-                        value: x,
69
-                        key: x,
70
-                        disabled:isDetails
71
-                    }
72
-                })
73
-            }]
74
-            this.setState({ treeDatas: treeData_s })
75
-        })
76
-        // this.stores.getAllDsAndDbsAndTables({
77
-        //     type:'biz',
78
-        //     dataBaseName:name
79
-        // }).then((res) => {
80
-        //     if (res && res[0]) {
81
-        //         const treeData_s = res.map((item) => {
82
-        //             return mapTree2(item, 'tableNames', 'dataBaseName')
83
-        //         })
84
-        //         this.setState({ treeDatas: treeData_s })
85
-        //     }
86
-
87
-        // })
88
-
89
-    }
90
-
91
-    getFormData(id,type=1,datas={}) {//权限申请新增反序列化  但不需要调接口 type2=数据权限
92
-        this.stores.selectById({id,type,datas}, (data) => {
93
-            this.setState({ visible: true, treeValue: toJS(data) })
94
-        })
95
-    }
96
-
97
-    onChange = (value, label, extra) => {
98
-        this.setState({ treeValue: value, extraArr: extra.allCheckedNodes });
99
-    };
100
-
101
-    // 渲染新增修改表单
102
-    renderForm() {
103
-        const { getFieldDecorator } = this.props.form;
104
-        const { isDetails, activeData={
105
-            hasDownload:null,
106
-            hasSelect:null,
107
-            hasDownload:null,
108
-        } } = this.props;
109
-        const { formData = {} } = toJS(this.stores.state)
110
-        const tProps = {
111
-            treeData: this.state.treeDatas,
112
-            value: this.state.treeValue,
113
-            treeDefaultExpandAll: isDetails,
114
-            maxTagCount: 3,
115
-            onChange: this.onChange,
116
-            // treeCheckable: true,
117
-            treeCheckable: true,
118
-            showCheckedStrategy: SHOW_CHILD,
119
-            placeholder: '请选择',
120
-            multiple: true,
121
-            // disabled:isDetails,
122
-            allowClear: isDetails ? false : true,
123
-            style: {
124
-                width: '100%',
125
-            },
126
-        };
127
-        const options = [
128
-            { label: '下载', value: 'hasDownload' },
129
-            { label: '增删改', value: 'hasModify' },
130
-            { label: '查询', value: 'hasSelect' },
131
-        ];
132
-        return (
133
-            <Form layout="horizontal" labelCol={{ span: 5 }} wrapperCol={{ span: 19 }} form={this.props.form}>
134
-                {
135
-                    isDetails ? <FormItem label="申请人">
136
-                        {getFieldDecorator('createPerson', {
137
-                            rules: [
138
-                                { required: true, message: '请输入申请人' },
139
-                            ],
140
-                            initialValue: formData.createPerson
141
-                        })(
142
-                            <Input placeholder="请输入申请人" disabled={true}
143
-                                style={{ resize: 'none' }}
144
-                            />
145
-                        )}
146
-                    </FormItem> : null
147
-                }
148
-                {
149
-                    isDetails ? <FormItem label="申请时间">
150
-                        {getFieldDecorator('createTime', {
151
-                            rules: [
152
-                                { required: true, message: '请输入申请时间' },
153
-                            ],
154
-                            initialValue: formData.createTime
155
-                        })(
156
-                            <Input placeholder="请输入申请时间" disabled={true}
157
-                                style={{ resize: 'none' }}
158
-                            />
159
-                        )}
160
-                    </FormItem> : null
161
-                }
162
-                <FormItem label="申请内容">
163
-                    {getFieldDecorator('tableNames', {
164
-                        rules: [
165
-                            { required: true, message: '请选择申请内容' },
166
-                        ],
167
-                        initialValue: formData.tableNames
168
-                    })(
169
-                        <TreeSelect {...tProps} />
170
-                    )}
171
-                </FormItem>
172
-                <FormItem label="数据权限类型">
173
-                    {getFieldDecorator('bizTableConfigName', {
174
-                        rules: [
175
-                            { required: true, message: '请选择数据权限类型' },
176
-                        ],
177
-                        initialValue: formData.bizTableConfigName
178
-                    })(
179
-                        <Checkbox.Group options={options} defaultValue={[]} disabled={isDetails} />
180
-                    )}
181
-                </FormItem>
182
-                <FormItem label="申请理由">
183
-                    {getFieldDecorator('applyReason', {
184
-                        initialValue: formData.applyReason,
185
-                        rules: [
186
-                            { required: true, message: '请填写申请理由' },
187
-                        ],
188
-                    })(
189
-                        <Input.TextArea
190
-                            placeholder="请输入申请理由"
191
-                            autoSize={{ minRows: 5, maxRows: 10 }}
192
-                            disabled={isDetails}
193
-                            style={{ resize: 'none' }}
194
-                        // onChange={(e) => this.inputChange('applyReason', e.target.value)}
195
-                        />
196
-                    )}
197
-                </FormItem>
198
-            </Form>
199
-        )
200
-    }
201
-
202
-    handleCancel() {
203
-        this.setState({ visible: false })
204
-        this.props.form.resetFields(this.state.resetRoom)
205
-        // 延期清除表单数据,处理关闭时,闪烁问题
206
-        setTimeout(() => {
207
-            this.stores.restForm({})
208
-        }, 100)
209
-    }
210
-
211
-    handleOk(type) {
212
-        const { validateFieldsAndScroll } = this.props.form
213
-        const { formData } = toJS(this.stores.state);
214
-        if (type == 1) {
215
-            validateFieldsAndScroll((err, valus) => {
216
-                if (isEmpty(err)) {
217
-                    // let tableNamesList = [];
218
-                    // get(valus, "tableNames", []).map(items => {
219
-                    //     const actives_s = utils.findNodeTree(this.state.treeDatas, items, "value", "children");
220
-                    //     if (actives_s) {
221
-                    //         valus.dataSourceId = actives_s.dsId
222
-                    //         valus.dataBaseName = actives_s.name
223
-                    //         tableNamesList.push(actives_s)
224
-                    //     }
225
-                    // })
226
-                    valus.dataSourceId = get(this.props.activeData,"dataSourceId","");
227
-                    valus.dataBaseName = get(this.props.activeData,"dataBaseName","");
228
-                    valus.tableNames = valus.tableNames.join(',');
229
-                    valus.hasDownload = valus.bizTableConfigName.indexOf('hasDownload') > -1 ? true : false;
230
-                    valus.hasModify = valus.bizTableConfigName.indexOf('hasModify') > -1 ? true : false;
231
-                    valus.hasSelect = valus.bizTableConfigName.indexOf('hasSelect') > -1 ? true : false;
232
-                    delete valus.bizTableConfigName;
233
-                    // this.stores.addDs({...this.props.activeData,...valus}, () => {
234
-                    this.stores.addDs(valus, () => {
235
-                        this.props.form.resetFields()
236
-                        // 延期清除表单数据,处理关闭时,闪烁问题
237
-                        setTimeout(() => {
238
-                            this.stores.restForm({})
239
-                            this.setState({ visible: false })
240
-                            this.props.reloadData()
241
-                        }, 100)
242
-                    })
243
-                }
244
-            })
245
-        } else {
246
-
247
-        }
248
-    }
249
-
250
-    renderModalFooter(type) {
251
-        const { loading, formData } = this.stores.state
252
-        const isDetails = this.props.isDetails;
253
-
254
-        return (
255
-            <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
256
-                <div>
257
-                    <Button key="back" style={{ display: 'inline' }} onClick={() => this.handleCancel(type)}>
258
-                        关闭
259
-                    </Button>
260
-                    {
261
-                        !isDetails ? <Button
262
-                            key="submit"
263
-                            type="primary"
264
-                            style={{ display: 'inline', marginLeft: '10px' }}
265
-                            loading={loading}
266
-                            onClick={() => this.handleOk(type)}
267
-                        >
268
-                            确定
269
-                        </Button>
270
-                            : null
271
-                    }
272
-
273
-                </div>
274
-            </div>
275
-        )
276
-    }
277
-    render() {
278
-        const { version } = this.stores.state;
279
-        const { visible } = this.state;
280
-        const { isDetails, hideAuchStatus = false } = this.props;
281
-        const { formData } = toJS(this.stores.state);
282
-        return (
283
-            <div className={styles.sys_account2} style={{ padding: '12px 16px 16px 16px' }}>
284
-                <Modal
285
-                    destroyOnClose
286
-                    width="900px"
287
-                    title={isDetails ? '权限详情' : '权限申请'}
288
-                    className={styles.DataSourceAddModal}
289
-                    visible={visible}
290
-                    onCancel={() => {
291
-                        this.setState({ visible: false })
292
-                        this.props.form.resetFields()
293
-                        // 延期清除表单数据,处理关闭时,闪烁问题
294
-                        setTimeout(() => {
295
-                            this.stores.restForm({})
296
-                        }, 100)
297
-                    }}
298
-                    footer={this.renderModalFooter(1)}
299
-                >
300
-                    {
301
-                        isDetails && !hideAuchStatus ? <p class={'authP'} style={{ border: '2px solid #cd0e0e' }}><span style={{ color: '#cd0e0e' }}>{(formData.auditStatus === null || formData.auditStatus === 0) ? '审批中' : (formData.auditStatus == 1 ? '审批通过' : '已驳回')}</span></p> : null
302
-                    }
303
-                    {this.renderForm()}
304
-                </Modal>
305
-            </div>
306
-        )
307
-    }
308
-}
309
-export default Form.create()(ApplyModalView)
310
-    // export default ApplyModalView;

+ 0 - 126
src/pages/dataApply/dataApplyLess.less

@@ -1,126 +0,0 @@
1
-
2
-.sys_account {
3
-  min-width: 1000px; //设置内容区域最小宽度为1000px,防止表格不断被挤压重叠
4
-
5
-  :global {
6
-    .authP{
7
-      font-size: 19px;
8
-      text-align: right;
9
-      border: 2px solid;
10
-      display: inline-block;
11
-      padding: 5px 30px;
12
-      margin-left: 80%;
13
-      font-weight: 700;
14
-    }
15
-    .timeSetting {
16
-      .ant-time-picker {
17
-        width: 110px;
18
-        margin: 0px 4px;
19
-      }
20
-
21
-      .saveBtn {
22
-        cursor: pointer;
23
-        padding-right: 4px;
24
-      }
25
-
26
-      .closeBtn {
27
-        cursor: pointer;
28
-      }
29
-
30
-      .editBtn {
31
-        cursor: pointer;
32
-      }
33
-    }
34
-
35
-    //此处主要是使表格内滚动能根据屏幕高度自适应
36
-    .ant-table-fixed-header>.ant-table-container>.ant-table-body {
37
-      max-height: calc(100vh - 330px) !important
38
-    }
39
-
40
-    //处理Badge,与按钮,不对齐
41
-    .ant-table-tbody .yx_table_row_tr td .table_cell_box .ant-typography {
42
-      line-height: 20px;
43
-      height: 20px;
44
-    }
45
-  }
46
-}
47
-.authP{
48
-  font-size: 19px;
49
-    text-align: right;
50
-    border: 2px solid;
51
-    display: inline-block;
52
-    padding: 5px 30px;
53
-    font-weight: 700;
54
-    position: absolute;
55
-    right: 80px;
56
-    top: 76px;
57
-    z-index: 999;
58
-    transform: rotate(13deg);
59
-}
60
-
61
-.sys_account {
62
-  :global {
63
-    background-color: #fff;
64
-    padding: 12px 16px 16px 16px;
65
-    .module_search,
66
-    .module_line {
67
-      border-bottom: 8px solid #f5f5f5;
68
-      padding-bottom: 20px;
69
-    }
70
-    
71
-    .cursor {
72
-      cursor: pointer;
73
-    }
74
-
75
-    .col_blue {
76
-      color: #009F95;
77
-    }
78
-
79
-    .flex {
80
-      display: flex;
81
-    }
82
-
83
-    .module_body {
84
-      .list_top {
85
-        display: flex;
86
-        justify-content: space-between;
87
-
88
-        .module_button_area {
89
-          button {
90
-            float: right;
91
-            margin-left: 10px;
92
-          }
93
-        }
94
-      }
95
-    }
96
-
97
-    .ckxq_but {
98
-      cursor: pointer;
99
-      color: skyblue;
100
-    }
101
-
102
-  }
103
-}
104
-
105
-.DataSourceAddModal {
106
-  :global {
107
-    .ant-form-item-children>div {
108
-      display: inline-block !important;
109
-    }
110
-
111
-    .ant-form-explain {
112
-      font-weight: 400;
113
-      font-size: 12px;
114
-      line-height: normal;
115
-      color: #e54747;
116
-      padding-top: 4px;
117
-    }
118
-
119
-    .has-error .ant-input,
120
-    .has-error .ant-select-selector {
121
-      color: rgba(0, 0, 0, 0.6);
122
-      background-color: #fff;
123
-      border: 1px #e54747 solid;
124
-    }
125
-  }
126
-}

+ 0 - 466
src/pages/dataApply/dataApplyMod.js

@@ -1,466 +0,0 @@
1
-// 状态管理方法
2
-import { observable, action, configure, runInAction, autorun, toJS, computed, makeObservable } from 'mobx'
3
-// 工具方法
4
-import { isEqual, cloneDeep, trim, get } from 'lodash'
5
-// 引入Serv
6
-import Serv from './dataApplyServ'
7
-import { message } from 'antd'
8
-
9
-
10
-// 严格模式
11
-configure({
12
-  enforceActions: 'observed'
13
-});
14
-
15
-const defaultForm = {
16
-  id: '',
17
-  dataSourceName: '',
18
-  dataSourceType: undefined,
19
-  remarks: '',
20
-  jdbcUrl: '',
21
-  userName: '',
22
-  passWord: '',
23
-  originPassword: '',
24
-  connectionStatus: '',
25
-  defaultDb: '',
26
-  kerberos: false,
27
-  kerberosConfig: '',
28
-  kerberosConfigFileName: '',
29
-  kerberosKey: '',
30
-  kerberosKeyFileName: '',
31
-  kerberosPrincipal: '',
32
-  kerberosService: '',
33
-  defaultFs: '',
34
-  configuration: ''
35
-}
36
-
37
-/**
38
- * mod层 - 业务逻辑,数据逻辑应该存储于此
39
- */
40
-class DataApplyMod {
41
-  constructor() {
42
-    makeObservable(this);
43
-  }
44
-
45
-  // 监视状态
46
-  @observable state = {
47
-    visible: false,
48
-    createType: 'add', //创建类型,add:新增,edit:修改
49
-    formData: cloneDeep(defaultForm),
50
-    version: '',
51
-    loading: false,
52
-    selectedTabIndex: "1",
53
-    dbTypeList: [
54
-      {
55
-        value: 'HIVE', babel: 'HIVE'
56
-      },
57
-      {
58
-        value: 'IMPALA', babel: 'IMPALA'
59
-      },
60
-      // {
61
-      //   value:"MYSQL",babel:'MYSQL' //mock
62
-      // }
63
-    ],
64
-    confList: [], //配置文件列表
65
-    keytabList: [], //证书文件列表
66
-    tableArr: [],
67
-    tableArr2: [],
68
-    allDsAndDbs: []
69
-  }
70
-
71
-  /*
72
-   * 如果设定了useStrict严格模式,那么所有observable的值的修改必须在action定义的方法内,否则可以直接修改
73
-   * 设置内容可视性
74
-   */
75
-  @action updateState = async (payload) => {
76
-    // 设置到状态机 - 如果是异步,必须在runInAction
77
-    runInAction(() => {
78
-      this.state = {
79
-        ...this.state,
80
-        ...payload,
81
-        formData: {
82
-          ...this.state.formData,
83
-          ...payload.formData
84
-        }
85
-      }
86
-    })
87
-    /*
88
-     * Mod中跳转使用  window.app.router.push(url);
89
-     * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
90
-     */
91
-    autorun(() => {
92
-      // console.info("visible: ", this.state.visible);
93
-    })
94
-  }
95
-  // 重置from表单
96
-  @action restForm = async (payload) => {
97
-    this.state.formData = cloneDeep(defaultForm)
98
-    /*
99
-     * Mod中跳转使用  window.app.router.push(url);
100
-     * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
101
-     */
102
-    autorun(() => {
103
-      // console.info("visible: ", this.state.visible);
104
-    })
105
-  }
106
-  // 创建数据源
107
-  @action addDs = async (payload, _callbck) => {
108
-    // 请求参数
109
-    const params = payload
110
-    try {
111
-      // 异步请求方法
112
-      this.updateState({ loading: true })
113
-      const { resultCode, resultMsg, data } = await Serv.addDs(params)
114
-      this.updateState({ loading: false })
115
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
116
-      if (resultMsg == 'success') {
117
-        this.updateState({ version: +new Date(), visible: false })
118
-        message.success('保存成功!')
119
-        if (_callbck) {
120
-          _callbck()
121
-        }
122
-      } else {
123
-        message.warn(resultMsg)
124
-      }
125
-    } catch (error) {
126
-      this.updateState({ loading: false })
127
-      //message.error({ content: '发生异常,保存失败!' })
128
-    }
129
-  }
130
-
131
-  /**
132
-   * 记录下载操作的日志
133
-   */
134
-  @action recordLogOfDownload = async (params, callback) => {
135
-    try {
136
-      const res = await Serv.recordLogOfDownload(params);
137
-      const { resultCode, resultMsg, data } = res;
138
-      // 设置的下载文件文件名
139
-      const fileName = decodeURI(res.headers['content-disposition'].split(";")[1].split("filename=")[1]);
140
-      callback && callback(data, fileName)
141
-      // 设置到状态机 - 如果是异步,必须在runInAction
142
-      if (resultMsg === 'success') {
143
-      } else {
144
-        // message.error('请求异常!')
145
-      }
146
-    } catch (error) {
147
-      // message.error('请求异常!')
148
-    }
149
-  }
150
-
151
-
152
-  // 获取数据源类型
153
-  @action queryDbType = async (payload) => {
154
-    // 请求参数
155
-    const params = payload
156
-    try {
157
-      // 异步请求方法
158
-      const { resultCode, resultMsg, data } = await Serv.queryDbType(params)
159
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
160
-      if (resultMsg == 'success') {
161
-        const dbTypeList = get(data, 'list', [])
162
-        this.updateState({
163
-          dbTypeList: dbTypeList
164
-        })
165
-      }
166
-    } catch (error) { }
167
-  }
168
-
169
-
170
-  /**
171
- * 查询当前用户所拥有的数据源-数据库列表
172
- */
173
-  @action getAllDsAndDbsAndTables = async (params) => {
174
-    // 请求参数
175
-    this.updateState({ tableFieldsLoading: true })
176
-    try {
177
-      // 异步请求方法
178
-      const { resultCode, resultMsg, data } = await Serv.getAllDsAndDbsAndTables(params)
179
-      // const { resultCode, resultMsg, data } = arr //mock
180
-      return new Promise((resolve, reject) => {
181
-        const allDsAndDbs = data || []
182
-        // 设置到状态机 - 如果是异步,必须在runInAction
183
-        runInAction(() => {
184
-          this.state.allDsAndDbs = allDsAndDbs
185
-          resolve(allDsAndDbs)
186
-        })
187
-      })
188
-    } catch (error) {
189
-      console.error(error)
190
-    } finally {
191
-      this.updateState({ tableFieldsLoading: false })
192
-    }
193
-  }
194
-  /**
195
- * 查询当前用户所拥有的数据源-数据库列表
196
- */
197
-  @action listDbTables = async (params) => {
198
-    // 请求参数
199
-    this.updateState({ tableFieldsLoading: true })
200
-    try {
201
-      // 异步请求方法
202
-      const { resultCode, resultMsg, data } = await Serv.listDbTables(params)
203
-      // const { resultCode, resultMsg, data } = arr //mock
204
-      return new Promise((resolve, reject) => {
205
-        resolve(data && data[0] ? data[0] : [])
206
-        // runInAction(() => {
207
-        //   // this.state.allDsAndDbs = allDsAndDbs
208
-        // })
209
-      })
210
-    } catch (error) {
211
-      console.error(error)
212
-    } finally {
213
-      this.updateState({ tableFieldsLoading: false })
214
-    }
215
-  }
216
-
217
-
218
-  // 分页查询数据源信息
219
-  @action pageQueryDsInfoMod = async (payload, callback) => {
220
-    // 请求参数
221
-    const params = payload
222
-    try {
223
-      // 异步请求方法
224
-      const { resultCode, resultMsg, data } = await Serv.pageQueryDsTblInfo(params)
225
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
226
-      if (resultCode == '0') {
227
-        const tableArr = data ? data.records : []
228
-        this.updateState({
229
-          tableArr: tableArr
230
-        })
231
-        callback && callback(data.total)
232
-      }
233
-    } catch (error) { }
234
-  }
235
-  // 分页查询数据源信息2
236
-  @action pageQueryDsInfoMod2 = async (payload, callback) => {
237
-    // 请求参数
238
-    const params = payload
239
-    try {
240
-      // 异步请求方法
241
-      const { resultCode, resultMsg, data } = await Serv.pageQueryDsInfo2(params)
242
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
243
-      if (resultCode == '0') {
244
-        const tableArr2 = data ? data.records.map(x => {
245
-          let str = (x.hasSelect ? '表查询、' : '') + (x.hasDownload ? '下载、' : '') + (x.hasModify ? '增删改、' : '')
246
-          return {
247
-            ...x,
248
-            ...{
249
-              key: Math.random(),
250
-              testArr: get(x, 'tableNames', '').split(','),
251
-              bizTableKey: str.substring(0, str.length - 1)
252
-              // description : x.bizTableCreateSql,
253
-            }
254
-          }
255
-        }) : [];
256
-        console.log(tableArr2, "tableArr2")
257
-        this.updateState({
258
-          tableArr2: tableArr2
259
-        })
260
-        callback && callback(data.total)
261
-      }
262
-    } catch (error) { }
263
-  }
264
-
265
-  // 根据id查询数据源业务申请权限信息
266
-  @action selectById = async (payload, callback) => {
267
-    const params = payload
268
-
269
-    try {
270
-      if (params.type == 2) {
271
-        payload.datas.bizTableConfigName = [];
272
-        if (payload.datas.hasDownload) { payload.datas.bizTableConfigName.push('hasDownload') }
273
-        if (payload.datas.hasModify) { payload.datas.bizTableConfigName.push('hasModify') }
274
-        if (payload.datas.hasSelect) { payload.datas.bizTableConfigName.push('hasSelect') }
275
-        payload.datas.tableNames = payload.datas.tableName.split(',');
276
-        this.updateState({ formData: payload.datas });
277
-        callback && callback(payload.datas.tableNames)
278
-      } else {
279
-        const { resultCode, resultMsg, data } = await Serv.selectById(params.id)
280
-        if (resultCode == '0') {
281
-          data.bizTableConfigName = [];
282
-          if (data.hasDownload) { data.bizTableConfigName.push('hasDownload') }
283
-          if (data.hasModify) { data.bizTableConfigName.push('hasModify') }
284
-          if (data.hasSelect) { data.bizTableConfigName.push('hasSelect') }
285
-          data.tableNames = data.tableNames.split(',');
286
-          this.updateState({ formData: data });
287
-
288
-          callback && callback(data.tableNames)
289
-        }
290
-      }
291
-    } catch (error) { }
292
-  }
293
-
294
-
295
-
296
-  // 修改数据源
297
-  @action updateDs = async (payload, _callbck) => {
298
-    // 请求参数
299
-    const params = payload
300
-    try {
301
-      // 异步请求方法
302
-      this.updateState({ loading: true })
303
-      const { resultCode, resultMsg, data } = await Serv.updateDs(params)
304
-      this.updateState({ loading: false })
305
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
306
-      if (resultMsg == 'success') {
307
-        this.updateState({ version: +new Date(), visible: false })
308
-        message.success('保存成功!')
309
-        if (_callbck) {
310
-          _callbck()
311
-        }
312
-      } else {
313
-        message.warn(resultMsg)
314
-      }
315
-    } catch (error) {
316
-      this.updateState({ loading: false })
317
-      //message.error({ content: '发生异常,保存失败!' })
318
-    }
319
-  }
320
-  // 删除数据源记录
321
-  @action deleteDs = async (payload, callback) => {
322
-    // 请求参数
323
-    const params = payload
324
-    message.destroy()
325
-    const loaddingDialog = message.loading('删除中,请稍等...', 0)
326
-    try {
327
-      // 异步请求方法
328
-      const { resultCode, resultMsg, data } = await Serv.deleteDs(params)
329
-      setTimeout(loaddingDialog, 0)
330
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
331
-      if (resultMsg == 'success') {
332
-        message.success('删除成功!')
333
-        callback && callback()
334
-      } else {
335
-        message.warn(resultMsg || '删除失败!')
336
-      }
337
-    } catch (error) {
338
-      setTimeout(loaddingDialog, 0)
339
-      //message.error({ content: '发生异常,删除失败!', key: 'deleteDs' })
340
-    }
341
-  }
342
-
343
-  // 测试数据源连通性
344
-  @action testDs = async (payload, _callbck) => {
345
-    // 请求参数
346
-    const params = payload
347
-    message.destroy()
348
-    const loaddingDialog = message.loading('测试中,请稍等...', 0)
349
-    try {
350
-      // 异步请求方法
351
-      const { resultCode, resultMsg, data } = await Serv.testDs(params)
352
-      setTimeout(loaddingDialog, 0)
353
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
354
-      if (resultMsg == 'success') {
355
-        message.success('测试成功!')
356
-        if (_callbck) {
357
-          _callbck(resultCode)
358
-        }
359
-      } else {
360
-        if (_callbck) {
361
-          _callbck()
362
-        }
363
-        message.warn('链接失败!')
364
-      }
365
-    } catch (error) {
366
-      setTimeout(loaddingDialog, 0)
367
-      if (_callbck) {
368
-        _callbck()
369
-      }
370
-      //message.error({ content: '发生异常,操作失败!', key: 'testDs' })
371
-    }
372
-  }
373
-  // 潍柴项目设置调度时间
374
-  @action setDataSourceTask = async (payload, _callbck) => {
375
-    // 请求参数
376
-    const params = payload
377
-    try {
378
-      message.loading({ content: '设置中,请稍等...', key: 'setDataSourceTask' })
379
-      // 异步请求方法
380
-      const { resultCode, resultMsg, data } = await Serv.setDataSourceTask(params)
381
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
382
-      if (resultMsg == 'success') {
383
-        this.updateState({ version: +new Date() })
384
-        message.success({ content: '设置成功!', key: 'setDataSourceTask' })
385
-        if (_callbck) {
386
-          _callbck(resultMsg)
387
-        }
388
-      } else {
389
-        if (_callbck) {
390
-          _callbck()
391
-        }
392
-        message.warn({ content: '设置失败!', key: 'setDataSourceTask' })
393
-      }
394
-    } catch (error) {
395
-      if (_callbck) {
396
-        _callbck()
397
-      }
398
-      //message.error({ content: '发生异常,操作失败!', key: 'setDataSourceTask' })
399
-    }
400
-  }
401
-  // 潍柴手动同步数据源信息
402
-  @action manualSyncDataSourceMeta = async (payload, _callbck) => {
403
-    // 请求参数
404
-    const params = payload
405
-    try {
406
-      //message.loading({ content: '设置中,请稍等...', key: 'manualSyncDataSourceMeta' })
407
-      const loaddingDialog = message.loading('设置中,请稍等...', 5)
408
-      // 异步请求方法
409
-      const { resultCode, resultMsg, data } = await Serv.manualSyncDataSourceMeta(params)
410
-      setTimeout(loaddingDialog, 0)
411
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
412
-      if (resultMsg == 'success') {
413
-        /*
414
-         * 设置成功,不需要进行提示
415
-         * message.success({ content: '设置成功!', key: 'manualSyncDataSourceMeta' })
416
-         */
417
-        if (_callbck) {
418
-          _callbck(resultMsg)
419
-        }
420
-      } else {
421
-        if (_callbck) {
422
-          _callbck()
423
-        }
424
-        message.warn({ content: '设置失败!', key: 'manualSyncDataSourceMeta' })
425
-      }
426
-    } catch (error) {
427
-      if (_callbck) {
428
-        _callbck()
429
-      }
430
-      //message.error({ content: '发生异常,操作失败!', key: 'manualSyncDataSourceMeta' })
431
-    }
432
-  }
433
-  // 潍柴获取数据源同步状态
434
-  @action queryDsSyncStatus = async (payload, _callbck) => {
435
-    // 请求参数
436
-    const params = payload
437
-    try {
438
-      // 异步请求方法
439
-      const { resultCode, resultMsg, data } = await Serv.queryDsSyncStatus(params)
440
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
441
-      if (resultMsg == 'success') {
442
-        if (data && data.latestSyncStatus == 'success') {
443
-          message.success({ content: '数据同步成功!' })
444
-        } else if (data && data.latestSyncStatus == 'fail') {
445
-          message.success({ content: '数据同步失败!' })
446
-        }
447
-        if (_callbck) {
448
-          _callbck(resultMsg, data)
449
-        }
450
-      } else {
451
-        if (_callbck) {
452
-          _callbck()
453
-        }
454
-      }
455
-    } catch (error) {
456
-      if (_callbck) {
457
-        _callbck()
458
-      }
459
-      //message.error({ content: '发生异常,操作失败!', key: 'manualSyncDataSourceMeta' })
460
-    }
461
-  }
462
-}
463
-
464
-// 将组件实例化,这意味着组件将不能从别处实例化
465
-const dataApplyMod = new DataApplyMod()
466
-export default dataApplyMod

+ 0 - 169
src/pages/dataApply/dataApplyServ.js

@@ -1,169 +0,0 @@
1
-import request from '@utils/request'
2
-
3
-export default class {
4
-  //创建数据源
5
-  static addDs(params) {
6
-    return request({
7
-      url: 'api/os/datasource/table/apply/info/insertOsDatasourceTableApplyInfoEntity',
8
-      method: 'POST',
9
-      data: params,
10
-      headers: {
11
-        'Content-type': 'application/json'
12
-      },
13
-      // 对应后端的应用工程名
14
-      app: 'ide-op-mgmt-application'
15
-      //isLocMock: true
16
-    })
17
-  }
18
-
19
-  /**
20
- * 记录下载操作的日志
21
- */
22
-  static recordLogOfDownload(params) {
23
-    return request({
24
-      url: `api/biz/table/config/downloadTempFile/${params}`,
25
-      method: 'POST',
26
-      responseType: 'arraybuffer',
27
-      // data: params,
28
-      headers: {
29
-        'Content-type': 'application/json'
30
-      },
31
-      // 对应后端的应用工程名
32
-      app: 'ide-op-mgmt-application'
33
-    })
34
-  }
35
-
36
-  //更新数据源
37
-  static updateDs(params) {
38
-    return request({
39
-      url: 'api/biz/table/config/updateBizTableConfigEntity',
40
-      method: 'POST',
41
-      data: params,
42
-      headers: {
43
-        'Content-type': 'application/json'
44
-      },
45
-      // 对应后端的应用工程名
46
-      app: 'ide-op-mgmt-application'
47
-      //isLocMock: true
48
-    })
49
-  }
50
-  // 删除数据源
51
-  static deleteDs(params) {
52
-    return request({
53
-      url: 'api/os/datasource/info/deleteById/' + params.id,
54
-      method: 'DELETE',
55
-      //data: params,
56
-      app: 'ide-op-mgmt-application'
57
-      //isLocMock: true
58
-    })
59
-  }
60
-  // 测试数据源连通性
61
-  static testDs(params) {
62
-    return request({
63
-      url: 'api/os/datasource/info/testConnect',
64
-      method: 'POST',
65
-      data: params,
66
-      headers: {
67
-        'Content-type': 'application/json'
68
-      },
69
-      // 对应后端的应用工程名
70
-      app: 'ide-op-mgmt-application'
71
-      //isLocMock: true
72
-    })
73
-  }
74
-  // 查询数据源类型
75
-  static queryDbType(params) {
76
-    return request({
77
-      url: 'dataSource/queryDbType',
78
-      method: 'GET',
79
-      data: params,
80
-      // 对应后端的应用工程名
81
-      app: 'ide-op-mgmt-application'
82
-      //isLocMock: true
83
-    })
84
-  }
85
-
86
-    /**
87
-   * 查询用户拥有的所有数据源、数据库、数据表的所有信息
88
-   */
89
-     static getAllDsAndDbsAndTables(params) {
90
-      return request({
91
-        url: 'api/os/datasource/sqlData/listDsAndDbTables',
92
-        method: 'post',
93
-        data:params,
94
-        // 对应后端的应用工程名
95
-        app: 'ide-op-mgmt-application'
96
-      })
97
-    }
98
-  
99
-    /**
100
-   * 查询用户拥有的所有数据源、数据库、数据表的所有信息 - 新
101
-   */
102
-     static listDbTables(params) {
103
-      return request({
104
-        url: 'api/os/datasource/auth/listDbTables',
105
-        method: 'post',
106
-        data:params,
107
-        // 对应后端的应用工程名
108
-        app: 'ide-op-mgmt-application'
109
-      })
110
-    }
111
-  
112
-    
113
-  // 分页查询用户申请授权表信息
114
-  static pageQueryDsTblInfo(params) {
115
-    return request({
116
-      url: `api/os/datasource/auth/pageQueryDsTblInfo`,
117
-      method: 'post',
118
-      data: params,
119
-    })
120
-  }
121
-
122
-  // 根据id查询数据源业务申请权限信息
123
-  static selectById(params) {
124
-    return request({
125
-      url: `api/os/datasource/table/apply/info/selectById/${params}`,
126
-      method: 'get',
127
-      // data: params,
128
-    })
129
-  }
130
-
131
-  // 查询数据源类型
132
-  static pageQueryDsInfo2(params) {
133
-    return request({
134
-      url: `api/os/datasource/table/apply/info/pageQueryApplyListInfo`,
135
-      method: 'post',
136
-      data: params,
137
-    })
138
-  }
139
-
140
-  //潍柴项目,设置调度任务
141
-  static setDataSourceTask(params) {
142
-    return request({
143
-      url: 'api/os/datasource/info/setDataSourceTask',
144
-      method: 'POST',
145
-      data: params,
146
-      headers: {
147
-        'Content-type': 'application/json'
148
-      }
149
-    })
150
-  }
151
-
152
-  //潍柴项目,手动同步数据源
153
-  static manualSyncDataSourceMeta(params) {
154
-    return request({
155
-      url: 'api/os/datasource/info/manualSyncDataSourceMeta?dsId=' + params.dsId,
156
-      method: 'GET',
157
-      headers: {
158
-        'Content-type': 'application/json'
159
-      }
160
-    })
161
-  }
162
-  //潍柴项目,获取数据源同步状态
163
-  static queryDsSyncStatus(params) {
164
-    return request({
165
-      url: `api/os/datasource/info/queryDetail/${params}`,
166
-      method: 'GET',
167
-    })
168
-  }
169
-}

+ 0 - 666
src/pages/dataApply/dataApplyView.jsx

@@ -1,666 +0,0 @@
1
-/*
2
-    权限申请
3
- * @Author: dayan_hjm 
4
- * @Date: 2023-02-03 17:09:46 
5
- * @Last Modified by: dayan_hjm
6
- * @Last Modified time: 2023-02-24 14:18:37
7
- */
8
-
9
-import React, { Component } from "react";
10
-import { useHistory, useLocation, withRouter } from "react-router-dom";
11
-import { Table, Button, Typography, Input, Select, message, Tooltip, InputNumber, Checkbox, Tabs, Row, Col } from 'antd';
12
-const { TabPane } = Tabs;
13
-
14
-import { Form } from '@ant-design/compatible';
15
-import { QuestionCircleOutlined, UploadOutlined, EditOutlined, CloseOutlined, DeleteOutlined } from '@ant-design/icons';
16
-import '@ant-design/compatible/assets/index.css';
17
-import { observer } from 'mobx-react'
18
-import { isEmpty, uniqueId, get } from 'lodash'
19
-import { Encrypt, Decrypt } from "@utils/util"
20
-import moment from 'moment'
21
-const FormItem = Form.Item;
22
-import ApplyModal from './applyModal'
23
-import ApplyModal2 from './applyModal'
24
-
25
-// 多类名样式管理工具
26
-import { toJS } from 'mobx'
27
-import dataApplyMod from './dataApplyMod';
28
-// 引入当前页样式 - 模块化
29
-import styles from './dataApplyless.less'
30
-
31
-@withRouter
32
-class DataApplyView extends Component {
33
-    // 构造函数,组件的实例创建时,最先执行
34
-    constructor(props, context) {
35
-        super(props, context)
36
-        // 注入的DataApplyMod
37
-        this.stores = dataApplyMod;
38
-        this.state = {
39
-            activeData: 0,
40
-            uploadInfo: {
41
-                file: {
42
-                    status: 0,
43
-                    response: {
44
-                        resultCode: 0,
45
-                        resultMsg: ''
46
-                    },
47
-                    name: ''
48
-                },
49
-            },
50
-            total_: {
51
-                total: 0,
52
-                pageNum: 1,
53
-                pageSize: 10,
54
-            },
55
-            fruitsuploadList: [],
56
-            uploadList: [],
57
-            bizTableConfigId: 0,
58
-            total: 0,
59
-            total2: 0,
60
-            editRecordId: '', //数据编辑行的id
61
-            setTimeValue: '', //设置的时间x
62
-            searchParam: {
63
-                tableName: '',
64
-                dbsName: '',
65
-                dataBaseName: '',
66
-                pageNum: 1,
67
-                pageSize: 10,
68
-            },
69
-            searchParam2: {
70
-                pageNum: 1,
71
-                pageSize: 10,
72
-            },
73
-            visible: false,
74
-            resetRoom: [
75
-                'bizTableName',
76
-                'bizTableJdbcDs',
77
-                'dbsName',
78
-                'bizTableConfigName',
79
-                'bizTableJdbcUrl',
80
-                'bizTableJdbcUsername',
81
-                'bizTableCreateSql',
82
-                'bizTableJdbcPassword',
83
-            ],
84
-        }
85
-    }
86
-
87
-    componentDidMount() {
88
-        this.loadRoles()
89
-
90
-    }
91
-
92
-    loadRoles(attrs = []) {
93
-        const { searchParam, searchParam2 } = this.state;
94
-        if (this.stores.state.selectedTabIndex == 1) {
95
-            this.stores.pageQueryDsInfoMod({ ...searchParam, ...attrs }, (res = 0) => {
96
-                this.setState({ total: res })
97
-            })
98
-        } else {
99
-            const name = localStorage.getItem("account");
100
-            this.stores.pageQueryDsInfoMod2({
101
-                ...searchParam2, ...{
102
-                    account: name
103
-                }
104
-            }, (res = 0) => {
105
-                this.setState({ total2: res })
106
-            })
107
-        }
108
-    };
109
-
110
-    inputChange(key, value) {
111
-        const { resetFields } = this.props.form
112
-        if (key === 'dbType' || key === 'MYSQL') {
113
-            this.stores.updateState({
114
-                formData: {
115
-                    bizTableConfigName: '',
116
-                    remarks: '',
117
-                    jdbcUrl: '',
118
-                    jdbcUserName: '',
119
-                    bizTableJdbcPassword: '',
120
-                    connectionStatus: '',
121
-                    defaultDb: '',
122
-                    kerberos: false,
123
-                    kerberosConfig: '',
124
-                    kerberosConfigFileName: '',
125
-                    kerberosKey: '',
126
-                    kerberosKeyFileName: '',
127
-                    kerberos: '',
128
-                    kerberosService: '',
129
-                    defaultFs: '',
130
-                    configuration: '',
131
-                    [key]: value,
132
-                    originPassword: ''
133
-                },
134
-                confList: [],
135
-                keytabList: []
136
-            })
137
-            resetFields(this.state.resetRoom)
138
-        } else if (key === 'jdbcUrl' || key === 'jdbcUserName' || key === 'bizTableJdbcPassword' || key === 'defaultDb') {
139
-            this.stores.updateState({
140
-                formData: {
141
-                    connectionStatus: '',
142
-                    [key]: value
143
-                }
144
-            })
145
-        } else if (key === 'kerberos') {
146
-            this.stores.updateState({
147
-                formData: {
148
-                    kerberosConfig: '',
149
-                    kerberosConfigFileName: '',
150
-                    kerberosKey: '',
151
-                    kerberosKeyFileName: '',
152
-                    kerberos: '',
153
-                    kerberosService: '',
154
-                    //jdbcUrl: '',
155
-                    jdbcUserName: '',
156
-                    bizTableJdbcPassword: '',
157
-                    [key]: value
158
-                },
159
-                confList: [],
160
-                keytabList: []
161
-            })
162
-            resetFields([
163
-                'kerberosConfig',
164
-                'kerberosKey',
165
-                'kerberos',
166
-                'kerberosService',
167
-                //'jdbcUrl',
168
-                'jdbcUserName',
169
-                'bizTableJdbcPassword'
170
-            ])
171
-        } else {
172
-            this.stores.updateState({
173
-                formData: {
174
-                    [key]: value
175
-                }
176
-            })
177
-        }
178
-    }
179
-
180
-    // 判断是否清空数据源密码
181
-    getValueFromEvent(e) {
182
-        let newValue = e.target.value
183
-        let {
184
-            formData: { originPassword }
185
-        } = toJS(this.stores.state)
186
-        // if (originPassword != '') {
187
-        //     newValue = ''
188
-        //     originPassword = ''
189
-        //     const { setFieldsValue } = this.props.form
190
-        //     setFieldsValue({ bizTableJdbcPassword: '' })
191
-        // }
192
-        this.stores.updateState({
193
-            formData: {
194
-                connectionStatus: '',
195
-                bizTableJdbcPassword: newValue,
196
-                originPassword: originPassword
197
-            }
198
-        })
199
-        return newValue
200
-    }
201
-
202
-    // 渲染新增修改表单
203
-    renderForm() {
204
-        const { getFieldDecorator } = this.props.form
205
-        const { formData = {} } = toJS(this.stores.state)
206
-
207
-        return (
208
-            <Form layout="horizontal" labelCol={{ span: 5 }} wrapperCol={{ span: 19 }} form={this.props.form}>
209
-                <FormItem label="权限类型">
210
-                    {getFieldDecorator('bizTableConfigName', {
211
-                        rules: [
212
-                            { required: false, message: '请选择权限类型' },
213
-                        ],
214
-                        initialValue: formData.bizTableConfigName
215
-                    })(
216
-                        <Checkbox>表查询limit</Checkbox>
217
-                    )}
218
-                    <InputNumber min={0} max={200} defaultValue={3} placeholder={'请填写0-200的正整数'} onChange={(val) => {
219
-                        this.setState({ limitNum1: val })
220
-                    }} />
221
-                    <span className="login-form-forgot" href="" style={{ marginLeft: '10px', color: '#b8b8b8', 'font-size': '12px' }}>
222
-                        注:默认返回200行
223
-                    </span>
224
-                </FormItem>
225
-                <FormItem label="权限类型">
226
-                    {getFieldDecorator('bizTableConfigName', {
227
-                        rules: [
228
-                            { required: false, message: '请选择权限类型' },
229
-                        ],
230
-                        initialValue: formData.bizTableConfigName
231
-                    })(
232
-                        <Checkbox>下载limit</Checkbox>
233
-                    )}
234
-                    <InputNumber min={0} max={30000} defaultValue={3} placeholder={'请填写0-30000的正整数'} onChange={(val) => {
235
-                        this.setState({ limitNum2: val })
236
-                    }} />
237
-                    <span className="login-form-forgot" href="" style={{ marginLeft: '10px', color: '#b8b8b8', 'font-size': '12px' }}>
238
-                        注:默认返回30000行
239
-                    </span>
240
-                </FormItem>
241
-            </Form>
242
-        )
243
-    }
244
-
245
-    handleCancel() {
246
-        this.setState({ visible: false })
247
-        this.props.form.resetFields(this.state.resetRoom)
248
-        // 延期清除表单数据,处理关闭时,闪烁问题
249
-        setTimeout(() => {
250
-            this.stores.restForm({})
251
-        }, 100)
252
-    }
253
-
254
-    handleOk(type) {
255
-        const { validateFieldsAndScroll } = this.props.form
256
-        const { formData } = toJS(this.stores.state);
257
-        if (type == 1) {
258
-            validateFieldsAndScroll((err, valus) => {
259
-                if (isEmpty(err)) {
260
-                    //formData.jdbcPassword = Encrypt(formData.jdbcPassword)
261
-                    formData.bizTableJdbcPassword = Encrypt(formData.bizTableJdbcPassword)
262
-                    // Encrypt(formData.bizTableJdbcPassword)
263
-                    if (formData.bizTableConfigId) {
264
-                        this.stores.updateDs(formData, () => {
265
-                            this.loadRoles()
266
-                        })
267
-                    } else {
268
-                        this.stores.addDs(formData, () => {
269
-                            this.loadRoles()
270
-                        })
271
-                    }
272
-                    this.props.form.resetFields()
273
-                    // 延期清除表单数据,处理关闭时,闪烁问题
274
-                    setTimeout(() => {
275
-                        this.stores.restForm({})
276
-                        this.setState({ visible: false })
277
-                    }, 100)
278
-                }
279
-            })
280
-        } else {
281
-
282
-        }
283
-    }
284
-
285
-    handleDownload = (id) => {
286
-        message.info('即将开始下载,请稍候...')
287
-        this.stores
288
-            .recordLogOfDownload(id, ((data, fileName) => {
289
-                var blob = new Blob([data], {
290
-                    type: "application/vnd.ms-excel",
291
-                });
292
-                var downloadElement = document.createElement("a");
293
-                downloadElement.download = fileName;
294
-                downloadElement.href = window.URL.createObjectURL(blob);
295
-                downloadElement.click();
296
-                document.body.appendChild(downloadElement);
297
-                document.body.removeChild(downloadElement);
298
-                window.URL.revokeObjectURL(downloadElement.href);
299
-            }))
300
-            .then((data) => {
301
-            })
302
-            .catch(() => {
303
-            })
304
-    }
305
-
306
-    renderModalFooter(type) {
307
-        const { loading, formData } = this.stores.state
308
-
309
-        return (
310
-            <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
311
-                <div>
312
-                    <Button key="back" style={{ display: 'inline' }} onClick={() => this.handleCancel(type)}>
313
-                        取消
314
-                    </Button>
315
-
316
-                    <Button
317
-                        key="submit"
318
-                        type="primary"
319
-                        style={{ display: 'inline', marginLeft: '10px' }}
320
-                        loading={loading}
321
-                        onClick={() => this.handleOk(type)}
322
-                    >
323
-                        确定
324
-                    </Button>
325
-                </div>
326
-            </div>
327
-        )
328
-    }
329
-
330
-    getParam() {
331
-        const { searchParam, bizTableConfigId, total } = this.state;
332
-        return {
333
-            scroll: { x: 1000 },
334
-            pagination: {
335
-                total,
336
-                pageSize: searchParam.pageSize,
337
-                onChange: (pageNum) => {
338
-                    searchParam.pageNum = pageNum;
339
-                    this.setState(searchParam);
340
-                    this.loadRoles();
341
-                }
342
-            },
343
-            columns: [
344
-                //key=one的表头
345
-                {
346
-                    title: '数据源名称',
347
-                    dataIndex: 'name'
348
-                },
349
-                {
350
-                    title: '数据库名称',
351
-                    dataIndex: 'dataBaseName'
352
-                },
353
-                {
354
-                    title: '数据表名称',
355
-                    dataIndex: 'tableName'
356
-                },
357
-                {
358
-                    title: '数据源类型',
359
-                    dataIndex: 'dbType',
360
-                    emum: {
361
-                        1: 'Mysql',
362
-                        2: 'Sqlserver',
363
-                        3: 'Oracle',
364
-                        4: 'DRDS',
365
-                        5: 'Postgresql',
366
-                        6: 'Prest',
367
-                        7: 'Hive',
368
-                        8: 'Elasticsearch',
369
-                        9: 'MonagDB',
370
-                        10: 'impala'
371
-                    }
372
-                },
373
-                {
374
-                    title: '创建时间',
375
-                    dataIndex: 'createTime'
376
-                },
377
-                {
378
-                    title: '数据权限类型',
379
-                    dataIndex: 'bizTableKey',
380
-                    render: (data, row) => {
381
-                        let str = (row.hasSelect ? '表查询、' : '') + (row.hasDownload ? '下载、' : '') + (row.hasModify ? '增删改、' : '')
382
-                        return <span>{str.substring(0, str.length - 1)}</span>
383
-                    }
384
-                },
385
-                {
386
-                    title: '操作',
387
-                    // fixed: 'right',
388
-                    // width: 250,
389
-                    render: (val, record) => {
390
-                        let data = record;
391
-                        let showBtn = true;
392
-                        if ((data.hasDownload && data.hasDownload !== null) && (data.hasModify && data.hasModify !== null) && (data.hasSelect && data.hasSelect !== null)) {
393
-                            showBtn = false;
394
-                        }
395
-                        return (
396
-                            <span style={{ marginRight: "24px" }}>
397
-                                {
398
-                                    showBtn ? <span>
399
-                                        <a onClick={() => {
400
-                                            this.setState({ activeData: data })
401
-                                            this.ApplyModal.getTree(data.dataBaseName, data.dataSourceId)
402
-                                            setTimeout(() => {
403
-                                                this.ApplyModal.getFormData(data.dataSourceId,2,data)
404
-                                            }, 500)
405
-                                        }}
406
-                                        >权限申请</a>
407
-                                    </span> :
408
-                                        <span>
409
-                                            <span>已有权限</span>
410
-                                        </span>
411
-                                }
412
-                            </span>
413
-                        )
414
-                    }
415
-                }
416
-            ],
417
-            dataSource: toJS(this.stores.state.tableArr)
418
-        }
419
-    }
420
-    getParam2() {
421
-        const { searchParam2, bizTableConfigId, total2 } = this.state;
422
-        return {
423
-            scroll: { x: 1000 },
424
-            pagination: {
425
-                total: total2,
426
-                pageSize: searchParam2.pageSize,
427
-                onChange: (pageNum) => {
428
-                    searchParam2.pageNum = pageNum;
429
-                    this.setState(searchParam2);
430
-                    this.loadRoles();
431
-                }
432
-            },
433
-            columns: [
434
-                //key=one的表头
435
-                {
436
-                    title: '数据源名称',
437
-                    dataIndex: 'dataSourceName',
438
-                    width: 250
439
-                },
440
-                {
441
-                    title: '数据源类型',
442
-                    dataIndex: 'dbType',
443
-                    width: 100,
444
-                    // emum: {
445
-                    //     1: 'Mysql',
446
-                    //     2: 'Sqlserver',
447
-                    //     3: 'Oracle',
448
-                    //     4: 'DRDS',
449
-                    //     5: 'Postgresql',
450
-                    //     6: 'Prest',
451
-                    //     7: 'Hive',
452
-                    //     8: 'Elasticsearch',
453
-                    //     9: 'MonagDB',
454
-                    //     10: 'impala'
455
-                    // }
456
-                },
457
-                {
458
-                    title: '数据权限类型',
459
-                    dataIndex: 'bizTableKey	',
460
-                    width: 200,
461
-                    render: (data, row) => {
462
-                        let str = (row.hasSelect ? '表查询、' : '') + (row.hasDownload ? '下载、' : '') + (row.hasModify ? '增删改、' : '')
463
-                        return <span>{str.substring(0, str.length - 1)}</span>
464
-                    }
465
-                },
466
-                {
467
-                    title: '申请人',
468
-                    dataIndex: 'createPerson',
469
-                },
470
-                {
471
-                    title: '申请时间',
472
-                    dataIndex: 'createTime'
473
-                },
474
-                {
475
-                    title: '申请状态',
476
-                    dataIndex: 'auditStatus',
477
-                    render: (data, row) => {
478
-                        return <span>{data == 1 ? "审批通过" : (data == 2 ? "已驳回" : "审批中")}</span>
479
-                    }
480
-                },
481
-                {
482
-                    title: '操作',
483
-                    // fixed: 'right',
484
-                    // width: 250,
485
-                    render: (val, record) => {
486
-                        let data = record;
487
-                        return (
488
-                            <span style={{ marginRight: "24px" }}>
489
-                                <a
490
-                                    onClick={() => {
491
-                                        this.setState({ activeData: data })
492
-                                        this.ApplyModal2.getTree(data.dataBaseName, data.dataSourceId)
493
-                                        setTimeout(() => {
494
-                                            this.ApplyModal2.getFormData(data.id);
495
-                                            // this.ApplyModal2.setState({ visible: true })
496
-                                        }, 500)
497
-                                    }}
498
-                                >
499
-                                    详情
500
-                                </a>
501
-                            </span>
502
-                        )
503
-                    }
504
-                }
505
-            ],
506
-            expandedRowRender: record => {
507
-                const name_s = get(record, 'tableNames', '').split(',');
508
-                return (
509
-                    <div>
510
-                        {
511
-                            record.testArr.map((xx, i) => {
512
-                                return <p style={{ margin: "0px 0 0 46px" }} key={record.id + '0' + i}>
513
-                                    <span style={{ width: "250px", "display": "inline-block" }} key={record.id + '1' + i}>{name_s[i]}</span>
514
-                                    <span style={{ width: "100px", "display": "inline-block" }} key={record.id + '2' + i}>{record.dbType}</span>
515
-                                    <span style={{ width: "200px", "display": "inline-block" }} key={record.id + '3' + i}>{record.bizTableKey}</span></p>
516
-                            })
517
-                        }
518
-                    </div>
519
-                )
520
-            },
521
-            dataSource: toJS(this.stores.state.tableArr2)
522
-
523
-        }
524
-    }
525
-    render() {
526
-        const { createType, version, selectedTabIndex } = this.stores.state;
527
-        const { searchParam, searchParam2, visible } = this.state
528
-        const param = this.getParam();
529
-        const param2 = this.getParam2();
530
-        return (
531
-            <div className={styles.sys_account2} style={{ padding: '12px 16px 16px 16px' }}>
532
-                <Tabs
533
-                    activeKey={selectedTabIndex}
534
-                    className="main_content_tabs"
535
-                    onChange={(val) => {
536
-                        this.stores.updateState({ selectedTabIndex: val });
537
-                        this.loadRoles()
538
-                    }}
539
-                >
540
-                    <TabPane
541
-                        tab="权限申请"
542
-                        key="1"
543
-                    >
544
-                        <div className="module_search">
545
-                            <div className="module_title space">查询条件</div>
546
-                            <Row type="flex" justify="start" align="middle">
547
-                                <Col>
548
-                                    <span>数据源名称:</span>
549
-                                    <Input
550
-                                        style={{ width: "180px" }}
551
-                                        value={searchParam.dbsName}
552
-                                        placeholder="请输入数据源名称"
553
-                                        onChange={(e) => {
554
-                                            searchParam.dbsName = e.target.value;
555
-                                            this.setState({ ...searchParam });
556
-                                        }}
557
-                                        onKeyDown={(e) => {
558
-                                            if (e.keyCode === 13) {
559
-                                                searchParam.pageNum = 1;
560
-                                                this.setState(searchParam);
561
-                                                this.loadRoles();
562
-                                            }
563
-                                        }}
564
-                                    ></Input>
565
-                                </Col>
566
-                                <Col offset={1}>
567
-                                    <span>数据库名称:</span>
568
-                                    <Input
569
-                                        style={{ width: "180px" }}
570
-                                        value={searchParam.dataBaseName}
571
-                                        placeholder="请输入数据库名称"
572
-                                        onChange={(e) => {
573
-                                            searchParam.dataBaseName = e.target.value;
574
-                                            this.setState({ ...searchParam });
575
-                                        }}
576
-                                        onKeyDown={(e) => {
577
-                                            if (e.keyCode === 13) {
578
-                                                searchParam.pageNum = 1;
579
-                                                this.setState(searchParam);
580
-                                                this.loadRoles();
581
-                                            }
582
-                                        }}
583
-                                    ></Input>
584
-                                </Col>
585
-                                <Col offset={1}>
586
-                                    <span>数据表名称:</span>
587
-                                    <Input
588
-                                        style={{ width: "180px" }}
589
-                                        value={searchParam.tableName}
590
-                                        placeholder="请输入数据表名称"
591
-                                        onChange={(e) => {
592
-                                            searchParam.tableName = e.target.value;
593
-                                            this.setState({ ...searchParam });
594
-                                        }}
595
-                                        onKeyDown={(e) => {
596
-                                            if (e.keyCode === 13) {
597
-                                                searchParam.pageNum = 1;
598
-                                                this.setState(searchParam);
599
-                                                this.loadRoles();
600
-                                            }
601
-                                        }}
602
-                                    ></Input>
603
-                                </Col>
604
-                            </Row>
605
-                            <Row type="flex" justify="end" align="middle">
606
-                                <Col>
607
-                                    <Button
608
-                                        type="primary"
609
-                                        onClick={(e) => {
610
-                                            this.loadRoles();
611
-                                        }}
612
-                                    >
613
-                                        搜索
614
-                                    </Button>
615
-                                </Col>
616
-                                <Col>
617
-                                    <Button
618
-                                        // type="text"
619
-                                        style={{ marginLeft: 14 }}
620
-                                        onClick={(e) => {
621
-                                            searchParam.tableName = "";
622
-                                            searchParam.dbsName = "";
623
-                                            searchParam.dataBaseName = '';
624
-                                            searchParam.pageNum = 1;
625
-                                            this.setState({ ...searchParam });
626
-                                            this.loadRoles();
627
-                                        }}
628
-                                    >
629
-                                        重置
630
-                                    </Button>
631
-                                </Col>
632
-                            </Row>
633
-                        </div>
634
-                        <span></span>
635
-                        <div className="module_body">
636
-                            <div className="title_with_btn list_top">
637
-                                <div className="module_title">数据申请列表</div>
638
-                            </div>
639
-                            <Table style={{ marginTop: "16px" }} {...param}></Table>
640
-                        </div>
641
-                        <ApplyModal onRef={(ref) => { this.ApplyModal = ref }} isDetails={false} activeData={this.state.activeData} reloadData={
642
-                            () => {
643
-                                this.loadRoles();
644
-                            }
645
-                        }></ApplyModal>
646
-
647
-                    </TabPane>
648
-                    <TabPane
649
-                        tab="我申请的"
650
-                        key="2"
651
-                    >
652
-                        <div className="module_body">
653
-                            <div className="title_with_btn list_top">
654
-                            </div>
655
-                            <Table style={{ marginTop: "16px" }} {...param2}></Table>
656
-                        </div>
657
-                        <ApplyModal2 onRef={(ref) => { this.ApplyModal2 = ref }} isDetails={true}></ApplyModal2>
658
-                    </TabPane>
659
-
660
-                </Tabs>
661
-            </div>
662
-        )
663
-    }
664
-}
665
-export default Form.create()(DataApplyView)
666
-// export default DataApplyView;

+ 0 - 105
src/pages/dataSourceManage/dsListLess.less

@@ -1,105 +0,0 @@
1
-// 其中assets文件夹已经做了webpack别名配置,不需要再使用../../访问,直接加个波浪线
2
-
3
-.sys_account {
4
-  min-width: 1000px; //设置内容区域最小宽度为1000px,防止表格不断被挤压重叠
5
-
6
-  :global {
7
-    .timeSetting {
8
-      .ant-time-picker {
9
-        width: 110px;
10
-        margin: 0px 4px;
11
-      }
12
-
13
-      .saveBtn {
14
-        cursor: pointer;
15
-        padding-right: 4px;
16
-      }
17
-
18
-      .closeBtn {
19
-        cursor: pointer;
20
-      }
21
-
22
-      .editBtn {
23
-        cursor: pointer;
24
-      }
25
-    }
26
-
27
-    //此处主要是使表格内滚动能根据屏幕高度自适应
28
-    .ant-table-fixed-header>.ant-table-container>.ant-table-body {
29
-      max-height: calc(100vh - 330px) !important
30
-    }
31
-
32
-    //处理Badge,与按钮,不对齐
33
-    .ant-table-tbody .yx_table_row_tr td .table_cell_box .ant-typography {
34
-      line-height: 20px;
35
-      height: 20px;
36
-    }
37
-  }
38
-}
39
-
40
-.sys_account {
41
-  :global {
42
-    background-color: #fff;
43
-    padding: 12px 16px 16px 16px;
44
-    .module_search,
45
-    .module_line {
46
-      border-bottom: 8px solid #f5f5f5;
47
-      padding-bottom: 20px;
48
-    }
49
-    
50
-    .cursor {
51
-      cursor: pointer;
52
-    }
53
-
54
-    .col_blue {
55
-      color: #009F95;
56
-    }
57
-
58
-    .flex {
59
-      display: flex;
60
-    }
61
-
62
-    .module_body {
63
-      .list_top {
64
-        display: flex;
65
-        justify-content: space-between;
66
-
67
-        .module_button_area {
68
-          button {
69
-            float: right;
70
-            margin-left: 10px;
71
-          }
72
-        }
73
-      }
74
-    }
75
-
76
-    .ckxq_but {
77
-      cursor: pointer;
78
-      color: skyblue;
79
-    }
80
-
81
-  }
82
-}
83
-
84
-.DataSourceAddModal {
85
-  :global {
86
-    .ant-form-item-children>div {
87
-      display: inline-block !important;
88
-    }
89
-
90
-    .ant-form-explain {
91
-      font-weight: 400;
92
-      font-size: 12px;
93
-      line-height: normal;
94
-      color: #e54747;
95
-      padding-top: 4px;
96
-    }
97
-
98
-    .has-error .ant-input,
99
-    .has-error .ant-select-selector {
100
-      color: rgba(0, 0, 0, 0.6);
101
-      background-color: #fff;
102
-      border: 1px #e54747 solid;
103
-    }
104
-  }
105
-}

+ 0 - 335
src/pages/dataSourceManage/dsListMod.js

@@ -1,335 +0,0 @@
1
-// 状态管理方法
2
-import { observable, action, configure, runInAction, autorun, toJS, computed, makeObservable } from 'mobx'
3
-// 工具方法
4
-import { isEqual, cloneDeep, trim, get } from 'lodash'
5
-// 引入Serv
6
-import Serv from './dsListServ'
7
-import { message } from 'antd'
8
-
9
-
10
-// 严格模式
11
-configure({
12
-  enforceActions: 'observed'
13
-});
14
-
15
-const defaultForm = {
16
-  id: '',
17
-  dataSourceName: '',
18
-  dataSourceType: undefined,
19
-  remarks: '',
20
-  jdbcUrl: '',
21
-  userName: '',
22
-  passWord: '',
23
-  originPassword: '',
24
-  connectionStatus: '',
25
-  defaultDb: '',
26
-  kerberos: false,
27
-  kerberosConfig: '',
28
-  kerberosConfigFileName: '',
29
-  kerberosKey: '',
30
-  kerberosKeyFileName: '',
31
-  kerberosPrincipal: '',
32
-  kerberosService: '',
33
-  defaultFs: '',
34
-  configuration: ''
35
-}
36
-
37
-/**
38
- * mod层 - 业务逻辑,数据逻辑应该存储于此
39
- */
40
-class DsListMod {
41
-  constructor() {
42
-    makeObservable(this);
43
-  }
44
-
45
-  // 监视状态
46
-  @observable state = {
47
-    visible: false,
48
-    createType: 'add', //创建类型,add:新增,edit:修改
49
-    formData: cloneDeep(defaultForm),
50
-    version: '',
51
-    loading: false,
52
-    dbTypeList: [
53
-      {
54
-        value: 'HIVE', babel: 'HIVE'
55
-      },
56
-      {
57
-        value: 'IMPALA', babel: 'IMPALA'
58
-      },
59
-      {
60
-        value:"MYSQL",babel:'MYSQL' //mock
61
-      }
62
-    ],
63
-    confList: [], //配置文件列表
64
-    keytabList: [], //证书文件列表
65
-    tableArr: []
66
-  }
67
-
68
-  /*
69
-   * 如果设定了useStrict严格模式,那么所有observable的值的修改必须在action定义的方法内,否则可以直接修改
70
-   * 设置内容可视性
71
-   */
72
-  @action updateState = async (payload) => {
73
-    // 设置到状态机 - 如果是异步,必须在runInAction
74
-    runInAction(() => {
75
-      this.state = {
76
-        ...this.state,
77
-        ...payload,
78
-        formData: {
79
-          ...this.state.formData,
80
-          ...payload.formData
81
-        }
82
-      }
83
-    })
84
-    /*
85
-     * Mod中跳转使用  window.app.router.push(url);
86
-     * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
87
-     */
88
-    autorun(() => {
89
-      // console.info("visible: ", this.state.visible);
90
-    })
91
-  }
92
-  // 重置from表单
93
-  @action restForm = async (payload) => {
94
-    this.state.formData = cloneDeep(defaultForm)
95
-    /*
96
-     * Mod中跳转使用  window.app.router.push(url);
97
-     * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
98
-     */
99
-    autorun(() => {
100
-      // console.info("visible: ", this.state.visible);
101
-    })
102
-  }
103
-  // 创建数据源
104
-  @action addDs = async (payload, _callbck) => {
105
-    // 请求参数
106
-    const params = payload
107
-    try {
108
-      // 异步请求方法
109
-      this.updateState({ loading: true })
110
-      const { resultCode, resultMsg, data } = await Serv.addDs(params)
111
-      this.updateState({ loading: false })
112
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
113
-      if (resultMsg == 'success') {
114
-        this.updateState({ version: +new Date(), visible: false })
115
-        message.success('保存成功!')
116
-        if (_callbck) {
117
-          _callbck()
118
-        }
119
-      } else {
120
-        message.warn(resultMsg)
121
-      }
122
-    } catch (error) {
123
-      this.updateState({ loading: false })
124
-      //message.error({ content: '发生异常,保存失败!' })
125
-    }
126
-  }
127
-
128
-  // 获取数据源类型
129
-  @action queryDbType = async (payload) => {
130
-    // 请求参数
131
-    const params = payload
132
-    try {
133
-      // 异步请求方法
134
-      const { resultCode, resultMsg, data } = await Serv.queryDbType(params)
135
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
136
-      if (resultMsg == 'success') {
137
-        const dbTypeList = get(data, 'list', [])
138
-        this.updateState({
139
-          dbTypeList: dbTypeList
140
-        })
141
-      }
142
-    } catch (error) { }
143
-  }
144
-
145
-  // 分页查询数据源信息
146
-  @action pageQueryDsInfoMod = async (payload,callback) => {
147
-    // 请求参数
148
-    const params = payload
149
-    try {
150
-      // 异步请求方法
151
-      const { resultCode, resultMsg, data } = await Serv.pageQueryDsInfo(params)
152
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
153
-      if (resultCode == '0') {
154
-        const tableArr = get(data, 'records', [])
155
-        this.updateState({
156
-          tableArr: tableArr
157
-        })
158
-        callback && callback(data.total)
159
-      }
160
-    } catch (error) { }
161
-  }
162
-
163
-
164
-  // 修改数据源
165
-  @action updateDs = async (payload, _callbck) => {
166
-    // 请求参数
167
-    const params = payload
168
-    try {
169
-      // 异步请求方法
170
-      this.updateState({ loading: true })
171
-      const { resultCode, resultMsg, data } = await Serv.updateDs(params)
172
-      this.updateState({ loading: false })
173
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
174
-      if (resultMsg == 'success') {
175
-        this.updateState({ version: +new Date(), visible: false })
176
-        message.success('保存成功!')
177
-        if (_callbck) {
178
-          _callbck()
179
-        }
180
-      } else {
181
-        message.warn(resultMsg)
182
-      }
183
-    } catch (error) {
184
-      this.updateState({ loading: false })
185
-      //message.error({ content: '发生异常,保存失败!' })
186
-    }
187
-  }
188
-  // 删除数据源记录
189
-  @action deleteDs = async (payload,callback) => {
190
-    // 请求参数
191
-    const params = payload
192
-    message.destroy()
193
-    const loaddingDialog = message.loading('删除中,请稍等...', 0)
194
-    try {
195
-      // 异步请求方法
196
-      const { resultCode, resultMsg, data } = await Serv.deleteDs(params)
197
-      setTimeout(loaddingDialog, 0)
198
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
199
-      if (resultMsg == 'success') {
200
-        message.success('删除成功!')
201
-        debugger
202
-        callback && callback()
203
-      } else {
204
-        message.warn(resultMsg || '删除失败!')
205
-      }
206
-    } catch (error) {
207
-      setTimeout(loaddingDialog, 0)
208
-      //message.error({ content: '发生异常,删除失败!', key: 'deleteDs' })
209
-    }
210
-  }
211
-
212
-  // 测试数据源连通性
213
-  @action testDs = async (payload, _callbck) => {
214
-    // 请求参数
215
-    const params = payload
216
-    message.destroy()
217
-    const loaddingDialog = message.loading('测试中,请稍等...', 0)
218
-    try {
219
-      // 异步请求方法
220
-      const { resultCode, resultMsg, data } = await Serv.testDs(params)
221
-      setTimeout(loaddingDialog, 0)
222
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
223
-      if (resultMsg == 'success') {
224
-        message.success('测试成功!')
225
-        if (_callbck) {
226
-          _callbck(resultCode)
227
-        }
228
-      } else {
229
-        if (_callbck) {
230
-          _callbck()
231
-        }
232
-        message.warn('链接失败!')
233
-      }
234
-    } catch (error) {
235
-      setTimeout(loaddingDialog, 0)
236
-      if (_callbck) {
237
-        _callbck()
238
-      }
239
-      //message.error({ content: '发生异常,操作失败!', key: 'testDs' })
240
-    }
241
-  }
242
-  // 潍柴项目设置调度时间
243
-  @action setDataSourceTask = async (payload, _callbck) => {
244
-    // 请求参数
245
-    const params = payload
246
-    try {
247
-      message.loading({ content: '设置中,请稍等...', key: 'setDataSourceTask' })
248
-      // 异步请求方法
249
-      const { resultCode, resultMsg, data } = await Serv.setDataSourceTask(params)
250
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
251
-      if (resultMsg == 'success') {
252
-        this.updateState({ version: +new Date() })
253
-        message.success({ content: '设置成功!', key: 'setDataSourceTask' })
254
-        if (_callbck) {
255
-          _callbck(resultMsg)
256
-        }
257
-      } else {
258
-        if (_callbck) {
259
-          _callbck()
260
-        }
261
-        message.warn({ content: '设置失败!', key: 'setDataSourceTask' })
262
-      }
263
-    } catch (error) {
264
-      if (_callbck) {
265
-        _callbck()
266
-      }
267
-      //message.error({ content: '发生异常,操作失败!', key: 'setDataSourceTask' })
268
-    }
269
-  }
270
-  // 潍柴手动同步数据源信息
271
-  @action manualSyncDataSourceMeta = async (payload, _callbck) => {
272
-    // 请求参数
273
-    const params = payload
274
-    try {
275
-      //message.loading({ content: '设置中,请稍等...', key: 'manualSyncDataSourceMeta' })
276
-      const loaddingDialog = message.loading('设置中,请稍等...', 5)
277
-      // 异步请求方法
278
-      const { resultCode, resultMsg, data } = await Serv.manualSyncDataSourceMeta(params)
279
-      setTimeout(loaddingDialog, 0)
280
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
281
-      if (resultMsg == 'success') {
282
-        /*
283
-         * 设置成功,不需要进行提示
284
-         * message.success({ content: '设置成功!', key: 'manualSyncDataSourceMeta' })
285
-         */
286
-        if (_callbck) {
287
-          _callbck(resultMsg)
288
-        }
289
-      } else {
290
-        if (_callbck) {
291
-          _callbck()
292
-        }
293
-        message.warn({ content: '设置失败!', key: 'manualSyncDataSourceMeta' })
294
-      }
295
-    } catch (error) {
296
-      if (_callbck) {
297
-        _callbck()
298
-      }
299
-      //message.error({ content: '发生异常,操作失败!', key: 'manualSyncDataSourceMeta' })
300
-    }
301
-  }
302
-  // 潍柴获取数据源同步状态
303
-  @action queryDsSyncStatus = async (payload, _callbck) => {
304
-    // 请求参数
305
-    const params = payload
306
-    try {
307
-      // 异步请求方法
308
-      const { resultCode, resultMsg, data } = await Serv.queryDsSyncStatus(params)
309
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
310
-      if (resultMsg == 'success') {
311
-        if (data && data.latestSyncStatus == 'success') {
312
-          message.success({ content: '数据同步成功!' })
313
-        } else if (data && data.latestSyncStatus == 'fail') {
314
-          message.success({ content: '数据同步失败!' })
315
-        }
316
-        if (_callbck) {
317
-          _callbck(resultMsg, data)
318
-        }
319
-      } else {
320
-        if (_callbck) {
321
-          _callbck()
322
-        }
323
-      }
324
-    } catch (error) {
325
-      if (_callbck) {
326
-        _callbck()
327
-      }
328
-      //message.error({ content: '发生异常,操作失败!', key: 'manualSyncDataSourceMeta' })
329
-    }
330
-  }
331
-}
332
-
333
-// 将组件实例化,这意味着组件将不能从别处实例化
334
-const dsListMod = new DsListMod()
335
-export default dsListMod

+ 0 - 109
src/pages/dataSourceManage/dsListServ.js

@@ -1,109 +0,0 @@
1
-import request from '@utils/request'
2
-
3
-export default class {
4
-  //创建数据源
5
-  static addDs(params) {
6
-    return request({
7
-      url: 'api/os/datasource/info/add',
8
-      method: 'POST',
9
-      data: params,
10
-      headers: {
11
-        'Content-type': 'application/json'
12
-      },
13
-      // 对应后端的应用工程名
14
-      app: 'ide-op-mgmt-application'
15
-      //isLocMock: true
16
-    })
17
-  }
18
-  //更新数据源
19
-  static updateDs(params) {
20
-    return request({
21
-      url: 'api/os/datasource/info/update',
22
-      method: 'POST',
23
-      data: params,
24
-      headers: {
25
-        'Content-type': 'application/json'
26
-      },
27
-      // 对应后端的应用工程名
28
-      app: 'ide-op-mgmt-application'
29
-      //isLocMock: true
30
-    })
31
-  }
32
-  // 删除数据源
33
-  static deleteDs(params) {
34
-    return request({
35
-      url: 'api/os/datasource/info/deleteById/' + params.id,
36
-      method: 'DELETE',
37
-      //data: params,
38
-      app: 'ide-op-mgmt-application'
39
-      //isLocMock: true
40
-    })
41
-  }
42
-  // 测试数据源连通性
43
-  static testDs(params) {
44
-    return request({
45
-      url: 'api/os/datasource/info/testConnect',
46
-      method: 'POST',
47
-      data: params,
48
-      headers: {
49
-        'Content-type': 'application/json'
50
-      },
51
-      // 对应后端的应用工程名
52
-      app: 'ide-op-mgmt-application'
53
-      //isLocMock: true
54
-    })
55
-  }
56
-  // 查询数据源类型
57
-  static queryDbType(params) {
58
-    return request({
59
-      url: 'dataSource/queryDbType',
60
-      method: 'GET',
61
-      data: params,
62
-      // 对应后端的应用工程名
63
-      app: 'ide-op-mgmt-application'
64
-      //isLocMock: true
65
-    })
66
-  }
67
-
68
-  // 查询数据源类型
69
-  static pageQueryDsInfo(params) {
70
-    return request({
71
-      url: 'api/os/datasource/info/pageQueryDsInfo',
72
-      method: 'post',
73
-      data: params,
74
-      // 对应后端的应用工程名
75
-      app: 'ide-op-mgmt-application'
76
-      //isLocMock: true
77
-    })
78
-  }
79
-
80
-  //潍柴项目,设置调度任务
81
-  static setDataSourceTask(params) {
82
-    return request({
83
-      url: 'api/os/datasource/info/setDataSourceTask',
84
-      method: 'POST',
85
-      data: params,
86
-      headers: {
87
-        'Content-type': 'application/json'
88
-      }
89
-    })
90
-  }
91
-
92
-  //潍柴项目,手动同步数据源
93
-  static manualSyncDataSourceMeta(params) {
94
-    return request({
95
-      url: 'api/os/datasource/info/manualSyncDataSourceMeta?dsId=' + params.dsId,
96
-      method: 'GET',
97
-      headers: {
98
-        'Content-type': 'application/json'
99
-      }
100
-    })
101
-  }
102
-    //潍柴项目,获取数据源同步状态
103
-    static queryDsSyncStatus(params) {
104
-        return request({
105
-          url: `api/os/datasource/info/queryDetail/${params}`,
106
-          method: 'GET',
107
-        })
108
-      }
109
-    }

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 1296
src/pages/dataSourceManage/dsListView.jsx


+ 0 - 6
src/pages/drive/view.jsx

@@ -1,6 +0,0 @@
1
-import React, { useState } from "react";
2
-
3
-const Drive = () => {
4
-  return <h2>驾驶舱</h2>;
5
-};
6
-export default Drive;

+ 0 - 22
src/pages/fileUpload/style.less

@@ -1,22 +0,0 @@
1
-.systemNotice {
2
-  :global {
3
-    background-color: #fff;
4
-    padding: 20px 16px 16px 16px;
5
-
6
-    .publish_btn {
7
-      display: flex;
8
-      justify-content: flex-end;
9
-      margin-bottom: 14px;
10
-    }
11
-
12
-
13
-    // 系统公告内容
14
-    .notice_content {
15
-      display: inline-block;
16
-      width: 880px;
17
-      text-overflow: ellipsis;
18
-      overflow: hidden;/** 隐藏超出的内容 **/
19
-      white-space: nowrap;
20
-    }
21
-  }
22
-}

+ 0 - 255
src/pages/fileUpload/view.jsx

@@ -1,255 +0,0 @@
1
-/*
2
- * @Author: dayan_hjm 
3
- * @Date: 2022-11-25 09:57:07 
4
- * @Last Modified by: dayan_hjm
5
- * @Last Modified time: 2022-11-28 19:22:35
6
- */
7
-
8
-import React from "react";
9
-import { useState, useEffect, useRef } from "react";
10
-import styles from "./style.less";
11
-import { observer } from "mobx-react";
12
-import { useHistory } from "react-router-dom";
13
-import { UploadOutlined } from '@ant-design/icons';
14
-import {
15
-  Spin,
16
-  Form,
17
-  Modal,
18
-  Input,
19
-  Table,
20
-  Select,
21
-  Row,
22
-  Col,
23
-  Button,
24
-  message,
25
-  Breadcrumb,
26
-  List,
27
-  Tooltip,
28
-  Upload
29
-} from "antd";
30
-import {
31
-  getAllTableConfigs, // 文件上传分页
32
-  preViewFillInData
33
-} from "@apis/system";
34
-import { getUnReadMessageNum, getAccountTotalUnReadAndDealMsgInfo } from "@apis/personal";
35
-import $store from "@store/";
36
-import TreeSearch from "@components/TreeSelectSearch/view";
37
-
38
-export default observer(function (props) {
39
-  const [form] = Form.useForm();
40
-  const { TextArea } = Input;
41
-  const [noticeList, setNoticeList] = useState([]); //文件上传table数据
42
-  const [uploadList, setUploadList] = useState([]);
43
-  const [fruitsuploadList, setFruitsUploadList] = useState([]);
44
-  const [total, setTotal] = useState({
45
-    total: 0,
46
-    pageNum: 1,
47
-    pageSize: 10,
48
-  }); //文件上传分页总数
49
-  const [bizTableConfigId, setBizTableConfigId] = useState(0);
50
-  const [sysUpdateMsgType, setSysUpdateMsgType] = useState(0); //文件上传类型
51
-  const [loading, setLoading] = useState(false); //加载分页loading
52
-  const [isShowFeedback, setIsShowFeedback] = useState(false);
53
-  const [uploadInfo, setuploadInfo] = useState({
54
-    file: {
55
-      status: 0,
56
-      response: {
57
-        resultCode: 0,
58
-        resultMsg: ''
59
-      },
60
-      name: ''
61
-    },
62
-  });
63
-
64
-  const uploadProps = {
65
-    maxCount: 1,
66
-    showUploadList: false,
67
-    name: 'excelFile',
68
-    action: `/api/biz/table/config/uploadExcelDataToDB/${bizTableConfigId}`,
69
-    headers: {
70
-      authorization: 'authorization-text',
71
-      token: sessionStorage.getItem("token")
72
-    },
73
-    onChange(info) {
74
-      if (info.file.status !== 'uploading' && info.file.status !== "removed") {
75
-        console.log(info.file, info.fileList);
76
-        setuploadInfo(info);
77
-        if (info.file.status === 'done' && info.file.response.resultCode == 0) {
78
-          preViewFillInData(bizTableConfigId,{
79
-            pageNum:total.pageNum,
80
-            pageSize: total.pageSize  
81
-          })
82
-            .then(({ data, resultCode }) => {
83
-              if (+resultCode === 0) {
84
-                let newData = data && data.data && data.data.length > 0 ? data.data : [];
85
-                setUploadList(newData);
86
-                setTotal({
87
-                  total: data.total,
88
-                  pageNum: data.pageNum,
89
-                  pageSize: data.pageSize,
90
-                });
91
-                if (newData && newData[0]) {
92
-                  setFruitsUploadList(Object.keys(newData[0]))
93
-                }
94
-              }
95
-            })
96
-            .catch((resultMsg) => {
97
-              message.error(resultMsg);
98
-            });
99
-        }
100
-        setTimeout(() => {
101
-          setIsShowFeedback(true)
102
-        }, 300);
103
-      }
104
-    },
105
-  };
106
-  const publishColumn = [
107
-    {
108
-      title: "填报配置名称",
109
-      dataIndex: "bizTableConfigName",
110
-      key: "bizTableConfigName",
111
-    },
112
-    {
113
-      title: "业务表名",
114
-      dataIndex: "bizTableName",
115
-      key: "bizTableName",
116
-    },
117
-    {
118
-      title: "创建时间",
119
-      dataIndex: "createTime",
120
-      key: "createTime",
121
-    },
122
-    {
123
-      title: "更新时间",
124
-      dataIndex: "updateTime",
125
-      key: "updateTime",
126
-    },
127
-    {
128
-      title: "操作",
129
-      dataIndex: "operation",
130
-      render: (val, record, e) => {
131
-        setBizTableConfigId(record.bizTableConfigId)
132
-        return (
133
-          <div className="col_blue">
134
-            <span>
135
-              <Upload {...uploadProps}>
136
-                <Button icon={<UploadOutlined />}>点击上传文件</Button>
137
-              </Upload>              </span>
138
-          </div>
139
-        );
140
-      },
141
-    },
142
-
143
-  ];
144
-  const noticeTableOPt = {
145
-    dataSource: noticeList,
146
-    columns: publishColumn,
147
-    pagination: {
148
-      showSizeChanger: true,
149
-    },
150
-  };
151
-  const noticeTableOPt_modal = {
152
-    dataSource: uploadList,
153
-    columns: fruitsuploadList.map(x => {
154
-      return {
155
-        dataIndex: x + "",
156
-        key: x + "",
157
-        title: x,
158
-      }
159
-    }),
160
-    pagination: {
161
-      showSizeChanger: false,
162
-      onChange: (pageNum) => {
163
-        preViewFillInData(bizTableConfigId,{
164
-          pageNum:pageNum,
165
-          pageSize: total.pageSize
166
-        }).then(({ data, resultCode }) => {
167
-          if (+resultCode === 0) {
168
-            let newData = data && data.data && data.data.length > 0 ? data.data : [];
169
-            setUploadList(newData);
170
-            setTotal({
171
-              total: data.total,
172
-              pageNum: data.pageNum,
173
-              pageSize: data.pageSize,
174
-            });
175
-            if (newData && newData[0]) {
176
-              setFruitsUploadList(Object.keys(newData[0]))
177
-            }
178
-          }
179
-        })
180
-        .catch((resultMsg) => {
181
-          message.error(resultMsg);
182
-        });
183
-        setTotal({
184
-          total: total.total,
185
-          pageNum: pageNum,
186
-          pageSize: total.pageSize,
187
-        });
188
-      },
189
-      total: total.total,
190
-      pageSize: total.pageSize,
191
-      current: Number(total.pageNum),
192
-    },
193
-    scroll: { x: 1300 },
194
-  };
195
-  useEffect(() => {
196
-    getSystemNoticeList();
197
-  }, []);
198
-  // 获取文件上传分页数据
199
-  const getSystemNoticeList = () => {
200
-    setLoading(true);
201
-    getAllTableConfigs()
202
-      .then(({ data, resultCode }) => {
203
-        setLoading(false);
204
-        if (+resultCode === 0) {
205
-          let newData = data && data.length > 0 ? data : [];
206
-          setNoticeList(newData);
207
-        }
208
-      })
209
-      .catch((resultMsg) => {
210
-        message.error(resultMsg);
211
-        setLoading(false);
212
-      });
213
-  };
214
-
215
-  return (
216
-    <div className={styles.systemNotice}>
217
-      <Spin spinning={loading || false}>
218
-        <div className="module_title space">文件上传</div>
219
-        <div className="publish_table">
220
-          <Table {...noticeTableOPt} />
221
-        </div>
222
-        <Modal
223
-          width={900}
224
-          title="文件上传"
225
-          visible={isShowFeedback}
226
-          onCancel={() => {
227
-            setIsShowFeedback(false);
228
-          }}
229
-          footer={
230
-            [
231
-              <Button
232
-                type="primary"
233
-                key="feedback_1"
234
-                onClick={() => {
235
-                  setIsShowFeedback(false);
236
-                }}
237
-              >
238
-                确定
239
-              </Button>,
240
-            ]
241
-          }
242
-        >
243
-          {
244
-            uploadInfo.file.status === 'done' && uploadInfo.file.response.resultCode == 0 ?
245
-              <div>
246
-                <p style={{ marginBottom: "20px" }}>文件-{`${uploadInfo.file.name}:`}<span style={{ color: 'green' }}>:上传成功!</span></p>
247
-                <Table {...noticeTableOPt_modal} />
248
-              </div>
249
-              : ((uploadInfo.file.status === 'error' || uploadInfo.file.status === 'done') ? <p>文件-{`${uploadInfo.file.name}:`}<span style={{ color: 'red' }}>上传失败!原因:{uploadInfo.file.response.resultMsg}</span></p> : null)
250
-          }
251
-        </Modal>
252
-      </Spin>
253
-    </div>
254
-  );
255
-});

+ 0 - 105
src/pages/fileUploadDetail/fileUploadDetailLess.less

@@ -1,105 +0,0 @@
1
-// 其中assets文件夹已经做了webpack别名配置,不需要再使用../../访问,直接加个波浪线
2
-
3
-.sys_account {
4
-  min-width: 1000px; //设置内容区域最小宽度为1000px,防止表格不断被挤压重叠
5
-
6
-  :global {
7
-    .timeSetting {
8
-      .ant-time-picker {
9
-        width: 110px;
10
-        margin: 0px 4px;
11
-      }
12
-
13
-      .saveBtn {
14
-        cursor: pointer;
15
-        padding-right: 4px;
16
-      }
17
-
18
-      .closeBtn {
19
-        cursor: pointer;
20
-      }
21
-
22
-      .editBtn {
23
-        cursor: pointer;
24
-      }
25
-    }
26
-
27
-    //此处主要是使表格内滚动能根据屏幕高度自适应
28
-    .ant-table-fixed-header>.ant-table-container>.ant-table-body {
29
-      max-height: calc(100vh - 330px) !important
30
-    }
31
-
32
-    //处理Badge,与按钮,不对齐
33
-    .ant-table-tbody .yx_table_row_tr td .table_cell_box .ant-typography {
34
-      line-height: 20px;
35
-      height: 20px;
36
-    }
37
-  }
38
-}
39
-
40
-.sys_account {
41
-  :global {
42
-    background-color: #fff;
43
-    padding: 12px 16px 16px 16px;
44
-    .module_search,
45
-    .module_line {
46
-      border-bottom: 8px solid #f5f5f5;
47
-      padding-bottom: 20px;
48
-    }
49
-    
50
-    .cursor {
51
-      cursor: pointer;
52
-    }
53
-
54
-    .col_blue {
55
-      color: #009F95;
56
-    }
57
-
58
-    .flex {
59
-      display: flex;
60
-    }
61
-
62
-    .module_body {
63
-      .list_top {
64
-        display: flex;
65
-        justify-content: space-between;
66
-
67
-        .module_button_area {
68
-          button {
69
-            float: right;
70
-            margin-left: 10px;
71
-          }
72
-        }
73
-      }
74
-    }
75
-
76
-    .ckxq_but {
77
-      cursor: pointer;
78
-      color: skyblue;
79
-    }
80
-
81
-  }
82
-}
83
-
84
-.DataSourceAddModal {
85
-  :global {
86
-    .ant-form-item-children>div {
87
-      display: inline-block !important;
88
-    }
89
-
90
-    .ant-form-explain {
91
-      font-weight: 400;
92
-      font-size: 12px;
93
-      line-height: normal;
94
-      color: #e54747;
95
-      padding-top: 4px;
96
-    }
97
-
98
-    .has-error .ant-input,
99
-    .has-error .ant-select-selector {
100
-      color: rgba(0, 0, 0, 0.6);
101
-      background-color: #fff;
102
-      border: 1px #e54747 solid;
103
-    }
104
-  }
105
-}

+ 0 - 335
src/pages/fileUploadDetail/fileUploadDetailMod.js

@@ -1,335 +0,0 @@
1
-// 状态管理方法
2
-import { observable, action, configure, runInAction, autorun, toJS, computed, makeObservable } from 'mobx'
3
-// 工具方法
4
-import { isEqual, cloneDeep, trim, get } from 'lodash'
5
-// 引入Serv
6
-import Serv from './fileUploadDetailServ'
7
-import { message } from 'antd'
8
-
9
-
10
-// 严格模式
11
-configure({
12
-  enforceActions: 'observed'
13
-});
14
-
15
-const defaultForm = {
16
-  id: '',
17
-  dataSourceName: '',
18
-  dataSourceType: undefined,
19
-  remarks: '',
20
-  jdbcUrl: '',
21
-  userName: '',
22
-  passWord: '',
23
-  originPassword: '',
24
-  connectionStatus: '',
25
-  defaultDb: '',
26
-  kerberos: false,
27
-  kerberosConfig: '',
28
-  kerberosConfigFileName: '',
29
-  kerberosKey: '',
30
-  kerberosKeyFileName: '',
31
-  kerberosPrincipal: '',
32
-  kerberosService: '',
33
-  defaultFs: '',
34
-  configuration: ''
35
-}
36
-
37
-/**
38
- * mod层 - 业务逻辑,数据逻辑应该存储于此
39
- */
40
-class FileUploadDetailMod {
41
-  constructor() {
42
-    makeObservable(this);
43
-  }
44
-
45
-  // 监视状态
46
-  @observable state = {
47
-    visible: false,
48
-    createType: 'add', //创建类型,add:新增,edit:修改
49
-    formData: cloneDeep(defaultForm),
50
-    version: '',
51
-    loading: false,
52
-    dbTypeList: [
53
-      {
54
-        value: 'HIVE', babel: 'HIVE'
55
-      },
56
-      {
57
-        value: 'IMPALA', babel: 'IMPALA'
58
-      },
59
-      // {
60
-      //   value:"MYSQL",babel:'MYSQL' //mock
61
-      // }
62
-    ],
63
-    confList: [], //配置文件列表
64
-    keytabList: [], //证书文件列表
65
-    tableArr: []
66
-  }
67
-
68
-  /*
69
-   * 如果设定了useStrict严格模式,那么所有observable的值的修改必须在action定义的方法内,否则可以直接修改
70
-   * 设置内容可视性
71
-   */
72
-  @action updateState = async (payload) => {
73
-    // 设置到状态机 - 如果是异步,必须在runInAction
74
-    runInAction(() => {
75
-      this.state = {
76
-        ...this.state,
77
-        ...payload,
78
-        formData: {
79
-          ...this.state.formData,
80
-          ...payload.formData
81
-        }
82
-      }
83
-    })
84
-    /*
85
-     * Mod中跳转使用  window.app.router.push(url);
86
-     * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
87
-     */
88
-    autorun(() => {
89
-      // console.info("visible: ", this.state.visible);
90
-    })
91
-  }
92
-  // 重置from表单
93
-  @action restForm = async (payload) => {
94
-    this.state.formData = cloneDeep(defaultForm)
95
-    /*
96
-     * Mod中跳转使用  window.app.router.push(url);
97
-     * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
98
-     */
99
-    autorun(() => {
100
-      // console.info("visible: ", this.state.visible);
101
-    })
102
-  }
103
-  // 创建数据源
104
-  @action addDs = async (payload, _callbck) => {
105
-    // 请求参数
106
-    const params = payload
107
-    try {
108
-      // 异步请求方法
109
-      this.updateState({ loading: true })
110
-      const { resultCode, resultMsg, data } = await Serv.addDs(params)
111
-      this.updateState({ loading: false })
112
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
113
-      if (resultMsg == 'success') {
114
-        this.updateState({ version: +new Date(), visible: false })
115
-        message.success('保存成功!')
116
-        if (_callbck) {
117
-          _callbck()
118
-        }
119
-      } else {
120
-        message.warn(resultMsg)
121
-      }
122
-    } catch (error) {
123
-      this.updateState({ loading: false })
124
-      //message.error({ content: '发生异常,保存失败!' })
125
-    }
126
-  }
127
-
128
-  // 获取数据源类型
129
-  @action queryDbType = async (payload) => {
130
-    // 请求参数
131
-    const params = payload
132
-    try {
133
-      // 异步请求方法
134
-      const { resultCode, resultMsg, data } = await Serv.queryDbType(params)
135
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
136
-      if (resultMsg == 'success') {
137
-        const dbTypeList = get(data, 'list', [])
138
-        this.updateState({
139
-          dbTypeList: dbTypeList
140
-        })
141
-      }
142
-    } catch (error) { }
143
-  }
144
-
145
-  // 分页查询数据源信息
146
-  @action pageQueryDsInfoMod = async (payload,callback) => {
147
-    // 请求参数
148
-    const params = payload
149
-    try {
150
-      // 异步请求方法
151
-      const { resultCode, resultMsg, data } = await Serv.pageQueryDsInfo(params)
152
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
153
-      if (resultCode == '0') {
154
-        const tableArr = get(data, 'records', [])
155
-        this.updateState({
156
-          tableArr: tableArr
157
-        })
158
-        callback && callback(data.total)
159
-      }
160
-    } catch (error) { }
161
-  }
162
-
163
-
164
-  // 修改数据源
165
-  @action updateDs = async (payload, _callbck) => {
166
-    // 请求参数
167
-    const params = payload
168
-    try {
169
-      // 异步请求方法
170
-      this.updateState({ loading: true })
171
-      const { resultCode, resultMsg, data } = await Serv.updateDs(params)
172
-      this.updateState({ loading: false })
173
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
174
-      if (resultMsg == 'success') {
175
-        this.updateState({ version: +new Date(), visible: false })
176
-        message.success('保存成功!')
177
-        if (_callbck) {
178
-          _callbck()
179
-        }
180
-      } else {
181
-        message.warn(resultMsg)
182
-      }
183
-    } catch (error) {
184
-      this.updateState({ loading: false })
185
-      //message.error({ content: '发生异常,保存失败!' })
186
-    }
187
-  }
188
-  // 删除数据源记录
189
-  @action deleteDs = async (payload,callback) => {
190
-    // 请求参数
191
-    const params = payload
192
-    message.destroy()
193
-    const loaddingDialog = message.loading('删除中,请稍等...', 0)
194
-    try {
195
-      // 异步请求方法
196
-      const { resultCode, resultMsg, data } = await Serv.deleteDs(params)
197
-      setTimeout(loaddingDialog, 0)
198
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
199
-      if (resultMsg == 'success') {
200
-        message.success('删除成功!')
201
-        debugger
202
-        callback && callback()
203
-      } else {
204
-        message.warn(resultMsg || '删除失败!')
205
-      }
206
-    } catch (error) {
207
-      setTimeout(loaddingDialog, 0)
208
-      //message.error({ content: '发生异常,删除失败!', key: 'deleteDs' })
209
-    }
210
-  }
211
-
212
-  // 测试数据源连通性
213
-  @action testDs = async (payload, _callbck) => {
214
-    // 请求参数
215
-    const params = payload
216
-    message.destroy()
217
-    const loaddingDialog = message.loading('测试中,请稍等...', 0)
218
-    try {
219
-      // 异步请求方法
220
-      const { resultCode, resultMsg, data } = await Serv.testDs(params)
221
-      setTimeout(loaddingDialog, 0)
222
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
223
-      if (resultMsg == 'success') {
224
-        message.success('测试成功!')
225
-        if (_callbck) {
226
-          _callbck(resultCode)
227
-        }
228
-      } else {
229
-        if (_callbck) {
230
-          _callbck()
231
-        }
232
-        message.warn('链接失败!')
233
-      }
234
-    } catch (error) {
235
-      setTimeout(loaddingDialog, 0)
236
-      if (_callbck) {
237
-        _callbck()
238
-      }
239
-      //message.error({ content: '发生异常,操作失败!', key: 'testDs' })
240
-    }
241
-  }
242
-  // 潍柴项目设置调度时间
243
-  @action setDataSourceTask = async (payload, _callbck) => {
244
-    // 请求参数
245
-    const params = payload
246
-    try {
247
-      message.loading({ content: '设置中,请稍等...', key: 'setDataSourceTask' })
248
-      // 异步请求方法
249
-      const { resultCode, resultMsg, data } = await Serv.setDataSourceTask(params)
250
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
251
-      if (resultMsg == 'success') {
252
-        this.updateState({ version: +new Date() })
253
-        message.success({ content: '设置成功!', key: 'setDataSourceTask' })
254
-        if (_callbck) {
255
-          _callbck(resultMsg)
256
-        }
257
-      } else {
258
-        if (_callbck) {
259
-          _callbck()
260
-        }
261
-        message.warn({ content: '设置失败!', key: 'setDataSourceTask' })
262
-      }
263
-    } catch (error) {
264
-      if (_callbck) {
265
-        _callbck()
266
-      }
267
-      //message.error({ content: '发生异常,操作失败!', key: 'setDataSourceTask' })
268
-    }
269
-  }
270
-  // 潍柴手动同步数据源信息
271
-  @action manualSyncDataSourceMeta = async (payload, _callbck) => {
272
-    // 请求参数
273
-    const params = payload
274
-    try {
275
-      //message.loading({ content: '设置中,请稍等...', key: 'manualSyncDataSourceMeta' })
276
-      const loaddingDialog = message.loading('设置中,请稍等...', 5)
277
-      // 异步请求方法
278
-      const { resultCode, resultMsg, data } = await Serv.manualSyncDataSourceMeta(params)
279
-      setTimeout(loaddingDialog, 0)
280
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
281
-      if (resultMsg == 'success') {
282
-        /*
283
-         * 设置成功,不需要进行提示
284
-         * message.success({ content: '设置成功!', key: 'manualSyncDataSourceMeta' })
285
-         */
286
-        if (_callbck) {
287
-          _callbck(resultMsg)
288
-        }
289
-      } else {
290
-        if (_callbck) {
291
-          _callbck()
292
-        }
293
-        message.warn({ content: '设置失败!', key: 'manualSyncDataSourceMeta' })
294
-      }
295
-    } catch (error) {
296
-      if (_callbck) {
297
-        _callbck()
298
-      }
299
-      //message.error({ content: '发生异常,操作失败!', key: 'manualSyncDataSourceMeta' })
300
-    }
301
-  }
302
-  // 潍柴获取数据源同步状态
303
-  @action queryDsSyncStatus = async (payload, _callbck) => {
304
-    // 请求参数
305
-    const params = payload
306
-    try {
307
-      // 异步请求方法
308
-      const { resultCode, resultMsg, data } = await Serv.queryDsSyncStatus(params)
309
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
310
-      if (resultMsg == 'success') {
311
-        if (data && data.latestSyncStatus == 'success') {
312
-          message.success({ content: '数据同步成功!' })
313
-        } else if (data && data.latestSyncStatus == 'fail') {
314
-          message.success({ content: '数据同步失败!' })
315
-        }
316
-        if (_callbck) {
317
-          _callbck(resultMsg, data)
318
-        }
319
-      } else {
320
-        if (_callbck) {
321
-          _callbck()
322
-        }
323
-      }
324
-    } catch (error) {
325
-      if (_callbck) {
326
-        _callbck()
327
-      }
328
-      //message.error({ content: '发生异常,操作失败!', key: 'manualSyncDataSourceMeta' })
329
-    }
330
-  }
331
-}
332
-
333
-// 将组件实例化,这意味着组件将不能从别处实例化
334
-const fileUploadDetailMod = new FileUploadDetailMod()
335
-export default fileUploadDetailMod

+ 0 - 109
src/pages/fileUploadDetail/fileUploadDetailServ.js

@@ -1,109 +0,0 @@
1
-import request from '@utils/request'
2
-
3
-export default class {
4
-  //创建数据源
5
-  static addDs(params) {
6
-    return request({
7
-      url: 'api/os/datasource/info/add',
8
-      method: 'POST',
9
-      data: params,
10
-      headers: {
11
-        'Content-type': 'application/json'
12
-      },
13
-      // 对应后端的应用工程名
14
-      app: 'ide-op-mgmt-application'
15
-      //isLocMock: true
16
-    })
17
-  }
18
-  //更新数据源
19
-  static updateDs(params) {
20
-    return request({
21
-      url: 'api/os/datasource/info/update',
22
-      method: 'POST',
23
-      data: params,
24
-      headers: {
25
-        'Content-type': 'application/json'
26
-      },
27
-      // 对应后端的应用工程名
28
-      app: 'ide-op-mgmt-application'
29
-      //isLocMock: true
30
-    })
31
-  }
32
-  // 删除数据源
33
-  static deleteDs(params) {
34
-    return request({
35
-      url: 'api/os/datasource/info/deleteById/' + params.id,
36
-      method: 'DELETE',
37
-      //data: params,
38
-      app: 'ide-op-mgmt-application'
39
-      //isLocMock: true
40
-    })
41
-  }
42
-  // 测试数据源连通性
43
-  static testDs(params) {
44
-    return request({
45
-      url: 'api/os/datasource/info/testConnect',
46
-      method: 'POST',
47
-      data: params,
48
-      headers: {
49
-        'Content-type': 'application/json'
50
-      },
51
-      // 对应后端的应用工程名
52
-      app: 'ide-op-mgmt-application'
53
-      //isLocMock: true
54
-    })
55
-  }
56
-  // 查询数据源类型
57
-  static queryDbType(params) {
58
-    return request({
59
-      url: 'dataSource/queryDbType',
60
-      method: 'GET',
61
-      data: params,
62
-      // 对应后端的应用工程名
63
-      app: 'ide-op-mgmt-application'
64
-      //isLocMock: true
65
-    })
66
-  }
67
-
68
-  // 查询数据源类型
69
-  static pageQueryDsInfo(params) {
70
-    return request({
71
-      url: 'api/biz/table/config/pageUploadRecordInfo',
72
-      method: 'post',
73
-      data: params,
74
-      // 对应后端的应用工程名
75
-      app: 'ide-op-mgmt-application'
76
-      //isLocMock: true
77
-    })
78
-  }
79
-
80
-  //潍柴项目,设置调度任务
81
-  static setDataSourceTask(params) {
82
-    return request({
83
-      url: 'api/os/datasource/info/setDataSourceTask',
84
-      method: 'POST',
85
-      data: params,
86
-      headers: {
87
-        'Content-type': 'application/json'
88
-      }
89
-    })
90
-  }
91
-
92
-  //潍柴项目,手动同步数据源
93
-  static manualSyncDataSourceMeta(params) {
94
-    return request({
95
-      url: 'api/os/datasource/info/manualSyncDataSourceMeta?dsId=' + params.dsId,
96
-      method: 'GET',
97
-      headers: {
98
-        'Content-type': 'application/json'
99
-      }
100
-    })
101
-  }
102
-    //潍柴项目,获取数据源同步状态
103
-    static queryDsSyncStatus(params) {
104
-        return request({
105
-          url: `api/os/datasource/info/queryDetail/${params}`,
106
-          method: 'GET',
107
-        })
108
-      }
109
-    }

+ 0 - 624
src/pages/fileUploadDetail/fileUploadDetailView.jsx

@@ -1,624 +0,0 @@
1
-/*
2
-    新-文件上传
3
- * @Author: dayan_hjm 
4
- * @Date: 2022-12-20 10:27:48 
5
- * @Last Modified by: dayan_hjm
6
- * @Last Modified time: 2023-02-15 11:45:33
7
- */
8
-
9
-
10
-import React, { Component } from "react";
11
-import { Table, Button, Badge, Modal, Input, Select, message, Tooltip, Radio, Upload, TimePicker, Row, Col } from 'antd'
12
-import { Form } from '@ant-design/compatible';
13
-import { QuestionCircleOutlined, UploadOutlined, EditOutlined, CloseOutlined, DeleteOutlined } from '@ant-design/icons';
14
-import '@ant-design/compatible/assets/index.css';
15
-import { observer } from 'mobx-react'
16
-import { withRouter } from 'react-router-dom'
17
-import { isEmpty, uniqueId, queryToObj } from 'lodash'
18
-import { Encrypt } from "@utils/util"
19
-import moment from 'moment'
20
-const FormItem = Form.Item;
21
-import { preRecordViewFillInData } from "@apis/system";
22
-// 站点配置
23
-import config from '@config/config';
24
-
25
-// 引入当前页样式 - 模块化
26
-import styles from './fileUploadDetailless.less'
27
-// 多类名样式管理工具
28
-import { toJS } from 'mobx'
29
-import fileUploadDetailMod from './fileUploadDetailMod'
30
-
31
-// 在组件中可通过this.props.history.push跳转路由
32
-@withRouter
33
-@observer
34
-
35
-class FileUploadDetailView extends Component {
36
-    // 构造函数,组件的实例创建时,最先执行
37
-    constructor(props, context) {
38
-        super(props, context)
39
-        // 注入的FileUploadDetailMod
40
-        this.stores = fileUploadDetailMod;
41
-        this.state = {
42
-            fruitsuploadList: [],
43
-            uploadList: [],
44
-            str:'< 返回上一页',
45
-            uploadInfo: {
46
-                file: {
47
-                    status: 0,
48
-                    response: {
49
-                        resultCode: 0,
50
-                        resultMsg: ''
51
-                    },
52
-                    name: ''
53
-                },
54
-            },
55
-            total_: {
56
-                total: 0,
57
-                pageNum: 1,
58
-                pageSize: 10,
59
-            },
60
-            isShowFeedback: false,
61
-            bizTableConfigId: 0,
62
-            total: 0,
63
-            editRecordId: '', //数据编辑行的id
64
-            setTimeValue: '', //设置的时间x
65
-            searchParam: {
66
-                name: '',
67
-                dbType: '',
68
-                pageNum: 1,
69
-                pageSize: 10,
70
-            },
71
-            visible: false,
72
-            resetRoom: [
73
-                'name',
74
-                'remarks',
75
-                'jdbcUrl',
76
-                'jdbcUserName',
77
-                'jdbcPassword',
78
-                'defaultDb',
79
-                'kerberos',
80
-                'kerberosConfig',
81
-                'kerberosKey',
82
-                'kerberos',
83
-                'kerberosService',
84
-                'defaultFs',
85
-                'configuration'
86
-            ]
87
-        }
88
-        this.timer = null //定时器,用于检测同步状态
89
-        this.count = 0 //检测的次数
90
-    }
91
-
92
-    componentDidMount() {
93
-        this.loadRoles()
94
-    }
95
-
96
-    loadRoles(attrs = []) {
97
-        // let searchInstance = queryToObj(); // url查询参数对象化
98
-        const { searchParam } = this.state;
99
-        let params = { ...searchParam, ...attrs, ...{ bizTableConfigId: this.props.match.params.id } };
100
-        this.stores.pageQueryDsInfoMod(params, (res = 0) => {
101
-            this.setState({ total: res })
102
-        })
103
-    };
104
-
105
-    inputChange(key, value) {
106
-        const { resetFields } = this.props.form
107
-        if (key === 'dbType' || key === 'MYSQL') {
108
-            this.stores.updateState({
109
-                formData: {
110
-                    name: '',
111
-                    remarks: '',
112
-                    jdbcUrl: '',
113
-                    jdbcUserName: '',
114
-                    jdbcPassword: '',
115
-                    connectionStatus: '',
116
-                    defaultDb: '',
117
-                    kerberos: false,
118
-                    kerberosConfig: '',
119
-                    kerberosConfigFileName: '',
120
-                    kerberosKey: '',
121
-                    kerberosKeyFileName: '',
122
-                    kerberos: '',
123
-                    kerberosService: '',
124
-                    defaultFs: '',
125
-                    configuration: '',
126
-                    [key]: value,
127
-                    originPassword: ''
128
-                },
129
-                confList: [],
130
-                keytabList: []
131
-            })
132
-            resetFields(this.state.resetRoom)
133
-        } else if (key === 'jdbcUrl' || key === 'jdbcUserName' || key === 'jdbcPassword' || key === 'defaultDb') {
134
-            this.stores.updateState({
135
-                formData: {
136
-                    connectionStatus: '',
137
-                    [key]: value
138
-                }
139
-            })
140
-        } else if (key === 'kerberos') {
141
-            this.stores.updateState({
142
-                formData: {
143
-                    kerberosConfig: '',
144
-                    kerberosConfigFileName: '',
145
-                    kerberosKey: '',
146
-                    kerberosKeyFileName: '',
147
-                    kerberos: '',
148
-                    kerberosService: '',
149
-                    //jdbcUrl: '',
150
-                    jdbcUserName: '',
151
-                    jdbcPassword: '',
152
-                    [key]: value
153
-                },
154
-                confList: [],
155
-                keytabList: []
156
-            })
157
-            resetFields([
158
-                'kerberosConfig',
159
-                'kerberosKey',
160
-                'kerberos',
161
-                'kerberosService',
162
-                //'jdbcUrl',
163
-                'jdbcUserName',
164
-                'jdbcPassword'
165
-            ])
166
-        } else {
167
-            this.stores.updateState({
168
-                formData: {
169
-                    [key]: value
170
-                }
171
-            })
172
-        }
173
-    }
174
-
175
-    // 判断是否清空数据源密码
176
-    getValueFromEvent(e) {
177
-        let newValue = e.target.value
178
-        let {
179
-            formData: { originPassword }
180
-        } = toJS(this.stores.state)
181
-        if (originPassword != '') {
182
-            newValue = ''
183
-            originPassword = ''
184
-            const { setFieldsValue } = this.props.form
185
-            setFieldsValue({ jdbcPassword: '' })
186
-        }
187
-        this.stores.updateState({
188
-            formData: {
189
-                connectionStatus: '',
190
-                jdbcPassword: newValue,
191
-                originPassword: originPassword
192
-            }
193
-        })
194
-        return newValue
195
-    }
196
-
197
-    // 渲染新增修改表单
198
-    renderForm() {
199
-        const { getFieldDecorator } = this.props.form
200
-        const { formData = {} } = toJS(this.stores.state)
201
-
202
-        return (
203
-            <Form layout="horizontal" labelCol={{ span: 5 }} wrapperCol={{ span: 19 }}>
204
-
205
-                <FormItem label="文件名称">
206
-                    {getFieldDecorator('name', {
207
-                        rules: [
208
-                            { required: true, message: '请输入文件名称' },
209
-                            { max: 32, message: '最多只能输入32个字' }
210
-                        ],
211
-                        initialValue: formData.name
212
-                    })(
213
-                        <Input
214
-                            /* disabled={formData.id ? true : false} */
215
-                            placeholder="请输入文件名称,32个字"
216
-                            onChange={(e) => this.inputChange('name', e.target.value)}
217
-                        />
218
-                    )}
219
-                </FormItem>
220
-                <FormItem label="分类">
221
-                    {getFieldDecorator('type', {
222
-                        rules: [
223
-                            { required: true, message: '请输入分类' },
224
-                        ],
225
-                        initialValue: formData.type
226
-                    })(
227
-                        <Input
228
-                            /* disabled={formData.id ? true : false} */
229
-                            placeholder="请输入分类,32个字"
230
-                            onChange={(e) => this.inputChange('type', e.target.value)}
231
-                        />
232
-                    )}
233
-                </FormItem>
234
-                <FormItem label='表名'>
235
-                    {getFieldDecorator('jdbcUrl', {
236
-                        rules: [{ required: true, message: '请输入表名' }],
237
-                        initialValue: formData.jdbcUrl
238
-                    })(
239
-                        <Input
240
-                            placeholder={'请输入表名'}
241
-                            onChange={(e) => this.inputChange('jdbcUrl', e.target.value)}
242
-                        />
243
-                    )}
244
-                </FormItem>
245
-
246
-                <FormItem label="数据源名称">
247
-                    {getFieldDecorator('defaultDb', {
248
-                        rules: [
249
-                            {
250
-                                required: formData.dbType == '2' ? false : true,
251
-                                message: '请输入数据源名称'
252
-                            }
253
-                        ],
254
-                        initialValue: formData.defaultDb
255
-                    })(<Input placeholder="请输入数据源名称" onChange={(e) => this.inputChange('defaultDb', e.target.value)} />)}
256
-                </FormItem>
257
-
258
-                <FormItem label="数据源连接">
259
-                    {getFieldDecorator('kerberos', {
260
-                        rules: [
261
-                            {
262
-                                required: true,
263
-                                message: '请输入数据源连接'
264
-                            }
265
-                        ],
266
-                        initialValue: formData.kerberos
267
-                    })(
268
-                        <Input
269
-                            placeholder="Kerberos认证数据源连接名,比如XXXX/Hadoopclient@xxx.xxx"
270
-                            onChange={(e) => this.inputChange('kerberos', e.target.value)}
271
-                        />
272
-                    )}
273
-                </FormItem>
274
-
275
-                <FormItem label="数据源账号">
276
-                    {getFieldDecorator('jdbcUserName', {
277
-                        rules: [{ required: false, message: '请输入数据源账号' }],
278
-                        initialValue: formData.jdbcUserName
279
-                    })(<Input placeholder="请输入数据源账号" onChange={(e) => this.inputChange('jdbcUserName', e.target.value)} />)}
280
-                </FormItem>
281
-                <FormItem label="数据源密码">
282
-                    {getFieldDecorator('jdbcPassword', {
283
-                        rules: [{ required: false, message: '请输入数据源密码' }],
284
-                        initialValue: formData.jdbcPassword,
285
-                        getValueFromEvent: (e) => this.getValueFromEvent(e)
286
-                    })(<Input type="jdbcpassword" placeholder="请输入数据源密码" />)}
287
-                </FormItem>
288
-
289
-                <FormItem label="业务表建表数据">
290
-                    {getFieldDecorator('kerberosService', {
291
-                        rules: [{ required: true, message: '请输入kerberos业务表建表数据' }],
292
-                        initialValue: formData.kerberosService
293
-                    })(
294
-                        <Input
295
-                            placeholder="请输入kerberos业务表建表数据"
296
-                            onChange={(e) => this.inputChange('kerberosService', e.target.value)}
297
-                        />
298
-                    )}
299
-                </FormItem>
300
-            </Form>
301
-        )
302
-    }
303
-
304
-    handleCancel() {
305
-        this.stores.updateState({ visible: false })
306
-        this.props.form.resetFields(this.state.resetRoom)
307
-    }
308
-
309
-    handleOk() {
310
-        const { validateFieldsAndScroll } = this.props.form
311
-        const { formData } = toJS(this.stores.state)
312
-        validateFieldsAndScroll((err, valus) => {
313
-            if (isEmpty(err)) {
314
-                //formData.jdbcPassword = Encrypt(formData.jdbcPassword)
315
-                formData.jdbcPassword = formData.originPassword ? formData.jdbcPassword : Encrypt(formData.jdbcPassword)
316
-                delete formData.kerberos
317
-                delete formData.connectionStatus
318
-                // Encrypt(formData.jdbcPassword)
319
-                if (formData.id) {
320
-                    formData.dsId = formData.id
321
-                    this.stores.updateDs(formData, () => {
322
-                        this.props.form.resetFields(this.state.resetRoom)
323
-                        this.loadRoles()
324
-                    })
325
-                } else {
326
-                    this.stores.addDs(formData, () => {
327
-                        this.props.form.resetFields(this.state.resetRoom)
328
-                        this.loadRoles()
329
-                    })
330
-                }
331
-            }
332
-        })
333
-    }
334
-    renderModalFooter() {
335
-        const { loading, formData } = this.stores.state
336
-
337
-        return (
338
-            <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
339
-                <div>
340
-                    <Button key="back" style={{ display: 'inline' }} onClick={() => this.handleCancel()}>
341
-                        取消
342
-                    </Button>
343
-
344
-                    <Button
345
-                        key="submit"
346
-                        type="primary"
347
-                        style={{ display: 'inline', marginLeft: '10px' }}
348
-                        loading={loading}
349
-                        onClick={() => this.handleOk()}
350
-                    >
351
-                        确定
352
-                    </Button>
353
-                </div>
354
-            </div>
355
-        )
356
-    }
357
-
358
-    getParam() {
359
-        const { searchParam, total, bizTableConfigId, total_ } = this.state;
360
-
361
-        return {
362
-            scroll: { x: 1000 },
363
-            pagination: {
364
-                onChange: (pageNum) => {
365
-                    searchParam.pageNum = pageNum;
366
-                    this.setState({ ...searchParam });
367
-                    this.loadRoles();
368
-                },
369
-                current: searchParam.pageNum,
370
-                pageSize: searchParam.pageSize,
371
-                total: Number(total),
372
-            },
373
-            columns: [
374
-                //key=one的表头
375
-                // {
376
-                //     title: '文件名称',
377
-                //     dataIndex: 'name'
378
-                // },
379
-                {
380
-                    title: '数据量',
381
-                    dataIndex: 'successNum',
382
-                },
383
-                {
384
-                    title: '状态',
385
-                    dataIndex: 'fillStatus',
386
-                    render: (data, row) => {
387
-                        return <span>{data == '0' ? '填报中' : (data == '1' ? '成功' : '失败')}</span>
388
-                    }
389
-                },
390
-                {
391
-                    title: '操作人',
392
-                    dataIndex: 'fillPerson'
393
-                },
394
-                {
395
-                    title: '操作时间',
396
-                    dataIndex: 'fillTime'
397
-                },
398
-                {
399
-                    title: '操作',
400
-                    // fixed: 'right',
401
-                    // width: 250,
402
-                    render: (val, record) => {
403
-                        let data = record;
404
-                        return (
405
-                            <span style={{ marginRight: "24px" }}>
406
-                                <span>
407
-                                    <a onClick={() => {
408
-                                        preRecordViewFillInData(data.bizTableResultId, {
409
-                                            pageNum: 1,
410
-                                            pageSize: total_.pageSize
411
-                                        }).then(({ data, resultCode }) => {
412
-                                            if (+resultCode === 0) {
413
-                                                let newData = data && data.data && data.data.length > 0 ? data.data : [];
414
-                                                this.setState({
415
-                                                    uploadList: newData, total_: {
416
-                                                        // total: data.total,
417
-                                                        pageNum: data.pageNum,
418
-                                                        pageSize: data.pageSize,
419
-                                                    }
420
-                                                })
421
-                                                if (newData && newData[0]) {
422
-                                                    this.setState({ fruitsuploadList: Object.keys(newData[0]) })
423
-                                                }
424
-                                            }
425
-                                            this.setState({ isShowFeedback: true })
426
-                                        })
427
-                                    }}
428
-                                    >数据预览</a>
429
-                                </span>
430
-
431
-                            </span>
432
-                        )
433
-                    }
434
-                }
435
-            ],
436
-            dataSource: toJS(this.stores.state.tableArr)
437
-
438
-        }
439
-    }
440
-    render() {
441
-        const { visible, createType, version } = this.stores.state;
442
-
443
-        const { isShowFeedback, total_, bizTableConfigId, uploadInfo, uploadList, fruitsuploadList } = this.state
444
-        const noticeTableOPt_modal = {
445
-            dataSource: uploadList,
446
-            columns: fruitsuploadList.map(x => {
447
-                return {
448
-                    dataIndex: x + "",
449
-                    key: x + "",
450
-                    title: x,
451
-                }
452
-            }),
453
-            pagination: false,
454
-            // pagination: {
455
-            //     showSizeChanger: false,
456
-            //     onChange: (pageNum) => {
457
-            //         preRecordViewFillInData(bizTableConfigId, {
458
-            //             pageNum: pageNum,
459
-            //             pageSize: total_.pageSize
460
-            //         }).then(({ data, resultCode }) => {
461
-            //             if (+resultCode === 0) {
462
-            //                 let newData = data && data.data && data.data.length > 0 ? data.data : [];
463
-            //                 this.setState({
464
-            //                     uploadList: newData, total_: {
465
-            //                         total: data.total,
466
-            //                         pageNum: data.pageNum,
467
-            //                         pageSize: data.pageSize,
468
-            //                     }
469
-            //                 })
470
-            //                 if (newData && newData[0]) {
471
-            //                     this.setState({ fruitsuploadList: Object.keys(newData[0]) })
472
-            //                 }
473
-            //             }
474
-            //         })
475
-            //             .catch((resultMsg) => {
476
-            //                 message.error(resultMsg);
477
-            //             });
478
-            //         // setTotal({
479
-            //         //   total: total.total,
480
-            //         //   pageNum: pageNum,
481
-            //         //   pageSize: total.pageSize,
482
-            //         // });
483
-            //     },
484
-            //     total: total_.total,
485
-            //     pageSize: total_.pageSize,
486
-            //     current: Number(total_.pageNum),
487
-            // },
488
-            scroll: { x: 1000 },
489
-        };
490
-
491
-        const param = this.getParam();
492
-
493
-        return (
494
-            <div className={styles.sys_account}>
495
-                {/* <div className="module_search">
496
-                    <div className="module_title space">查询条件</div>
497
-                    <Row type="flex" justify="start" align="middle">
498
-                        <Col>
499
-                            <span>分类:</span>
500
-                            <Input
501
-                                style={{ width: "180px" }}
502
-                                value={searchParam.roleName}
503
-                                placeholder="请输入分类"
504
-                                onChange={(e) => {
505
-                                    searchParam.name = e.target.value;
506
-                                    this.setState({ ...searchParam });
507
-                                }}
508
-                                onKeyDown={(e) => {
509
-                                    if (e.keyCode === 13) {
510
-                                        searchParam.pageNum = 1;
511
-                                        this.setState(searchParam);
512
-                                        this.loadRoles();
513
-                                    }
514
-                                }}
515
-                            ></Input>
516
-                        </Col>
517
-                        <Col offset={1}>
518
-                            <span>文件名称:</span>
519
-                            <Input
520
-                                style={{ width: "180px" }}
521
-                                value={searchParam.roleName2}
522
-                                placeholder="请输入文件名称"
523
-                                onChange={(e) => {
524
-                                    searchParam.roleName2 = e.target.value;
525
-                                    this.setState({ ...searchParam });
526
-                                }}
527
-                                onKeyDown={(e) => {
528
-                                    if (e.keyCode === 13) {
529
-                                        searchParam.pageNum = 1;
530
-                                        this.setState(searchParam);
531
-                                        this.loadRoles();
532
-                                    }
533
-                                }}
534
-                            ></Input>
535
-                        </Col>
536
-                    </Row>
537
-                    <Row type="flex" justify="end" align="middle">
538
-                        <Col>
539
-                            <Button
540
-                                type="primary"
541
-                                onClick={(e) => {
542
-                                    this.loadRoles();
543
-                                }}
544
-                            >
545
-                                搜索
546
-                            </Button>
547
-                        </Col>
548
-                        <Col>
549
-                            <Button
550
-                                // type="text"
551
-                                style={{ marginLeft: 14 }}
552
-                                onClick={(e) => {
553
-                                    searchParam.name = "";
554
-                                    searchParam.dbType = "";
555
-                                    searchParam.pageNum = 1;
556
-                                    this.setState({ ...searchParam });
557
-                                    this.loadRoles();
558
-                                }}
559
-                            >
560
-                                重置
561
-                            </Button>
562
-                        </Col>
563
-                    </Row>
564
-                </div> */}
565
-
566
-                <div className="module_body">
567
-                    <Button type="dashed" shape="round" style={{'margin-bottom': '10px'}} onClick={(e) => {
568
-                        this.props.history.push("/home/fileUploadNewView");
569
-                    }}>{this.state.str}</Button>
570
-                    <div className="title_with_btn list_top">
571
-                        <div className="module_title">上传记录</div>
572
-                    </div>
573
-                    <Table style={{ marginTop: "16px" }} {...param}></Table>
574
-                </div>
575
-
576
-
577
-                <Modal
578
-                    maskClosable={false}
579
-                    width="900px"
580
-                    title={createType === 'add' ? '新增文件' : '修改文件'}
581
-                    className={styles.DataSourceAddModal}
582
-                    visible={visible}
583
-                    onCancel={() => {
584
-                        this.stores.updateState({ visible: false })
585
-                        this.props.form.resetFields()
586
-                        // 延期清除表单数据,处理关闭时,闪烁问题
587
-                        setTimeout(() => {
588
-                            this.stores.restForm({})
589
-                        }, 100)
590
-                    }}
591
-                    footer={this.renderModalFooter()}
592
-                >
593
-                    {this.renderForm()}
594
-                </Modal>
595
-                <Modal
596
-                    width={900}
597
-                    title="文件上传"
598
-                    visible={isShowFeedback}
599
-                    onCancel={() => {
600
-                        this.setState({ isShowFeedback: false });
601
-                    }}
602
-                    footer={
603
-                        [
604
-                            <Button
605
-                                type="primary"
606
-                                key="feedback_1"
607
-                                onClick={() => {
608
-                                    this.setState({ isShowFeedback: false });
609
-                                }}
610
-                            >
611
-                                确定
612
-                            </Button>,
613
-                        ]
614
-                    }
615
-                >
616
-                    <Table {...noticeTableOPt_modal} />
617
-                </Modal>
618
-
619
-            </div>
620
-        )
621
-    }
622
-}
623
-export default Form.create()(FileUploadDetailView)
624
-// export default FileUploadDetailView;

+ 0 - 238
src/pages/fileUploadNew/api.js

@@ -1,238 +0,0 @@
1
-import request from "@utils/request";
2
-export const fileUrl =
3
-  window.location.origin +
4
-  window.location.pathname.split("/transfer")[0] +
5
-  (window.location.href.indexOf("/suggest-report") !== -1
6
-    ? ""
7
-    : "/suggest-report");
8
-
9
-//配置
10
-//同步部门数据到区域权限
11
-export function syncData() {
12
-  return request({
13
-    url: `suggest-report/api/data-resource/sync-department-data-resource`,
14
-    method: "post",
15
-  });
16
-}
17
-//可配置基地/leader/configurable-bases
18
-export function configurableBases() {
19
-  return request({
20
-    url: `suggest-report/api/leader/configurable-bases`,
21
-    method: "GET",
22
-  });
23
-}
24
-//用户列表/leader/users
25
-export function configurableUsers(params) {
26
-  return request({
27
-    url: `suggest-report/api/leader/users`,
28
-    method: "GET",
29
-    data: params,
30
-  });
31
-}
32
-//新增负责人
33
-export function leaderAdd(data) {
34
-  return request({
35
-    url: `suggest-report/api/leader/add`,
36
-    method: "post",
37
-    data,
38
-  });
39
-}
40
-//删除
41
-export function leaderDelete(data) {
42
-  return request({
43
-    url: `suggest-report/api/leader/delete`,
44
-    method: "post",
45
-    data,
46
-  });
47
-}
48
-//更新/leader/update
49
-export function leaderUpdate(data) {
50
-  return request({
51
-    url: `suggest-report/api/leader/update`,
52
-    method: "post",
53
-    data,
54
-  });
55
-}
56
-
57
-// 建议提报
58
-//建议类型
59
-export function reportCategories(data) {
60
-  return request({
61
-    url: `suggest-report/api/report/categories`,
62
-    method: "GET",
63
-    data,
64
-  });
65
-}
66
-//基地
67
-export function reportBases() {
68
-  return request({
69
-    url: `suggest-report/api/report/bases`,
70
-    method: "GET",
71
-  });
72
-}
73
-//部门
74
-export function reportDepartments() {
75
-  return request({
76
-    url: `suggest-report/api/report/report-departments`,
77
-    method: "GET",
78
-  });
79
-}
80
-//提报列表/report/page-and-count
81
-export function reportList(data) {
82
-  return request({
83
-    url: `suggest-report/api/report/page-and-count`,
84
-    method: "post",
85
-    data,
86
-  });
87
-}
88
-
89
-//提报主题
90
-export function reportSubjects() {
91
-  return request({
92
-    url: `suggest-report/api/report/subjects`,
93
-    method: "GET",
94
-  });
95
-}
96
-
97
-//新建提报
98
-export function reportSubmit(data) {
99
-  return request({
100
-    url: `suggest-report/api/report/submit`,
101
-    method: "post",
102
-    data,
103
-  });
104
-}
105
-
106
-//提报详情 /report/detail
107
-export function reportDetail(params) {
108
-  return request({
109
-    url: `suggest-report/api/report/detail`,
110
-    method: "GET",
111
-    data: params,
112
-  });
113
-}
114
-//撤回提报/report/revocation
115
-export function reportRevocation(data) {
116
-  return request({
117
-    url: `suggest-report/api/report/revocation`,
118
-    method: "post",
119
-    data,
120
-  });
121
-}
122
-//提报人信息
123
-// 提报人ID,为空时默认当前用户,reporterId?: number;
124
-export function reportInfo() {
125
-  return request({
126
-    url: `suggest-report/api/report/reporter-info`,
127
-    method: "GET",
128
-  });
129
-}
130
-
131
-//审核
132
-//主负责部门
133
-export function dutyDepartments(data) {
134
-  return request({
135
-    url: `suggest-report/api/report/duty-departments`,
136
-    method: "GET",
137
-    data,
138
-  });
139
-}
140
-//主责任人/report/duty-persons
141
-export function dutyPersons(params) {
142
-  return request({
143
-    url: `suggest-report/api/report/duty-persons`,
144
-    method: "GET",
145
-    data: params,
146
-  });
147
-}
148
-//常用意见列表
149
-export function reportAdvices(params) {
150
-  return request({
151
-    url: `suggest-report/api/report/common-advices`,
152
-    method: "GET",
153
-    data: params,
154
-  });
155
-}
156
-//归口部门复核
157
-export function reportRecheck(data) {
158
-  return request({
159
-    url: `suggest-report/api/report/recheck`,
160
-    method: "post",
161
-    data,
162
-  });
163
-}
164
-//责任部门评审/report/duty-approval
165
-export function dutyApproval(data) {
166
-  return request({
167
-    url: `suggest-report/api/report/duty-approval`,
168
-    method: "post",
169
-    data,
170
-  });
171
-}
172
-//总经理审批/report/general-manager-approval
173
-export function generalManagerApproval(data) {
174
-  return request({
175
-    url: `suggest-report/api/report/general-manager-approval`,
176
-    method: "post",
177
-    data,
178
-  });
179
-}
180
-//实施总结/report/improvement-sum-up
181
-export function improvementSumUp(data) {
182
-  return request({
183
-    url: `suggest-report/api/report/improvement-sum-up`,
184
-    method: "post",
185
-    data,
186
-  });
187
-}
188
-//验收/report/finally-check
189
-export function finallyCheck(data) {
190
-  return request({
191
-    url: `suggest-report/api/report/finally-check`,
192
-    method: "post",
193
-    data,
194
-  });
195
-}
196
-//默认奖金金额/report/default-bonus-amount
197
-export function defaultBonusAmount(data) {
198
-  return request({
199
-    url: `suggest-report/api/report/default-bonus-amount`,
200
-    method: "get",
201
-    data,
202
-  });
203
-}
204
-//采纳奖金/report/accept-bonus-check
205
-export function acceptBonusCheck(data) {
206
-  return request({
207
-    url: `suggest-report/api/report/accept-bonus-check`,
208
-    method: "post",
209
-    data,
210
-  });
211
-}
212
-//评优奖金/report/appraise-bonus-check
213
-export function appraiseBonusCheck(data) {
214
-  return request({
215
-    url: `suggest-report/api/report/appraise-bonus-check`,
216
-    method: "post",
217
-    data,
218
-  });
219
-}
220
-//结果评优/report/appraise
221
-export function reportAppraise(data) {
222
-  return request({
223
-    url: `suggest-report/api/report/appraise`,
224
-    method: "post",
225
-    data,
226
-  });
227
-}
228
-
229
-
230
-
231
-//负责人列表/leader/page
232
-export function leaderPage(data) {
233
-  return request({
234
-    url: `api/biz/table/role/relation/queryBizTableConfigs?bizTableConfigName=&bizTableKey=`,
235
-    method: "get",
236
-    data,
237
-  });
238
-}

+ 0 - 151
src/pages/fileUploadNew/components/index.jsx

@@ -1,151 +0,0 @@
1
-import React, { useEffect, useRef, useState } from "react";
2
-
3
-import { useHistory, useLocation } from "react-router-dom";
4
-import { Button, Modal, Form, Select, message } from "antd";
5
-import ProTable from "@ant-design/pro-table";
6
-// import ConfigurationModal from "../components/ConfigurationModal";
7
-import { leaderDelete, leaderPage, syncData } from "../api";
8
-const ConfigurationPerson = () => {
9
-    const [form] = Form.useForm();
10
-
11
-    const [isModalOpen, setIsModalOpen] = useState(false);
12
-    const [modalType, setModalType] = useState(true); //true:新增,false:更新
13
-    const [modalData, setModalData] = useState({});
14
-    const [syncLoading, setSyncLoading] = useState(false);
15
-    const actionRef = useRef();
16
-    //新建
17
-    const showModal = () => {
18
-        setModalType(true);
19
-        setModalData({});
20
-        setIsModalOpen(true);
21
-    };
22
-
23
-    const handleCancel = (refresh) => {
24
-        setIsModalOpen(false);
25
-        setModalData(null);
26
-        //刷新
27
-        if (refresh) {
28
-            actionRef.current.reload();
29
-        }
30
-    };
31
-    //修改
32
-    const updateClick = (row) => {
33
-        setModalType(false);
34
-        setModalData(row);
35
-        setIsModalOpen(true);
36
-    };
37
-    //删除
38
-    const deleteClick = (row) => {
39
-        Modal.confirm({
40
-            title: "温馨提示",
41
-            content: "您确定要删除该数据吗?",
42
-            onOk: () => {
43
-                //单条数据删除
44
-                leaderDelete({ ids: [row.id] }).then((res) => {
45
-                    message.success("删除成功");
46
-                    actionRef.current.reload();
47
-                });
48
-            },
49
-        });
50
-    };
51
-    const columns = [
52
-        {
53
-            title: "文件名称",
54
-            dataIndex: "baseName",
55
-            search: false,
56
-        },
57
-        {
58
-            title: "导入批次",
59
-            dataIndex: "type",
60
-            valueEnum: {
61
-                1: { text: "归口部门" },
62
-                3: { text: "基地总经理" },
63
-                4: { text: "基地体系管理员" },
64
-            },
65
-        },
66
-        {
67
-            title: "修改人",
68
-            dataIndex: "bizTableConfigId",
69
-            // valueType: 'dateRange',
70
-            // hideInTable: true,
71
-            // search: {
72
-            //   transform: (value) => {
73
-            //     return {
74
-            //       startTime: value[0],
75
-            //       endTime: value[1],
76
-            //     };
77
-            //   },
78
-            // },
79
-        },
80
-        {
81
-            title: "修改时间",
82
-            dataIndex: "userName",
83
-            search: false,
84
-        },
85
-        //     {
86
-        //   title: "操作",
87
-        //   key: "option",
88
-        //   valueType: "option",
89
-        //   render: (_, it) => [
90
-        //     <Button key="delete" type="link" onClick={() => deleteClick(it)}>
91
-        //       删除
92
-        //     </Button>,
93
-        //     <Button key="link2" type="link" onClick={() => updateClick(it)}>
94
-        //       修改
95
-        //     </Button>,
96
-        //   ],
97
-        // },
98
-    ];
99
-
100
-    return (
101
-        <>
102
-            <div>
103
-                <ProTable
104
-                    actionRef={actionRef}
105
-                    request={(params) => {
106
-                        params.pageNum = params.current;
107
-                        delete params.current;
108
-                        return leaderPage(params).then((res) => {
109
-                            if (res.resultCode === "0") {
110
-                                return {
111
-                                    data: res?.data,
112
-                                    success: true,
113
-                                    total: res.data.length,
114
-                                };
115
-                            }
116
-                        });
117
-                    }}
118
-                    rowKey="id"
119
-                    options={false}
120
-                    columns={columns}
121
-                    // search={{
122
-                    //     labelWidth: 'auto',
123
-                    // }}
124
-                    search={false}
125
-                    dateFormatter="string"
126
-                    headerTitle=""
127
-                    toolBarRender={() => [
128
-                        // <Button type="primary" key="new" onClick={showModal}>
129
-                        //   新建
130
-                        // </Button>,
131
-                        // <Button
132
-                        //   type="primary"
133
-                        //   key="synchronous"
134
-                        //   loading={syncLoading}
135
-                        //   onClick={() => {
136
-                        //     setSyncLoading(true);
137
-                        //     syncData().then((res) => {
138
-                        //       setSyncLoading(false);
139
-                        //       message.success("同步成功");
140
-                        //     });
141
-                        //   }}
142
-                        // >
143
-                        //   同步区域权限
144
-                        // </Button>,
145
-                    ]}
146
-                />
147
-            </div>
148
-        </>
149
-    );
150
-};
151
-export default ConfigurationPerson;

+ 0 - 105
src/pages/fileUploadNew/fileUploadNewLess.less

@@ -1,105 +0,0 @@
1
-// 其中assets文件夹已经做了webpack别名配置,不需要再使用../../访问,直接加个波浪线
2
-
3
-.sys_account {
4
-  min-width: 1000px; //设置内容区域最小宽度为1000px,防止表格不断被挤压重叠
5
-
6
-  :global {
7
-    .timeSetting {
8
-      .ant-time-picker {
9
-        width: 110px;
10
-        margin: 0px 4px;
11
-      }
12
-
13
-      .saveBtn {
14
-        cursor: pointer;
15
-        padding-right: 4px;
16
-      }
17
-
18
-      .closeBtn {
19
-        cursor: pointer;
20
-      }
21
-
22
-      .editBtn {
23
-        cursor: pointer;
24
-      }
25
-    }
26
-
27
-    //此处主要是使表格内滚动能根据屏幕高度自适应
28
-    .ant-table-fixed-header>.ant-table-container>.ant-table-body {
29
-      max-height: calc(100vh - 330px) !important
30
-    }
31
-
32
-    //处理Badge,与按钮,不对齐
33
-    .ant-table-tbody .yx_table_row_tr td .table_cell_box .ant-typography {
34
-      line-height: 20px;
35
-      height: 20px;
36
-    }
37
-  }
38
-}
39
-
40
-.sys_account {
41
-  :global {
42
-    background-color: #fff;
43
-    padding: 12px 16px 16px 16px;
44
-    .module_search,
45
-    .module_line {
46
-      border-bottom: 8px solid #f5f5f5;
47
-      padding-bottom: 20px;
48
-    }
49
-    
50
-    .cursor {
51
-      cursor: pointer;
52
-    }
53
-
54
-    .col_blue {
55
-      color: #009F95;
56
-    }
57
-
58
-    .flex {
59
-      display: flex;
60
-    }
61
-
62
-    .module_body {
63
-      .list_top {
64
-        display: flex;
65
-        justify-content: space-between;
66
-
67
-        .module_button_area {
68
-          button {
69
-            float: right;
70
-            margin-left: 10px;
71
-          }
72
-        }
73
-      }
74
-    }
75
-
76
-    .ckxq_but {
77
-      cursor: pointer;
78
-      color: skyblue;
79
-    }
80
-
81
-  }
82
-}
83
-
84
-.DataSourceAddModal {
85
-  :global {
86
-    .ant-form-item-children>div {
87
-      display: inline-block !important;
88
-    }
89
-
90
-    .ant-form-explain {
91
-      font-weight: 400;
92
-      font-size: 12px;
93
-      line-height: normal;
94
-      color: #e54747;
95
-      padding-top: 4px;
96
-    }
97
-
98
-    .has-error .ant-input,
99
-    .has-error .ant-select-selector {
100
-      color: rgba(0, 0, 0, 0.6);
101
-      background-color: #fff;
102
-      border: 1px #e54747 solid;
103
-    }
104
-  }
105
-}

+ 0 - 339
src/pages/fileUploadNew/fileUploadNewMod.js

@@ -1,339 +0,0 @@
1
-// 状态管理方法
2
-import { observable, action, configure, runInAction, autorun, toJS, computed, makeObservable } from 'mobx'
3
-// 工具方法
4
-import { isEqual, cloneDeep, trim, get } from 'lodash'
5
-// 引入Serv
6
-import Serv from './fileUploadNewServ'
7
-import { message } from 'antd'
8
-
9
-
10
-// 严格模式
11
-configure({
12
-  enforceActions: 'observed'
13
-});
14
-
15
-const defaultForm = {
16
-  id: '',
17
-  dataSourceName: '',
18
-  dataSourceType: undefined,
19
-  remarks: '',
20
-  jdbcUrl: '',
21
-  userName: '',
22
-  passWord: '',
23
-  originPassword: '',
24
-  connectionStatus: '',
25
-  defaultDb: '',
26
-  kerberos: false,
27
-  kerberosConfig: '',
28
-  kerberosConfigFileName: '',
29
-  kerberosKey: '',
30
-  kerberosKeyFileName: '',
31
-  kerberosPrincipal: '',
32
-  kerberosService: '',
33
-  defaultFs: '',
34
-  configuration: ''
35
-}
36
-
37
-/**
38
- * mod层 - 业务逻辑,数据逻辑应该存储于此
39
- */
40
-class FileUploadNewMod {
41
-  constructor() {
42
-    makeObservable(this);
43
-  }
44
-
45
-  // 监视状态
46
-  @observable state = {
47
-    visible: false,
48
-    createType: 'add', //创建类型,add:新增,edit:修改
49
-    formData: cloneDeep(defaultForm),
50
-    version: '',
51
-    loading: false,
52
-    dbTypeList: [],
53
-    confList: [], //配置文件列表
54
-    keytabList: [], //证书文件列表
55
-    tableArr: []
56
-  }
57
-
58
-  /*
59
-   * 如果设定了useStrict严格模式,那么所有observable的值的修改必须在action定义的方法内,否则可以直接修改
60
-   * 设置内容可视性
61
-   */
62
-  @action updateState = async (payload) => {
63
-    // 设置到状态机 - 如果是异步,必须在runInAction
64
-    runInAction(() => {
65
-      this.state = {
66
-        ...this.state,
67
-        ...payload,
68
-        formData: {
69
-          ...this.state.formData,
70
-          ...payload.formData
71
-        }
72
-      }
73
-    })
74
-    /*
75
-     * Mod中跳转使用  window.app.router.push(url);
76
-     * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
77
-     */
78
-    autorun(() => {
79
-      // console.info("visible: ", this.state.visible);
80
-    })
81
-  }
82
-  // 重置from表单
83
-  @action restForm = async (payload) => {
84
-    this.state.formData = cloneDeep(defaultForm)
85
-    /*
86
-     * Mod中跳转使用  window.app.router.push(url);
87
-     * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
88
-     */
89
-    autorun(() => {
90
-      // console.info("visible: ", this.state.visible);
91
-    })
92
-  }
93
-  // 创建数据源
94
-  @action addDs = async (payload, _callbck) => {
95
-    // 请求参数
96
-    const params = payload
97
-    try {
98
-      // 异步请求方法
99
-      this.updateState({ loading: true })
100
-      const { resultCode, resultMsg, data } = await Serv.addDs(params)
101
-      this.updateState({ loading: false })
102
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
103
-      if (resultMsg == 'success') {
104
-        this.updateState({ version: +new Date(), visible: false })
105
-        message.success('保存成功!')
106
-        if (_callbck) {
107
-          _callbck()
108
-        }
109
-      } else {
110
-        message.warn(resultMsg)
111
-      }
112
-    } catch (error) {
113
-      this.updateState({ loading: false })
114
-      //message.error({ content: '发生异常,保存失败!' })
115
-    }
116
-  }
117
-
118
-  /**
119
-   * 记录下载操作的日志
120
-   */
121
-  @action recordLogOfDownload = async (params, callback) => {
122
-    try {
123
-      const res = await Serv.recordLogOfDownload(params);
124
-      const { resultCode, resultMsg, data } = res;
125
-      const fileName = decodeURI(res.headers['content-disposition'].split(";")[1].split("filename=")[1]);
126
-      callback && callback(data, fileName)
127
-    } catch (error) {
128
-      // message.error('请求异常!')
129
-    }
130
-  }
131
-
132
-
133
-  // 获取数据源类型
134
-  @action queryDbType = async (payload) => {
135
-    // 请求参数
136
-    const params = payload
137
-    try {
138
-      // 异步请求方法
139
-      const { resultCode, resultMsg, data } = await Serv.queryDbType(params)
140
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
141
-      if (resultMsg == 'success') {
142
-        const dbTypeList = data ? data : []
143
-        this.updateState({
144
-          dbTypeList: dbTypeList
145
-        })
146
-      }
147
-    } catch (error) { }
148
-  }
149
-
150
-  // 分页查询数据源信息
151
-  @action pageQueryDsInfoMod = async (payload, callback) => {
152
-    // 请求参数
153
-    const params = payload
154
-    try {
155
-      // 异步请求方法
156
-      const { resultCode, resultMsg, data } = await Serv.pageQueryDsInfo(params)
157
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
158
-      if (resultCode == '0') {
159
-        const tableArr = data ? data : []
160
-        this.updateState({
161
-          tableArr: tableArr
162
-        })
163
-        callback && callback(data.total)
164
-      }
165
-    } catch (error) { }
166
-  }
167
-
168
-
169
-  // 修改数据源
170
-  @action updateDs = async (payload, _callbck) => {
171
-    // 请求参数
172
-    const params = payload
173
-    try {
174
-      // 异步请求方法
175
-      this.updateState({ loading: true })
176
-      const { resultCode, resultMsg, data } = await Serv.updateDs(params)
177
-      this.updateState({ loading: false })
178
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
179
-      if (resultMsg == 'success') {
180
-        this.updateState({ version: +new Date(), visible: false })
181
-        message.success('保存成功!')
182
-        if (_callbck) {
183
-          _callbck()
184
-        }
185
-      } else {
186
-        message.warn(resultMsg)
187
-      }
188
-    } catch (error) {
189
-      this.updateState({ loading: false })
190
-      //message.error({ content: '发生异常,保存失败!' })
191
-    }
192
-  }
193
-  // 删除数据源记录
194
-  @action deleteDs = async (payload, callback) => {
195
-    // 请求参数
196
-    const params = payload
197
-    message.destroy()
198
-    const loaddingDialog = message.loading('删除中,请稍等...', 0)
199
-    try {
200
-      // 异步请求方法
201
-      const { resultCode, resultMsg, data } = await Serv.deleteDs(params)
202
-      setTimeout(loaddingDialog, 0)
203
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
204
-      if (resultMsg == 'success') {
205
-        message.success('删除成功!')
206
-        callback && callback()
207
-      } else {
208
-        message.warn(resultMsg || '删除失败!')
209
-      }
210
-    } catch (error) {
211
-      setTimeout(loaddingDialog, 0)
212
-      //message.error({ content: '发生异常,删除失败!', key: 'deleteDs' })
213
-    }
214
-  }
215
-
216
-  // 测试数据源连通性
217
-  @action testDs = async (payload, _callbck) => {
218
-    // 请求参数
219
-    const params = payload
220
-    message.destroy()
221
-    const loaddingDialog = message.loading('测试中,请稍等...', 0)
222
-    try {
223
-      // 异步请求方法
224
-      const { resultCode, resultMsg, data } = await Serv.testDs(params)
225
-      setTimeout(loaddingDialog, 0)
226
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
227
-      if (resultMsg == 'success') {
228
-        message.success('测试成功!')
229
-        if (_callbck) {
230
-          _callbck(resultCode)
231
-        }
232
-      } else {
233
-        if (_callbck) {
234
-          _callbck()
235
-        }
236
-        message.warn('链接失败!')
237
-      }
238
-    } catch (error) {
239
-      setTimeout(loaddingDialog, 0)
240
-      if (_callbck) {
241
-        _callbck()
242
-      }
243
-      //message.error({ content: '发生异常,操作失败!', key: 'testDs' })
244
-    }
245
-  }
246
-  // 潍柴项目设置调度时间
247
-  @action setDataSourceTask = async (payload, _callbck) => {
248
-    // 请求参数
249
-    const params = payload
250
-    try {
251
-      message.loading({ content: '设置中,请稍等...', key: 'setDataSourceTask' })
252
-      // 异步请求方法
253
-      const { resultCode, resultMsg, data } = await Serv.setDataSourceTask(params)
254
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
255
-      if (resultMsg == 'success') {
256
-        this.updateState({ version: +new Date() })
257
-        message.success({ content: '设置成功!', key: 'setDataSourceTask' })
258
-        if (_callbck) {
259
-          _callbck(resultMsg)
260
-        }
261
-      } else {
262
-        if (_callbck) {
263
-          _callbck()
264
-        }
265
-        message.warn({ content: '设置失败!', key: 'setDataSourceTask' })
266
-      }
267
-    } catch (error) {
268
-      if (_callbck) {
269
-        _callbck()
270
-      }
271
-      //message.error({ content: '发生异常,操作失败!', key: 'setDataSourceTask' })
272
-    }
273
-  }
274
-  // 潍柴手动同步数据源信息
275
-  @action manualSyncDataSourceMeta = async (payload, _callbck) => {
276
-    // 请求参数
277
-    const params = payload
278
-    try {
279
-      //message.loading({ content: '设置中,请稍等...', key: 'manualSyncDataSourceMeta' })
280
-      const loaddingDialog = message.loading('设置中,请稍等...', 5)
281
-      // 异步请求方法
282
-      const { resultCode, resultMsg, data } = await Serv.manualSyncDataSourceMeta(params)
283
-      setTimeout(loaddingDialog, 0)
284
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
285
-      if (resultMsg == 'success') {
286
-        /*
287
-         * 设置成功,不需要进行提示
288
-         * message.success({ content: '设置成功!', key: 'manualSyncDataSourceMeta' })
289
-         */
290
-        if (_callbck) {
291
-          _callbck(resultMsg)
292
-        }
293
-      } else {
294
-        if (_callbck) {
295
-          _callbck()
296
-        }
297
-        message.warn({ content: '设置失败!', key: 'manualSyncDataSourceMeta' })
298
-      }
299
-    } catch (error) {
300
-      if (_callbck) {
301
-        _callbck()
302
-      }
303
-      //message.error({ content: '发生异常,操作失败!', key: 'manualSyncDataSourceMeta' })
304
-    }
305
-  }
306
-  // 潍柴获取数据源同步状态
307
-  @action queryDsSyncStatus = async (payload, _callbck) => {
308
-    // 请求参数
309
-    const params = payload
310
-    try {
311
-      // 异步请求方法
312
-      const { resultCode, resultMsg, data } = await Serv.queryDsSyncStatus(params)
313
-      // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
314
-      if (resultMsg == 'success') {
315
-        if (data && data.latestSyncStatus == 'success') {
316
-          message.success({ content: '数据同步成功!' })
317
-        } else if (data && data.latestSyncStatus == 'fail') {
318
-          message.success({ content: '数据同步失败!' })
319
-        }
320
-        if (_callbck) {
321
-          _callbck(resultMsg, data)
322
-        }
323
-      } else {
324
-        if (_callbck) {
325
-          _callbck()
326
-        }
327
-      }
328
-    } catch (error) {
329
-      if (_callbck) {
330
-        _callbck()
331
-      }
332
-      //message.error({ content: '发生异常,操作失败!', key: 'manualSyncDataSourceMeta' })
333
-    }
334
-  }
335
-}
336
-
337
-// 将组件实例化,这意味着组件将不能从别处实例化
338
-const fileUploadNewMod = new FileUploadNewMod()
339
-export default fileUploadNewMod

+ 0 - 126
src/pages/fileUploadNew/fileUploadNewServ.js

@@ -1,126 +0,0 @@
1
-import request from '@utils/request'
2
-
3
-export default class {
4
-  //创建数据源
5
-  static addDs(params) {
6
-    return request({
7
-      url: 'api/biz/table/config/insertBizTableConfigEntity',
8
-      method: 'POST',
9
-      data: params,
10
-      headers: {
11
-        'Content-type': 'application/json'
12
-      },
13
-      // 对应后端的应用工程名
14
-      app: 'ide-op-mgmt-application'
15
-      //isLocMock: true
16
-    })
17
-  }
18
-
19
-  /**
20
- * 记录下载操作的日志
21
- */
22
-  static recordLogOfDownload(params) {
23
-    return request({
24
-      url: `api/biz/table/config/downloadTempFile/${params}`,
25
-      method: 'POST',
26
-      responseType: 'arraybuffer',
27
-      // data: params,
28
-      headers: {
29
-        'Content-type': 'application/json'
30
-      },
31
-      // 对应后端的应用工程名
32
-      app: 'ide-op-mgmt-application'
33
-    })
34
-  }
35
-
36
-  //更新数据源
37
-  static updateDs(params) {
38
-    return request({
39
-      url: 'api/biz/table/config/updateBizTableConfigEntity',
40
-      method: 'POST',
41
-      data: params,
42
-      headers: {
43
-        'Content-type': 'application/json'
44
-      },
45
-      // 对应后端的应用工程名
46
-      app: 'ide-op-mgmt-application'
47
-      //isLocMock: true
48
-    })
49
-  }
50
-  // 删除数据源
51
-  static deleteDs(params) {
52
-    return request({
53
-      url: 'api/os/datasource/info/deleteById/' + params.id,
54
-      method: 'DELETE',
55
-      //data: params,
56
-      app: 'ide-op-mgmt-application'
57
-      //isLocMock: true
58
-    })
59
-  }
60
-  // 测试数据源连通性
61
-  static testDs(params) {
62
-    return request({
63
-      url: 'api/os/datasource/info/testConnect',
64
-      method: 'POST',
65
-      data: params,
66
-      headers: {
67
-        'Content-type': 'application/json'
68
-      },
69
-      // 对应后端的应用工程名
70
-      app: 'ide-op-mgmt-application'
71
-      //isLocMock: true
72
-    })
73
-  }
74
-  // 查询数据源类型
75
-  static queryDbType(params) {
76
-    return request({
77
-      url: 'api/biz/table/config/queryDsListForBizConf',
78
-      method: 'GET',
79
-      // 对应后端的应用工程名
80
-      app: 'ide-op-mgmt-application'
81
-      //isLocMock: true
82
-    })
83
-  }
84
-
85
-  // 查询数据源类型
86
-  static pageQueryDsInfo(params) {
87
-    return request({
88
-      url: `api/biz/table/role/relation/queryBizTableConfigs?bizTableConfigName=${params.bizTableConfigName}&bizTableKey=${params.bizTableKey}`,
89
-      method: 'get',
90
-      // data: params,
91
-      // 对应后端的应用工程名
92
-      app: 'ide-op-mgmt-application'
93
-      //isLocMock: true
94
-    })
95
-  }
96
-
97
-  //潍柴项目,设置调度任务
98
-  static setDataSourceTask(params) {
99
-    return request({
100
-      url: 'api/os/datasource/info/setDataSourceTask',
101
-      method: 'POST',
102
-      data: params,
103
-      headers: {
104
-        'Content-type': 'application/json'
105
-      }
106
-    })
107
-  }
108
-
109
-  //潍柴项目,手动同步数据源
110
-  static manualSyncDataSourceMeta(params) {
111
-    return request({
112
-      url: 'api/os/datasource/info/manualSyncDataSourceMeta?dsId=' + params.dsId,
113
-      method: 'GET',
114
-      headers: {
115
-        'Content-type': 'application/json'
116
-      }
117
-    })
118
-  }
119
-  //潍柴项目,获取数据源同步状态
120
-  static queryDsSyncStatus(params) {
121
-    return request({
122
-      url: `api/os/datasource/info/queryDetail/${params}`,
123
-      method: 'GET',
124
-    })
125
-  }
126
-}

+ 0 - 823
src/pages/fileUploadNew/fileUploadNewView.jsx

@@ -1,823 +0,0 @@
1
-/*
2
-    新-文件上传
3
- * @Author: dayan_hjm 
4
- * @Date: 2022-12-20 10:27:48 
5
- * @Last Modified by: dayan_hjm
6
- * @Last Modified time: 2023-08-22 15:03:16
7
- */
8
-
9
-
10
-import React, { Component } from "react";
11
-import { useHistory, useLocation, withRouter } from "react-router-dom";
12
-import { Table, Button, Badge, Modal, Input, Select, message, Tooltip, Radio, Upload, TimePicker, Row, Col } from 'antd'
13
-import { Form } from '@ant-design/compatible';
14
-import { QuestionCircleOutlined, UploadOutlined, EditOutlined, CloseOutlined, DeleteOutlined } from '@ant-design/icons';
15
-import '@ant-design/compatible/assets/index.css';
16
-import { observer } from 'mobx-react'
17
-import { isEmpty, uniqueId } from 'lodash'
18
-import { Encrypt, Decrypt } from "@utils/util"
19
-import moment from 'moment'
20
-const FormItem = Form.Item;
21
-const { TextArea } = Input;
22
-import {
23
-    getAllTableConfigs, // 文件上传分页
24
-    preViewFillInData
25
-} from "@apis/system";
26
-
27
-// 站点配置
28
-import config from '@config/config';
29
-
30
-// 引入当前页样式 - 模块化
31
-import styles from './fileUploadNewless.less'
32
-// 多类名样式管理工具
33
-import { toJS } from 'mobx'
34
-import fileUploadNewMod from './fileUploadNewMod';
35
-import ConfigurationPerson from './components/index'
36
-
37
-@withRouter
38
-class FileUploadNewView extends Component {
39
-    // 构造函数,组件的实例创建时,最先执行
40
-    constructor(props, context) {
41
-        super(props, context)
42
-        // 注入的FileUploadNewMod
43
-        this.stores = fileUploadNewMod;
44
-        this.state = {
45
-            sqlInitialValue: `CREATE TABLE data_example (
46
-                data_example_name varchar(32) DEFAULT NULL COMMENT '样例字段名称',
47
-                data_example_type varchar(32) DEFAULT NULL COMMENT '样例类型',
48
-                create_person varchar(32) DEFAULT NULL COMMENT '创建人',
49
-                update_person varchar(32) DEFAULT NULL COMMENT '更新人'
50
-) ENGINE=InnoDB COMMENT='样例表';`,
51
-            uploadInfo: {
52
-                file: {
53
-                    status: 0,
54
-                    response: {
55
-                        resultCode: 0,
56
-                        resultMsg: ''
57
-                    },
58
-                    name: ''
59
-                },
60
-            },
61
-            total_: {
62
-                total: 0,
63
-                pageNum: 1,
64
-                pageSize: 10,
65
-            },
66
-            fruitsuploadList: [],
67
-            uploadList: [],
68
-            bizTableConfigId: 0,
69
-            total: 0,
70
-            editRecordId: '', //数据编辑行的id
71
-            setTimeValue: '', //设置的时间x
72
-            searchParam: {
73
-                bizTableConfigName: '',
74
-                bizTableKey: '',
75
-                pageNum: 1,
76
-                pageSize: 10,
77
-            },
78
-            visible: false,
79
-            visible2: false,
80
-            resetRoom: [
81
-                'bizTableName',
82
-                'bizTableJdbcDs',
83
-                'bizTableKey',
84
-                'bizTableConfigName',
85
-                'bizTableJdbcUrl',
86
-                'bizTableJdbcUsername',
87
-                'bizTableCreateSql',
88
-                'bizTableJdbcPassword',
89
-            ],
90
-        }
91
-    }
92
-
93
-    componentDidMount() {
94
-        this.loadRoles()
95
-        this.stores.queryDbType()
96
-    }
97
-
98
-    loadRoles(attrs = []) {
99
-        const { searchParam } = this.state;
100
-        let params = { ...searchParam, ...attrs };
101
-        this.stores.pageQueryDsInfoMod(params, (res = 0) => {
102
-            this.setState({ total: res })
103
-        })
104
-    };
105
-
106
-    inputChange(key, value) {
107
-        const { resetFields } = this.props.form
108
-        if (key === 'dbType' || key === 'MYSQL') {
109
-            this.stores.updateState({
110
-                formData: {
111
-                    bizTableConfigName: '',
112
-                    remarks: '',
113
-                    jdbcUrl: '',
114
-                    jdbcUserName: '',
115
-                    bizTableJdbcPassword: '',
116
-                    connectionStatus: '',
117
-                    defaultDb: '',
118
-                    kerberos: false,
119
-                    kerberosConfig: '',
120
-                    kerberosConfigFileName: '',
121
-                    kerberosKey: '',
122
-                    kerberosKeyFileName: '',
123
-                    kerberos: '',
124
-                    kerberosService: '',
125
-                    defaultFs: '',
126
-                    configuration: '',
127
-                    [key]: value,
128
-                    originPassword: ''
129
-                },
130
-                confList: [],
131
-                keytabList: []
132
-            })
133
-            resetFields(this.state.resetRoom)
134
-        } else if (key === 'jdbcUrl' || key === 'jdbcUserName' || key === 'bizTableJdbcPassword' || key === 'defaultDb') {
135
-            this.stores.updateState({
136
-                formData: {
137
-                    connectionStatus: '',
138
-                    [key]: value
139
-                }
140
-            })
141
-        } else if (key === 'kerberos') {
142
-            this.stores.updateState({
143
-                formData: {
144
-                    kerberosConfig: '',
145
-                    kerberosConfigFileName: '',
146
-                    kerberosKey: '',
147
-                    kerberosKeyFileName: '',
148
-                    kerberos: '',
149
-                    kerberosService: '',
150
-                    //jdbcUrl: '',
151
-                    jdbcUserName: '',
152
-                    bizTableJdbcPassword: '',
153
-                    [key]: value
154
-                },
155
-                confList: [],
156
-                keytabList: []
157
-            })
158
-            resetFields([
159
-                'kerberosConfig',
160
-                'kerberosKey',
161
-                'kerberos',
162
-                'kerberosService',
163
-                //'jdbcUrl',
164
-                'jdbcUserName',
165
-                'bizTableJdbcPassword'
166
-            ])
167
-        } else {
168
-            this.stores.updateState({
169
-                formData: {
170
-                    [key]: value
171
-                }
172
-            })
173
-        }
174
-    }
175
-
176
-    // 判断是否清空数据源密码
177
-    getValueFromEvent(e) {
178
-        let newValue = e.target.value
179
-        let {
180
-            formData: { originPassword }
181
-        } = toJS(this.stores.state)
182
-        // if (originPassword != '') {
183
-        //     newValue = ''
184
-        //     originPassword = ''
185
-        //     const { setFieldsValue } = this.props.form
186
-        //     setFieldsValue({ bizTableJdbcPassword: '' })
187
-        // }
188
-        this.stores.updateState({
189
-            formData: {
190
-                connectionStatus: '',
191
-                bizTableJdbcPassword: newValue,
192
-                originPassword: originPassword
193
-            }
194
-        })
195
-        return newValue
196
-    }
197
-
198
-    // 渲染新增修改表单
199
-    renderForm() {
200
-        const { getFieldDecorator } = this.props.form
201
-        const { formData = {}, dbTypeList } = toJS(this.stores.state)
202
-        return (
203
-            <Form layout="horizontal" labelCol={{ span: 5 }} wrapperCol={{ span: 19 }} form={this.props.form}>
204
-
205
-                <FormItem label="文件名称">
206
-                    {getFieldDecorator('bizTableConfigName', {
207
-                        rules: [
208
-                            { required: true, message: '请输入文件名称' },
209
-                            // { max: 32, message: '最多只能输入32个字' }
210
-                        ],
211
-                        initialValue: formData.bizTableConfigName
212
-                    })(
213
-                        <Input
214
-                            /* disabled={formData.id ? true : false} */
215
-                            placeholder="请输入文件名称"
216
-                            onChange={(e) => this.inputChange('bizTableConfigName', e.target.value)}
217
-                        />
218
-                    )}
219
-                </FormItem>
220
-                <FormItem label="分类">
221
-                    {getFieldDecorator('bizTableKey', {
222
-                        rules: [
223
-                            { required: true, message: '请输入分类' },
224
-                        ],
225
-                        initialValue: formData.bizTableKey
226
-                    })(
227
-                        <Input
228
-                            /* disabled={formData.id ? true : false} */
229
-                            placeholder="请输入分类"
230
-                            onChange={(e) => this.inputChange('bizTableKey', e.target.value)}
231
-                        />
232
-                    )}
233
-                </FormItem>
234
-                <FormItem label='表名'>
235
-                    {getFieldDecorator('bizTableName', {
236
-                        rules: [{ required: true, message: '请输入表名' }],
237
-                        initialValue: formData.bizTableName
238
-                    })(
239
-                        <Input
240
-                            placeholder={'请输入表名'}
241
-                            onChange={(e) => {
242
-                                this.inputChange('bizTableName', e.target.value)
243
-                            }}
244
-                        />
245
-                    )}
246
-                </FormItem>
247
-
248
-                <FormItem label='数据源'>
249
-                    {getFieldDecorator('dsId', {
250
-                        rules: [{ required: true, message: '请选择数据源' }],
251
-                        initialValue: formData.dsId
252
-                    })(
253
-                        <Select
254
-                            // disabled={formData.id ? true : false}
255
-                            placeholder={'请选择数据源'}
256
-                            onChange={(value) => {
257
-                                this.inputChange('dsId', value)
258
-                            }}
259
-                            filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
260
-                        >
261
-                            {dbTypeList.map((item) => {
262
-                                return (
263
-                                    <Select.Option key={item.id} value={item.id}>
264
-                                        {item.name}
265
-                                    </Select.Option>
266
-                                )
267
-                            })}
268
-                        </Select>
269
-                    )}
270
-                </FormItem>
271
-
272
-                {/* <FormItem label="数据源名称">
273
-                    {getFieldDecorator('bizTableJdbcDs', {
274
-                        rules: [
275
-                            {
276
-                                required: formData.dbType == '2' ? false : true,
277
-                                message: '请输入数据源名称'
278
-                            }
279
-                        ],
280
-                        initialValue: formData.bizTableJdbcDs
281
-                    })(<Input placeholder="请输入数据源名称" onChange={(e) => this.inputChange('bizTableJdbcDs', e.target.value)} />)}
282
-                </FormItem>
283
-
284
-                <FormItem label="数据源连接">
285
-                    {getFieldDecorator('bizTableJdbcUrl', {
286
-                        rules: [
287
-                            {
288
-                                required: true,
289
-                                message: '请输入数据源连接'
290
-                            }
291
-                        ],
292
-                        initialValue: formData.bizTableJdbcUrl
293
-                    })(
294
-                        <Input
295
-                            placeholder="请输入数据源连接"
296
-                            onChange={(e) => this.inputChange('bizTableJdbcUrl', e.target.value)}
297
-                        />
298
-                    )}
299
-                </FormItem>
300
-
301
-                <FormItem label="数据源账号">
302
-                    {getFieldDecorator('bizTableJdbcUsername', {
303
-                        rules: [{ required: true, message: '请输入数据源账号' }],
304
-                        initialValue: formData.bizTableJdbcUsername
305
-                    })(<Input placeholder="请输入数据源账号" onChange={(e) => this.inputChange('bizTableJdbcUsername', e.target.value)} />)}
306
-                </FormItem>
307
-                <FormItem label="数据源密码">
308
-                    {getFieldDecorator('bizTableJdbcPassword', {
309
-                        rules: [{ required: true, message: '请输入数据源密码' }],
310
-                        initialValue: formData.bizTableJdbcPassword,
311
-                        getValueFromEvent: (e) => this.getValueFromEvent(e)
312
-                    })(<Input type="password" placeholder="请输入数据源密码" />)}
313
-                </FormItem> */}
314
-
315
-                <FormItem label="业务建表语句">
316
-                    {getFieldDecorator('bizTableCreateSql', {
317
-                        rules: [{ required: true, message: `请输入业务建表语句` }],
318
-                        initialValue: formData.bizTableCreateSql || this.state.sqlInitialValue,
319
-                    })(
320
-                        // <div>
321
-                        <TextArea
322
-                            placeholder={'请输入业务建表语句'}
323
-                            showCount
324
-                            allowClear
325
-                            autoSize={{ minRows: 3, maxRows: 5 }}
326
-                            onChange={(e) => this.inputChange('bizTableCreateSql', e.target.value)}
327
-                        />
328
-                        // </div>
329
-                    )}
330
-                </FormItem>
331
-                <span style={{ color: "#ff7979", 'font-size': '12px', display: "block", 'text-align': "right", "width": " 100%", 'marginTop': '-30px' }}>注意:“业务建表语句”中创建的表名称需与“表名”中所填写表名称保持一致;</span>
332
-            </Form>
333
-        )
334
-    }
335
-
336
-    handleCancel() {
337
-        this.setState({ visible: false })
338
-        this.props.form.resetFields(this.state.resetRoom)
339
-        // 延期清除表单数据,处理关闭时,闪烁问题
340
-        setTimeout(() => {
341
-            this.stores.restForm({})
342
-        }, 100)
343
-    }
344
-
345
-    handleOk() {
346
-        const { validateFieldsAndScroll } = this.props.form
347
-        const { formData } = toJS(this.stores.state)
348
-        validateFieldsAndScroll((err, valus) => {
349
-            if (isEmpty(err)) {
350
-                //formData.jdbcPassword = Encrypt(formData.jdbcPassword)
351
-                // formData.bizTableJdbcPassword = Encrypt(formData.bizTableJdbcPassword)
352
-                formData.bizTableCreateSql = formData.bizTableCreateSql ? formData.bizTableCreateSql : this.state.sqlInitialValue
353
-                // Encrypt(formData.bizTableJdbcPassword)
354
-                if (formData.bizTableConfigId) {
355
-                    this.stores.updateDs(formData, () => {
356
-                        this.props.form.resetFields()
357
-                        // 延期清除表单数据,处理关闭时,闪烁问题
358
-                        setTimeout(() => {
359
-                            this.stores.restForm({})
360
-                            this.setState({ visible: false })
361
-                        }, 100)
362
-                        this.loadRoles()
363
-                    })
364
-                } else {
365
-                    this.stores.addDs(formData, () => {
366
-                        this.props.form.resetFields()
367
-                        // 延期清除表单数据,处理关闭时,闪烁问题
368
-                        setTimeout(() => {
369
-                            this.stores.restForm({})
370
-                            this.setState({ visible: false })
371
-                        }, 100)
372
-                        this.loadRoles()
373
-                    })
374
-                }
375
-            }
376
-        })
377
-    }
378
-
379
-    handleDownload = (id) => {
380
-        message.info('即将开始下载,请稍候...')
381
-        this.stores
382
-            .recordLogOfDownload(id, ((data, fileName) => {
383
-                var blob = new Blob([data], {
384
-                    type: "application/vnd.ms-excel",
385
-                });
386
-                var downloadElement = document.createElement("a");
387
-                downloadElement.download = fileName;
388
-                downloadElement.href = window.URL.createObjectURL(blob);
389
-                downloadElement.click();
390
-                document.body.appendChild(downloadElement);
391
-                document.body.removeChild(downloadElement);
392
-                window.URL.revokeObjectURL(downloadElement.href);
393
-            }))
394
-            .then((data) => {
395
-            })
396
-            .catch(() => {
397
-            })
398
-    }
399
-
400
-    renderModalFooter() {
401
-        const { loading, formData } = this.stores.state
402
-
403
-        return (
404
-            <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
405
-                <div>
406
-                    <Button key="back" style={{ display: 'inline' }} onClick={() => this.handleCancel()}>
407
-                        取消
408
-                    </Button>
409
-
410
-                    <Button
411
-                        key="submit"
412
-                        type="primary"
413
-                        style={{ display: 'inline', marginLeft: '10px' }}
414
-                        loading={loading}
415
-                        onClick={() => this.handleOk()}
416
-                    >
417
-                        确定
418
-                    </Button>
419
-                </div>
420
-            </div>
421
-        )
422
-    }
423
-
424
-    getParam() {
425
-        const { searchParam, total_, bizTableConfigId, total } = this.state;
426
-        const uploadProps = {
427
-            maxCount: 1,
428
-            showUploadList: false,
429
-            name: 'excelFile',
430
-            action: `/api/biz/table/config/uploadExcelDataToDB/${bizTableConfigId}`,
431
-            headers: {
432
-                authorization: 'authorization-text',
433
-                token: sessionStorage.getItem("token")
434
-            },
435
-            onChange: (info) => {
436
-                if (info.file.status !== 'uploading' && info.file.status !== "removed") {
437
-                    console.log(info.file, info.fileList);
438
-                    this.setState({ uploadInfo: info });
439
-                    if (info.file.status === 'done' && info.file.response.resultCode == 0) {
440
-                        preViewFillInData(bizTableConfigId, {
441
-                            pageNum: total_.pageNum,
442
-                            pageSize: total_.pageSize
443
-                        })
444
-                            .then(({ data, resultCode }) => {
445
-                                if (+resultCode === 0) {
446
-                                    let newData = data && data.data && data.data.length > 0 ? data.data : [];
447
-                                    this.setState({ uploadList: newData })
448
-                                    this.setState({
449
-                                        total_: {
450
-                                            total: data.total,
451
-                                            pageNum: data.pageNum,
452
-                                            pageSize: data.pageSize,
453
-                                        }
454
-                                    });
455
-                                    if (newData && newData[0]) {
456
-                                        this.setState({ fruitsuploadList: Object.keys(newData[0]) })
457
-                                    }
458
-                                }
459
-                            })
460
-                            .catch((resultMsg) => {
461
-                                message.error(resultMsg);
462
-                            });
463
-                    }
464
-                    setTimeout(() => {
465
-                        this.setState({ isShowFeedback: true })
466
-                    }, 300);
467
-                }
468
-            },
469
-        };
470
-
471
-        return {
472
-            scroll: { x: 1000 },
473
-            pagination: {
474
-                // onChange:(pageNum)=>{
475
-                //     searchParam.pageNum = pageNum;
476
-                //     this.setState({ ...searchParam });
477
-                //     this.loadRoles();
478
-                // },
479
-                // current: searchParam.pageNum,
480
-                total,
481
-                pageSize: searchParam.pageSize,
482
-            },
483
-            columns: [
484
-                //key=one的表头
485
-                {
486
-                    title: '文件名称',
487
-                    dataIndex: 'bizTableConfigName'
488
-                },
489
-                {
490
-                    title: '表名',
491
-                    dataIndex: 'bizTableName',
492
-                },
493
-                // {
494
-                //     title: '上传周期',
495
-                //     dataIndex: 'remarks'
496
-                // },
497
-                // {
498
-                //     title: '状态',
499
-                //     dataIndex: 'jdbcUrlInfo',
500
-                // },
501
-                {
502
-                    title: '最近更新时间',
503
-                    dataIndex: 'updateTime'
504
-                },
505
-                {
506
-                    title: '分类',
507
-                    dataIndex: 'bizTableKey'
508
-                },
509
-                {
510
-                    title: '操作',
511
-                    // fixed: 'right',
512
-                    // width: 250,
513
-                    render: (val, record) => {
514
-                        let data = record;
515
-                        return (
516
-                            <span style={{ marginRight: "24px" }}>
517
-                                {
518
-                                    sessionStorage.getItem("isSuper") === 'true' ? <a
519
-                                        onClick={() => {
520
-                                            this.setState({ bizTableConfigId: data.bizTableConfigId })
521
-                                            const {
522
-                                                dsId,
523
-                                                bizTableConfigId,
524
-                                                bizTableName,
525
-                                                // bizTableJdbcDs,
526
-                                                bizTableKey,
527
-                                                bizTableConfigName,
528
-                                                // bizTableJdbcUrl,
529
-                                                // bizTableJdbcUsername,
530
-                                                bizTableCreateSql,
531
-                                                // bizTableJdbcPassword,
532
-                                            } = data
533
-                                            const editData = {
534
-                                                dsId,
535
-                                                bizTableConfigId,
536
-                                                // originPassword: bizTableJdbcPassword, //对数据源密码进行解密,
537
-                                                // bizTableJdbcPassword: Decrypt(bizTableJdbcPassword),
538
-                                                bizTableName,
539
-                                                // bizTableJdbcDs,
540
-                                                bizTableKey,
541
-                                                bizTableConfigName,
542
-                                                // bizTableJdbcUrl,
543
-                                                // bizTableJdbcUsername,
544
-                                                bizTableCreateSql: bizTableCreateSql ? bizTableCreateSql : this.state.sqlInitialValue,
545
-                                            }
546
-                                            let confList = [] //配置文件列表
547
-                                            let keytabList = []
548
-                                            this.setState({ visible: true })
549
-                                            this.stores.updateState({ createType: 'edit', formData: editData, confList, keytabList })
550
-                                        }}
551
-                                    >
552
-                                        编辑
553
-                                    </a>
554
-                                        : null
555
-                                }
556
-                                {
557
-                                    sessionStorage.getItem("isSuper") === 'true' ? <span style={{ margin: "0 10px" }}>|</span> : null
558
-                                }
559
-                                <span>
560
-                                    <Upload {...uploadProps}>
561
-                                        <a onClick={() => {
562
-                                            this.setState({ bizTableConfigId: data.bizTableConfigId })
563
-                                        }}
564
-                                        >上传文件</a>
565
-                                    </Upload>
566
-                                </span>
567
-                                <span style={{ margin: "0 10px" }}>|</span>
568
-                                <span>
569
-                                    <a onClick={() => {
570
-                                        this.handleDownload(data.bizTableConfigId);
571
-                                    }}
572
-                                    >下载上传模板</a>
573
-                                </span>
574
-                                <span style={{ margin: "0 10px" }}>|</span>
575
-                                <span>
576
-                                    <a onClick={() => {
577
-                                        this.props.history.push(`/home/fileUploadDetailView/${data.bizTableConfigId}`);
578
-                                    }}
579
-                                    >上传记录</a>
580
-                                </span>
581
-                                {/* <span style={{ margin: "0 10px" }}>|</span>
582
-                                <span>
583
-                                    <a onClick={() => {
584
-                                        this.setState({ visible2: true })
585
-                                    }}
586
-                                    >数据修改记录</a>
587
-                                </span>
588
-                                <span style={{ margin: "0 10px" }}>|</span>
589
-                                <span>
590
-                                    <a onClick={() => {
591
-                                        this.props.history.push(`/home/msgLoad/${data.bizTableConfigId}`);
592
-                                    }}
593
-                                    >数据查询</a>
594
-                                </span> */}
595
-
596
-                            </span>
597
-                        )
598
-                    }
599
-                }
600
-            ],
601
-            dataSource: toJS(this.stores.state.tableArr)
602
-
603
-        }
604
-    }
605
-    render() {
606
-        const { createType, version } = this.stores.state;
607
-        const { total_, searchParam, bizTableConfigId, isShowFeedback, uploadInfo, uploadList, fruitsuploadList, visible,visible2 } = this.state
608
-        const param = this.getParam();
609
-        const noticeTableOPt_modal = {
610
-            dataSource: uploadList,
611
-            columns: fruitsuploadList.map(x => {
612
-                return {
613
-                    dataIndex: x + "",
614
-                    key: x + "",
615
-                    title: x,
616
-                }
617
-            }),
618
-            pagination: {
619
-                showSizeChanger: false,
620
-                onChange: (pageNum) => {
621
-                    preViewFillInData(bizTableConfigId, {
622
-                        pageNum: pageNum,
623
-                        pageSize: total_.pageSize
624
-                    }).then(({ data, resultCode }) => {
625
-                        if (+resultCode === 0) {
626
-                            let newData = data && data.data && data.data.length > 0 ? data.data : [];
627
-                            this.setState({
628
-                                uploadList: newData, total_: {
629
-                                    total: data.total,
630
-                                    pageNum: data.pageNum,
631
-                                    pageSize: data.pageSize,
632
-                                }
633
-                            })
634
-                            if (newData && newData[0]) {
635
-                                this.setState({ fruitsuploadList: Object.keys(newData[0]) })
636
-                            }
637
-                        }
638
-                    })
639
-                        .catch((resultMsg) => {
640
-                            message.error(resultMsg);
641
-                        });
642
-                    // setTotal({
643
-                    //   total: total.total,
644
-                    //   pageNum: pageNum,
645
-                    //   pageSize: total.pageSize,
646
-                    // });
647
-                },
648
-                total: total_.total,
649
-                pageSize: total_.pageSize,
650
-                current: Number(total_.pageNum),
651
-            },
652
-            scroll: { x: 1000 },
653
-        };
654
-
655
-        return (
656
-            <div className={styles.sys_account}>
657
-                <div className="module_search">
658
-                    <div className="module_title space">查询条件</div>
659
-                    <Row type="flex" justify="start" align="middle">
660
-                        <Col>
661
-                            <span>分类:</span>
662
-                            <Input
663
-                                style={{ width: "180px" }}
664
-                                value={searchParam.bizTableKey}
665
-                                placeholder="请输入分类"
666
-                                onChange={(e) => {
667
-                                    searchParam.bizTableKey = e.target.value;
668
-                                    this.setState({ ...searchParam });
669
-                                }}
670
-                                onKeyDown={(e) => {
671
-                                    if (e.keyCode === 13) {
672
-                                        searchParam.pageNum = 1;
673
-                                        this.setState(searchParam);
674
-                                        this.loadRoles();
675
-                                    }
676
-                                }}
677
-                            ></Input>
678
-                        </Col>
679
-                        <Col offset={1}>
680
-                            <span>文件名称: </span>
681
-                            <Input
682
-                                style={{ width: "180px" }}
683
-                                value={searchParam.bizTableConfigName}
684
-                                placeholder="请输入文件名称"
685
-                                onChange={(e) => {
686
-                                    searchParam.bizTableConfigName = e.target.value;
687
-                                    this.setState({ ...searchParam });
688
-                                }}
689
-                                onKeyDown={(e) => {
690
-                                    if (e.keyCode === 13) {
691
-                                        searchParam.pageNum = 1;
692
-                                        this.setState(searchParam);
693
-                                        this.loadRoles();
694
-                                    }
695
-                                }}
696
-                            ></Input>
697
-                        </Col>
698
-                    </Row>
699
-                    <Row type="flex" justify="end" align="middle">
700
-                        <Col>
701
-                            <Button
702
-                                type="primary"
703
-                                onClick={(e) => {
704
-                                    this.loadRoles();
705
-                                }}
706
-                            >
707
-                                搜索
708
-                            </Button>
709
-                        </Col>
710
-                        <Col>
711
-                            <Button
712
-                                // type="text"
713
-                                style={{ marginLeft: 14 }}
714
-                                onClick={(e) => {
715
-                                    searchParam.bizTableConfigName = "";
716
-                                    searchParam.bizTableKey = "";
717
-                                    searchParam.pageNum = 1;
718
-                                    this.setState({ ...searchParam });
719
-                                    this.loadRoles();
720
-                                }}
721
-                            >
722
-                                重置
723
-                            </Button>
724
-                        </Col>
725
-                    </Row>
726
-                </div>
727
-
728
-                <div className="module_body">
729
-                    <div className="title_with_btn list_top">
730
-                        <div className="module_title">文件列表</div>
731
-                        {
732
-                            sessionStorage.getItem("isSuper") === 'true' ?
733
-                                <Button
734
-                                    type="primary"
735
-                                    onClick={(e) => {
736
-                                        this.props.form.resetFields(this.state.resetRoom)
737
-                                        this.setState({ visible: true })
738
-                                        this.stores.updateState({ createType: 'add' })
739
-                                    }}
740
-                                >
741
-                                    新增文件
742
-                                </Button>
743
-                                : null
744
-                        }
745
-
746
-                    </div>
747
-                    <Table style={{ marginTop: "16px" }} {...param}></Table>
748
-                </div>
749
-                <Modal
750
-                    destroyOnClose
751
-                    width="900px"
752
-                    title={'数据修改记录'}
753
-                    className={styles.DataSourceAddModal}
754
-                    visible={visible2}
755
-                    onCancel={() => {
756
-                        this.setState({ visible2: false })
757
-                    }}
758
-                    footer={[
759
-                        <Button type="primary" key="new" onClick={()=>{this.setState({ visible2: false })}}>
760
-                            取消
761
-                        </Button>
762
-                    ]}
763
-                >
764
-                    <ConfigurationPerson></ConfigurationPerson>
765
-                </Modal>
766
-
767
-
768
-
769
-                <Modal
770
-                    destroyOnClose
771
-                    width="900px"
772
-                    title={createType === 'add' ? '新增文件' : '修改文件'}
773
-                    className={styles.DataSourceAddModal}
774
-                    visible={visible}
775
-                    onCancel={() => {
776
-                        this.setState({ visible: false })
777
-                        this.props.form.resetFields()
778
-                        // 延期清除表单数据,处理关闭时,闪烁问题
779
-                        setTimeout(() => {
780
-                            this.stores.restForm({})
781
-                        }, 100)
782
-                    }}
783
-                    footer={this.renderModalFooter()}
784
-                >
785
-                    {this.renderForm()}
786
-                </Modal>
787
-                <Modal
788
-                    width={900}
789
-                    title="文件上传"
790
-                    visible={isShowFeedback}
791
-                    onCancel={() => {
792
-                        this.setState({ isShowFeedback: false });
793
-                    }}
794
-                    footer={
795
-                        [
796
-                            <Button
797
-                                type="primary"
798
-                                key="feedback_1"
799
-                                onClick={() => {
800
-                                    this.setState({ isShowFeedback: false });
801
-                                }}
802
-                            >
803
-                                确定
804
-                            </Button>,
805
-                        ]
806
-                    }
807
-                >
808
-                    {
809
-                        uploadInfo.file.status === 'done' && uploadInfo.file.response.resultCode == 0 ?
810
-                            <div>
811
-                                <p style={{ marginBottom: "20px" }}>文件-{`${uploadInfo.file.name}:`}<span style={{ color: 'green' }}>:上传成功!</span></p>
812
-                                <Table {...noticeTableOPt_modal} />
813
-                            </div>
814
-                            : ((uploadInfo.file.status === 'error' || uploadInfo.file.status === 'done') ? <p>文件-{`${uploadInfo.file.name}:`}<span style={{ color: 'red' }}>上传失败!原因:{uploadInfo.file.response.resultMsg}</span></p> : null)
815
-                    }
816
-                </Modal>
817
-
818
-            </div>
819
-        )
820
-    }
821
-}
822
-export default Form.create()(FileUploadNewView)
823
-// export default FileUploadNewView;

+ 0 - 274
src/pages/fileUploadNew/msgLoad/ConfigurationModal.jsx

@@ -1,274 +0,0 @@
1
-import React, { useRef, useEffect, useMemo, useState } from "react";
2
-
3
-import { Spin, Modal, Form, Select, TreeSelect, message } from "antd";
4
-import {
5
-  configurableBases,
6
-  configurableUsers,
7
-  leaderAdd,
8
-  leaderUpdate,
9
-} from "../api";
10
-import debounce from "lodash/debounce";
11
-const ConfigurationModal = (props) => {
12
-  const { isModalOpen, handleCancel, type, data } = props;
13
-  //基地信息
14
-  const [configurableBasesData, setConfigurableBasesData] = useState([]);
15
-  const [baseValue, setBaseValue] = useState("");
16
-  //用户信息
17
-  const [userData, setUserData] = useState([]);
18
-  const [userValue, setUserValue] = useState("");
19
-  const [form] = Form.useForm();
20
-
21
-  useEffect(() => {
22
-    configurableBases().then((res) => {
23
-      setConfigurableBasesData(res.data);
24
-    });
25
-  }, []);
26
-  useEffect(() => {
27
-    if (isModalOpen) {
28
-      form.resetFields();
29
-      setUserData([]);
30
-      if (!type) {
31
-        setBaseValue(data?.baseId);
32
-        configurableUsers({
33
-          pageSize: 100,
34
-          pageNum: 1,
35
-          baseId: data?.baseId,
36
-        }).then((res) => {
37
-          const arr =
38
-            res.data?.list && res.data?.list.length ? res.data?.list : [];
39
-          setUserData(arr);
40
-        });
41
-      }
42
-    }
43
-  }, [isModalOpen]);
44
-
45
-  //远程搜索下拉框
46
-  const DebounceSelect = ({
47
-    fetchOptions,
48
-    debounceTimeout = 800,
49
-    defaultData,
50
-    ...props
51
-  }) => {
52
-    const [fetching, setFetching] = useState(false);
53
-    const [options, setOptions] = useState(defaultData);
54
-    const fetchRef = useRef(0);
55
-    const debounceFetcher = useMemo(() => {
56
-      const loadOptions = (value) => {
57
-        if (!baseValue) {
58
-          message.warning("请选择基地");
59
-          return;
60
-        }
61
-        fetchRef.current += 1;
62
-        const fetchId = fetchRef.current;
63
-        setOptions(defaultData);
64
-        setFetching(true);
65
-        fetchOptions(value).then((newOptions) => {
66
-          if (fetchId !== fetchRef.current) {
67
-            return;
68
-          }
69
-          setOptions(newOptions);
70
-          setFetching(false);
71
-        });
72
-      };
73
-      return debounce(loadOptions, debounceTimeout);
74
-    }, [fetchOptions, debounceTimeout]);
75
-    return (
76
-      <Select
77
-        labelInValue
78
-        showSearch={true}
79
-        fieldNames={{ label: "name", value: "id" }}
80
-        filterOption={false}
81
-        onSearch={debounceFetcher}
82
-        notFoundContent={fetching ? <Spin size="small" /> : null}
83
-        {...props}
84
-        options={options}
85
-      />
86
-    );
87
-  };
88
-  //用户搜索
89
-  const fetchOptions = useMemo(() => {
90
-    const userData = async (value) => {
91
-      if (!isModalOpen) {
92
-        return [];
93
-      }
94
-      let arr;
95
-      await configurableUsers({
96
-        pageSize: 100,
97
-        pageNum: 1,
98
-        baseId: baseValue,
99
-        name: value ?? null,
100
-      }).then((res) => {
101
-        arr = res.data?.list && res.data?.list.length ? res.data?.list : [];
102
-      });
103
-      return arr;
104
-    };
105
-    return userData;
106
-  }, [baseValue]);
107
-  //基地change事件
108
-  const onChangeBase = (value) => {
109
-    setBaseValue(value);
110
-    form.setFieldsValue({ userId: null });
111
-    if (!value) {
112
-      setUserData([]);
113
-      return;
114
-    }
115
-    configurableUsers({
116
-      pageSize: 100,
117
-      pageNum: 1,
118
-      baseId: value,
119
-    }).then((res) => {
120
-      const arr = res.data?.list && res.data?.list.length ? res.data?.list : [];
121
-      setUserData(arr);
122
-    });
123
-  };
124
-  const onCancel = () => {
125
-    const isTouched = form.isFieldsTouched();
126
-    if (isTouched) {
127
-      Modal.confirm({
128
-        title: "温馨提示",
129
-        content: "取消后当前页面操作数据不保留,确认取消?",
130
-        onOk: () => {
131
-          handleCancel(false);
132
-        },
133
-      });
134
-    } else {
135
-      handleCancel(false);
136
-    }
137
-  };
138
-
139
-  //提交操作
140
-  const handleOk = () => {
141
-    form
142
-      .validateFields()
143
-      .then((values) => {
144
-        const paramValue = {
145
-          baseId: values?.baseId,
146
-          type: values?.type,
147
-          userId: values?.userId.value,
148
-        };
149
-        //新建责任人
150
-        if (type) {
151
-          leaderAdd(paramValue).then((res) => {
152
-            message.success("添加成功");
153
-            handleCancel(true);
154
-          });
155
-          return;
156
-        }
157
-        //修改负责人
158
-        const isTouched = form.isFieldsTouched();
159
-        if (isTouched) {
160
-          leaderUpdate({ ...data, ...paramValue }).then((res) => {
161
-            message.success("修改成功");
162
-            handleCancel(true);
163
-          });
164
-        } else {
165
-          message.warning("当前数据尚未更改,请勿提交重复数据");
166
-        }
167
-      })
168
-      .catch((err) => {
169
-        return;
170
-      });
171
-  };
172
-  return (
173
-    <Modal
174
-      title={`${type ? "新建" : "修改"}`}
175
-      visible={isModalOpen}
176
-      onOk={handleOk}
177
-      onCancel={onCancel}
178
-    >
179
-      <Form
180
-        form={form}
181
-        wrapperCol={{ span: 16 }}
182
-        labelCol={{ span: 4 }}
183
-        initialValues={{
184
-          baseId: data?.baseId ?? null,
185
-          type: data?.type ? Number(data?.type) : null,
186
-          userId: data?.userId ?? null,
187
-        }}
188
-      >
189
-        <Form.Item
190
-          label="基地"
191
-          name="baseId"
192
-          rules={[
193
-            {
194
-              required: true,
195
-              message: "请选择基地",
196
-            },
197
-          ]}
198
-        >
199
-          <TreeSelect
200
-            showSearch
201
-            disabled={!type}
202
-            style={{
203
-              width: "100%",
204
-            }}
205
-            value={baseValue}
206
-            dropdownStyle={{
207
-              maxHeight: 400,
208
-              overflow: "auto",
209
-            }}
210
-            fieldNames={{ label: "name", value: "id", children: "child" }}
211
-            placeholder="请选择基地"
212
-            allowClear
213
-            // treeDefaultExpandAll
214
-            onChange={onChangeBase}
215
-            treeData={configurableBasesData}
216
-          />
217
-        </Form.Item>
218
-        <Form.Item
219
-          label="类型"
220
-          name="type"
221
-          // initialValue={data?.type ?? null}
222
-          rules={[
223
-            {
224
-              required: true,
225
-              message: "请选择类型",
226
-            },
227
-          ]}
228
-        >
229
-          <Select
230
-            placeholder="请选择类型"
231
-            disabled={!type}
232
-            //1-归口部门,3-基地总经理,4-基地体系管理员
233
-            options={[
234
-              {
235
-                value: 1,
236
-                label: "归口部门",
237
-              },
238
-              {
239
-                value: 3,
240
-                label: "基地总经理",
241
-              },
242
-              {
243
-                value: 4,
244
-                label: "基地体系管理员",
245
-              },
246
-            ]}
247
-          ></Select>
248
-        </Form.Item>
249
-        <Form.Item
250
-          label="用户"
251
-          name="userId"
252
-          rules={[
253
-            {
254
-              required: true,
255
-              message: "请选择用户",
256
-            },
257
-          ]}
258
-        >
259
-          <DebounceSelect
260
-            value={userValue}
261
-            defaultData={userData}
262
-            placeholder="请输入搜索用户"
263
-            fetchOptions={fetchOptions}
264
-            onChange={setUserValue}
265
-            style={{
266
-              width: "100%",
267
-            }}
268
-          />
269
-        </Form.Item>
270
-      </Form>
271
-    </Modal>
272
-  );
273
-};
274
-export default ConfigurationModal;

+ 0 - 159
src/pages/fileUploadNew/msgLoad/index.jsx

@@ -1,159 +0,0 @@
1
-import React, { useEffect, useRef, useState } from "react";
2
-
3
-import { useHistory, useLocation } from "react-router-dom";
4
-import { Button, Modal, Form, Select, message } from "antd";
5
-import ProTable from "@ant-design/pro-table";
6
-import ConfigurationModal from "./ConfigurationModal";
7
-import { leaderDelete, leaderPage, syncData } from "../api";
8
-const ConfigurationPerson = () => {
9
-    const [form] = Form.useForm();
10
-    const history = useHistory();
11
-
12
-    const [isModalOpen, setIsModalOpen] = useState(false);
13
-    const [modalType, setModalType] = useState(true); //true:新增,false:更新
14
-    const [modalData, setModalData] = useState({});
15
-    const [syncLoading, setSyncLoading] = useState(false);
16
-    const actionRef = useRef();
17
-    //新建
18
-    const showModal = () => {
19
-        setModalType(true);
20
-        setModalData({});
21
-        setIsModalOpen(true);
22
-    };
23
-
24
-    const handleCancel = (refresh) => {
25
-        setIsModalOpen(false);
26
-        setModalData(null);
27
-        //刷新
28
-        if (refresh) {
29
-            actionRef.current.reload();
30
-        }
31
-    };
32
-    //修改
33
-    const updateClick = (row) => {
34
-        setModalType(false);
35
-        setModalData(row);
36
-        setIsModalOpen(true);
37
-    };
38
-    //删除
39
-    const deleteClick = (row) => {
40
-        Modal.confirm({
41
-            title: "温馨提示",
42
-            content: "您确定要删除该数据吗?",
43
-            onOk: () => {
44
-                //单条数据删除
45
-                leaderDelete({ ids: [row.id] }).then((res) => {
46
-                    message.success("删除成功");
47
-                    actionRef.current.reload();
48
-                });
49
-            },
50
-        });
51
-    };
52
-    const columns = [
53
-        {
54
-            title: "文件名称",
55
-            dataIndex: "baseName",
56
-        },
57
-        {
58
-            title: "导入批次",
59
-            dataIndex: "type",
60
-            valueEnum: {
61
-                1: { text: "归口部门" },
62
-                3: { text: "基地总经理" },
63
-                4: { text: "基地体系管理员" },
64
-            },
65
-        },
66
-        {
67
-            title: "修改人",
68
-            dataIndex: "bizTableConfigId",
69
-        },
70
-        {
71
-            title: "修改时间",
72
-            dataIndex: "userName",
73
-            valueType: 'dateRange',
74
-            hideInTable: true,
75
-            search: {
76
-                transform: (value) => {
77
-                    return {
78
-                        startTime: value[0],
79
-                        endTime: value[1],
80
-                    };
81
-                },
82
-            },
83
-        },
84
-        {
85
-            title: "操作",
86
-            key: "option",
87
-            valueType: "option",
88
-            render: (_, it) => [
89
-                // <Button key="delete" type="link" onClick={() => deleteClick(it)}>
90
-                //   删除
91
-                // </Button>,
92
-                <Button key="link2" type="link" onClick={() => updateClick(it)}>
93
-                    修改
94
-                </Button>,
95
-            ],
96
-        },
97
-    ];
98
-
99
-    return (
100
-        <>
101
-            <div>
102
-                <Button type="dashed" shape="round" style={{ 'margin': '20px 0 0 20px' }} onClick={(e) => {
103
-                    history.push("/home/fileUploadNewView");
104
-                }}>返回上一页</Button>
105
-
106
-                <ProTable
107
-                    actionRef={actionRef}
108
-                    request={(params) => {
109
-                        params.pageNum = params.current;
110
-                        delete params.current;
111
-                        return leaderPage(params).then((res) => {
112
-                            if (res.resultCode === "0") {
113
-                                return {
114
-                                    data: res?.data,
115
-                                    success: true,
116
-                                    total: res.data.length,
117
-                                };
118
-                            }
119
-                        });
120
-                    }}
121
-                    rowKey="id"
122
-                    options={false}
123
-                    columns={columns}
124
-                    search={{
125
-                        labelWidth: 'auto',
126
-                    }}
127
-                    dateFormatter="string"
128
-                    headerTitle="数据查询"
129
-                    toolBarRender={() => [
130
-                        <Button type="primary" key="new" onClick={showModal}>
131
-                            新建
132
-                        </Button>,
133
-                        <Button
134
-                            type="primary"
135
-                            key="synchronous"
136
-                            loading={syncLoading}
137
-                            onClick={() => {
138
-                                setSyncLoading(true);
139
-                                syncData().then((res) => {
140
-                                    setSyncLoading(false);
141
-                                    message.success("同步成功");
142
-                                });
143
-                            }}
144
-                        >
145
-                            导出
146
-                        </Button>,
147
-                    ]}
148
-                />
149
-                <ConfigurationModal
150
-                    isModalOpen={isModalOpen}
151
-                    handleCancel={handleCancel}
152
-                    type={modalType}
153
-                    data={modalData}
154
-                />
155
-            </div>
156
-        </>
157
-    );
158
-};
159
-export default ConfigurationPerson;

+ 1 - 1
src/pages/frame/component/top/view.jsx

@@ -819,7 +819,7 @@ export default observer(function (props) {
819 819
         />
820 820
       </div> */}
821 821
       {$store.app.styleCommon.theme == 'chaBaiDao' ? null :
822
-        <div className="title">统一数据门户</div>
822
+        <div className="title">运营数据中心</div>
823 823
       }
824 824
       <div
825 825
         className="menu fg1"

+ 0 - 57
src/pages/frame/view.jsx

@@ -59,7 +59,6 @@ import utils from "@utils/index";
59 59
 import "@themes/themes.less";
60 60
 import { saveMenu } from "@apis/enter.js";
61 61
 import { careOrCancelResource, getUserResourceTree } from "./api";
62
-import { getMenuDesc } from "../system/menu/api";
63 62
 import { observer, observable } from "mobx-react";
64 63
 import { toJS } from "mobx";
65 64
 const { SubMenu } = Menu;
@@ -429,62 +428,6 @@ export default observer(function Frame(props) {
429 428
                 <span className="text_over" title={menu.resourceName}>
430 429
                   {menu.resourceName}
431 430
                 </span>
432
-                {menu.resourceType.match(/fine_bi|dmpReport/) && (
433
-                  <>
434
-                    <span
435
-                      style={{ paddingLeft: 5 }}
436
-                      onClick={(e) => {
437
-                        e.stopPropagation();
438
-                        getMenuDesc({
439
-                          resourceId: menu.resourceId,
440
-                        }).then(({ data, resultCode }) => {
441
-                          if (+resultCode === 0) {
442
-                            $store.app.setMetaData({
443
-                              data,
444
-                              visible: true,
445
-                            });
446
-                          }
447
-                        });
448
-                      }}
449
-                    >
450
-                      <InfoCircleOutlined />
451
-                    </span>
452
-
453
-                    <span
454
-                      className="emptystar"
455
-                      twotonecolor ="#FFBF00"
456
-                      style={{ paddingLeft: 5 }}
457
-                      onClick={(e) => {
458
-                        menu.isCare = !menu.isCare;
459
-                        $store.sysMenu.setSubmenuList(
460
-                          $store.sysMenu.submenuList
461
-                        );
462
-                        sessionStorage.setItem(
463
-                          "subMenuList",
464
-                          JSON.stringify($store.sysMenu.submenuList)
465
-                        );
466
-
467
-                        const config = {
468
-                          isCare: menu.isCare,
469
-                          resourceId: menu.resourceId,
470
-                        };
471
-                        careOrCancelResource(config).then(
472
-                          ({ data, resultCode }) => {
473
-                            if (+resultCode === 0) {
474
-                              message.success(
475
-                                menu.isCare ? "关注成功" : "取消关注成功"
476
-                              );
477
-                              //重新发送请求
478
-                            }
479
-                          }
480
-                        );
481
-                        e.stopPropagation();
482
-                      }}
483
-                    >
484
-                      {menu.isCare ? <StarFilled /> : <StarOutlined />}
485
-                    </span>
486
-                  </>
487
-                )}
488 431
               </span>
489 432
             </Menu.Item>
490 433
           </>

+ 0 - 396
src/pages/labelSystem/index.jsx

@@ -1,396 +0,0 @@
1
-import "./index.scss";
2
-import {
3
-  getLtLevel3Labels,
4
-  getLevel3Labels,
5
-  previewClusterCst,
6
-} from "@apis/label";
7
-import React,{ useState, useEffect } from "react";
8
-import { Form, Button, Input, Select, message, Spin, Tooltip } from "antd";
9
-import { useHistory } from "react-router-dom";
10
-import { cloneDeep, get, groupBy, isEmpty, orderBy, pick } from "lodash";
11
-import { loopTree, formatNum } from "@utils/";
12
-
13
-import $store from "@store/";
14
-import { observer } from "mobx-react";
15
-import { configure,toJS } from "mobx";
16
-configure({ useProxies: "never" });
17
-
18
-export default observer(function (props) {
19
-  const history = useHistory();
20
-  const [form] = Form.useForm();
21
-
22
-  const [scopeIndex, setScopeIndex] = useState("");
23
-  const [tabIndex, setTabIndex] = useState(0);
24
-  let [cusScopeInfo, setCusScopeInfo] = useState({});
25
-  const [type, setType] = useState("");
26
-
27
-  function loadLevel3(payload = {}) {
28
-    try {
29
-      let { tabIndex = 0, tagIds = "" } = payload;
30
-      let labelTree = toJS($store.label.labelTree);
31
-      let parentObj = labelTree[tabIndex];
32
-      let ids = [];
33
-      let noOrderArr = ["年代", "年龄段", "人生阶段"];
34
-      if (parentObj.loaded) {
35
-        return false;
36
-      }
37
-      ((parentObj || {}).children || []).map((item, index) => {
38
-        ids.push(item.id);
39
-      });
40
-      let params = { tagIds: ids.join(",") || "" };
41
-      setTabIndex(tabIndex);
42
-
43
-      getLevel3Labels(params).then(({ resultCode, data }) => {
44
-        let list = data || [];
45
-
46
-        if (+resultCode === 0) {
47
-          data.map((item, index) => {
48
-            // 隐藏籍贯城市
49
-            if (item.tagName === "籍贯城市") {
50
-              data.splice(index, 1);
51
-            }
52
-
53
-            // 年代排序
54
-            if (item.tagName === "年代") {
55
-              let arr = [];
56
-              let key = 0;
57
-              item.enumData.map((it) => {
58
-                if (it.tagValue === "60前") {
59
-                  key = 0;
60
-                } else if (it.tagValue === "60后") {
61
-                  key = 1;
62
-                } else if (it.tagValue === "70后") {
63
-                  key = 2;
64
-                } else if (it.tagValue === "80后") {
65
-                  key = 3;
66
-                } else if (it.tagValue === "90后") {
67
-                  key = 4;
68
-                } else if (it.tagValue === "00后") {
69
-                  key = 5;
70
-                } else if (it.tagValue === "10后") {
71
-                  key = 6;
72
-                } else if (it.tagValue === "20后") {
73
-                  key = 7;
74
-                }
75
-                arr[key] = { ...it };
76
-                return it;
77
-              });
78
-              item.enumData = arr;
79
-            }
80
-
81
-            // 人生阶段排序
82
-            if (item.tagName === "人生阶段") {
83
-              let arr = [];
84
-              let key = 0;
85
-
86
-              item.enumData.map((it) => {
87
-                if (it.tagValue === "少年") {
88
-                  key = 0;
89
-                } else if (it.tagValue === "青年") {
90
-                  key = 1;
91
-                } else if (it.tagValue === "中年") {
92
-                  key = 2;
93
-                } else if (it.tagValue === "老年") {
94
-                  key = 3;
95
-                }
96
-                arr[key] = it;
97
-                return it;
98
-              });
99
-
100
-              item.enumData = arr;
101
-            }
102
-
103
-            // 年龄段排序
104
-            if (item.tagName === "年龄段") {
105
-              let arr = [];
106
-              let key = 0;
107
-              item.enumData.map((it) => {
108
-                if (it.tagValue === "18岁以内") {
109
-                  key = 0;
110
-                } else if (it.tagValue === "19-25岁") {
111
-                  key = 1;
112
-                } else if (it.tagValue === "26-30岁") {
113
-                  key = 2;
114
-                } else if (it.tagValue === "31-35岁") {
115
-                  key = 3;
116
-                } else if (it.tagValue === "36-40岁") {
117
-                  key = 4;
118
-                } else if (it.tagValue === "41-50岁") {
119
-                  key = 5;
120
-                } else if (it.tagValue === "51-60岁") {
121
-                  key = 6;
122
-                } else if (it.tagValue === "60岁以上") {
123
-                  key = 7;
124
-                }
125
-                arr[key] = it;
126
-                return it;
127
-              });
128
-
129
-              item.enumData = arr;
130
-            }
131
-
132
-            return item;
133
-          });
134
-          
135
-          list = orderBy(list, ["tagId", "tagName"], ["asc", "asc"]);
136
-
137
-          let arr = [];
138
-
139
-          list.map((item, index) => {
140
-            item.logic = "1";
141
-            item.name = `${item.tagName || ""}`.split("-")[0] || "";
142
-            item.id = item.tagId;
143
-            item.children = item.enumData || [];
144
-            let exp = new RegExp("(" + item.name + "[::-]?)(?=\\S+)");
145
-            let children = cloneDeep(get(item, "children", []));
146
-            children.map((item_s, index_s) => {
147
-              item_s.tagValue = `${item_s.tagValue || ""}`.replace(
148
-                /(m2|平方米)/g,
149
-                "㎡"
150
-              );
151
-              item_s.parentId = parentObj.id;
152
-              item_s.parentName = parentObj.name;
153
-              item_s.labelId = item.id;
154
-              item_s.labelName = item.name;
155
-              item_s.labelValue = item_s.tagValue;
156
-              item_s.name = item_s.tagValue;
157
-              item_s.name_alias = item_s.name.replace(exp, "") || "";
158
-              // 排序key
159
-              let numArr = item_s.tagValue.match(/\d+/g) || [];
160
-              item_s._ordering = Number(numArr[0] || 0);
161
-              if (item_s._ordering) {
162
-                if (item_s.name_alias.indexOf("以下") > -1) {
163
-                  item_s._ordering = item_s._ordering - 1;
164
-                } else if (item_s.name_alias.indexOf("以上") > -1) {
165
-                  item_s._ordering = item_s._ordering + 1;
166
-                }
167
-                // 某些标签不需要前端处理排序
168
-                if (noOrderArr.indexOf(item.name) > -1) {
169
-                  item_s._ordering = 0;
170
-                }
171
-              }
172
-            });
173
-
174
-            item = pick(item, ["name", "id", "children"]);
175
-            item.children = children;
176
-            list[index] = item;
177
-          });
178
-
179
-          list.map((item) => {
180
-            if (item.name.match(/地产/)) {
181
-              arr.splice(0, 0, item);
182
-            } else if (item.name.match(/物业/)) {
183
-              arr.splice(1, 0, item);
184
-            } else if (item.name.match(/教育/)) {
185
-              arr.splice(2, 0, item);
186
-            } else {
187
-              arr.push(item);
188
-            }
189
-          });
190
-
191
-          list = arr;
192
-        }
193
-
194
-        // 二级标签tagName进行合并
195
-        let arr = cloneDeep(list);
196
-        arr = groupBy(arr, "name");
197
-        // console.log(arr);
198
-        list = [];
199
-        for (let key in arr) {
200
-          let list_s = [];
201
-          (arr[key] || []).map((item_s, index_s) => {
202
-            (item_s.children || []).map((item_ss) => {
203
-              list_s.push(item_ss);
204
-            });
205
-          });
206
-
207
-          list_s = orderBy(list_s, ["_ordering"], ["asc"]);
208
-          list.push({
209
-            name: key,
210
-            id: "-1",
211
-            children: list_s,
212
-          });
213
-        }
214
-
215
-        labelTree[tabIndex]["children"] = list;
216
-        labelTree[tabIndex].loaded = true;
217
-
218
-        // 设置tree位置标志_index
219
-        let scopeIndex_s = "";
220
-        loopTree({
221
-          data: labelTree,
222
-          childrenName: "children",
223
-          cbk(item = {}, parent = {}) {
224
-            item.labelPath = parent
225
-              ? `${parent.labelPath}>${item.name}`
226
-              : `${item.name}`;
227
-            item["logic"] = "1";
228
-            if (item.name === "所属项目公司") {
229
-              cusScopeInfo = item || {};
230
-              scopeIndex_s = item._index || 0;
231
-            }
232
-          },
233
-        });
234
-        if (scopeIndex_s) {
235
-          let scopeIndex_t = `${scopeIndex_s}`.split(".");
236
-          cusScopeInfo = cloneDeep(cusScopeInfo || {});
237
-          cusScopeInfo.children = cusScopeInfo.children || [];
238
-          cusScopeInfo.children.unshift({
239
-            name: "全部",
240
-            title: "全部",
241
-            value: "-1",
242
-            key: "-1",
243
-            id: "-1",
244
-          });
245
-          cusScopeInfo.children.map((item, index) => {
246
-            item.title = item.name;
247
-            item.value = index;
248
-            item.key = index;
249
-          });
250
-
251
-          // $store.label.labelTree[scopeIndex_t[0]].children.splice(scopeIndex_t[1],1)
252
-        }
253
-
254
-        $store.label.setLabelTree([...labelTree]);
255
-        setCusScopeInfo({ ...cusScopeInfo });
256
-      });
257
-    } catch (e) {
258
-      console.error(e);
259
-    }
260
-  }
261
-
262
-  useEffect(() => {
263
-    getLtLevel3Labels().then(({ data, resultCode }) => {
264
-      if (+resultCode === 0) {
265
-        let list = (data && data.objectiveTagCategory) || [];
266
-        let scopeIndex = "";
267
-        let ids = [];
268
-        list = list.filter((item, index) => {
269
-          return item.name !== "组合标签";
270
-        });
271
-        list.map((item, index) => {
272
-          item.children = item.tag || [];
273
-          item.children.map((item_s, index_s) => {
274
-            item_s.name = item_s.tagCn;
275
-            item_s.id = item_s.tagId;
276
-            item.children[index_s] = pick(item_s, ["name", "id"]);
277
-          });
278
-          list[index] = pick(item, ["name", "id", "children"]);
279
-          // 基础标签
280
-          if ((item.name === "基础标签")) {
281
-            scopeIndex = index;
282
-          }
283
-        });
284
-
285
-        if (!isEmpty(get(list, "[0].children", []))) {
286
-          let tags = get(list, "[0].children", []);
287
-          tags.map((item, index) => {
288
-            ids.push(item.id);
289
-          });
290
-        }
291
-        $store.label.setLabelTree(list);
292
-        if (!isEmpty(list)) {
293
-          loadLevel3({ tabIndex: 0 });
294
-          // 基础标签》所属项目公司,这个作为客户范围
295
-          // if (scopeIndex !== "") {
296
-          //   loadLevel3({ tabIndex: scopeIndex });
297
-          // }
298
-        }
299
-      }
300
-    });
301
-  }, []);
302
-
303
-  return (
304
-    <div className="pageLayout pageView label_system">
305
-      {/* <Spin className="loading" spinning={modelObj.loading || false}></Spin> */}
306
-      <div className="pageTitle">客户标签体系</div>
307
-      <div className="pageContainer">
308
-        <div className="section">
309
-          <div className="conBox">
310
-            {/*左侧tab*/}
311
-            <div className="tabBar">
312
-              <div className="list">
313
-                {!isEmpty(toJS($store.label.labelTree)) &&
314
-                  (toJS($store.label.labelTree) || []).map((item, index) => {
315
-                    return (
316
-                      <div
317
-                        className={`item ${index == tabIndex ? "active" : ""}`}
318
-                        key={index}
319
-                        onClick={() => {
320
-                          if (item.loaded) {
321
-                            setTabIndex(index);
322
-                          } else {
323
-                            loadLevel3({ tabIndex: index });
324
-                          }
325
-                        }}
326
-                      >
327
-                        <div className="icon"></div>
328
-                        <div className="itemName">{item.name || ""}</div>
329
-                      </div>
330
-                    );
331
-                  })}
332
-              </div>
333
-            </div>
334
-            {/*右侧内容区*/}
335
-
336
-            <div className="labelBox">
337
-              {!isEmpty(toJS($store.label.labelTree)) &&
338
-                toJS($store.label.labelTree).map((item, index) => {
339
-                  return (
340
-                    <div
341
-                      className={`groupBox ${
342
-                        index == tabIndex ? "" : "hidden"
343
-                      }`}
344
-                      key={index}
345
-                    >
346
-                      {item.loaded &&
347
-                        !isEmpty(item.children || []) &&
348
-                        item.children.map((item_s, index_s) => {
349
-                          if (isEmpty(item_s.children || [])) {
350
-                            return null;
351
-                          }
352
-                          return (
353
-                            <div className="group" key={`${index}_${index_s}`}>
354
-                              <div className="groupItem">
355
-                                <div className="groupName">
356
-                                  {item_s.name || ""}
357
-                                </div>
358
-                                <div className="list">
359
-                                  {!isEmpty(item_s.children || []) &&
360
-                                    item_s.children.map((item_ss, index_ss) => {
361
-                                      return (
362
-                                        <Tooltip
363
-                                          key={`${index}_${index_s}_${index_ss}`}
364
-                                          placement="topLeft"
365
-                                          title={
366
-                                            "标签覆盖客户数:" +
367
-                                            (formatNum(item_ss.total) || 0) +
368
-                                            " 人"
369
-                                          }
370
-                                        >
371
-                                          <div
372
-                                            className={`item ${
373
-                                              item_ss.total ? "" : "disabled"
374
-                                            }`}
375
-                                            key={`group_list_${index_ss}`}
376
-                                          >
377
-                                            {item_ss.name_alias || ""}
378
-                                          </div>
379
-                                        </Tooltip>
380
-                                      );
381
-                                    })}
382
-                                </div>
383
-                              </div>
384
-                            </div>
385
-                          );
386
-                        })}
387
-                    </div>
388
-                  );
389
-                })}
390
-            </div>
391
-          </div>
392
-        </div>
393
-      </div>
394
-    </div>
395
-  );
396
-});

+ 0 - 136
src/pages/labelSystem/index.scss

@@ -1,136 +0,0 @@
1
-.label_system {
2
-  padding: 16px 16px 40px 16px;
3
-  .hidden {
4
-    display: none !important;
5
-  }
6
-
7
-  .loading {
8
-    position: absolute;
9
-    top: 50%;
10
-    left: 50%;
11
-    margin-top: -30px;
12
-  }
13
-
14
-  .pageContainer {
15
-    display: flex;
16
-
17
-    .section {
18
-      &:first-child {
19
-        //width: 80%;
20
-        flex: 1;
21
-      }
22
-
23
-      & ~ .section {
24
-        margin-left: 16px;
25
-        flex: 0.1 1 280px;
26
-      }
27
-    }
28
-
29
-    .labelBox {
30
-      height: e("calc(100vh - 150px)");
31
-      overflow: auto;
32
-      flex: 1;
33
-      position: relative;
34
-    }
35
-
36
-    .formBox {
37
-      //width: 20%;
38
-      padding: 16px;
39
-    }
40
-  }
41
-
42
-  .pageView {
43
-    background: #fff;
44
-    //padding: 16px;
45
-    border-radius: 3px;
46
-
47
-    
48
-  }
49
-  .pageTitle{
50
-    line-height: 30px;
51
-    font-weight: bold;
52
-  }
53
-
54
-  .conBox {
55
-    display: flex;
56
-    //min-height: e("calc(100vh - 168px)");
57
-  }
58
-
59
-  .tabBar {
60
-    background-color: #fafafa;
61
-    width: 18%;
62
-    min-width: 150px;
63
-
64
-    .list {
65
-      font-size: 14px;
66
-      color: rgba(0, 0, 0, 0.85);
67
-
68
-      .item {
69
-        height: 62px;
70
-        line-height: 62px;
71
-        //text-align: center;
72
-        cursor: pointer;
73
-        padding-left: 24px;
74
-        text-align: left;
75
-        font-weight: 600;
76
-
77
-        &.active {
78
-          background-color: #fff;
79
-          color: #229867;
80
-          font-weight: bold;
81
-        }
82
-
83
-        &:hover {
84
-          color: #229867;
85
-          //border-color: rgba(34,152,103,1);
86
-        }
87
-      }
88
-    }
89
-  }
90
-
91
-  .labelBox {
92
-    margin-top: 20px;
93
-    margin-left: 32px;
94
-
95
-    .group {
96
-      .groupName {
97
-        font-size: 14px;
98
-        color: rgba(0, 0, 0, 0.85);
99
-        margin-bottom: 16px;
100
-        font-weight: bold;
101
-      }
102
-
103
-      & ~ .group {
104
-        margin-top: 12px;
105
-      }
106
-    }
107
-
108
-    .list {
109
-      display: flex;
110
-      flex-wrap: wrap;
111
-      font-size: 14px;
112
-      color: rgba(0, 0, 0, 0.65);
113
-
114
-      .item {
115
-        background: #ffffff;
116
-        border: 1px solid #e8e8e8;
117
-        border-radius: 2px;
118
-        padding: 5px 16px;
119
-        margin-bottom: 16px;
120
-        cursor: pointer;
121
-
122
-        &:not(:last-child) {
123
-          margin-right: 16px;
124
-        }
125
-
126
-        &:hover {
127
-          background: rgba(34, 152, 103, 0.1);
128
-          border: 1px solid #229867;
129
-          border-radius: 2px;
130
-          color: #229867;
131
-          //font-weight: bold;
132
-        }
133
-      }
134
-    }
135
-  }
136
-}

+ 0 - 138
src/pages/myManage/DataSearchPermisssion/IndexLess.less

@@ -1,138 +0,0 @@
1
-@import url("../../../themes/themes.less");
2
-:global{
3
-  .reasonInput .ant-legacy-form-item-control {
4
-    width: 400px !important;
5
-  }
6
-}
7
-.DataSearchPermisssionView{
8
-  :global{
9
-    //此处主要是使表格内滚动能根据屏幕高度自适应
10
-    .ant-table-fixed-header>.ant-table-container>.ant-table-body{
11
-      max-height: calc(100vh - 360px) !important
12
-    }
13
-    //处理Badge,与按钮,不对齐
14
-    .ant-table-tbody .yx_table_row_tr td .table_cell_box .ant-typography{
15
-      line-height: 20px;
16
-      height: 20px;
17
-    }
18
-  }
19
-}
20
-.permissionContainer {
21
-  min-width: 1000px; //设置内容区域最小宽度为1000px,防止表格不断被挤压重叠
22
-  background-color: #fff;
23
-  padding: 12px 16px 16px 16px;
24
-
25
-  :global {
26
-    background-color: #fff;
27
-    padding: 12px 16px 16px 16px;
28
-    .timeSetting {
29
-      .ant-time-picker {
30
-        width: 110px;
31
-        margin: 0px 4px;
32
-      }
33
-
34
-      .saveBtn {
35
-        cursor: pointer;
36
-        padding-right: 4px;
37
-      }
38
-
39
-      .closeBtn {
40
-        cursor: pointer;
41
-      }
42
-
43
-      .editBtn {
44
-        cursor: pointer;
45
-      }
46
-    }
47
-
48
-    //此处主要是使表格内滚动能根据屏幕高度自适应
49
-    .ant-table-fixed-header>.ant-table-container>.ant-table-body {
50
-      max-height: calc(100vh - 330px) !important
51
-    }
52
-
53
-    //处理Badge,与按钮,不对齐
54
-    .ant-table-tbody .yx_table_row_tr td .table_cell_box .ant-typography {
55
-      line-height: 20px;
56
-      height: 20px;
57
-    }
58
-  }
59
-}
60
-
61
-.permissionContainer {
62
-  min-height: 400px;
63
-  :global {
64
-    .ant-tabs-bar {
65
-      background-color: white;
66
-    }
67
-    .numItem {
68
-      text-decoration: underline;
69
-      cursor: pointer;
70
-      //color: #1861f2;
71
-      color: @yx_yxColor_brand_1
72
-    }
73
-    .apiJump {
74
-      text-decoration: underline;
75
-      cursor: pointer;
76
-      //color: #1861f2;
77
-      color: @yx_yxColor_brand_1
78
-    }
79
-  }
80
-}
81
-
82
-.DsAuthModalStyle {
83
-  :global {
84
-    .ant-form-item {
85
-      margin: 0px 0px 12px;
86
-    }
87
-    .ant-legacy-form-item-label {
88
-      width: 120px;
89
-    }
90
-    .ant-legacy-form-item{
91
-      margin-right: 0;
92
-    }
93
-    
94
-    // antd4官方样式会使用下面这个样式,导致.ant-form-item-control设置的宽度无效,所以下面的.ant-form-item-control宽度都加上了!important
95
-    // .ant-form-item-control:first-child:not([class^=ant-col-]):not([class*=" ant-col-"]) {
96
-    //   width: 100%;
97
-    // }
98
-
99
-    .ant-legacy-form-item-control {
100
-      width: 200px !important;
101
-      padding-right: 8px;
102
-      text-overflow: ellipsis;
103
-      overflow: hidden;
104
-      display: block;
105
-    }
106
-    
107
-    .reasonInput .ant-legacy-form-item-control {
108
-      width: 400px !important;
109
-    }
110
-  }
111
-}
112
-.RecycleModalStyle {
113
-  :global {
114
-    .ant-legacy-form-item{
115
-      margin-right: 0;
116
-    }
117
-    .ant-form-item {
118
-      margin: 0px 0px 12px;
119
-    }
120
-    .ant-legacy-form-item-label {
121
-      width: 100px;
122
-    }
123
-    .ant-legacy-form-item-control {
124
-      width: 200px !important;
125
-      padding-right: 8px;
126
-      text-overflow: ellipsis;
127
-      overflow: hidden;
128
-      display: block;
129
-    }
130
-    .reasonInput .ant-legacy-form-item-control {
131
-      width: 400px !important;
132
-    }
133
-  }
134
-}
135
-
136
-.btnMarginLeft {
137
-  margin-right: 10px;
138
-}

+ 0 - 445
src/pages/myManage/DataSearchPermisssion/IndexMod.js

@@ -1,445 +0,0 @@
1
-// 状态管理方法
2
-import { observable, action, configure, makeObservable, runInAction, autorun } from 'mobx'
3
-// 引入Serv
4
-import Serv from './IndexServ'
5
-import { message } from 'antd'
6
-import { isEqual, cloneDeep, trim, get } from 'lodash'
7
-
8
-// 严格模式
9
-configure({
10
-    enforceActions: 'observed'
11
-});
12
-/**
13
- * mod层 - 业务逻辑,数据逻辑应该存储于此
14
- */
15
-class MyManage_DataSearchPermisssion_Mod {
16
-    constructor() {
17
-        makeObservable(this);
18
-    }
19
-    // 监视状态
20
-    @observable state = {
21
-        version: '',
22
-        selectedTabIndex: "1",
23
-        DsAuthModalMod: {
24
-            dsId: '',
25
-            DsAuthModalVisable: false,
26
-            saveLoading: false,
27
-            authType: 'user', //授权类型,app:'应用',user:'用户'
28
-            appsList: [], //应用列表
29
-            usersList: [], //用户列表
30
-            dbList: [], //数据库列表
31
-            tableList: [], //数据表列表
32
-            dbs: [], //选择的数据库
33
-            tables: [], //选择的数据表
34
-            items: [], //存放,数据表与数据库的对应数据
35
-            appIds: [], //选择的应用
36
-            userIds: [], //选择的用户
37
-            permissionTypes: [], //权限类型
38
-            authorizeReason: ''
39
-        },
40
-        recycleModalMod: {
41
-            dsId: '',
42
-            recycleModalVisable: false,
43
-            saveLoading: false,
44
-            appsList: [], //应用列表
45
-            usersList: [], //用户列表
46
-            dbList: [], //数据库列表
47
-            tableList: [], //数据表列表
48
-            dbs: [], //选择的数据库
49
-            tables: [], //选择的数据表
50
-            items: [], //存放,数据表与数据库的对应数据
51
-            objId: undefined, //选择的回收权限对象
52
-            permissionTypes: [], //权限类型
53
-            retrieveType: 'user', //回收权限类型,app:'应用',user:'用户'
54
-            retrieveReason: ''
55
-        }
56
-    }
57
-
58
-    /*
59
-     * 如果设定了useStrict严格模式,那么所有observable的值的修改必须在action定义的方法内,否则可以直接修改
60
-     * 设置内容可视性
61
-     */
62
-    @action updateState = async (payload) => {
63
-        // 设置到状态机 - 如果是异步,必须在runInAction
64
-        runInAction(() => {
65
-            this.state = {
66
-                ...this.state,
67
-                ...payload,
68
-                DsAuthModalMod: {
69
-                    ...this.state.DsAuthModalMod,
70
-                    ...payload.DsAuthModalMod
71
-                },
72
-                recycleModalMod: {
73
-                    ...this.state.recycleModalMod,
74
-                    ...payload.recycleModalMod
75
-                }
76
-            }
77
-        })
78
-        /*
79
-         * Mod中跳转使用  window.app.router.push(url);
80
-         * 监控数据变化的回调,读取什么参数,即代表将要监控什么数据
81
-         */
82
-        autorun(() => {
83
-            // console.info("visible: ", this.state.visible);
84
-        })
85
-    }
86
-    // 更新一条数据源业务申请权限信息
87
-    @action updateOsDatasourceTableApplyInfoEntity = async (payload, callback) => {
88
-        // 请求参数
89
-        const params = payload
90
-        try {
91
-            // 异步请求方法
92
-            const { resultCode, resultMsg, data } = await Serv.updateOsDatasourceTableApplyInfoEntityServ(params)
93
-            // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
94
-            if (resultCode == '0') {
95
-                message.success('操作成功!')
96
-                callback && callback()
97
-            }
98
-        } catch (error) { }
99
-    }
100
-
101
-    // 查询数据查询限制配置信息
102
-    @action querySqlLimitConfig = async (payload, callback) => {
103
-        // 请求参数
104
-        try {
105
-            const { resultCode, resultMsg, data } = await Serv.querySqlLimitConfig()
106
-            if (resultCode == '0') {
107
-                this.updateState({formData:data})
108
-                callback && callback(data)
109
-            }
110
-        } catch (error) { }
111
-    }
112
-
113
-    // 设置数据查询限制配置信息
114
-    @action setSqlLimitConfig = async (payload, callback) => {
115
-        // 请求参数
116
-        const params = payload
117
-        try {
118
-            // 异步请求方法
119
-            const { resultCode, resultMsg, data } = await Serv.setSqlLimitConfig(params)
120
-            // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
121
-            if (resultCode == '0') {
122
-                message.success('操作成功!')
123
-                callback && callback()
124
-            }
125
-        } catch (error) { }
126
-    }
127
-
128
-    // 分页查询数据源信息
129
-    @action pageQueryDsInfoMod2 = async (payload, callback) => {
130
-        // 请求参数
131
-        const params = payload
132
-        try {
133
-            // 异步请求方法
134
-            const { resultCode, resultMsg, data } = await Serv.pageQueryDsInfo2(params)
135
-            // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
136
-            if (resultCode == '0') {
137
-                const tableArr2 = data ? data.records.map(x => {
138
-                    let str = (x.hasSelect ? '表查询、' : '') + (x.hasDownload ? '下载、' : '') + (x.hasModify ? '增删改、' : '')
139
-                    return {
140
-                        ...x,
141
-                        ...{
142
-                            key: Math.random(),
143
-                            testArr: get(x, 'tableNames', '').split(','),
144
-                            bizTableKey:str.substring(0,str.length-1)
145
-                            // description : x.bizTableCreateSql,
146
-                        }
147
-                    }
148
-                }) : [];
149
-                console.log(tableArr2, "tableArr2")
150
-                this.updateState({
151
-                    tableArr2: tableArr2
152
-                })
153
-                callback && callback(data.total)
154
-            }
155
-        } catch (error) { }
156
-    }
157
-
158
-    // 数据查询限制配置
159
-    @action limitSet = async (payload, callback) => {
160
-        // 请求参数
161
-        const params = payload
162
-        try {
163
-            // 异步请求方法
164
-            const { resultCode, resultMsg, data } = await Serv.limitSet(params)
165
-            // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
166
-            if (resultCode == '0') {
167
-                message.success('提交成功!')
168
-                callback && callback()
169
-            }
170
-        } catch (error) { }
171
-    }
172
-
173
-
174
-
175
-    //获取所有的应用
176
-    @action getAllApps = async (payload) => {
177
-        const { type } = payload
178
-        // 请求参数
179
-        const params = {
180
-            pageNum: 1,
181
-            pageSize: 9999
182
-        }
183
-        try {
184
-            // 异步请求方法
185
-            const { resultCode, resultMsg, data } = await Serv.getAllApps(params)
186
-            if (resultMsg == 'success') {
187
-                let list = (data && data.list) || []
188
-                list = list.map((item) => {
189
-                    return {
190
-                        label: item.appName,
191
-                        value: item.appId
192
-                    }
193
-                })
194
-                if (type == 'auth') {
195
-                    this.updateState({ DsAuthModalMod: { appsList: list } })
196
-                } else if (type == 'recycle') {
197
-                    this.updateState({ recycleModalMod: { appsList: list } })
198
-                }
199
-            } else {
200
-                if (type == 'auth') {
201
-                    this.updateState({ DsAuthModalMod: { appsList: [] } })
202
-                } else if (type == 'recycle') {
203
-                    this.updateState({ recycleModalMod: { appsList: [] } })
204
-                }
205
-            }
206
-        } catch (error) {
207
-            if (type == 'auth') {
208
-                this.updateState({ DsAuthModalMod: { appsList: [] } })
209
-            } else if (type == 'recycle') {
210
-                this.updateState({ recycleModalMod: { appsList: [] } })
211
-            }
212
-        }
213
-    }
214
-
215
-    // 分页查询数据源信息
216
-    @action pageQueryDsInfoMod = async (payload, callback) => {
217
-        // 请求参数
218
-        const params = payload
219
-        try {
220
-            // 异步请求方法
221
-            const { resultCode, resultMsg, data } = await Serv.pageQueryDsInfo(params)
222
-            // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
223
-            if (resultCode == '0') {
224
-                const tableArr = get(data, 'records', [])
225
-                this.updateState({
226
-                    tableArr: tableArr
227
-                })
228
-                callback && callback(data.total)
229
-            }
230
-        } catch (error) { }
231
-    }
232
-
233
-
234
-    //获取所有的用户
235
-    @action getAllUsers = async (payload) => {
236
-        const { type } = payload
237
-        // 请求参数
238
-        const params = {
239
-            pageNum: 1,
240
-            pageSize: 9999
241
-        }
242
-        try {
243
-            // 异步请求方法
244
-            const { resultCode, resultMsg, data } = await Serv.getAllUsers(params)
245
-            // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
246
-            if (resultCode == '0') {
247
-                let list = (data && data.records) || []
248
-                list = list.map((item) => {
249
-                    return {
250
-                        label: item.account + '(' + item.name + ')',
251
-                        value: item.accountId
252
-                    }
253
-                })
254
-                if (type == 'auth') {
255
-                    this.updateState({ DsAuthModalMod: { usersList: list } })
256
-                } else if (type == 'recycle') {
257
-                    this.updateState({ recycleModalMod: { usersList: list } })
258
-                }
259
-            } else {
260
-                if (type == 'auth') {
261
-                    this.updateState({ DsAuthModalMod: { usersList: [] } })
262
-                } else if (type == 'recycle') {
263
-                    this.updateState({ recycleModalMod: { usersList: [] } })
264
-                }
265
-            }
266
-        } catch (error) {
267
-            if (type == 'auth') {
268
-                this.updateState({ DsAuthModalMod: { usersList: [] } })
269
-            } else if (type == 'recycle') {
270
-                this.updateState({ recycleModalMod: { usersList: [] } })
271
-            }
272
-        }
273
-    }
274
-
275
-    //获取所有的数据库列表
276
-    @action getAllDbList = async (payload) => {
277
-        // 请求参数
278
-        const params = payload
279
-        try {
280
-            // 异步请求方法
281
-            const { resultCode, resultMsg, data } = await Serv.getAllDbList(params)
282
-            // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
283
-            if (resultCode == '0') {
284
-                let list = data || []
285
-                list = list.map((item) => {
286
-                    return {
287
-                        label: item,
288
-                        value: item
289
-                    }
290
-                })
291
-                this.updateState({ DsAuthModalMod: { dbList: list, tableList: [] } })
292
-            } else {
293
-                this.updateState({ DsAuthModalMod: { dbList: [], tableList: [] } })
294
-            }
295
-        } catch (error) {
296
-            this.updateState({ DsAuthModalMod: { dbList: [], tableList: [] } })
297
-        }
298
-    }
299
-    //获取所选数据库下的数据表
300
-    @action getAllTableList = async (payload) => {
301
-        // 请求参数
302
-        const params = payload
303
-        try {
304
-            // 异步请求方法
305
-            const { resultCode, resultMsg, data } = await Serv.getAllTableList(params)
306
-            // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
307
-            if (resultCode == '0') {
308
-                const list = data || []
309
-                const tableList_noAuth = [] //无授权表
310
-                const tableList_hadAuth = [] //有授权表
311
-                list.map((item) => {
312
-                    if (item.tables && item.tables.length > 0) {
313
-                        item.tables.map((table) => {
314
-                            const obj = {
315
-                                label: table.tableName,
316
-                                value: table.tableName,
317
-                                hasAuth: table.hasAuth,
318
-                                dbName: item.dataBaseName
319
-                            }
320
-                            if (table.hasAuth) {
321
-                                tableList_hadAuth.push(obj)
322
-                            } else {
323
-                                tableList_noAuth.push(obj)
324
-                            }
325
-                        })
326
-                    }
327
-                })
328
-                this.updateState({ DsAuthModalMod: { tableList: [...tableList_noAuth, ...tableList_hadAuth] } })
329
-            } else {
330
-                this.updateState({ DsAuthModalMod: { tableList: [] } })
331
-            }
332
-        } catch (error) {
333
-            this.updateState({ DsAuthModalMod: { tableList: [] } })
334
-        }
335
-    }
336
-
337
-    //授权数据表权限
338
-    @action grantDsTable = async (payload, callback) => {
339
-        // 请求参数
340
-        const params = payload
341
-        try {
342
-            // 异步请求方法
343
-            this.updateState({ DsAuthModalMod: { saveLoading: true } })
344
-            const { resultMsg, data } = await Serv.grantDsTable(params)
345
-            this.updateState({ DsAuthModalMod: { saveLoading: false } })
346
-            // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
347
-            if (resultMsg == 'success') {
348
-                message.success('授权成功!')
349
-                this.updateState({ DsAuthModalMod: { DsAuthModalVisable: false }, version: +new Date() })
350
-                if (callback) {
351
-                    callback()
352
-                }
353
-            } else {
354
-                message.warn(resultMsg || '操作失败!')
355
-            }
356
-        } catch (error) {
357
-            //message.error('发生异常,操作失败!')
358
-            this.updateState({ DsAuthModalMod: { saveLoading: false } })
359
-        }
360
-    }
361
-
362
-    //回收数据源
363
-    @action recycleDsTable = async (payload, callback) => {
364
-        // 请求参数
365
-        const params = payload
366
-        try {
367
-            // 异步请求方法
368
-            this.updateState({ recycleModalMod: { saveLoading: true } })
369
-            const { resultMsg, data } = await Serv.recycleDsTable(params)
370
-            this.updateState({ recycleModalMod: { saveLoading: false } })
371
-            // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
372
-            if (resultMsg == 'success') {
373
-                message.success('回收成功!')
374
-                this.updateState({ recycleModalMod: { recycleModalVisable: false }, version: +new Date() })
375
-                if (callback) {
376
-                    callback()
377
-                }
378
-            } else {
379
-                message.warn(resultMsg || '操作失败!')
380
-            }
381
-        } catch (error) {
382
-            console.error(error)
383
-            //message.error('发生异常,操作失败!')
384
-            this.updateState({ recycleModalMod: { saveLoading: false } })
385
-        }
386
-    }
387
-    //获取授权的数据库列表
388
-    @action getDbList_Auth = async (payload) => {
389
-        // 请求参数
390
-        const params = payload
391
-        try {
392
-            const { resultCode, resultMsg, data } = await Serv.getDbList_Auth(params)
393
-            // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
394
-            if (resultCode == '0') {
395
-                let list = data || []
396
-                list = list.map((item) => {
397
-                    return {
398
-                        label: item,
399
-                        value: item
400
-                    }
401
-                })
402
-
403
-                this.updateState({ recycleModalMod: { dbList: list, tableList: [] } })
404
-            } else {
405
-                this.updateState({ recycleModalMod: { dbList: [], tableList: [] } })
406
-            }
407
-        } catch (error) {
408
-            this.updateState({ recycleModalMod: { dbList: [], tableList: [] } })
409
-        }
410
-    }
411
-    //获取选择授权数据库,授权的数据表
412
-    @action getTableList_Auth = async (payload) => {
413
-        // 请求参数
414
-        const params = payload
415
-        try {
416
-            const { resultCode, resultMsg, data } = await Serv.getTableList_Auth(params)
417
-            // 使用lodash的get方法获取嵌套对象属性,避免当data为null时导致的data.list为undefined报错
418
-            if (resultMsg == 'success') {
419
-                const list = data || []
420
-                const tableList = []
421
-                list.map((item) => {
422
-                    if (item.tableNames && item.tableNames.length > 0) {
423
-                        item.tableNames.map((table) => {
424
-                            tableList.push({
425
-                                label: table,
426
-                                value: table,
427
-                                dbName: item.dataBaseName
428
-                            })
429
-                        })
430
-                    }
431
-                })
432
-
433
-                this.updateState({ recycleModalMod: { tableList: tableList } })
434
-            } else {
435
-                this.updateState({ recycleModalMod: { tableList: [] } })
436
-            }
437
-        } catch (error) {
438
-            this.updateState({ recycleModalMod: { tableList: [] } })
439
-        }
440
-    }
441
-}
442
-
443
-// 将组件实例化,这意味着组件将不能从别处实例化
444
-const myManage_DataSearchPermisssion_Mod = new MyManage_DataSearchPermisssion_Mod()
445
-export default myManage_DataSearchPermisssion_Mod

+ 0 - 0
src/pages/myManage/DataSearchPermisssion/IndexServ.js


Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott