visit.jsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. import React from 'react';
  2. import { Form, Button, Spin, message, Table, Popconfirm, Tooltip, Alert } from 'antd';
  3. import ajax from 'jquery/src/ajax/xhr.js';
  4. import $ from 'jquery/src/ajax';
  5. import FollowDetail from '../../followDetail.jsx'
  6. import { getContactType } from '@/tools.js';
  7. import VisitDetail from './visitDetail.jsx';
  8. import PublicSupplement from "../../../../../../publicSupplement";
  9. const Visit = React.createClass({
  10. getInitialState() {
  11. return {
  12. visitArrList: [],
  13. loading: false,
  14. visitModul: false,
  15. visitModuls: false,
  16. paginations: {
  17. defaultCurrent: 1,
  18. defaultPageSize: 10,
  19. showQuickJumper: true,
  20. pageSize: 10,
  21. onChange: function (page) {
  22. this.loadVisit(page);
  23. }.bind(this),
  24. showTotal: function (total) {
  25. return "共" + total + "条数据";
  26. },
  27. },
  28. visitsList: [
  29. {
  30. title: "客户名称",
  31. dataIndex: "nickname",
  32. key: "nickname",
  33. width: 150,
  34. render: (text) => {
  35. return (
  36. <Tooltip title={text}>
  37. <div
  38. // style={{
  39. // maxWidth: '150px',
  40. // overflow: 'hidden',
  41. // textOverflow: "ellipsis",
  42. // whiteSpace: 'nowrap',
  43. // }}
  44. >{text}</div>
  45. </Tooltip>
  46. )
  47. },
  48. },
  49. {
  50. title: "跟进方式",
  51. dataIndex: "contactType",
  52. key: "contactType",
  53. width: 100,
  54. render: (text) => {
  55. return getContactType(text);
  56. },
  57. },
  58. {
  59. title: "联系人",
  60. dataIndex: "contacts",
  61. key: "contacts",
  62. width: 150,
  63. render: (text, record) => {
  64. return (
  65. <div>
  66. {record.readOnly ? <span>***</span> : <span>{text}</span>}
  67. </div>
  68. );
  69. },
  70. },
  71. {
  72. title: "联系电话",
  73. dataIndex: "contactMobile",
  74. key: "contactMobile",
  75. width: 120,
  76. render: (text, record) => {
  77. return (
  78. <div>
  79. {record.readOnly ? <span>***</span> : <span>{text}</span>}
  80. </div>
  81. );
  82. },
  83. },
  84. {
  85. title: "跟进人",
  86. dataIndex: "adminName",
  87. key: "adminName",
  88. width: 120
  89. },
  90. // {
  91. // title: "跟进说明",
  92. // dataIndex: "result",
  93. // key: "result",
  94. // width: 300,
  95. // render: (text, record) => {
  96. // return (
  97. // <div style={{wordBreak:"break-all"}}>
  98. // <div>{text}</div>
  99. // {
  100. // getContactType(record.contactType) === '公出打卡' && <div style={{
  101. // paddingTop: '15px',
  102. // wordBreak: "break-all",
  103. // display: "flex",
  104. // alignItems: 'flex-end'
  105. // }}>
  106. // 补充说明:
  107. // {record.supplement}
  108. // <div style={{paddingLeft: '10px'}}>
  109. // <PublicSupplement infor={record} onCancel={() => {
  110. // this.loadVisit(this.state.ispage);
  111. // }}/>
  112. // </div>
  113. // </div>
  114. // }
  115. // </div>
  116. // )
  117. // }
  118. // },
  119. {
  120. title: "跟进时间",
  121. dataIndex: "followTime",
  122. key: "followTime",
  123. width: 125
  124. },
  125. {
  126. title: "公出目标",
  127. dataIndex: "result",
  128. key: "result",
  129. width: 200,
  130. // render: (text, record) => {
  131. // return (
  132. // <div style={{wordBreak:"break-all"}}>
  133. // <div>{text}</div>
  134. // {
  135. // getContactType(record.contactType) === '公出打卡' && <div style={{
  136. // paddingTop: '15px',
  137. // wordBreak: "break-all",
  138. // display: "flex",
  139. // alignItems: 'flex-end'
  140. // }}>
  141. // {/* 补充说明:
  142. // {record.supplement} */}
  143. // <div style={{paddingLeft: '10px'}}>
  144. // <PublicSupplement infor={record} onCancel={() => {
  145. // this.loadVisit(this.state.ispage);
  146. // }}/>
  147. // </div>
  148. // </div>
  149. // }
  150. // </div>
  151. // )
  152. // }
  153. },
  154. {
  155. title: "公出计划",
  156. dataIndex: "plan",
  157. key: "plan",
  158. width: 200,
  159. render: (text) => {
  160. return (
  161. <div
  162. // style={{
  163. // width: 50,
  164. // overflow: "hidden",
  165. // textOverflow: "ellipsis",
  166. // whiteSpace: "nowrap",
  167. // }}
  168. // title={text}
  169. >
  170. {text}
  171. </div>
  172. );
  173. },
  174. },
  175. {
  176. title: "预计效果",
  177. dataIndex: "expectedEffect",
  178. key: "expectedEffect",
  179. width: 200,
  180. render: (text) => {
  181. return (
  182. <div
  183. // style={{
  184. // width: 50,
  185. // overflow: "hidden",
  186. // textOverflow: "ellipsis",
  187. // whiteSpace: "nowrap",
  188. // }}
  189. // title={text}
  190. >
  191. {text}
  192. </div>
  193. );
  194. },
  195. },
  196. {
  197. title: "本次公出目标总结",
  198. dataIndex: "supplement",
  199. key: "supplement",
  200. width: 200,
  201. render: (text, record) => {
  202. return (
  203. <div style={{ wordBreak: "break-all" }}>
  204. {
  205. getContactType(record.contactType) === '公出打卡' && <div style={{
  206. // paddingTop: '15px',
  207. wordBreak: "break-all",
  208. }}>
  209. {text}
  210. <div>
  211. <PublicSupplement closeModel={this.closeModel} infor={record} onCancel={() => {
  212. this.loadVisit(this.state.ispage);
  213. }} />
  214. </div>
  215. </div>
  216. }
  217. </div>
  218. );
  219. },
  220. },
  221. {
  222. title: "下一次公出计划",
  223. dataIndex: "nextPlan",
  224. key: "nextPlan",
  225. width: 200,
  226. render: (text) => {
  227. return (
  228. <div
  229. // style={{
  230. // width: 70,
  231. // overflow: "hidden",
  232. // textOverflow: "ellipsis",
  233. // whiteSpace: "nowrap",
  234. // }}
  235. // title={text}
  236. >
  237. {text}
  238. </div>
  239. );
  240. },
  241. },
  242. ],
  243. };
  244. },
  245. //拜访记录删除
  246. visitDelet(e) {
  247. this.setState({
  248. visitModul: false,
  249. loading: true
  250. });
  251. $.ajax({
  252. method: "get",
  253. dataType: "json",
  254. crossDomain: false,
  255. url: globalConfig.context + "/api/admin/customer/deleteFollow",
  256. data: {
  257. followId: e.followId, //删除的ID
  258. }
  259. }).done(function (data) {
  260. if (!data.error.length) {
  261. message.success('删除成功!');
  262. this.setState({
  263. loading: false,
  264. });
  265. } else {
  266. message.warning(data.error[0].message);
  267. };
  268. this.loadVisit();
  269. }.bind(this));
  270. },
  271. //查看跟进记录列表
  272. loadVisit(pageNo) {
  273. this.setState({
  274. loading: true
  275. });
  276. $.ajax({
  277. method: "get",
  278. dataType: "json",
  279. crossDomain: false,
  280. url: globalConfig.context + '/api/admin/customer/listFollowHistory',
  281. data: {
  282. pageNo: pageNo || 1,
  283. pageSize: this.state.paginations.pageSize,
  284. uid: this.props.data.id, //名称1
  285. },
  286. success: function (data) {
  287. let theArr = [];
  288. if (data.error.length || data.data.list == "") {
  289. if (data.error && data.error.length) {
  290. message.warning(data.error[0].message);
  291. };
  292. } else {
  293. for (let i = 0; i < data.data.list.length; i++) {
  294. let thisdata = data.data.list[i];
  295. theArr.push(thisdata);
  296. };
  297. this.state.paginations.current = data.data.pageNo;
  298. this.state.paginations.total = data.data.totalCount;
  299. };
  300. if (data.data.list && !data.data.list.length) {
  301. this.state.paginations.current = 0;
  302. this.state.paginations.total = 0;
  303. };
  304. this.setState({
  305. visitArrList: theArr,
  306. paginations: this.state.paginations
  307. });
  308. }.bind(this),
  309. }).always(function () {
  310. this.setState({
  311. loading: false
  312. });
  313. }.bind(this));
  314. },
  315. componentWillMount() {
  316. this.loadVisit();
  317. },
  318. detailsModal() {
  319. this.props.closeDetail(false, false)
  320. },
  321. closeModel() {
  322. this.setState({
  323. visitModul: false
  324. })
  325. },
  326. //点击整行
  327. VisitRowClick(record) {
  328. this.setState({
  329. followData: record,
  330. visitModul: true,
  331. })
  332. },
  333. //进入新增拜访记录
  334. visit() {
  335. let obj = {
  336. id: this.props.data.id
  337. }
  338. this.setState({
  339. followData: obj,
  340. visitModuls: true,
  341. })
  342. },
  343. closeDesc(e, s) {
  344. this.state.visitModul = e
  345. this.state.visitModuls = e
  346. if (s) {
  347. this.loadVisit()
  348. }
  349. },
  350. componentWillReceiveProps(nextProps) {
  351. if (nextProps.data.id && nextProps.visitState) {
  352. this.loadVisit()
  353. }
  354. this.setState({
  355. visitModul: false
  356. })
  357. },
  358. render() {
  359. return (
  360. <div className="clearfix">
  361. <Alert message="注:面谈公出补充,沟通完后记录今天交流的情况。计划下一次什么时候再面谈?该如何面谈?该如何跟进?" banner />
  362. <Button
  363. onClick={(e) => {
  364. e.stopPropagation()
  365. if (!this.props.data.orgCode) {
  366. message.warning(`请先完善"企业统一社会信用代码"`)
  367. return
  368. }
  369. this.visit();
  370. }}
  371. type="primary"
  372. style={{ marginTop: '10px', float: 'right' }}
  373. >
  374. 客户跟进
  375. </Button>
  376. <Spin spinning={this.state.loading}>
  377. <Table
  378. size="middle"
  379. style={{ marginTop: '60px' }}
  380. pagination={this.state.paginations}
  381. columns={this.state.visitsList}
  382. dataSource={this.state.visitArrList}
  383. scroll={{ x: '120%', y: 440 }}
  384. onRowClick={this.VisitRowClick}
  385. />
  386. </Spin>
  387. <VisitDetail
  388. categoryArr={this.props.categoryArr}
  389. followData={this.state.followData}
  390. visitModul={this.state.visitModul}
  391. closeDesc={this.closeDesc}
  392. mid={this.props.data.id}
  393. />
  394. <FollowDetail
  395. categoryArr={this.props.categoryArr}
  396. followData={this.state.followData}
  397. isFlag={true}
  398. visitModul={this.state.visitModuls}
  399. closeDesc={this.closeDesc}
  400. loadData={this.props.loadData}
  401. />
  402. </div>
  403. )
  404. }
  405. })
  406. export default Visit;