myTechDemand.jsx 62 KB

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