diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/constant/PathConfig.java b/baselib/src/main/java/com/tenlionsoft/baselib/constant/PathConfig.java index 3e1c843..7f6f53d 100755 --- a/baselib/src/main/java/com/tenlionsoft/baselib/constant/PathConfig.java +++ b/baselib/src/main/java/com/tenlionsoft/baselib/constant/PathConfig.java @@ -27,6 +27,7 @@ public class PathConfig { public static final String SESSION_ID = "sessionId"; public static final int MSG_REGISTER = 1000;//注册socket public static final int MSG_TYPE_TEXT = 2001;//聊天消息 文本信息 + public static final int MSG_TYPE_POINT = 11001;//发送定位信息 public static final int MSG_NOTICE = 3001;//系统通知 public static final int MSG_NOTICE_TARGET = 3003;//系统带参数的通知 public static final int MSG_TYPE_STATE = 9001;//消息发送的状态 @@ -159,7 +160,7 @@ public class PathConfig { public static final String USER_TYPE_N = "bc405346-8714-4ded-89ac-9cc4d755f66a"; public static final String USER_TYPE_X = "25affe67-134c-4a32-ba41-64b0cfedc782"; // public static final String APP_VERSION_ID = "f311fd32-cd36-45a1-9652-599d5f2c2d4f";/*正式App下载码*/ - public static final String APP_VERSION_ID = "c16826e7-8cfb-4db1-8844-09d2be697bc7";/*测试App下载码*/ + public static final String APP_VERSION_ID = "4f75940c-930f-4576-ae0b-b8f699aa5bdc";/*测试App下载码*/ public static final String NEWS_ID = "f497904b-7727-4832-891c-604c36ae4167";//文化动态ID public static final String NEWS_SHOW_ID = "f1d5d313-f728-4dda-9843-1116d97e17b0";//展览展示ID @@ -193,7 +194,8 @@ public class PathConfig { public static final double LA = 41.000587;//纬度 public static final double LO = 113.138723;//经度 //百度定位city-code - public static final String CITY_BAIDU_CODE = "168";//乌兰察布市 +// public static final String CITY_BAIDU_CODE = "168";//乌兰察布市 + public static final String CITY_BAIDU_CODE = "321";//呼和浩特市 public static final String DEFAULT_AREA_1 = "99537";//默认一级地区 内蒙古 public static final String DEFAULT_AREA_2 = "110889";//默认二级地区 乌兰察布 @@ -314,6 +316,8 @@ public class PathConfig { public static final String PATH_MODULE_COMMON_ACTIVITY_SEL_DEPT = "/modulecommon/activity/chooseDept";//部门选择接口 public static final String PATH_MODULE_COMMON_ACTIVITY_SEL_PERSON = "/modulecommon/activity/choosePerson";//人员选择 public static final String PATH_MODULE_COMMON_ACTIVITY_INCIDENT_LOG = "/modulecommon/activity/incidentLog";//事件日志 + + public static final String PATH_MODULE_COMMON_ACTIVITY_STATISTICS = "/modulecommon/activity/statistics";//统计分析 //======================网格员================================================== //小区 public static final String PATH_MODULE_GRID_ACTIVITY_COMMUNITY_MANAGE = "/modulegrid/activity/communityManage";//小区管理 @@ -496,6 +500,7 @@ public class PathConfig { public static final String PATH_MODULE_GRID_ACTIVITY_INCIDENT_CHECK_LIST = "/modulegrid/activity/incidentCheckList";//事件核查 public static final String PATH_MODULE_GRID_ACTIVITY_INCIDENT_CHECK_DETAIL = "/modulegrid/activity/incidentCheckDetail";//事件核查详情 + public static final String PATH_MODULE_GRID_ACTIVITY_WORK_LOCUS = "/modulegrid/activity/locusWork";//工作轨迹 /*=========================================中心端============================================*/ public static final String PATH_MODULE_COMMAND_ACTIVITY_INCIDENT_ACCEPT_LIST = "/modulecommand/activity/incidentAcceptList";//事件受理列表 public static final String PATH_MODULE_COMMAND_ACTIVITY_INCIDENT_ACCEPT_DETAIL = "/modulecommand/activity/incidentAcceptDetail";//事件受理 diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/core/beans/SaveLocationBean.java b/baselib/src/main/java/com/tenlionsoft/baselib/core/beans/SaveLocationBean.java new file mode 100644 index 0000000..1fd810b --- /dev/null +++ b/baselib/src/main/java/com/tenlionsoft/baselib/core/beans/SaveLocationBean.java @@ -0,0 +1,70 @@ +package com.tenlionsoft.baselib.core.beans; + +/** + * 作者: adam + * 日期: 2021/10/29 - 4:56 下午 + * 邮箱: itgaojian@163.com + * 描述: + */ +public class SaveLocationBean { +// @CheckEmptyAnnotation(name = "用户经度") + private String userLng; +// @CheckEmptyAnnotation(name = "用户维度") + private String userLat; +// @CheckNumberAnnotation(name = "是否越界") + private Integer isOverstep; +// @CheckEmptyAnnotation(name = "创建人") + private String creator; +// @CheckEmptyAnnotation(name = "用户名") + private String userUsername; +// @CheckEmptyAnnotation(name = "昵称") + private String userName; + + public String getUserLng() { + return userLng; + } + + public void setUserLng(String userLng) { + this.userLng = userLng; + } + + public String getUserLat() { + return userLat; + } + + public void setUserLat(String userLat) { + this.userLat = userLat; + } + + public Integer getIsOverstep() { + return isOverstep; + } + + public void setIsOverstep(Integer isOverstep) { + this.isOverstep = isOverstep; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getUserUsername() { + return userUsername; + } + + public void setUserUsername(String userUsername) { + this.userUsername = userUsername; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } +} diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/core/retrofit_net/BaseUrlApi.java b/baselib/src/main/java/com/tenlionsoft/baselib/core/retrofit_net/BaseUrlApi.java index cd328f8..1c319a7 100755 --- a/baselib/src/main/java/com/tenlionsoft/baselib/core/retrofit_net/BaseUrlApi.java +++ b/baselib/src/main/java/com/tenlionsoft/baselib/core/retrofit_net/BaseUrlApi.java @@ -10,7 +10,7 @@ import com.tenlionsoft.baselib.constant.PathConfig; public class BaseUrlApi { // public static final String IP = "http://192.168.0.109:8080/";/* 正式IP */ - public static final String IP = "http://192.168.0.103:7011/";/* 正式IP */ + public static final String IP = "http://192.168.0.120:8080/";/* 正式IP */ public static final String SYS_USERCENTER = "usercenter/"; public static final String SYS_POPULATION = "population/";/*人口系统*/ public static final String SYS_CASE = "case/";/*事件部件*/ @@ -19,7 +19,7 @@ public class BaseUrlApi { public static final String SYS_TASK = "systemtask/";/*任务系统*/ public static final String TEMP_IP = "http://192.168.0.120:8080/"; - public static final String BASE_MAIN_IP = IP + SYS_USERCENTER; + public static final String BASE_MAIN_IP = IP + SYS_CASE; public static final String BASE_CASE_IP = IP + SYS_CASE; public static final String BASE_SECURITY_IP = IP + SYS_SECURITY; public static final String BASE_HOUSE_IP = IP + SYS_HOUSE; @@ -27,7 +27,7 @@ public class BaseUrlApi { public static final String BASE_TASK_IP = IP + SYS_TASK; public static final String BASE_URL = BASE_MAIN_IP;//基础URL - public static final String SOCKET_IP = "http://192.168.0.120:8080/websocket";/*SocketIP*/ + public static final String SOCKET_IP = "http://192.168.0.120:8081/websocket";/*SocketIP*/ //地图页面展示类型 diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/utils/TimeUtils.java b/baselib/src/main/java/com/tenlionsoft/baselib/utils/TimeUtils.java index aeefa6f..2e70461 100755 --- a/baselib/src/main/java/com/tenlionsoft/baselib/utils/TimeUtils.java +++ b/baselib/src/main/java/com/tenlionsoft/baselib/utils/TimeUtils.java @@ -117,6 +117,12 @@ public final class TimeUtils { return format.format(date); } + public static String getCurrentDate() { + Date date = new Date(); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + return format.format(date); + } + /** * 获取当前时间 * diff --git a/chatmodule/src/main/java/com/tengshisoft/chatmodule/keeplive/services/BusinessService.java b/chatmodule/src/main/java/com/tengshisoft/chatmodule/keeplive/services/BusinessService.java index f31a7c7..3fda53f 100644 --- a/chatmodule/src/main/java/com/tengshisoft/chatmodule/keeplive/services/BusinessService.java +++ b/chatmodule/src/main/java/com/tengshisoft/chatmodule/keeplive/services/BusinessService.java @@ -19,11 +19,15 @@ import com.baidu.location.BDAbstractLocationListener; import com.baidu.location.BDLocation; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; +import com.baidu.mapapi.model.LatLng; +import com.baidu.mapapi.utils.SpatialRelationUtil; import com.google.gson.Gson; +import com.tengshisoft.chatmodule.adapter.UserContactAdapter; import com.tenlionsoft.baselib.constant.GlobalProvider; import com.tenlionsoft.baselib.constant.PathConfig; import com.tenlionsoft.baselib.core.beans.BaseSuccessBean; import com.tenlionsoft.baselib.core.beans.MessageBean; +import com.tenlionsoft.baselib.core.beans.SaveLocationBean; import com.tenlionsoft.baselib.core.retrofit_net.BaseUrlApi; import com.tenlionsoft.baselib.core.retrofit_net.RetrofitManager; import com.tenlionsoft.baselib.core.retrofit_net.api.BaseApiService; @@ -43,6 +47,7 @@ import org.json.JSONObject; import java.io.File; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import androidx.annotation.Nullable; @@ -74,6 +79,8 @@ public class BusinessService extends Service { private boolean isUpload = false; private long mUploadPointTime; private PunchTimeReceiver mReceiver; + private int mMaxPoint = 2; + private int mConnectCount = 1; @Override public void onCreate() { @@ -118,6 +125,7 @@ public class BusinessService extends Service { @Override public void onNext(BaseSuccessBean baseSuccessBean) { + mConnectCount = 1; if (!TextUtils.isEmpty(baseSuccessBean.getData())) { GlobalProvider.save(BusinessService.this, PathConfig.SESSION_ID, baseSuccessBean.getData()); //开启websocket @@ -129,7 +137,10 @@ public class BusinessService extends Service { @Override public void onError(Throwable e) { - //TODO startSocketService(); + ++mConnectCount; + if (mConnectCount < 5) { + startSocketService(); + } } @Override @@ -293,17 +304,116 @@ public class BusinessService extends Service { mLocationClient.start(); } + /*获取到的定位信息*/ private class MyLocationListener extends BDAbstractLocationListener { @Override public void onReceiveLocation(BDLocation bdLocation) { if (bdLocation != null && bdLocation.getLatitude() != 0 && bdLocation.getLongitude() != 0) { if (bdLocation.getLongitude() != Double.MIN_VALUE && bdLocation.getLongitude() != Double.MIN_VALUE) { - //TODO 获取到的定位信息 sendLocationCurrent(bdLocation); + addPointToList(bdLocation); } } } + + private void addPointToList(BDLocation bdLocation) { + if (null != bdLocation) { + boolean isLegal = checkSinglePoint(bdLocation); + if (isLegal) { + if (mTempList.size() >= mMaxPoint) { + checkPoints(); + } else { + mTempList.add(bdLocation); + } + } + } + } + } + + /** + * 根据定位精度取最小精度 + */ + private void checkPoints() { + Collections.sort(mTempList, (o1, o2) -> { + if (o1.getRadius() > o2.getRadius()) { + return 1; + } else if (o1.getRadius() < o2.getRadius()) { + return -1; + } else { + return 0; + } + }); + buildUploadPoint(); + } + + /** + * 构建定位上传参数 + */ + private void buildUploadPoint() { + boolean wsConnected = mWsManager.isWsConnected(); + if (wsConnected) { + SaveLocationBean bean = new SaveLocationBean(); + bean.setCreator(UserLgUtils.getUserId()); + bean.setUserLat(mTempList.get(0).getLatitude() + ""); + bean.setUserLng(mTempList.get(0).getLongitude() + ""); + bean.setIsOverstep(0); + bean.setUserName(UserLgUtils.getName()); + bean.setUserUsername(UserLgUtils.getUserName()); + Gson gson = new Gson(); + String s = gson.toJson(bean); + sendLocationPoint(s); + } + } + + /** + * socket上报定位 + */ + private void sendLocationPoint(String point) { + AppSocketMessage msgBean = new AppSocketMessage(); + msgBean.setType(PathConfig.MSG_TYPE_POINT); + msgBean.setTo("system"); + msgBean.setFrom(UserLgUtils.getUserId()); + msgBean.setBody(point); + msgBean.setId(System.currentTimeMillis() + ""); + Gson gson = new Gson(); + String s = gson.toJson(msgBean); + mWsManager.sendMessage(s); + mTempList.clear(); + } + + /** + * 校验定位点的合法性 + */ + private boolean checkSinglePoint(BDLocation bdLocation) { + boolean isLegal = false; + if (isFirst) { + if (PathConfig.CITY_BAIDU_CODE.equals(bdLocation.getCityCode())) { + isLegal = true; + } else { + isLegal = false; + } + } else { + if (PathConfig.CITY_BAIDU_CODE.equals(bdLocation.getCityCode()) && bdLocation.getRadius() <= mPrecision) { + if (mCurrentLocation != null) { + LatLng latLng1 = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude()); + LatLng latLng2 = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude()); + boolean circleContainsPoint = SpatialRelationUtil.isCircleContainsPoint(latLng1, 200, latLng2); + if (circleContainsPoint) { + mCurrentLocation = bdLocation; + isLegal = true; + } else { + isLegal = false; + } + } else { + mCurrentLocation = bdLocation; + isLegal = true; + } + } else { + isLegal = false; + } + } + return isLegal; } /** @@ -313,11 +423,11 @@ public class BusinessService extends Service { */ private void sendLocationCurrent(BDLocation bdLocation) { if (bdLocation.getRadius() <= mPrecision) { - //PathConfig.DEFAULT_CITY_CODE.equals(bdLocation.getCityCode()) && if (bdLocation.getRadius() <= mPrecision) { Intent mIntent = new Intent(PathConfig.ACTION_LOCATION_MESSAGE); mIntent.putExtra("data", bdLocation); sendBroadcast(mIntent); + } } } @@ -451,6 +561,7 @@ public class BusinessService extends Service { mWsManager.sendMessage(s); } + /** * 发送socket已办 */ diff --git a/commonmodule/src/main/AndroidManifest.xml b/commonmodule/src/main/AndroidManifest.xml index 033ca32..31a7440 100644 --- a/commonmodule/src/main/AndroidManifest.xml +++ b/commonmodule/src/main/AndroidManifest.xml @@ -3,7 +3,8 @@ package="com.tengshisoft.commonmodule"> - + + diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/activitys/department/ChooseDeptActivity.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/activitys/department/ChooseDeptActivity.java index 22ff8d2..3a0a6aa 100644 --- a/commonmodule/src/main/java/com/tengshisoft/commonmodule/activitys/department/ChooseDeptActivity.java +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/activitys/department/ChooseDeptActivity.java @@ -18,6 +18,7 @@ import com.tengshisoft.commonmodule.R2; import com.tengshisoft.commonmodule.adapters.ChooseDeptAdapter; import com.tengshisoft.commonmodule.adapters.SelDeptAdapter; import com.tengshisoft.commonmodule.beans.DepartmentListBean; +import com.tengshisoft.commonmodule.beans.DistributionDeptBean; import com.tengshisoft.commonmodule.nets.Apis; import com.tenlionsoft.baselib.constant.PathConfig; import com.tenlionsoft.baselib.core.retrofit_net.RetrofitManager; @@ -74,6 +75,7 @@ public class ChooseDeptActivity extends BaseActivity { private List mDepartments = new ArrayList<>(); private SelDeptAdapter mSelAdapter; private ChooseDeptAdapter mAdapter; + private String mTaskId; @Override @@ -84,20 +86,60 @@ public class ChooseDeptActivity extends BaseActivity { @Override public void initData() { mBind = ButterKnife.bind(this); - mDeptId = getIntent().getStringExtra("deptId"); - mDeptName = getIntent().getStringExtra("deptName"); + mTaskId = getIntent().getStringExtra("taskId"); + mTvBaseTitle.setText("选择部门"); mTvPublish.setVisibility(View.VISIBLE); mTvPublish.setText("确定"); mTvPublish.setOnClickListener(v -> doConfirm()); - if (TextUtils.isEmpty(mDeptId)) { + if (TextUtils.isEmpty(mTaskId)) { ToastUtils.show("数据有误"); finish(); } else { - initViews(); + getDepartByTaskId(); } } + /** + * 根据TaskId获取部门信息 + */ + private void getDepartByTaskId() { + RetrofitManager.getInstance() + .create(Apis.class) + .getDeptByTaskId(mTaskId, UserLgUtils.getToken()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + } + + @Override + public void onNext(@NonNull DistributionDeptBean distributionDeptBean) { + if (!TextUtils.isEmpty(distributionDeptBean.getUserDeptId())) { + mDeptId = distributionDeptBean.getUserDeptId(); + mDeptName = distributionDeptBean.getUserDeptName(); + initViews(); + } else { + refreshView(STATE_LOAD_EMPTY); + } + } + + @Override + public void onError(@NonNull Throwable e) { + refreshView(STATE_LOAD_ERROR); + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + + } + /** * 确认选择 */ diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/activitys/logs/StatisticsActivity.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/activitys/logs/StatisticsActivity.java new file mode 100644 index 0000000..d899990 --- /dev/null +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/activitys/logs/StatisticsActivity.java @@ -0,0 +1,32 @@ +package com.tengshisoft.commonmodule.activitys.logs; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.tengshisoft.commonmodule.R; +import com.tenlionsoft.baselib.constant.PathConfig; +import com.tenlionsoft.baselib.core.widget.base.BaseActivity; + +import butterknife.ButterKnife; +import butterknife.Unbinder; + +/** + * 作者: Adam + * 日期: 2021年10月29日16:43:03 + * 邮箱: itgaojian@163.com + * 描述: 统计分析 + */ +@Route(path = PathConfig.PATH_MODULE_COMMON_ACTIVITY_STATISTICS) +public class StatisticsActivity extends BaseActivity { + + + private Unbinder mBind; + + @Override + protected int setLayoutId() { + return R.layout.activity_statistics; + } + + @Override + public void initData() { + mBind = ButterKnife.bind(this); + } +} \ No newline at end of file diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/adapters/LocusStepAdapter.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/adapters/LocusStepAdapter.java new file mode 100755 index 0000000..bb37ee6 --- /dev/null +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/adapters/LocusStepAdapter.java @@ -0,0 +1,124 @@ +package com.tengshisoft.commonmodule.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.tengshisoft.commonmodule.R; +import com.tengshisoft.commonmodule.beans.LocusTextBean; +import com.tengshisoft.commonmodule.holders.LocusOfflineHolder; +import com.tengshisoft.commonmodule.holders.LocusOnlineHolder; +import com.tengshisoft.commonmodule.holders.LocusStartHolder; +import com.tengshisoft.commonmodule.holders.LocusStayHolder; +import com.tengshisoft.commonmodule.holders.LocusStopHolder; +import com.tenlionsoft.baselib.core.widget.base.BaseRecyclerAdapter; +import com.tenlionsoft.baselib.utils.TimeUtils; + +import java.util.List; + +import androidx.recyclerview.widget.RecyclerView; + +/** + * 作者: Adam + * 日期: 2019/7/31 - 10:30 + * 邮箱: itgaojian@163.com + * 描述: + */ +public class LocusStepAdapter extends BaseRecyclerAdapter { + public static final int TYPE_START = 121;//开始 + public static final int TYPE_ONLINE = 122;//在线,移动 + public static final int TYPE_OFFLINE = 123;//离线 + public static final int TYPE_STAY = 124;//停留 + public static final int TYPE_STOP = 125;//停止 + public static final int TYPE_UNUSUAL = 126;//异常 + + public LocusStepAdapter(Context ctx, List list) { + super(ctx, list); + } + + @Override + public RecyclerView.ViewHolder createHolder(ViewGroup parent, int viewType) { + RecyclerView.ViewHolder holder = null; + View itemView = null; + switch (viewType) { + case TYPE_START: + itemView = LayoutInflater.from(mContext).inflate(R.layout.item_step_start, parent, false); + holder = new LocusStartHolder(itemView); + break; + case TYPE_ONLINE: + itemView = LayoutInflater.from(mContext).inflate(R.layout.item_step_online, parent, false); + holder = new LocusOnlineHolder(itemView); + break; + case TYPE_OFFLINE: + itemView = LayoutInflater.from(mContext).inflate(R.layout.item_step_offline, parent, false); + holder = new LocusOfflineHolder(itemView); + break; + case TYPE_STAY: + itemView = LayoutInflater.from(mContext).inflate(R.layout.item_step_stay, parent, false); + holder = new LocusStayHolder(itemView); + break; + case TYPE_STOP: + itemView = LayoutInflater.from(mContext).inflate(R.layout.item_step_stop, parent, false); + holder = new LocusStopHolder(itemView); + break; + case TYPE_UNUSUAL: + itemView = LayoutInflater.from(mContext).inflate(R.layout.item_step_unusual, parent, false); + holder = new LocusStopHolder(itemView); + break; + default: + itemView = LayoutInflater.from(mContext).inflate(R.layout.item_step_offline, parent, false); + holder = new LocusOfflineHolder(itemView); + break; + } + return holder; + } + + @Override + public int getItemViewType(int position) { + return mData.get(position).getType(); + } + + @Override + public void bindHolder(RecyclerView.ViewHolder myHolder, int i) { + int itemViewType = getItemViewType(i); + String time = ""; + if (mData.get(i).getSecond() > 0) { + time = TimeUtils.secToTime(mData.get(i).getSecond()); + } else { + time = "0"; + } + switch (itemViewType) { + case TYPE_START: + ((LocusStartHolder) myHolder).mTvTime.setText(mData.get(i).getTime()); + ((LocusStartHolder) myHolder).mTvAddress.setText(mData.get(i).getAddress()); + break; + case TYPE_ONLINE: + ((LocusOnlineHolder) myHolder).mTvTime.setText(mData.get(i).getTime()); + ((LocusOnlineHolder) myHolder).mTvAddress.setText(mData.get(i).getAddress()); + ((LocusOnlineHolder) myHolder).mTvStateTime.setText("移动时间:" + time); + break; + case TYPE_OFFLINE: + ((LocusOfflineHolder) myHolder).mTvTime.setText(mData.get(i).getTime()); + ((LocusOfflineHolder) myHolder).mTvAddress.setText(mData.get(i).getAddress()); + ((LocusOfflineHolder) myHolder).mTvStateTime.setText("断联时间:" + time); + break; + case TYPE_STAY: + ((LocusStayHolder) myHolder).mTvTime.setText(mData.get(i).getTime()); + ((LocusStayHolder) myHolder).mTvAddress.setText(mData.get(i).getAddress()); + ((LocusStayHolder) myHolder).mTvStateTime.setText("等待时间:" + time); + break; + case TYPE_STOP: + ((LocusStopHolder) myHolder).mTvTime.setText(mData.get(i).getTime()); + ((LocusStopHolder) myHolder).mTvAddress.setText(mData.get(i).getAddress()); + break; + case TYPE_UNUSUAL: + ((LocusStopHolder) myHolder).mTvTime.setText(mData.get(i).getTime()); + ((LocusStopHolder) myHolder).mTvAddress.setText(mData.get(i).getAddress()); + ((LocusStopHolder) myHolder).mTvStateTime.setText("异常时间:" + time); + break; + } + + } +} + diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/DistributionDeptBean.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/DistributionDeptBean.java new file mode 100644 index 0000000..0954d86 --- /dev/null +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/DistributionDeptBean.java @@ -0,0 +1,155 @@ +package com.tengshisoft.commonmodule.beans; + +/** + * 作者: adam + * 日期: 2021/10/30 - 2:36 下午 + * 邮箱: itgaojian@163.com + * 描述: + */ +public class DistributionDeptBean { + + private String businessId; + private String creator; + private String creatorName; + private String distributionId; + private String distributionUserId; + private String gmtCreate; + private String reportId; + private String taskId; + private String userDeptId; + private String userDeptName; + private String userId; + private String userName; + private String userStatus; + private String userStatusText; + private String userType; + private String userTypeText; + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getCreatorName() { + return creatorName; + } + + public void setCreatorName(String creatorName) { + this.creatorName = creatorName; + } + + public String getDistributionId() { + return distributionId; + } + + public void setDistributionId(String distributionId) { + this.distributionId = distributionId; + } + + public String getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(String distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public String getGmtCreate() { + return gmtCreate; + } + + public void setGmtCreate(String gmtCreate) { + this.gmtCreate = gmtCreate; + } + + public String getReportId() { + return reportId; + } + + public void setReportId(String reportId) { + this.reportId = reportId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getUserDeptId() { + return userDeptId; + } + + public void setUserDeptId(String userDeptId) { + this.userDeptId = userDeptId; + } + + public String getUserDeptName() { + return userDeptName; + } + + public void setUserDeptName(String userDeptName) { + this.userDeptName = userDeptName; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getUserStatus() { + return userStatus; + } + + public void setUserStatus(String userStatus) { + this.userStatus = userStatus; + } + + public String getUserStatusText() { + return userStatusText; + } + + public void setUserStatusText(String userStatusText) { + this.userStatusText = userStatusText; + } + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public String getUserTypeText() { + return userTypeText; + } + + public void setUserTypeText(String userTypeText) { + this.userTypeText = userTypeText; + } +} diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/DrawMapLineBean.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/DrawMapLineBean.java new file mode 100755 index 0000000..ec958ba --- /dev/null +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/DrawMapLineBean.java @@ -0,0 +1,48 @@ +package com.tengshisoft.commonmodule.beans; + +import com.baidu.mapapi.model.LatLng; + +/** + * 作者: Adam + * 日期: 2019/8/29 - 17:34 + * 邮箱: itgaojian@163.com + * 描述: type 线的类型 12:移动 13:等待 14:异常 + */ +public class DrawMapLineBean { + private int type;//线的类型 + private LatLng onePoint; + private LatLng twoPoint; + private Integer lineColor; + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public LatLng getOnePoint() { + return onePoint; + } + + public void setOnePoint(LatLng onePoint) { + this.onePoint = onePoint; + } + + public LatLng getTwoPoint() { + return twoPoint; + } + + public void setTwoPoint(LatLng twoPoint) { + this.twoPoint = twoPoint; + } + + public Integer getLineColor() { + return lineColor; + } + + public void setLineColor(Integer lineColor) { + this.lineColor = lineColor; + } +} diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/IncidentRebackBean.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/IncidentRebackBean.java index 65316cc..545ef7d 100644 --- a/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/IncidentRebackBean.java +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/IncidentRebackBean.java @@ -7,17 +7,16 @@ package com.tengshisoft.commonmodule.beans; * 描述: */ public class IncidentRebackBean { - - private String dispatchId; + private String reportId; private String explain; private String taskId; - public String getDispatchId() { - return dispatchId; + public String getReportId() { + return reportId; } - public void setDispatchId(String dispatchId) { - this.dispatchId = dispatchId; + public void setReportId(String reportId) { + this.reportId = reportId; } public String getExplain() { diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/LocationPointBean.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/LocationPointBean.java new file mode 100644 index 0000000..dc16394 --- /dev/null +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/LocationPointBean.java @@ -0,0 +1,93 @@ +package com.tengshisoft.commonmodule.beans; + +/** + * 作者: adam + * 日期: 2021/10/29 - 6:05 下午 + * 邮箱: itgaojian@163.com + * 描述:用户轨迹点 + */ +public class LocationPointBean implements Comparable { + + private String creator; + private String gmtCreate; + private int isOverstep; + private String userLat; + private String userLng; + private String userLocationId; + private String userName; + private String userUsername; + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getGmtCreate() { + return gmtCreate; + } + + public void setGmtCreate(String gmtCreate) { + this.gmtCreate = gmtCreate; + } + + public int getIsOverstep() { + return isOverstep; + } + + public void setIsOverstep(int isOverstep) { + this.isOverstep = isOverstep; + } + + public String getUserLat() { + return userLat; + } + + public void setUserLat(String userLat) { + this.userLat = userLat; + } + + public String getUserLng() { + return userLng; + } + + public void setUserLng(String userLng) { + this.userLng = userLng; + } + + public String getUserLocationId() { + return userLocationId; + } + + public void setUserLocationId(String userLocationId) { + this.userLocationId = userLocationId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getUserUsername() { + return userUsername; + } + + public void setUserUsername(String userUsername) { + this.userUsername = userUsername; + } + @Override + public int compareTo(LocationPointBean o) { + if (gmtCreate.compareTo(o.getGmtCreate()) > 0) { + return 1; + } else if (gmtCreate.compareTo(o.getGmtCreate()) < 0) { + return -1; + } else { + return 0; + } + } +} diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/LocusTextBean.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/LocusTextBean.java new file mode 100755 index 0000000..b0f69c6 --- /dev/null +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/LocusTextBean.java @@ -0,0 +1,94 @@ +package com.tengshisoft.commonmodule.beans; + +/** + * 作者: Adam + * 日期: 2019/7/31 - 11:32 + * 邮箱: itgaojian@163.com + * 描述: + */ +public class LocusTextBean implements Comparable { + private String time;//时间 + private String stateTime; + private String address;//地址 + private int type;//类型 + private String createTime; + private long second; + private int order;//排序 + + public long getSecond() { + return second; + } + + public void setSecond(long second) { + this.second = second; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + private boolean isDelete; + + public boolean isDelete() { + return isDelete; + } + + public void setDelete(boolean delete) { + isDelete = delete; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getStateTime() { + return stateTime; + } + + public void setStateTime(String stateTime) { + this.stateTime = stateTime; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } + + @Override + public int compareTo(LocusTextBean o) { + if (getOrder() > o.getOrder()) { + return -1; + } else if (getOrder() < o.getOrder()) { + return 1; + } else { + return 0; + } + } +} diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/SaveHandleIncidentBean.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/SaveHandleIncidentBean.java index f467913..5fe0aaf 100644 --- a/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/SaveHandleIncidentBean.java +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/beans/SaveHandleIncidentBean.java @@ -8,17 +8,17 @@ package com.tengshisoft.commonmodule.beans; */ public class SaveHandleIncidentBean { - private String dispatchId; private String handlePhotos; private String handleSummary; private String taskId; + private String reportId; - public String getDispatchId() { - return dispatchId; + public String getReportId() { + return reportId; } - public void setDispatchId(String dispatchId) { - this.dispatchId = dispatchId; + public void setReportId(String reportId) { + this.reportId = reportId; } public String getHandlePhotos() { diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusOfflineHolder.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusOfflineHolder.java new file mode 100755 index 0000000..9ce88d6 --- /dev/null +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusOfflineHolder.java @@ -0,0 +1,28 @@ +package com.tengshisoft.commonmodule.holders; + + +import android.view.View; +import android.widget.TextView; + +import com.tengshisoft.commonmodule.R; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +/** + * 作者: Adam + * 日期: 2019/7/31 - 11:35 + * 邮箱: itgaojian@163.com + * 描述: 工作轨迹-离线item + */ +public class LocusOfflineHolder extends RecyclerView.ViewHolder { + public TextView mTvTime; + public TextView mTvStateTime; + public TextView mTvAddress; + public LocusOfflineHolder(@NonNull View itemView) { + super(itemView); + mTvTime = itemView.findViewById(R.id.tv_time); + mTvStateTime = itemView.findViewById(R.id.tv_state_time); + mTvAddress = itemView.findViewById(R.id.tv_address); + } +} diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusOnlineHolder.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusOnlineHolder.java new file mode 100755 index 0000000..663f467 --- /dev/null +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusOnlineHolder.java @@ -0,0 +1,28 @@ +package com.tengshisoft.commonmodule.holders; + + +import android.view.View; +import android.widget.TextView; + +import com.tengshisoft.commonmodule.R; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +/** + * 作者: Adam + * 日期: 2019/7/31 - 11:35 + * 邮箱: itgaojian@163.com + * 描述: 工作轨迹-在线item + */ +public class LocusOnlineHolder extends RecyclerView.ViewHolder { + public TextView mTvTime; + public TextView mTvStateTime; + public TextView mTvAddress; + public LocusOnlineHolder(@NonNull View itemView) { + super(itemView); + mTvTime = itemView.findViewById(R.id.tv_time); + mTvStateTime = itemView.findViewById(R.id.tv_state_time); + mTvAddress = itemView.findViewById(R.id.tv_address); + } +} diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusStartHolder.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusStartHolder.java new file mode 100755 index 0000000..c0c30e5 --- /dev/null +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusStartHolder.java @@ -0,0 +1,28 @@ +package com.tengshisoft.commonmodule.holders; + + +import android.view.View; +import android.widget.TextView; + +import com.tengshisoft.commonmodule.R; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +/** + * 作者: Adam + * 日期: 2019/7/31 - 11:35 + * 邮箱: itgaojian@163.com + * 描述: 工作轨迹-开始item + */ +public class LocusStartHolder extends RecyclerView.ViewHolder { + public TextView mTvTime; + public TextView mTvStateTime; + public TextView mTvAddress; + + public LocusStartHolder(@NonNull View itemView) { + super(itemView); + mTvTime = itemView.findViewById(R.id.tv_time); + mTvAddress = itemView.findViewById(R.id.tv_address); + } +} diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusStayHolder.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusStayHolder.java new file mode 100755 index 0000000..c1ad03e --- /dev/null +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusStayHolder.java @@ -0,0 +1,28 @@ +package com.tengshisoft.commonmodule.holders; + + +import android.view.View; +import android.widget.TextView; + +import com.tengshisoft.commonmodule.R; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +/** + * 作者: Adam + * 日期: 2019/7/31 - 11:35 + * 邮箱: itgaojian@163.com + * 描述: 工作轨迹-停留item + */ +public class LocusStayHolder extends RecyclerView.ViewHolder { + public TextView mTvTime; + public TextView mTvStateTime; + public TextView mTvAddress; + public LocusStayHolder(@NonNull View itemView) { + super(itemView); + mTvTime = itemView.findViewById(R.id.tv_time); + mTvStateTime = itemView.findViewById(R.id.tv_state_time); + mTvAddress = itemView.findViewById(R.id.tv_address); + } +} diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusStopHolder.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusStopHolder.java new file mode 100755 index 0000000..ddbfff6 --- /dev/null +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/holders/LocusStopHolder.java @@ -0,0 +1,28 @@ +package com.tengshisoft.commonmodule.holders; + + +import android.view.View; +import android.widget.TextView; + +import com.tengshisoft.commonmodule.R; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +/** + * 作者: Adam + * 日期: 2019/7/31 - 11:35 + * 邮箱: itgaojian@163.com + * 描述: 工作轨迹-停止item + */ +public class LocusStopHolder extends RecyclerView.ViewHolder { + public TextView mTvTime; + public TextView mTvStateTime; + public TextView mTvAddress; + public LocusStopHolder(@NonNull View itemView) { + super(itemView); + mTvTime = itemView.findViewById(R.id.tv_time); + mTvStateTime = itemView.findViewById(R.id.tv_state_time); + mTvAddress = itemView.findViewById(R.id.tv_address); + } +} diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/nets/Apis.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/nets/Apis.java index 0e87ca6..d3c4316 100644 --- a/commonmodule/src/main/java/com/tengshisoft/commonmodule/nets/Apis.java +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/nets/Apis.java @@ -28,6 +28,7 @@ import com.tengshisoft.commonmodule.beans.CorrectDetailBean; import com.tengshisoft.commonmodule.beans.DepartmentBean; import com.tengshisoft.commonmodule.beans.DepartmentListBean; import com.tengshisoft.commonmodule.beans.DispatchDetailBean; +import com.tengshisoft.commonmodule.beans.DistributionDeptBean; import com.tengshisoft.commonmodule.beans.DrugDetailBean; import com.tengshisoft.commonmodule.beans.ExpressDetailBean; import com.tengshisoft.commonmodule.beans.ExpressListBean; @@ -45,6 +46,7 @@ import com.tengshisoft.commonmodule.beans.IncidentListBean; import com.tengshisoft.commonmodule.beans.IncidentLogBean; import com.tengshisoft.commonmodule.beans.KeyAreaDetailBean; import com.tengshisoft.commonmodule.beans.KeyAreaListBean; +import com.tengshisoft.commonmodule.beans.LocationPointBean; import com.tengshisoft.commonmodule.beans.MigrantDetailBean; import com.tengshisoft.commonmodule.beans.MigrantListBean; import com.tengshisoft.commonmodule.beans.OutboundDetailBean; @@ -136,6 +138,13 @@ public interface Apis { @GET("app/dispatch/list-dispatchdepttree/{deptId}") Observable> getDeptList(@Path("deptId") String deptId, @Header("token") String token); + /** + * 根据taskid获取任务分拨部门信息 + */ + @Headers({"base_url_name:case", "Content-Type: application/json", "Accept: application/json"}) + @GET("app/dispatch/getdistributionuser-bytask/{taskId}") + Observable getDeptByTaskId(@Path("taskId") String taskId, @Header("token") String token); + /** * 根据部门Id获取部门下所有人员 */ @@ -157,6 +166,12 @@ public interface Apis { @GET("app/department/user/list-with-user") Observable> getAllUserList(@Header("token") String token); + /** + * 获取用户定位记录 + */ + @Headers({"Content-Type: application/json", "Accept: application/json"}) + @GET("app/user-realtime-location/list") + Observable> getUserLocationList(@Query("startTime") String startTime, @Query("endTime") String endTime, @Header("token") String token); /*======================================================网格员========================================================================================*/ /** @@ -1025,21 +1040,21 @@ public interface Apis { */ @Headers({"base_url_name:case", "Content-Type: application/json", "Accept: application/json"}) @GET("app/taskbase/listpage-task-dh") - Observable getIncidentHandleList(@Query("keywords") String key, @Query("page") String page, @Header("token") String token); + Observable getIncidentHandleList(@Query("keywords") String key, @Query("page") String page, @Header("token") String token); /** * 获取事件派遣详情 */ @Headers({"base_url_name:case", "Content-Type: application/json", "Accept: application/json"}) - @GET("app/dispatch/get/{dispatchId}") - Observable getDispatchDetailById(@Path("dispatchId") String id, @Header("token") String token); + @GET("app/dispatch/get-bytaskId/{taskId}") + Observable getDispatchDetailById(@Path("taskId") String id, @Header("token") String token); /** * 延期申请 */ @Headers({"base_url_name:case", "Content-Type: application/json", "Accept: application/json"}) - @POST("app/delayapply/save") - Observable doApplyDelay(@Body RequestBody body, @Header("token") String token); + @POST("app/delayapply/save/{reportId}") + Observable doApplyDelay(@Path("reportId") String reportId, @Body RequestBody body, @Header("token") String token); /** * 保存处理 @@ -1066,8 +1081,8 @@ public interface Apis { * 获取事件处理详情 */ @Headers({"base_url_name:case", "Content-Type: application/json", "Accept: application/json"}) - @GET("app/handle/get/{handleId}") - Observable getHandleDetailByHandleId(@Path("handleId") String id, @Header("token") String token); + @GET("app/handle/get-bytaskId/{taskId}") + Observable getHandleDetailByHandleId(@Path("taskId") String id, @Header("token") String token); /** * 获取事件核查列表 diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/nets/DeptApis.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/nets/DeptApis.java index 18362e5..b202b37 100644 --- a/commonmodule/src/main/java/com/tengshisoft/commonmodule/nets/DeptApis.java +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/nets/DeptApis.java @@ -30,29 +30,29 @@ public interface DeptApis { */ @Headers({"base_url_name:case", "Content-Type: application/json", "Accept: application/json"}) @GET("app/taskbase/listpage-dispatch") - Observable getIncidentDistributionList(@Query("keywords") String key, @Query("page") String page, @Header("token") String token); + Observable getIncidentDistributionList(@Query("keywords") String key, @Query("page") String page, @Header("token") String token); /** * 事件分拨-分拨确认列表 */ @Headers({"base_url_name:case", "Content-Type: application/json", "Accept: application/json"}) @GET("app/taskbase/listpage-task-as") - Observable getIncidentAcceptList(@Query("keywords") String key, @Query("page") String page, @Header("token") String token); + Observable getIncidentAcceptList(@Query("keywords") String key, @Query("page") String page, @Header("token") String token); /** * 事件分拨-确认受理 */ @Headers({"base_url_name:case", "Content-Type: application/json", "Accept: application/json"}) - @PUT("app/taskcompetebase/update-allocatesure-accept/{distributionUserId}") - Observable doIncidentAccept(@Path("distributionUserId") String id, @Body RequestBody body, @Header("token") String token); + @PUT("app/taskcompetebase/update-allocatesure-accept/{reportId}") + Observable doIncidentAccept(@Path("reportId") String id, @Body RequestBody body, @Header("token") String token); /** * 事件分拨-不予受理 */ @Headers({"base_url_name:case", "Content-Type: application/json", "Accept: application/json"}) - @PUT("app/taskcompetebase/update-allocatesure-noaccept/{distributionUserId}") - Observable doIncidentAbolish(@Path("distributionUserId") String id, @Body RequestBody body, @Header("token") String token); + @PUT("app/taskcompetebase/update-allocatesure-noaccept/{reportId}") + Observable doIncidentAbolish(@Path("reportId") String id, @Body RequestBody body, @Header("token") String token); /** * 事件派遣保存 @@ -66,19 +66,19 @@ public interface DeptApis { */ @Headers({"base_url_name:case", "Content-Type: application/json", "Accept: application/json"}) @GET("app/taskbase/listpage-task-dhe") - Observable getIncidentCheckList(@Query("keywords") String key, @Query("page") String page, @Header("token") String token); + Observable getIncidentCheckList(@Query("keywords") String key, @Query("page") String page, @Header("token") String token); /** * 事件核查通过 */ @Headers({"base_url_name:case", "Content-Type: application/json", "Accept: application/json"}) - @PUT("app/taskcompetebase/update-dispatch-he-pass/{dispatchId}") - Observable doIncidentDeptCheckPass(@Path("dispatchId") String id, @Body RequestBody body, @Header("token") String token); + @PUT("app/taskcompetebase/update-dispatch-he-pass/{reportId}") + Observable doIncidentDeptCheckPass(@Path("reportId") String id, @Body RequestBody body, @Header("token") String token); /** * 事件核查不通过 */ @Headers({"base_url_name:case", "Content-Type: application/json", "Accept: application/json"}) - @PUT("app/taskcompetebase/update-dispatch-he-pass/{dispatchId}/{handleId}") - Observable doIncidentDeptCheckUnPass(@Path("dispatchId") String id, @Path("handleId") String hId, @Body RequestBody body, @Header("token") String token); + @PUT("app/taskcompetebase/update-dispatch-he-pass/{reportId}") + Observable doIncidentDeptCheckUnPass(@Path("reportId") String id, @Body RequestBody body, @Header("token") String token); } diff --git a/commonmodule/src/main/res/drawable-xhdpi/ic_step_offline.png b/commonmodule/src/main/res/drawable-xhdpi/ic_step_offline.png new file mode 100755 index 0000000..800ee2a Binary files /dev/null and b/commonmodule/src/main/res/drawable-xhdpi/ic_step_offline.png differ diff --git a/commonmodule/src/main/res/drawable-xhdpi/ic_step_online.png b/commonmodule/src/main/res/drawable-xhdpi/ic_step_online.png new file mode 100755 index 0000000..5680210 Binary files /dev/null and b/commonmodule/src/main/res/drawable-xhdpi/ic_step_online.png differ diff --git a/commonmodule/src/main/res/drawable-xhdpi/ic_step_start.png b/commonmodule/src/main/res/drawable-xhdpi/ic_step_start.png new file mode 100755 index 0000000..e4ec224 Binary files /dev/null and b/commonmodule/src/main/res/drawable-xhdpi/ic_step_start.png differ diff --git a/commonmodule/src/main/res/drawable-xhdpi/ic_step_stay.png b/commonmodule/src/main/res/drawable-xhdpi/ic_step_stay.png new file mode 100755 index 0000000..fb37946 Binary files /dev/null and b/commonmodule/src/main/res/drawable-xhdpi/ic_step_stay.png differ diff --git a/commonmodule/src/main/res/drawable/sel_btn_submit_gray_left.xml b/commonmodule/src/main/res/drawable/sel_btn_submit_gray_left.xml new file mode 100755 index 0000000..b6ac263 --- /dev/null +++ b/commonmodule/src/main/res/drawable/sel_btn_submit_gray_left.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/drawable/sel_btn_submit_gray_right.xml b/commonmodule/src/main/res/drawable/sel_btn_submit_gray_right.xml new file mode 100755 index 0000000..7ab1709 --- /dev/null +++ b/commonmodule/src/main/res/drawable/sel_btn_submit_gray_right.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/drawable/sel_btn_text_white_black.xml b/commonmodule/src/main/res/drawable/sel_btn_text_white_black.xml new file mode 100755 index 0000000..4cda6ae --- /dev/null +++ b/commonmodule/src/main/res/drawable/sel_btn_text_white_black.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/drawable/shape_btn_left_radius_blue.xml b/commonmodule/src/main/res/drawable/shape_btn_left_radius_blue.xml new file mode 100755 index 0000000..273e141 --- /dev/null +++ b/commonmodule/src/main/res/drawable/shape_btn_left_radius_blue.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/drawable/shape_btn_left_radius_gray.xml b/commonmodule/src/main/res/drawable/shape_btn_left_radius_gray.xml new file mode 100755 index 0000000..b0b4618 --- /dev/null +++ b/commonmodule/src/main/res/drawable/shape_btn_left_radius_gray.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/drawable/shape_btn_right_radius_blue.xml b/commonmodule/src/main/res/drawable/shape_btn_right_radius_blue.xml new file mode 100755 index 0000000..b54874d --- /dev/null +++ b/commonmodule/src/main/res/drawable/shape_btn_right_radius_blue.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/drawable/shape_btn_right_radius_gray.xml b/commonmodule/src/main/res/drawable/shape_btn_right_radius_gray.xml new file mode 100755 index 0000000..281bdfc --- /dev/null +++ b/commonmodule/src/main/res/drawable/shape_btn_right_radius_gray.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/layout/activity_statistics.xml b/commonmodule/src/main/res/layout/activity_statistics.xml new file mode 100644 index 0000000..4a907c9 --- /dev/null +++ b/commonmodule/src/main/res/layout/activity_statistics.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/layout/item_step_offline.xml b/commonmodule/src/main/res/layout/item_step_offline.xml new file mode 100755 index 0000000..1e2b47f --- /dev/null +++ b/commonmodule/src/main/res/layout/item_step_offline.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/layout/item_step_offline_test.xml b/commonmodule/src/main/res/layout/item_step_offline_test.xml new file mode 100755 index 0000000..288fe85 --- /dev/null +++ b/commonmodule/src/main/res/layout/item_step_offline_test.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/layout/item_step_online.xml b/commonmodule/src/main/res/layout/item_step_online.xml new file mode 100755 index 0000000..c91ff71 --- /dev/null +++ b/commonmodule/src/main/res/layout/item_step_online.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/layout/item_step_start.xml b/commonmodule/src/main/res/layout/item_step_start.xml new file mode 100755 index 0000000..678fdf1 --- /dev/null +++ b/commonmodule/src/main/res/layout/item_step_start.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/layout/item_step_stay.xml b/commonmodule/src/main/res/layout/item_step_stay.xml new file mode 100755 index 0000000..eda068e --- /dev/null +++ b/commonmodule/src/main/res/layout/item_step_stay.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/layout/item_step_stop.xml b/commonmodule/src/main/res/layout/item_step_stop.xml new file mode 100755 index 0000000..cb0f0e3 --- /dev/null +++ b/commonmodule/src/main/res/layout/item_step_stop.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/commonmodule/src/main/res/layout/item_step_unusual.xml b/commonmodule/src/main/res/layout/item_step_unusual.xml new file mode 100755 index 0000000..c3be5bd --- /dev/null +++ b/commonmodule/src/main/res/layout/item_step_unusual.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gridmodule/src/main/AndroidManifest.xml b/gridmodule/src/main/AndroidManifest.xml index eed9990..76429b1 100644 --- a/gridmodule/src/main/AndroidManifest.xml +++ b/gridmodule/src/main/AndroidManifest.xml @@ -4,7 +4,8 @@ package="com.tengshisoft.gridmodule"> - + + diff --git a/gridmodule/src/main/java/com/tengshisoft/gridmodule/incident/activitys/cases/IncidentHandleActivity.java b/gridmodule/src/main/java/com/tengshisoft/gridmodule/incident/activitys/cases/IncidentHandleActivity.java index b8761e5..9622ef4 100644 --- a/gridmodule/src/main/java/com/tengshisoft/gridmodule/incident/activitys/cases/IncidentHandleActivity.java +++ b/gridmodule/src/main/java/com/tengshisoft/gridmodule/incident/activitys/cases/IncidentHandleActivity.java @@ -150,8 +150,7 @@ public class IncidentHandleActivity extends BaseActivity { @BindView(R2.id.rlv_handle_photos) RecyclerView mRlvHandlePhotos; private Unbinder mBind; - private String mCaseId; - private String mDispatchId; + private String mReportId; private IncidentDetailBean mIncidentDetailBean; private DispatchDetailBean mDispatchDetailBean; private BaiduMap mBaiduMap; @@ -173,8 +172,7 @@ public class IncidentHandleActivity extends BaseActivity { public void initData() { mBind = ButterKnife.bind(this); mTvBaseTitle.setText("事件处理"); - mCaseId = getIntent().getStringExtra("caseId"); - mDispatchId = getIntent().getStringExtra("dispatchId"); + mReportId = getIntent().getStringExtra("reportId"); mTaskId = getIntent().getStringExtra("taskId"); mTvPublish.setVisibility(View.VISIBLE); mTvPublish.setText("日志"); @@ -196,6 +194,7 @@ public class IncidentHandleActivity extends BaseActivity { private void onShowBackDialog() { CenterInputView intputView = new CenterInputView.DialogBuilder(mActivity).build(); intputView.addOnChoseListener((time, content) -> { + hideSoftKeyboard(); intputView.dismiss(); doRollBack(content); }); @@ -209,7 +208,7 @@ public class IncidentHandleActivity extends BaseActivity { */ private void doRollBack(String content) { IncidentRebackBean bean = new IncidentRebackBean(); - bean.setDispatchId(mDispatchId); + bean.setReportId(mReportId); bean.setExplain(content); bean.setTaskId(mTaskId); Gson gson = new Gson(); @@ -322,7 +321,7 @@ public class IncidentHandleActivity extends BaseActivity { */ private RequestBody buildParams() { SaveHandleIncidentBean bean = new SaveHandleIncidentBean(); - bean.setDispatchId(mDispatchId); + bean.setReportId(mReportId); bean.setHandlePhotos(mPhotoIds); String content = mEtContent.getText().toString().trim(); bean.setHandleSummary(content); @@ -507,7 +506,7 @@ public class IncidentHandleActivity extends BaseActivity { */ private void doSaveApply(String time, String content) { DelayApplyBean bean = new DelayApplyBean(); - bean.setDispatchId(mDispatchId); + bean.setDispatchId(""); bean.setDelayExpireTime(time); bean.setDelayApplyReason(content); Gson gson = new Gson(); @@ -517,7 +516,7 @@ public class IncidentHandleActivity extends BaseActivity { dialog.show(); RetrofitManager.getInstance() .create(Apis.class) - .doApplyDelay(requestBody, UserLgUtils.getToken()) + .doApplyDelay(mReportId, requestBody, UserLgUtils.getToken()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @@ -573,8 +572,8 @@ public class IncidentHandleActivity extends BaseActivity { * 获取详情 */ private void getDetailData() { - Observable dispatch = RetrofitManager.getInstance().create(Apis.class).getDispatchDetailById(mDispatchId, UserLgUtils.getToken()); - Observable incidentDetail = RetrofitManager.getInstance().create(Apis.class).getIncidentDetailById(mCaseId, UserLgUtils.getToken()); + Observable dispatch = RetrofitManager.getInstance().create(Apis.class).getDispatchDetailById(mTaskId, UserLgUtils.getToken()); + Observable incidentDetail = RetrofitManager.getInstance().create(Apis.class).getIncidentDetailById(mReportId, UserLgUtils.getToken()); Observable.merge(dispatch, incidentDetail) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) diff --git a/gridmodule/src/main/java/com/tengshisoft/gridmodule/incident/activitys/cases/IncidentHandleListActivity.java b/gridmodule/src/main/java/com/tengshisoft/gridmodule/incident/activitys/cases/IncidentHandleListActivity.java index 325552d..4068e40 100644 --- a/gridmodule/src/main/java/com/tengshisoft/gridmodule/incident/activitys/cases/IncidentHandleListActivity.java +++ b/gridmodule/src/main/java/com/tengshisoft/gridmodule/incident/activitys/cases/IncidentHandleListActivity.java @@ -15,7 +15,9 @@ import com.alibaba.android.arouter.launcher.ARouter; import com.hjq.toast.ToastUtils; import com.scwang.smart.refresh.layout.SmartRefreshLayout; import com.tengshisoft.commonmodule.adapters.IncidentHandleListAdapter; +import com.tengshisoft.commonmodule.adapters.IncidentListAdapter; import com.tengshisoft.commonmodule.beans.IncidentHandleListBean; +import com.tengshisoft.commonmodule.beans.IncidentListBean; import com.tengshisoft.commonmodule.nets.Apis; import com.tengshisoft.gridmodule.R; import com.tengshisoft.gridmodule.R2; @@ -69,8 +71,8 @@ public class IncidentHandleListActivity extends BaseActivity { @BindView(R2.id.tv_error_hint) TextView mTvErrorHint; private Unbinder mBind; - private List mDatas; - private IncidentHandleListAdapter mAdapter; + private List mDatas; + private IncidentListAdapter mAdapter; private int mCurrentPage = 1; private String mKeywords = ""; @@ -86,7 +88,7 @@ public class IncidentHandleListActivity extends BaseActivity { mEtBaseSearchContent.setHint("请输入事件编码(分类名称)"); refreshView(STATE_LOAD_SUCCESS); mDatas = new ArrayList<>(); - mAdapter = new IncidentHandleListAdapter(mActivity, mDatas); + mAdapter = new IncidentListAdapter(mActivity, mDatas); mRlvComponents.setLayoutManager(new LinearLayoutManager(mActivity)); mRlvComponents.setAdapter(mAdapter); mSrlContent.setOnRefreshListener(v -> doRefresh()); @@ -101,8 +103,7 @@ public class IncidentHandleListActivity extends BaseActivity { }); mAdapter.addOnItemClickListener(v -> ARouter.getInstance() .build(PathConfig.PATH_MODULE_GRID_ACTIVITY_INCIDENT_HANDLE) - .withString("caseId", v.getReportId()) - .withString("dispatchId", v.getDispatchId()) + .withString("reportId", v.getReportId()) .withString("taskId", v.getTaskId()) .navigation(mActivity, 12)); } @@ -117,14 +118,14 @@ public class IncidentHandleListActivity extends BaseActivity { .getIncidentHandleList(mKeywords, mCurrentPage + "", UserLgUtils.getToken()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { + .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { } @Override - public void onNext(@NonNull IncidentHandleListBean communityListBean) { + public void onNext(@NonNull IncidentListBean communityListBean) { if (communityListBean.getRows() != null && communityListBean.getRows().size() > 0) { ++mCurrentPage; if (currentPage == 1) { diff --git a/gridmodule/src/main/java/com/tengshisoft/gridmodule/incident/activitys/locus/WorkLocusActivity.java b/gridmodule/src/main/java/com/tengshisoft/gridmodule/incident/activitys/locus/WorkLocusActivity.java new file mode 100644 index 0000000..9b0f09e --- /dev/null +++ b/gridmodule/src/main/java/com/tengshisoft/gridmodule/incident/activitys/locus/WorkLocusActivity.java @@ -0,0 +1,678 @@ +package com.tengshisoft.gridmodule.incident.activitys.locus; + +import android.annotation.SuppressLint; +import android.app.ProgressDialog; +import android.graphics.Color; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.ZoomControls; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.baidu.mapapi.map.BaiduMap; +import com.baidu.mapapi.map.BitmapDescriptor; +import com.baidu.mapapi.map.MapStatus; +import com.baidu.mapapi.map.MapStatusUpdate; +import com.baidu.mapapi.map.MapStatusUpdateFactory; +import com.baidu.mapapi.map.OverlayOptions; +import com.baidu.mapapi.map.PolylineOptions; +import com.baidu.mapapi.map.TextureMapView; +import com.baidu.mapapi.model.LatLng; +import com.baidu.mapapi.utils.DistanceUtil; +import com.bigkoo.pickerview.builder.TimePickerBuilder; +import com.bigkoo.pickerview.view.TimePickerView; +import com.hjq.toast.ToastUtils; +import com.tengshisoft.commonmodule.adapters.LocusStepAdapter; +import com.tengshisoft.commonmodule.beans.DrawMapLineBean; +import com.tengshisoft.commonmodule.beans.LocationPointBean; +import com.tengshisoft.commonmodule.beans.LocusTextBean; +import com.tengshisoft.commonmodule.nets.Apis; +import com.tengshisoft.gridmodule.R; +import com.tengshisoft.gridmodule.R2; +import com.tenlionsoft.baselib.constant.PathConfig; +import com.tenlionsoft.baselib.constant.TimeConstants; +import com.tenlionsoft.baselib.core.retrofit_net.RetrofitManager; +import com.tenlionsoft.baselib.core.widget.base.BaseActivity; +import com.tenlionsoft.baselib.utils.ExceptionHandler; +import com.tenlionsoft.baselib.utils.TimeUtils; +import com.tenlionsoft.baselib.utils.UIUtil; +import com.tenlionsoft.baselib.utils.UserLgUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import androidx.cardview.widget.CardView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.Unbinder; +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.schedulers.Schedulers; + +/** + * 作者: Adam + * 日期: 2021年10月29日17:33:22 + * 邮箱: itgaojian@163.com + * 描述: 工作轨迹 + */ +@Route(path = PathConfig.PATH_MODULE_GRID_ACTIVITY_WORK_LOCUS) +public class WorkLocusActivity extends BaseActivity { + + + @BindView(R2.id.tmv_map) + TextureMapView mTmvMap; + @BindView(R2.id.btn_reload) + Button mBtnReload; + @BindView(R2.id.rb_type_map) + RadioButton mRbTypeMap; + @BindView(R2.id.rb_satellite) + RadioButton mRbSatellite; + @BindView(R2.id.rg_map_type) + RadioGroup mRgMapType; + @BindView(R2.id.rl_map_view) + RelativeLayout mRlMapView; + @BindView(R2.id.rb_map) + RadioButton mRbMap; + @BindView(R2.id.rb_text) + RadioButton mRbText; + @BindView(R2.id.rg_type) + RadioGroup mRgType; + @BindView(R2.id.iv_user_icon) + ImageView mIvUserIcon; + @BindView(R2.id.tv_user_name) + TextView mTvUserName; + @BindView(R2.id.tv_distance) + TextView mTvDistance; + @BindView(R2.id.cv_card) + CardView mCvCard; + @BindView(R2.id.rlv_step) + RecyclerView mRlvStep; + @BindView(R2.id.tv_start_date) + TextView mTvStartDate; + private Unbinder mBind; + + + private TimePickerView mTimePickerView; + private String mNowDate; + private BaiduMap mBaiduMap; + private BitmapDescriptor mBitMap; + private int mCurrentShowType = 1;//1是地图 2是文本 + private LocusStepAdapter mAdapter; + private ProgressDialog mProgressDialog; + + @Override + protected int setLayoutId() { + return R.layout.activity_work_locus; + } + + @Override + public void initData() { + mBind = ButterKnife.bind(this); + refreshView(STATE_LOAD_SUCCESS); + mTvStartDate.setOnClickListener(v -> showPickerView()); + mNowDate = TimeUtils.getCurrentDate(); + initMap(); + initViews(); + } + + private void initViews() { + mRgType.setOnCheckedChangeListener((group, checkedId) -> { + if (checkedId == R.id.rb_map) { + mCurrentShowType = 1; + } else if (checkedId == R.id.rb_text) { + mCurrentShowType = 2; + } + setCurrentShowView(); + }); + mRgMapType.setOnCheckedChangeListener((group, checkedId) -> { + int id = 0; + if (checkedId == R.id.rb_type_map) {//普通的 + id = 123; + } else if (checkedId == R.id.rb_satellite) {//卫星地图 + id = 1234; + } + if (id != 0) { + setMapType(id); + } + }); + mTvStartDate.setText(TimeUtils.getCurrentDate()); + setCurrentShowView(); + List mStep = new ArrayList<>(); + mAdapter = new LocusStepAdapter(this, mStep); + mRlvStep.setLayoutManager(new LinearLayoutManager(this)); + mRlvStep.setAdapter(mAdapter); + getLocusList(); + } + + /** + * 地图显示方式切换 + */ + private void setMapType(int id) { + if (id == 123) { + mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); + } else { + mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); + } + } + + /** + * 视图切换 + */ + private void setCurrentShowView() { + if (mCurrentShowType == 1) { + //显示地图 + mRlMapView.setVisibility(View.VISIBLE); + mRlvStep.setVisibility(View.GONE); + } else { + //显示文本 + mRlvStep.setVisibility(View.VISIBLE); + mRlMapView.setVisibility(View.GONE); + } + } + + /** + * 初始化地图 + */ + @SuppressLint("ClickableViewAccessibility") + private void initMap() { + mTmvMap.showZoomControls(false);//缩放控件 + mTmvMap.showScaleControl(false);//比例尺 + mBaiduMap = mTmvMap.getMap(); + mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); + mBaiduMap.setMyLocationEnabled(false); + View childAt = mTmvMap.getChildAt(1); + if (childAt != null && (childAt instanceof ImageView || childAt instanceof ZoomControls)) { + childAt.setVisibility(View.INVISIBLE); + } + moveMapToCenter(new LatLng(PathConfig.LA, PathConfig.LO), 14); + } + + /** + * 将地图移动到定位中心 + * + * @param latLng + */ + private void moveMapToCenter(LatLng latLng, int room) { + MapStatus ms = new MapStatus.Builder().zoom(room).target(latLng).build(); + MapStatusUpdate u = MapStatusUpdateFactory.newMapStatus(ms); + mBaiduMap.setMapStatus(u); + } + + private void showPickerView() { + mTimePickerView = new TimePickerBuilder(mActivity, (date, v) -> { + boolean i = TimeUtils.compare(mNowDate, TimeUtils.dateToString(date)); + if (i) { + ToastUtils.show("请选择当前时间之前的日期."); + } else { + mNowDate = TimeUtils.dateToString(date); + mTvStartDate.setText(mNowDate); + getLocusList(); + } + }) + .setTitleText("请选择日期") + .setCancelColor(Color.parseColor("#1189FF")) + .setSubmitColor(Color.parseColor("#1189FF")) + .setType(new boolean[]{true, true, true, false, false, false}) + .setTitleColor(Color.parseColor("#1189FF")) + .build(); + mTimePickerView.show(); + } + + /** + * 获取定位点 + */ + private void getLocusList() { + ProgressDialog dialog = UIUtil.initDialog(mActivity, "获取中..."); + dialog.show(); + String startTime = mNowDate + " 00:00:00"; + String endTime = mNowDate + " 23:59:59"; + RetrofitManager.getInstance() + .create(Apis.class) + .getUserLocationList(startTime, endTime, UserLgUtils.getToken()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + } + + @Override + public void onNext(@NonNull List locationPointBeans) { + dialog.dismiss(); + if (locationPointBeans.size() > 0) { + drawLineToMap(locationPointBeans); + parserLocationPoint(locationPointBeans); + } else { + ToastUtils.show("当前选择时间段内无轨迹"); + } + } + + @Override + public void onError(@NonNull Throwable e) { + dialog.dismiss(); + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + } + + + private void drawLineToMap(List mBeas) { + //清除之前的 + if (mBeas.size() > 2) { + Collections.sort(mBeas); + List mTempBeans = new ArrayList<>(mBeas); + Observable.just(mTempBeans) + .map(mineLocationBeans -> { + //坐标集合 + //颜色集合 + List lineDatas = new ArrayList<>(); + for (int i = 0; i < mineLocationBeans.size(); i++) { + if (i != mineLocationBeans.size() - 1) { + //TODO 12:移动 13:等待 14:异常 + DrawMapLineBean bean = new DrawMapLineBean(); + //第一个 + LocationPointBean preBean = mineLocationBeans.get(i); + //下一点 + LocationPointBean nextBean = mineLocationBeans.get(i + 1); + long timeSpan = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), preBean.getGmtCreate(), TimeConstants.SEC); + LatLng preLatlng = new LatLng(Double.parseDouble(preBean.getUserLat()), Double.parseDouble(preBean.getUserLng())); + LatLng nextLatlng = new LatLng(Double.parseDouble(nextBean.getUserLat()), Double.parseDouble(nextBean.getUserLng())); + //TODO 1、距离 + double distance = DistanceUtil.getDistance(preLatlng, nextLatlng); + if (timeSpan < 600) { + //在线 + if (distance / timeSpan > 20) { + //TODO 速度大于20/s异常 + bean.setOnePoint(preLatlng); + bean.setTwoPoint(nextLatlng); + bean.setType(14); + bean.setLineColor(Integer.valueOf(Color.RED)); + } else if (distance / timeSpan <= 0.5) { + //TODO 速度小于0.5m/s等待 + bean.setOnePoint(preLatlng); + bean.setTwoPoint(nextLatlng); + bean.setType(13); + bean.setLineColor(Integer.valueOf(Color.YELLOW)); + } else { + //TODO 移动 绿色 + bean.setOnePoint(preLatlng); + bean.setTwoPoint(nextLatlng); + bean.setType(12); + bean.setLineColor(Integer.valueOf(Color.parseColor("#218868"))); + } + } else { + //TODO 失联 + bean.setOnePoint(preLatlng); + bean.setTwoPoint(nextLatlng); + bean.setType(12); + bean.setLineColor(Integer.valueOf(Color.GRAY)); + } + lineDatas.add(bean); + } + } + return lineDatas; + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(List o) { + mBaiduMap.clear(); + if (o != null && o.size() > 0) { + for (int i = 0; i < o.size(); i++) { + List points = new ArrayList<>(); + points.add(o.get(i).getOnePoint()); + points.add(o.get(i).getTwoPoint()); + OverlayOptions ooPolyline11 = new PolylineOptions() + .width(10) + .dottedLine(false) + .color(o.get(i).getLineColor()) + .points(points); + mBaiduMap.addOverlay(ooPolyline11); + } + moveMapToCenter(new LatLng(o.get(0).getOnePoint().latitude, o.get(0).getOnePoint().longitude), 14); + } +// TODO 电子围栏 +// if (mPenLineBeans != null && mPenLineBeans.size() > 0) { +// drawPenToMap(mPenLineBeans); +// } + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + } + + @Override + public void onComplete() { + + } + }); + } + } + + + /** + * TODO 解析文本数据 + * + * @param mineBeans + */ + private void parserLocationPoint(List mineBeans) { + Collections.sort(mineBeans); + Observable.just(mineBeans) + .map((List mineLocationBeans) -> { + List mStepBeans = new ArrayList<>(); + if (mineBeans.size() >= 2) { + for (int i = 0; i < mineBeans.size(); i++) { + if (i != mineBeans.size() - 1) { + //第一个 + LocationPointBean preBean = mineBeans.get(i); + //下一点 + LocationPointBean nextBean = mineBeans.get(i + 1); + long timeSpan = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), preBean.getGmtCreate(), TimeConstants.SEC); + LatLng preLatlng = new LatLng(Double.parseDouble(preBean.getUserLat()), Double.parseDouble(preBean.getUserLng())); + LatLng nextLatlng = new LatLng(Double.parseDouble(nextBean.getUserLat()), Double.parseDouble(nextBean.getUserLng())); + if (i == 0) { + LocusTextBean bean = new LocusTextBean(); +// bean.setAddress("定位地址:未知"); +// if (TextUtils.isEmpty(preBean.getUserLocation()) || "null".equals(preBean.getUserLocation())) { +// +// } else { +// bean.setAddress(preBean.getUserLocation()); +// } + bean.setTime(preBean.getGmtCreate()); + bean.setStateTime("开始定位" + preBean.getGmtCreate()); + bean.setType(LocusStepAdapter.TYPE_START); + bean.setCreateTime(preBean.getGmtCreate()); + bean.setOrder(i); + mStepBeans.add(bean); + } else { + //TODO 1、距离 + double distance = DistanceUtil.getDistance(preLatlng, nextLatlng); + if (timeSpan < 600) { + //在线 + if (distance / timeSpan > 20) { + //TODO 速度大于20/s异常 + if (mStepBeans != null && mStepBeans.size() > 0) { + LocusTextBean tempbean = mStepBeans.get(mStepBeans.size() - 1); + if (tempbean.getType() == LocusStepAdapter.TYPE_UNUSUAL) { + //上一条也是移动的 //将停止时间累计 + long timeSpan2 = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), tempbean.getCreateTime(), TimeConstants.SEC); + tempbean.setStateTime(timeSpan2 + ""); + tempbean.setCreateTime(nextBean.getGmtCreate()); + long l = tempbean.getSecond() + timeSpan2; + tempbean.setOrder(i); + tempbean.setSecond(l); + } else { + LocusTextBean text = mStepBeans.get(mStepBeans.size() - 1); + LocusTextBean bean = new LocusTextBean(); +// if (TextUtils.isEmpty(preBean.getUserLocation()) || "null".equals(preBean.getUserLocation())) { +// bean.setAddress("定位地址:未知"); +// } else { +// bean.setAddress("定位地址:" + preBean.getUserLocation()); +// } + bean.setCreateTime(nextBean.getGmtCreate()); + bean.setTime(text.getCreateTime()); + long timeSpan1 = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), text.getCreateTime(), TimeConstants.SEC); + bean.setStateTime(timeSpan1 + ""); + bean.setType(LocusStepAdapter.TYPE_UNUSUAL); + bean.setSecond(timeSpan1); + bean.setOrder(i); + mStepBeans.add(bean); + } + } else { + LocusTextBean bean = new LocusTextBean(); +// if (TextUtils.isEmpty(preBean.getUserLocation()) || "null".equals(preBean.getUserLocation())) { +// bean.setAddress("定位地址:未知"); +// } else { +// bean.setAddress("定位地址:" + preBean.getUserLocation()); +// } + bean.setCreateTime(nextBean.getGmtCreate()); + bean.setTime(preBean.getGmtCreate()); + long timeSpan1 = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), preBean.getGmtCreate(), TimeConstants.SEC); + bean.setStateTime(timeSpan1 + ""); + bean.setSecond(timeSpan1); + bean.setType(LocusStepAdapter.TYPE_UNUSUAL); + bean.setOrder(i); + mStepBeans.add(bean); + } + } else if (distance / timeSpan <= 0.5) { + //TODO 速度小于0.5m/s等待 + if (mStepBeans != null && mStepBeans.size() > 0) { + LocusTextBean tempbean = mStepBeans.get(mStepBeans.size() - 1); + if (tempbean.getType() == LocusStepAdapter.TYPE_STAY) { + //上一条也是移动的 //将停止时间累计 + long timeSpan2 = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), tempbean.getCreateTime(), TimeConstants.SEC); + tempbean.setStateTime(timeSpan2 + ""); + tempbean.setCreateTime(nextBean.getGmtCreate()); + long l = tempbean.getSecond() + timeSpan2; + tempbean.setOrder(i); + tempbean.setSecond(l); + } else { + LocusTextBean text = mStepBeans.get(mStepBeans.size() - 1); + LocusTextBean bean = new LocusTextBean(); +// if (TextUtils.isEmpty(preBean.getUserLocation()) || "null".equals(preBean.getUserLocation())) { +// bean.setAddress("定位地址:未知"); +// } else { +// bean.setAddress("定位地址:" + preBean.getUserLocation()); +// } + bean.setCreateTime(nextBean.getGmtCreate()); + bean.setTime(text.getCreateTime()); + long timeSpan1 = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), text.getCreateTime(), TimeConstants.SEC); + bean.setStateTime(timeSpan1 + ""); + bean.setType(LocusStepAdapter.TYPE_STAY); + bean.setOrder(i); + bean.setSecond(timeSpan1); + mStepBeans.add(bean); + } + } else { + LocusTextBean bean = new LocusTextBean(); +// if (TextUtils.isEmpty(preBean.getUserLocation()) || "null".equals(preBean.getUserLocation())) { +// bean.setAddress("定位地址:未知"); +// } else { +// bean.setAddress("定位地址:" + preBean.getUserLocation()); +// } + bean.setCreateTime(nextBean.getGmtCreate()); + bean.setTime(preBean.getGmtCreate()); + long timeSpan1 = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), preBean.getGmtCreate(), TimeConstants.SEC); + bean.setStateTime(timeSpan1 + ""); + bean.setSecond(timeSpan1); + bean.setType(LocusStepAdapter.TYPE_STAY); + bean.setOrder(i); + mStepBeans.add(bean); + } + } else { + //TODO 移动 + if (mStepBeans != null && mStepBeans.size() > 0) { + LocusTextBean tempbean = mStepBeans.get(mStepBeans.size() - 1); + if (tempbean.getType() == LocusStepAdapter.TYPE_ONLINE) { + //上一条也是移动的 //将停止时间累计 + long timeSpan2 = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), tempbean.getCreateTime(), TimeConstants.SEC); + tempbean.setStateTime(timeSpan2 + ""); + tempbean.setCreateTime(nextBean.getGmtCreate()); + long l = tempbean.getSecond() + timeSpan2; + tempbean.setSecond(l); + tempbean.setOrder(i); + } else { + LocusTextBean locusTextBean = mStepBeans.get(mStepBeans.size() - 1); + LocusTextBean bean = new LocusTextBean(); +// if (TextUtils.isEmpty(preBean.getUserLocation()) || "null".equals(preBean.getUserLocation())) { +// bean.setAddress("定位地址:未知"); +// } else { +// bean.setAddress("定位地址:" + preBean.getUserLocation()); +// } + bean.setCreateTime(nextBean.getGmtCreate()); + bean.setTime(locusTextBean.getCreateTime()); + long timeSpan1 = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), locusTextBean.getCreateTime(), TimeConstants.SEC); + bean.setStateTime(timeSpan1 + ""); + bean.setType(LocusStepAdapter.TYPE_ONLINE); + bean.setSecond(timeSpan1); + bean.setOrder(i); + mStepBeans.add(bean); + } + } else { + LocusTextBean bean = new LocusTextBean(); +// if (TextUtils.isEmpty(preBean.getUserLocation()) || "null".equals(preBean.getUserLocation())) { +// bean.setAddress("定位地址:未知"); +// } else { +// bean.setAddress("定位地址:" + preBean.getUserLocation()); +// } + bean.setCreateTime(nextBean.getGmtCreate()); + bean.setTime(preBean.getGmtCreate()); + long timeSpan1 = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), preBean.getGmtCreate(), TimeConstants.SEC); + bean.setStateTime(timeSpan1 + ""); + bean.setSecond(timeSpan1); + bean.setType(LocusStepAdapter.TYPE_ONLINE); + bean.setOrder(i); + mStepBeans.add(bean); + } + } + } else { + //TODO 失联 + if (mStepBeans != null && mStepBeans.size() > 0) { + LocusTextBean tempbean = mStepBeans.get(mStepBeans.size() - 1); + if (tempbean.getType() == LocusStepAdapter.TYPE_OFFLINE) { + //上一条也是移动的 //将停止时间累计 + long timeSpan2 = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), tempbean.getCreateTime(), TimeConstants.SEC); + tempbean.setStateTime(timeSpan2 + ""); + tempbean.setCreateTime(nextBean.getGmtCreate()); + long l = tempbean.getSecond() + timeSpan2; + tempbean.setSecond(l); + tempbean.setOrder(i); + } else { + LocusTextBean locusTextBean = mStepBeans.get(mStepBeans.size() - 1); + LocusTextBean bean = new LocusTextBean(); +// if (TextUtils.isEmpty(preBean.getUserLocation()) || "null".equals(preBean.getUserLocation())) { +// bean.setAddress("定位地址:未知"); +// } else { +// bean.setAddress("定位地址:" + preBean.getUserLocation()); +// } + bean.setCreateTime(nextBean.getGmtCreate()); + bean.setTime(locusTextBean.getCreateTime()); + long timeSpan1 = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), locusTextBean.getCreateTime(), TimeConstants.SEC); + bean.setStateTime(timeSpan1 + ""); + bean.setType(LocusStepAdapter.TYPE_OFFLINE); + bean.setSecond(timeSpan1); + bean.setOrder(i); + mStepBeans.add(bean); + } + } else { + LocusTextBean bean = new LocusTextBean(); +// if (TextUtils.isEmpty(preBean.getUserLocation()) || "null".equals(preBean.getUserLocation())) { +// bean.setAddress("定位地址:未知"); +// } else { +// bean.setAddress("定位地址:" + preBean.getUserLocation()); +// } + bean.setOrder(i); + bean.setCreateTime(nextBean.getGmtCreate()); + bean.setTime(preBean.getGmtCreate()); + long timeSpan1 = TimeUtils.getTimeSpan(nextBean.getGmtCreate(), preBean.getGmtCreate(), TimeConstants.SEC); + bean.setStateTime(timeSpan1 + ""); + bean.setSecond(timeSpan1); + bean.setType(LocusStepAdapter.TYPE_OFFLINE); + mStepBeans.add(bean); + } + } + } + } else { + //最后一个点 + LocationPointBean mineLocationBean = mineBeans.get(mineBeans.size() - 1); + LocusTextBean bean = new LocusTextBean(); +// if (TextUtils.isEmpty(mineLocationBean.getUserLocation()) || "null".equals(mineLocationBean.getUserLocation())) { +// bean.setAddress("定位地址:未知"); +// } else { +// bean.setAddress(mineLocationBean.getUserLocation()); +// } + bean.setOrder(i); + bean.setTime(mineLocationBean.getGmtCreate()); + bean.setStateTime("开始定位" + mineLocationBean.getGmtCreate()); + bean.setType(LocusStepAdapter.TYPE_STOP); + bean.setCreateTime(mineLocationBean.getGmtCreate()); + mStepBeans.add(bean); + } + } + } else { + LocationPointBean mineLocationBean = mineBeans.get(mineBeans.size() - 1); + LocusTextBean bean = new LocusTextBean(); +// if (TextUtils.isEmpty(mineLocationBean.getUserLocation()) || "null".equals(mineLocationBean.getUserLocation())) { +// bean.setAddress("定位地址:未知"); +// } else { +// bean.setAddress(mineLocationBean.getUserLocation()); +// } + bean.setOrder(2); + bean.setTime(mineLocationBean.getGmtCreate()); + bean.setStateTime("开始定位" + mineLocationBean.getGmtCreate()); + bean.setType(LocusStepAdapter.TYPE_START); + bean.setCreateTime(mineLocationBean.getGmtCreate()); + mStepBeans.add(bean); + + LocusTextBean bean1 = new LocusTextBean(); +// if (TextUtils.isEmpty(mineLocationBean.getUserLocation()) || "null".equals(mineLocationBean.getUserLocation())) { +// bean1.setAddress("定位地址:未知"); +// } else { +// bean1.setAddress(mineLocationBean.getUserLocation()); +// } + bean1.setOrder(1); + bean1.setTime(mineLocationBean.getGmtCreate()); + bean1.setStateTime("开始定位" + mineLocationBean.getGmtCreate()); + bean1.setType(LocusStepAdapter.TYPE_STOP); + bean1.setCreateTime(mineLocationBean.getGmtCreate()); + mStepBeans.add(bean1); + } + return mStepBeans; + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(List locusTextBeans) { + if (locusTextBeans != null && locusTextBeans.size() > 0) { + Collections.sort(locusTextBeans); + mAdapter.setData(locusTextBeans); + } + if (mProgressDialog != null && mProgressDialog.isShowing()) { + mProgressDialog.dismiss(); + } + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + if (mProgressDialog != null && mProgressDialog.isShowing()) { + mProgressDialog.dismiss(); + } + ToastUtils.show("获取历史轨迹数据失败,请稍后重试"); + } + + @Override + public void onComplete() { + + } + }); + } +} \ No newline at end of file diff --git a/gridmodule/src/main/res/layout/activity_work_locus.xml b/gridmodule/src/main/res/layout/activity_work_locus.xml new file mode 100644 index 0000000..ad5ee8c --- /dev/null +++ b/gridmodule/src/main/res/layout/activity_work_locus.xml @@ -0,0 +1,223 @@ + + + + + + + + + +