myTechDemand.jsx 62 KB

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