ReviewDetail.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. import React, {Component} from 'react';
  2. import {
  3. View,
  4. Text,
  5. StyleSheet,
  6. ScrollView,
  7. Dimensions, DeviceEventEmitter,
  8. } from 'react-native';
  9. import {Tabs, Provider, Button, Modal, Toast, List, Picker} from '@ant-design/react-native';
  10. import {createAction} from '../../utils';
  11. import {connect} from 'react-redux';
  12. import CallPhone from '../../components/CallPhone';
  13. import ComponentsStyles from '../../components/ComponentsStyles';
  14. import RefreshFlatList from 'react-native-refresh-flatlist';
  15. import SyncStorage from 'sync-storage';
  16. const tabs = [
  17. {title: '基本信息', id: 1},
  18. {title: '跟踪记录', id: 2},
  19. ];
  20. const {width} = Dimensions.get('window');
  21. @connect(customer => ({...customer}))
  22. class ReviewDetail extends Component {
  23. // 潜客跟踪
  24. constructor(props) {
  25. super(props);
  26. this.state = {
  27. getParm: {
  28. page: 1,
  29. rows: 10,
  30. customer: this.props.navigation.state.params.id,
  31. },
  32. moreModelVisible: false,
  33. dispatchVisible: false,
  34. USERS: [],
  35. new_user: '',
  36. };
  37. };
  38. componentDidMount() {
  39. this._fetchReviewReoprt();
  40. this._fetchData();
  41. this.refeshReport = DeviceEventEmitter.addListener('refeshReport', (param) => {
  42. this._fetchReviewReoprt(1);
  43. });
  44. this.refeshCustomerDetail = DeviceEventEmitter.addListener('refeshCustomerDetail', (param) => {
  45. this._fetchData(1);
  46. });
  47. }
  48. componentWillUnmount() {
  49. this.refeshReport.remove();
  50. this.refeshCustomerDetail.remove();
  51. }
  52. _fetchData = () => {
  53. this.props.dispatch({
  54. type: 'customer/fetchCustomerDetail',
  55. payload: {id: this.state.getParm.customer},
  56. });
  57. };
  58. _fetchMore = () => {
  59. const {page, totalRecord} = this.props.customer;
  60. if (page * this.state.getParm.rows >= totalRecord) {
  61. return;
  62. }
  63. const currentPage = page + 1;
  64. this._fetchReviewReoprt(currentPage);
  65. };
  66. _keyExtractor = (item, index) => {
  67. return index.toString();
  68. };
  69. _fetchReviewReoprt = (page) => {
  70. if (page) {
  71. this.state.getParm.page = page;
  72. }
  73. this.props.dispatch(createAction('customer/fetchReviewRecord')(this.state.getParm));
  74. };
  75. baseInfo = (reviewDetailData) => {
  76. return <View style={{marginTop: 5}}>
  77. <List style={styles.listStyle}>
  78. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.name}</Text>} arrow="empty">
  79. <Text style={ComponentsStyles.font15}>姓名</Text>
  80. </List.Item>
  81. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.gender_text}</Text>}
  82. arrow="empty">
  83. <Text style={ComponentsStyles.font15}>性别</Text>
  84. </List.Item>
  85. <View style={styles.telItemView}>
  86. <Text style={ComponentsStyles.font15}>电话</Text>
  87. <View style={styles.telView}>
  88. <Text style={ComponentsStyles.icon}>{'\ue61a'}</Text>
  89. <Text
  90. style={styles.telText}
  91. onPress={() => CallPhone(reviewDetailData.tel, 1)}>
  92. {reviewDetailData.tel}
  93. </Text>
  94. </View>
  95. </View>
  96. <List.Item extra={<Text style={ComponentsStyles.IDText}>{reviewDetailData.address}</Text>}
  97. wrap
  98. multipleLine arrow="empty">
  99. <Text style={ComponentsStyles.font15}>地址</Text>
  100. </List.Item>
  101. <List.Item extra={<Text style={ComponentsStyles.IDText}>{reviewDetailData.village}</Text>}
  102. wrap
  103. multipleLine arrow="empty">
  104. <Text style={ComponentsStyles.font15}>小区</Text>
  105. </List.Item>
  106. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.source_text}</Text>}
  107. arrow="empty">
  108. <Text style={ComponentsStyles.font15}>来源</Text>
  109. </List.Item>
  110. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.project_text}</Text>}
  111. arrow="empty">
  112. <Text style={ComponentsStyles.font15}>项目</Text>
  113. </List.Item>
  114. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.stage_progress_text}</Text>}
  115. arrow="empty">
  116. <Text style={ComponentsStyles.font15}>阶段进度</Text>
  117. </List.Item>
  118. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.status_text}</Text>}
  119. arrow="empty">
  120. <Text style={ComponentsStyles.font15}>状态</Text>
  121. </List.Item>
  122. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.track_user_text}</Text>}
  123. arrow="empty">
  124. <Text style={ComponentsStyles.font15}>跟踪人员</Text>
  125. </List.Item>
  126. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.store_text}</Text>}
  127. arrow="empty">
  128. <Text style={ComponentsStyles.font15}>门店</Text>
  129. </List.Item>
  130. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.next_time_f}</Text>}
  131. arrow="empty">
  132. <Text style={ComponentsStyles.font15}>下次跟踪</Text>
  133. </List.Item>
  134. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.enter_count}</Text>}
  135. arrow="empty">
  136. <Text style={ComponentsStyles.font15}>进店次数</Text>
  137. </List.Item>
  138. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.last_enter_time}</Text>}
  139. arrow="empty">
  140. <Text style={ComponentsStyles.font15}>最后进店时间</Text>
  141. </List.Item>
  142. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.create_time_f}</Text>}
  143. arrow="empty">
  144. <Text style={ComponentsStyles.font15}>建档时间</Text>
  145. </List.Item>
  146. <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.create_user_text}</Text>}
  147. arrow="empty">
  148. <Text style={ComponentsStyles.font15}>建档人</Text>
  149. </List.Item>
  150. <View style={styles.descView}>
  151. <Text style={ComponentsStyles.font15}>备注</Text>
  152. <Text style={ComponentsStyles.font15}>{reviewDetailData.notes}</Text>
  153. </View>
  154. </List>
  155. </View>;
  156. };
  157. renderItem = (data) => {
  158. const item = data.item;
  159. return <View style={styles.reportMain}>
  160. <View style={styles.row5}>
  161. <View style={ComponentsStyles.itemView}>
  162. <Text style={ComponentsStyles.icon}>{'\ue619'} </Text>
  163. <Text style={ComponentsStyles.font15}>{item.create_user_text}</Text>
  164. </View>
  165. </View>
  166. <View style={styles.row5}>
  167. <Text style={ComponentsStyles.icon}>{'\ue6ed'} </Text>
  168. <Text style={[ComponentsStyles.font15,{width:'95%'}]}>{item.description}</Text>
  169. </View>
  170. <View style={styles.row5}>
  171. <Text style={ComponentsStyles.icon}>{'\ue6cc'} </Text>
  172. <Text style={{fontSize: 15}}>{item.create_time_f}</Text>
  173. </View>
  174. <View style={styles.row5}>
  175. <Text style={styles.red5}>支援或放弃:</Text>
  176. <Text style={[ComponentsStyles.font15,{width:'73%'}]}>{item.instruction}</Text>
  177. </View>
  178. <View style={styles.row5}>
  179. <Text style={styles.red5}>审核:</Text>
  180. <Text style={[ComponentsStyles.font15,{width:'86%'}]}>{item.check_status_text}--{item.check_comment}</Text>
  181. </View>
  182. </View>;
  183. };
  184. addProject = (ids, name) => {
  185. this.props.dispatch({
  186. type: 'customer/addCustomerProject',
  187. payload: {projects: ids, id: this.state.getParm.customer},
  188. callback: () => {
  189. Toast.info('添加成功!', 1, () => {
  190. DeviceEventEmitter.emit('backRefesh');
  191. this.props.navigation.goBack();
  192. });
  193. },
  194. });
  195. };
  196. getUsers = () => {
  197. this.setState({moreModelVisible: false, dispatchVisible: true});
  198. this.props.dispatch({
  199. type: 'customer/getUser',
  200. callback: (data) => {
  201. let USERS = [];
  202. data.map((item, index) => {
  203. USERS.push({
  204. value: item.value, label: item.lable,
  205. });
  206. });
  207. this.setState({USERS});
  208. },
  209. });
  210. };
  211. againDispatch = (id) => {
  212. if (!this.state.new_user) {
  213. Toast.info('请选择人员', 1);
  214. return;
  215. }
  216. this.props.dispatch({
  217. type: 'customer/againDispatchUser',
  218. payload: {id: id, user: this.state.new_user},
  219. callback: () => {
  220. DeviceEventEmitter.emit('backRefesh');
  221. this.props.navigation.goBack();
  222. },
  223. });
  224. };
  225. render() {
  226. const {reviewRecordData, reviewRecordRState, customerDetail} = this.props.customer;
  227. const dispatchButtons = [
  228. {text: '取消', onPress: () => this.setState({dispatchVisible: false})},
  229. {text: '保存', onPress: () => this.againDispatch(customerDetail.id)},
  230. ];
  231. const premissions = SyncStorage.get('premissions');
  232. return (
  233. <Provider>
  234. <Tabs
  235. tabs={tabs}
  236. initialPage={0}
  237. tabBarPosition="top"
  238. styles={{
  239. topTabBarSplitLine: {
  240. borderBottomWidth: 0,
  241. },
  242. }}
  243. tabBarUnderlineStyle={{
  244. backgroundColor: '#03C762',
  245. width: 40,
  246. marginLeft: (width / 2 - 38) / 2,
  247. height: 3,
  248. borderRadius: 2,
  249. }}
  250. tabBarActiveTextColor="#000"
  251. >
  252. {/*基本信息*/}
  253. <ScrollView>
  254. {this.baseInfo(customerDetail)}
  255. </ScrollView>
  256. {/* 跟踪记录*/}
  257. <View>
  258. <RefreshFlatList
  259. data={reviewRecordData}
  260. renderItem={(item) => this.renderItem(item)}
  261. keyExtractor={this._keyExtractor}
  262. themeColor="#5eafe4"
  263. refreshState={reviewRecordRState}
  264. footerRefreshingText="正在加载"
  265. footerFailureText="加载失败"
  266. onHeaderRefresh={() => this._fetchReviewReoprt(1)}
  267. onFooterRefresh={() => this._fetchMore()}
  268. ListHeaderComponent={() => <View style={{height: 0}}/>}
  269. ItemSeparatorComponent={() => <View style={{height: 0}}/>}
  270. />
  271. </View>
  272. </Tabs>
  273. <View style={{flexDirection: 'row', justifyContent: 'center', backgroundColor: '#fff'}}>
  274. <Button
  275. type="primary"
  276. onPress={() => this.props.navigation.navigate('WriteTrackReport',
  277. {
  278. item: customerDetail,
  279. })}
  280. style={{width: 200, margin: 5}}
  281. >
  282. <Text
  283. style={{color: '#fff'}}>填写跟踪报告</Text></Button>
  284. <Button
  285. type="warning"
  286. onPress={() => this.setState({moreModelVisible: true})}
  287. style={{width: 100, margin: 5}}
  288. >
  289. <Text
  290. style={{color: '#fff'}}>更多</Text></Button>
  291. </View>
  292. <Modal
  293. popup
  294. closable
  295. maskClosable
  296. animationType="slide-up"
  297. visible={this.state.moreModelVisible}
  298. onClose={() => this.setState({moreModelVisible: false})}
  299. >
  300. <View style={{padding: 10}}>
  301. <List>
  302. {premissions.indexOf('customer.inner_review') > -1 &&
  303. <List.Item>
  304. <Text style={styles.modalText}
  305. onPress={() => {
  306. this.props.navigation.navigate('WriteInternalReport',
  307. {
  308. item: customerDetail,
  309. });
  310. this.setState({moreModelVisible: false});
  311. }
  312. }
  313. >内部跟踪</Text>
  314. </List.Item>
  315. }
  316. <List.Item>
  317. <Text
  318. style={styles.modalText}
  319. onPress={() => {
  320. this.props.navigation.navigate('EditCustomer',
  321. {
  322. item: customerDetail,
  323. });
  324. this.setState({moreModelVisible: false});
  325. }
  326. }
  327. >修改信息</Text>
  328. </List.Item>
  329. <List.Item>
  330. <Text
  331. style={styles.modalText}
  332. onPress={() => {
  333. this.props.navigation.navigate('SearchProject', {
  334. callback: this.addProject,
  335. disabled_ids: customerDetail.project,
  336. });
  337. this.setState({moreModelVisible: false});
  338. }
  339. }
  340. >添加项目</Text>
  341. </List.Item>
  342. {premissions.indexOf('customer.again_dispatch') > -1 &&
  343. <List.Item>
  344. <Text
  345. style={styles.modalText}
  346. onPress={() => this.getUsers()
  347. }
  348. >重新分配</Text>
  349. </List.Item>
  350. }
  351. <List.Item>
  352. <Text
  353. style={styles.modalText}
  354. onPress={() => {
  355. this.props.navigation.navigate('UpdateProcess', {
  356. customer: customerDetail.id,
  357. });
  358. this.setState({moreModelVisible: false});
  359. }
  360. }
  361. >更新进度</Text>
  362. </List.Item>
  363. <List.Item onPress={() => this.setState({moreModelVisible: false})}>
  364. <Text style={styles.modalText}>取消</Text>
  365. </List.Item>
  366. </List>
  367. </View>
  368. </Modal>
  369. <Modal
  370. transparent
  371. maskClosable
  372. visible={this.state.dispatchVisible}
  373. footer={dispatchButtons}
  374. >
  375. <Picker
  376. data={this.state.USERS}
  377. cols={1}
  378. value={this.state.new_user}
  379. onChange={(val) => this.setState({new_user: val})}
  380. >
  381. <List.Item arrow="horizontal">
  382. 选择人员
  383. </List.Item>
  384. </Picker>
  385. </Modal>
  386. </Provider>
  387. );
  388. }
  389. }
  390. const styles = StyleSheet.create({
  391. modalText: {
  392. color: '#333',
  393. fontSize: 16,
  394. textAlign: 'center',
  395. textAlignVertical: 'center',
  396. },
  397. textInput: {
  398. width: '80%',
  399. textAlign: 'left',
  400. paddingHorizontal: 10,
  401. },
  402. modalContainer: {
  403. flexDirection: 'row',
  404. paddingHorizontal: 10,
  405. paddingLeft: 13,
  406. borderBottomWidth: 1,
  407. borderBottomColor: '#eee',
  408. },
  409. textStyle: {
  410. fontSize: 16,
  411. paddingVertical: 10,
  412. },
  413. telItemView: {
  414. flex: 1,
  415. flexDirection: 'row',
  416. marginLeft: 15,
  417. paddingRight: 18,
  418. paddingVertical: 8,
  419. borderBottomWidth: 0.5,
  420. borderBottomColor: '#eaeaea',
  421. },
  422. telName: {
  423. color: '#333',
  424. fontSize: 18,
  425. },
  426. telView: {
  427. flex: 1,
  428. flexDirection: 'row',
  429. justifyContent: 'flex-end',
  430. alignItems: 'center',
  431. },
  432. telText: {
  433. color: '#2b90ea',
  434. fontSize: 15,
  435. },
  436. listStyle: {
  437. borderBottomWidth: 10,
  438. borderBottomColor: '#f6f7f8',
  439. },
  440. reportMain: {
  441. marginTop: 5,
  442. // marginBottom: 5,
  443. backgroundColor: '#fff',
  444. paddingHorizontal: 10,
  445. // borderWidth:1,
  446. },
  447. customerText: {
  448. color: '#333',
  449. fontSize: 16,
  450. },
  451. row5: {
  452. flexDirection: 'row',
  453. paddingVertical: 3,
  454. },
  455. red5: {
  456. fontSize: 15,
  457. color: 'red',
  458. padding: 2,
  459. },
  460. descView: {
  461. marginHorizontal: 15,
  462. paddingVertical: 2,
  463. borderBottomWidth: 1,
  464. borderBottomColor: '#eee',
  465. },
  466. descText: {
  467. color: '#928f8f',
  468. paddingVertical: 2,
  469. },
  470. });
  471. export default ReviewDetail;