index.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. import React, { useState, useEffect, useRef } from 'react';
  2. import { useSelector, useDispatch } from 'react-redux';
  3. import { Form, Input, Button, Table, Row, Col, Select, Modal, Spin, Space, message } from 'antd';
  4. import { PlusOutlined } from '@ant-design/icons';
  5. import '@common/common.less';
  6. import apiObj from '@api/index';
  7. import AddRules from './addRules';
  8. import FiledContext from './filed-context';
  9. import { getValueFromEvent } from '@utils/index'
  10. const { post, api, xPost } = apiObj;
  11. const { Option } = Select;
  12. function FieldRules() {
  13. const [addVisible, setAddVisible] = useState(false); //新增页面显示
  14. const [logList, setLogList] = useState([]);
  15. const [total, setTotal] = useState(0);
  16. const [type, setType] = useState(0);//1新增 2修改
  17. const [visible, setVisible] = useState(false);
  18. const [size, setSize] = useState(15);
  19. const [current, setCurrent] = useState(1);
  20. const [loading, setLoading] = useState(false);
  21. const [regularList, setRegularList] = useState([]);//正则式数据
  22. const [selectedRowKeys, setSelectedRowKeys] = useState([]);
  23. const [tableList, setTableList] = useState([]);//表名称
  24. const [colList, setColList] = useState([]);//字段名称
  25. const [tableCname, setTableCname] = useState(null);//字段名称
  26. const [tableEname, setTableEname] = useState(null);//字段名称
  27. const [disable, setDisable] = useState(true);//字段名称
  28. const [filedDetail, setFiledDetail] = useState(null);//详情数据
  29. const [params, setParams] = useState({
  30. pages: 1,
  31. current: 1,
  32. size: 15,
  33. desc: ['gmt_create']
  34. });
  35. const [form] = Form.useForm();
  36. let data = {
  37. pages: 1,
  38. current: 1,
  39. size: size,
  40. desc: ['gmt_create']
  41. }
  42. const { rulerNum } = useSelector((state) => {
  43. return state.userInfo;
  44. });
  45. useEffect(() => {
  46. setCurrent(1)
  47. setParams(data)
  48. form.resetFields();
  49. getRegular()
  50. getTableName()
  51. getColumnName('', '', '', '')
  52. getColumnVerifyPage(data);
  53. setSelectedRowKeys([])
  54. setDisable(true)
  55. }, [rulerNum]);
  56. //表格数据
  57. function getColumnVerifyPage(param) {
  58. const hide = message.loading('加载中...', 0);
  59. post(api.getColumnVerifyPage, param || params).then((res) => {
  60. hide()
  61. if (res.data.code === 200) {
  62. const data = res.data.data;
  63. setLogList(data.records);
  64. setTotal(data.total)
  65. }
  66. }).catch((err) => {
  67. hide()
  68. })
  69. }
  70. //获取正则式名称
  71. function getRegular(name) {
  72. const param = {
  73. name: name || ''
  74. }
  75. post(api.getRegular, param).then((res) => {
  76. if (res.data.code === 200) {
  77. const data = res.data.data;
  78. setRegularList(data);
  79. }
  80. })
  81. }
  82. //获取字段名
  83. function getColumnName(columnCname, columnEname, tableCname, tableEname) {
  84. const param = {
  85. columnCname: columnCname,
  86. columnEname: columnEname,
  87. tableCname: tableCname,
  88. tableEname: tableEname
  89. }
  90. post(api.getColumnName, param).then((res) => {
  91. if (res.data.code === 200) {
  92. const data = res.data.data;
  93. setColList([...data]);
  94. }
  95. })
  96. }
  97. //获取表名称
  98. function getTableName(tableCname, tableEname) {
  99. const param = {
  100. tableCname: tableCname,
  101. tableEname: tableEname
  102. }
  103. post(api.getTableName, param).then((res) => {
  104. if (res.data.code === 200) {
  105. const data = res.data.data;
  106. setTableList([...data]);
  107. }
  108. })
  109. }
  110. //表名称搜索(中文)
  111. function cnameSearch(val) {
  112. getTableName(val, '')
  113. }
  114. //表名称搜索(英文)
  115. function enameSearch(val) {
  116. getTableName('', val)
  117. }
  118. //字段名称搜索(中文)
  119. function colmeSearch(val) {
  120. getColumnName(val, '', tableCname, '')
  121. }
  122. //字段名称搜索(英文)
  123. function coleneSearch(val) {
  124. getColumnName('', val, '', tableEname)
  125. }
  126. //正则式名称搜索
  127. function onSearch(val) {
  128. getRegular(val)
  129. }
  130. //删除记录
  131. function delColumnVerify() {
  132. post(api.delColumnVerify, { ids: selectedRowKeys }).then((res) => {
  133. if (res.data.code === 200) {
  134. //刷新列表
  135. const totalPage = Math.ceil((total - selectedRowKeys.length) / 15);
  136. //将当前页码与删除数据之后的总页数进行比较,避免当前页码不存在
  137. const pagenum =
  138. params.current > totalPage ? totalPage : params.current;
  139. //避免pagenum变为0
  140. params.current = pagenum < 1 ? 1 : pagenum;
  141. setParams(params)
  142. getColumnVerifyPage()
  143. message.success(res.data.message);
  144. } else {
  145. message.warning(res.data.message || '操作失败,请重试~');
  146. }
  147. });
  148. showDelModal(false);
  149. setSelectedRowKeys([])
  150. }
  151. //删除弹窗确认
  152. function showDelModal(flag) {
  153. console.log(selectedRowKeys.length);
  154. if (flag && !selectedRowKeys.length) {
  155. message.warning("请先选择要删除的记录~", 1);
  156. return;
  157. }
  158. setVisible(flag)
  159. }
  160. //新增修改跳转
  161. function showModal(type, id) {
  162. setAddVisible(true)
  163. setType(type)
  164. if (type == 1) {
  165. setFiledDetail({
  166. columnList: [{
  167. columnCname: undefined,
  168. columnEname: undefined,
  169. ableCname: undefined,
  170. tableEname: undefined,
  171. id: undefined
  172. }],
  173. standardValueList: [{
  174. tit: null
  175. }]
  176. })
  177. } else {
  178. getByIdColumnVerify(id)
  179. }
  180. }
  181. //详情
  182. function getByIdColumnVerify(id) {
  183. const param = {
  184. columnId: id,
  185. }
  186. post(api.getByIdColumnVerify, param).then((res) => {
  187. if (res.data.code === 200) {
  188. const data = res.data.data;
  189. let obj = []
  190. if (data.standardValueList) {
  191. data.standardValueList.forEach(it => {
  192. obj.push({
  193. tit: it
  194. })
  195. });
  196. console.log(obj);
  197. } else {
  198. obj = [{ tit: null }]
  199. }
  200. delete data.standardValueList
  201. const arr = {
  202. columnList: [{
  203. columnCname: data.columnCname,
  204. columnEname: data.columnEname,
  205. tableCname: data.tableCname,
  206. tableEname: data.tableEname,
  207. disable: true,
  208. id: data.columnId
  209. }],
  210. standardValueList: obj,
  211. regularName: data.regular,
  212. ...data
  213. }
  214. setFiledDetail(arr)
  215. }
  216. })
  217. }
  218. function onSizeChange(current, pageSize) {
  219. params.current = current
  220. params.size = pageSize
  221. setSize(pageSize)
  222. setCurrent(current)
  223. setParams(params)
  224. getColumnVerifyPage()
  225. setSelectedRowKeys([])
  226. }
  227. function changePage(page, pageSize) {
  228. params.current = page
  229. params.size = pageSize
  230. setParams(params)
  231. setCurrent(page)
  232. getColumnVerifyPage()
  233. setSelectedRowKeys([])
  234. }
  235. function onSelectChange(selectedRowKeys) {
  236. setSelectedRowKeys(selectedRowKeys);
  237. };
  238. function tableCnameChange(value, option) {
  239. setTableCname(value)
  240. getColumnName('', '', value, '')
  241. if (value) {
  242. form.setFieldsValue({
  243. tableEname: option.val,
  244. columnCname: undefined,
  245. columnEname: undefined,
  246. });
  247. setDisable(false)
  248. } else {
  249. form.setFieldsValue({
  250. tableEname: undefined,
  251. columnCname: undefined,
  252. columnEname: undefined,
  253. })
  254. setDisable(true)
  255. getTableName()
  256. }
  257. }
  258. function tableEnameChange(value, option) {
  259. setTableEname(value)
  260. getColumnName('', '', '', value)
  261. if (value) {
  262. form.setFieldsValue({
  263. tableCname: option.val,
  264. columnCname: undefined,
  265. columnEname: undefined,
  266. });
  267. setDisable(false)
  268. } else {
  269. form.setFieldsValue({
  270. tableCname: undefined,
  271. columnCname: undefined,
  272. columnEname: undefined,
  273. })
  274. setDisable(true)
  275. getTableName()
  276. }
  277. }
  278. function colchange(value, option, ins) {
  279. if (ins == 1) {
  280. if (value) {
  281. form.setFieldsValue({
  282. columnEname: option.val
  283. });
  284. } else {
  285. form.setFieldsValue({
  286. columnEname: undefined
  287. })
  288. getColumnName('', '', '', '')
  289. }
  290. } else {
  291. if (value) {
  292. form.setFieldsValue({
  293. columnCname: option.val
  294. });
  295. } else {
  296. form.setFieldsValue({
  297. columnCname: undefined
  298. })
  299. getColumnName('', '', '', '')
  300. }
  301. }
  302. }
  303. //返回
  304. function goBack() {
  305. setAddVisible(false);
  306. setFiledDetail(null)
  307. }
  308. function userChange() {
  309. setVisible(false)
  310. setFiledDetail(null)
  311. getColumnVerifyPage();
  312. setSelectedRowKeys([])
  313. }
  314. const onFinish = (value) => {
  315. const param = {
  316. ...data,
  317. ...value,
  318. }
  319. setCurrent(1)
  320. setParams(param)
  321. getColumnVerifyPage(param);
  322. setSelectedRowKeys([])
  323. };
  324. const onReset = () => {
  325. setCurrent(1)
  326. setParams(data)
  327. form.resetFields();
  328. getRegular()
  329. getTableName()
  330. getColumnName('', '', '', '')
  331. getColumnVerifyPage(data);
  332. setSelectedRowKeys([])
  333. setDisable(true)
  334. };
  335. const columns = [
  336. { title: '序号', dataIndex: 'index', render: (text, record, index) => (current - 1) * params.size + index + 1, width: 60 },
  337. { title: '表名称(中文)', dataIndex: 'tableCname', key: 'tableCname', width: 130, },
  338. { title: '表名称(英文)', dataIndex: 'tableEname', key: 'tableEname', width: 130, },
  339. { title: '字段名称(中文)', dataIndex: 'columnCname', key: 'columnCname', width: 145, },
  340. { title: '字段名称(英文)', dataIndex: 'columnEname', key: 'columnEname', width: 145, },
  341. {
  342. title: '是否必填', dataIndex: 'isRequired', key: 'isRequired', render: (text, record) => {
  343. return record.isRequired == 1 ? "是" : record.isRequired == 0 ? "否" : '';
  344. }
  345. },
  346. {
  347. title: '标准值维护', dataIndex: 'standardvalue', key: 'standardvalue', width: 110, render: (text, record) => {
  348. return record.standardvalue ? record.standardvalue.length > 10 ? <span title={record.standardvalue}>{record.standardvalue.substring(0, 10) + '...'}</span> : record.standardvalue : '-';
  349. }
  350. },
  351. {
  352. title: '正则式名称', dataIndex: 'regular', key: 'regular', width: 110, render: (text, record) => {
  353. return record.regular || '-';
  354. }
  355. },
  356. {
  357. title: '说明', dataIndex: 'description', key: 'description', render: (text, record) => {
  358. return record.description ? record.description.length > 20 ? <span title={record.description}>{record.description.substring(0, 20) + '...'}</span> : record.description : '-';
  359. }
  360. },
  361. {
  362. title: '操作', dataIndex: 'key', render: (text, record) => (
  363. <Space size="middle">
  364. <a onClick={() => showModal(2, record.columnId)}>修改</a>
  365. </Space>
  366. )
  367. }
  368. ];
  369. const rowSelection = {
  370. selectedRowKeys,
  371. onChange: onSelectChange,
  372. };
  373. if (addVisible && filedDetail) {
  374. return (
  375. <FiledContext.Provider value={{ type, detail: filedDetail }}>
  376. <AddRules userChange={userChange} back={goBack} className="aa" />
  377. </FiledContext.Provider>
  378. )
  379. }
  380. return (
  381. <div className="wrapper">
  382. <div className="filter-box">
  383. <Form
  384. form={form}
  385. name="normal_login"
  386. onFinish={onFinish}
  387. initialValues={{ lossType: '', lossWay: '', isRequired: '' }}
  388. >
  389. <Row gutter={24}>
  390. <Space size="middle">
  391. <Form.Item label="表名称(中文)" name="tableCname">
  392. <Select showSearch allowClear onChange={(value, option) => tableCnameChange(value, option)} onSearch={cnameSearch} style={{ width: '159px' }} placeholder="请选择">
  393. {tableList.map((item) => {
  394. return (
  395. <Option value={item.tableCname} val={item.tableEname} key={item.tableCname}>{item.tableCname}</Option>
  396. )
  397. })}
  398. </Select>
  399. </Form.Item>
  400. <Form.Item label="表名称(英文)" name="tableEname">
  401. <Select showSearch allowClear onChange={(value, option) => tableEnameChange(value, option)} onSearch={enameSearch} style={{ width: '159px' }} placeholder="请选择">
  402. {tableList.map((item) => {
  403. return (
  404. <Option value={item.tableEname} val={item.tableCname} key={item.tableEname}>{item.tableEname}</Option>
  405. )
  406. })}
  407. </Select>
  408. </Form.Item>
  409. <Form.Item label="字段名称(中文)" name="columnCname">
  410. <Select showSearch allowClear onChange={(value, option) => colchange(value, option, 1)} onSearch={colmeSearch} style={{ width: '159px' }} placeholder="请选择" disabled={disable}>
  411. {colList.map((item, i) => {
  412. return (
  413. <Option value={item.columnCname} val={item.columnEname} key={item.columnCname}>{item.columnCname}</Option>
  414. )
  415. })}
  416. </Select>
  417. </Form.Item>
  418. <Form.Item label="字段名称(英文)" name="columnEname">
  419. <Select showSearch allowClear onChange={(value, option) => colchange(value, option, 2)} onSearch={coleneSearch} placeholder="请选择" style={{ width: '159px' }} disabled={disable}>
  420. {colList.map((item, i) => {
  421. return (
  422. <Option value={item.columnEname} val={item.columnCname} key={item.columnEname}>{item.columnEname}</Option>
  423. )
  424. })}
  425. </Select>
  426. </Form.Item>
  427. </Space>
  428. <Col span={5} key={4}>
  429. <Form.Item label="是否必填" name="isRequired">
  430. <Select
  431. placeholder="请选择"
  432. allowClear
  433. >
  434. <Option value="" key={2}>全部</Option>
  435. <Option value="1" key={1}>是</Option>
  436. <Option value="0" key={0}>否</Option>
  437. </Select>
  438. </Form.Item>
  439. </Col>
  440. <Col span={5} key={5}>
  441. <Form.Item label="标准值" name="standardValue" getValueFromEvent={getValueFromEvent}>
  442. <Input placeholder="请输入" autoComplete='off' allowClear maxLength='30' />
  443. </Form.Item>
  444. </Col>
  445. <Form.Item label="正则名称" name="regularName">
  446. <Select showSearch allowClear onSearch={onSearch} placeholder="请选择" style={{ width: '159px' }}>
  447. {regularList.map((item) => {
  448. return (
  449. <Option value={item.name} key={item.id}>{item.name}</Option>
  450. )
  451. })}
  452. </Select>
  453. </Form.Item>
  454. <Col span={6} key={7}>
  455. <Form.Item>
  456. <Button type="primary" htmlType="submit">
  457. 查询
  458. </Button>
  459. <Button onClick={onReset}>
  460. 重置
  461. </Button>
  462. </Form.Item>
  463. </Col>
  464. </Row>
  465. </Form>
  466. </div>
  467. <div className="table">
  468. <div className="table-header">
  469. <h2 className="table-title">字段校验规则维护</h2>
  470. <Space size="middle">
  471. <Button type="primary" icon={<PlusOutlined />} onClick={() => showModal(1)}>新增</Button>
  472. <Button type="primary" onClick={() => showDelModal(true)} danger>删除</Button>
  473. </Space>
  474. </div>
  475. <Table
  476. columns={columns}
  477. rowSelection={rowSelection}
  478. scroll={{ y: 'calc(100vh - 430px)' }}
  479. dataSource={logList}
  480. rowKey={record => record.columnId}
  481. pagination={{
  482. pageSize: size,
  483. size: 'small',
  484. current: current,
  485. showSizeChanger: true,
  486. pageSizeOptions: ['15', '30', '60', '120'],
  487. showTotal: (total, range) => `第${range[0]}-${range[1]} 条/共 ${total} 条数据`,
  488. onShowSizeChange: (current, pageSize) => onSizeChange(current, pageSize), // 改变每页数量时更新显示
  489. onChange: (page, pageSize) => changePage(page, pageSize),//点击页码事件
  490. total: total
  491. }} />
  492. </div>
  493. <Modal
  494. title="删除字段校验规则"
  495. okText='确定'
  496. cancelText='关闭'
  497. width={400}
  498. visible={visible}
  499. onOk={delColumnVerify}
  500. /*confirmLoading={confirmLoading}*/
  501. onCancel={() => showDelModal(false)}
  502. maskClosable={false}
  503. >
  504. <p>字段校验规则删除后将无法恢复,确认删除这{selectedRowKeys.length}条数据?</p>
  505. </Modal>
  506. </div >
  507. )
  508. }
  509. export default FieldRules;