index.tsx 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. import DatePicker from '@/components/DatePicker'
  2. import { apiAutoCode } from '@/pages/Safe/Content/List/api'
  3. import { contractStore, tenderStore } from '@/store/mobx'
  4. import { iModalCommonProps } from '@/types/contract'
  5. import consts from '@/utils/consts'
  6. import { dayjsFormat } from '@/utils/util'
  7. import { Button, Form, Input, Modal, Select } from 'antd'
  8. import locale from 'antd/es/date-picker/locale/zh_CN'
  9. import React, { useEffect, useState } from 'react'
  10. import { apiGetReturnWay } from '../Tabs/Receivable/api'
  11. import styles from './index.module.scss'
  12. const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible, confirmLoading }, onConfirm, onCancel, reload, row }) => {
  13. const { Option } = Select
  14. const [ form ] = Form.useForm()
  15. const [ options, setOptions ] = useState<string[]>([])
  16. const modalObj = {
  17. create: {
  18. title: '新建合同',
  19. cancelText: '取消',
  20. okText: '确认添加'
  21. },
  22. update: {
  23. title: '编辑合同',
  24. cancelText: '取消',
  25. okText: '确认'
  26. },
  27. close: {
  28. title: '关闭合同',
  29. cancelText: '取消',
  30. okText: '确认关闭'
  31. },
  32. del: {
  33. title: '删除合同',
  34. cancelText: '取消',
  35. okText: '确认删除'
  36. },
  37. unlock: {
  38. title: '解锁合同',
  39. cancelText: '取消',
  40. okText: '确认解锁'
  41. },
  42. return: {
  43. title: '添加回款',
  44. cancelText: '关闭',
  45. okText: '确认'
  46. }
  47. }
  48. useEffect(() => {
  49. if (visible) {
  50. form.setFieldsValue({ treeId: row.id, bidsectionId: row.bidsectionId })
  51. if (type === "update") {
  52. const { content="", name="", price="", partyA="", partyB="", partyASigner="",partyBSigner="" } = contractStore.contract
  53. form.setFieldsValue({ content, name, price, partyA, partyB, partyASigner, partyBSigner })
  54. } else if (type === 'return') {
  55. apiGetReturnWay().then(({ code = -1, data = [] }) => {
  56. if (code === consts.RET_CODE.SUCCESS) {
  57. const options = data.map((item: string) => <Option key={item} value={item}>{item}</Option>)
  58. setOptions(options)
  59. }
  60. })
  61. form.setFieldsValue({ contractsId: contractStore.contract.id })
  62. } else {
  63. form.setFieldsValue({ id: contractStore.contract.id })
  64. }
  65. }
  66. }, [ visible ])
  67. const autoCodeHandler = async () => {
  68. const { code = -1, data = "" } = await apiAutoCode(tenderStore.tender.bidsectionId, 'contractRule')
  69. if (code === consts.RET_CODE.SUCCESS) {
  70. if (data) {
  71. const ruleArr: string[] = []
  72. const code = JSON.parse(data)
  73. for (const key in code) {
  74. if (Object.prototype.hasOwnProperty.call(code, key)) {
  75. const element = code[key]
  76. if (element) {
  77. ruleArr.push(element)
  78. }
  79. }
  80. }
  81. form.setFieldsValue({ code: ruleArr.join("-") })
  82. }
  83. }
  84. }
  85. return (
  86. <Modal
  87. getContainer={false}
  88. visible={visible}
  89. title={modalObj[type]?.title}
  90. onCancel={onCancel}
  91. footer={<div className="pi-justify-end">
  92. {type === 'update' ? <Button type="primary" key="delete" size="small" danger onClick={() => reload('del')}>删除合同</Button> : ''}
  93. <Button type="default" size="small" key="cancel" className="pi-btn-secondary" onClick={onCancel}>{modalObj[type]?.cancelText}</Button>
  94. <Button
  95. type="primary"
  96. size="small"
  97. key="ok"
  98. loading={confirmLoading}
  99. danger={type === 'del'}
  100. onClick={() => {
  101. form.validateFields().then(values => {
  102. form.resetFields()
  103. if (type === 'update') {
  104. values.signerTime = dayjsFormat(values.signerTime, 'YYYY-MM-DD HH:mm:ss')
  105. }
  106. if (type === 'del') {
  107. delete values.warningText
  108. }
  109. if (type === 'return') {
  110. values.time = dayjsFormat(values.time, 'YYYY-MM-DD HH:mm:ss')
  111. }
  112. onConfirm(values, type)
  113. }).catch(info => {
  114. console.error('Validate Failed:', info)
  115. })
  116. }}>{modalObj[type]?.okText}</Button>
  117. </div>}
  118. >
  119. <Form
  120. form={form}
  121. layout='vertical'
  122. style={type === 'update' ? { maxHeight: '482px', overflowY: 'scroll', paddingRight: 5 } : { overflow: 'hidden' }}
  123. >
  124. <Form.Item name="bidsectionId" hidden>
  125. <Input></Input>
  126. </Form.Item>
  127. <Form.Item name="treeId" label="合同劳务" hidden>
  128. <Input></Input>
  129. </Form.Item>
  130. {
  131. type === 'create' ? (
  132. <>
  133. <Form.Item name="code" label="合同编号" rules={[ { required: true, message: '请输入合同编号' } ]} className={styles.contractFormItem}>
  134. <Input addonAfter={<span className="pi-pd-lr-11" onClick={() => autoCodeHandler()}>自动编号</span>}></Input>
  135. </Form.Item>
  136. <Form.Item name="name" label="合同名称" rules={[ { required: true, message: '请输入合同名称' } ]}>
  137. <Input placeholder="输入合同名称"></Input>
  138. </Form.Item>
  139. <Form.Item name="contractsType" label="合同类型" rules={[ { required: true, message: '请选择合同类型' } ]}>
  140. <Select showSearch>
  141. <Option value={1}>支出合同</Option>
  142. <Option value={2}>收入合同</Option>
  143. </Select>
  144. </Form.Item>
  145. <Form.Item name="price" label="合同金额" rules={[ { required: true, message: '请输入合同金额' } ]}>
  146. <Input placeholder="输入合同金额" addonAfter={<span>元</span>}></Input>
  147. </Form.Item>
  148. </>
  149. ) : ''
  150. }
  151. {
  152. type === 'update' ? (
  153. <>
  154. <Form.Item name="content" label="项目内容" rules={[ { required: true, message: '请输入项目内容' } ]}>
  155. <Input></Input>
  156. </Form.Item>
  157. <Form.Item name="name" label="合同名称" rules={[ { required: true, message: '请输入项目内容' } ]}>
  158. <Input></Input>
  159. </Form.Item>
  160. <Form.Item name="price" label="合同金额" rules={[ { required: true, message: '请输入项目金额' } ]}>
  161. <Input></Input>
  162. </Form.Item>
  163. <Form.Item name="partyA" label="甲方" rules={[ { required: true, message: '请输入甲方' } ]}>
  164. <Input></Input>
  165. </Form.Item>
  166. <Form.Item name="partyASigner" label="甲方签约人" rules={[ { required: true, message: '请输入甲方签约人' } ]}>
  167. <Input></Input>
  168. </Form.Item>
  169. <Form.Item name="partyB" label="乙方" rules={[ { required: true, message: '请输入乙方' } ]}>
  170. <Input></Input>
  171. </Form.Item>
  172. <Form.Item name="partyBSigner" label="乙方签约人" rules={[ { required: true, message: '请输入乙方签约人' } ]}>
  173. <Input></Input>
  174. </Form.Item>
  175. <Form.Item name="signerTime" label="合同签约日期" rules={[ { required: true, message: '请选择签约日期' } ]}>
  176. <DatePicker allowClear locale={locale} className="pi-width-100P"></DatePicker>
  177. </Form.Item>
  178. <Form.Item name="remarks" label="备注">
  179. <Input.TextArea maxLength={100}></Input.TextArea >
  180. </Form.Item>
  181. </>
  182. ) : ''
  183. }
  184. {
  185. type === 'close' ? (
  186. <>
  187. <Form.Item name="id" hidden><Input></Input></Form.Item>
  188. <span>关闭后,合同将锁定,无法进行编辑、上传文件等操作。</span>
  189. </>
  190. ) : ''
  191. }
  192. {
  193. type === 'unlock' ? (
  194. <>
  195. <Form.Item name="id" hidden><Input></Input></Form.Item>
  196. <span>解锁后,合同将锁定,无法进行编辑、上传文件等操作。</span>
  197. </>
  198. ) : ''
  199. }
  200. {
  201. type === "del" ? (
  202. <>
  203. <Form.Item name="id" hidden><Input></Input></Form.Item>
  204. <p className="mb-2">删除后,数据无法恢复,请谨慎操作。</p>
  205. <p className="mb-2">请在下方文本框输入文本「<span className="pi-red">确认删除本合同</span>」,以此确认删除操作。</p>
  206. <Form.Item name="warningText"rules={[ () => ({
  207. validator(rule, value) {
  208. if (!value || value !== "确认删除本合同") {
  209. return Promise.reject("请按照提示信息进行删除操作!")
  210. }
  211. return Promise.resolve()
  212. }
  213. }) ]}>
  214. <Input placeholder="输入文本, 确认删除"></Input>
  215. </Form.Item>
  216. </>
  217. ) : ''
  218. }
  219. {
  220. type === 'return' ?
  221. <>
  222. <Form.Item name="contractsId" hidden><Input></Input></Form.Item>
  223. <Form.Item name="time" label="回款日期" rules={[ { required: true, message: '请选择回款日期' } ]}>
  224. <DatePicker allowClear locale={locale} className="pi-width-100P"></DatePicker>
  225. </Form.Item>
  226. <Form.Item name="price" label="回款金额" rules={[ { required: true, message: '请选择回款金额' } ]}>
  227. <Input></Input>
  228. </Form.Item>
  229. <Form.Item name="way" label="支付方式" rules={[ { required: true, message: '请选择回款方式' } ]}>
  230. <Select>
  231. {options}
  232. </Select>
  233. </Form.Item>
  234. <Form.Item name="remarks" label="备注">
  235. <Input.TextArea maxLength={100}></Input.TextArea >
  236. </Form.Item>
  237. </>
  238. : ''
  239. }
  240. </Form>
  241. </Modal>
  242. )
  243. }
  244. export default ContractModal