@miot-rn/car-component 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/i18n/ar.json +33 -0
- package/dist/assets/i18n/bo.json +33 -0
- package/dist/assets/i18n/cs.json +33 -0
- package/dist/assets/i18n/de.json +33 -0
- package/dist/assets/i18n/el.json +33 -0
- package/dist/assets/i18n/en.json +33 -0
- package/dist/assets/i18n/es.json +33 -0
- package/dist/assets/i18n/es_us.json +33 -0
- package/dist/assets/i18n/fi.json +33 -0
- package/dist/assets/i18n/fr.json +33 -0
- package/dist/assets/i18n/he.json +33 -0
- package/dist/assets/i18n/hu.json +33 -0
- package/dist/assets/i18n/id.json +33 -0
- package/dist/assets/i18n/it.json +33 -0
- package/dist/assets/i18n/ja.json +33 -0
- package/dist/assets/i18n/ko.json +33 -0
- package/dist/assets/i18n/nb.json +33 -0
- package/dist/assets/i18n/nl.json +33 -0
- package/dist/assets/i18n/pl.json +33 -0
- package/dist/assets/i18n/pt.json +33 -0
- package/dist/assets/i18n/pt_pt.json +33 -0
- package/dist/assets/i18n/ro.json +33 -0
- package/dist/assets/i18n/ru.json +33 -0
- package/dist/assets/i18n/sk.json +33 -0
- package/dist/assets/i18n/sv.json +33 -0
- package/dist/assets/i18n/th.json +33 -0
- package/dist/assets/i18n/tr.json +33 -0
- package/dist/assets/i18n/uk.json +33 -0
- package/dist/assets/i18n/vi.json +33 -0
- package/dist/assets/i18n/zh.json +33 -0
- package/dist/assets/i18n/zh_hk.json +33 -0
- package/dist/assets/i18n/zh_tw.json +33 -0
- package/dist/components/carInfoHeader/dualRangeIndicator.js +12 -7
- package/dist/components/carInfoHeader/index.d.ts +1 -0
- package/dist/components/carInfoHeader/index.js +1 -0
- package/dist/components/carInfoHeader/singleRangeIndicator.d.ts +2 -1
- package/dist/components/carInfoHeader/singleRangeIndicator.js +2 -2
- package/dist/components/otherSettingCard/index.js +59 -3
- package/dist/config/seatI18nKeys.d.ts +3 -0
- package/dist/config/seatI18nKeys.js +4 -1
- package/dist/hooks/useDualRangeData.d.ts +3 -1
- package/dist/hooks/useDualRangeData.js +21 -2
- package/dist/hooks/useSeatControlData.d.ts +9 -0
- package/dist/hooks/useSeatControlData.js +30 -3
- package/dist/hooks/useSingleRangeData.d.ts +1 -0
- package/dist/hooks/useSingleRangeData.js +11 -4
- package/dist/hooks/useSteeringWheelData.d.ts +30 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/modules/airconditionModule/index.js +62 -4
- package/dist/modules/carInfoModule/index.d.ts +3 -1
- package/dist/modules/carInfoModule/index.js +5 -3
- package/dist/modules/seatModule/index.js +153 -2
- package/dist/modules/steeringWheelModule/index.js +34 -2
- package/dist/resources/i18n.d.ts +100 -772
- package/dist/resources/i18n.js +39 -55
- package/dist/spec/index.d.ts +11 -273
- package/dist/spec/index.js +64 -469
- package/dist/track/config.d.ts +33 -0
- package/dist/track/config.js +52 -0
- package/dist/track/index.d.ts +1 -0
- package/dist/track/index.js +7 -0
- package/package.json +4 -3
- package/dist/assets/i18n/ar.d.ts +0 -55
- package/dist/assets/i18n/ar.js +0 -55
- package/dist/assets/i18n/bo.d.ts +0 -55
- package/dist/assets/i18n/bo.js +0 -55
- package/dist/assets/i18n/cs.d.ts +0 -55
- package/dist/assets/i18n/cs.js +0 -55
- package/dist/assets/i18n/de.d.ts +0 -55
- package/dist/assets/i18n/de.js +0 -55
- package/dist/assets/i18n/el.d.ts +0 -55
- package/dist/assets/i18n/el.js +0 -55
- package/dist/assets/i18n/en.d.ts +0 -55
- package/dist/assets/i18n/en.js +0 -55
- package/dist/assets/i18n/es.d.ts +0 -55
- package/dist/assets/i18n/es.js +0 -55
- package/dist/assets/i18n/es_us.d.ts +0 -55
- package/dist/assets/i18n/es_us.js +0 -55
- package/dist/assets/i18n/fi.d.ts +0 -55
- package/dist/assets/i18n/fi.js +0 -55
- package/dist/assets/i18n/fr.d.ts +0 -55
- package/dist/assets/i18n/fr.js +0 -55
- package/dist/assets/i18n/he.d.ts +0 -55
- package/dist/assets/i18n/he.js +0 -55
- package/dist/assets/i18n/hu.d.ts +0 -55
- package/dist/assets/i18n/hu.js +0 -55
- package/dist/assets/i18n/id.d.ts +0 -55
- package/dist/assets/i18n/id.js +0 -55
- package/dist/assets/i18n/it.d.ts +0 -55
- package/dist/assets/i18n/it.js +0 -55
- package/dist/assets/i18n/ja.d.ts +0 -55
- package/dist/assets/i18n/ja.js +0 -55
- package/dist/assets/i18n/ko.d.ts +0 -55
- package/dist/assets/i18n/ko.js +0 -55
- package/dist/assets/i18n/nb.d.ts +0 -55
- package/dist/assets/i18n/nb.js +0 -55
- package/dist/assets/i18n/nl.d.ts +0 -55
- package/dist/assets/i18n/nl.js +0 -55
- package/dist/assets/i18n/pl.d.ts +0 -55
- package/dist/assets/i18n/pl.js +0 -55
- package/dist/assets/i18n/pt.d.ts +0 -55
- package/dist/assets/i18n/pt.js +0 -55
- package/dist/assets/i18n/pt_pt.d.ts +0 -55
- package/dist/assets/i18n/pt_pt.js +0 -55
- package/dist/assets/i18n/ro.d.ts +0 -55
- package/dist/assets/i18n/ro.js +0 -55
- package/dist/assets/i18n/ru.d.ts +0 -55
- package/dist/assets/i18n/ru.js +0 -55
- package/dist/assets/i18n/sk.d.ts +0 -55
- package/dist/assets/i18n/sk.js +0 -55
- package/dist/assets/i18n/sv.d.ts +0 -55
- package/dist/assets/i18n/sv.js +0 -55
- package/dist/assets/i18n/th.d.ts +0 -55
- package/dist/assets/i18n/th.js +0 -55
- package/dist/assets/i18n/tr.d.ts +0 -55
- package/dist/assets/i18n/tr.js +0 -55
- package/dist/assets/i18n/uk.d.ts +0 -55
- package/dist/assets/i18n/uk.js +0 -55
- package/dist/assets/i18n/vi.d.ts +0 -55
- package/dist/assets/i18n/vi.js +0 -55
- package/dist/assets/i18n/zh.d.ts +0 -55
- package/dist/assets/i18n/zh.js +0 -55
- package/dist/assets/i18n/zh_hk.d.ts +0 -55
- package/dist/assets/i18n/zh_hk.js +0 -55
- package/dist/assets/i18n/zh_tw.d.ts +0 -55
- package/dist/assets/i18n/zh_tw.js +0 -55
|
@@ -1,10 +1,45 @@
|
|
|
1
|
-
import React, { useContext, useCallback, memo } from 'react';
|
|
1
|
+
import React, { useContext, useCallback, useEffect, memo } from 'react';
|
|
2
2
|
import { LargeListEntrance, ConfigContext } from 'miot/ui/hyperOSUI';
|
|
3
3
|
import { Host, Device } from 'miot';
|
|
4
|
+
import SmartScene from 'miot/ui/smartScene';
|
|
4
5
|
import { CarInUsed, DeviceManage } from "../../icons";
|
|
5
6
|
import { CardContainer } from "../cardContainer";
|
|
6
7
|
import { GroupContainer } from "../groupContainer";
|
|
7
8
|
import { useFeatureEnabled } from "../../utils/featureGate";
|
|
9
|
+
import { useTrack, getCommonParams } from '@miot-rn/common-component/dist/service/track';
|
|
10
|
+
import { CAR_ITEM, CAR_CARD_ID, CAR_PAGE_REF, CAR_SUB_REF } from "../../track/config";
|
|
11
|
+
// 车端自动化模板类型固定为 'car'(见《2025版标准化模板接口文档》device_types)
|
|
12
|
+
const SMART_SCENE_DEVICE_TYPE = 'car';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 智能场景的埋点参数。
|
|
16
|
+
*
|
|
17
|
+
* SmartScene 自带上报通道(IftttTemplateUtils.report → reportEventRefChannel),不经过我们的
|
|
18
|
+
* reportTrack,因此公参与点位标识都得由调用方拼进 trackParams。三件事必须注意:
|
|
19
|
+
*
|
|
20
|
+
* 1. `trackParams` 是**整体替换**而非合并(SmartScene.js:31-33 是默认参数),所以 card_id /
|
|
21
|
+
* item_type / item_name 必须自己带回,否则点位标识直接丢。
|
|
22
|
+
* 2. SDK 两个平台分支都把 plugin_form 硬编码成 0(utils.js:150,165),而本插件其余事件用 '1'。
|
|
23
|
+
* 两处分支都是 `...rest` 最后展开,故公参里的 plugin_form 能覆盖掉,双通道取值得以一致。
|
|
24
|
+
* 3. iOS 分支只带 did/device_model/plugin_form/user_type/belong_tag,不带 package_* / plugin_*
|
|
25
|
+
* (utils.js:162-169),公参在这里补齐后两端载荷才对齐。
|
|
26
|
+
*
|
|
27
|
+
* ref 用字面量而非从 TrackService 的当前 ref 派生:trackParams 在 render 期构造,而父页
|
|
28
|
+
* usePageTrack 的 setPageRef 在 useLayoutEffect 里跑,子组件 effect 又早于父组件 effect,
|
|
29
|
+
* 所以本组件首次 render 时当前 ref 还是空串;加上本组件被 memo 包住、SmartScene 异步取到权限后
|
|
30
|
+
* 触发 expose 时不会重渲染,那份空 ref 会一直留着。
|
|
31
|
+
*/
|
|
32
|
+
function getSmartSceneTrackParams() {
|
|
33
|
+
return {
|
|
34
|
+
// 公参放最前:点位标识不会被将来新增的公参字段覆盖
|
|
35
|
+
...getCommonParams(),
|
|
36
|
+
card_id: CAR_CARD_ID.SMART_SCENE,
|
|
37
|
+
item_type: 'button',
|
|
38
|
+
item_name: CAR_ITEM.AUTOMATION,
|
|
39
|
+
ref: CAR_PAGE_REF.HOME,
|
|
40
|
+
sub_ref: CAR_SUB_REF.HOME
|
|
41
|
+
};
|
|
42
|
+
}
|
|
8
43
|
export const OtherSettingCard = /*#__PURE__*/memo(props => {
|
|
9
44
|
const {
|
|
10
45
|
usedInCarTip,
|
|
@@ -14,14 +49,32 @@ export const OtherSettingCard = /*#__PURE__*/memo(props => {
|
|
|
14
49
|
const {
|
|
15
50
|
colorToken
|
|
16
51
|
} = useContext(ConfigContext);
|
|
52
|
+
const {
|
|
53
|
+
click,
|
|
54
|
+
expose
|
|
55
|
+
} = useTrack();
|
|
17
56
|
const toUsedInCar = useCallback(() => {
|
|
57
|
+
click(CAR_ITEM.CAR_COMMON, {
|
|
58
|
+
item_type: 'item'
|
|
59
|
+
});
|
|
18
60
|
Host.ui.openCarMiHomeManager(Device.deviceID);
|
|
19
61
|
}, []);
|
|
20
62
|
const toDeviceManage = useCallback(() => {
|
|
63
|
+
click(CAR_ITEM.DEVICE_ROAMING, {
|
|
64
|
+
item_type: 'item'
|
|
65
|
+
});
|
|
21
66
|
Host.ui.openDeviceRoamingManager(Device.deviceID);
|
|
22
67
|
}, []);
|
|
23
68
|
const isMiCar = !!Device.model.startsWith('micar.car.');
|
|
24
|
-
const
|
|
69
|
+
const deviceRoamingEnabled = useFeatureEnabled('deviceRoaming');
|
|
70
|
+
const showDeviceRoaming = isMiCar && deviceRoamingEnabled;
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
expose(CAR_ITEM.CAR_COMMON, 'item');
|
|
73
|
+
if (showDeviceRoaming) {
|
|
74
|
+
expose(CAR_ITEM.DEVICE_ROAMING, 'item');
|
|
75
|
+
}
|
|
76
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
77
|
+
}, [showDeviceRoaming]);
|
|
25
78
|
return /*#__PURE__*/React.createElement(GroupContainer, {
|
|
26
79
|
title: othersTip
|
|
27
80
|
}, /*#__PURE__*/React.createElement(CardContainer, null, /*#__PURE__*/React.createElement(LargeListEntrance, {
|
|
@@ -36,5 +89,8 @@ export const OtherSettingCard = /*#__PURE__*/memo(props => {
|
|
|
36
89
|
}),
|
|
37
90
|
title: deviceManageTip,
|
|
38
91
|
onPress: toDeviceManage
|
|
39
|
-
}))
|
|
92
|
+
})), /*#__PURE__*/React.createElement(SmartScene, {
|
|
93
|
+
device_type: SMART_SCENE_DEVICE_TYPE,
|
|
94
|
+
trackParams: getSmartSceneTrackParams()
|
|
95
|
+
}));
|
|
40
96
|
});
|
|
@@ -5,5 +5,8 @@ export declare const SeatI18nKeys: {
|
|
|
5
5
|
readonly RearLeft: "car_seat_rear_left";
|
|
6
6
|
readonly RearCenter: "car_seat_rear_center";
|
|
7
7
|
readonly RearRight: "car_seat_rear_right";
|
|
8
|
+
readonly ThirdLeft: "car_seat_third_left";
|
|
9
|
+
readonly ThirdCenter: "car_seat_third_center";
|
|
10
|
+
readonly ThirdRight: "car_seat_third_right";
|
|
8
11
|
};
|
|
9
12
|
export type SeatI18nKey = (typeof SeatI18nKeys)[keyof typeof SeatI18nKeys];
|
|
@@ -5,5 +5,8 @@ export const SeatI18nKeys = {
|
|
|
5
5
|
FrontRight: 'car_seat_front_right',
|
|
6
6
|
RearLeft: 'car_seat_rear_left',
|
|
7
7
|
RearCenter: 'car_seat_rear_center',
|
|
8
|
-
RearRight: 'car_seat_rear_right'
|
|
8
|
+
RearRight: 'car_seat_rear_right',
|
|
9
|
+
ThirdLeft: 'car_seat_third_left',
|
|
10
|
+
ThirdCenter: 'car_seat_third_center',
|
|
11
|
+
ThirdRight: 'car_seat_third_right'
|
|
9
12
|
};
|
|
@@ -14,5 +14,7 @@ export interface UseDualRangeDataProps {
|
|
|
14
14
|
specPowerRangePropertiesCltcFuelEndurance: Spec;
|
|
15
15
|
specPowerRangePropertiesWltcPureEleCruisingEndurance: Spec;
|
|
16
16
|
specPowerRangePropertiesWltcFuelEndurance: Spec;
|
|
17
|
+
specPowerRangePropertiesRemoteEvRange?: Spec;
|
|
18
|
+
specPowerRangePropertiesRemoteFuelRange?: Spec;
|
|
17
19
|
}
|
|
18
|
-
export declare const useDualRangeData: ({ specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange, specPowerRangePropertiesCltcFuelEndurance, specPowerRangePropertiesWltcPureEleCruisingEndurance, specPowerRangePropertiesWltcFuelEndurance, }: UseDualRangeDataProps) => DualRangeDisplayData;
|
|
20
|
+
export declare const useDualRangeData: ({ specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange, specPowerRangePropertiesCltcFuelEndurance, specPowerRangePropertiesWltcPureEleCruisingEndurance, specPowerRangePropertiesWltcFuelEndurance, specPowerRangePropertiesRemoteEvRange, specPowerRangePropertiesRemoteFuelRange, }: UseDualRangeDataProps) => DualRangeDisplayData;
|
|
@@ -15,7 +15,9 @@ export const useDualRangeData = ({
|
|
|
15
15
|
specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange,
|
|
16
16
|
specPowerRangePropertiesCltcFuelEndurance,
|
|
17
17
|
specPowerRangePropertiesWltcPureEleCruisingEndurance,
|
|
18
|
-
specPowerRangePropertiesWltcFuelEndurance
|
|
18
|
+
specPowerRangePropertiesWltcFuelEndurance,
|
|
19
|
+
specPowerRangePropertiesRemoteEvRange,
|
|
20
|
+
specPowerRangePropertiesRemoteFuelRange
|
|
19
21
|
}) => {
|
|
20
22
|
const {
|
|
21
23
|
colorToken
|
|
@@ -25,6 +27,8 @@ export const useDualRangeData = ({
|
|
|
25
27
|
const cltcFuelEnduranceValue = useSpecState(specPowerRangePropertiesCltcFuelEndurance);
|
|
26
28
|
const wltcPureEleCruisingEnduranceValue = useSpecState(specPowerRangePropertiesWltcPureEleCruisingEndurance);
|
|
27
29
|
const wltcFuelEnduranceValue = useSpecState(specPowerRangePropertiesWltcFuelEndurance);
|
|
30
|
+
const remoteEvRangeValue = useSpecState(specPowerRangePropertiesRemoteEvRange);
|
|
31
|
+
const remoteFuelRangeValue = useSpecState(specPowerRangePropertiesRemoteFuelRange);
|
|
28
32
|
const distanceUnit = useMemo(() => {
|
|
29
33
|
const text = getLocalI18n('car_distance_value_km');
|
|
30
34
|
if (typeof text === 'string') {
|
|
@@ -43,6 +47,8 @@ export const useDualRangeData = ({
|
|
|
43
47
|
const cltcFuelEndurance = toNumberOrNull(cltcFuelEnduranceValue);
|
|
44
48
|
const wltcPureEleCruisingEndurance = toNumberOrNull(wltcPureEleCruisingEnduranceValue);
|
|
45
49
|
const wltcFuelEndurance = toNumberOrNull(wltcFuelEnduranceValue);
|
|
50
|
+
const remoteEvRange = toNumberOrNull(remoteEvRangeValue);
|
|
51
|
+
const remoteFuelRange = toNumberOrNull(remoteFuelRangeValue);
|
|
46
52
|
if (isNil(dcdType)) {
|
|
47
53
|
return {
|
|
48
54
|
currentElectricRange: null,
|
|
@@ -55,6 +61,19 @@ export const useDualRangeData = ({
|
|
|
55
61
|
};
|
|
56
62
|
}
|
|
57
63
|
|
|
64
|
+
// 0. RealRange (动态续航) - 混动: 剩余电=remote-ev, 剩余油=remote-fuel
|
|
65
|
+
if (getValueBySpecDescription(specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, 'RealRange') === dcdType) {
|
|
66
|
+
return {
|
|
67
|
+
currentElectricRange: remoteEvRange,
|
|
68
|
+
electricRange: specPowerRangePropertiesRemoteEvRange?.prop?.['value-range']?.[1] || 100,
|
|
69
|
+
unit: distanceUnit,
|
|
70
|
+
currentFuelRange: remoteFuelRange,
|
|
71
|
+
fuelRange: specPowerRangePropertiesRemoteFuelRange?.prop?.['value-range']?.[1] || 100,
|
|
72
|
+
electricColor,
|
|
73
|
+
fuelColor
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
58
77
|
// 1. WLTC Range (Extended Range)
|
|
59
78
|
if (getValueBySpecDescription(specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, 'WLTCRange') === dcdType) {
|
|
60
79
|
return {
|
|
@@ -78,6 +97,6 @@ export const useDualRangeData = ({
|
|
|
78
97
|
electricColor,
|
|
79
98
|
fuelColor
|
|
80
99
|
};
|
|
81
|
-
}, [dcdRangeSOCTypeDisplayValue, cltcEstimatedExtendEangeValue, cltcFuelEnduranceValue, wltcPureEleCruisingEnduranceValue, wltcFuelEnduranceValue, specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange, specPowerRangePropertiesCltcFuelEndurance, specPowerRangePropertiesWltcPureEleCruisingEndurance, specPowerRangePropertiesWltcFuelEndurance, distanceUnit, colorToken]);
|
|
100
|
+
}, [dcdRangeSOCTypeDisplayValue, cltcEstimatedExtendEangeValue, cltcFuelEnduranceValue, wltcPureEleCruisingEnduranceValue, wltcFuelEnduranceValue, remoteEvRangeValue, remoteFuelRangeValue, specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange, specPowerRangePropertiesCltcFuelEndurance, specPowerRangePropertiesWltcPureEleCruisingEndurance, specPowerRangePropertiesWltcFuelEndurance, specPowerRangePropertiesRemoteEvRange, specPowerRangePropertiesRemoteFuelRange, distanceUnit, colorToken]);
|
|
82
101
|
return useMemo(() => getDualRangeDisplayData(), [getDualRangeDisplayData]);
|
|
83
102
|
};
|
|
@@ -11,6 +11,9 @@ export interface SeatSpecs {
|
|
|
11
11
|
specSeatRow2MiddlePropertiesSeatVentilation?: Spec;
|
|
12
12
|
specSeatRow2RightPropertiesHeating?: Spec;
|
|
13
13
|
specSeatRow2RightPropertiesSeatVentilation?: Spec;
|
|
14
|
+
specSeatRow3LeftPropertiesHeating?: Spec;
|
|
15
|
+
specSeatRow3MiddlePropertiesHeating?: Spec;
|
|
16
|
+
specSeatRow3RightPropertiesHeating?: Spec;
|
|
14
17
|
}
|
|
15
18
|
export interface SeatControlDataProps {
|
|
16
19
|
specs: SeatSpecs;
|
|
@@ -73,6 +76,9 @@ export declare const SEAT_TITLES: {
|
|
|
73
76
|
rearLeft: string | Record<string, string>;
|
|
74
77
|
rearCenter: string | Record<string, string>;
|
|
75
78
|
rearRight: string | Record<string, string>;
|
|
79
|
+
thirdLeft: string | Record<string, string>;
|
|
80
|
+
thirdCenter: string | Record<string, string>;
|
|
81
|
+
thirdRight: string | Record<string, string>;
|
|
76
82
|
};
|
|
77
83
|
export declare const useSeatControlData: ({ specs, disabled, onSeatChange }: SeatControlDataProps) => {
|
|
78
84
|
seatRows: {
|
|
@@ -88,6 +94,9 @@ export declare const useSeatControlData: ({ specs, disabled, onSeatChange }: Sea
|
|
|
88
94
|
rearLeft: string | Record<string, string>;
|
|
89
95
|
rearCenter: string | Record<string, string>;
|
|
90
96
|
rearRight: string | Record<string, string>;
|
|
97
|
+
thirdLeft: string | Record<string, string>;
|
|
98
|
+
thirdCenter: string | Record<string, string>;
|
|
99
|
+
thirdRight: string | Record<string, string>;
|
|
91
100
|
};
|
|
92
101
|
handleSeatChange: ({ propType, spec, previousValue, currentValue }: OnButtonPressParams) => void;
|
|
93
102
|
hasSeats: boolean;
|
|
@@ -87,7 +87,10 @@ export const SEAT_TITLES = {
|
|
|
87
87
|
frontRight: typeof getLocalI18n(SeatI18nKeys.FrontRight) === 'string' ? getLocalI18n(SeatI18nKeys.FrontRight) : '',
|
|
88
88
|
rearLeft: typeof getLocalI18n(SeatI18nKeys.RearLeft) === 'string' ? getLocalI18n(SeatI18nKeys.RearLeft) : '',
|
|
89
89
|
rearCenter: typeof getLocalI18n(SeatI18nKeys.RearCenter) === 'string' ? getLocalI18n(SeatI18nKeys.RearCenter) : '',
|
|
90
|
-
rearRight: typeof getLocalI18n(SeatI18nKeys.RearRight) === 'string' ? getLocalI18n(SeatI18nKeys.RearRight) : ''
|
|
90
|
+
rearRight: typeof getLocalI18n(SeatI18nKeys.RearRight) === 'string' ? getLocalI18n(SeatI18nKeys.RearRight) : '',
|
|
91
|
+
thirdLeft: typeof getLocalI18n(SeatI18nKeys.ThirdLeft) === 'string' ? getLocalI18n(SeatI18nKeys.ThirdLeft) : '',
|
|
92
|
+
thirdCenter: typeof getLocalI18n(SeatI18nKeys.ThirdCenter) === 'string' ? getLocalI18n(SeatI18nKeys.ThirdCenter) : '',
|
|
93
|
+
thirdRight: typeof getLocalI18n(SeatI18nKeys.ThirdRight) === 'string' ? getLocalI18n(SeatI18nKeys.ThirdRight) : ''
|
|
91
94
|
};
|
|
92
95
|
export const useSeatControlData = ({
|
|
93
96
|
specs,
|
|
@@ -107,7 +110,10 @@ export const useSeatControlData = ({
|
|
|
107
110
|
specSeatRow2MiddlePropertiesHeating,
|
|
108
111
|
specSeatRow2MiddlePropertiesSeatVentilation,
|
|
109
112
|
specSeatRow2RightPropertiesHeating,
|
|
110
|
-
specSeatRow2RightPropertiesSeatVentilation
|
|
113
|
+
specSeatRow2RightPropertiesSeatVentilation,
|
|
114
|
+
specSeatRow3LeftPropertiesHeating,
|
|
115
|
+
specSeatRow3MiddlePropertiesHeating,
|
|
116
|
+
specSeatRow3RightPropertiesHeating
|
|
111
117
|
} = specs;
|
|
112
118
|
|
|
113
119
|
// 实时值
|
|
@@ -121,6 +127,9 @@ export const useSeatControlData = ({
|
|
|
121
127
|
const seatRow2MiddleVentilationValue = useSpecState(specSeatRow2MiddlePropertiesSeatVentilation);
|
|
122
128
|
const seatRow2RightHeatingValue = useSpecState(specSeatRow2RightPropertiesHeating);
|
|
123
129
|
const seatRow2RightVentilationValue = useSpecState(specSeatRow2RightPropertiesSeatVentilation);
|
|
130
|
+
const seatRow3LeftHeatingValue = useSpecState(specSeatRow3LeftPropertiesHeating);
|
|
131
|
+
const seatRow3MiddleHeatingValue = useSpecState(specSeatRow3MiddlePropertiesHeating);
|
|
132
|
+
const seatRow3RightHeatingValue = useSpecState(specSeatRow3RightPropertiesHeating);
|
|
124
133
|
const levelIcons = useMemo(() => LEVEL_ICONS(colorToken), [colorToken]);
|
|
125
134
|
const typeConfig = useMemo(() => TYPE_CONFIG(colorToken, levelIcons), [colorToken, levelIcons]);
|
|
126
135
|
|
|
@@ -204,6 +213,24 @@ export const useSeatControlData = ({
|
|
|
204
213
|
heatingValue: Number(seatRow2RightHeatingValue ?? 0),
|
|
205
214
|
ventilationValue: Number(seatRow2RightVentilationValue ?? 0),
|
|
206
215
|
title: SEAT_TITLES.rearRight
|
|
216
|
+
}], [{
|
|
217
|
+
heating: specSeatRow3LeftPropertiesHeating,
|
|
218
|
+
ventilation: undefined,
|
|
219
|
+
heatingValue: Number(seatRow3LeftHeatingValue ?? 0),
|
|
220
|
+
ventilationValue: 0,
|
|
221
|
+
title: SEAT_TITLES.thirdLeft
|
|
222
|
+
}, {
|
|
223
|
+
heating: specSeatRow3MiddlePropertiesHeating,
|
|
224
|
+
ventilation: undefined,
|
|
225
|
+
heatingValue: Number(seatRow3MiddleHeatingValue ?? 0),
|
|
226
|
+
ventilationValue: 0,
|
|
227
|
+
title: SEAT_TITLES.thirdCenter
|
|
228
|
+
}, {
|
|
229
|
+
heating: specSeatRow3RightPropertiesHeating,
|
|
230
|
+
ventilation: undefined,
|
|
231
|
+
heatingValue: Number(seatRow3RightHeatingValue ?? 0),
|
|
232
|
+
ventilationValue: 0,
|
|
233
|
+
title: SEAT_TITLES.thirdRight
|
|
207
234
|
}]];
|
|
208
235
|
return rows.map(row => row.map(({
|
|
209
236
|
heating,
|
|
@@ -221,7 +248,7 @@ export const useSeatControlData = ({
|
|
|
221
248
|
buttons: buildButtons(heating, ventilation, heatingValue, ventilationValue, disabled)
|
|
222
249
|
};
|
|
223
250
|
}).filter(seat => seat !== null)).filter(rowSeats => rowSeats.length > 0);
|
|
224
|
-
}, [buildButtons, specSeatRow1LeftPropertiesHeating, specSeatRow1LeftPropertiesSeatVentilation, specSeatRow1RightPropertiesHeating, specSeatRow1RightPropertiesSeatVentilation, specSeatRow2LeftPropertiesHeating, specSeatRow2LeftPropertiesSeatVentilation, specSeatRow2MiddlePropertiesHeating, specSeatRow2MiddlePropertiesSeatVentilation, specSeatRow2RightPropertiesHeating, specSeatRow2RightPropertiesSeatVentilation, seatRow1LeftHeatingValue, seatRow1LeftVentilationValue, seatRow1RightHeatingValue, seatRow1RightVentilationValue, seatRow2LeftHeatingValue, seatRow2LeftVentilationValue, seatRow2MiddleHeatingValue, seatRow2MiddleVentilationValue, seatRow2RightHeatingValue, seatRow2RightVentilationValue, disabled]);
|
|
251
|
+
}, [buildButtons, specSeatRow1LeftPropertiesHeating, specSeatRow1LeftPropertiesSeatVentilation, specSeatRow1RightPropertiesHeating, specSeatRow1RightPropertiesSeatVentilation, specSeatRow2LeftPropertiesHeating, specSeatRow2LeftPropertiesSeatVentilation, specSeatRow2MiddlePropertiesHeating, specSeatRow2MiddlePropertiesSeatVentilation, specSeatRow2RightPropertiesHeating, specSeatRow2RightPropertiesSeatVentilation, specSeatRow3LeftPropertiesHeating, specSeatRow3MiddlePropertiesHeating, specSeatRow3RightPropertiesHeating, seatRow1LeftHeatingValue, seatRow1LeftVentilationValue, seatRow1RightHeatingValue, seatRow1RightVentilationValue, seatRow2LeftHeatingValue, seatRow2LeftVentilationValue, seatRow2MiddleHeatingValue, seatRow2MiddleVentilationValue, seatRow2RightHeatingValue, seatRow2RightVentilationValue, seatRow3LeftHeatingValue, seatRow3MiddleHeatingValue, seatRow3RightHeatingValue, disabled]);
|
|
225
252
|
const handleSeatChange = useCallback(({
|
|
226
253
|
propType,
|
|
227
254
|
spec,
|
|
@@ -40,6 +40,7 @@ export const useSingleRangeData = ({
|
|
|
40
40
|
return {
|
|
41
41
|
currentRange: null,
|
|
42
42
|
totalRange: 100,
|
|
43
|
+
currentSoc: 0,
|
|
43
44
|
unit: '%',
|
|
44
45
|
color: colorToken.accentGreenContent
|
|
45
46
|
};
|
|
@@ -57,12 +58,15 @@ export const useSingleRangeData = ({
|
|
|
57
58
|
} else if (getValueBySpecDescription(specPowerBatteryPropertiesLowSocWarning, 'Level1 Warning') === lowSocWarning) {
|
|
58
59
|
color = colorToken.accentYellowFill;
|
|
59
60
|
}
|
|
61
|
+
const totalRange = specPowerBatteryPropertiesBatterySoCDisplay?.prop?.['value-range']?.[1] || 100;
|
|
62
|
+
const currentSoc = batterySoCDisplay || 0;
|
|
60
63
|
|
|
61
64
|
// 1. Battery SOC percentage
|
|
62
65
|
if (getValueBySpecDescription(specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, 'SOC') === dcdType) {
|
|
63
66
|
return {
|
|
64
67
|
currentRange: batterySoCDisplay,
|
|
65
|
-
totalRange
|
|
68
|
+
totalRange,
|
|
69
|
+
currentSoc,
|
|
66
70
|
unit: '%',
|
|
67
71
|
color
|
|
68
72
|
};
|
|
@@ -72,7 +76,8 @@ export const useSingleRangeData = ({
|
|
|
72
76
|
if (getValueBySpecDescription(specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, 'CLTCRange') === dcdType) {
|
|
73
77
|
return {
|
|
74
78
|
currentRange: cltcEstimatedRange,
|
|
75
|
-
totalRange
|
|
79
|
+
totalRange,
|
|
80
|
+
currentSoc,
|
|
76
81
|
unit: distanceUnit,
|
|
77
82
|
color
|
|
78
83
|
};
|
|
@@ -82,14 +87,16 @@ export const useSingleRangeData = ({
|
|
|
82
87
|
if (getValueBySpecDescription(specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, 'MiRange') === dcdType) {
|
|
83
88
|
return {
|
|
84
89
|
currentRange: batteryEstimatedMileage,
|
|
85
|
-
totalRange
|
|
90
|
+
totalRange,
|
|
91
|
+
currentSoc,
|
|
86
92
|
unit: distanceUnit,
|
|
87
93
|
color
|
|
88
94
|
};
|
|
89
95
|
}
|
|
90
96
|
return {
|
|
91
97
|
currentRange: null,
|
|
92
|
-
totalRange
|
|
98
|
+
totalRange,
|
|
99
|
+
currentSoc,
|
|
93
100
|
unit: '%',
|
|
94
101
|
color: colorToken.accentGreenContent
|
|
95
102
|
};
|
|
@@ -6,6 +6,35 @@ export declare const useSteeringWheelData: ({ specBodySteeringWheelPropertiesSte
|
|
|
6
6
|
steeringWheelTitle: string | Record<string, string>;
|
|
7
7
|
steeringWheelHeatState: any;
|
|
8
8
|
onSteeringWheelHotChange: (val: any) => void;
|
|
9
|
-
steeringWheelOptions:
|
|
9
|
+
steeringWheelOptions: {
|
|
10
|
+
label: any;
|
|
11
|
+
colorType: string | undefined;
|
|
12
|
+
siid: number;
|
|
13
|
+
piid?: number | undefined;
|
|
14
|
+
eiid?: number | undefined;
|
|
15
|
+
aiid?: number | undefined;
|
|
16
|
+
miid?: number | undefined;
|
|
17
|
+
did?: string | undefined;
|
|
18
|
+
value?: unknown;
|
|
19
|
+
in?: unknown[] | undefined;
|
|
20
|
+
out?: unknown[] | undefined;
|
|
21
|
+
description?: string | undefined;
|
|
22
|
+
dataSource?: number | undefined;
|
|
23
|
+
viid?: number | undefined;
|
|
24
|
+
skey?: string | undefined;
|
|
25
|
+
pkey?: string | undefined;
|
|
26
|
+
akey?: string | undefined;
|
|
27
|
+
ekey?: string | undefined;
|
|
28
|
+
service?: unknown;
|
|
29
|
+
prop?: import("../types").SpecPropertyRaw | undefined;
|
|
30
|
+
action?: import("../types").SpecActionRaw | undefined;
|
|
31
|
+
event?: import("../types").SpecEventRaw | undefined;
|
|
32
|
+
source?: unknown;
|
|
33
|
+
sDescription?: string | undefined;
|
|
34
|
+
mkey?: string | undefined;
|
|
35
|
+
mDescription?: string | undefined;
|
|
36
|
+
reiids?: number[] | undefined;
|
|
37
|
+
reIndexs?: number[] | undefined;
|
|
38
|
+
}[];
|
|
10
39
|
};
|
|
11
40
|
export {};
|
package/dist/index.d.ts
CHANGED
|
@@ -20,4 +20,5 @@ export { useParkingStatusData, type ParkingStatusInfo, type UseParkingStatusData
|
|
|
20
20
|
export { useSeatControlData, type SeatControlDataProps, SeatSpecs, LEVEL_ICONS, TYPE_CONFIG, SEAT_TITLES, } from './hooks/useSeatControlData';
|
|
21
21
|
export * from './config';
|
|
22
22
|
export * from './modules';
|
|
23
|
+
export * from './track';
|
|
23
24
|
export { isOverseas, isFeatureEnabled, useFeatureEnabled, type FeatureKey } from './utils/featureGate';
|
package/dist/index.js
CHANGED
|
@@ -19,4 +19,5 @@ export { useParkingStatusData } from "./hooks/useParkingStatusData";
|
|
|
19
19
|
export { useSeatControlData, SeatSpecs, LEVEL_ICONS, TYPE_CONFIG, SEAT_TITLES } from "./hooks/useSeatControlData";
|
|
20
20
|
export * from "./config";
|
|
21
21
|
export * from "./modules";
|
|
22
|
+
export * from "./track";
|
|
22
23
|
export { isOverseas, isFeatureEnabled, useFeatureEnabled } from "./utils/featureGate";
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useEffect, useRef } from 'react';
|
|
2
2
|
import { AirConditioningCard } from "../../components/airConditioningCard";
|
|
3
3
|
import { useAirConditionData } from "../../hooks/useAirConditionData";
|
|
4
4
|
import { ConnectStatus } from "../../hooks";
|
|
5
|
+
import { useCardTrack } from '@miot-rn/common-component/dist/service/track';
|
|
6
|
+
import { CAR_CARD, CAR_ITEM } from "../../track/config";
|
|
5
7
|
export const AirconditionModule = ({
|
|
6
8
|
specs,
|
|
7
9
|
connectStatus,
|
|
@@ -15,6 +17,14 @@ export const AirconditionModule = ({
|
|
|
15
17
|
specHVACTemperaturePropertiesHvacTargetTemperature
|
|
16
18
|
} = specs;
|
|
17
19
|
const {
|
|
20
|
+
trackClick,
|
|
21
|
+
trackExpose
|
|
22
|
+
} = useCardTrack({
|
|
23
|
+
cardName: CAR_CARD.AC
|
|
24
|
+
});
|
|
25
|
+
const {
|
|
26
|
+
hvacStatus,
|
|
27
|
+
hvacDefrosterStatus,
|
|
18
28
|
transformHvacStatus,
|
|
19
29
|
transformHvacDefrosterStatus,
|
|
20
30
|
targetTemperature,
|
|
@@ -38,15 +48,63 @@ export const AirconditionModule = ({
|
|
|
38
48
|
specHVACTemperaturePropertiesOutsideTemperature: specHVACTemperaturePropertiesOutsideTemperature,
|
|
39
49
|
specHVACTemperaturePropertiesHvacTargetTemperature: specHVACTemperaturePropertiesHvacTargetTemperature
|
|
40
50
|
});
|
|
51
|
+
|
|
52
|
+
// TEMP_ADJUST 不依赖 spec 值,mount 同步触发
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (specHVACTemperaturePropertiesHvacTargetTemperature) {
|
|
55
|
+
trackExpose(CAR_ITEM.TEMP_ADJUST);
|
|
56
|
+
}
|
|
57
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
58
|
+
}, []);
|
|
59
|
+
|
|
60
|
+
// AC/DEFROST 开关 expose 必须等 spec 值就绪后再发,否则 transform 在 undefined 时永远是 false
|
|
61
|
+
const acExposedRef = useRef(false);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
if (acExposedRef.current) return;
|
|
64
|
+
if (specHVACStatePropertiesHvacStatus && hvacStatus !== undefined) {
|
|
65
|
+
trackExpose(CAR_ITEM.AC_SWITCH, {
|
|
66
|
+
item_content: String(transformHvacStatus)
|
|
67
|
+
});
|
|
68
|
+
acExposedRef.current = true;
|
|
69
|
+
}
|
|
70
|
+
}, [hvacStatus, transformHvacStatus, specHVACStatePropertiesHvacStatus, trackExpose]);
|
|
71
|
+
const defrostExposedRef = useRef(false);
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (defrostExposedRef.current) return;
|
|
74
|
+
if (specHVACStatePropertiesHvacDefrosterStatus && hvacDefrosterStatus !== undefined) {
|
|
75
|
+
trackExpose(CAR_ITEM.DEFROST_SWITCH, {
|
|
76
|
+
item_content: String(transformHvacDefrosterStatus)
|
|
77
|
+
});
|
|
78
|
+
defrostExposedRef.current = true;
|
|
79
|
+
}
|
|
80
|
+
}, [hvacDefrosterStatus, transformHvacDefrosterStatus, specHVACStatePropertiesHvacDefrosterStatus, trackExpose]);
|
|
81
|
+
const handleHvacStatusChange = val => {
|
|
82
|
+
trackClick(CAR_ITEM.AC_SWITCH, {
|
|
83
|
+
item_content: String(val)
|
|
84
|
+
});
|
|
85
|
+
onHvacStatusChange(val);
|
|
86
|
+
};
|
|
87
|
+
const handleDefrosterChange = val => {
|
|
88
|
+
trackClick(CAR_ITEM.DEFROST_SWITCH, {
|
|
89
|
+
item_content: String(val)
|
|
90
|
+
});
|
|
91
|
+
onHvacDefrosterChange(val);
|
|
92
|
+
};
|
|
93
|
+
const handleTemperatureChange = val => {
|
|
94
|
+
// 设计表(第 36-40 行):温度调节 +/- 仅定义 item_name,不含 item_content。
|
|
95
|
+
// 若后续需要采集目标温度值,先补设计表再补上报字段。
|
|
96
|
+
trackClick(CAR_ITEM.TEMP_ADJUST);
|
|
97
|
+
onHvacTemperatureChange(val);
|
|
98
|
+
};
|
|
41
99
|
return /*#__PURE__*/React.createElement(AirConditioningCard, {
|
|
42
100
|
showAirc: !!specHVACStatePropertiesHvacStatus,
|
|
43
101
|
showTargetTemperature: !!specHVACTemperaturePropertiesHvacTargetTemperature,
|
|
44
102
|
hvacStatus: transformHvacStatus,
|
|
45
103
|
hvacDefrosterStatus: transformHvacDefrosterStatus,
|
|
46
104
|
targetTemperature: targetTemperature,
|
|
47
|
-
onHvacStatusChange:
|
|
48
|
-
onHvacDefrosterChange:
|
|
49
|
-
onHvacTemperatureChange:
|
|
105
|
+
onHvacStatusChange: handleHvacStatusChange,
|
|
106
|
+
onHvacDefrosterChange: handleDefrosterChange,
|
|
107
|
+
onHvacTemperatureChange: handleTemperatureChange,
|
|
50
108
|
hvacTitle: hvacTitle,
|
|
51
109
|
hvacDefrosterTitle: hvacDefrosterTitle,
|
|
52
110
|
hvacDefrosterSubtitle: airConditionTip,
|
|
@@ -12,6 +12,8 @@ export interface CarInfoSpecs {
|
|
|
12
12
|
specPowerRangePropertiesCltcFuelEndurance?: Spec;
|
|
13
13
|
specPowerRangePropertiesWltcPureEleCruisingEndurance?: Spec;
|
|
14
14
|
specPowerRangePropertiesWltcFuelEndurance?: Spec;
|
|
15
|
+
specPowerRangePropertiesRemoteEvRange?: Spec;
|
|
16
|
+
specPowerRangePropertiesRemoteFuelRange?: Spec;
|
|
15
17
|
specBodyGearPropertiesGearStatus?: Spec;
|
|
16
18
|
specBodyPowerModePropertiesPowerModeState?: Spec;
|
|
17
19
|
specDoorCentralLockPropertiesCentralLockState?: Spec;
|
|
@@ -22,5 +24,5 @@ export interface CarInfoModuleProps {
|
|
|
22
24
|
connectStatus?: ConnectStatusValue;
|
|
23
25
|
containerStyle?: StyleProp<ViewStyle>;
|
|
24
26
|
}
|
|
25
|
-
export declare const CarInfoModule: ({ specs, connectStatus, containerStyle }: CarInfoModuleProps) => React.JSX.Element;
|
|
27
|
+
export declare const CarInfoModule: ({ specs, connectStatus, containerStyle, }: CarInfoModuleProps) => React.JSX.Element;
|
|
26
28
|
export default CarInfoModule;
|
|
@@ -9,8 +9,8 @@ export const CarInfoModule = ({
|
|
|
9
9
|
}) => {
|
|
10
10
|
// 判断 rangeType 类型
|
|
11
11
|
const rangeType = useMemo(() => {
|
|
12
|
-
return specs.specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange || specs.specPowerRangePropertiesWltcFuelEndurance || specs.specPowerRangePropertiesWltcPureEleCruisingEndurance || specs.specPowerRangePropertiesCltcFuelEndurance ? 'dual' : 'single';
|
|
13
|
-
}, [specs.specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange, specs.specPowerRangePropertiesWltcFuelEndurance, specs.specPowerRangePropertiesWltcPureEleCruisingEndurance, specs.specPowerRangePropertiesCltcFuelEndurance]);
|
|
12
|
+
return specs.specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange || specs.specPowerRangePropertiesWltcFuelEndurance || specs.specPowerRangePropertiesWltcPureEleCruisingEndurance || specs.specPowerRangePropertiesCltcFuelEndurance || specs.specPowerRangePropertiesRemoteEvRange || specs.specPowerRangePropertiesRemoteFuelRange ? 'dual' : 'single';
|
|
13
|
+
}, [specs.specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange, specs.specPowerRangePropertiesWltcFuelEndurance, specs.specPowerRangePropertiesWltcPureEleCruisingEndurance, specs.specPowerRangePropertiesCltcFuelEndurance, specs.specPowerRangePropertiesRemoteEvRange, specs.specPowerRangePropertiesRemoteFuelRange]);
|
|
14
14
|
|
|
15
15
|
// 单续航数据
|
|
16
16
|
const singleRangeData = useSingleRangeData({
|
|
@@ -27,7 +27,9 @@ export const CarInfoModule = ({
|
|
|
27
27
|
specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange: specs.specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange,
|
|
28
28
|
specPowerRangePropertiesCltcFuelEndurance: specs.specPowerRangePropertiesCltcFuelEndurance,
|
|
29
29
|
specPowerRangePropertiesWltcPureEleCruisingEndurance: specs.specPowerRangePropertiesWltcPureEleCruisingEndurance,
|
|
30
|
-
specPowerRangePropertiesWltcFuelEndurance: specs.specPowerRangePropertiesWltcFuelEndurance
|
|
30
|
+
specPowerRangePropertiesWltcFuelEndurance: specs.specPowerRangePropertiesWltcFuelEndurance,
|
|
31
|
+
specPowerRangePropertiesRemoteEvRange: specs.specPowerRangePropertiesRemoteEvRange,
|
|
32
|
+
specPowerRangePropertiesRemoteFuelRange: specs.specPowerRangePropertiesRemoteFuelRange
|
|
31
33
|
});
|
|
32
34
|
|
|
33
35
|
// 驻车状态数据
|