ProcessDetail.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  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, List} 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. const tabs = [
  16. {title: '基本信息', id: 1},
  17. {title: '进度明细', id: 2},
  18. ];
  19. const {width} = Dimensions.get('window');
  20. @connect(customer => ({...customer}))
  21. class ProcessDetail extends Component {
  22. // 潜客跟踪
  23. constructor(props) {
  24. super(props);
  25. this.state = {
  26. page: 1,
  27. rows: 10,
  28. order_id: this.props.navigation.state.params.order_id,
  29. source: this.props.navigation.state.params.source,
  30. };
  31. };
  32. componentDidMount() {
  33. this._fetchProcessReoprt();
  34. this._fetchData();
  35. this.refeshProcess = DeviceEventEmitter.addListener('refeshProcess', (param) => {
  36. this._fetchProcessReoprt(1);
  37. });
  38. this.refeshProcessDetail = DeviceEventEmitter.addListener('refeshProcessDetail', (param) => {
  39. this._fetchData();
  40. });
  41. }
  42. componentWillUnmount() {
  43. this.refeshProcess.remove();
  44. this.refeshProcessDetail.remove();
  45. }
  46. _fetchData = () => {
  47. this.props.dispatch({
  48. type: 'customer/fetchProcessDetail',
  49. payload: {id: this.state.order_id},
  50. });
  51. };
  52. _fetchMore = () => {
  53. const {page, totalRecord} = this.props.customer;
  54. if (page * this.state.rows >= totalRecord) {
  55. return;
  56. }
  57. const currentPage = page + 1;
  58. this._fetchProcessReoprt(currentPage);
  59. };
  60. _keyExtractor = (item, index) => {
  61. return index.toString();
  62. };
  63. _fetchProcessReoprt = (page) => {
  64. if (page) {
  65. this.state.page = page;
  66. }
  67. this.props.dispatch(createAction('customer/fetchProcessRecord')(this.state));
  68. };
  69. baseInfo = (ProcessDetailData) => {
  70. return <View style={{marginTop: 5}}>
  71. <List>
  72. <List.Item extra={<Text style={ComponentsStyles.font15}>{ProcessDetailData.name}</Text>} arrow="empty">
  73. <Text style={ComponentsStyles.font15}>单号</Text>
  74. </List.Item>
  75. <List.Item extra={<Text style={ComponentsStyles.font15}>{ProcessDetailData.no}</Text>} arrow="empty">
  76. <Text style={ComponentsStyles.font15}>姓名</Text>
  77. </List.Item>
  78. <View style={styles.telItemView}>
  79. <Text style={ComponentsStyles.font15}>电话</Text>
  80. <View style={styles.telView}>
  81. <Text style={ComponentsStyles.icon}>{'\ue61a'}</Text>
  82. <Text
  83. style={styles.telText}
  84. onPress={() => CallPhone(ProcessDetailData.tel, 1)}>
  85. {ProcessDetailData.tel}
  86. </Text>
  87. </View>
  88. </View>
  89. <List.Item extra={<Text style={ComponentsStyles.IDText}>{ProcessDetailData.address}</Text>}
  90. wrap
  91. multipleLine arrow="empty">
  92. <Text style={ComponentsStyles.font15}>地址</Text>
  93. </List.Item>
  94. <List.Item extra={<Text style={ComponentsStyles.IDText}>{ProcessDetailData.village}</Text>}
  95. wrap
  96. multipleLine arrow="empty">
  97. <Text style={ComponentsStyles.font15}>小区</Text>
  98. </List.Item>
  99. <List.Item extra={<Text style={ComponentsStyles.font15}>{ProcessDetailData.project_text}</Text>}
  100. arrow="empty">
  101. <Text style={ComponentsStyles.font15}>项目</Text>
  102. </List.Item>
  103. <List.Item extra={<Text style={ComponentsStyles.font15}>{ProcessDetailData.status_text}</Text>}
  104. arrow="empty">
  105. <Text style={ComponentsStyles.font15}>订单状态</Text>
  106. </List.Item>
  107. <List.Item extra={<Text style={ComponentsStyles.font15}>{ProcessDetailData.stage_progress_text}</Text>}
  108. arrow="empty">
  109. <Text style={ComponentsStyles.font15}>阶段进度</Text>
  110. </List.Item>
  111. <List.Item extra={<Text style={ComponentsStyles.font15}>{ProcessDetailData.service_user_text}</Text>}
  112. arrow="empty">
  113. <Text style={ComponentsStyles.font15}>当前服务人员</Text>
  114. </List.Item>
  115. <List.Item extra={<Text style={ComponentsStyles.font15}>{ProcessDetailData.create_time_f}</Text>}
  116. arrow="empty">
  117. <Text style={ComponentsStyles.font15}>下单时间</Text>
  118. </List.Item>
  119. </List>
  120. </View>;
  121. };
  122. renderItem = (data) => {
  123. const item = data.item;
  124. return <View style={styles.reportMain}>
  125. <View style={styles.row5}>
  126. <View style={ComponentsStyles.itemView}>
  127. <Text style={ComponentsStyles.icon}>{'\ue619'} <Text
  128. style={ComponentsStyles.font15}>{item.user_text}</Text>
  129. </Text>
  130. </View>
  131. <View style={ComponentsStyles.itemViewEnd}>
  132. <Text style={ComponentsStyles.icon}>{'\ue6cc'}</Text>
  133. <Text style={ComponentsStyles.font15}>{item.operation_time_f}</Text>
  134. </View>
  135. </View>
  136. <View style={styles.row5}>
  137. <Text style={ComponentsStyles.icon}>{'\ue6ed'} </Text>
  138. <Text style={ComponentsStyles.font15}>{item.operation}</Text>
  139. </View>
  140. <View style={styles.descView}>
  141. <Text style={ComponentsStyles.font15}>备注</Text>
  142. <Text style={[ComponentsStyles.font15, styles.descText]}>{item.notes}</Text>
  143. </View>
  144. </View>;
  145. };
  146. render() {
  147. const {processRecordData, processRecordRState, processDetail} = this.props.customer;
  148. return (
  149. <Provider>
  150. <Tabs
  151. tabs={tabs}
  152. initialPage={0}
  153. tabBarPosition="top"
  154. styles={{
  155. topTabBarSplitLine: {
  156. borderBottomWidth: 0,
  157. },
  158. }}
  159. tabBarUnderlineStyle={{
  160. backgroundColor: '#03C762',
  161. width: 40,
  162. marginLeft: (width / 2 - 38) / 2,
  163. height: 3,
  164. borderRadius: 2,
  165. }}
  166. tabBarActiveTextColor="#000"
  167. >
  168. {/*基本信息*/}
  169. <ScrollView>
  170. {this.baseInfo(processDetail)}
  171. </ScrollView>
  172. {/* 跟踪记录*/}
  173. <View>
  174. <RefreshFlatList
  175. data={processRecordData}
  176. renderItem={(item) => this.renderItem(item)}
  177. keyExtractor={this._keyExtractor}
  178. themeColor="#5eafe4"
  179. refreshState={processRecordRState}
  180. footerRefreshingText="正在加载"
  181. footerFailureText="加载失败"
  182. onHeaderRefresh={() => this._fetchProcessReoprt(1)}
  183. onFooterRefresh={() => this._fetchMore()}
  184. ListHeaderComponent={() => <View style={{height: 0}}/>}
  185. ItemSeparatorComponent={() => <View style={{height: 0}}/>}
  186. />
  187. </View>
  188. </Tabs>
  189. {this.state.source === 1 ?
  190. <Button
  191. type="primary"
  192. onPress={() => this.props.navigation.navigate('UpdateProcess',
  193. {
  194. customer: processDetail.customer,
  195. })}
  196. style={ComponentsStyles.button}
  197. >
  198. <Text
  199. style={{color: '#fff'}}>更新进度</Text>
  200. </Button>
  201. :
  202. <Button
  203. type="primary"
  204. onPress={() => this.props.navigation.navigate('DispatchProcess',
  205. {
  206. customer: processDetail.customer,
  207. order: processDetail.id,
  208. })}
  209. style={ComponentsStyles.button}
  210. >
  211. <Text
  212. style={{color: '#fff'}}>分配</Text>
  213. </Button>
  214. }
  215. </Provider>
  216. );
  217. }
  218. }
  219. const styles = StyleSheet.create({
  220. descView: {
  221. marginHorizontal: 15,
  222. paddingVertical: 2,
  223. borderBottomWidth: 1,
  224. borderBottomColor: '#eee',
  225. },
  226. descText: {
  227. color: '#928f8f',
  228. paddingVertical: 2,
  229. },
  230. telItemView: {
  231. flex: 1,
  232. flexDirection: 'row',
  233. marginLeft: 15,
  234. paddingRight: 18,
  235. paddingVertical: 8,
  236. borderBottomWidth: 0.5,
  237. borderBottomColor: '#eaeaea',
  238. },
  239. telName: {
  240. color: '#333',
  241. fontSize: 18,
  242. },
  243. telView: {
  244. flex: 1,
  245. flexDirection: 'row',
  246. justifyContent: 'flex-end',
  247. alignItems: 'center',
  248. },
  249. telText: {
  250. color: '#2b90ea',
  251. fontSize: 15,
  252. },
  253. listStyle: {
  254. // borderBottomWidth: 10,
  255. borderBottomColor: '#f6f7f8',
  256. },
  257. reportMain: {
  258. marginTop: 5,
  259. backgroundColor: '#fff',
  260. paddingHorizontal: 10,
  261. // borderWidth:1,
  262. },
  263. customerText: {
  264. color: '#333',
  265. fontSize: 16,
  266. },
  267. row5: {
  268. flexDirection: 'row',
  269. paddingVertical: 5,
  270. },
  271. red5: {
  272. fontSize: 15,
  273. color: 'red',
  274. padding: 2,
  275. },
  276. });
  277. export default ProcessDetail;