| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- import PageContainerBehavior from "../../../../core/behavior/page-container.behavior";
- import DictionariesBehavior from "../../../../core/behavior/dictionaries.behavior";
- import tickleBehavior from "../../../../core/behavior/tickle.behavior";
- import { getLogisticsMethod } from "../../request"
- interface TraceItem {
- status: string;
- time: string;
- desc: string;
- timeKey?: string;
- }
- interface LogisticsTrack {
- time?: string;
- context?: string;
- areaName?: string;
- status?: string;
- location?: string;
- areaCode?: string | null;
- areaCenter?: any;
- areaPinYin?: string | null;
- statusCode?: any;
- }
- interface MapPoint {
- latitude: number;
- longitude: number;
- }
- Page({
- behaviors: [PageContainerBehavior, DictionariesBehavior, tickleBehavior],
- async onLoad(options: any) {
- const id = options?.id;
- if (id) {
- try {
- const res = await getLogisticsMethod(id as any);
- const tracks: LogisticsTrack[] = res?.data?.tracks ?? [];
- const [latestTrack, ...historyTracks] = tracks;
- this.setData({
- showAllTrace: false,
- latestTrace: latestTrack ? this.trackToTraceItem(latestTrack) : ({ status: "", time: "", desc: "" } as TraceItem),
- traceHistory: historyTracks.map((t) => this.trackToTraceItem(t)),
- });
- console.log(tracks, "tracks")
- // 顶部地图背景:只使用 tracks.areaCenter 画轨迹
- this.applyMapFromLogistics(tracks);
- } catch (e: any) {
- this.setData({
- showAllTrace: false,
- latestTrace: { status: "", time: "", desc: "" } as TraceItem,
- traceHistory: [],
- });
- }
- }
- if (options.goods) {
- const goosInfo = JSON.parse(options.goods);
- const expressType = goosInfo.expressType
- this.setData({
- deliveryAddress: goosInfo.address,
- recipientName: goosInfo.liaison,
- recipientPhone: goosInfo.phone,
- expressType,
- carrierName: goosInfo.expressType,
- trackingNo: goosInfo.expressNo,
- goosInfo
- });
- }
- },
- data: {
- // 物流start
- hasMapPosition: false,
- latitude: 0,
- longitude: 0,
- mapScale: 14,
- markers: [] as any[],
- polyline: [] as any[],
- includePoints: [] as MapPoint[],
- // end
- carrierName: "",
- expressType: "",
- trackingNo: "",
- courierPhone: "",
- showAllTrace: false,
- latestTrace: {
- status: "",
- time: "",
- desc: "",
- } as TraceItem,
- traceHistory: [
- ] as TraceItem[],
- deliveryAddress: "",
- recipientName: "",
- recipientPhone: "",
- goosInfo: {}
- },
- // --start
- buildRoutePointsFromTracks(tracks: LogisticsTrack[]): MapPoint[] {
- if (!Array.isArray(tracks) || tracks.length === 0) return [];
- const pts: MapPoint[] = [];
- for (const t of [...tracks].reverse()) {
- if (!t?.areaCenter) continue;
- const [lng, lat] = t.areaCenter.split(",").map((s: string) => Number(s.trim()));
- if (!Number.isNaN(lng) && !Number.isNaN(lat)) {
- pts.push({ latitude: lat, longitude: lng });
- }
- }
- return pts;
- },
- applyMapFromLogistics(tracks: LogisticsTrack[]) {
- // 把每个点转为经纬度
- const routePoints = this.buildRoutePointsFromTracks(tracks || []);
- // 多点的情况
- if (routePoints.length >= 2) {
- // 第一个点的经纬度
- const first = routePoints[0];
- // 最后一个点的经纬度
- const last = routePoints[routePoints.length - 1];
- this.setData({
- // 设置地图的显示状态
- hasMapPosition: true,
- // 设置地图的经纬度
- latitude: (first.latitude + last.latitude) / 2,
- longitude: (first.longitude + last.longitude) / 2,
- // 设置地图的缩放级别
- mapScale: 11,
- // 设置轨迹点
- markers: [
- { id: 1, latitude: first.latitude, longitude: first.longitude, width: 26, height: 26 },
- { id: 2, latitude: last.latitude, longitude: last.longitude, width: 26, height: 26 },
- ],
- // 设置轨迹线
- polyline: [
- {
- points: routePoints,
- color: "#FF6B00AA",
- width: 4,
- },
- ],
- // 设置轨迹点
- includePoints: routePoints,
- });
- return;
- }
- // 单点的情况
- if (routePoints.length === 1) {
- const only = routePoints[0];
- this.setData({
- hasMapPosition: true,
- latitude: only.latitude,
- longitude: only.longitude,
- mapScale: 14,
- markers: [{ id: 1, latitude: only.latitude, longitude: only.longitude, width: 28, height: 28 }],
- polyline: [],
- includePoints: [only],
- });
- return;
- }
- // 无轨迹点的情况
- this.setData({
- hasMapPosition: false,
- markers: [],
- polyline: [],
- includePoints: [],
- });
- },
- // end
- trackToTraceItem(track: LogisticsTrack): TraceItem {
- const time = String(track?.time ?? "");
- return {
- status: String(track?.status ?? ""),
- time,
- desc: String(track?.context ?? ""),
- timeKey: time,
- };
- },
- toggleTraceExpand() {
- this.setData({ showAllTrace: !this.data.showAllTrace });
- },
- onCopyTracking() {
- const no = this.data.trackingNo;
- wx.setClipboardData({
- data: no,
- success: () => {
- wx.showToast({ title: "已复制运单号", icon: "none" });
- },
- });
- },
- });
|