RulePage.tsx 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. import React, {FC, useRef, useState} from "react";
  2. import {
  3. baseFun,
  4. EditType, SDAreaTtile,
  5. SDButton, SDEditableTable, SDFormDict,
  6. SDFormText,
  7. SDLayout,
  8. SDModalForm,
  9. SDOperate,
  10. SDPage,
  11. SDTable,
  12. SDTabs, validateFun
  13. } from "@sundata/ui-frame";
  14. import {
  15. deleteService, deleteServiceRules,
  16. getDataListService, getDataListServiceRules,
  17. getDetailByIdService, getDetailByIdServiceRules,
  18. insertService, insertServiceRules,
  19. RuleModel, RulesModel, testServiceRules, updateService, updateServiceRules
  20. } from "@/services/internalEvaluation/configuration/Rule";
  21. import {ProColumns} from "@ant-design/pro-table";
  22. import {WomanOutlined} from "@ant-design/icons";
  23. import {FormInstance} from "antd/lib/form";
  24. import {ActionType} from "@ant-design/pro-components";
  25. import {Popconfirm} from "antd";
  26. import {useModel} from "@@/exports";
  27. import {firstCharIsNotNumber} from "@/pages/internalEvaluation/utils/rwacheckutils";
  28. const RulePage: FC = () => {
  29. const {fetchDict} = useModel('dict');
  30. const ruleIndexColumns: ProColumns<any>[] = [
  31. {
  32. title: '模板参数',
  33. dataIndex: 'ruleLogicParam',
  34. hideInTable: false,
  35. formItemProps:{
  36. wrapperCol:{ span: 16 },
  37. rules: [
  38. { required: true, message: '请输入模板参数' },
  39. {
  40. validator:validateFun.account
  41. },
  42. {
  43. validator: (rule, value, callback)=> {
  44. if (firstCharIsNotNumber(value)>0) {
  45. callback('模板参数不能以数字开头');
  46. } else {
  47. callback();
  48. }
  49. }
  50. }
  51. ],
  52. }
  53. },
  54. {
  55. title: '指标',
  56. dataIndex: 'indexNo',
  57. hideInTable: false,
  58. valueType:'select',
  59. request:()=>fetchDict('@selectAllIndexToDict'),
  60. formItemProps:{
  61. style: {width: '100%'},
  62. wrapperCol:{ span: 16 },
  63. required: true,
  64. rules: [{ required: true, message: '请选择指标信息' }],
  65. }
  66. }
  67. ]
  68. // 规则表格列信息
  69. const ruleColumns: ProColumns<RuleModel>[] = [
  70. {
  71. title: '所属规则集',
  72. dataIndex: 'rulesNo',
  73. hideInTable: true,
  74. valueType:'select',
  75. request:()=> fetchDict('@selectRulesToDictContent')
  76. },
  77. {
  78. title: '规则编号',
  79. dataIndex: 'ruleNo',
  80. hideInTable: false,
  81. },
  82. {
  83. title: '规则名称',
  84. dataIndex: 'ruleName',
  85. hideInTable: false,
  86. },
  87. {
  88. title: '规则阈值',
  89. dataIndex: 'ruleThreshold',
  90. search: false,
  91. hideInTable: false,
  92. },
  93. {
  94. title: '规则结果',
  95. dataIndex: 'ruleResult',
  96. hideInTable: false,
  97. search:false,
  98. valueType:'select',
  99. request:()=> fetchDict('RULE_RESULT_TYPE')
  100. // valueEnum: {
  101. // 'none': '无',
  102. // 'warn': '预警',
  103. // 'intercept': '拦截',
  104. // },
  105. },
  106. {
  107. title: '操作',
  108. dataIndex: 'operate',
  109. valueType: 'option',
  110. render: (_, record) => [
  111. <SDOperate
  112. key="rule-show"
  113. icon={<WomanOutlined/>}
  114. successMessage=""
  115. onClick={
  116. () => {
  117. openRuleModelForm();
  118. selectRuleDetail(record)
  119. setRuleEditType('display')
  120. }
  121. }
  122. >
  123. 查看
  124. </SDOperate>,
  125. <SDOperate
  126. key="rule-edit"
  127. icon={<WomanOutlined/>}
  128. successMessage=""
  129. onClick={
  130. () => {
  131. openRuleModelForm();
  132. selectRuleDetail(record)
  133. setRuleEditType('update')
  134. }
  135. }
  136. >
  137. 修改
  138. </SDOperate>,
  139. <Popconfirm
  140. title={'警告'}
  141. description={'此操作是不可逆的,确认要删除数据吗?'}
  142. onConfirm={async () => {
  143. await deleteService(record);
  144. ruleActionRef.current?.reload();
  145. }}
  146. >
  147. <SDOperate
  148. key="rule-delete"
  149. icon={<WomanOutlined/>}
  150. successMessage=""
  151. >
  152. 删除
  153. </SDOperate>,
  154. </Popconfirm>
  155. ]
  156. }
  157. ]
  158. // 规则集表格列信息
  159. const rulesColumns: ProColumns<RulesModel>[] = [
  160. {
  161. title: '规则集编号',
  162. dataIndex: 'rulesNo',
  163. hideInTable: false,
  164. },
  165. {
  166. title: '规则集名称',
  167. dataIndex: 'rulesName',
  168. hideInTable: false,
  169. },
  170. {
  171. title: '规则集所属产品',
  172. dataIndex: 'belongProduct',
  173. hideInTable: false,
  174. },
  175. {
  176. title: '操作',
  177. dataIndex: 'operate',
  178. valueType: 'option',
  179. render: (_, record) => [
  180. <SDOperate
  181. key="rules-show"
  182. icon={<WomanOutlined/>}
  183. successMessage=""
  184. onClick={
  185. () => {
  186. openRulesModelForm();
  187. selectRulesDetail(record)
  188. setRulesEditType('display')
  189. }
  190. }
  191. >
  192. 查看
  193. </SDOperate>,
  194. <SDOperate
  195. key="rules-edit"
  196. icon={<WomanOutlined/>}
  197. successMessage=""
  198. onClick={
  199. () => {
  200. openRulesModelForm();
  201. selectRulesDetail(record)
  202. setRulesEditType('update')
  203. }
  204. }
  205. >
  206. 修改
  207. </SDOperate>,
  208. <Popconfirm
  209. title={'警告'}
  210. description={'此操作是不可逆的,确认要删除数据吗?'}
  211. onConfirm={async () => {
  212. await deleteServiceRules(record);
  213. rulesActionRef.current?.reload();
  214. }}
  215. >
  216. <SDOperate
  217. key="rules-delete"
  218. icon={<WomanOutlined/>}
  219. successMessage=""
  220. >
  221. 删除
  222. </SDOperate>,
  223. </Popconfirm>,
  224. <SDOperate
  225. key="rules-edit"
  226. icon={<WomanOutlined/>}
  227. successMessage=""
  228. onClick={
  229. () => {
  230. console.log("规则集测试:", record);
  231. testRuleCalc(record);
  232. }
  233. }
  234. >
  235. 测试
  236. </SDOperate>,
  237. ]
  238. }
  239. ]
  240. const testRuleCalc = async (record: RulesModel)=>{
  241. console.log(await testServiceRules(record).then(res=>{console.log(res)}))
  242. }
  243. const openRuleModelForm = ()=>{
  244. setRuleDetailVisible(true)
  245. setRuleIndexList([]);
  246. }
  247. const closeRuleModelForm = ()=>{
  248. setRuleDetailVisible(false)
  249. }
  250. const openRulesModelForm = ()=>{
  251. setRulesDetailVisible(true)
  252. }
  253. const closeRulesModelForm = ()=>{
  254. setRulesDetailVisible(false)
  255. }
  256. const saveOrUpdateInfo = async (re: RuleModel) => {
  257. re.ruleIndexList = ruleIndexList;
  258. const isSuccess = ruleEditType === 'create' ? await insertService(re) : await updateService(re) as boolean;
  259. if (isSuccess) {
  260. closeRuleModelForm();
  261. baseFun.info("操作成功")
  262. }
  263. }
  264. const saveOrUpdateInfoRules = async (re: RulesModel) => {
  265. const isSuccess = rulesEditType === 'create' ? await insertServiceRules(re) : await updateServiceRules(re) as boolean;
  266. if (isSuccess) {
  267. closeRulesModelForm();
  268. baseFun.info("操作成功")
  269. }
  270. }
  271. // 规则
  272. const selectRuleDetail = async (record: RuleModel) => {
  273. const res = await getDetailByIdService(record) as RuleModel ;
  274. setRuleIndexList(res.ruleIndexList);
  275. ruleFormRef.current?.setFieldsValue(res)
  276. }
  277. // 规则集
  278. const selectRulesDetail = async (record: RulesModel) => {
  279. // const res = await getDetailByIdServiceRules(record) as RulesModel ;
  280. // openRulesModelForm();
  281. // console.log(res)
  282. // rulesFormRef.current?.setFieldsValue(res)
  283. await getDetailByIdServiceRules(record).then((res)=>{
  284. rulesFormRef.current?.setFieldsValue(res);
  285. })
  286. }
  287. // hooks
  288. // 规则
  289. const [ruleDetailVisible, setRuleDetailVisible] = useState(false);
  290. const [ruleEditType, setRuleEditType] = useState<EditType>("display");
  291. const ruleFormRef = useRef<FormInstance<any>>();
  292. const ruleActionRef = useRef<ActionType>();
  293. const [ruleIndexList, setRuleIndexList] = useState<any>([]);
  294. // 规则集
  295. const [rulesDetailVisible, setRulesDetailVisible] = useState(false);
  296. const [rulesEditType, setRulesEditType] = useState<EditType>("display");
  297. const rulesFormRef = useRef<FormInstance<any>>();
  298. const rulesActionRef = useRef<ActionType>();
  299. // 规则
  300. const ruleMode = (
  301. <>
  302. <SDTable
  303. actionRef={ruleActionRef}
  304. title={'配置列表'}
  305. toolBarRender={
  306. () => [
  307. <SDButton
  308. key="rule-add"
  309. successMessage=""
  310. onClick={() => {
  311. openRuleModelForm()
  312. setRuleEditType('create')
  313. }}
  314. >
  315. 新增
  316. </SDButton>,
  317. ]
  318. }
  319. rowKey={'ruleNo'}
  320. request={
  321. async (body: any) => {
  322. return {data: await getDataListService(body)}
  323. }
  324. }
  325. columns={ruleColumns}/>
  326. <SDModalForm
  327. tableRef={ruleActionRef}
  328. successMessage={''}
  329. doSubmit={re => saveOrUpdateInfo(re)}
  330. visible={ruleDetailVisible}
  331. onVisibleChange={setRuleDetailVisible}
  332. formRef={ruleFormRef}
  333. editType={ruleEditType}
  334. >
  335. <SDAreaTtile title={"基本信息"}/>
  336. <SDFormText label="规则编号" name="ruleNo" required={true} width={'md'} readonlyCond={"update"}/>
  337. <SDFormText label="规则名称" name="ruleName" width={'md'} required={true}/>
  338. <SDFormText label="规则模板" type={'textarea'} name="ruleTemplate" />
  339. <SDFormText label="模板说明" type={'textarea'} name="templateDesc" />
  340. <SDFormDict label="规则结果" name="ruleResult" width={'md'} required={true} dictKey={'RULE_RESULT_TYPE'} />
  341. {/*<SDFormDict label="规则指标" multiple={true} dictKey={'@selectAllIndexToDict'} name="indexNoList" width={'md'}/>*/}
  342. <SDFormText label="规则阈值" name="ruleThreshold" width={'md'}/>
  343. <SDFormText label="规则结论" type={'textarea'} name="ruleConclusionTemplate" />
  344. <SDAreaTtile title={"指标清单"}/>
  345. {/*<SDButton onClick={()=>{*/}
  346. {/* const str = ruleFormRef.current?.getFieldValue("ruleTemplate")*/}
  347. {/* console.log(str)*/}
  348. {/* // 提取所有 ${...} 格式的变量名*/}
  349. {/* const variables = str.match(/\${(.*?)}/g)?.map((v: string) => v.replace(/\${|}/g, '')) || [];*/}
  350. {/* console.log(variables)*/}
  351. {/* // ruleLogicParam*/}
  352. {/* // indexNo*/}
  353. {/* var map = variables.map((v: string) => {*/}
  354. {/* */}
  355. {/* */}
  356. {/* */}
  357. {/* */}
  358. {/* });*/}
  359. {/* setRuleIndexList()*/}
  360. {/*}}>哈哈哈</SDButton>*/}
  361. <SDEditableTable
  362. columns={ruleIndexColumns} value={ruleIndexList} onChange={(value)=>{
  363. setRuleIndexList([...value])}}/>
  364. </SDModalForm>
  365. </>
  366. )
  367. // 规则集
  368. const rulesMode = (
  369. <>
  370. <SDTable
  371. actionRef={rulesActionRef}
  372. title={'配置列表'}
  373. toolBarRender={
  374. () => [
  375. <SDButton
  376. key="rules-add"
  377. successMessage=""
  378. onClick={() => {
  379. openRulesModelForm()
  380. setRulesEditType('create')
  381. }}
  382. >
  383. 新增
  384. </SDButton>,
  385. ]
  386. }
  387. rowKey={'rulesNo'}
  388. request={
  389. async (body: any) => {
  390. return {data: await getDataListServiceRules(body)}
  391. }
  392. }
  393. columns={rulesColumns}/>
  394. <SDModalForm
  395. tableRef={rulesActionRef}
  396. successMessage={''}
  397. doSubmit={re => saveOrUpdateInfoRules(re)}
  398. visible={rulesDetailVisible}
  399. onVisibleChange={setRulesDetailVisible}
  400. formRef={rulesFormRef}
  401. editType={rulesEditType}
  402. >
  403. <SDFormText label="规则集编号" name="rulesNo" required={true} width={'md'} readonlyCond={"update"}/>
  404. <SDFormText label="规则集名称" name="rulesName" width={'md'} required={true}/>
  405. <SDFormText label="规则集所属产品" name="belongProduct" required={true} />
  406. <SDFormText label="规则集结论" type={'textarea'} name="rulesConclusionTemplate" />
  407. <SDFormDict label="相关规则清单" name="ruleIds" width={'md'} dictKey={'@selectRuleToDictContent'} multiple required={true} />
  408. </SDModalForm>
  409. </>
  410. )
  411. return (
  412. <SDPage>
  413. <SDLayout subLayout={'horizontal'}>
  414. <SDLayout
  415. title={'规则和规则集管理'}
  416. fixHeight={true}
  417. >
  418. <SDTabs items={[
  419. {
  420. key: 'rule',
  421. label: '规则配置',
  422. children: ruleMode,
  423. },
  424. {
  425. key: 'rules',
  426. label: '规则集配置',
  427. children: rulesMode,
  428. },
  429. ]}/>
  430. </SDLayout>
  431. </SDLayout>
  432. </SDPage>
  433. )
  434. }
  435. export default RulePage;