addRules.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. import { useEffect, useState, useContext } from 'react';
  2. import { Form, Input, Radio, Button, Select, message, Breadcrumb, Modal } from 'antd';
  3. import './index.less';
  4. import apiObj from '@api/index';
  5. import backIcon from "@images/back.png";
  6. import FiledContext from './filed-context';
  7. import add from '@images/add-icon.png';
  8. import del from '@images/del-icon.png';
  9. const { post, api, xPost } = apiObj;
  10. const { Option } = Select;
  11. const { TextArea } = Input;
  12. function AddRules(props) {
  13. const [form] = Form.useForm();
  14. const { back } = props;
  15. const [visible, setVisible] = useState(false);
  16. const { type } = useContext(FiledContext);
  17. function handleOk() {
  18. back()
  19. }
  20. function handleCancel() {
  21. setVisible(false)
  22. }
  23. const goback = () => {
  24. if (form.isFieldsTouched()) {
  25. setVisible(true)
  26. } else {
  27. back()
  28. }
  29. };
  30. return (
  31. <>
  32. <Breadcrumb separator="">
  33. <Breadcrumb.Item><img className='back-icon' src={backIcon} onClick={goback} alt="返回上一页" /></Breadcrumb.Item>
  34. <Breadcrumb.Item>字段校验规则维护</Breadcrumb.Item>
  35. <Breadcrumb.Separator />
  36. <Breadcrumb.Item>{type == 1 ? "新增字段校验" : "修改字段校验"}</Breadcrumb.Item>
  37. </Breadcrumb>
  38. <div className="add-container">
  39. <ContentForm back={goback} form={form} cancel={back}></ContentForm>
  40. </div>
  41. <Modal
  42. title="提示"
  43. okText='确定'
  44. cancelText='取消'
  45. width={400}
  46. visible={visible}
  47. onOk={handleOk}
  48. onCancel={handleCancel}
  49. maskClosable={false}
  50. >
  51. <p>您还有内容未保存,确定要退出?</p>
  52. </Modal>
  53. </>
  54. )
  55. }
  56. function ContentForm(props) {
  57. const [columnList, setColumnList] = useState([]);
  58. const [standardValueList, setStandardValueList] = useState([]);
  59. const [regularList, setRegularList] = useState([]);//正则式数据
  60. const [tableList, setTableList] = useState([]);//表名称
  61. const [colList, setColList] = useState([[]]);//字段名称
  62. const [list, setList] = useState([]);
  63. const [disable, seDisable] = useState(true);
  64. const { type, detail } = useContext(FiledContext);
  65. const { back, form, cancel } = props;
  66. const initialValues = detail
  67. const vilidateRules = {
  68. required: '${label}不能为空!',
  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. function getAddUpColumnName(tableCname, tableEname, columnCname, columnEname) {
  83. post(api.getAddUpColumnName, {
  84. tableCname: tableCname,
  85. tableEname: tableEname,
  86. columnCname: columnCname,
  87. columnEname: columnEname,
  88. }).then((res) => {
  89. if (res.data.code === 200) {
  90. const data = res.data.data;
  91. let columnList = []
  92. data.forEach((item, i) => {
  93. item.getTableNameDTO.index = i
  94. columnList.push(item.getTableNameDTO)
  95. });
  96. setTableList(columnList);
  97. setList(data)
  98. // if (type == 2) {
  99. // data.forEach((item, i) => {
  100. // detail.columnList.forEach(it => {
  101. // if (item.getTableNameDTO.tableCname == it.tableCname) {
  102. // let colList = [[]]
  103. // colList[0] = data[i].DTOList
  104. // setColList([...colList])
  105. // }
  106. // });
  107. // });
  108. // }
  109. }
  110. })
  111. }
  112. //表选择
  113. function tablechange(value, options) {
  114. colList[options.key] = list[options.key].getColumnNameDTOList
  115. seDisable(false)
  116. setColList([...colList])
  117. }
  118. function colchange(value, options) {
  119. const formData = form.getFieldsValue();
  120. let columnList = formData.columnList;
  121. columnList[options.index].id = options.key
  122. form.setFieldsValue({
  123. columnList: columnList
  124. });
  125. }
  126. //表名称搜索(中文)
  127. function cnameSearch(val) {
  128. getAddUpColumnName(val, '', '', '')
  129. }
  130. //表名称搜索(英文)
  131. function enameSearch(val) {
  132. getAddUpColumnName('', val, '', '')
  133. }
  134. //字段名称搜索(中文)
  135. function colmeSearch(val) {
  136. getAddUpColumnName(val, '', '', '')
  137. }
  138. //字段名称搜索(英文)
  139. function coleneSearch(val) {
  140. getAddUpColumnName('', val, '', '')
  141. }
  142. //表字段添加
  143. function modifyData(i) {
  144. const formData = form.getFieldsValue();
  145. let columnList = formData.columnList;
  146. if (i == 0) {
  147. columnList.push({
  148. columnCname: undefined,
  149. columnEname: undefined,
  150. ableCname: undefined,
  151. tableEname: undefined
  152. })
  153. } else {
  154. columnList.splice(i, 1)
  155. }
  156. setColumnList([...columnList])
  157. form.setFieldsValue({
  158. columnList: columnList
  159. });
  160. colList.push(...[[]])
  161. setColList([...colList])
  162. }
  163. //标准值维护
  164. function modifyStand(i) {
  165. const formData = form.getFieldsValue();
  166. let standardValueList = formData.standardValueList;
  167. if (i == 0) {
  168. standardValueList.push({
  169. tit: null
  170. })
  171. } else {
  172. standardValueList.splice(i, 1)
  173. }
  174. setStandardValueList([...standardValueList])
  175. form.setFieldsValue({
  176. standardValueList: standardValueList
  177. });
  178. }
  179. //正则式名称搜索
  180. function onSearch(val) {
  181. getRegular(val)
  182. }
  183. //正则式选择获取id
  184. function onChange(value, options) {
  185. form.setFieldsValue({
  186. regularId: options ? options.key : ''
  187. });
  188. }
  189. function handleSave() {
  190. form.validateFields().then((values) => {
  191. addColumnVerify()
  192. }).catch((error) => {
  193. console.log('验证失败', error)
  194. })
  195. }
  196. function addColumnVerify() {
  197. const formData = form.getFieldsValue();
  198. let arr = []
  199. let url
  200. formData.standardValueList.forEach(it => {
  201. if (it.tit) {
  202. arr.push(it.tit)
  203. }
  204. });
  205. console.log(arr);
  206. formData.standardValueList = arr
  207. if (type == 1) {
  208. url = api.addColumnVerify
  209. } else {
  210. url = api.updateColumnVerify
  211. // formData.id = detail.columnId
  212. }
  213. post(url, formData).then((res) => {
  214. if (res.data.code === 200) {
  215. message.success(res.data.message);
  216. cancel()
  217. } else {
  218. message.error(res.data.message);
  219. }
  220. })
  221. }
  222. useEffect(() => {
  223. getRegular()
  224. getAddUpColumnName()
  225. if (detail) {
  226. const columnList = detail.columnList
  227. const standardValueList = detail.standardValueList
  228. setColumnList(columnList)
  229. setStandardValueList(standardValueList)
  230. list.forEach((item, i) => {
  231. detail.columnList.forEach(it => {
  232. if (item.getTableNameDTO.tableCname == it.tableCname) {
  233. let colList = [[]]
  234. colList[0] = list[i].getColumnNameDTOList
  235. setColList([...colList])
  236. }
  237. });
  238. });
  239. }
  240. if (type == 2) {
  241. seDisable(false)
  242. }
  243. }, []);
  244. return (
  245. <>
  246. <Form
  247. labelCol={{ span: 4 }}
  248. wrapperCol={{ span: 16 }}
  249. layout="horizontal"
  250. validateMessages={vilidateRules}
  251. initialValues={initialValues}
  252. form={form}
  253. >
  254. <Form.Item>
  255. {
  256. columnList.map((it, i) => {
  257. return (
  258. <div className='box' key={i}>
  259. <div className='item'>
  260. <div className='item-box'>
  261. <Form.Item label="表名称(中文)" rules={[{ required: true }]} style={{ width: '50%' }} name={['columnList', i, 'tableCname']} labelAlign="right" >
  262. <Select allowClear showSearch onChange={tablechange} onSearch={cnameSearch} style={{ width: 160 }} placeholder="请选择">
  263. {tableList.map((item) => {
  264. return (
  265. <Option value={item.tableCname} key={item.index}>{item.tableCname}</Option>
  266. )
  267. })}
  268. </Select>
  269. </Form.Item>
  270. <Form.Item label="表名称(英文)" rules={[{ required: true }]} name={['columnList', i, 'tableEname']} labelAlign="right">
  271. <Select allowClear showSearch onChange={tablechange} onSearch={enameSearch} style={{ width: 160 }} placeholder="请选择" >
  272. {tableList.map((item) => {
  273. return (
  274. <Option value={item.tableEname} key={item.index}>{item.tableEname}</Option>
  275. )
  276. })}
  277. </Select>
  278. </Form.Item>
  279. </div>
  280. <div className='item-box'>
  281. <Form.Item label="字段名称(中文)" rules={[{ required: true }]} style={{ width: '50%' }} name={['columnList', i, 'columnCname']} labelAlign="right">
  282. <Select allowClear showSearch onChange={colchange} onSearch={colmeSearch} style={{ width: 160 }} placeholder="请选择" disabled={disable}>
  283. {colList[i].map((item) => {
  284. return (
  285. <Option value={item.columnCname} key={item.id} index={i}>{item.columnCname}</Option>
  286. )
  287. })}
  288. </Select>
  289. </Form.Item>
  290. <Form.Item label="字段名称(英文)" rules={[{ required: true }]} name={['columnList', i, 'columnEname']} labelAlign="right">
  291. <Select allowClear showSearch onChange={colchange} onSearch={coleneSearch} style={{ width: 160 }} placeholder="请选择" disabled={disable}>
  292. {colList[i].map((item) => {
  293. return (
  294. <Option value={item.columnEname} key={item.id} index={i}>{item.columnEname}</Option>
  295. )
  296. })}
  297. </Select>
  298. </Form.Item>
  299. <Form.Item hidden={true} name={['columnList', i, 'id']} noStyle>
  300. <Input />
  301. </Form.Item>
  302. </div>
  303. </div>
  304. <img onClick={() => modifyData(i)} src={i == 0 ? add : del} />
  305. </div>
  306. )
  307. })
  308. }
  309. </Form.Item>
  310. <Form.Item label="是否必填数据" name="isRequired" rules={[{ required: true, message: '请选择是否必填' }]}>
  311. <Radio.Group>
  312. <Radio value={1}>是</Radio>
  313. <Radio value={0}>否</Radio>
  314. </Radio.Group>
  315. </Form.Item>
  316. <Form.Item label="标准值维护" rules={[{ max: 30, message: '标准值不能超过30个字符' }]}>
  317. {
  318. standardValueList.map((it, i) => {
  319. return (
  320. <div className='box-2' key={i} >
  321. <Form.Item name={['standardValueList', i, 'tit']} style={{ width: 159 }}>
  322. <Input autoComplete='off' placeholder="请输入" />
  323. </Form.Item>
  324. <img onClick={() => modifyStand(i)} src={i == 0 ? add : del} />
  325. </div>
  326. )
  327. })
  328. }
  329. </Form.Item>
  330. <Form.Item label="正则式名称" name="regularName">
  331. <Select showSearch allowClear onSearch={onSearch} onChange={onChange} style={{ width: 160 }} placeholder="请选择">
  332. {regularList.map((item) => {
  333. return (
  334. <Option value={item.name} key={item.id}>{item.name}</Option>
  335. )
  336. })}
  337. </Select>
  338. </Form.Item>
  339. <Form.Item hidden={true} name="regularId" noStyle>
  340. <Input />
  341. </Form.Item>
  342. <Form.Item label="说明" name="description" rules={[{ max: 200, message: '说明不能超过200个字符' }]}>
  343. <TextArea
  344. autoSize={{ minRows: 3, maxRows: 5 }}
  345. placeholder="请输入"
  346. />
  347. </Form.Item>
  348. </Form>
  349. <div className="button-box">
  350. <Button onClick={back}>取消</Button>
  351. <Button onClick={handleSave} type='primary'>保存</Button>
  352. </div>
  353. </>
  354. )
  355. }
  356. export default AddRules;