index.tsx 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import { useParams } from 'react-router-dom'
  4. import { E1_APIgetGoodsList } from '@/store/action/E1accident'
  5. import { FourTableType } from '@/pages/B_enterTibet/B1collect/type'
  6. import {
  7. E3_APIcreate,
  8. E3_APIdel,
  9. E3_APIgetInfo,
  10. E3_APIrevocation,
  11. E3_APIsaveApply,
  12. E3_APIsaveAudit,
  13. E3_APIsaveCreate,
  14. E3_APIsaveDraft
  15. } from '@/store/action/E3actuality'
  16. import { API_goodsInfo } from '@/store/action/C1ledger'
  17. import { pageTitTxtObj } from '@/pages/D_storeManage/D4impStor/D4edit'
  18. import dayjs from 'dayjs'
  19. import { MessageFu } from '@/utils/message'
  20. import history, { btnFlagFu2 } from '@/utils/history'
  21. import { Button, DatePicker, Input, Select } from 'antd'
  22. import MyPopconfirm from '@/components/MyPopconfirm'
  23. import { EXbtnFu } from '@/utils/EXBtn'
  24. import X3auditInfo from '@/pages/X_stock/X3auditInfo'
  25. import { statusObj } from '@/utils/tableData'
  26. import { selectObj } from '@/utils/select'
  27. import TextArea from 'antd/es/input/TextArea'
  28. import Z3upFiles from '@/components/Z3upFiles'
  29. import ZupFileTable from '@/components/ZupFileTable'
  30. import ZflowTable from '@/components/ZflowTable'
  31. import ZRichTexts from '@/components/ZRichTexts'
  32. import { useDispatch, useSelector } from 'react-redux'
  33. import { RootState } from '@/store'
  34. import { D7_APIList } from '@/store/action/D7check'
  35. function E3edit() {
  36. // 相关盘点单下拉数据
  37. // 从仓库拿数据
  38. const dispatch = useDispatch()
  39. useEffect(() => {
  40. dispatch(D7_APIList({ pageNum: 1, pageSize: 99999 }))
  41. }, [dispatch])
  42. const relatedOrderNumArr = useSelector((state: RootState) => state.D7check.tableInfo.list)
  43. const { key, id } = useParams<any>()
  44. // key:1 新增 2编辑 3审批 4查看
  45. // 事故藏品选择编号类型
  46. const [goodsArr, setGoodsArr] = useState<{ value: string; label: string; num: string }[]>([])
  47. const numNameChangeFu = useCallback(async (val: string) => {
  48. const res = await E1_APIgetGoodsList(val)
  49. if (res.code === 0) {
  50. const arr = res.data || []
  51. setGoodsArr(
  52. arr.map((v: any) => ({
  53. num: v.num,
  54. label: v.name,
  55. value: v.id + ''
  56. }))
  57. )
  58. }
  59. }, [])
  60. // 滚到顶部
  61. const sollrDom = useRef<HTMLDivElement>(null)
  62. // 顶部数据
  63. const [topInfo, setTopInfo] = useState({} as FourTableType)
  64. // 创建订单
  65. const creatFu = useCallback(async () => {
  66. const res = await E3_APIcreate()
  67. if (res.code === 0) {
  68. const obj = res.data
  69. // 从藏品详情点击按钮进来
  70. const urlAll = window.location.href
  71. if (urlAll.includes('?id=')) {
  72. const urlId = urlAll.split('?id=')[1]
  73. const res2 = await API_goodsInfo(Number(urlId))
  74. if (res2.code === 0) {
  75. obj.numName = res2.data.numName
  76. numNameChangeFu(res2.data.numName)
  77. obj.goodsIds = urlId
  78. setTopInfo(obj)
  79. }
  80. } else setTopInfo(obj)
  81. }
  82. }, [numNameChangeFu])
  83. // 获取详情
  84. const getInfoFu = useCallback(
  85. async (id2?: number) => {
  86. const res = await E3_APIgetInfo(id2 || id)
  87. if (res.code === 0) {
  88. const data = res.data
  89. setTopInfo(data)
  90. // 设置富文本
  91. ZRichTextRef.current?.ritxtShowFu(JSON.parse(data.rtf || '{}'))
  92. if (data.numName) numNameChangeFu(data.numName)
  93. }
  94. },
  95. [id, numNameChangeFu]
  96. )
  97. useEffect(() => {
  98. if (key === '1') creatFu()
  99. else getInfoFu()
  100. if (sollrDom.current) sollrDom.current.scrollTop = 0
  101. }, [creatFu, getInfoFu, key])
  102. const pageTitTxt = useMemo(() => {
  103. return Reflect.get(pageTitTxtObj, key)
  104. }, [key])
  105. const timeChange = useCallback(
  106. (e: any) => {
  107. setTopInfo({ ...topInfo, date: dayjs(e).format('YYYY-MM-DD') })
  108. },
  109. [topInfo]
  110. )
  111. // 上传附件的ref
  112. const filesRef = useRef<any>(null)
  113. // 备注的ref
  114. const ZRichTextRef = useRef<any>(null)
  115. // 审批意见的ref
  116. const ZAuditRef = useRef<any>(null)
  117. // 审批的sta
  118. const [auditSta, setAuDitSta] = useState('')
  119. // 字段的校验
  120. const checkFu = useCallback(() => {
  121. if (!topInfo.date) {
  122. MessageFu.warning('请选择登记日期')
  123. return true
  124. }
  125. if (!topInfo.numName || !topInfo.goodsIds) {
  126. MessageFu.warning('请选择登记藏品')
  127. return true
  128. }
  129. if (!topInfo.reason) {
  130. MessageFu.warning('请输入现状描述')
  131. return true
  132. }
  133. if (!topInfo.sonUser) {
  134. MessageFu.warning('请输入经手人')
  135. return true
  136. }
  137. }, [topInfo])
  138. // 新增的底部按钮点击
  139. const btnClickFu = useCallback(
  140. async (val: '草稿' | '创建' | '保存' | '审批') => {
  141. if (checkFu()) {
  142. if (sollrDom.current) sollrDom.current.scrollTop = 0
  143. return
  144. }
  145. if (val === '审批') {
  146. // console.log('审批信息富文本', rtf2)
  147. if (!auditSta) {
  148. if (sollrDom.current) sollrDom.current.scrollTop = 0
  149. return MessageFu.warning('请选择审批结果')
  150. }
  151. const rtf2 = ZAuditRef.current?.resData()
  152. const res = await E3_APIsaveAudit({
  153. orderId: topInfo.id,
  154. rtfOpinion: rtf2,
  155. status: auditSta === '同意' ? 1 : 2
  156. })
  157. if (res.code === 0) {
  158. MessageFu.success('审批成功')
  159. // 跳详情页
  160. history.push(`/actuality_edit/4/${topInfo.id}`)
  161. }
  162. } else {
  163. // 富文本
  164. const rtf1 = ZRichTextRef.current?.fatherBtnOkFu() || { flag: true }
  165. // 上传附件
  166. const filesRes = filesRef.current.filesIdRes()
  167. const obj = {
  168. ...topInfo,
  169. rtf: JSON.stringify(rtf1.val || ''),
  170. fileIds: filesRes.join(',')
  171. }
  172. // console.log(123, obj)
  173. // if (1 + 1 === 2) return
  174. if (val === '草稿') {
  175. // 存草稿 当前页保存 不跳转
  176. const res = await E3_APIsaveDraft(obj)
  177. if (res.code === 0) {
  178. MessageFu.success('草稿保存成功')
  179. getInfoFu(topInfo.id)
  180. }
  181. } else {
  182. const res = val === '创建' ? await E3_APIsaveCreate(obj) : await E3_APIsaveApply(obj)
  183. if (res.code === 0) {
  184. MessageFu.success(`${val}成功`)
  185. // 跳到详情页
  186. history.push(`/actuality_edit/4/${topInfo.id}`)
  187. }
  188. }
  189. }
  190. },
  191. [auditSta, checkFu, getInfoFu, topInfo]
  192. )
  193. // 查看的按钮创建-提交-撤回
  194. const lookBtnFu = useCallback(
  195. async (val: '创建' | '提交' | '撤回') => {
  196. // 富文本
  197. const rtf1 = ZRichTextRef.current?.fatherBtnOkFu() || { flag: true }
  198. // 上传附件
  199. const filesRes = filesRef.current.filesIdRes()
  200. const obj = {
  201. ...topInfo,
  202. rtf: JSON.stringify(rtf1.val || ''),
  203. fileIds: filesRes.join(',')
  204. }
  205. const res =
  206. val === '创建'
  207. ? await E3_APIsaveCreate(obj)
  208. : val === '提交'
  209. ? await E3_APIsaveApply(obj)
  210. : await E3_APIrevocation(id)
  211. if (res.code === 0) {
  212. if (sollrDom.current) sollrDom.current.scrollTop = 0
  213. MessageFu.success(val + '成功')
  214. getInfoFu()
  215. }
  216. },
  217. [getInfoFu, id, topInfo]
  218. )
  219. // 查看模式点击删除
  220. const delFu = useCallback(async () => {
  221. const res = await E3_APIdel(id)
  222. if (res.code === 0) {
  223. MessageFu.success('删除成功')
  224. history.push('/actuality')
  225. }
  226. }, [id])
  227. // 查看模式点击审批 编辑
  228. const lookJumpFu = useCallback(
  229. (val: '审批' | '编辑') => {
  230. history.push(`/actuality_edit/${val === '审批' ? 3 : 2}/${id}`)
  231. MessageFu.success(`已跳转至${val}页面`)
  232. },
  233. [id]
  234. )
  235. // 查看模式下的按钮
  236. const lookBtn = useMemo(() => {
  237. return (
  238. <>
  239. {btnFlagFu2(topInfo)['创建'] ? (
  240. <Button type='primary' onClick={() => lookBtnFu('创建')}>
  241. 创建
  242. </Button>
  243. ) : null}
  244. {btnFlagFu2(topInfo)['提交'] ? (
  245. <Button type='primary' onClick={() => lookBtnFu('提交')}>
  246. 提交
  247. </Button>
  248. ) : null}
  249. {btnFlagFu2(topInfo)['撤回'] ? (
  250. <MyPopconfirm
  251. txtK='撤回'
  252. onConfirm={() => lookBtnFu('撤回')}
  253. Dom={
  254. <Button type='primary' danger>
  255. 撤回
  256. </Button>
  257. }
  258. />
  259. ) : null}
  260. {btnFlagFu2(topInfo)['审批'] ? (
  261. <Button type='primary' onClick={() => lookJumpFu('审批')}>
  262. 审批
  263. </Button>
  264. ) : null}
  265. {btnFlagFu2(topInfo)['编辑'] ? (
  266. <Button type='primary' onClick={() => lookJumpFu('编辑')}>
  267. 编辑
  268. </Button>
  269. ) : null}
  270. {btnFlagFu2(topInfo)['重新提交'] ? (
  271. <Button type='primary' onClick={() => lookBtnFu('提交')}>
  272. 重新提交
  273. </Button>
  274. ) : null}
  275. {EXbtnFu(topInfo)}
  276. {btnFlagFu2(topInfo)['删除'] ? (
  277. <MyPopconfirm
  278. txtK='删除'
  279. onConfirm={() => delFu()}
  280. Dom={
  281. <Button type='primary' danger>
  282. 删除
  283. </Button>
  284. }
  285. />
  286. ) : null}
  287. <Button onClick={() => history.push('/actuality')}>返回</Button>
  288. </>
  289. )
  290. }, [delFu, lookBtnFu, lookJumpFu, topInfo])
  291. // 申请记录
  292. const [auditsShow, setAuditsShow] = useState(false)
  293. return (
  294. <div className={styles.E3edit}>
  295. <div className='pageTitle'>现状登记-{pageTitTxt}</div>
  296. <div className='E3main' ref={sollrDom}>
  297. {['3'].includes(key) ? (
  298. <X3auditInfo
  299. dirCode='E3actuality'
  300. myUrl='cms/goodsFile/upload'
  301. auditSta={auditSta}
  302. auditStaFu={val => setAuDitSta(val)}
  303. ref={ZAuditRef}
  304. />
  305. ) : null}
  306. {/* 表单字段、附件等 */}
  307. <div className='E3Tit'>
  308. 申请信息
  309. {key === '1' ? null : (
  310. <Button type='dashed'>{Reflect.get(statusObj, topInfo.status)}</Button>
  311. )}
  312. </div>
  313. <div className='E3rowAll'>
  314. <div className='E3row'>
  315. <div className='E3rowll'>申请类型:</div>
  316. <div className='E3rowrr'>{topInfo.name}</div>
  317. </div>
  318. <div className='E3row'>
  319. <div className='E3rowll'>
  320. <span> * </span>登记日期:
  321. </div>
  322. <div className='E3rowrr'>
  323. <DatePicker
  324. disabled={['3', '4'].includes(key)}
  325. allowClear={false}
  326. value={topInfo.date ? dayjs(topInfo.date) : null}
  327. onChange={timeChange}
  328. />
  329. </div>
  330. </div>
  331. <div className='E3row E3rowFull2'>
  332. <div className='E3rowll'>
  333. <span> * </span>登记藏品:
  334. </div>
  335. <div className='E3rowrr'>
  336. <Select
  337. disabled={['3', '4'].includes(key)}
  338. allowClear={false}
  339. placeholder='请选择编号类型'
  340. style={{ width: 150 }}
  341. value={topInfo.numName ? topInfo.numName : null}
  342. onChange={e => {
  343. setTopInfo({ ...topInfo, numName: e, goodsIds: '' })
  344. numNameChangeFu(e)
  345. }}
  346. options={selectObj['藏品编号类型']}
  347. />
  348. <Select
  349. disabled={['3', '4'].includes(key) || !topInfo.numName}
  350. placeholder={!topInfo.numName ? '请先选择编号类型' : '请输入藏品编号或藏品名称'}
  351. showSearch
  352. filterOption={(input, option) => {
  353. const txt = option!.label + option!.num
  354. return txt.toLowerCase().includes(input.toLowerCase())
  355. }}
  356. options={goodsArr}
  357. // fieldNames={{ label: 'num', value: 'num' }}
  358. allowClear={false}
  359. value={topInfo.goodsIds || null}
  360. onChange={e => setTopInfo({ ...topInfo, goodsIds: e ? e : '' })}
  361. />
  362. </div>
  363. </div>
  364. <div className='E3row E3rowFull2'>
  365. <div className='E3rowll'>
  366. <span> * </span>现状描述:
  367. </div>
  368. <div className='E3rowrr'>
  369. <TextArea
  370. value={topInfo.reason}
  371. onChange={e => setTopInfo({ ...topInfo, reason: e.target.value.trim() })}
  372. readOnly={['3', '4'].includes(key)}
  373. placeholder='请输入内容'
  374. maxLength={500}
  375. showCount
  376. />
  377. </div>
  378. </div>
  379. <div className='E3row'>
  380. <div className='E3rowll'>
  381. <span> * </span>经手人:
  382. </div>
  383. <div className='E3rowrr'>
  384. <Input
  385. value={topInfo.sonUser}
  386. onChange={e => setTopInfo({ ...topInfo, sonUser: e.target.value.trim() })}
  387. readOnly={['3', '4'].includes(key)}
  388. placeholder='请输入内容'
  389. maxLength={30}
  390. showCount
  391. />
  392. </div>
  393. </div>
  394. <div className='E3row'>
  395. <div className='E3rowll'>相关盘点单:</div>
  396. <div className='E3rowrr'>
  397. <Select
  398. disabled={['3', '4'].includes(key)}
  399. placeholder={['3', '4'].includes(key) ? '空' : '请搜索盘点单编号'}
  400. showSearch
  401. filterOption={(input, option) => {
  402. const txt = option!.label
  403. return txt.toLowerCase().includes(input.toLowerCase())
  404. }}
  405. options={relatedOrderNumArr.map(v => ({ value: v.id + '', label: v.num }))}
  406. // fieldNames={{ label: 'num', value: 'num' }}
  407. allowClear={false}
  408. value={topInfo.relatedOrderNum || null}
  409. onChange={e => setTopInfo({ ...topInfo, relatedOrderNum: e ? e : '' })}
  410. />
  411. </div>
  412. </div>
  413. <div className='E3row E3row2'>
  414. <div className='E3rowll'>附件:</div>
  415. <div className='E3rowrr'>
  416. <Z3upFiles
  417. max={10}
  418. isLook={['3', '4'].includes(key)}
  419. ref={filesRef}
  420. fileCheck={false}
  421. dirCode='E3actuality'
  422. myUrl='cms/orderPreserveCurrent/upload'
  423. lookData={topInfo.files || []}
  424. size={500}
  425. fromData={{ moduleId: topInfo.id }}
  426. />
  427. </div>
  428. </div>
  429. <div className='E3row E3rowFull'>
  430. <div className='E3rowll'>备注:</div>
  431. <div className='E3rowrr'>
  432. <ZRichTexts
  433. check={false}
  434. dirCode='E3actuality'
  435. myUrl='cms/goodsFile/upload'
  436. isLook={['3', '4'].includes(key)}
  437. ref={ZRichTextRef}
  438. isOne={true}
  439. upAudioBtnNone={true}
  440. />
  441. </div>
  442. </div>
  443. </div>
  444. {/* 申请流程 */}
  445. {auditsShow ? (
  446. <ZflowTable tableArr={topInfo.audits || []} closeFu={() => setAuditsShow(false)} />
  447. ) : null}
  448. {/* 附件归档 */}
  449. {topInfo.status === 4 ? (
  450. <ZupFileTable
  451. listTemp={topInfo.filing || []}
  452. dirCode='E3actuality'
  453. myUrl='cms/orderPreserveCurrent/upload'
  454. fromData={{ moduleId: topInfo.id }}
  455. />
  456. ) : null}
  457. </div>
  458. {/* 底部按钮 */}
  459. <div className='E3btn'>
  460. {['3', '4'].includes(key) && topInfo.audits && topInfo.audits.length ? (
  461. <Button type='primary' onClick={() => setAuditsShow(true)}>
  462. 申请记录
  463. </Button>
  464. ) : null}
  465. {key === '4' ? (
  466. lookBtn
  467. ) : (
  468. <>
  469. {key === '3' ? (
  470. <Button type='primary' onClick={() => btnClickFu('审批')}>
  471. 审批
  472. </Button>
  473. ) : (
  474. <Button type='primary' onClick={() => btnClickFu(key === '1' ? '创建' : '保存')}>
  475. {key === '1' ? '创建' : '保存'}
  476. </Button>
  477. )}
  478. {key === '1' ? (
  479. <Button type='primary' onClick={() => btnClickFu('草稿')}>
  480. 存草稿
  481. </Button>
  482. ) : null}
  483. <MyPopconfirm txtK='取消' onConfirm={() => history.push('/accident')} />
  484. </>
  485. )}
  486. </div>
  487. </div>
  488. )
  489. }
  490. const MemoE3edit = React.memo(E3edit)
  491. export default MemoE3edit