myTechDemand.jsx 61 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354
  1. import React from 'react';
  2. import {Form, Radio, Icon, Button, Input, Select, Spin, Table, Switch, message, DatePicker, Modal, Upload } from 'antd';
  3. import ajax from 'jquery/src/ajax/xhr.js';
  4. import $ from 'jquery/src/ajax';
  5. import moment from 'moment';
  6. import './techDemand.less';
  7. import TechDemandDesc from './techDemandDesc.jsx';
  8. import { demandTypeList } from '../../dataDic.js';
  9. import { companySearch, getDemandType, getSearchUrl, beforeUploadFile ,getboutique,gethot} from '../../tools.js';
  10. import BatchImport from './batchImport';
  11. const DemandList = React.createClass({
  12. loadData(pageNo, apiUrl) {
  13. this.state.data = [];
  14. if(this.state.serialNumber&&isNaN(this.state.serialNumber)){
  15. message.warning('请输入正确的编号格式');
  16. return false;
  17. }
  18. this.setState({
  19. loading: true
  20. });
  21. $.ajax({
  22. method: "get",
  23. dataType: "json",
  24. crossDomain: false,
  25. url: globalConfig.context + (apiUrl || this.props['data-listApiUrl']),
  26. data: {
  27. pageNo: pageNo || 1,
  28. pageSize: this.state.pagination.pageSize,
  29. serialNumber: this.state.serialNumber,
  30. name: this.state.name,
  31. keyword: this.state.keyword,
  32. employerName: this.state.employerName,
  33. infoSources: this.state.infoSources ? Number(this.state.infoSources) : undefined,
  34. demandType: this.state.demandType ? Number(this.state.demandType) : undefined,
  35. //username: this.state.username,
  36. status: this.state.status ? Number(this.state.status) : undefined,
  37. releaseStatus: this.state.releaseStatus ? Number(this.state.releaseStatus) : undefined,
  38. validityPeriodStartDate: this.state.validityPeriodDate[0],
  39. validityPeriodEndDate: this.state.validityPeriodDate[1],
  40. releaseDateStartDate: this.state.releaseDate[0],
  41. releaseDateEndDate: this.state.releaseDate[1],
  42. createDateStartDate: this.state.releaseDateS[0],
  43. createDateEndDate: this.state.releaseDateS[1],
  44. auditStatus: this.state.auditStatus,
  45. boutique:this.state.boutique,
  46. hot:this.state.hot,
  47. dataCategory:this.state.dataCategory,
  48. //employerName: this.state.searchType == 1 ? this.state.searchName : undefined,
  49. username: this.state.searchType == 0 && this.props['data-listApiUrl'].indexOf('org') == -1 ? this.state.searchName : undefined,
  50. unitName: this.state.searchType == 0 && this.props['data-listApiUrl'].indexOf('user') == -1 ? this.state.searchName : undefined,
  51. },
  52. success: function (data) {
  53. let theArr = [];
  54. if (!data.data || !data.data.list) {
  55. if (data.error && data.error.length) {
  56. message.warning(data.error[0].message);
  57. };
  58. } else {
  59. for (let i = 0; i < data.data.list.length; i++) {
  60. let thisdata = data.data.list[i];
  61. theArr.push({
  62. key: i,
  63. id: thisdata.id,
  64. serialNumber: thisdata.serialNumber,
  65. dataCategory: thisdata.dataCategory,
  66. name: thisdata.name,
  67. keyword: thisdata.keyword,
  68. infoSources: thisdata.infoSources,
  69. username: thisdata.username,
  70. theName: thisdata.username || thisdata.employerName,
  71. demandType: thisdata.demandType,
  72. validityPeriod: thisdata.validityPeriod,
  73. employerName: thisdata.employerName,
  74. employerId: thisdata.employerId,
  75. province: thisdata.province,
  76. status: thisdata.status,
  77. releaseStatus: thisdata.releaseStatus,
  78. releaseDate: thisdata.releaseDate,
  79. principalId: thisdata.principalId,
  80. validityPeriodFormattedDate: thisdata.validityPeriodFormattedDate,
  81. releaseDateFormattedDate: thisdata.releaseDateFormattedDate,
  82. auditStatus: thisdata.auditStatus,
  83. boutique: thisdata.boutique,
  84. urgentMoney:thisdata.urgentMoney,
  85. urgentDays:thisdata.urgentDays,
  86. hot: thisdata.hot,
  87. techBrokerId:thisdata.techBrokerId,
  88. createTimeFormattedDate: thisdata.createTimeFormattedDate,
  89. });
  90. };
  91. this.state.pagination.current = data.data.pageNo;
  92. this.state.pagination.total = data.data.totalCount;
  93. };
  94. this.setState({
  95. dataSource: theArr,
  96. pagination: this.state.pagination
  97. });
  98. }.bind(this),
  99. }).always(function () {
  100. this.setState({
  101. loading: false
  102. });
  103. }.bind(this));
  104. },
  105. mateLoadData(pageNo, apiUrl) {
  106. let demandId ='';
  107. for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
  108. let rowItem = this.state.selectedRows[idx];
  109. if (rowItem.id) {
  110. demandId=rowItem.id;
  111. };
  112. };
  113. this.setState({
  114. loading: true
  115. });
  116. $.ajax({
  117. method: "get",
  118. dataType: "json",
  119. crossDomain: false,
  120. url: globalConfig.context + '/api/admin/demand/listDemandFollow',
  121. data: {
  122. id:demandId,
  123. pageNo: pageNo || 1,
  124. pageSize: this.state.matepagination.pageSize,
  125. },
  126. success: function (data) {
  127. let theArr = [];
  128. if (!data.data || !data.data.list) {
  129. if (data.error && data.error.length) {
  130. message.warning(data.error[0].message);
  131. };
  132. } else {
  133. for (let i = 0; i < data.data.list.length; i++) {
  134. let thisdata = data.data.list[i];
  135. theArr.push({
  136. key: i,//序列号
  137. id: thisdata.id,//匹配跟进ID
  138. demandId: thisdata.demandId,//需求ID
  139. organization: thisdata.organization,//匹配机构
  140. contacts: thisdata.contacts,//联系人
  141. contactMobile: thisdata.contactMobile,//联系方式
  142. result: thisdata.result,//跟进结果
  143. lastFollowTime: thisdata.lastFollowTime,//最新跟进时间
  144. sources: thisdata.sources,//来源
  145. name: thisdata.name,//需求名称
  146. employerName: thisdata.employerName,//需求公司名称
  147. employerContactsMobile: thisdata.employerContactsMobile,//需求联系方式
  148. employerContactsMailbox: thisdata.employerContactsMailbox,//需求联系邮箱
  149. createTime: thisdata.createTime,//录入时间
  150. adminName: thisdata.adminName,//录入人
  151. remark:thisdata.remark,//备注
  152. });
  153. };
  154. this.state.matepagination.current = data.data.pageNo;
  155. this.state.matepagination.total = data.data.totalCount;
  156. };
  157. this.setState({
  158. mateDataSource: theArr,
  159. matepagination: this.state.matepagination,
  160. });
  161. }.bind(this),
  162. }).always(function () {
  163. this.setState({
  164. loading: false
  165. });
  166. }.bind(this));
  167. },
  168. lookLoadData(pageNo, apiUrl) {
  169. let rowItem = '';
  170. for (let idx = 0; idx < this.state.mateselectedRows.length; idx++) {
  171. rowItem = this.state.mateselectedRows[idx];
  172. };
  173. this.setState({
  174. loading: true
  175. });
  176. $.ajax({
  177. method: "get",
  178. dataType: "json",
  179. crossDomain: false,
  180. url: globalConfig.context + '/api/admin/demand/listDemandFollowDetail',
  181. data: {
  182. pageNo: pageNo || 1,
  183. pageSize: this.state.lookpagination.pageSize,
  184. id:rowItem.id
  185. },
  186. success: function (data) {
  187. let theArr = [];
  188. if (!data.data || !data.data.list) {
  189. if (data.error && data.error.length) {
  190. message.warning(data.error[0].message);
  191. };
  192. } else {
  193. for (let i = 0; i < data.data.list.length; i++) {
  194. let thisdata = data.data.list[i];
  195. theArr.push({
  196. key: i,
  197. id: thisdata.id,//跟进情况ID
  198. demandFollowId: thisdata.demandFollowId,//匹配跟进ID
  199. remarks: thisdata.remarks,//跟进情况
  200. result: thisdata.result,//跟进结果
  201. createTime: thisdata.createTime,//跟进时间
  202. });
  203. };
  204. this.state.pagination.current = data.data.pageNo;
  205. this.state.pagination.total = data.data.totalCount;
  206. };
  207. this.setState({
  208. lookDataSource: theArr,
  209. pagination: this.state.pagination
  210. });
  211. }.bind(this),
  212. }).always(function () {
  213. this.setState({
  214. loading: false
  215. });
  216. }.bind(this));
  217. },
  218. getInitialState() {
  219. return {
  220. searchMore: true,
  221. searchType: 0,
  222. validityPeriodDate: [],
  223. releaseDate: [],
  224. releaseDateS: [],
  225. selectedRowKeys: [],
  226. mateselectedRowKeys: [],
  227. selectedRows: [],
  228. loading: false,
  229. pagination: {
  230. defaultCurrent: 1,
  231. defaultPageSize: 10,
  232. showQuickJumper: true,
  233. pageSize: 10,
  234. onChange: function (page) {
  235. this.loadData(page);
  236. }.bind(this),
  237. showTotal: function (total) {
  238. return '共' + total + '条数据';
  239. }
  240. },
  241. matepagination: {
  242. defaultCurrent: 1,
  243. defaultPageSize: 10,
  244. showQuickJumper: true,
  245. pageSize: 10,
  246. onChange: function (page) {
  247. this.mateLoadData(page);
  248. }.bind(this),
  249. showTotal: function (total) {
  250. return '共' + total + '条数据';
  251. }
  252. },
  253. lookpagination: {
  254. defaultCurrent: 1,
  255. defaultPageSize: 10,
  256. showQuickJumper: true,
  257. pageSize: 10,
  258. onChange: function (page) {
  259. this.lookLoadData(page);
  260. }.bind(this),
  261. showTotal: function (total) {
  262. return '共' + total + '条数据';
  263. }
  264. },
  265. columns: [
  266. {
  267. title: '编号',
  268. dataIndex: 'serialNumber',
  269. key: 'serialNumber',
  270. }, {
  271. title: '需求名称',
  272. dataIndex: 'name',
  273. key: 'name',
  274. },
  275. {
  276. title: '录入人',
  277. dataIndex: 'techBrokerId',
  278. key: 'techBrokerId',
  279. },
  280. {
  281. title: '是否精品',
  282. dataIndex: 'boutique',
  283. key: 'boutique',
  284. render: text => { return getboutique(text) }
  285. },
  286. {
  287. title: '关键字',
  288. dataIndex: 'keyword',
  289. key: 'keyword',
  290. }, {
  291. title: '需求类型',
  292. dataIndex: 'demandType',
  293. key: 'demandType',
  294. render: text => { return getDemandType(text); }
  295. }, {
  296. title: '信息来源',
  297. dataIndex: 'infoSources',
  298. key: 'infoSources',
  299. render: text => {
  300. switch (text) {
  301. case "0":
  302. return <span>平台采集</span>;
  303. case "1":
  304. return <span>客户发布</span>;
  305. case "2":
  306. return <span>批量导入</span>
  307. case "3":
  308. return <span>三方对接</span>
  309. }
  310. }
  311. }, {
  312. title: '审核状态',
  313. dataIndex: 'auditStatus',
  314. key: 'auditStatus',
  315. render: text => {
  316. switch (text) {
  317. case 0:
  318. return <span>未提交审核(草稿)</span>;
  319. case 1:
  320. return <span>提交审核</span>;
  321. case 2:
  322. return <span>审核中</span>;
  323. case 3:
  324. return <span>审核通过</span>;
  325. case 4:
  326. return <span>审核未通过</span>;
  327. }
  328. }
  329. }, {
  330. title: '需求状态',
  331. dataIndex: 'status',
  332. key: 'status',
  333. render: text => {
  334. switch (text) {
  335. case "0":
  336. return <span>进行中</span>;
  337. case "1":
  338. return <span>未解决</span>;
  339. case "2":
  340. return <span>已解决</span>;
  341. }
  342. }
  343. }, {
  344. title: '有效期限',
  345. dataIndex: 'validityPeriodFormattedDate',
  346. key: 'validityPeriodFormattedDate',
  347. }, {
  348. title: '发布时间',
  349. dataIndex: 'releaseDateFormattedDate',
  350. key: 'releaseDateFormattedDate',
  351. },{
  352. title: '录入时间',
  353. dataIndex: 'createTimeFormattedDate',
  354. key: 'createTimeFormattedDate',
  355. }
  356. ],
  357. dataSource: [],
  358. searchTime: [],
  359. mateColumns: [
  360. {
  361. title: '企业名称',
  362. dataIndex: 'employerName',
  363. key: 'employerName',
  364. }, {
  365. title: '需求名称',
  366. dataIndex: 'name',
  367. key: 'name',
  368. },
  369. {
  370. title: '联系人',
  371. dataIndex: 'employerContactsMobile',
  372. key: 'employerContactsMobile',
  373. },{
  374. title: '匹配机构',
  375. dataIndex: 'organization',
  376. key: 'organization',
  377. },{
  378. title: '成果联系人',
  379. dataIndex: 'contacts',
  380. key: 'contacts',
  381. },{
  382. title: '成果方联系方式',
  383. dataIndex: 'contactMobile',
  384. key: 'contactMobile',
  385. },{
  386. title: '跟进结果',
  387. dataIndex: 'result',
  388. key: 'result',
  389. render: text => {
  390. switch (text) {
  391. case 0:
  392. return <span>跟进中</span>;
  393. case 1:
  394. return <span>已匹配</span>;
  395. }
  396. }
  397. },{
  398. title: '最新跟进时间',
  399. dataIndex: 'lastFollowTime',
  400. key: 'lastFollowTime',
  401. }
  402. ],
  403. mateDataSource: [],
  404. searchTime: [],
  405. lookColumns: [
  406. {
  407. title: '跟进时间',
  408. dataIndex: 'createTime',
  409. key: 'createTime',
  410. },{
  411. title: '跟进结果',
  412. dataIndex: 'result',
  413. key: 'result',
  414. render: text => {
  415. switch (text) {
  416. case 0:
  417. return <span>跟进中</span>;
  418. case 1:
  419. return <span>已匹配</span>;
  420. }
  421. }
  422. },{
  423. title: '跟进情况',
  424. dataIndex: 'remarks',
  425. key: 'remarks',
  426. }
  427. ],
  428. lookDataSource: [],
  429. searchTime: []
  430. };
  431. },
  432. getCompanyList() {
  433. this.setState({
  434. loading: true
  435. });
  436. $.ajax({
  437. method: "get",
  438. dataType: "json",
  439. crossDomain: false,
  440. url: globalConfig.context + "/api/admin/demand/unitNames",
  441. success: function (data) {
  442. let theArr = [];
  443. if (!data.data) {
  444. if (data.error && data.error.length) {
  445. message.warning(data.error[0].message);
  446. };
  447. } else {
  448. data.data.map(function (item) {
  449. theArr.push(
  450. <Select.Option value={item.uid} key={item.uid}>{item.unitName}</Select.Option>
  451. )
  452. });
  453. };
  454. this.setState({
  455. companyOption: theArr
  456. });
  457. }.bind(this),
  458. }).always(function () {
  459. this.setState({
  460. loading: false
  461. });
  462. }.bind(this));
  463. },
  464. getUserList() {
  465. this.setState({
  466. loading: true
  467. });
  468. $.ajax({
  469. method: "get",
  470. dataType: "json",
  471. crossDomain: false,
  472. url: globalConfig.context + "/api/admin/demand/userNames",
  473. success: function (data) {
  474. let theArr = [];
  475. if (!data.data) {
  476. if (data.error && data.error.length) {
  477. message.warning(data.error[0].message);
  478. };
  479. } else {
  480. data.data.map(function (item) {
  481. theArr.push(
  482. <Select.Option value={item.uid} key={item.uid}>{item.username}</Select.Option>
  483. )
  484. });
  485. };
  486. this.setState({
  487. userOption: theArr
  488. });
  489. }.bind(this),
  490. }).always(function () {
  491. this.setState({
  492. loading: false
  493. });
  494. }.bind(this));
  495. },
  496. componentWillMount() {
  497. let theArr = [];
  498. demandTypeList.map(function (item) {
  499. theArr.push(
  500. <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
  501. )
  502. });
  503. this.state.demandTypeOption = theArr;
  504. if (window.location.search) {
  505. let theObj = getSearchUrl(window.location.search);
  506. if (theObj.rid) {
  507. theObj.id = theObj.rid;
  508. theObj.employerId = theObj.uid;
  509. if (theObj.rid != 'null') {
  510. this.tableRowClick(theObj);
  511. };
  512. };
  513. };
  514. this.loadData();
  515. this.getCompanyList();
  516. this.getUserList();
  517. },
  518. componentWillReceiveProps(nextProps) {
  519. if (this.props['data-listApiUrl'] != nextProps['data-listApiUrl']) {
  520. this.state.selectedRowKeys = [];
  521. this.state.selectedRows = [];
  522. this.state.serialNumber = undefined;
  523. this.state.name = undefined;
  524. this.state.keyword = undefined;
  525. this.state.infoSources = undefined;
  526. this.state.demandType = undefined;
  527. this.state.searchName = undefined;
  528. this.state.searchType = 0;
  529. this.state.status = undefined;
  530. this.state.releaseStatus = undefined;
  531. this.state.auditStatus = undefined;
  532. this.state.validityPeriodDate = [];
  533. this.state.releaseDate = [];
  534. this.state.releaseDateS = [];
  535. this.loadData(null, nextProps['data-listApiUrl']);
  536. };
  537. },
  538. tableRowClick(record, index) {
  539. this.state.RowData = record;
  540. if(index!=undefined){
  541. this.setState({
  542. showDesc: true
  543. });
  544. }
  545. },
  546. //删除需求
  547. delectRow() {
  548. let deletedIds = [];
  549. for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
  550. let rowItem = this.state.selectedRows[idx];
  551. if (rowItem.id) {
  552. deletedIds.push(rowItem.id)
  553. };
  554. };
  555. this.setState({
  556. selectedRowKeys: [],
  557. loading: deletedIds.length > 0
  558. });
  559. $.ajax({
  560. method: "POST",
  561. dataType: "json",
  562. crossDomain: false,
  563. url: globalConfig.context + "/api/admin/demand/delete",
  564. data: {
  565. ids: deletedIds
  566. }
  567. }).done(function (data) {
  568. if (!data.error.length) {
  569. message.success('删除成功!');
  570. this.setState({
  571. loading: false,
  572. });
  573. } else {
  574. message.warning(data.error[0].message);
  575. };
  576. this.loadData();
  577. }.bind(this));
  578. },
  579. //删除匹配记录
  580. delect(e) {
  581. let rowItem = '';
  582. for (let idx = 0; idx < this.state.mateselectedRows.length; idx++) {
  583. rowItem = this.state.mateselectedRows[idx];
  584. };
  585. this.setState({
  586. mateselectedRowKeys: [],
  587. });
  588. $.ajax({
  589. method: "get",
  590. dataType: "json",
  591. crossDomain: false,
  592. url: globalConfig.context + "/api/admin/demand/deleteDemandFollow",
  593. data: {
  594. id: rowItem.id
  595. }
  596. }).done(function (data) {
  597. if (!data.error.length) {
  598. message.success('删除成功!');
  599. this.setState({
  600. loading: false,
  601. });
  602. } else {
  603. message.warning(data.error[0].message);
  604. };
  605. this.mateLoadData();
  606. }.bind(this));
  607. },
  608. mate(){
  609. this.setState({
  610. matevisible: true
  611. });
  612. this.mateLoadData();
  613. },
  614. mateNo(){
  615. this.setState({
  616. matevisible: false
  617. })
  618. },
  619. //点开新增或者匹配记录详情的时候发送请求获取上面的内容
  620. mateTop(e){
  621. let demandId ='';
  622. for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
  623. let rowItem = this.state.selectedRows[idx];
  624. if (rowItem.id) {
  625. demandId=rowItem.id;
  626. };
  627. };
  628. this.setState({
  629. loading: true
  630. });
  631. $.ajax({
  632. method: "get",
  633. dataType: "json",
  634. crossDomain: false,
  635. url: globalConfig.context + '/api/admin/demand/DemandFollowDetails',
  636. data: {
  637. id:demandId,
  638. },
  639. success: function (data) {
  640. this.setState({
  641. mademandId:data.data.id,//录入人
  642. adminName: data.data.techBrokerId,//录入人
  643. createTime: data.data.createTime,//录入时间
  644. employerName: data.data.employerName,//公司名称
  645. name: data.data.name,//需求名称
  646. employerContactsMobile:data.data.employerContactsMobile,//联系人电话
  647. employerContactsMailbox:data.data.employerContactsMailbox,//联系人邮箱
  648. });
  649. }.bind(this),
  650. }).always(function () {
  651. this.setState({
  652. loading: false
  653. });
  654. }.bind(this));
  655. },
  656. //点击新增
  657. addmate(e){
  658. this.setState({
  659. addmatevisible: true
  660. });
  661. this.mateTop();
  662. },
  663. //新增一条匹配记录
  664. addmateSubmits(e){
  665. e.preventDefault();
  666. this.setState({
  667. loading: true
  668. });
  669. $.ajax({
  670. method: "post",
  671. dataType: "json",
  672. crossDomain: false,
  673. url:globalConfig.context + '/api/admin/demand/addDemandFollow',
  674. data:{
  675. id:this.state.mademandId,//需求ID
  676. contactMobile:this.state.mateContactMobile,//成果方联系方式
  677. contacts:this.state.mateContacts,//成果联系人
  678. organization:this.state.mateOrganization,//匹配机构
  679. sources:this.state.mateSources,//来源
  680. remark:this.state.mateRemark,//备注
  681. }
  682. }).done(function (data) {
  683. this.setState({
  684. loading: false
  685. });
  686. if (!data.error.length) {
  687. message.success('新增项目成功!');
  688. this.mateLoadData();
  689. this.addmateNo();
  690. } else {
  691. message.warning(data.error[0].message);
  692. }
  693. }.bind(this));
  694. },
  695. //修改一条匹配记录
  696. addmateSubmit(e){
  697. e.preventDefault();
  698. this.setState({
  699. loading: true
  700. });
  701. $.ajax({
  702. method: "post",
  703. dataType: "json",
  704. crossDomain: false,
  705. url:globalConfig.context + '/api/admin/demand/addDemandFollow',
  706. data:{
  707. demandId:this.state.mademandId,//需求ID
  708. contactMobile:this.state.mateContactMobile,//成果方联系方式
  709. contacts:this.state.mateContacts,//成果联系人
  710. organization:this.state.mateOrganization,//匹配机构
  711. sources:this.state.mateSources,//来源
  712. remark:this.state.mateRemark,//备注
  713. }
  714. }).done(function (data) {
  715. this.setState({
  716. loading: false
  717. });
  718. if (!data.error.length) {
  719. message.success('新增项目成功!');
  720. this.mateLoadData();
  721. this.addmateNo();
  722. } else {
  723. message.warning(data.error[0].message);
  724. }
  725. }.bind(this));
  726. },
  727. //新增跟进记录
  728. addhandleSubmit(e){
  729. e.preventDefault();
  730. let rowItem = '';
  731. for (let idx = 0; idx < this.state.mateselectedRows.length; idx++) {
  732. rowItem = this.state.mateselectedRows[idx];
  733. };
  734. this.setState({
  735. mateselectedRowKeys: [],
  736. loading: true
  737. });
  738. $.ajax({
  739. method: "post",
  740. dataType: "json",
  741. crossDomain: false,
  742. url:globalConfig.context + '/api/admin/demand/addDemandFollowDetail',
  743. data:{
  744. demandFollowId:rowItem.id,//需求跟进ID
  745. createTimeFormattedDate:this.state.RowData.addcreateTime,//跟进时间
  746. result:this.state.addresult,//跟进结果
  747. remarks:this.state.addremarks,//跟进情况
  748. }
  749. }).done(function (data) {
  750. this.setState({
  751. loading: false
  752. });
  753. if (!data.error.length) {
  754. message.success('最新跟进添加成功成功!');
  755. this.addmateNo1();
  756. } else {
  757. message.warning(data.error[0].message);
  758. }
  759. }.bind(this));
  760. },
  761. //点开详情
  762. mateTableRowClick(record, index){
  763. this.mateTop();
  764. this.setState({
  765. addmatevisibles: true,
  766. mateOrganization:record.organization,//匹配机构
  767. mateSources:record.sources,//来源
  768. mateContacts:record.contacts,//成果联系人
  769. mateContactMobile:record.contactMobile,//联系人电话
  770. mateRemark:record.remark,//备注
  771. });
  772. },
  773. addmateNos(){
  774. this.setState({
  775. addmatevisibles: false
  776. })
  777. },
  778. addmateNo(){
  779. this.setState({
  780. addmatevisible: false
  781. })
  782. },
  783. addmate1(){
  784. this.setState({
  785. addmatevisible1: true
  786. });
  787. this.mateLoadData();
  788. },
  789. addmateNo1(){
  790. this.setState({
  791. addmatevisible1: false
  792. })
  793. },
  794. lookmate(){
  795. this.setState({
  796. lookvisible: true
  797. });
  798. this.lookLoadData();
  799. },
  800. lookmateNo(){
  801. this.setState({
  802. lookvisible: false
  803. })
  804. },
  805. addClick() {
  806. this.state.RowData = {};
  807. this.setState({
  808. showDesc: true
  809. });
  810. },
  811. closeDesc(e, s) {
  812. this.state.showDesc = e;
  813. if (s) {
  814. this.loadData();
  815. };
  816. },
  817. search() {
  818. this.loadData();
  819. },
  820. reset() {
  821. this.state.serialNumber = undefined;
  822. this.state.name = undefined;
  823. this.state.keyword = undefined;
  824. this.state.employerName= undefined;
  825. this.state.infoSources = undefined;
  826. this.state.demandType = undefined;
  827. this.state.searchName = undefined;
  828. this.state.searchType = 0;
  829. this.state.boutique = '';
  830. this.state.hot='' ;
  831. this.state.status = undefined;
  832. this.state.releaseStatus = undefined;
  833. this.state.auditStatus = undefined;
  834. this.state.dataCategory = undefined;
  835. this.state.validityPeriodDate = [];
  836. this.state.releaseDate = [];
  837. this.state.releaseDateS = [];
  838. this.loadData();
  839. },
  840. searchSwitch() {
  841. this.setState({
  842. searchMore: !this.state.searchMore
  843. });
  844. },
  845. render() {
  846. const rowSelection = {
  847. selectedRowKeys: this.state.selectedRowKeys,
  848. onChange: (selectedRowKeys, selectedRows) => {
  849. this.setState({
  850. selectedRows: selectedRows.slice(-1),
  851. selectedRowKeys: selectedRowKeys.slice(-1)
  852. });
  853. }
  854. };
  855. const materowSelection = {
  856. selectedRowKeys: this.state.mateselectedRowKeys,
  857. onChange: (mateselectedRowKeys, mateselectedRows) => {
  858. this.setState({
  859. mateselectedRows: mateselectedRows.slice(-1),
  860. mateselectedRowKeys: mateselectedRowKeys.slice(-1)
  861. });
  862. }
  863. };
  864. const hasSelected = this.state.selectedRowKeys.length > 0;
  865. const matehasSelected= this.state.mateselectedRowKeys.length > 0;
  866. const { RangePicker } = DatePicker;
  867. const FormItem = Form.Item
  868. return (
  869. <div className="user-content" >
  870. <div className="content-title">
  871. <span>我的科技需求</span>
  872. <div className="patent-addNew clearfix">
  873. <Upload
  874. action={globalConfig.context + "/api/admin/demand/uploadTemplate"}
  875. data={{ 'sign': 'demand_template' }}
  876. beforeUpload={beforeUploadFile}
  877. showUploadList={false}
  878. onChange={(info) => {
  879. if (info.file.status !== 'uploading') {
  880. console.log(info.file, info.fileList);
  881. }
  882. if (info.file.status === 'done') {
  883. if (!info.file.response.error.length) {
  884. message.success(`${info.file.name} 文件上传成功!`);
  885. } else {
  886. message.warning(info.file.response.error[0].message);
  887. return;
  888. };
  889. } else if (info.file.status === 'error') {
  890. message.error(`${info.file.name} 文件上传失败。`);
  891. };
  892. }} >
  893. <Button>上传批量导入模板</Button>
  894. </Upload>
  895. <Button onClick={() => { window.open(globalConfig.context + '/api/admin/demand/downloadTemplate?sign=demand_template') }}>下载批量导入模板</Button>
  896. <Button type="primary" className="addButton" onClick={this.addClick}>新增需求<Icon type="plus" /></Button>
  897. <BatchImport closeDesc={this.closeDesc} />
  898. </div>
  899. </div>
  900. <div className="user-search">
  901. <Input placeholder="需求编号"
  902. value={this.state.serialNumber}
  903. onChange={(e) => { this.setState({ serialNumber: e.target.value }); }} />
  904. <Input placeholder="需求名称"
  905. value={this.state.name}
  906. onChange={(e) => { this.setState({ name: e.target.value }); }} />
  907. <Input placeholder="关键字"
  908. value={this.state.keyword}
  909. onChange={(e) => { this.setState({ keyword: e.target.value }); }} />
  910. <Input placeholder="需求雇主名称"
  911. value={this.state.employerName}
  912. onChange={(e) => { this.setState({ employerName: e.target.value }); }} />
  913. <Radio.Group value={this.state.searchType} onChange={(e) => {
  914. this.setState({ searchType: e.target.value })
  915. }}>
  916. <Radio value={0}>认证用户</Radio>
  917. <Radio value={1}>非认证用户</Radio>
  918. </Radio.Group>
  919. <Button type="primary" onClick={this.search}>搜索</Button>
  920. <Button onClick={this.reset}>重置</Button>
  921. <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
  922. disabled={!hasSelected}
  923. onClick={this.delectRow}>删除<Icon type="minus" /></Button>
  924. <Button type="primary"
  925. disabled={!hasSelected}
  926. onClick={this.mate}>匹配跟进<Icon type="minus" /></Button>
  927. <span>更多搜索<Switch defaultChecked={false} onChange={this.searchSwitch} /></span>
  928. <div className="search-more" style={this.state.searchMore ? { display: 'none' } : {}}>
  929. <Radio.Group value={this.state.boutique} onChange={(e) => {
  930. this.setState({ boutique: e.target.value })
  931. }}>
  932. <Radio value={1}>精品</Radio>
  933. <Radio value={0}>非精品</Radio>
  934. </Radio.Group>
  935. <Select placeholder="选择信息来源" style={{ width: 120 }}
  936. value={this.state.infoSources}
  937. onChange={(e) => { this.setState({ infoSources: e }) }}>
  938. <Select.Option value="0" >平台采集</Select.Option>
  939. <Select.Option value="1" >客户发布</Select.Option>
  940. <Select.Option value="2" >批量导入</Select.Option>
  941. <Select.Option value="3" >三方对接</Select.Option>
  942. </Select>
  943. <Select placeholder="选择需求类型"
  944. style={{ width: 120 }}
  945. value={this.state.demandType}
  946. onChange={(e) => { this.setState({ demandType: e }) }}>
  947. {this.state.demandTypeOption}
  948. </Select>
  949. <Select placeholder="选择需求状态" style={{ width: 120 }}
  950. value={this.state.status}
  951. onChange={(e) => { this.setState({ status: e }) }}>
  952. <Select.Option value="0" >进行中</Select.Option>
  953. <Select.Option value="1" >未解决</Select.Option>
  954. <Select.Option value="2" >已解决</Select.Option>
  955. </Select>
  956. <Select placeholder="选择审核状态" style={{ width: 160 }}
  957. value={this.state.auditStatus}
  958. onChange={(e) => { this.setState({ auditStatus: e }) }}>
  959. <Select.Option value="0" >未提交审核(草稿)</Select.Option>
  960. <Select.Option value="1" >提交审核</Select.Option>
  961. <Select.Option value="2" >审核中</Select.Option>
  962. <Select.Option value="3" >审核通过</Select.Option>
  963. <Select.Option value="4" >审核未通过</Select.Option>
  964. </Select>
  965. <Select placeholder="选择是否发布" style={{ width: 120 }}
  966. value={this.state.releaseStatus}
  967. onChange={(e) => { this.setState({ releaseStatus: e }) }}>
  968. <Select.Option value="0" >未发布</Select.Option>
  969. <Select.Option value="1" >已发布</Select.Option>
  970. </Select>
  971. <Select placeholder="选择需求类别" style={{ width: 120 }}
  972. value={this.state.dataCategory}
  973. onChange={(e) => { this.setState({ dataCategory: e }) }}>
  974. <Select.Option value="0" >个人</Select.Option>
  975. <Select.Option value="1" >组织</Select.Option>
  976. </Select>
  977. <div style={{ marginTop: '10px' }}>
  978. <span style={{ marginLeft: '10px' }}>有效期限 : </span>
  979. <RangePicker
  980. value={[this.state.validityPeriodDate[0] ? moment(this.state.validityPeriodDate[0]) : null,
  981. this.state.validityPeriodDate[1] ? moment(this.state.validityPeriodDate[1]) : null]}
  982. onChange={(data, dataString) => { this.setState({ validityPeriodDate: dataString }); }} />
  983. <span style={{ marginLeft: '10px' }}>发布时间 : </span>
  984. <RangePicker
  985. value={[this.state.releaseDate[0] ? moment(this.state.releaseDate[0]) : null,
  986. this.state.releaseDate[1] ? moment(this.state.releaseDate[1]) : null]}
  987. onChange={(data, dataString) => { this.setState({ releaseDate: dataString }); }} />
  988. <span style={{ marginLeft: '10px' }}>录入时间 : </span>
  989. <RangePicker
  990. value={[this.state.releaseDateS[0] ? moment(this.state.releaseDateS[0]) : null,
  991. this.state.releaseDateS[1] ? moment(this.state.releaseDateS[1]) : null]}
  992. onChange={(data, dataString) => { this.setState({ releaseDateS: dataString }); }} />
  993. </div>
  994. </div>
  995. </div>
  996. <div className="patent-table">
  997. <Spin spinning={this.state.loading}>
  998. <Table columns={this.state.columns}
  999. dataSource={this.state.dataSource}
  1000. rowSelection={rowSelection}
  1001. pagination={this.state.pagination}
  1002. onRowClick={this.tableRowClick} />
  1003. </Spin>
  1004. </div>
  1005. <div className="patent-desc">
  1006. <Modal maskClosable={false} visible={this.state.matevisible}
  1007. onOk={this.checkPatentProcess} onCancel={this.mateNo}
  1008. width='1000px'
  1009. title='匹配跟进'
  1010. footer=''
  1011. className="admin-desc-content">
  1012. <Form horizontal id="add-form">
  1013. <Spin spinning={this.state.loading}>
  1014. <div className="clearfix" >
  1015. <Button className="ContactsList" type="primary" onClick={this.addmate} style={{float:'left',marginBottom:'10px',marginRight:'20px'}}>新增</Button>
  1016. <Button className="ContactsList" type="primary" onClick={this.addmate1} style={{float:'left',marginBottom:'10px',marginRight:'20px'}} disabled={!matehasSelected}>添加跟进情况</Button>
  1017. <Button className="ContactsList" type="primary" onClick={this.lookmate} style={{float:'left',marginBottom:'10px',marginRight:'20px'}} disabled={!matehasSelected}>查看跟进情况</Button>
  1018. <Button className="ContactsList" onClick={this.delect} style={{float:'left',marginBottom:'10px',marginRight:'20px'}} disabled={!matehasSelected}>删除</Button>
  1019. </div>
  1020. <div className="clearfix">
  1021. <Spin spinning={this.state.loading}>
  1022. <Form horizontal id="demand-form" onSubmit={this.contactSave} >
  1023. <Table
  1024. pagination={this.state.matepagination}
  1025. columns={this.state.mateColumns}
  1026. dataSource={this.state.mateDataSource}
  1027. rowSelection={materowSelection}
  1028. onRowClick={this.mateTableRowClick}
  1029. />
  1030. </Form>
  1031. </Spin>
  1032. </div>
  1033. </Spin>
  1034. </Form >
  1035. </Modal>
  1036. </div>
  1037. <div className="patent-desc">
  1038. <Modal maskClosable={false} visible={this.state.addmatevisible}
  1039. onOk={this.checkPatentProcess} onCancel={this.addmateNo}
  1040. width='1000px'
  1041. title='新增匹配跟进'
  1042. footer=''
  1043. className="admin-desc-content">
  1044. <Form horizontal onSubmit={this.addmateSubmit} id="add-form">
  1045. <Spin spinning={this.state.loading}>
  1046. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1047. <FormItem className="half-item"
  1048. labelCol={{ span: 6 }}
  1049. wrapperCol={{ span: 12 }}
  1050. label="录入人:" >
  1051. <span>{this.state.adminName}</span>
  1052. </FormItem>
  1053. <FormItem className="half-item"
  1054. labelCol={{ span: 6 }}
  1055. wrapperCol={{ span: 12 }}
  1056. label="录入时间:" >
  1057. <span>{this.state.createTime}</span>
  1058. </FormItem>
  1059. </div>
  1060. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1061. <FormItem className="half-item"
  1062. labelCol={{ span: 6 }}
  1063. wrapperCol={{ span: 12 }}
  1064. label="企业名称:" >
  1065. <span>{this.state.employerName}</span>
  1066. </FormItem>
  1067. <FormItem className="half-item"
  1068. labelCol={{ span: 6 }}
  1069. wrapperCol={{ span: 12 }}
  1070. label="需求名称:" >
  1071. <span>{this.state.name}</span>
  1072. </FormItem>
  1073. </div>
  1074. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1075. <FormItem className="half-item"
  1076. labelCol={{ span: 6 }}
  1077. wrapperCol={{ span: 12 }}
  1078. label="联系人联络方式:" >
  1079. <span>{this.state.employerContactsMobile}</span>
  1080. </FormItem>
  1081. <FormItem className="half-item"
  1082. labelCol={{ span: 6 }}
  1083. wrapperCol={{ span: 12 }}
  1084. label="联系人邮箱:" >
  1085. <span>{this.state.employerContactsMailbox}</span>
  1086. </FormItem>
  1087. </div>
  1088. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1089. <FormItem className="half-item"
  1090. labelCol={{ span: 6 }}
  1091. wrapperCol={{ span: 12 }}
  1092. label="匹配机构:" >
  1093. <Input placeholder="机构名称" value={this.state.mateOrganization} style={{width:'94%'}}
  1094. onChange={(e)=>{this.setState({mateOrganization:e.target.value})}} required="required"/>
  1095. <span className="mandatory" style={{color:'red',marginLeft:'5px'}}>*</span>
  1096. </FormItem>
  1097. <FormItem className="half-item"
  1098. labelCol={{ span: 6 }}
  1099. wrapperCol={{ span: 12 }}
  1100. label="匹配来源:"
  1101. >
  1102. <Input placeholder="匹配来源" value={this.state.mateSources} style={{width:'94%'}}
  1103. onChange={(e)=>{this.setState({mateSources:e.target.value})}} required="required"/>
  1104. </FormItem>
  1105. </div>
  1106. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1107. <FormItem className="half-item"
  1108. labelCol={{ span: 6 }}
  1109. wrapperCol={{ span: 12 }}
  1110. label="成果联系人:" >
  1111. <Input placeholder="联系人名称" value={this.state.mateContacts} style={{width:'94%'}}
  1112. onChange={(e)=>{this.setState({mateContacts:e.target.value})}} required="required"/>
  1113. <span className="mandatory" style={{color:'red',marginLeft:'5px'}}>*</span>
  1114. </FormItem>
  1115. <FormItem className="half-item"
  1116. labelCol={{ span: 6 }}
  1117. wrapperCol={{ span: 12 }}
  1118. label="成果方联系方式:"
  1119. >
  1120. <Input placeholder="联系方式" value={this.state.mateContactMobile} style={{width:'94%'}}
  1121. onChange={(e)=>{this.setState({mateContactMobile:e.target.value})}} required="required"/>
  1122. <span className="mandatory" style={{color:'red',marginLeft:'5px'}}>*</span>
  1123. </FormItem>
  1124. </div>
  1125. <div className="clearfix">
  1126. <FormItem
  1127. labelCol={{ span: 4 }}
  1128. wrapperCol={{ span: 18 }}
  1129. label="备注:" >
  1130. <Input type="textarea" rows={4} placeholder="匹配情况备注" value={this.state.mateRemark}
  1131. onChange={(e) => { this.setState({ mateRemark: e.target.value }) }} style={{width:'95%'}}/>
  1132. </FormItem>
  1133. </div>
  1134. <div className="clearfix">
  1135. <Button className="set-submit" type="primary" htmlType="submit" style={{marginLeft:'190px',marginBottom:'20px'}}>保存</Button>
  1136. <Button className="set-submit" type="ghost" onClick={this.addmateNo} style={{marginLeft:'100px',marginBottom:'20px'}}>取消</Button>
  1137. </div>
  1138. </Spin>
  1139. </Form >
  1140. </Modal>
  1141. </div>
  1142. <div className="patent-desc">
  1143. <Modal maskClosable={false} visible={this.state.addmatevisibles}
  1144. onOk={this.checkPatentProcess} onCancel={this.addmateNos}
  1145. width='1000px'
  1146. title='匹配跟进详情'
  1147. footer=''
  1148. className="admin-desc-content">
  1149. <Form horizontal onSubmit={this.addmateSubmits} id="add-form">
  1150. <Spin spinning={this.state.loading}>
  1151. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1152. <FormItem className="half-item"
  1153. labelCol={{ span: 6 }}
  1154. wrapperCol={{ span: 12 }}
  1155. label="录入人:" >
  1156. <span>{this.state.adminName}</span>
  1157. </FormItem>
  1158. <FormItem className="half-item"
  1159. labelCol={{ span: 6 }}
  1160. wrapperCol={{ span: 12 }}
  1161. label="录入时间:" >
  1162. <span>{this.state.createTime}</span>
  1163. </FormItem>
  1164. </div>
  1165. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1166. <FormItem className="half-item"
  1167. labelCol={{ span: 6 }}
  1168. wrapperCol={{ span: 12 }}
  1169. label="企业名称:" >
  1170. <span>{this.state.employerName}</span>
  1171. </FormItem>
  1172. <FormItem className="half-item"
  1173. labelCol={{ span: 6 }}
  1174. wrapperCol={{ span: 12 }}
  1175. label="需求名称:" >
  1176. <span>{this.state.name}</span>
  1177. </FormItem>
  1178. </div>
  1179. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1180. <FormItem className="half-item"
  1181. labelCol={{ span: 6 }}
  1182. wrapperCol={{ span: 12 }}
  1183. label="联系人联络方式:" >
  1184. <span>{this.state.employerContactsMobile}</span>
  1185. </FormItem>
  1186. <FormItem className="half-item"
  1187. labelCol={{ span: 6 }}
  1188. wrapperCol={{ span: 12 }}
  1189. label="联系人邮箱:" >
  1190. <span>{this.state.employerContactsMailbox}</span>
  1191. </FormItem>
  1192. </div>
  1193. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1194. <FormItem className="half-item"
  1195. labelCol={{ span: 6 }}
  1196. wrapperCol={{ span: 12 }}
  1197. label="匹配机构:" >
  1198. <Input placeholder="机构名称" value={this.state.mateOrganization} style={{width:'94%'}}
  1199. onChange={(e)=>{this.setState({mateOrganization:e.target.value})}} required="required"/>
  1200. <span className="mandatory" style={{color:'red',marginLeft:'5px'}}>*</span>
  1201. </FormItem>
  1202. <FormItem className="half-item"
  1203. labelCol={{ span: 6 }}
  1204. wrapperCol={{ span: 12 }}
  1205. label="匹配来源:"
  1206. >
  1207. <Input placeholder="匹配来源" value={this.state.mateSources} style={{width:'94%'}}
  1208. onChange={(e)=>{this.setState({mateSources:e.target.value})}} required="required"/>
  1209. </FormItem>
  1210. </div>
  1211. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1212. <FormItem className="half-item"
  1213. labelCol={{ span: 6 }}
  1214. wrapperCol={{ span: 12 }}
  1215. label="成果联系人:" >
  1216. <Input placeholder="联系人名称" value={this.state.mateContacts} style={{width:'94%'}}
  1217. onChange={(e)=>{this.setState({mateContacts:e.target.value})}} required="required"/>
  1218. <span className="mandatory" style={{color:'red',marginLeft:'5px'}}>*</span>
  1219. </FormItem>
  1220. <FormItem className="half-item"
  1221. labelCol={{ span: 6 }}
  1222. wrapperCol={{ span: 12 }}
  1223. label="成果方联系方式:"
  1224. >
  1225. <Input placeholder="联系方式" value={this.state.mateContactMobile} style={{width:'94%'}}
  1226. onChange={(e)=>{this.setState({mateContactMobile:e.target.value})}} required="required"/>
  1227. <span className="mandatory" style={{color:'red',marginLeft:'5px'}}>*</span>
  1228. </FormItem>
  1229. </div>
  1230. <div className="clearfix">
  1231. <FormItem
  1232. labelCol={{ span: 4 }}
  1233. wrapperCol={{ span: 18 }}
  1234. label="备注:" >
  1235. <Input type="textarea" rows={4} placeholder="匹配情况备注" value={this.state.mateRemark}
  1236. onChange={(e) => { this.setState({ mateRemark: e.target.value }) }} style={{width:'95%'}}/>
  1237. </FormItem>
  1238. </div>
  1239. <div className="clearfix">
  1240. <Button className="set-submit" type="primary" htmlType="submit" style={{marginLeft:'190px',marginBottom:'20px'}}>保存</Button>
  1241. <Button className="set-submit" type="ghost" onClick={this.addmateNos} style={{marginLeft:'100px',marginBottom:'20px'}}>取消</Button>
  1242. </div>
  1243. </Spin>
  1244. </Form >
  1245. </Modal>
  1246. </div>
  1247. <div className="patent-desc">
  1248. <Modal maskClosable={false} visible={this.state.addmatevisible1}
  1249. onOk={this.checkPatentProcess} onCancel={this.addmateNo1}
  1250. width='600px'
  1251. title='跟进情况添加'
  1252. footer=''
  1253. className="admin-desc-content">
  1254. <Form horizontal onSubmit={this.addhandleSubmit} id="add-form">
  1255. <Spin spinning={this.state.loading}>
  1256. <div className="clearfix">
  1257. <FormItem
  1258. labelCol={{ span: 5 }}
  1259. wrapperCol={{ span: 16 }}
  1260. label="跟进时间" >
  1261. <DatePicker
  1262. style={{'width':'95%'}}
  1263. format="YYYY-MM-DD"
  1264. placeholder="选择跟进时间"
  1265. value={this.state.RowData.addcreateTime ? moment(this.state.RowData.addcreateTime, "YYYY-MM-DD") : undefined}
  1266. onChange={(t, str) => {
  1267. this.state.RowData.addcreateTime = str;
  1268. this.setState({ RowData: this.state.RowData});
  1269. }} />
  1270. <span style={{color:'red',marginLeft:'5px'}}>*</span>
  1271. </FormItem>
  1272. </div>
  1273. <div className="clearfix">
  1274. <FormItem
  1275. labelCol={{ span: 5 }}
  1276. wrapperCol={{ span: 16 }}
  1277. label="跟进结果"
  1278. >
  1279. <Select placeholder="请选择跟进结果"
  1280. value={this.state.addresult}
  1281. style={{'width':'95%'}}
  1282. onChange={(e) => { this.setState({ addresult: e }) }}>
  1283. <Select.Option value="0" >跟进中</Select.Option>
  1284. <Select.Option value="1" >已匹配</Select.Option>
  1285. </Select>
  1286. <span style={{color:'red',marginLeft:'5px'}}>*</span>
  1287. </FormItem>
  1288. </div>
  1289. <div className="clearfix">
  1290. <FormItem
  1291. labelCol={{ span: 5 }}
  1292. wrapperCol={{ span: 16 }}
  1293. label="跟进情况" >
  1294. <Input type="textarea" rows={4} placeholder="跟进情况记录" value={this.state.addremarks}
  1295. onChange={(e) => { this.setState({ addremarks: e.target.value }) }} style={{width:'95%'}}/>
  1296. <span style={{color:'red',marginLeft:'5px'}}>*</span>
  1297. </FormItem>
  1298. </div>
  1299. <FormItem wrapperCol={{ span: 12, offset: 7 }}>
  1300. <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
  1301. <Button className="set-submit" type="ghost" onClick={this.addmateNo1} style={{marginLeft:'100px'}}>取消</Button>
  1302. </FormItem>
  1303. </Spin>
  1304. </Form >
  1305. </Modal>
  1306. </div>
  1307. <div className="patent-desc">
  1308. <Modal maskClosable={false} visible={this.state.lookvisible}
  1309. onOk={this.checkPatentProcess} onCancel={this.lookmateNo}
  1310. width='600px'
  1311. title='跟进情况详情'
  1312. footer=''
  1313. className="admin-desc-content">
  1314. <Form horizontal onSubmit={this.addhandleSubmit} id="add-form">
  1315. <Spin spinning={this.state.loading}>
  1316. <div className="clearfix">
  1317. <Spin spinning={this.state.loading}>
  1318. <Form horizontal id="demand-form" onSubmit={this.contactSave} >
  1319. <Table
  1320. pagination={this.state.lookpagination}
  1321. columns={this.state.lookColumns}
  1322. dataSource={this.state.lookDataSource}
  1323. rowSelection={rowSelection}
  1324. onRowClick={this.lookTableRowClick}
  1325. />
  1326. </Form>
  1327. </Spin>
  1328. </div>
  1329. </Spin>
  1330. </Form >
  1331. </Modal>
  1332. </div>
  1333. <TechDemandDesc
  1334. data={this.state.RowData}
  1335. detailApiUrl={this.props['data-detailApiUrl']}
  1336. companyOption={this.state.companyOption}
  1337. userOption={this.state.userOption}
  1338. demandTypeOption={this.state.demandTypeOption}
  1339. showDesc={this.state.showDesc}
  1340. closeDesc={this.closeDesc} />
  1341. </div >
  1342. );
  1343. }
  1344. });
  1345. export default DemandList;