myTechDemand.jsx 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376
  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. },
  623. //点开新增或者匹配记录详情的时候发送请求获取上面的内容
  624. mateTop(e){
  625. let demandId ='';
  626. for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
  627. let rowItem = this.state.selectedRows[idx];
  628. if (rowItem.id) {
  629. demandId=rowItem.id;
  630. };
  631. };
  632. this.setState({
  633. loading: true
  634. });
  635. $.ajax({
  636. method: "get",
  637. dataType: "json",
  638. crossDomain: false,
  639. url: globalConfig.context + '/api/admin/demand/DemandFollowDetails',
  640. data: {
  641. id:demandId,
  642. },
  643. success: function (data) {
  644. this.setState({
  645. mademandId:data.data.id,//录入人
  646. adminName: data.data.techBrokerId,//录入人
  647. createTime: data.data.createTime,//录入时间
  648. employerName: data.data.employerName,//公司名称
  649. name: data.data.name,//需求名称
  650. employerContactsMobile:data.data.employerContactsMobile,//联系人电话
  651. employerContactsMailbox:data.data.employerContactsMailbox,//联系人邮箱
  652. createTimeFormattedDate:data.data.createTimeFormattedDate,//录入时间转格式
  653. });
  654. }.bind(this),
  655. }).always(function () {
  656. this.setState({
  657. loading: false
  658. });
  659. }.bind(this));
  660. },
  661. //点击新增
  662. addmate(e){
  663. this.setState({
  664. addmatevisible: true
  665. });
  666. this.matereset();
  667. this.mateTop();
  668. },
  669. //修改一条匹配记录
  670. addmateSubmits(e){
  671. e.preventDefault();
  672. this.setState({
  673. loading: true
  674. });
  675. $.ajax({
  676. method: "post",
  677. dataType: "json",
  678. crossDomain: false,
  679. url:globalConfig.context + '/api/admin/demand/updateDemandFollow',
  680. data:{
  681. id:this.state.mademandIds,//需求ID
  682. contactMobile:this.state.mateContactMobile,//成果方联系方式
  683. contacts:this.state.mateContacts,//成果联系人
  684. organization:this.state.mateOrganization,//匹配机构
  685. sources:this.state.mateSources,//来源
  686. remark:this.state.mateRemark,//备注
  687. }
  688. }).done(function (data) {
  689. this.setState({
  690. loading: false
  691. });
  692. if (!data.error.length) {
  693. message.success('修改匹配跟进成功!');
  694. this.mateLoadData();
  695. this.addmateNos();
  696. } else {
  697. message.warning(data.error[0].message);
  698. }
  699. }.bind(this));
  700. },
  701. //新增一条匹配记录
  702. addmateSubmit(e){
  703. e.preventDefault();
  704. this.setState({
  705. loading: true
  706. });
  707. $.ajax({
  708. method: "post",
  709. dataType: "json",
  710. crossDomain: false,
  711. url:globalConfig.context + '/api/admin/demand/addDemandFollow',
  712. data:{
  713. demandId:this.state.mademandId,//需求ID
  714. contactMobile:this.state.mateContactMobile,//成果方联系方式
  715. contacts:this.state.mateContacts,//成果联系人
  716. organization:this.state.mateOrganization,//匹配机构
  717. sources:this.state.mateSources,//来源
  718. remark:this.state.mateRemark,//备注
  719. }
  720. }).done(function (data) {
  721. this.setState({
  722. loading: false
  723. });
  724. if (!data.error.length) {
  725. message.success('新增匹配跟进成功!');
  726. this.mateLoadData();
  727. this.addmateNo();
  728. } else {
  729. message.warning(data.error[0].message);
  730. }
  731. }.bind(this));
  732. },
  733. //新增跟进记录
  734. addhandleSubmit(e){
  735. e.preventDefault();
  736. let rowItem = '';
  737. for (let idx = 0; idx < this.state.mateselectedRows.length; idx++) {
  738. rowItem = this.state.mateselectedRows[idx];
  739. };
  740. this.setState({
  741. mateselectedRowKeys: [],
  742. loading: true
  743. });
  744. $.ajax({
  745. method: "post",
  746. dataType: "json",
  747. crossDomain: false,
  748. url:globalConfig.context + '/api/admin/demand/addDemandFollowDetail',
  749. data:{
  750. demandFollowId:rowItem.id,//需求跟进ID
  751. createTimeFormattedDate:this.state.RowData.addcreateTime,//跟进时间
  752. result:this.state.addresult,//跟进结果
  753. remarks:this.state.addremarks,//跟进情况
  754. }
  755. }).done(function (data) {
  756. this.setState({
  757. loading: false
  758. });
  759. if (!data.error.length) {
  760. message.success('最新跟进添加成功成功!');
  761. this.addmateNo1();
  762. } else {
  763. message.warning(data.error[0].message);
  764. }
  765. }.bind(this));
  766. },
  767. //点开详情
  768. mateTableRowClick(record, index){
  769. console.log(record);
  770. this.mateTop();
  771. this.setState({
  772. addmatevisibles: true,
  773. mateOrganization:record.organization,//匹配机构
  774. mateSources:record.sources,//来源
  775. mateContacts:record.contacts,//成果联系人
  776. mateContactMobile:record.contactMobile,//联系人电话
  777. mateRemark:record.remark,//备注
  778. mademandIds:record.id,//该条匹配跟进的ID
  779. });
  780. },
  781. addmateNos(){
  782. this.setState({
  783. addmatevisibles: false
  784. })
  785. },
  786. addmateNo(){
  787. this.setState({
  788. addmatevisible: false
  789. })
  790. },
  791. addmate1(){
  792. this.setState({
  793. addmatevisible1: true
  794. });
  795. this.lookreset();
  796. },
  797. addmateNo1(){
  798. this.setState({
  799. addmatevisible1: false
  800. });
  801. this.mateLoadData();
  802. },
  803. lookmate(){
  804. this.setState({
  805. lookvisible: true
  806. });
  807. this.lookLoadData();
  808. },
  809. lookmateNo(){
  810. this.setState({
  811. lookvisible: false
  812. })
  813. },
  814. addClick() {
  815. this.state.RowData = {};
  816. this.setState({
  817. showDesc: true
  818. });
  819. },
  820. closeDesc(e, s) {
  821. this.state.showDesc = e;
  822. if (s) {
  823. this.loadData();
  824. };
  825. },
  826. search() {
  827. this.loadData();
  828. },
  829. reset() {
  830. this.state.serialNumber = undefined;
  831. this.state.name = undefined;
  832. this.state.keyword = undefined;
  833. this.state.employerName= undefined;
  834. this.state.infoSources = undefined;
  835. this.state.demandType = undefined;
  836. this.state.searchName = undefined;
  837. this.state.searchType = 0;
  838. this.state.boutique = '';
  839. this.state.hot='' ;
  840. this.state.status = undefined;
  841. this.state.releaseStatus = undefined;
  842. this.state.auditStatus = undefined;
  843. this.state.dataCategory = undefined;
  844. this.state.validityPeriodDate = [];
  845. this.state.releaseDate = [];
  846. this.state.releaseDateS = [];
  847. this.loadData();
  848. },
  849. matereset(){
  850. this.state.mateContactMobile = undefined;//成果方联系方式
  851. this.state.mateContacts = undefined;//成果联系人
  852. this.state.mateOrganization = undefined;//匹配机构
  853. this.state.mateSources = undefined;//来源
  854. this.state.mateRemark = undefined;//备注
  855. },
  856. //点击新增跟进记录是清空里面的内容
  857. lookreset(){
  858. this.state.RowData.addcreateTime = undefined;
  859. this.state.addresult = '';
  860. this.state.addremarks = undefined;
  861. },
  862. searchSwitch() {
  863. this.setState({
  864. searchMore: !this.state.searchMore
  865. });
  866. },
  867. render() {
  868. const rowSelection = {
  869. selectedRowKeys: this.state.selectedRowKeys,
  870. onChange: (selectedRowKeys, selectedRows) => {
  871. this.setState({
  872. selectedRows: selectedRows.slice(-1),
  873. selectedRowKeys: selectedRowKeys.slice(-1)
  874. });
  875. }
  876. };
  877. const materowSelection = {
  878. selectedRowKeys: this.state.mateselectedRowKeys,
  879. onChange: (mateselectedRowKeys, mateselectedRows) => {
  880. this.setState({
  881. mateselectedRows: mateselectedRows.slice(-1),
  882. mateselectedRowKeys: mateselectedRowKeys.slice(-1)
  883. });
  884. }
  885. };
  886. const hasSelected = this.state.selectedRowKeys.length > 0;
  887. const matehasSelected= this.state.mateselectedRowKeys.length > 0;
  888. const { RangePicker } = DatePicker;
  889. const FormItem = Form.Item
  890. return (
  891. <div className="user-content" >
  892. <div className="content-title">
  893. <span>我的科技需求</span>
  894. <div className="patent-addNew clearfix">
  895. <Upload
  896. action={globalConfig.context + "/api/admin/demand/uploadTemplate"}
  897. data={{ 'sign': 'demand_template' }}
  898. beforeUpload={beforeUploadFile}
  899. showUploadList={false}
  900. onChange={(info) => {
  901. if (info.file.status !== 'uploading') {
  902. console.log(info.file, info.fileList);
  903. }
  904. if (info.file.status === 'done') {
  905. if (!info.file.response.error.length) {
  906. message.success(`${info.file.name} 文件上传成功!`);
  907. } else {
  908. message.warning(info.file.response.error[0].message);
  909. return;
  910. };
  911. } else if (info.file.status === 'error') {
  912. message.error(`${info.file.name} 文件上传失败。`);
  913. };
  914. }} >
  915. <Button>上传批量导入模板</Button>
  916. </Upload>
  917. <Button onClick={() => { window.open(globalConfig.context + '/api/admin/demand/downloadTemplate?sign=demand_template') }}>下载批量导入模板</Button>
  918. <Button type="primary" className="addButton" onClick={this.addClick}>新增需求<Icon type="plus" /></Button>
  919. <BatchImport closeDesc={this.closeDesc} />
  920. </div>
  921. </div>
  922. <div className="user-search">
  923. <Input placeholder="需求编号"
  924. value={this.state.serialNumber}
  925. onChange={(e) => { this.setState({ serialNumber: e.target.value }); }} />
  926. <Input placeholder="需求名称"
  927. value={this.state.name}
  928. onChange={(e) => { this.setState({ name: e.target.value }); }} />
  929. <Input placeholder="关键字"
  930. value={this.state.keyword}
  931. onChange={(e) => { this.setState({ keyword: e.target.value }); }} />
  932. <Input placeholder="需求雇主名称"
  933. value={this.state.employerName}
  934. onChange={(e) => { this.setState({ employerName: e.target.value }); }} />
  935. <Radio.Group value={this.state.searchType} onChange={(e) => {
  936. this.setState({ searchType: e.target.value })
  937. }}>
  938. <Radio value={0}>认证用户</Radio>
  939. <Radio value={1}>非认证用户</Radio>
  940. </Radio.Group>
  941. <Button type="primary" onClick={this.search}>搜索</Button>
  942. <Button onClick={this.reset}>重置</Button>
  943. <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
  944. disabled={!hasSelected}
  945. onClick={this.delectRow}>删除<Icon type="minus" /></Button>
  946. <Button type="primary"
  947. disabled={!hasSelected}
  948. onClick={this.mate}>匹配跟进<Icon type="minus" /></Button>
  949. <span>更多搜索<Switch defaultChecked={false} onChange={this.searchSwitch} /></span>
  950. <div className="search-more" style={this.state.searchMore ? { display: 'none' } : {}}>
  951. <Radio.Group value={this.state.boutique} onChange={(e) => {
  952. this.setState({ boutique: e.target.value })
  953. }}>
  954. <Radio value={1}>精品</Radio>
  955. <Radio value={0}>非精品</Radio>
  956. </Radio.Group>
  957. <Select placeholder="选择信息来源" style={{ width: 120 }}
  958. value={this.state.infoSources}
  959. onChange={(e) => { this.setState({ infoSources: e }) }}>
  960. <Select.Option value="0" >平台采集</Select.Option>
  961. <Select.Option value="1" >客户发布</Select.Option>
  962. <Select.Option value="2" >批量导入</Select.Option>
  963. <Select.Option value="3" >三方对接</Select.Option>
  964. </Select>
  965. <Select placeholder="选择需求类型"
  966. style={{ width: 120 }}
  967. value={this.state.demandType}
  968. onChange={(e) => { this.setState({ demandType: e }) }}>
  969. {this.state.demandTypeOption}
  970. </Select>
  971. <Select placeholder="选择需求状态" style={{ width: 120 }}
  972. value={this.state.status}
  973. onChange={(e) => { this.setState({ status: e }) }}>
  974. <Select.Option value="0" >进行中</Select.Option>
  975. <Select.Option value="1" >未解决</Select.Option>
  976. <Select.Option value="2" >已解决</Select.Option>
  977. </Select>
  978. <Select placeholder="选择审核状态" style={{ width: 160 }}
  979. value={this.state.auditStatus}
  980. onChange={(e) => { this.setState({ auditStatus: e }) }}>
  981. <Select.Option value="0" >未提交审核(草稿)</Select.Option>
  982. <Select.Option value="1" >提交审核</Select.Option>
  983. <Select.Option value="2" >审核中</Select.Option>
  984. <Select.Option value="3" >审核通过</Select.Option>
  985. <Select.Option value="4" >审核未通过</Select.Option>
  986. </Select>
  987. <Select placeholder="选择是否发布" style={{ width: 120 }}
  988. value={this.state.releaseStatus}
  989. onChange={(e) => { this.setState({ releaseStatus: e }) }}>
  990. <Select.Option value="0" >未发布</Select.Option>
  991. <Select.Option value="1" >已发布</Select.Option>
  992. </Select>
  993. <Select placeholder="选择需求类别" style={{ width: 120 }}
  994. value={this.state.dataCategory}
  995. onChange={(e) => { this.setState({ dataCategory: e }) }}>
  996. <Select.Option value="0" >个人</Select.Option>
  997. <Select.Option value="1" >组织</Select.Option>
  998. </Select>
  999. <div style={{ marginTop: '10px' }}>
  1000. <span style={{ marginLeft: '10px' }}>有效期限 : </span>
  1001. <RangePicker
  1002. value={[this.state.validityPeriodDate[0] ? moment(this.state.validityPeriodDate[0]) : null,
  1003. this.state.validityPeriodDate[1] ? moment(this.state.validityPeriodDate[1]) : null]}
  1004. onChange={(data, dataString) => { this.setState({ validityPeriodDate: dataString }); }} />
  1005. <span style={{ marginLeft: '10px' }}>发布时间 : </span>
  1006. <RangePicker
  1007. value={[this.state.releaseDate[0] ? moment(this.state.releaseDate[0]) : null,
  1008. this.state.releaseDate[1] ? moment(this.state.releaseDate[1]) : null]}
  1009. onChange={(data, dataString) => { this.setState({ releaseDate: dataString }); }} />
  1010. <span style={{ marginLeft: '10px' }}>录入时间 : </span>
  1011. <RangePicker
  1012. value={[this.state.releaseDateS[0] ? moment(this.state.releaseDateS[0]) : null,
  1013. this.state.releaseDateS[1] ? moment(this.state.releaseDateS[1]) : null]}
  1014. onChange={(data, dataString) => { this.setState({ releaseDateS: dataString }); }} />
  1015. </div>
  1016. </div>
  1017. </div>
  1018. <div className="patent-table">
  1019. <Spin spinning={this.state.loading}>
  1020. <Table columns={this.state.columns}
  1021. dataSource={this.state.dataSource}
  1022. rowSelection={rowSelection}
  1023. pagination={this.state.pagination}
  1024. onRowClick={this.tableRowClick} />
  1025. </Spin>
  1026. </div>
  1027. <div className="patent-desc">
  1028. <Modal maskClosable={false} visible={this.state.matevisible}
  1029. onOk={this.checkPatentProcess} onCancel={this.mateNo}
  1030. width='1000px'
  1031. title='匹配跟进'
  1032. footer=''
  1033. className="admin-desc-content">
  1034. <Form horizontal id="add-form">
  1035. <Spin spinning={this.state.loading}>
  1036. <div className="clearfix" >
  1037. <Button className="ContactsList" type="primary" onClick={this.addmate} style={{float:'left',marginBottom:'10px',marginRight:'20px'}}>新增</Button>
  1038. <Button className="ContactsList" type="primary" onClick={this.addmate1} style={{float:'left',marginBottom:'10px',marginRight:'20px'}} disabled={!matehasSelected}>添加跟进情况</Button>
  1039. <Button className="ContactsList" type="primary" onClick={this.lookmate} style={{float:'left',marginBottom:'10px',marginRight:'20px'}} disabled={!matehasSelected}>查看跟进情况</Button>
  1040. <Button className="ContactsList" onClick={this.delect} style={{float:'left',marginBottom:'10px',marginRight:'20px'}} disabled={!matehasSelected}>删除</Button>
  1041. </div>
  1042. <div className="clearfix">
  1043. <Spin spinning={this.state.loading}>
  1044. <Form horizontal id="demand-form" onSubmit={this.contactSave} >
  1045. <Table
  1046. pagination={this.state.matepagination}
  1047. columns={this.state.mateColumns}
  1048. dataSource={this.state.mateDataSource}
  1049. rowSelection={materowSelection}
  1050. onRowClick={this.mateTableRowClick}
  1051. />
  1052. </Form>
  1053. </Spin>
  1054. </div>
  1055. </Spin>
  1056. </Form >
  1057. </Modal>
  1058. </div>
  1059. <div className="patent-desc">
  1060. <Modal maskClosable={false} visible={this.state.addmatevisible}
  1061. onOk={this.checkPatentProcess} onCancel={this.addmateNo}
  1062. width='1000px'
  1063. title='新增匹配跟进'
  1064. footer=''
  1065. className="admin-desc-content">
  1066. <Form horizontal onSubmit={this.addmateSubmit} id="add-form">
  1067. <Spin spinning={this.state.loading}>
  1068. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1069. <FormItem className="half-item"
  1070. labelCol={{ span: 6 }}
  1071. wrapperCol={{ span: 12 }}
  1072. label="录入人:" >
  1073. <span>{this.state.adminName}</span>
  1074. </FormItem>
  1075. <FormItem className="half-item"
  1076. labelCol={{ span: 6 }}
  1077. wrapperCol={{ span: 12 }}
  1078. label="录入时间:" >
  1079. <span>{this.state.createTimeFormattedDate}</span>
  1080. </FormItem>
  1081. </div>
  1082. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1083. <FormItem className="half-item"
  1084. labelCol={{ span: 6 }}
  1085. wrapperCol={{ span: 12 }}
  1086. label="企业名称:" >
  1087. <span>{this.state.employerName}</span>
  1088. </FormItem>
  1089. <FormItem className="half-item"
  1090. labelCol={{ span: 6 }}
  1091. wrapperCol={{ span: 12 }}
  1092. label="需求名称:" >
  1093. <span>{this.state.name}</span>
  1094. </FormItem>
  1095. </div>
  1096. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1097. <FormItem className="half-item"
  1098. labelCol={{ span: 6 }}
  1099. wrapperCol={{ span: 12 }}
  1100. label="联系人联络方式:" >
  1101. <span>{this.state.employerContactsMobile}</span>
  1102. </FormItem>
  1103. <FormItem className="half-item"
  1104. labelCol={{ span: 6 }}
  1105. wrapperCol={{ span: 12 }}
  1106. label="联系人邮箱:" >
  1107. <span>{this.state.employerContactsMailbox}</span>
  1108. </FormItem>
  1109. </div>
  1110. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1111. <FormItem className="half-item"
  1112. labelCol={{ span: 6 }}
  1113. wrapperCol={{ span: 12 }}
  1114. label="匹配机构:" >
  1115. <Input placeholder="机构名称" value={this.state.mateOrganization} style={{width:'94%'}}
  1116. onChange={(e)=>{this.setState({mateOrganization:e.target.value})}} required="required"/>
  1117. <span className="mandatory" style={{color:'red',marginLeft:'5px'}}>*</span>
  1118. </FormItem>
  1119. <FormItem className="half-item"
  1120. labelCol={{ span: 6 }}
  1121. wrapperCol={{ span: 12 }}
  1122. label="匹配来源:"
  1123. >
  1124. <Input placeholder="匹配来源" value={this.state.mateSources} style={{width:'94%'}}
  1125. onChange={(e)=>{this.setState({mateSources:e.target.value})}} />
  1126. </FormItem>
  1127. </div>
  1128. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1129. <FormItem className="half-item"
  1130. labelCol={{ span: 6 }}
  1131. wrapperCol={{ span: 12 }}
  1132. label="成果联系人:" >
  1133. <Input placeholder="联系人名称" value={this.state.mateContacts} style={{width:'94%'}}
  1134. onChange={(e)=>{this.setState({mateContacts:e.target.value})}} required="required"/>
  1135. <span className="mandatory" style={{color:'red',marginLeft:'5px'}}>*</span>
  1136. </FormItem>
  1137. <FormItem className="half-item"
  1138. labelCol={{ span: 6 }}
  1139. wrapperCol={{ span: 12 }}
  1140. label="成果方联系方式:"
  1141. >
  1142. <Input placeholder="联系方式" value={this.state.mateContactMobile} style={{width:'94%'}}
  1143. onChange={(e)=>{this.setState({mateContactMobile:e.target.value})}} required="required"/>
  1144. <span className="mandatory" style={{color:'red',marginLeft:'5px'}}>*</span>
  1145. </FormItem>
  1146. </div>
  1147. <div className="clearfix">
  1148. <FormItem
  1149. labelCol={{ span: 4 }}
  1150. wrapperCol={{ span: 18 }}
  1151. label="备注:" >
  1152. <Input type="textarea" rows={4} placeholder="匹配情况备注" value={this.state.mateRemark}
  1153. onChange={(e) => { this.setState({ mateRemark: e.target.value }) }} style={{width:'95%'}}/>
  1154. </FormItem>
  1155. </div>
  1156. <div className="clearfix">
  1157. <Button className="set-submit" type="primary" htmlType="submit" style={{marginLeft:'190px',marginBottom:'20px'}}>保存</Button>
  1158. <Button className="set-submit" type="ghost" onClick={this.addmateNo} style={{marginLeft:'100px',marginBottom:'20px'}}>取消</Button>
  1159. </div>
  1160. </Spin>
  1161. </Form >
  1162. </Modal>
  1163. </div>
  1164. <div className="patent-desc">
  1165. <Modal maskClosable={false} visible={this.state.addmatevisibles}
  1166. onOk={this.checkPatentProcess} onCancel={this.addmateNos}
  1167. width='1000px'
  1168. title='匹配跟进详情'
  1169. footer=''
  1170. className="admin-desc-content">
  1171. <Form horizontal onSubmit={this.addmateSubmits} id="add-form">
  1172. <Spin spinning={this.state.loading}>
  1173. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1174. <FormItem className="half-item"
  1175. labelCol={{ span: 6 }}
  1176. wrapperCol={{ span: 12 }}
  1177. label="录入人:" >
  1178. <span>{this.state.adminName}</span>
  1179. </FormItem>
  1180. <FormItem className="half-item"
  1181. labelCol={{ span: 6 }}
  1182. wrapperCol={{ span: 12 }}
  1183. label="录入时间:" >
  1184. <span>{this.state.createTimeFormattedDate}</span>
  1185. </FormItem>
  1186. </div>
  1187. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1188. <FormItem className="half-item"
  1189. labelCol={{ span: 6 }}
  1190. wrapperCol={{ span: 12 }}
  1191. label="企业名称:" >
  1192. <span>{this.state.employerName}</span>
  1193. </FormItem>
  1194. <FormItem className="half-item"
  1195. labelCol={{ span: 6 }}
  1196. wrapperCol={{ span: 12 }}
  1197. label="需求名称:" >
  1198. <span>{this.state.name}</span>
  1199. </FormItem>
  1200. </div>
  1201. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1202. <FormItem className="half-item"
  1203. labelCol={{ span: 6 }}
  1204. wrapperCol={{ span: 12 }}
  1205. label="联系人联络方式:" >
  1206. <span>{this.state.employerContactsMobile}</span>
  1207. </FormItem>
  1208. <FormItem className="half-item"
  1209. labelCol={{ span: 6 }}
  1210. wrapperCol={{ span: 12 }}
  1211. label="联系人邮箱:" >
  1212. <span>{this.state.employerContactsMailbox}</span>
  1213. </FormItem>
  1214. </div>
  1215. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1216. <FormItem className="half-item"
  1217. labelCol={{ span: 6 }}
  1218. wrapperCol={{ span: 12 }}
  1219. label="匹配机构:" >
  1220. <Input placeholder="机构名称" value={this.state.mateOrganization} style={{width:'94%'}}
  1221. onChange={(e)=>{this.setState({mateOrganization:e.target.value})}} required="required"/>
  1222. <span className="mandatory" style={{color:'red',marginLeft:'5px'}}>*</span>
  1223. </FormItem>
  1224. <FormItem className="half-item"
  1225. labelCol={{ span: 6 }}
  1226. wrapperCol={{ span: 12 }}
  1227. label="匹配来源:"
  1228. >
  1229. <Input placeholder="匹配来源" value={this.state.mateSources} style={{width:'94%'}}
  1230. onChange={(e)=>{this.setState({mateSources:e.target.value})}} />
  1231. </FormItem>
  1232. </div>
  1233. <div className="clearfix" style={{paddingLeft:'60px'}}>
  1234. <FormItem className="half-item"
  1235. labelCol={{ span: 6 }}
  1236. wrapperCol={{ span: 12 }}
  1237. label="成果联系人:" >
  1238. <Input placeholder="联系人名称" value={this.state.mateContacts} style={{width:'94%'}}
  1239. onChange={(e)=>{this.setState({mateContacts:e.target.value})}} required="required"/>
  1240. <span className="mandatory" style={{color:'red',marginLeft:'5px'}}>*</span>
  1241. </FormItem>
  1242. <FormItem className="half-item"
  1243. labelCol={{ span: 6 }}
  1244. wrapperCol={{ span: 12 }}
  1245. label="成果方联系方式:"
  1246. >
  1247. <Input placeholder="联系方式" value={this.state.mateContactMobile} style={{width:'94%'}}
  1248. onChange={(e)=>{this.setState({mateContactMobile:e.target.value})}} required="required"/>
  1249. <span className="mandatory" style={{color:'red',marginLeft:'5px'}}>*</span>
  1250. </FormItem>
  1251. </div>
  1252. <div className="clearfix">
  1253. <FormItem
  1254. labelCol={{ span: 4 }}
  1255. wrapperCol={{ span: 18 }}
  1256. label="备注:" >
  1257. <Input type="textarea" rows={4} placeholder="匹配情况备注" value={this.state.mateRemark}
  1258. onChange={(e) => { this.setState({ mateRemark: e.target.value }) }} style={{width:'95%'}}/>
  1259. </FormItem>
  1260. </div>
  1261. <div className="clearfix">
  1262. <Button className="set-submit" type="primary" htmlType="submit" style={{marginLeft:'190px',marginBottom:'20px'}}>保存</Button>
  1263. <Button className="set-submit" type="ghost" onClick={this.addmateNos} style={{marginLeft:'100px',marginBottom:'20px'}}>取消</Button>
  1264. </div>
  1265. </Spin>
  1266. </Form >
  1267. </Modal>
  1268. </div>
  1269. <div className="patent-desc">
  1270. <Modal maskClosable={false} visible={this.state.addmatevisible1}
  1271. onOk={this.checkPatentProcess} onCancel={this.addmateNo1}
  1272. width='600px'
  1273. title='跟进情况添加'
  1274. footer=''
  1275. className="admin-desc-content">
  1276. <Form horizontal onSubmit={this.addhandleSubmit} id="add-form">
  1277. <Spin spinning={this.state.loading}>
  1278. <div className="clearfix">
  1279. <FormItem
  1280. labelCol={{ span: 5 }}
  1281. wrapperCol={{ span: 16 }}
  1282. label="跟进时间" >
  1283. <DatePicker
  1284. style={{'width':'95%'}}
  1285. format="YYYY-MM-DD"
  1286. placeholder="选择跟进时间"
  1287. value={this.state.RowData.addcreateTime ? moment(this.state.RowData.addcreateTime, "YYYY-MM-DD") : undefined}
  1288. onChange={(t, str) => {
  1289. this.state.RowData.addcreateTime = str;
  1290. this.setState({ RowData: this.state.RowData});
  1291. }} />
  1292. <span style={{color:'red',marginLeft:'5px'}}>*</span>
  1293. </FormItem>
  1294. </div>
  1295. <div className="clearfix">
  1296. <FormItem
  1297. labelCol={{ span: 5 }}
  1298. wrapperCol={{ span: 16 }}
  1299. label="跟进结果"
  1300. >
  1301. <Select placeholder="请选择跟进结果"
  1302. value={this.state.addresult}
  1303. style={{'width':'95%'}}
  1304. onChange={(e) => { this.setState({ addresult: e }) }}>
  1305. <Select.Option value="0" >跟进中</Select.Option>
  1306. <Select.Option value="1" >已匹配</Select.Option>
  1307. </Select>
  1308. <span style={{color:'red',marginLeft:'5px'}}>*</span>
  1309. </FormItem>
  1310. </div>
  1311. <div className="clearfix">
  1312. <FormItem
  1313. labelCol={{ span: 5 }}
  1314. wrapperCol={{ span: 16 }}
  1315. label="跟进情况" >
  1316. <Input type="textarea" rows={4} placeholder="跟进情况记录" value={this.state.addremarks}
  1317. onChange={(e) => { this.setState({ addremarks: e.target.value }) }} style={{width:'95%'}}/>
  1318. <span style={{color:'red',marginLeft:'5px'}}>*</span>
  1319. </FormItem>
  1320. </div>
  1321. <FormItem wrapperCol={{ span: 12, offset: 7 }}>
  1322. <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
  1323. <Button className="set-submit" type="ghost" onClick={this.addmateNo1} style={{marginLeft:'100px'}}>取消</Button>
  1324. </FormItem>
  1325. </Spin>
  1326. </Form >
  1327. </Modal>
  1328. </div>
  1329. <div className="patent-desc">
  1330. <Modal maskClosable={false} visible={this.state.lookvisible}
  1331. onOk={this.checkPatentProcess} onCancel={this.lookmateNo}
  1332. width='600px'
  1333. title='跟进情况列表'
  1334. footer=''
  1335. className="admin-desc-content">
  1336. <Form horizontal onSubmit={this.addhandleSubmit} id="add-form">
  1337. <Spin spinning={this.state.loading}>
  1338. <div className="clearfix">
  1339. <Form horizontal id="demand-form" onSubmit={this.contactSave} >
  1340. <Table
  1341. pagination={this.state.lookpagination}
  1342. columns={this.state.lookColumns}
  1343. dataSource={this.state.lookDataSource}
  1344. rowSelection={rowSelection}
  1345. onRowClick={this.lookTableRowClick}
  1346. />
  1347. </Form>
  1348. </div>
  1349. </Spin>
  1350. </Form >
  1351. </Modal>
  1352. </div>
  1353. <TechDemandDesc
  1354. data={this.state.RowData}
  1355. detailApiUrl={this.props['data-detailApiUrl']}
  1356. companyOption={this.state.companyOption}
  1357. userOption={this.state.userOption}
  1358. demandTypeOption={this.state.demandTypeOption}
  1359. showDesc={this.state.showDesc}
  1360. closeDesc={this.closeDesc} />
  1361. </div >
  1362. );
  1363. }
  1364. });
  1365. export default DemandList;