1. 程式人生 > >oto餐飲app實時訂單物流追蹤系統架構設計(一)

oto餐飲app實時訂單物流追蹤系統架構設計(一)

1.引言

.1     1.1目的

    不管是淘點點或者餓了麼,只要是打算做外賣的app,我覺得沒有實時地圖展示外賣訂單位置資訊是說不過去的,因為我覺得外賣對於物流實時性是非常苛刻的。11:00定的外賣在12:00還沒有送到使用者手中,都是不可原諒的。

   基於此我想設計一個地圖實時顯示送貨員位置資訊的系統。

  2.1 功能需求

    該系統主要功能包括:

    1).配送員app登入上線後,接收訂單後迴圈的把自己的位置資訊傳送給伺服器管理

    2).使用者客戶端在訂單經過店家轉給配送員後,即可在地圖上檢視實時位置資訊

    3)伺服器收到配送員位置資訊後根據配送訂單資訊轉發給相應的使用者客戶端

    4)其他功能。使用者app提交提單給web伺服器後,web伺服器把這條訊息推送給訂單追蹤伺服器

    3.1 業務流程設計

   

  4.1介面設計

     1)店家版


2)配送員

  


5)各個模組詳細設計和實現

5.1 使用者app請求地理位置

public class MyUdpClient extends UDPClientBase {

		public MyUdpClient(byte[] uuid, int appid, String serverAddr, int serverPort)
				throws Exception {
			super(uuid, appid, serverAddr, serverPort);

		}

		@Override
		public boolean hasNetworkConnection() {
			return Util.hasNetwork(OnlineService.this);
		}
		

		@Override
		public void trySystemSleep() {
			tryReleaseWakeLock();
		}

		@Override
		public void onPushMessage(Message message) {
			if(message == null){
				return;
			}
			else if(message.getData() == null || message.getData().length == 0){
				return;
			}
			else if(message.getCmd() == 16){// 0x10 通用推送資訊
				
			}
			else if(message.getCmd() == 17){// 0x11 分組推送資訊
				
			}
			else if(message.getCmd() == 32){// 0x20 自定義推送資訊
				String str = null;
				try{
					str = new String(message.getData(),5,message.getContentLength(), "UTF-8");
				}catch(Exception e){
					str = Util.convert(message.getData(),5,message.getContentLength());
				}
				
				//轉化成json串   lbs 實時物流追中,
				Gson gson = new Gson();
				MsgType msgType = gson.fromJson(str,new TypeToken<MsgType>(){}.getType()); 
				if(msgType.equals("wuliu"))
				{
					//配送員地址位置
					
				}
				else if(msgType.equals("order"))
				{
					//訂單確認
				}
				else
				{
					notifyUser(32,"自定義推送資訊",""+str,"收到自定義推送資訊");
				}		
			}
			setPkgsInfo();
		}

	}


百度地圖api版本v_3_1,百度定位api版本v_4.2

package com.cmyy.ui;

import org.json.JSONException;
import org.json.JSONObject;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.cmyy.R;
import com.cmyy.push.OnlineService;
import com.cmyy.push.Params;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;


//實時物流頁面
public class LogisticsTrackingActivity extends BaseActivity{
	private static final String LTAG = LogisticsTrackingActivity.class.getSimpleName();
	private MapView mMapView;
	private BaiduMap mBaiduMap;
	private SDKReceiver mReceiver;
	// 定位相關
	private LocationClient mLocClient;
	public MyLocationListenner myListener = new MyLocationListenner(); //定位
	boolean isFirstLoc = true;// 是否首次定位
	
	private PushLocationReceiver mPushLocationReceice;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 註冊 SDK 廣播監聽者
		IntentFilter iFilter = new IntentFilter();
		iFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
		iFilter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
		mReceiver = new SDKReceiver();
		registerReceiver(mReceiver, iFilter);
		
		setContentView(R.layout.activity_tracking);
					
		//向伺服器通知需要物流地理位置了
		
		//註冊接受位置資訊廣播
		IntentFilter ipushFilter = new IntentFilter();
		ipushFilter.addAction("com.cmyy.ui.LogisticsTrackingActivity.PushLocationReceiver");
		mPushLocationReceice = new PushLocationReceiver();
		registerReceiver(mPushLocationReceice, ipushFilter);
		
		//啟動服務去接收位置	
		saveAccountInfo();
		Intent startSrv = new Intent(this, OnlineService.class);
		startSrv.putExtra("CMD", "RESET");
		startService(startSrv);
		//展示地圖
		mMapView = (MapView) findViewById(R.id.bmapView);
		mBaiduMap = mMapView.getMap();
		// 開啟定點陣圖層
		mBaiduMap.setMyLocationEnabled(true);
		// 定位初始化
		/*mLocClient = new LocationClient(this);
		mLocClient.registerLocationListener(myListener);
		LocationClientOption option = new LocationClientOption();
		option.setOpenGps(true);// 開啟gps
		option.setCoorType("bd09ll"); // 設定座標型別
		option.setScanSpan(1000);
		mLocClient.setLocOption(option);
		mLocClient.start();*/
	}
	
	public class PushLocationReceiver extends BroadcastReceiver {

		public PushLocationReceiver() {

		}

		@Override
		public void onReceive(Context context, Intent intent) {
             //接收到配送員傳送過來的位置資訊
			String message = intent.getStringExtra("data");
			Log.i("receive",message);
			Gson gson = new Gson();
			MyLocationData locData = gson.fromJson(message,new TypeToken<MyLocationData>(){}.getType());
	        JSONObject jsonObj;
	        double latitude = 39.915;
	        double longitude = 116.404;
			try {
				jsonObj = new JSONObject(message);
				latitude = jsonObj.getDouble("latitude");
				longitude= jsonObj.getDouble("longitude");
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			Log.i("receive",String.valueOf(latitude));
			Log.i("receive",String.valueOf(longitude));
			mBaiduMap.setMyLocationData(locData);
			if (isFirstLoc) {
				isFirstLoc = false;
				LatLng ll = new LatLng(latitude,
						longitude);
				MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
				mBaiduMap.animateMapStatus(u);
			}
		}

	}
	
	/**
	 * 定位SDK監聽函式
	 */
	public class MyLocationListenner implements BDLocationListener {

		@Override
		public void onReceiveLocation(BDLocation location) {
			// map view 銷燬後不在處理新接收的位置
			if (location == null || mMapView == null)
				return;
			MyLocationData locData = new MyLocationData.Builder()
					.accuracy(location.getRadius())
					// 此處設定開發者獲取到的方向資訊,順時針0-360
					.direction(100).latitude(location.getLatitude())
					.longitude(location.getLongitude()).build();
			mBaiduMap.setMyLocationData(locData);
			if (isFirstLoc) {
				isFirstLoc = false;
				LatLng ll = new LatLng(location.getLatitude(),
						location.getLongitude());
				MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
				mBaiduMap.animateMapStatus(u);
			}
		}

		public void onReceivePoi(BDLocation poiLocation) {
		}
	}
	
	/**
	 * 構造廣播監聽類,監聽 SDK key 驗證以及網路異常廣播
	 */
	public class SDKReceiver extends BroadcastReceiver {
		public void onReceive(Context context, Intent intent) {
			String s = intent.getAction();
			Log.d(LTAG, "action: " + s);
			if (s.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
				Log.e("LogisticsTrackingActivity","key 驗證出錯! 請在 AndroidManifest.xml 檔案中檢查 key 設定");
			} else if (s.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
				Log.e("LogisticsTrackingActivity","網路出錯");
			}
		}
	}
	
	protected void saveAccountInfo(){
		SharedPreferences account = this.getSharedPreferences(Params.DEFAULT_PRE_NAME,Context.MODE_PRIVATE);
		SharedPreferences.Editor editor = account.edit();
		editor.putString(Params.SERVER_IP, "192.168.88.130");
		editor.putString(Params.SERVER_PORT, "9966");
		editor.putString(Params.PUSH_PORT, "9998");
		editor.putString(Params.USER_NAME, "333");
		editor.putString(Params.SENT_PKGS, "0");
		editor.putString(Params.RECEIVE_PKGS, "0");
		editor.commit();	
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		// activity 暫停時同時暫停地圖控制元件
		mMapView.onPause();
	}

	@Override
	protected void onResume() {
		super.onResume();
		// activity 恢復時同時恢復地圖控制元件
		mMapView.onResume();
	}

	@Override
	protected void onDestroy() {
		mLocClient.stop();
		// 關閉定點陣圖層
		mBaiduMap.setMyLocationEnabled(false);
		super.onDestroy();
		// 取消監聽 SDK 廣播
		unregisterReceiver(mReceiver);
		// activity 銷燬時同時銷燬地圖控制元件
		mMapView.onDestroy();
	}
	
}<strong>
</strong>


5.2 配送員app傳送地理位置資訊給追蹤伺服器

  //接受伺服器推送資訊
	    saveAccountInfo();   //設定伺服器ip 埠
	    Intent startSrv = new Intent(this, OnlineService.class);
		startService(startSrv);
		
	    push = new Push(this);
	    //啟動地理位置監控
	    mBaiduMapControl = new BaiduMapControl();
	    mBaiduMapControl.Location(getApplicationContext(),new BDLocationListener()
	    {
			@Override
			public void onReceiveLocation(BDLocation location) {
			   	MyLocationData locData = new MyLocationData.Builder()
				.accuracy(location.getRadius())
				// 此處設定開發者獲取到的方向資訊,順時針0-360
				.direction(100).latitude(location.getLatitude())
				.longitude(location.getLongitude()).build();
			   	 Gson gson = new Gson();
			   	 //地理位置資訊
			   	 String strLocation = gson.toJson(locData).toString();
			     Log.i("BaiduLocationApiDem",strLocation);
				//Receive Location 
				/*StringBuffer sb = new StringBuffer(256);
				sb.append("time : ");
				sb.append(location.getTime());             //定位時間
				sb.append("\nerror code : ");
				sb.append(location.getLocType());
				sb.append("\nlatitude : ");
				sb.append(location.getLatitude());       // 開發者獲取到的方向資訊,順時針0-360
				sb.append("\nlontitude : ");
				sb.append(location.getLongitude());
				sb.append("\nradius : ");
				sb.append(location.getRadius());            
				if (location.getLocType() == BDLocation.TypeGpsLocation){
					sb.append("\nspeed : ");
					sb.append(location.getSpeed());
					sb.append("\nsatellite : ");
					sb.append(location.getSatelliteNumber());
					sb.append("\ndirection : ");
					sb.append("\naddr : ");
					sb.append(location.getAddrStr());
					sb.append(location.getDirection());
				} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
					sb.append("\naddr : ");
					sb.append(location.getAddrStr());
					//運營商資訊
					sb.append("\noperationers : ");
					sb.append(location.getOperators());
				}
			   					   	
				Log.i("BaiduLocationApiDem", sb.toString());	*/
				//定位成功傳送給伺服器
				push.send0x20("333", strLocation);  
							
			}
 	
	    });  

未完....

相關推薦

oto餐飲app實時訂單物流追蹤系統架構設計()

1.引言 .1     1.1目的     不管是淘點點或者餓了麼,只要是打算做外賣的app,我覺得沒有實時地圖展示外賣訂單位置資訊是說不過去的,因為我覺得外賣對於物流實時性是非常苛刻的。11:00定的外賣在12:00還沒有送到使用者手中,都是不可原諒的。    基於此

oto餐飲app實時推送訂單給店家程式詳細實現(二)

文接"oto餐飲app實時訂單追蹤系統架構設計"一文。     使用者生成一個外賣訂單後,可以以發簡訊的方式告知店家有一個訂單,但是簡訊方式的缺點是非常明顯的,如果想讓使用者和網站知道店家接受訂單和其他的操作就需要網站人工干預,這在智慧手機沒有出來之前,那些外賣網站這樣運營

【阿里雲ACE成長記第5期】分散式鏈路追蹤系統架構設計的經驗分享

【引言】本期由阿里雲ACE(阿里雲開發者社群)&成都檸檬雲網絡技術有限公司資深架構師 曾昌強 為大家分享個人成長經歷與個人專業技術之分散式鏈路追蹤系統架構設計。視訊:https://yq.aliyun.com/live/581 Part 1:成長經歷講述一個不知道什麼叫程式設計的門外漢,如何穿越幾千

機票實時搜索系統架構設計

family 之間 width call 作用 化運維 mage margin 1-1 機票實時搜索系統架構設計? 不同的業務場景,不同的特征 ? 結合特征去進?設計和優化 ? 通?!=最優 ? 量體裁?分布式系統的CAP理論 首先把分布式系統中的三個特性進行了

美團即時物流的分散式系統架構設計

本文根據美團資深技術專家宋斌在ArchSummit架構師峰會上的演講整理而成。 背景 美團外賣已經發展了五年,即時物流探索也經歷了3年多的時間,業務從零孵化到初具規模,在整個過程中積累了一些分散式高併發系統的建設經驗。最主要的收穫包括兩點: 即時物流業務對故障和高延遲的容忍度極低,在業

高併發訂單系統架構設計

高併發下單主要包括以下幾個方面: 分庫分表 多應用例項全域性唯一訂單號 資料庫連線 買家查詢訂單 賣家查詢訂單 擴容問題 業務拆分 一、分庫分表 隨著訂單量的增長,資料庫的發展主要經歷以下幾個步驟:  - 1主-1從架構  - 雙主-多從架構,讀寫分離  - 表

Java架構-美團即時物流的分散式系統架構設計

背景 美團外賣已經發展了五年,即時物流探索也經歷了 3 年多的時間,業務從零孵化到初具規模,在整個過程中積累了一些分散式高併發系統的建設經驗。最主要的收穫包括兩點: 即時物流業務對故障和高延遲的容忍度極低,在業務複雜度提升的同時也要求系統具備分散式、可擴充套件、可容災的能力。即時

【轉】 實時Android語音對講系統架構

本文屬於Android區域網內的語音對講專案系列,《通過UDP廣播實現Android區域網Peer Discovering》實現了局域網內的廣播及多播通訊,本文將重點說明系統架構,音訊訊號的實時錄製、播放及編解碼相關技術。 本文主要包含以下內容: AudioRecord、AudioTr

實時Android語音對講系統架構

本文主要包含以下內容: AudioRecord、AudioTrack Speex編解碼 Android語音對講系統架構 一、AudioRecord、AudioTrack AudioRecorder和AudioTracker是Android中獲取實時音訊資料

日處理20億資料,實時使用者行為服務系統架構實踐

攜程實時使用者行為服務作為基礎服務,目前普遍應用在多個場景中,比如猜你喜歡(攜程的推薦系統)、動態廣告、使用者畫像、瀏覽歷史等等。 以猜你喜歡為例,猜你喜歡為應用內使用者提供潛在選項,提高成交效率。旅行是一項綜合性的需求,使用者往往需要不止一個產品。作為一站式的旅遊服務平臺,跨業務線的推薦,特別是實

【好文分享】美團即時物流的分散式系統架構設計

文章概要   美團外賣已經發展了五年,即時物流探索也經歷了 3 年多的時間,業務從零孵化到初具規模,在整個過程中積累了一些分散式高併發系統的建設經驗。最主要的收穫包括兩點: 即時物流業務對故障和高延遲的容忍度極低,在業務複雜度提升的同時也要求系統具備分散式、可擴充套件、

高併發訂單系統架構設計(二)

高併發下單主要包括以下幾個方面: 分庫分表 多應用例項全域性唯一訂單號 資料庫連線 買家查詢訂單 賣家查詢訂單 擴容問題 業務拆分 一、分庫分表 隨著訂單量的增長,資料庫的發展主要經歷以下幾個步驟: - 1主-1從架構 - 雙主-多從架構,讀寫

全民養豬系統架構設計開發平臺

全民養豬 全民養豬系統開發,(李小姐177-8870-6412微/電)全民養豬系統源碼搭建,全民養豬系統全網模式開發,全民養豬 app系統軟件開發,全民養豬系統專業開發,全民養豬系統app開發平臺,全民養豬系統設計運作、非平臺客服,玩家勿擾!!! 全民養豬每個帳戶每天可以購買100元到20

淺談秒殺系統架構設計

秒殺http://mp.weixin.qq.com/s?__biz=MjM5NDM4MDIwNw%3D%3D&mid=2448834705&idx=1&sn=25cf3d4f6d6826e564a634901189eb8f&chksm=b28a405185fdc9478b6bd

高性能、高可用、高擴展ERP系統架構設計

sqlserve 學習 業務邏輯層 表設計 應用程序 log cnblogs 便在 tab ERP之痛 曾幾何時,我混跡於電商、珠寶行業4年多,為這兩個行業開發過兩套大型業務系統(ERP)。作為一個ERP系統,系統主要功能模塊無非是訂單管理、商品管理、生產采

SaaS 系統架構設計經驗總結

計費 攔截 好處 abc www. ring 需求 分系統 數據庫 2B SaaS系統最近幾年都很火。很多創業公司都在嘗試創建企業級別的應用 cRM, HR,銷售, Desk SaaS系統。很多SaaS創業公司也拿了大額風投。畢竟SaaS相對傳統軟件的優勢非常明顯。 最近一

分布式、服務化的ERP系統架構設計

你會 實現 strong 感覺 項目 更新失敗 統一 都在 優點 每天學習一點點 編程PDF電子書、視頻教程免費下載:http://www.shitanlife.com/code ERP之痛 曾幾何時,我混跡於電商、珠寶行業4年多,為這兩個行業開發

DKhadoop大數據系統架構設計方案

深度 穩定性 alt 自己 系統架構 穩定 得到 國產 style 大數據作為當下最為熱門的事件之一,其實已經不算是很新鮮的事情了。如果是三五年前在討論大數據,那可能會給人一種很新鮮的感覺。大數據作為當下最為重要的一項戰略資源,已經是越來越得到國家和企業的高度重視,我們從大

Android系統架構

查詢 核心 手機 例如 ava 模塊 api 操作系統 運行   一、Android系統版本簡介   Android操作系統已占據了手機操作系統的大半壁江山,截至本文寫作時,Android操作系統系統版本及其詳細信息,已發生了變化,具體信息見下表,當然也可以訪問https:

0. 視頻監控系統架構設計

無線 oot nfs服務 實現 圖1 In inux ubun 設計 0、視頻監控系統架構設計 0.1、功能指標 (1)搭建共享文件夾 (2)實現Ubuntu的NAT上網和橋接上網 (3)搭建局域網 (4)搭建nfs服務器、tftp服務器 (5)將uboot、kernel、