diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java index 01f4ec1b2e..e8c49b8e8b 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java @@ -85,7 +85,8 @@ public class OchBusProvider implements IMogoOCH { @Override public void onMsgReceived(List obj) { - // todo 刷新界面 + // 刷新列表 + busFragment.getPresenter().getStationListFromSocket(obj); } }; diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusLeaveStationRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusLeaveStationRequest.java new file mode 100644 index 0000000000..d9e470ecf6 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusLeaveStationRequest.java @@ -0,0 +1,24 @@ +package com.mogo.och.bus.bean; + +/** + * 公交驶离车站,同步服务端请求参数封装 + * + * @author tongchenfei + */ +public class OchBusLeaveStationRequest { + private final String sn; + private final int siteId; + + public OchBusLeaveStationRequest(String sn, int siteId) { + this.sn = sn; + this.siteId = siteId; + } + + public String getSn() { + return sn; + } + + public int getSiteId() { + return siteId; + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesRequest.java index 3b80f70dc2..5de543ba60 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesRequest.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesRequest.java @@ -8,10 +8,12 @@ package com.mogo.och.bus.bean; public class OchBusRoutesRequest { double lat; double lon; + String sn; - public OchBusRoutesRequest(double lat, double lon) { + public OchBusRoutesRequest(String sn, double lat, double lon) { this.lat = lat; this.lon = lon; + this.sn = sn; } public double getLat() { @@ -29,4 +31,12 @@ public class OchBusRoutesRequest { public void setLon(double lon) { this.lon = lon; } + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java index cc8933dcbd..86083944b6 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java @@ -18,7 +18,10 @@ public class OchBusRoutesResponse extends BaseData { this.result = result; } - - - + @Override + public String toString() { + return "OchBusRoutesResponse{" + + "result=" + result + + '}'; + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java index 6a77b51f22..d9042bcc16 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java @@ -8,20 +8,20 @@ import java.util.List; * @author tongchenfei */ public class OchBusRoutesResult { - private List siteData; + private List site; - public List getSiteData() { - return siteData; + public List getSite() { + return site; } - public void setSiteData(List siteData) { - this.siteData = siteData; + public void setSite(List site) { + this.site = site; } @Override public String toString() { return "OchBusRoutesResult{" + - "siteData=" + siteData + + "site=" + site + '}'; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java index 67c1d506ac..93ad0ffc05 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java @@ -6,8 +6,6 @@ package com.mogo.och.bus.bean; * @author tongchenfei */ public class OchBusStation { - private double distance; - private String _id; private int lineId; private int siteId; private String siteName; @@ -18,22 +16,10 @@ public class OchBusStation { private double lon; private String siteDesc; private int siteState; + private int isCurrentSite; + private int siteColor; + private String peoples; - public double getDistance() { - return distance; - } - - public void setDistance(double distance) { - this.distance = distance; - } - - public String get_id() { - return _id; - } - - public void set_id(String _id) { - this._id = _id; - } public int getLineId() { return lineId; @@ -115,12 +101,34 @@ public class OchBusStation { this.siteState = siteState; } + public int getIsCurrentSite() { + return isCurrentSite; + } + + public void setIsCurrentSite(int isCurrentSite) { + this.isCurrentSite = isCurrentSite; + } + + public int getSiteColor() { + return siteColor; + } + + public void setSiteColor(int siteColor) { + this.siteColor = siteColor; + } + + public String getPeoples() { + return peoples; + } + + public void setPeoples(String peoples) { + this.peoples = peoples; + } + @Override public String toString() { return "OchBusStation{" + - "distance=" + distance + - ", _id='" + _id + '\'' + - ", lineId=" + lineId + + "lineId=" + lineId + ", siteId=" + siteId + ", siteName='" + siteName + '\'' + ", cityCode='" + cityCode + '\'' + @@ -130,6 +138,9 @@ public class OchBusStation { ", lon=" + lon + ", siteDesc='" + siteDesc + '\'' + ", siteState=" + siteState + + ", isCurrentSite=" + isCurrentSite + + ", siteColor=" + siteColor + + ", peoples='" + peoples + '\'' + '}'; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java index da5e7b9da5..7df72a776f 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java @@ -1,6 +1,8 @@ package com.mogo.och.bus.fragment; import android.view.View; +import android.widget.Button; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.constraintlayout.widget.Group; @@ -8,11 +10,12 @@ import androidx.constraintlayout.widget.Group; import com.mogo.commons.mvp.MvpFragment; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.view.OnPreventFastClickListener; +import com.mogo.och.bus.R; import com.mogo.och.bus.bean.OchBusStation; import com.mogo.och.bus.presenter.OchBusPresenter; -import com.mogo.och.bus.R; import com.mogo.utils.logger.Logger; +import java.util.ArrayList; import java.util.List; @@ -24,7 +27,9 @@ import java.util.List; public class OchBusFragment extends MvpFragment { private static final String TAG = "OchBusFragment"; private Group groupOchBus; - private List stationList; + private final List stationList = new ArrayList<>(); + private Button btnExecute; + private TextView tvNotice; @Override protected int getLayoutId() { @@ -40,6 +45,14 @@ public class OchBusFragment extends MvpFragment showOchBus(); } }); + btnExecute = findViewById(R.id.btnExecute); + btnExecute.setOnClickListener(new OnPreventFastClickListener() { + @Override + public void onClickImpl(View v) { + mPresenter.autoDriveToNextStation(); + } + }); + tvNotice = findViewById(R.id.vBusRoute); } @NonNull @@ -71,19 +84,44 @@ public class OchBusFragment extends MvpFragment } public void refreshBusStations(List busStationList) { - if (busStationList == null) { - // todo 获取小巴数据失败 - }else{ - // todo 渲染小巴路线数据 + if (getActivity() == null) { + return; } - + getActivity().runOnUiThread(() -> { + if (busStationList == null) { + // todo 获取小巴数据失败 + } else { + // todo 渲染小巴路线数据 + stationList.clear(); + stationList.addAll(busStationList); + for (int i = 0; i < stationList.size(); i++) { + OchBusStation station = stationList.get(i); + if (station.getIsCurrentSite() == OchBusPresenter.STATION_STATUS_LEAVING) { + tvNotice.setText("正在从 " + i + "站驶向" + (i + 1) + "站"); + btnExecute.setVisibility(View.GONE); + break; + } else if (station.getIsCurrentSite() == OchBusPresenter.STATION_STATUS_STOPED) { + tvNotice.setText("车辆正停在" + i + "站"); + btnExecute.setVisibility(View.VISIBLE); + if (i == stationList.size() - 1) { + btnExecute.setText("单程结束"); + }else if(i == 0){ + btnExecute.setText("准备出发"); + }else{ + btnExecute.setText("乘客已上车,准备出发"); + } + break; + } + } + } + }); } public void hideOchBus() { groupOchBus.setVisibility(View.GONE); } - private void queryStationListIfNecessary(){ + private void queryStationListIfNecessary() { if (stationList == null || stationList.isEmpty()) { mPresenter.queryBusRoutes(); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java index 095d771541..4924a6bde8 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java @@ -1,5 +1,6 @@ package com.mogo.och.bus.net; +import com.mogo.commons.data.BaseData; import com.mogo.och.bus.bean.OchBusRoutesResponse; import io.reactivex.Observable; @@ -26,4 +27,15 @@ public interface IOchBusApiService { @Headers({"Content-Type:application/json;charset=UTF-8"}) @POST("/yycp-onlinecar-hailing/onlineCarHailing/site/querySiteByCoordinate/v1") Observable querySiteByCoordinate(@Body RequestBody requestBody); + + + /** + * 公交车驶离车站时,通知服务端 + * @param requestBody 请求参数 {"sn":"","siteId":"车站id"} + * @return 无返回值 + */ + @Headers({"Content-Type:application/json;charset=UTF-8"}) + @POST("/yycp-onlinecar-hailing/onlineCarHailing/site/siteCrashCheck/v1") + Observable leaveStation(@Body RequestBody requestBody); + } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java index a2a4aef49f..e39bf77784 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java @@ -1,18 +1,28 @@ package com.mogo.och.bus.presenter; +import com.mogo.commons.data.BaseData; import com.mogo.commons.mvp.Presenter; import com.mogo.commons.network.SubscribeImpl; +import com.mogo.commons.network.Utils; import com.mogo.map.location.MogoLocation; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.constants.HostConst; +import com.mogo.och.bus.bean.OchBusLeaveStationRequest; import com.mogo.och.bus.bean.OchBusRoutesRequest; import com.mogo.och.bus.bean.OchBusRoutesResponse; +import com.mogo.och.bus.bean.OchBusStation; import com.mogo.och.bus.fragment.OchBusFragment; import com.mogo.och.bus.net.IOchBusApiService; +import com.mogo.service.adas.IMogoAdasOCHCallback; +import com.mogo.service.adas.RemoteControlAutoPilotParameters; +import com.mogo.service.adas.entity.AdasOCHData; import com.mogo.utils.logger.Logger; import com.mogo.utils.network.RequestOptions; import com.mogo.utils.network.utils.GsonUtil; +import java.util.ArrayList; +import java.util.List; + import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import okhttp3.MediaType; @@ -23,12 +33,24 @@ import okhttp3.RequestBody; * * @author tongchenfei */ -public class OchBusPresenter extends Presenter { +public class OchBusPresenter extends Presenter implements IMogoAdasOCHCallback { private static final String TAG = "OchBusPresenter"; + private static final int VEHICAL_TYPE = 10; + + public static final int STATION_STATUS_IDLE = 0; + public static final int STATION_STATUS_STOPED = 1; + public static final int STATION_STATUS_LEAVING = 2; + public static final int STATION_STATUS_ARRIVING = 3; + public OchBusPresenter(OchBusFragment view) { super(view); + MogoApisHandler.getInstance().getApis().getAdasControllerApi().addAdasOCHCallback(this); } + private final List stationList = new ArrayList<>(); + + private int currentStationIndex = 0; + public void queryBusRoutes() { double lat = 0; double lon = 0; @@ -37,10 +59,10 @@ public class OchBusPresenter extends Presenter { lat = lastLocation.getLatitude(); lon = lastLocation.getLongitude(); } - OchBusRoutesRequest request = new OchBusRoutesRequest(lat,lon); + OchBusRoutesRequest request = new OchBusRoutesRequest(Utils.getSn(),lat, lon); RequestBody requestBody = RequestBody.create(MediaType.get("application/json"), GsonUtil.jsonFromObject(request)); MogoApisHandler.getInstance().getApis().getNetworkApi() - .create(IOchBusApiService.class, HostConst.HAILING_HOST) + .create(IOchBusApiService.class, HostConst.OCH_DOMAIN) .querySiteByCoordinate(requestBody) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(new SubscribeImpl(RequestOptions.create(getContext())) { @@ -49,15 +71,18 @@ public class OchBusPresenter extends Presenter { public void onSuccess(OchBusRoutesResponse o) { super.onSuccess(o); Logger.d(TAG, "获取到小巴路线数据: " + o); - if (mView != null) { -// mView.refreshBusStations(o.getResult().getSiteData()); + if (mView != null && o.getResult() != null && o.getResult().getSite() != null) { + stationList.clear(); + stationList.addAll(o.getResult().getSite()); + refreshCurrentStation(); + mView.refreshBusStations(stationList); } } @Override public void onError(Throwable e) { super.onError(e); - Logger.e(TAG,e,"获取小巴路线图失败"); + Logger.e(TAG, e, "获取小巴路线图失败"); if (mView != null) { mView.refreshBusStations(null); } @@ -73,4 +98,91 @@ public class OchBusPresenter extends Presenter { } }); } + + public void getStationListFromSocket(List stations) { + // 接收长连接消息好像没啥用 +// stationList.clear(); +// stationList.addAll(stations); +// refreshCurrentStation(); +// if (mView != null) { +// mView.refreshBusStationsInUiThread(stationList); +// } + } + + public void autoDriveToNextStation() { + if (currentStationIndex >= stationList.size() - 1) { + // 当前站是最后一站,结束当前行程 + travelOver(); + return; + } + OchBusStation currentStation = stationList.get(currentStationIndex); + OchBusStation nextStation = stationList.get(currentStationIndex + 1); + currentStation.setIsCurrentSite(STATION_STATUS_LEAVING); + nextStation.setIsCurrentSite(STATION_STATUS_ARRIVING); + RemoteControlAutoPilotParameters parameters = new RemoteControlAutoPilotParameters(); + parameters.startLatLon = new RemoteControlAutoPilotParameters.AutoPilotLonLat(currentStation.getLat(), currentStation.getLon()); + parameters.endLatLon = new RemoteControlAutoPilotParameters.AutoPilotLonLat(nextStation.getLat(), nextStation.getLon()); + parameters.vehicleType = VEHICAL_TYPE; + MogoApisHandler.getInstance().getApis().getAdasControllerApi().aiCloudToAdasData(parameters); + + RequestBody request = RequestBody.create(MediaType.get("application/json"), GsonUtil.jsonFromObject(new OchBusLeaveStationRequest(Utils.getSn(), currentStation.getSiteId()))); + MogoApisHandler.getInstance().getApis().getNetworkApi() + .create(IOchBusApiService.class, HostConst.OCH_DOMAIN) + .leaveStation(request).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SubscribeImpl(RequestOptions.create(getContext())) { + @Override + public void onError(String message, int code) { + super.onError(message, code); + Logger.d(TAG, "leave station error: " + message); + } + + @Override + public void onError(Throwable e) { + super.onError(e); + Logger.e(TAG,e,"leave station exception"); + } + }); + + + if (mView != null) { + mView.refreshBusStations(stationList); + } + } + + private void refreshCurrentStation() { + currentStationIndex = 0; + for (OchBusStation station : stationList) { + // 如果数据表发生更新,获取当前所在车站 + if (station.getIsCurrentSite() == STATION_STATUS_STOPED || station.getIsCurrentSite() == STATION_STATUS_LEAVING) { + // 处于停靠或驶离时,是当前车站 + break; + } + currentStationIndex++; + } + } + + @Override + public void onArriveAt(AdasOCHData data) { + // 当前站改为IDLE,下一站改为STATION_STATUS_STOPED,currentStationIndex增加1 + stationList.get(currentStationIndex++).setIsCurrentSite(STATION_STATUS_IDLE); + stationList.get(currentStationIndex).setIsCurrentSite(STATION_STATUS_STOPED); + if (mView != null) { + mView.refreshBusStations(stationList); + } + } + + private void travelOver(){ + if (currentStationIndex >= stationList.size()) { + Logger.e(TAG, "index out of station list"); + return; + } + // 始发站改为Stoped,其他站改为Idle + stationList.get(currentStationIndex).setIsCurrentSite(STATION_STATUS_IDLE); + currentStationIndex = 0; + stationList.get(currentStationIndex).setIsCurrentSite(STATION_STATUS_STOPED); + if (mView != null) { + mView.refreshBusStations(stationList); + } + } } diff --git a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml index d51a3e453d..7bc5f71ee0 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml @@ -1,30 +1,42 @@ + android:layout_height="match_parent">