AddAssembly.tsx 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import useModal from '@/components/Modal'
  2. import { updateAssembly } from '@/services/api/business'
  3. import consts from '@/utils/consts'
  4. import {
  5. CodepenSquareFilled,
  6. ContainerFilled,
  7. DollarCircleFilled,
  8. FolderFilled,
  9. ProfileFilled,
  10. SlackSquareFilled
  11. } from '@ant-design/icons'
  12. import { Button, Card, Checkbox, Col, message, Row } from 'antd'
  13. import React, { useState } from 'react'
  14. import { Assembly } from './AssemblyDetail'
  15. import Picture from './Picture'
  16. import { EmitterType } from '@/enums/emit'
  17. import classNames from 'classnames'
  18. type AddAssemblyProps = {
  19. defaultData: API.MatterTreeItem
  20. close: () => void
  21. event$: EmitterType<void>
  22. }
  23. const AddAssembly: React.FC<AddAssemblyProps> = ({ defaultData, close, event$ }) => {
  24. const [modal, ModalDOM] = useModal()
  25. const [assemblyList, setAssemblyList] = useState(defaultData?.assembly || [])
  26. const handleAssemblyOnchange = (checked: boolean, checkName: string) => {
  27. let newAssemblyList
  28. if (checked) {
  29. newAssemblyList = [...assemblyList, checkName]
  30. } else {
  31. newAssemblyList = assemblyList.filter(item => item !== checkName)
  32. }
  33. setAssemblyList(newAssemblyList)
  34. }
  35. const onOk = async () => {
  36. const ID = defaultData?.ID
  37. const { code = -1 } = await updateAssembly({ ID: defaultData?.ID, assembly: assemblyList })
  38. if (code === consts.RET_CODE.SUCCESS) {
  39. message.success('添加成功')
  40. close()
  41. event$.emit(EmitterType.BUSINESS_MATTER_REFRESH)
  42. event$.emit(EmitterType.MATTER_DETAIL_REFRESH, { ID })
  43. }
  44. }
  45. const openModal = (type: Assembly) => {
  46. modal.open({
  47. title: '预览',
  48. okText: '确认',
  49. cancelText: '取消',
  50. width: 1000,
  51. wrapClassName: 'modalTableBox',
  52. children: <Picture type={type} close={() => modal.close()} />,
  53. footer: null
  54. })
  55. }
  56. return (
  57. <div>
  58. <Row gutter={[16, 16]} className="p-24px">
  59. <Col span={8}>
  60. <Card
  61. size="small"
  62. className={classNames({ 'border border-hex-40a9ff': assemblyList.includes(Assembly.FORM) })}
  63. title={
  64. <div className="flex mt-1">
  65. <span>
  66. <ProfileFilled className="mr-1" style={{ fontSize: '20px', color: '#40A9FF' }} />
  67. </span>
  68. <span>表单</span>
  69. </div>
  70. }
  71. extra={
  72. <Checkbox
  73. onChange={e => handleAssemblyOnchange(e.target.checked, Assembly.FORM)}
  74. checked={assemblyList.includes(Assembly.FORM)}
  75. />
  76. }>
  77. <div className="min-h-70px">
  78. 表单时用来提交资料、意见、规范流程、执行过程的格式,提供丰富的业务字段,快速定制业务表单。
  79. </div>
  80. <Button onClick={() => openModal(Assembly.FORM)}>点击预览组件</Button>
  81. </Card>
  82. </Col>
  83. <Col span={8}>
  84. <Card
  85. size="small"
  86. className={classNames({
  87. 'border border-hex-40a9ff': assemblyList.includes(Assembly.COSTPROFILE)
  88. })}
  89. title={
  90. <div className="flex mt-1">
  91. <span>
  92. <SlackSquareFilled className="mr-1" style={{ fontSize: '20px', color: '#52C41A' }} />
  93. </span>
  94. <span>送审资料清单</span>
  95. </div>
  96. }
  97. extra={
  98. <Checkbox
  99. onChange={e => handleAssemblyOnchange(e.target.checked, Assembly.COSTPROFILE)}
  100. checked={assemblyList.includes(Assembly.COSTPROFILE)}
  101. />
  102. }>
  103. <div className="min-h-70px">自定义审核资料模板,承载业务审批过程中资料及附件业务。</div>
  104. <Button onClick={() => openModal(Assembly.COSTPROFILE)}>点击预览组件</Button>
  105. </Card>
  106. </Col>
  107. <Col span={8}>
  108. <Card
  109. size="small"
  110. className={classNames({
  111. 'border border-hex-40a9ff': assemblyList.includes(Assembly.DATAPROFILE)
  112. })}
  113. title={
  114. <div className="flex mt-1">
  115. <span>
  116. <CodepenSquareFilled className="mr-1" style={{ fontSize: '20px', color: '#722ED1' }} />
  117. </span>
  118. <span>造价文件</span>
  119. </div>
  120. }
  121. extra={
  122. <Checkbox
  123. onChange={e => handleAssemblyOnchange(e.target.checked, Assembly.DATAPROFILE)}
  124. checked={assemblyList.includes(Assembly.DATAPROFILE)}
  125. />
  126. }>
  127. <div className="min-h-70px">
  128. 提供全过程造价文件的体系架构关键数据汇总,实现全过程造价文件的标准化管理。
  129. </div>
  130. <Button onClick={() => openModal(Assembly.DATAPROFILE)}>点击预览组件</Button>
  131. </Card>
  132. </Col>
  133. <Col span={8}>
  134. <Card
  135. size="small"
  136. className={classNames({
  137. 'border border-hex-40a9ff': assemblyList.includes(Assembly.ACHIEVEMENT)
  138. })}
  139. title={
  140. <div className="flex mt-1">
  141. <span>
  142. <FolderFilled className="mr-1" style={{ fontSize: '20px', color: '#FA8C16' }} />
  143. </span>
  144. <span>其他成果文件</span>
  145. </div>
  146. }
  147. extra={
  148. <Checkbox
  149. disabled
  150. onChange={e => handleAssemblyOnchange(e.target.checked, Assembly.ACHIEVEMENT)}
  151. checked={assemblyList.includes(Assembly.ACHIEVEMENT)}
  152. />
  153. }>
  154. <div className="min-h-70px">功能开发中...</div>
  155. <Button onClick={() => openModal(Assembly.ACHIEVEMENT)}>点击预览组件</Button>
  156. </Card>
  157. </Col>
  158. <Col span={8}>
  159. <Card
  160. size="small"
  161. className={classNames({ 'border border-hex-40a9ff': assemblyList.includes(Assembly.COST) })}
  162. title={
  163. <div className="flex mt-1">
  164. <span>
  165. <DollarCircleFilled className="mr-1" style={{ fontSize: '20px', color: '#FAAD14' }} />
  166. </span>
  167. <span>审核金额汇总</span>
  168. </div>
  169. }
  170. extra={
  171. <Checkbox
  172. disabled
  173. onChange={e => handleAssemblyOnchange(e.target.checked, Assembly.COST)}
  174. checked={assemblyList.includes(Assembly.COST)}
  175. />
  176. }>
  177. <div className="min-h-70px">功能开发中...</div>
  178. <Button onClick={() => openModal(Assembly.COST)}>点击预览组件</Button>
  179. </Card>
  180. </Col>
  181. <Col span={8}>
  182. <Card
  183. size="small"
  184. className={classNames({ 'border border-hex-40a9ff': assemblyList.includes(Assembly.FILE) })}
  185. title={
  186. <div className="flex mt-1">
  187. <span>
  188. <ContainerFilled className="mr-1" style={{ fontSize: '20px', color: '#13C2C2' }} />
  189. </span>
  190. <span>工程预算审核管理档案目录</span>
  191. </div>
  192. }
  193. extra={
  194. <Checkbox
  195. disabled
  196. onChange={e => handleAssemblyOnchange(e.target.checked, Assembly.FILE)}
  197. checked={assemblyList.includes(Assembly.FILE)}
  198. />
  199. }>
  200. <div className="min-h-70px">功能开发中...</div>
  201. <Button onClick={() => openModal(Assembly.FILE)}>点击预览组件</Button>
  202. </Card>
  203. </Col>
  204. </Row>
  205. <div className="ant-modal-footer mt-4">
  206. <Button onClick={close}>取消</Button>
  207. <Button type="primary" onClick={onOk}>
  208. 确定
  209. </Button>
  210. </div>
  211. {ModalDOM}
  212. </div>
  213. )
  214. }
  215. export default AddAssembly