Commit cf4839f1 authored by 赵振东's avatar 赵振东

feat: 新增审核报价单

parent af903ee0
......@@ -38,8 +38,8 @@ const RootNavigationContainer: React.FC<Iprops> = props => {
screenOptions={{
headerTitleAlign: 'center',
}}
// initialRouteName="Login"
initialRouteName="Home"
// initialRouteName="CheckRequireOrder"
>
{SCREEN_NAMES.map(name => (
<RootStack.Screen
......
......@@ -29,6 +29,7 @@ import FeedbackGlo from '../components/Feedback';
import CheckInquiryOrder from '../views/CheckInquiryOrder';
import InquiryOrderDetail from '../views/CheckInquiryOrder/pages/InquiryOrderDetail';
import EnsureInquiryOrder from '../views/EnsureInquiryOrder';
import CheckQuotationOrder from '../views/CheckQuotationOrder';
export const ROUTERS = {
Login: {
......@@ -113,8 +114,15 @@ export const ROUTERS = {
headerShown: false,
},
// 审核求购报价单
CheckRequireOrder: {
CheckQuotationOrder: {
title: '审核求购报价单',
component: CheckQuotationOrder,
headerShown: false,
},
// 审核报价单
CheckRequireOrder: {
title: '审核报价单',
component: CheckRequireOrder,
headerShown: false,
},
......
import React, { useState } from 'react';
import { Image, Text, TouchableOpacity, View } from 'react-native';
import useAppStyle from '../../../../hooks/useAppStyle';
import styles from './styles';
import { useNavigation } from '@react-navigation/native';
import { SvgXml } from 'react-native-svg';
import Icons from 'react-native-vector-icons/AntDesign';
import BaoIcon from '../../../../../assets/images/home_image/Bao.png';
import XunIcon from '../../../../../assets/images/home_image/Xun.png';
import { CheckOrderInnerStatusEnum } from '../../constants';
import { CheckOrderExternalStatusEnum } from '../../../CheckInquiryOrder/constants';
import { interval } from '../../../../utils/date';
const CheckOrderItem = props => {
const { data: item, haveFoot = true } = props;
const navigation = useNavigation();
const myStyle = useAppStyle(styles);
const renderButton = () => {
let label;
switch (item?.interiorState) {
case 1:
label = '提交审核';
break;
case 2:
case 3:
label = '审核';
break;
case 4:
label = '提交';
break;
}
return (
<>
{label ? (
<View style={myStyle['box-bottome-foot']}>
<TouchableOpacity
onPress={() => {
navigation.navigate('RequirePriceOrderDetail', {
quoteNoId: item?.quoteId,
askPurchaseId: item?.askPurchaseId,
innerStatus: item?.innerStatus,
});
}}
style={myStyle['box-bottome-content-button']}
>
<Text style={myStyle['box-bottome-content-button-text']}>
{label}
</Text>
</TouchableOpacity>
</View>
) : null}
</>
);
};
const fmtView = (fmt: string) => {
const fmtText = fmt.split('');
fmtText.splice(
2,
0,
// i18n.t('inquiryQuotation:inquiryQuotation.tian', '天'),
'天',
);
fmtText.splice(
5,
0,
// i18n.t('inquiryQuotation:inquiryQuotation.shi', '时')
'时',
);
fmtText.splice(
8,
0,
// i18n.t('inquiryQuotation:inquiryQuotation.fen', '分')
'分',
);
return fmtText.join('');
};
return (
<View style={myStyle.box}>
<View style={myStyle['box-top']}>
<Text style={myStyle['box-top-text']}>
报价单号:
{item.inquiryListNo}
</Text>
{item?.interiorState ? (
<Text style={myStyle['box-top-text']}>
{CheckOrderInnerStatusEnum.getLabelByValue(item?.interiorState)}
</Text>
) : null}
</View>
{/* -------------------------- */}
<View style={myStyle['box-bottome']}>
<View style={myStyle['box-bottome-container']}>
<View style={myStyle['box-article']}>
<View style={myStyle['box-line']}></View>
</View>
<View>
<View style={myStyle['box-bottome-title']}>
<Image style={myStyle['box-bottome-block']} source={BaoIcon} />
<Text style={myStyle['box-bottome-title-text']}>
{item?.details}
</Text>
</View>
<View style={myStyle['box-bottome-content']}>
<View style={myStyle['box-bottome-content-left']}>
<View style={myStyle['box-bottome-content-left-text']}>
<View style={{ marginRight: 4 }}>
<Text
style={myStyle['box-bottome-content-left-text-label']}
>
<Icons name="clockcircleo" size={14} color="#C0C4CC" />
{`\t${fmtView(interval(item.deliveryTime))}`}
</Text>
</View>
</View>
<View style={myStyle['box-bottome-content-left-text']}>
<View style={{ marginRight: 4 }}>
<Text
style={myStyle['box-bottome-content-left-text-label']}
>
<Icons name="user" size={14} color="#C0C4CC" />
{`\t${item?.memberName}`}
</Text>
</View>
{/* ---------------- */}
</View>
</View>
<View style={myStyle['box-bottome-content-right']}>
{/* source={{ uri: products.logo }} */}
{/* <Image
source={lingxi_icon}
style={myStyle['box-bottome-content-right-img']}
/> */}
</View>
</View>
{/* 这里~~~~~~· */}
<View style={myStyle['box-bottome-title']}>
<Image style={myStyle['box-bottome-block']} source={XunIcon} />
<Text style={myStyle['box-bottome-title-text']}>
{item?.details}
</Text>
</View>
</View>
</View>
{/* 这里~~~~~~· */}
{/* 内部状态:1.待提交审核2.待审核(一级)3.待审核(二级)4.待提交报价单5.审核通过6.审核不通过 */}
{renderButton()}
</View>
</View>
);
};
export default CheckOrderItem;
import { StyleSheet, Platform } from 'react-native';
import { ThemeStyle } from '../../../../constants/theme';
import themeLayout from '../../../../constants/theme/layout';
export default (theme: ThemeStyle) =>
StyleSheet.create({
container: {
flex: 1,
flexDirection: 'column',
},
header: {
width: '100%',
flexDirection: 'row',
backgroundColor: '#fff',
alignItems: 'center',
},
input: {
width: '100%',
flexDirection: 'row',
backgroundColor: '#fff',
alignItems: 'center',
position: 'relative',
},
IconView: {
position: 'relative',
width: '100%',
},
searchImg: {
width: 18,
height: 18,
backgroundColor: '#F6F8FA',
position: 'absolute',
left: 25,
top: 12,
zIndex: 10,
},
search: {
display: 'flex',
width: '60%',
// flexDirection:'row'
},
categoryContainer: {
paddingHorizontal: themeLayout['padding-l'],
alignItems: 'center',
flexDirection: 'row',
backgroundColor: '#fff',
},
categoryWrap: {
flex: 1,
overflow: 'hidden',
height: 36,
// justifyContent: 'center',
},
categoryBox: {
// width: '25%',
marginRight: 5,
flexDirection: 'row',
alignItems: 'center',
},
categoryItem: {
flexDirection: 'row',
paddingRight: 40,
height: '100%',
alignItems: 'center',
},
categoryText: {
// fontSize: 12,
textAlign: 'center',
color: theme.fonts.black2,
fontWeight: '400',
},
categoryText__active: {
color: '#00A98F',
fontWeight: Platform.OS === 'ios' ? '500' : '600',
},
categoryIcon__active: {
color: '#00A98F',
// fontWeight: Platform.OS === 'ios' ? '500' : '600',
},
commodityList: {
backgroundColor: '#F4F5F7',
paddingHorizontal: 8,
paddingVertical: 8,
flex: 1,
},
searchBox: {
// flex: 0.9,
width: '90%',
height: 40,
borderRadius: 18,
alignItems: 'center',
backgroundColor: '#F7F8FA',
paddingLeft: themeLayout['padding-xs'],
overflow: 'hidden',
},
box: {
flex: 1,
height: 180,
// backgroundColor: 'green',
backgroundColor: '#FFFFFF',
borderRadius: themeLayout['padding-xs'],
marginBottom: themeLayout['padding-xs'],
paddingHorizontal: themeLayout['padding-s'],
},
'box-top': {
height: 40,
justifyContent: 'space-between',
alignItems: 'center',
flexDirection: 'row',
},
'box-top-text': {
color: '#91959B',
fontWeight: '400',
},
'box-bottome': {
height: 140,
justifyContent: 'space-between',
alignItems: 'center',
// backgroundColor: 'pink',
},
'box-bottome-container': {
width: '100%',
height: 83,
// justifyContent: 'center',
alignItems: 'center',
paddingTop: 14,
flexDirection: 'row',
// backgroundColor: '#666666',
},
'box-article': {
width: 16,
height: '100%',
marginRight: 4,
alignItems: 'center',
},
'box-line': {
width: 1,
height: '100%',
backgroundColor: '#909399',
},
'box-bottome-title': {
width: '100%',
height: 20,
alignItems: 'center',
justifyContent: 'flex-start',
flexDirection: 'row',
position: 'relative',
left: -20,
},
'box-bottome-block': {
width: 20,
height: 20,
marginRight: 4,
},
'box-bottome-title-text': {
color: '#252D37',
fontWeight: Platform.OS === 'ios' ? '500' : '600',
},
'box-bottome-content': {
justifyContent: 'space-between',
alignItems: 'center',
flexDirection: 'row',
},
'box-bottome-content-left': {
justifyContent: 'center',
alignItems: 'center',
marginVertical: 13,
},
'box-bottome-content-left-text': {
width: '100%',
alignItems: 'center',
flexDirection: 'row',
// marginTop: 16,
},
'box-bottome-content-left-text-label': {
color: '#91959B',
},
'box-bottome-content-left-text-value': {
color: '#252D37',
marginLight: 4,
},
'box-bottome-content-right': {
justifyContent: 'center',
alignItems: 'center',
},
'box-bottome-content-right-img': {
height: 48,
width: 48,
},
'box-bottome-foot': {
height: 35,
width: '100%',
alignItems: 'flex-start',
justifyContent: 'flex-end',
flexDirection: 'row',
// backgroundColor: 'blue',
},
'box-bottome-content-button': {
backgroundColor: '#EBF9F6',
borderRadius: 4,
height: 24,
width: 72,
justifyContent: 'center',
alignItems: 'center',
marginRight: 8,
},
'box-bottome-content-button-text': {
color: '#00A98F',
},
});
import { getEnumManager } from '../../../utils/getEnumManager';
export const CheckOrderInnerStatusOptions = [
{ label: '全部', value: '' },
{ label: '待提交审核', value: 1 },
{ label: '待审核一级', value: 2 },
{ label: '待审核二级', value: 3 },
{ label: '待提交报价单', value: 4 },
{ label: '已提交', value: 5 },
{ label: '审核不通过一级', value: 6 },
{ label: '审核不通过二级', value: 7 },
];
export const CheckOrderInnerStatusEnum = getEnumManager(
CheckOrderInnerStatusOptions,
);
import React, { useRef, useEffect, useState } from 'react';
import {
View,
Text,
TextInput,
Image,
StatusBar,
TouchableOpacity,
ScrollView,
FlatList,
} from 'react-native';
import useAppStyle from '../../hooks/useAppStyle';
import styles from './styles';
import useLocale from '../../hooks/useLocale';
import { useNavigation } from '@react-navigation/native';
import OrderNavBar from '../../components/OrderNavBar';
import {
getTransactionMobileProductInquiryList,
GetTransactionMobileProductInquiryListResponse as DataType,
GetTransactionMobileProductInquiryListRequest as ParamType,
} from '../../services/TransactionV2Api';
import Loading from '../../components/Loading';
import { checkMore } from '../../utils/orderUtils';
import FilterBar from '../CheckRequireOrder/components/FilterBar';
import CheckOrderItem from './components/CheckOrderItem';
const CheckQuotationOrder = () => {
const myStyle = useAppStyle(styles);
const [orderList, setOrderList] = useState<DataType[]>([]);
const [searchcriteria, setSearchcriteria] = useState<ParamType>({
pageSize: 8,
});
const [innerValue, setInnerValue] = useState('');
const [loading, setLoading] = useState<boolean>(false);
const pageRef = useRef<number>(1);
const [hasMore, setHasMore] = useState<boolean>(true);
const fetchData = async () => {
setLoading(true);
const res = await getTransactionMobileProductInquiryList(searchcriteria);
setLoading(false);
setHasMore(
checkMore(
pageRef.current,
8,
(res.data.data || []).length,
res.data.totalCount,
),
);
if (pageRef.current > 1) {
setOrderList(orderList.concat(res.data.data));
return;
}
setOrderList(res.data.data);
};
const handleScroll = () => {
if (loading) return;
pageRef.current += 1;
setSearchcriteria({
...searchcriteria,
current: pageRef.current,
});
};
useEffect(() => {
fetchData();
}, [searchcriteria]);
const renderCheckOrderList = ({
item,
index,
}: {
item: DataType;
index: number;
}) => {
return <CheckOrderItem data={item} />;
};
const reArrangOrderList = (item: any, index: number) => {
// const sort = getSort(item, status);
pageRef.current = 1;
const interiorState = index ? index : undefined;
setSearchcriteria({
...searchcriteria,
interiorState,
current: pageRef.current,
});
};
const handleChange = text => {
setInnerValue(text);
};
const handleSearchSubmit = () => {
pageRef.current = 1;
setSearchcriteria({
...searchcriteria,
keyword: innerValue,
current: pageRef.current,
});
};
return (
<View style={myStyle.container}>
{/* 头区域 */}
<OrderNavBar
placeholder={'报价单/求购会员'}
onChangeText={handleChange}
onSubmitEditing={handleSearchSubmit}
// onFilterPress={handleFilterPress}
/>
<FilterBar
onChange={reArrangOrderList}
// eslint-disable-next-line @typescript-eslint/no-use-before-define
value={filterBar}
/>
{/* {renderCheckOrderList()} */}
{/* 内容区域 */}
<View style={myStyle.commodityList}>
<FlatList
data={orderList}
renderItem={renderCheckOrderList}
scrollEventThrottle={16}
horizontal={false}
showsVerticalScrollIndicator={false}
onEndReached={handleScroll}
onEndReachedThreshold={0.15}
style={{
flex: 1,
}}
ListFooterComponent={
<View>
<Loading loading={loading} noMore={!hasMore} />
</View>
}
/>
</View>
{/* </ScrollView> */}
</View>
);
};
/**
* 外部状态集合,1,"待发布",2,"待报价",3,"已结束",4,"已终止",5,"已作废" ,Integer
*/
// outerStatusList?: number[]
const filterBar = [
{
label: '全部',
key: 'all',
},
{
label: '待提交审核',
key: 'waitCheck',
},
{
label: '待审核一级',
key: 'check1',
},
{
label: '待审核二级',
key: 'check2',
},
{
label: '待提交报价单',
key: 'waiteSubmit',
},
];
export default CheckQuotationOrder;
import { StyleSheet, Platform } from 'react-native';
import { ThemeStyle } from '../../constants/theme';
import themeLayout from '../../constants/theme/layout';
export default (theme: ThemeStyle) =>
StyleSheet.create({
container: {
flex: 1,
flexDirection: 'column',
},
header: {
width: '100%',
flexDirection: 'row',
backgroundColor: '#fff',
alignItems: 'center',
paddingBottom: 6,
},
input: {
width: '100%',
flexDirection: 'row',
backgroundColor: '#fff',
alignItems: 'center',
position: 'relative',
},
IconView: {
position: 'relative',
width: '100%',
},
searchImg: {
width: 18,
height: 18,
backgroundColor: '#F6F8FA',
position: 'absolute',
left: 25,
top: 12,
zIndex: 10,
},
search: {
display: 'flex',
width: '60%',
// flexDirection:'row'
},
categoryContainer: {
paddingHorizontal: themeLayout['padding-l'],
alignItems: 'center',
flexDirection: 'row',
backgroundColor: '#fff',
},
categoryWrap: {
flex: 1,
overflow: 'hidden',
height: 36,
// justifyContent: 'center',
},
categoryBox: {
// width: '25%',
marginRight: 5,
flexDirection: 'row',
alignItems: 'center',
},
categoryItem: {
flexDirection: 'row',
paddingRight: 40,
height: '100%',
alignItems: 'center',
},
categoryText: {
// fontSize: 12,
textAlign: 'center',
color: theme.fonts.black2,
fontWeight: '400',
},
categoryText__active: {
color: '#00A98F',
fontWeight: Platform.OS === 'ios' ? '500' : '600',
},
categoryIcon__active: {
color: '#00A98F',
// fontWeight: Platform.OS === 'ios' ? '500' : '600',
},
commodityList: {
backgroundColor: '#F4F5F7',
paddingHorizontal: 8,
paddingVertical: 8,
flex: 1,
},
searchBox: {
// flex: 0.9,
width: '90%',
height: 40,
borderRadius: 18,
alignItems: 'center',
backgroundColor: '#F7F8FA',
paddingLeft: themeLayout['padding-xs'],
overflow: 'hidden',
},
box: {
flex: 1,
height: 171,
backgroundColor: '#FFFFFF',
borderRadius: themeLayout['padding-xs'],
marginBottom: themeLayout['padding-xs'],
paddingHorizontal: themeLayout['padding-s'],
},
'box-top': {
height: 40,
justifyContent: 'space-between',
alignItems: 'center',
flexDirection: 'row',
},
'box-top-text': {
color: '#91959B',
fontWeight: '400',
},
'box-bottome': {
height: 131,
justifyContent: 'space-between',
alignItems: 'center',
},
'box-bottome-container': {
width: '100%',
height: 83,
justifyContent: 'center',
// alignItems: 'center',
},
'box-bottome-title': {
width: '100%',
height: 20,
// justifyContent: 'center',
alignItems: 'flex-start',
marginTop: 5,
marginBottom: 2,
},
'box-bottome-title-text': {
color: '#252D37',
fontWeight: Platform.OS === 'ios' ? '500' : '600',
},
'box-bottome-content': {
justifyContent: 'space-between',
alignItems: 'center',
flexDirection: 'row',
},
'box-bottome-content-left': {
justifyContent: 'center',
alignItems: 'center',
marginTop: 14,
},
'box-bottome-content-left-text': {
width: '100%',
alignItems: 'center',
flexDirection: 'row',
// marginTop: 16,
},
'box-bottome-content-left-text-label': {
color: '#91959B',
},
'box-bottome-content-left-text-value': {
color: '#252D37',
marginLight: 4,
},
'box-bottome-content-right': {
justifyContent: 'center',
alignItems: 'center',
},
'box-bottome-content-right-img': {
height: 48,
width: 48,
},
'box-bottome-foot': {
height: 48,
width: '100%',
alignItems: 'center',
justifyContent: 'flex-end',
flexDirection: 'row',
},
'box-bottome-content-button': {
backgroundColor: '#EBF9F6',
borderRadius: 4,
height: 24,
width: 72,
justifyContent: 'center',
alignItems: 'center',
marginRight: 8,
},
'box-bottome-content-button-text': {
color: '#00A98F',
},
});
......@@ -153,8 +153,8 @@ export default (theme: ThemeStyle) =>
left: -20,
},
'box-bottome-block': {
width: 16,
height: 16,
width: 20,
height: 20,
marginRight: 4,
},
'box-bottome-title-text': {
......
......@@ -158,8 +158,8 @@ export default (theme: ThemeStyle) =>
left: -20,
},
'box-bottome-block': {
width: 16,
height: 16,
width: 20,
height: 20,
marginRight: 4,
},
'box-bottome-title-text': {
......
......@@ -72,7 +72,7 @@ const Home: React.FC<HomeNavigationProp> = ({ navigation, route }) => {
_column.splice(3, 1, {
label: '审核报价单',
icon: verify,
route: 'CheckRequireOrder',
route: 'CheckQuotationOrder',
});
_column.splice(5, 0, {
label: '审核求购报价单',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment