index.js 16 KB

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