AddModal.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. import React, { useState } from 'react';
  2. import { message, Form, Modal, Select, DatePicker, TreeSelect, Input } from 'antd';
  3. import { connect } from 'dva';
  4. import moment from 'moment';
  5. const { Option } = Select;
  6. const { MonthPicker } = DatePicker;
  7. const { TreeNode } = TreeSelect;
  8. function AddModal(props) {
  9. const {
  10. visible,
  11. onOk,
  12. onCancel,
  13. time,
  14. typeList = [],
  15. subTypeList = [],
  16. dispatch,
  17. project = [],
  18. loading,
  19. depUserTree,
  20. } = props;
  21. const [form] = Form.useForm();
  22. const [type, setType] = useState({});
  23. const [subType, setSubType] = useState({});
  24. const [showDepSelect, setShowDepSelect] = useState(false);
  25. const handleOk = () => {
  26. form.validateFields().then(values => {
  27. if (type.type == 0 || subType.type == 0) {
  28. if (!values.project) {
  29. message.error('请选择项目');
  30. return;
  31. }
  32. } else {
  33. values.project = '0';
  34. }
  35. let params = [
  36. {
  37. type_id: Number(values.subType),
  38. comment: values.comment,
  39. // 父级id
  40. parent_type_id: Number(values.type),
  41. data: [
  42. {
  43. project_id: Number(values.project),
  44. workload: 0,
  45. day: time,
  46. },
  47. ],
  48. },
  49. ];
  50. if (type.type == 0 && values.project == '0') {
  51. params[0].data[0].pay_dep_id = Number(values.pay_dep_id);
  52. }
  53. onOk(params);
  54. //将分类设为空,避免再次打开时有项目选单
  55. setType({});
  56. setSubType({});
  57. setShowDepSelect(false);
  58. form.resetFields();
  59. });
  60. };
  61. //同为将分类设为空
  62. const handleCancel = () => {
  63. setType({});
  64. setSubType({});
  65. setShowDepSelect(false);
  66. form.resetFields();
  67. onCancel();
  68. };
  69. const onChangeType = value => {
  70. let item = typeList.find(t => t.id == value);
  71. form.setFieldsValue({
  72. project: null,
  73. subType: null,
  74. });
  75. setType(item);
  76. setSubType({});
  77. setShowDepSelect(false);
  78. dispatch({
  79. type: 'workload/save',
  80. payload: { subTypeList: [] },
  81. });
  82. if (!item.type) {
  83. dispatch({
  84. type: 'workload/queryProject',
  85. payload: { stage: value },
  86. });
  87. } else {
  88. dispatch({
  89. type: 'workload/querySubType',
  90. payload: { parent_id: item.id },
  91. callback: subTypeList => {
  92. if (value == 33) {
  93. form.setFieldsValue({
  94. project: null,
  95. subType: subTypeList[0].id + '',
  96. });
  97. setSubType(subTypeList[0]);
  98. }
  99. },
  100. });
  101. }
  102. };
  103. const onChangeSubType = value => {
  104. let item = subTypeList.find(t => t.id == value);
  105. setSubType(item);
  106. };
  107. //售前支持更改项目时与子类选单联动
  108. const onChangeProject = value => {
  109. form.setFieldsValue({ subType: '' });
  110. dispatch({
  111. type: 'workload/querySubType',
  112. payload: { parent_id: type.id, project_id: value },
  113. callback: subTypeList => {
  114. if (type.id == 35) {
  115. form.setFieldsValue({ subType: subTypeList[0].id + '' });
  116. setSubType(subTypeList[0]);
  117. setShowDepSelect(false);
  118. }
  119. if (type.id == 2) {
  120. if (value == '0') {
  121. form.setFieldsValue({ subType: subTypeList[0].id + '' });
  122. setSubType(subTypeList[0]);
  123. setShowDepSelect(true);
  124. } else {
  125. form.setFieldsValue({ subType: subTypeList[1].id + '' });
  126. setSubType(subTypeList[1]);
  127. setShowDepSelect(false);
  128. }
  129. }
  130. },
  131. });
  132. };
  133. //分类选单
  134. const renderType = () => {
  135. return (
  136. <Form.Item label="分类" name="type" rules={[{ required: true, message: '请选择分类' }]}>
  137. <Select onChange={onChangeType} placeholder="请选择分类">
  138. {typeList.map(item => (
  139. <Option key={String(item.id)}>{item.name}</Option>
  140. ))}
  141. </Select>
  142. </Form.Item>
  143. );
  144. };
  145. //项目选单
  146. const renderProject = () => {
  147. return (
  148. <Form.Item label="项目" name="project" rules={[{ required: true, message: '请选择项目' }]}>
  149. {/* 售前支持特殊判断,增加“无项目”,选择项目时与子类联动 */}
  150. <Select
  151. showSearch
  152. onChange={onChangeProject}
  153. placeholder="请选择项目"
  154. optionFilterProp="children"
  155. filterOption={(input, option) =>
  156. option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
  157. }
  158. >
  159. {type.id === 2 && <Option key={'0'}>售前支持(10100)</Option>}
  160. {project.map(item => (
  161. <Option key={String(item.ID)}>{`${item.Name}(${item.Code})`}</Option>
  162. ))}
  163. </Select>
  164. </Form.Item>
  165. );
  166. };
  167. //子类选单
  168. const renderSubType = () => {
  169. return (
  170. <Form.Item label="子类" name="subType" rules={[{ required: true, message: '请选择子类' }]}>
  171. {/* 售前支持特殊判断,子类不可选 */}
  172. <Select
  173. disabled={type.id === 2}
  174. onChange={onChangeSubType}
  175. placeholder={type.id === 2 ? null : '请选择子类'}
  176. >
  177. {(subTypeList || []).map(item => (
  178. <Option key={String(item.id)}>{`${item.name}(${item.code})`}</Option>
  179. ))}
  180. </Select>
  181. </Form.Item>
  182. );
  183. };
  184. //部门选择
  185. const renderDepSelect = () => {
  186. return (
  187. <Form.Item label="部门" name="pay_dep_id" rules={[{ required: true, message: '请选择部门' }]}>
  188. <TreeSelect
  189. showSearch
  190. allowClear
  191. // style={{ width: 240 }}
  192. placeholder="请选择部门"
  193. multiple={false}
  194. treeData={depUserTree}
  195. filterTreeNode={(input, option) => {
  196. return option.props.title === input;
  197. }}
  198. />
  199. </Form.Item>
  200. );
  201. };
  202. return (
  203. <Modal
  204. title="工时"
  205. visible={visible}
  206. confirmLoading={loading}
  207. onCancel={handleCancel}
  208. maskClosable={false}
  209. onOk={handleOk}
  210. destroyOnClose
  211. >
  212. <Form labelCol={{ span: 4 }} wrapperCol={{ span: 16 }} form={form}>
  213. {renderType()}
  214. {type.type == 0 && renderProject()}
  215. {showDepSelect && renderDepSelect()}
  216. {renderSubType()}
  217. <Form.Item label="时间">{time}</Form.Item>
  218. <Form.Item label="备注" name="comment">
  219. <Input />
  220. </Form.Item>
  221. </Form>
  222. </Modal>
  223. );
  224. }
  225. export default connect(({ workload }) => ({
  226. project: workload.project,
  227. subTypeList: workload.subTypeList,
  228. }))(AddModal);