addRules.js 16 KB

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