| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- /* eslint-disable react/jsx-props-no-spreading */
- /* eslint-disable no-underscore-dangle */
- import * as WebBrowser from 'expo-web-browser';
- import * as React from 'react';
- import {
- StyleSheet,
- View,
- Clipboard,
- Dimensions,
- Animated,
- PanResponder,
- findNodeHandle,
- UIManager,
- TouchableOpacity,
- RefreshControl,
- } from 'react-native';
- import { Div, Button, Image, Text } from 'react-native-magnus';
- import { Appbar, Menu } from 'react-native-paper';
- import Constants from 'expo-constants';
- import { Flex } from '@ant-design/react-native';
- import { ScrollView } from 'react-native-gesture-handler';
- import { useRequest, useCreation, useMount } from '@umijs/hooks';
- import { useTranslation } from 'react-i18next';
- import { useRoute } from '@react-navigation/native';
- import { useAnimation } from 'react-native-animation-hooks';
- import useModel from 'flooks';
- import Toast from '../../flooks/Toast';
- import Header from '../Order/Header'; // 头部
- import PayCom from './PayCom';
- import OrderModel from '../Order/model';
- import { connectKefu } from '../../Utils/TotastUtils';
- import {
- merchantStatusMap,
- orderStatusMap,
- RiderStatusMap,
- payMap,
- reasonMap,
- } from '../../Utils/OrderUtils';
- import Time from '../../Utils/TimeUtils';
- import MapScreen from '../Map/MapScreen';
- export default function PayOrderScreen({ navigation }) {
- const { t } = useTranslation();
- const [orderInfo, setorderInfo] = React.useState({
- merchant: {},
- orderGoodsSpecs: [],
- });
- const { payOrder } = useModel(OrderModel, []);
- const { loading, success, warnning, clearLoading } = useModel(Toast, []);
- const route = useRoute();
- const { params } = route;
- const { orderId } = params || 0;
- const orderRequest = useRequest(`/orderInfo/get/${orderId}`, {
- refreshDeps: [orderId],
- onSuccess: (result) => {
- setorderInfo(result);
- },
- });
- const { merchant, orderGoodsSpecs } = orderInfo;
- return (
- <Div bg="gray200" w="100%" flex={1}>
- <Header title="收银台" orderId={orderId} />
- <ScrollView
- contentContainerStyle={{ flexGrow: 1, backgroundColor: '#eee' }}
- refreshControl={
- <RefreshControl
- refreshing={orderRequest.loading}
- onRefresh={orderRequest.run}
- />
- }
- >
- <Div pt={10} pb={10} px={15}>
- <View style={[styles.card]}>
- <Text fontSize="xl">
- {t('yu-ji')}
- {new Time(
- orderInfo.timeOfArrival,
- 'yyyy-MM-DD HH:mm:ss'
- ).getFormat('HH:mm')}
- {t('song-da')}
- </Text>
- </View>
- <View style={[styles.card]}>
- <Div row pb={10}>
- <Text fontSize="xl" fontWeight="bold">
- {orderInfo.merShowName}
- </Text>
- </Div>
- <Div>
- {orderGoodsSpecs.map((item) => {
- return (
- <GoodsItem info={item} goods={item.goods} key={item.id} />
- );
- })}
- </Div>
- <Flex style={styles.info}>
- <Flex.Item>
- <Flex>
- <Text fontSize="xs" color="gray300" textAlign="left">
- {t('bao-zhuang-fei')}
- </Text>
- <Text fontSize="xs" color="gray300" textAlign="left">
- {t('can-he')}
- </Text>
- </Flex>
- </Flex.Item>
- <Text fontSize="xs" color="gray300" textAlign="left">
- ¥{orderInfo.packingPrice}
- </Text>
- </Flex>
- <Flex style={styles.info}>
- <Flex.Item>
- <Text fontSize="xs" color="gray300" textAlign="left">
- {t('pei-song-fei-ding-dong-zhuan-song')}
- </Text>
- </Flex.Item>
- <Text fontSize="xs" color="gray300" textAlign="left">
- ¥{orderInfo.deliveryAmount}
- </Text>
- </Flex>
- <Flex style={styles.info}>
- <Flex.Item>
- <Text fontSize="xs" color="gray300" textAlign="left">
- {t('man-jian')}
- </Text>
- </Flex.Item>
- <Text fontSize="xs" color="red500" textAlign="left">
- -¥{orderInfo.fullReduction}
- </Text>
- </Flex>
- {!!orderInfo.firstBuy && (
- <Flex style={styles.info}>
- <Flex.Item>
- <Text fontSize="xs" color="gray300" textAlign="left">
- {t('shou-dan')}
- </Text>
- </Flex.Item>
- <Text fontSize="xs" color="red500" textAlign="left">
- ¥{orderInfo.firstBuy}
- </Text>
- </Flex>
- )}
- <Flex style={styles.info}>
- <Flex.Item>
- <Text fontSize="xs" color="gray300" textAlign="left">
- {t('hong-bao')}
- </Text>
- </Flex.Item>
- <Text fontSize="xs" color="red500" textAlign="left">
- -¥{orderInfo.redBag || 0}
- </Text>
- </Flex>
- <Flex style={styles.total} justify="end">
- <Text size="s1">
- {t('xiao-ji')} ¥{orderInfo.realAmount}
- </Text>
- </Flex>
- </View>
- </Div>
- <Div pt={10} pb={10} px={15}>
- <Div bg="white" p={15}>
- <PayCom />
- </Div>
- <Button
- block
- bg="brand500"
- mt={20}
- onPress={() => {
- payOrder(orderId).then(() => {
- navigation.replace('OrderDetail', { orderId });
- });
- }}
- >
- 立即支付
- </Button>
- </Div>
- </ScrollView>
- </Div>
- );
- }
- const GoodsItem = ({ info, goods }) => {
- return (
- <Div row>
- <Image w={33} h={33} rounded={3} source={{ uri: goods.img }} />
- <Div flex={1} ml={10}>
- <Div row>
- <Text fontSize="sm" flex={1}>
- {goods.name}
- </Text>
- <Text fontSize="sm">X {info.num}</Text>
- <Text ml={10}>¥{info.goodsRealPrice}</Text>
- </Div>
- <Text fontSize="xs" color="gray400">
- {info.specification}
- </Text>
- </Div>
- </Div>
- );
- };
- const styles = StyleSheet.create({
- scroll: {
- flexGrow: 1,
- },
- card: {
- borderRadius: 3,
- backgroundColor: '#fff',
- marginBottom: 5,
- padding: 15,
- },
- item: {
- paddingVertical: 5,
- },
- icon: {
- width: 33,
- height: 33,
- borderRadius: 3,
- },
- goodsMain: {
- marginLeft: 10,
- },
- type: {
- // marginTop:3,
- },
- main: {
- marginTop: 10,
- paddingVertical: 5,
- borderColor: '#E5E5E5',
- borderTopWidth: 1,
- },
- info: {
- marginTop: 10,
- },
- total: {
- paddingTop: 10,
- marginTop: 10,
- borderColor: '#E5E5E5',
- borderTopWidth: 1,
- },
- address: {
- minWidth: 50,
- marginRight: 30,
- },
- info2: {
- marginTop: 10,
- },
- });
|