info.tsx 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. import React, { useEffect, useRef, useState } from 'react';
  2. import { Button, Dropdown, Form, FormInstance, Input, Menu, Space, Tooltip, Upload } from 'antd';
  3. import { ActionType, ProColumns, ProFormInstance, ProTable } from '@ant-design/pro-components';
  4. import { baseFun, ContextMenu, DictTree, EditType, SDOperate, SDForm, SDFormDict, SDFormText, SDLayout, SDModalForm, SDPage, SDSubmitButton, SDTable, SDTree, TableData,SDButton,SDAreaTtile } from '@sundata/ui-frame';
  5. import { SysFunButtonInfoModel,riskExposureDefinitionModel,riskExposureClassRuleModel } from '@/services/rwa/rwa_calc_config_001riskexposure/info';
  6. import { getDetail1, getFunTree1,getSelectTreeData,getRiskDataList,createRiskRuleData,updateRiskRuleExistData,delRiskRuleData,createRiskData,updateRiskData,isNotExist,deleteFunc } from '@/services/rwa/rwa_calc_config_001riskexposure/info';
  7. import { DataNode } from 'antd/lib/tree';
  8. import { MenuInfo } from 'rc-menu/lib/interface';
  9. import { SortOrder } from 'antd/es/table/interface';
  10. import { CheckSquareOutlined, CloseSquareTwoTone, PlusSquareTwoTone, WomanOutlined } from "@ant-design/icons";
  11. import { ProductProps } from '@/sundataImport';
  12. import { useModel } from '@umijs/max';
  13. import { number } from 'echarts';
  14. import { method, toNumber } from 'lodash';
  15. import DirectoryTree from 'antd/es/tree/DirectoryTree';
  16. type widowProp = {
  17. onCancel: () => void;
  18. onChangeVisible(visible: boolean, type: string): unknown;
  19. onChangeVisdible:(visible:boolean,type ?: 'none' | 'raload' )=>void;
  20. }& ProductProps;
  21. const info: React.FC<widowProp> = (prop:widowProp) => {
  22. /** 编辑方式,查看、修改、新增按钮时设置,详细信息表单中使用 */
  23. const [editType, setEditType] = useState<EditType>(prop.editType || 'update');
  24. /** 是否显示详细信息窗口 */
  25. const [detailVisible, setDetailVisible] = useState<boolean>(false);
  26. const [currentRow, setCurrentRow] = useState<riskExposureClassRuleModel>();
  27. /** 表格引用对象,刷新表格使用 */
  28. const actionRef = useRef<ActionType>();
  29. const formRef = useRef<FormInstance<any>>();
  30. const proformRef = useRef<FormInstance>();
  31. const [key, setKey] = useState<any>();
  32. const [editRuleNo, setEditRuleNo] = useState<any>();
  33. /** 编辑方式,查看、修改、新增按钮时设置,详细信息表单中使用 */
  34. const [backEditType, setBackEditType] = useState<EditType>(prop.editType || 'update');
  35. const backformRef = useRef<FormInstance>();
  36. /** 表格引用对象,刷新表格使用 */
  37. const backActionRef = useRef<ActionType>();
  38. const [treeData, setTreeData] = useState<DictTree[]>();
  39. const leaf = useRef('1');
  40. const levelcode = useRef(0);
  41. const [dataSource, setDataSource] = useState<readonly SysFunButtonInfoModel[]>()
  42. let runtimeEditType: EditType;
  43. /** 是否单一权重 显示使用 */
  44. const [riskFlag,setRiskFlag] = useState<boolean>(false);
  45. const[riskWeightFlag,setRiskWeightFlag] = useState<boolean>(false);
  46. // 页面数据
  47. const[formData,setFormData] = useState<riskExposureClassRuleModel[]>();
  48. const { fetchDict } = useModel('dict');
  49. useEffect(() => {
  50. refreshTree();
  51. }, []);
  52. // 获取树结构
  53. const refreshTree = async () => {
  54. const newTree = await getFunTree1();
  55. formatArray(newTree);
  56. setTreeData(newTree);
  57. };
  58. // 树结构图标初始化(新增和废除)
  59. function formatArray (arr:DictTree[]) {
  60. arr.forEach((item) => {
  61. if(Array.isArray(item.children)==false){
  62. if (item.attribute == '0') {
  63. item.icon=<CloseSquareTwoTone/>;
  64. } else {
  65. item.icon= <CheckSquareOutlined/>;
  66. }
  67. };
  68. Array.isArray(item.children) ? formatArray(item.children) : item;
  69. });
  70. }
  71. // 新建节点
  72. const createNode = (node: DictTree) => {
  73. const offobjectNo = node.key as string;
  74. setEditType('create');
  75. runtimeEditType = 'create';
  76. // 设置新增初始值
  77. formRef.current?.setFieldsValue({
  78. buttonList: [],
  79. funccode: '',
  80. funcname: '',
  81. num: 0,
  82. oldfunccode: '',
  83. orderno: 1,
  84. parentname: node.title?.toString(),
  85. remark: '',
  86. url: '',
  87. });
  88. leaf.current = '1';
  89. levelcode.current = levelcode.current + 1;
  90. }
  91. // 废除节点
  92. const deleteNode = (node: DictTree) => {
  93. const funccode = node.key;
  94. if (node.children) {
  95. baseFun.warning('请先作废所有下级节点');
  96. return;
  97. }
  98. if (treeData?.length === 1 && !treeData[0].children) {
  99. baseFun.warning('不能作废根节点');
  100. return;
  101. }
  102. baseFun.confirm("请确认是否继续操作", ()=>{ deleteFunc(funccode).then(()=>{
  103. baseFun.info("作废成功");
  104. refreshTree();
  105. });
  106. });
  107. }
  108. // 菜单增加
  109. const handleSave =async(record:riskExposureDefinitionModel)=>{
  110. if (editType == 'create') {
  111. await createRiskData(record).then(()=>{
  112. baseFun.info("执行成功");
  113. });
  114. refreshTree();
  115. closeAndRefresh();
  116. } else if (editType == 'update') {
  117. await updateRiskData(record).then(()=>{
  118. baseFun.info("执行成功");
  119. refreshTree();
  120. closeAndRefresh();
  121. });
  122. }
  123. }
  124. // 风险暴漏规则新增或删除
  125. const handleRiskRuleSave =async(record:any)=>{
  126. if (backEditType == 'update' ) {
  127. if (currentRow?.ruleNo) {
  128. updateRiskRuleExistData(record,currentRow?.ruleNo);
  129. closeAndRefresh();
  130. }
  131. } else if (backEditType == 'create' ) {
  132. createRiskRuleData(record,key);
  133. closeAndRefresh();
  134. }
  135. }
  136. //关闭窗口刷新父页面
  137. const closeAndRefresh = ()=>{
  138. actionRef.current?.reloadAndRest?.();
  139. }
  140. // 选中树节点数据查询
  141. const handleSelect =async(record:any)=>{
  142. const selectKey = record[0];
  143. setKey(selectKey);
  144. const data = await getSelectTreeData(selectKey);
  145. // 页面联动值初始化
  146. if (data.riskExposureIsmini == '1') {
  147. setRiskFlag(true);
  148. closeAndRefresh();
  149. } else {
  150. setRiskFlag(false);
  151. }
  152. if (data.riskExposureIsmini == '1') {
  153. setRiskWeightFlag(true);
  154. } else {
  155. setRiskWeightFlag(false);
  156. }
  157. formRef.current?.setFieldsValue(data);
  158. }
  159. // 风险暴漏分类规则删除
  160. const delRiskRule = async (record:any) => {
  161. baseFun.confirm('请确认是否继续操作',async() =>{
  162. await delRiskRuleData(record);
  163. closeAndRefresh();
  164. })
  165. }
  166. // 风险暴漏分类规则当前行查询
  167. const selectRiskRowData = async (record:any) => {
  168. const formDataList = await getRiskDataList(record,key);
  169. backformRef.current?.setFieldsValue(formDataList[0]);
  170. }
  171. // 编辑规则编号
  172. const setRuleNoAdd = () => {
  173. let lastEditRuleNo ="";
  174. if (formData !== null || formData !== undefined) {
  175. if (formData?.length == 0) {
  176. lastEditRuleNo = "FXBL" + key + 1;
  177. } else {
  178. let lastNo = formData?.filter((item)=>{
  179. return item.ruleNo == formData[formData.length-1].ruleNo;
  180. })[0].ruleNo;
  181. let numberNo = lastNo?.substring(lastNo.length-3,lastNo.length);
  182. let castnumber = toNumber(numberNo);
  183. castnumber = castnumber+1;
  184. lastEditRuleNo = "FXBL" + key + castnumber;
  185. }
  186. } else {
  187. lastEditRuleNo = "FXBL" + key + 1;
  188. }
  189. setEditRuleNo(lastEditRuleNo);
  190. }
  191. // 页面展示元素
  192. const columns: ProColumns<riskExposureClassRuleModel>[] = [
  193. {
  194. title: '计算实例号',
  195. dataIndex: 'calcindex',
  196. search: false,
  197. hideInTable: true,
  198. },
  199. {
  200. title: '起始数据日期',
  201. dataIndex: 'startDate',
  202. search: false,
  203. hideInTable: true,
  204. },
  205. {
  206. title: '截止数据日期',
  207. dataIndex: 'endDate',
  208. search: false,
  209. hideInTable: true,
  210. },
  211. {
  212. title: '规则编号',
  213. dataIndex: 'ruleNo',
  214. search: false,
  215. hideInTable: false,
  216. },
  217. {
  218. title: '规则说明',
  219. dataIndex: 'ruleName',
  220. search: false,
  221. hideInTable: false,
  222. },
  223. {
  224. title: '产品名称',
  225. dataIndex: 'ruleProductNo',
  226. search: false,
  227. hideInTable: false,
  228. valueType: 'treeSelect',
  229. request: () => fetchDict('CUST_TYPE_LV02'),
  230. fieldProps: {
  231. treeDefaultExpandAll: true,
  232. treeCheckable:true,
  233. },
  234. },
  235. {
  236. title: '权重(%)',
  237. dataIndex: 'riskExposureWeight',
  238. search: false,
  239. hideInTable: false,
  240. },
  241. {
  242. title: '输入数据源',
  243. dataIndex: 'ruleIn',
  244. search: false,
  245. hideInTable: false,
  246. valueType: 'treeSelect',
  247. request: () => fetchDict('CUST_TYPE_LV02'),
  248. fieldProps: {
  249. treeDefaultExpandAll: true,
  250. treeCheckable:true,
  251. },
  252. },
  253. {
  254. title: '输出数据源',
  255. dataIndex: 'ruleOut',
  256. search: false,
  257. hideInTable: false,
  258. valueType: 'treeSelect',
  259. request: () => fetchDict('CUST_TYPE_LV02'),
  260. fieldProps: {
  261. treeDefaultExpandAll: true,
  262. treeCheckable:true,
  263. },
  264. },
  265. {
  266. title: '执行序号',
  267. dataIndex: 'ruleIndex',
  268. search: false,
  269. hideInTable: false,
  270. },
  271. {
  272. title: '风险暴露分类认定规则',
  273. dataIndex: 'ruleGetdata',
  274. search: false,
  275. hideInTable: false,
  276. },
  277. {
  278. title: '操作',
  279. dataIndex: 'operate',
  280. valueType: 'option',
  281. render: (_, record) => [
  282. <SDOperate
  283. key="roleCfg"
  284. icon={<WomanOutlined />}
  285. successMessage=""
  286. onClick={
  287. ()=>{
  288. selectRiskRowData(record);
  289. setBackEditType('update');
  290. setDetailVisible(true);
  291. setCurrentRow(record);
  292. }}
  293. >
  294. 修改
  295. </SDOperate>,
  296. <SDOperate
  297. key="roleCfg"
  298. icon={<WomanOutlined />}
  299. successMessage=""
  300. onClick={()=>{
  301. delRiskRule(record);
  302. } }
  303. >
  304. 删除
  305. </SDOperate>,
  306. ],
  307. },
  308. ];
  309. // 右键菜单
  310. const items: any[] = [
  311. {
  312. label: <a>新建</a>,
  313. key: 'create',
  314. },
  315. {
  316. label: <a>作废</a>,
  317. key: 'delete',
  318. },
  319. {
  320. type: 'divider',
  321. },
  322. ];
  323. return(
  324. <SDPage footer={[<SDSubmitButton successMessage='' editType={editType} formRef={formRef} doSubmit={handleSave} >保存</SDSubmitButton>]}>
  325. <SDLayout subLayout='horizontal' >
  326. <SDLayout
  327. title='菜单列表'
  328. colSpan='25%'
  329. fixHeight
  330. >
  331. <DirectoryTree treeData={treeData} onSelect={handleSelect} showLine={true} autoExpandParent={true}
  332. titleRender={(nodeData) => {
  333. return (
  334. <Dropdown menu={{ items, onClick: (e) => {
  335. console.log(e.key,nodeData)
  336. if (e.key == 'create') {
  337. createNode(nodeData);
  338. } else if (e.key == 'delete') {
  339. deleteNode(nodeData);
  340. }
  341. }}} trigger={['contextMenu']}
  342. >
  343. <span>{nodeData.title}</span>
  344. </Dropdown>
  345. )
  346. }}
  347. onRightClick={({event, node}: any) => {
  348. event.preventDefault();
  349. }}
  350. />
  351. </SDLayout>
  352. <SDLayout
  353. title='风险暴露分类信息维护'
  354. colSpan='75%'
  355. fixHeight
  356. >
  357. <SDForm
  358. editType={editType}
  359. //doSubmit={handleSave}
  360. formRef={formRef}
  361. onValuesChange={
  362. (changedValues, values)=>{
  363. if (changedValues.riskExposureIsmini == '1'){
  364. setRiskFlag(true);
  365. setRiskWeightFlag(true);
  366. } else if (values.riskExposureIsmini == '0' || values.riskExposureIsmini== null) {
  367. setRiskFlag(false);
  368. setRiskWeightFlag(false);
  369. formRef.current?.setFieldValue('riskExposureWeight',null);
  370. }
  371. }
  372. }
  373. >
  374. <SDFormText name="riskExposureNo" required={true}
  375. bgValidater={(riskExposureNo: string) => isNotExist({
  376. riskExposureNo: riskExposureNo,
  377. calcIndex: '',
  378. startDate: '',
  379. endDate: '',
  380. term: '',
  381. dataDate: '',
  382. riskExposureName: '',
  383. riskExposureStageId: '',
  384. defaultOut: '',
  385. riskExposureIndex: '',
  386. riskExposureSuper: '',
  387. riskExposureSuperName: '',
  388. riskExposureIsmini: '',
  389. riskExposureWeight: '',
  390. riskExposureState: ''
  391. })}
  392. readonlyCond='update' label="项目代码"/>
  393. <SDFormText name="riskExposureName" readonlyCond='update' required={true} label="项目名称" rules={[{max:50,message:'不可超过50个字'},]}/>
  394. <SDFormText name="riskExposureSuper" label="上级项目代码"/>
  395. <SDFormText name="riskExposureSuperName" label="上级项目名称"/>
  396. <SDFormDict name="riskExposureIsmini" dictKey="YESORNO" label="是否最细一级"/>
  397. {riskWeightFlag && <SDFormText name="riskExposureWeight" required={true} label="默认权重(%)"/>}
  398. <SDFormDict name="defaultOut" dictKey='CUST_TYPE_LV02' label="默认输出数据源"/>
  399. <SDFormDict name="riskExposureStageId" dictKey='CUST_TYPE_LV02' label="所属阶段"/>
  400. <SDFormText name="riskExposureIndex" label="认定顺序号"/>
  401. <SDFormText name="riskExposureState" readonlyCond='both' label="状态"/>
  402. </SDForm>
  403. { riskFlag &&
  404. <SDTable
  405. title="风险暴露分类认定规则列表"
  406. search={false}
  407. rowKey="ruleNo"
  408. columns={columns}
  409. toolBarRender={(_, { selectedRows }) => [
  410. <SDButton
  411. key="create"
  412. icon={<PlusSquareTwoTone />}
  413. successMessage=''
  414. onClick={() => {
  415. setDetailVisible(true);
  416. setBackEditType('create');
  417. setRuleNoAdd();
  418. }}
  419. >
  420. 新建
  421. </SDButton>,
  422. ]}
  423. request={ async(record:riskExposureClassRuleModel)=>{
  424. const formDataList = await getRiskDataList(record,key);
  425. setFormData(formDataList);
  426. return {data:formDataList}
  427. }}
  428. actionRef={actionRef}
  429. formRef={proformRef}
  430. setDetailVisible={() => {setDetailVisible(true)}}
  431. setEditType={setBackEditType}
  432. setCurrentRow={setCurrentRow}
  433. />}
  434. {detailVisible && (
  435. <SDModalForm
  436. title={'详细信息'}
  437. editType={backEditType}
  438. visible={detailVisible}
  439. initialValues={{ruleNo:editRuleNo}}
  440. onVisibleChange={() => {setDetailVisible(false)}}
  441. footer={[
  442. <SDSubmitButton editType={backEditType} formRef={backformRef} doSubmit={handleRiskRuleSave} >保存</SDSubmitButton>,
  443. <SDButton
  444. key="closeUpdate"
  445. successMessage=''
  446. onClick={() => {setDetailVisible(false);}}>关闭</SDButton>
  447. ]}
  448. formRef={backformRef}
  449. >
  450. <SDAreaTtile title='风险暴露分类认定规则信息'/>
  451. <SDFormText name="ruleNo" readonlyCond='both' label="规则编号"/>
  452. <SDFormText name="ruleName" required={true} label="规则说明"/>
  453. <SDFormDict name="ruleProductNo" dictKey='CUST_TYPE_LV02' rules={[{required:true}]} label="产品名称"/>
  454. <SDFormText name="riskExposureWeight" label="权重(%)"/>
  455. <SDFormDict name="ruleIn" dictKey='CUST_TYPE_LV02' rules={[{required:true}]} label="输入数据源"/>
  456. <SDFormDict name="ruleOut" dictKey='CUST_TYPE_LV02' rules={[{required:true}]} label="输出数据源" />
  457. <SDFormText name="ruleIndex" required={true} label="执行序号" />
  458. <SDFormText name="ruleGetdata" required={true} type="textarea" label="风险暴露分类认定规则"/>
  459. </SDModalForm>
  460. )}
  461. </SDLayout>
  462. </SDLayout>
  463. </SDPage>
  464. )
  465. }
  466. export default info;