You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

294 lines
8.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { StandardProps } from '@tarojs/components/types/common';
import { View, Image, Text } from '@tarojs/components';
import './charging.scss';
// import chargingImage from '@/assets/images/charging/charging.gif'
import { AtButton } from 'taro-ui';
import { RzIcon } from '@/components/RzIcon/RzIcon';
import {
useEffect,
useRouter,
useState,
useCallback,
useDidShow,
} from '@tarojs/taro';
import {
queryEquipmentStatus,
QueryEquipmentStatusRes,
stopCharge,
getDefaultCar,
isThirdPartyStation,
} from '@/services/charging';
import { showModal, showModalOnlyWithConfirmBtn } from '@/utils/wechat-ui';
import classNames from 'classnames';
import {
contact,
getUserInfoFromStorage,
scanCodeAndNavToConfirmFee,
} from '@/utils/utils';
import { events } from '@/utils/event-bus';
import imgCharging from '@/assets/images/charging/img_charging.gif';
type ChargingProps = {} & StandardProps;
export const Charging: Taro.FC<ChargingProps> = () => {
const router = useRouter();
const [defaultCar, setDefaultCar] = useState('');
const [userType, setUserType] = useState('1');
const [selectedCar, setSelectedCar] = useState('');
const [getTicketMsg, setGetTicketMsg] = useState('');
const [realTimeInfo, setRealTimeInfo] = useState<QueryEquipmentStatusRes>({
chargeCurSoc: 0,
chargeDuration: 0,
chargeDegree: 0,
chargeBalance: 0,
chargePower: 0,
chargeCurr: 0,
chargeVolt: 0,
equipmentSn: '--',
connectorSn: '--',
connectorNo: 1,
equipmentName: '--',
equipmentNo: 1,
equipmentType: 1,
chargeOrderNo: '--',
orderState: 2,
continueChargeFlag: false,
equipmentId: 1,
isBarrierFlag: 0,
stationName: '',
});
const getRealtimeInfo = useCallback(async () => {
const res = await queryEquipmentStatus({
orderNo: router.params.orderNo,
connectorSn: router.params.connectorSn,
});
if (res) {
setRealTimeInfo(res);
if (res.orderState !== 2) {
Taro.redirectTo({
url: `/pages/order-detail/order-detail?isFromCharging=${true}&orderNo=${router.params.orderNo
}`,
});
}
}
}, [router]);
events.on('onSelectedCar', (plateNo) => {
setSelectedCar(plateNo);
});
//TODO: 需要判断这笔订单是否领取领取停车券的接口
//TODO: selectedCar 变化就去调用领券方法
useEffect(() => {
console.log('selectedCar', selectedCar);
}, [selectedCar]);
useEffect(() => {
getRealtimeInfo();
const id = setInterval(async () => {
getRealtimeInfo();
}, 5000);
return () => clearInterval(id);
}, [getRealtimeInfo]);
useDidShow(() => {
getUserInfoFromStorage().then((res) => {
setUserType(res.userType);
if (res.userType === '1' && realTimeInfo.isBarrierFlag === 1) {
getDefaultCar().then((res) => {
if (res) {
setDefaultCar(res.plateNo);
}
});
}
});
});
const handleStop = async () => {
const res = await showModal(
'提示',
'确定要停止充电吗?请停止充电后将充电枪放回原位。'
);
if (res.confirm) {
const { equipmentSn, connectorNo, equipmentId } = realTimeInfo;
const stopRes = await stopCharge({
equipmentSn,
connectorNo,
equipmentId,
orderNo: router.params.orderNo,
});
if (stopRes) {
//是否为合作道闸车场,如果是有免费停车时长,跳转到选车界面
const freeTimeRes = await isThirdPartyStation({
order_no: router.params.orderNo,
});
if (freeTimeRes.success) {
const freeRes = await showModalOnlyWithConfirmBtn(
'提示',
'请输入车辆信息领取免费停车时长!'
);
if (freeRes.confirm) {
Taro.redirectTo({
url: `/pages/select-free-plate/select-free-plate?order_no=${router.params.orderNo}`,
});
}
} else {
Taro.redirectTo({
url: `/pages/order-detail/order-detail?isFromCharging=${true}&orderNo=${router.params.orderNo}`,
});
}
}
}
};
const handleContinueCharge = () => {
scanCodeAndNavToConfirmFee();
};
const handleNavToMyCar = () => {
Taro.navigateTo({ url: `/pages/my-car/my-car` });
};
const handleNavToMyCarToSelectCar = () => {
Taro.navigateTo({ url: `/pages/my-car/my-car?isSelectCar=${true}` });
};
return (
<View className="charging">
{getTicketMsg && (
<View className="charging__tip">
<RzIcon value="warning" color="#FF6584" size="17"></RzIcon>
{userType === '1' ? (
<Text className="charging__tip-text">
{defaultCar + getTicketMsg}
</Text>
) : (
<Text className="charging__tip-text">
{selectedCar + getTicketMsg}
</Text>
)}
</View>
)}
<View className="charging__title1">
<Text className="charging__title-text">
{realTimeInfo.stationName}
</Text>
</View>
<View className="charging__title">
<Text className="charging__title-text">
{realTimeInfo.equipmentNo} {realTimeInfo.connectorNo}
</Text>
<Text className="charging__title-text">
{realTimeInfo.equipmentSn}
</Text>
</View>
<View className="charging__title2">
<Text className="charging__title-text">
{realTimeInfo.chargeOrderNo}
</Text>
</View>
{realTimeInfo.equipmentType === 1 ? (
<View className="charging__soc">
<Text className="charging__soc-text">
{realTimeInfo.chargeCurSoc}
</Text>
<Text className="charging__unit">%</Text>
</View>
) : (
<View className="charging__slow">
<Text className="charging__slow-text"></Text>
</View>
)}
<Image
className="charging__animation"
src={imgCharging}
mode="widthFix"></Image>
{realTimeInfo.isBarrierFlag === 1 &&
(userType === '1' ? (
<View>
<View className="charging__plate" onClick={handleNavToMyCar}>
<Text className="charging__plate-text">
{defaultCar ? defaultCar : '设置车牌'}
</Text>
</View>
{/* <View className="charging__plate">
<Text className="charging__plate-tip">
{defaultCar
? '充电结束将自动获得停车券'
: '设置车牌,充电结束将自动获得停车券'}
</Text>
</View> */}
</View>
) : (
<View>
<View
className="charging__plate"
onClick={handleNavToMyCarToSelectCar}>
<Text className="charging__plate-text">
{selectedCar ? selectedCar : '选择车辆领取停车券'}
</Text>
</View>
{/* <View className="charging__plate">
<Text className="charging__plate-tip">
{selectedCar
? '充电结束将自动获得停车券'
: '选择车牌,充电结束将自动获得停车券'}
</Text>
</View> */}
</View>
))}
<View className="realtime-info">
<View className="grid">
{[
{ name: '时长/分', value: realTimeInfo.chargeDuration },
{ name: '度数/度', value: realTimeInfo.chargeDegree },
{ name: '费用/元', value: realTimeInfo.chargeBalance },
{ name: '功率/千瓦', value: realTimeInfo.chargePower },
{ name: '电流/安', value: realTimeInfo.chargeCurr },
{ name: '电压/伏', value: realTimeInfo.chargeVolt },
].map((item) => {
return (
<View className="grid__item" key={item.name}>
<Text className="grid__item-value">{item.value}</Text>
<Text className="grid__item-unit">{item.name}</Text>
</View>
);
})}
</View>
<View className="feedback" onClick={() => contact()}>
</View>
<View className="btn-box">
{realTimeInfo.continueChargeFlag && (
<AtButton
className="btn"
type="primary"
circle
onClick={handleContinueCharge}>
</AtButton>
)}
<AtButton
className={classNames(
{ btn: realTimeInfo.continueChargeFlag },
'btn--wide'
)}
type={realTimeInfo.continueChargeFlag ? 'secondary' : 'primary'}
circle
onClick={handleStop}>
</AtButton>
</View>
</View>
</View>
);
};
Charging.config = {
navigationBarTitleText: '充电中',
};