OaDetail.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. import React, { useRef, useState } from 'react';
  2. import { Button, Col, Empty, Form, Row, message } from 'antd';
  3. import ApprovalProcess from './components/ApprovalProcess';
  4. import AuditDetailed from './components/AuditDetailed';
  5. import PageContent from '@/components/PageContent';
  6. // import AliyunOSSUpload from '@/components/OssUpload/AliyunOssUploader';
  7. import {
  8. queryProcessFlows,
  9. createAduit,
  10. advanceSubmitNextNode,
  11. // queryOSSData,
  12. queryLeader,
  13. } from '@/services/boom';
  14. import { useParams, useRequest, useNavigate } from 'umi';
  15. import table from '../Table';
  16. const OaDetail = () => {
  17. const [form] = Form.useForm();
  18. const [approvalProcess, setApprovalProcess] = useState([]);
  19. const [auditCheck, setAuditCheck] = useState([]);
  20. const [tableData, setTableData] = useState([]);
  21. const { oaId } = useParams();
  22. const formValueRef = useRef({
  23. form: '',
  24. });
  25. const uploadList = useRef([]);
  26. const navigate = useNavigate();
  27. const { data, loading } = useRequest(queryProcessFlows, {
  28. defaultParams: [{ ids: oaId }],
  29. onSuccess() {
  30. advanceSubmit(null, {});
  31. },
  32. });
  33. // const { data: OSSData } = useRequest(queryOSSData, {
  34. // defaultParams: [{ ids: oaId }],
  35. // });
  36. const { loading: createLoadin, run: createRun } = useRequest(createAduit, {
  37. manual: true,
  38. onSuccess() {
  39. message.success('申请审批成功');
  40. navigate(-1);
  41. },
  42. });
  43. const { run } = useRequest(advanceSubmitNextNode, {
  44. debounceInterval: 500,
  45. manual: true,
  46. formatResult(res) {
  47. setApprovalProcess(res.data[0]);
  48. },
  49. });
  50. const { data: leaderData } = useRequest(queryLeader, {});
  51. //填写表单实时计算审批流程
  52. const advanceSubmit = async (changedFields, allValues) => {
  53. console.log(changedFields, allValues);
  54. let formValues = (data?.formData || [])
  55. .map((item) => {
  56. const itemProps = item.props;
  57. let val = allValues[itemProps.id];
  58. if (!itemProps.label) return;
  59. if (!val && val !== 0) return;
  60. if (val instanceof Object) {
  61. return {
  62. name: itemProps.label,
  63. id: itemProps.id,
  64. value: [...val],
  65. };
  66. } else if (allValues[itemProps.id]) {
  67. return {
  68. name: itemProps.label,
  69. id: itemProps.id,
  70. type: item.componentName,
  71. value: [allValues[itemProps.id]] || undefined,
  72. };
  73. }
  74. })
  75. .filter((item) => item);
  76. let params = {
  77. flow_id: Number(oaId),
  78. template_node_id: 0,
  79. formComponentValues: formValues,
  80. audit_list: [],
  81. };
  82. formValueRef.current.form = formValues;
  83. run(params);
  84. };
  85. const handleTableValChange = (value, id, label) => {
  86. let ids = id.split(';');
  87. let [rowIndex, colIndex] = ids[0].split(',').map((item) => Number(item));
  88. let [columnID, tableID] = ids[1].split('>');
  89. let [columnLabel, tableLabel] = label.split('>');
  90. const cell = {
  91. name: columnLabel,
  92. id: columnID,
  93. type: columnID.split('_')[0],
  94. value: [value],
  95. };
  96. // 组装可能用到的数据
  97. const cols = [];
  98. cols[colIndex] = cell;
  99. const rows = [];
  100. rows[rowIndex] = cols;
  101. // 如果已经有数据
  102. let oldTableData = [];
  103. // 这里不知道为什么不能直接读取state(tableData)
  104. setTableData((prevState) => {
  105. oldTableData = prevState;
  106. return prevState;
  107. });
  108. console.clear();
  109. console.log(oldTableData);
  110. if (oldTableData && oldTableData.length > 0) {
  111. let table = oldTableData.find((item) => item.id === tableID);
  112. // 如果某个表格数据存在
  113. if (table) {
  114. const oldRows = table.value;
  115. // 如果某个表格的行数据存在
  116. if (oldRows) {
  117. let odlCols = oldRows[rowIndex];
  118. // 如果某个表格的某个行数据存在
  119. if (odlCols) {
  120. // 记录可编辑控件
  121. table.value[rowIndex][colIndex] = cell;
  122. // 不可编辑控件
  123. table.value[rowIndex] = addUnEditableColumn(
  124. table.value[rowIndex],
  125. tableID,
  126. );
  127. const newTableData = oldTableData.map((item) => {
  128. if (item.id === table.id) {
  129. return table;
  130. }
  131. return item;
  132. });
  133. setTableData(newTableData);
  134. } else {
  135. // 如果某个表格的某个行数据不存在
  136. // 写入可编辑控件
  137. table.value[rowIndex] = cols;
  138. // 写入不可编辑控件的值
  139. table.value[rowIndex] = addUnEditableColumn(
  140. table.value[rowIndex],
  141. tableID,
  142. );
  143. const newTableData = oldTableData.map((item) => {
  144. if (item.id === table.id) {
  145. return table;
  146. }
  147. return item;
  148. });
  149. setTableData([]);
  150. setTableData(newTableData);
  151. }
  152. } else {
  153. // 如果某个表格的行数据不存在
  154. // 写入可编辑控件
  155. table.value = rows;
  156. // 写入不可编辑控件
  157. table.value[rowIndex] = addUnEditableColumn(
  158. table.value[rowIndex],
  159. tableID,
  160. );
  161. const newTableData = oldTableData.map((item) => {
  162. if (item.id === table.id) {
  163. return table;
  164. }
  165. return item;
  166. });
  167. setTableData(newTableData);
  168. }
  169. } else {
  170. // 如果某个table的数据不存在
  171. rows[rowIndex] = addUnEditableColumn(rows[rowIndex], tableID);
  172. const newTableData = [
  173. {
  174. name: tableLabel,
  175. id: tableID,
  176. type: tableID.split('_')[0],
  177. value: rows,
  178. },
  179. ];
  180. setTableData([...oldTableData, ...newTableData]);
  181. }
  182. } else {
  183. // 如果没有数据
  184. // 添加不可编辑控件
  185. rows[rowIndex] = addUnEditableColumn(rows[rowIndex], tableID);
  186. const newTableData = [
  187. {
  188. name: tableLabel,
  189. id: tableID,
  190. type: tableID.split('_')[0],
  191. value: rows,
  192. },
  193. ];
  194. setTableData(newTableData);
  195. }
  196. };
  197. const addUnEditableColumn = (rows, tableID) => {
  198. const { columns: originColumns } = data.formData.find(
  199. (item) => item.props.id === tableID,
  200. );
  201. // 检查是否有文字说明控件,有的话需要添加在第几列的index后写入tableData
  202. const allTextNote = originColumns.filter((item, index) => {
  203. if (item.componentName === 'TextNote') {
  204. item.index = index;
  205. return true;
  206. }
  207. return false;
  208. });
  209. // 对这个表格的每个第 (allTextNote.item 的 index )列写入
  210. let textNoteCellList = [];
  211. if (allTextNote && allTextNote.length) {
  212. textNoteCellList = allTextNote.map((item) => {
  213. return {
  214. name: item.props.label,
  215. id: item.props.id,
  216. type: item.componentName,
  217. value: [item.props.placeholder],
  218. colIndex: item.index,
  219. };
  220. });
  221. }
  222. if (textNoteCellList.length) {
  223. for (const note of textNoteCellList) {
  224. rows[note.colIndex] = note;
  225. }
  226. }
  227. return rows;
  228. };
  229. const submit = async () => {
  230. form.validateFields().then((values) => {
  231. const { form: formCur } = formValueRef.current;
  232. let audit_list = [];
  233. let cc_list = [];
  234. approvalProcess?.forEach((item, index) => {
  235. let arr = item[0].is_cc === 1 ? cc_list : audit_list;
  236. if (item[0].type === 'role') arr.push(auditCheck[index]);
  237. else if (item[0].type === 'leader')
  238. arr.push(
  239. ...leaderData.slice(0, item[0].value).map((leader) => leader.ID),
  240. );
  241. else arr.push(item.map((cur) => cur.value));
  242. });
  243. let files = [];
  244. let formData = [];
  245. formCur.forEach((item) => {
  246. if (item.type === 'DDAttachment') {
  247. files = files.concat(item.value);
  248. } else {
  249. formData.push(item);
  250. }
  251. });
  252. // 根据表格在原来的form中的顺序插入
  253. const tableIndex = tableData.map((table) => {
  254. return data.formData.findIndex((item) => item.props.id === table.id);
  255. });
  256. // 按保存的顺序把表格再插入进去
  257. tableIndex.forEach((item, index) => {
  258. formData.splice(item, 0, tableData[index]);
  259. });
  260. createRun({
  261. flow_id: Number(oaId),
  262. form: JSON.stringify(formData),
  263. audit_list: audit_list.flat(),
  264. cc_list: cc_list.flat(),
  265. files: files.join(','),
  266. });
  267. });
  268. };
  269. // const OnModelFileDone = (file) => {
  270. // var path = OSSData.host + '/' + file.url;
  271. // uploadList.current = [...uploadList.current, path];
  272. // };
  273. return (
  274. <PageContent
  275. loading={loading}
  276. footer={[
  277. <Button onClick={submit} type="primary" loading={createLoadin}>
  278. 提交审批
  279. </Button>,
  280. ]}
  281. >
  282. <Row gutter={24}>
  283. <Col span={12}>
  284. {/* {OSSData && (
  285. <AliyunOSSUpload
  286. OSSData={OSSData}
  287. onDone={OnModelFileDone}
  288. directory={false}
  289. noStyle={false}
  290. label="上传文件"
  291. />
  292. )} */}
  293. <AuditDetailed
  294. allValues={formValueRef.current.form}
  295. form={form}
  296. items={data?.formData}
  297. onValuesChange={advanceSubmit}
  298. onTableValChange={handleTableValChange}
  299. />
  300. </Col>
  301. <Col span={12}>
  302. {approvalProcess.length == 0 ? (
  303. <Empty description="请先填写表单" />
  304. ) : (
  305. <ApprovalProcess
  306. leaderData={leaderData}
  307. approvalProcess={approvalProcess}
  308. onChange={setAuditCheck}
  309. />
  310. )}
  311. </Col>
  312. </Row>
  313. </PageContent>
  314. );
  315. };
  316. export default OaDetail;