From b9bb75063b4e7c3358647455aa80a37495ba432b Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Thu, 13 Jul 2023 16:14:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20SP7=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../outdoor/activity/HomeActivity.java | 1 + .../outdoor/adapter/StaySubmitAdapter.java | 22 +- .../outdoor/fragment/AreaHubFragment.java | 2 +- .../outdoor/fragment/BuildingInFragment.java | 2 +- .../outdoor/fragment/GatherGetFragment.java | 204 ++++++------- .../outdoor/fragment/PoiVideoFragment.java | 2 +- .../outdoor/fragment/RoadFragment.java | 52 ++-- .../outdoor/fragment/StaySubmitFragment.java | 10 + .../outdoor/fragment/TrafficHubFragment.java | 2 +- .../com/navinfo/outdoor/room/PoiEntity.java | 10 +- .../navinfo/outdoor/util/DataSaveUtils.java | 84 ++++++ .../navinfo/outdoor/util/PoiSaveUtils.java | 15 + .../main/res/layout/fragment_stay_submit.xml | 272 ++++++++++-------- 14 files changed, 433 insertions(+), 249 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 35d802c..8a9b08d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,8 +37,8 @@ android { applicationId "com.navinfo.outdoor" minSdkVersion 24 targetSdkVersion 30 - versionCode 104 - versionName "8.230619-正式版-OCR" + versionCode 106 + versionName "8.230713-正式版-OCR" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { diff --git a/app/src/main/java/com/navinfo/outdoor/activity/HomeActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/HomeActivity.java index a715fe2..3d21f8a 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/HomeActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/HomeActivity.java @@ -387,6 +387,7 @@ public class HomeActivity extends BaseActivity { ArrayList toAddressList = new ArrayList<>(); toAddressList.add("xiaoyan159@qq.com"); toAddressList.add("huangjichao@navinfo.com"); + toAddressList.add("ZhouQi@navinfo.com"); mail.setToAddress(toAddressList); mail.setSubject("疑似违规记录"); mail.setContent(stringBuilder.append("用户名:").append(Constant.USER_NAME).append("\n") diff --git a/app/src/main/java/com/navinfo/outdoor/adapter/StaySubmitAdapter.java b/app/src/main/java/com/navinfo/outdoor/adapter/StaySubmitAdapter.java index 910247c..4866bed 100644 --- a/app/src/main/java/com/navinfo/outdoor/adapter/StaySubmitAdapter.java +++ b/app/src/main/java/com/navinfo/outdoor/adapter/StaySubmitAdapter.java @@ -79,6 +79,26 @@ public class StaySubmitAdapter extends RecyclerView.Adapter0&&poiEntity.getUploadProgress()!=poiEntity.getUploadMax()) { + if (poiEntity.getWork_type()!=0&&poiEntity.getUploadMax()>0&&poiEntity.getUploadProgress()!=poiEntity.getUploadMax()) { holder.layerProgress.setVisibility(View.VISIBLE); holder.pbUpload.setMax(poiEntity.getUploadMax()); holder.pbUpload.setProgress(poiEntity.getUploadProgress()); diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/AreaHubFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/AreaHubFragment.java index ab27dd9..d3e81cf 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/AreaHubFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/AreaHubFragment.java @@ -725,7 +725,7 @@ public class AreaHubFragment extends BaseDrawerFragment implements View.OnClickL } // 更新当前POI的置信度 - showPoiEntity.setCredible(data.getIntExtra(Constant.INTENT_PICTURES_CREDIBLE, 0)); + showPoiEntity.setScore(data.getIntExtra(Constant.INTENT_PICTURES_CREDIBLE, 0)); } } } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/BuildingInFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/BuildingInFragment.java index 35a6f5b..a7c0ac3 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/BuildingInFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/BuildingInFragment.java @@ -826,7 +826,7 @@ public class BuildingInFragment extends BaseDrawerFragment implements View.OnCli } // 更新当前POI的置信度 - showPoiEntity.setCredible(data.getIntExtra(Constant.INTENT_PICTURES_CREDIBLE, 0)); + showPoiEntity.setScore(data.getIntExtra(Constant.INTENT_PICTURES_CREDIBLE, 0)); } } } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/GatherGetFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/GatherGetFragment.java index 76e27af..7f15855 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/GatherGetFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/GatherGetFragment.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; +import android.os.HandlerThread; import android.os.Message; import android.util.Log; import android.view.KeyEvent; @@ -16,6 +17,7 @@ import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.github.lazylibrary.util.FileUtils; +import com.github.lazylibrary.util.ToastUtils; import com.kongzue.dialog.interfaces.OnDialogButtonClickListener; import com.kongzue.dialog.util.BaseDialog; import com.kongzue.dialog.util.DialogSettings; @@ -48,10 +50,6 @@ import com.navinfo.outdoor.util.GeometryTools; import com.navinfo.outdoor.util.LocationLifeCycle; import com.navinfo.outdoor.util.NaviUtils; import com.navinfo.outdoor.util.TimestampUtil; -import com.navinfo.outdoor.util.ToastUtils; -import com.tencent.lbssearch.httpresponse.Poi; -import com.tencent.map.navi.car.TencentCarNaviManager; -import com.tencent.map.navi.data.NaviPoi; import com.tencent.tencentmap.mapsdk.maps.model.LatLng; import org.locationtech.jts.geom.Geometry; @@ -362,7 +360,7 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe LatLng endLatLng = new LatLng(Double.parseDouble(poiEntity.getY()), Double.parseDouble(poiEntity.getX())); double geometry = GeometryTools.distanceToDouble(startLatLng, endLatLng); if (geometry > 5000) { - ToastUtils.Message(getActivity(),"作业不在领取范围内,无法采集"); + ToastUtils.showToast(getActivity(),"作业不在领取范围内,无法采集"); return; } else { if (geometry > 50) { @@ -540,7 +538,7 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe } else if (response.getCode() == 230) { FlushTokenUtil.flushToken(getActivity()); } else { - ToastUtils.Message(getActivity(),response.getMessage()); + ToastUtils.showToast(getActivity(),response.getMessage()); } } @@ -550,9 +548,9 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe String message = e.getMessage(); assert message != null; if (message.equals("timeout") || message.equals("Read time out")) { - ToastUtils.Message(getActivity(),"请求超时"); + ToastUtils.showToast(getActivity(),"请求超时"); } else { - ToastUtils.Message(getActivity(),message); + ToastUtils.showToast(getActivity(),message); } Log.d("TAG", "onError: " + e.getMessage()); } @@ -564,85 +562,95 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe */ private void initPolygonTask(String url, PoiEntity poiEntity, boolean aBoolean) { if (poiEntity.getTaskId() == 0) { - ToastUtils.Message(getActivity(),"无此任务"); + ToastUtils.showToast(getActivity(),"无此任务"); return; } // 如果当前存在未关闭的面状任务,提示用户无法领取,先关闭已领取的面状任务 - List recivePolygonPoi = PoiDatabase.getInstance(requireContext()).getPoiDao().getPoiEntityByTaskStatus(1, 6); - if (recivePolygonPoi!=null&&!recivePolygonPoi.isEmpty()) { - ToastUtils.Message(requireActivity(),"您当前存在已领取的其他面状任务,请先关闭该任务后再领取!"); - return; - } - - showLoadingDialog(); - OkGoBuilder.getInstance() - .time(30) - .Builder(getActivity()) - .url(url + "/" + poiEntity.getTaskId()) - .cls(PolygonTaskBean.class) - .token(Constant.ACCESS_TOKEN) - .params(new HttpParams()) - .getRequest(new Callback() { + new Thread(new Runnable() { + @Override + public void run() { + List recivePolygonPoi = PoiDatabase.getInstance(requireContext()).getPoiDao().getPoiEntityByTaskStatus(1, 6); + requireActivity().runOnUiThread(new Runnable() { @Override - public void onSuccess(PolygonTaskBean response, int id) { - dismissLoadingDialog(); - if (response.getCode() == 200) {// 0.未领取 1.已领取,2.未保存(保存到本地但未提交成功),3.已保存(保存到本地提交成功),4已上传(结束采集), - PolygonTaskBean.BodyBean listBean = response.getBody(); - PoiEntity polygonEntity = new PoiEntity(); - if (listBean != null) { - polygonEntity.setTaskId(listBean.getId()); - polygonEntity.setName(listBean.getName()); - polygonEntity.setType(listBean.getType()); - polygonEntity.setGeoWkt(listBean.getGeo()); - String encodeStr = listBean.getGeo(); - String geo = Geohash.getInstance().decode(encodeStr); - // 生成对应的x和y poiEntity.setX - GeometryTools.obitainPoiEntityXY(geo, polygonEntity); - polygonEntity.setTaskStatus(1); - } - new Thread(new Runnable() { - @Override - public void run() { - InsertAndUpdateUtils.getInstance().insertOrUpdate(getContext(), polygonEntity); - if (getActivity() != null) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - initViewByTaskStatus(1); - ToastUtils.Message(getActivity(),"领取成功"); - if (aBoolean) { - initCompleteTask(HttpInterface.SUBMIT_POLYGON_TASK, polygonEntity); - } else { - Message obtains = Message.obtain(); - obtains.what = Constant.JOB_WORD_MONITOR; - obtains.obj = true; - EventBus.getDefault().post(obtains); - } + public void run() { + if (recivePolygonPoi!=null&&!recivePolygonPoi.isEmpty()) { + ToastUtils.showToast(requireActivity(),"您当前存在已领取的其他面状任务,请先关闭该任务后再领取!"); + return; + } + + showLoadingDialog(); + OkGoBuilder.getInstance() + .time(30) + .Builder(getActivity()) + .url(url + "/" + poiEntity.getTaskId()) + .cls(PolygonTaskBean.class) + .token(Constant.ACCESS_TOKEN) + .params(new HttpParams()) + .getRequest(new Callback() { + @Override + public void onSuccess(PolygonTaskBean response, int id) { + dismissLoadingDialog(); + if (response.getCode() == 200) {// 0.未领取 1.已领取,2.未保存(保存到本地但未提交成功),3.已保存(保存到本地提交成功),4已上传(结束采集), + PolygonTaskBean.BodyBean listBean = response.getBody(); + PoiEntity polygonEntity = new PoiEntity(); + if (listBean != null) { + polygonEntity.setTaskId(listBean.getId()); + polygonEntity.setName(listBean.getName()); + polygonEntity.setType(listBean.getType()); + polygonEntity.setGeoWkt(listBean.getGeo()); + String encodeStr = listBean.getGeo(); + String geo = Geohash.getInstance().decode(encodeStr); + // 生成对应的x和y poiEntity.setX + GeometryTools.obitainPoiEntityXY(geo, polygonEntity); + polygonEntity.setTaskStatus(1); } - }); + new Thread(new Runnable() { + @Override + public void run() { + InsertAndUpdateUtils.getInstance().insertOrUpdate(getContext(), polygonEntity); + if (getActivity() != null) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + initViewByTaskStatus(1); + ToastUtils.showToast(getActivity(),"领取成功"); + if (aBoolean) { + initCompleteTask(HttpInterface.SUBMIT_POLYGON_TASK, polygonEntity); + } else { + Message obtains = Message.obtain(); + obtains.what = Constant.JOB_WORD_MONITOR; + obtains.obj = true; + EventBus.getDefault().post(obtains); + } + } + }); + } + } + }).start(); + } else if (response.getCode() == 230) { + FlushTokenUtil.flushToken(getActivity()); + } else { + ToastUtils.showToast(getActivity(),response.getMessage()); + } } - } - }).start(); - } else if (response.getCode() == 230) { - FlushTokenUtil.flushToken(getActivity()); - } else { - ToastUtils.Message(getActivity(),response.getMessage()); - } - } - @Override - public void onError(Throwable e, int id) { - dismissLoadingDialog(); - String message = e.getMessage(); - assert message != null; - if (message.equals("timeout") || message.equals("Read time out")) { - ToastUtils.Message(getActivity(),"请求超时"); - } else { - ToastUtils.Message(getActivity(),message); - } - Log.d("TAG", "onError: " + e.getMessage()); + @Override + public void onError(Throwable e, int id) { + dismissLoadingDialog(); + String message = e.getMessage(); + assert message != null; + if (message.equals("timeout") || message.equals("Read time out")) { + ToastUtils.showToast(getActivity(),"请求超时"); + } else { + ToastUtils.showToast(getActivity(),message); + } + Log.d("TAG", "onError: " + e.getMessage()); + } + }); } }); + } + }).start(); } /* @@ -651,7 +659,7 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe */ private void initEndReceiveTask(String url, PoiEntity poiEntity) { if (poiEntity.getTaskId() == 0) { - ToastUtils.Message(getActivity(),"无此任务"); + ToastUtils.showToast(getActivity(),"无此任务"); return; } showLoadingDialog(); @@ -695,7 +703,7 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe } else if (response.getCode() == 230) { FlushTokenUtil.flushToken(getActivity()); } else { - ToastUtils.Message(getActivity(),response.getMessage()); + ToastUtils.showToast(getActivity(),response.getMessage()); } } @@ -705,9 +713,9 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe String message = e.getMessage(); assert message != null; if (message.equals("timeout") || message.equals("Read time out")) { - ToastUtils.Message(getActivity(),"请求超时"); + ToastUtils.showToast(getActivity(),"请求超时"); } else { - ToastUtils.Message(getActivity(),message); + ToastUtils.showToast(getActivity(),message); } } }); @@ -718,7 +726,7 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe */ private void initCompleteTask(String url, PoiEntity poiEntity) { if (poiEntity.getTaskId() == 0) { - ToastUtils.Message(getActivity(),"无此任务"); + ToastUtils.showToast(getActivity(),"无此任务"); return; } showLoadingDialog(); @@ -762,7 +770,7 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe } else if (response.getCode() == 230) { FlushTokenUtil.flushToken(getActivity()); } else { - ToastUtils.Message(getActivity(),response.getMessage()); + ToastUtils.showToast(getActivity(),response.getMessage()); } } @@ -772,9 +780,9 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe String message = e.getMessage(); assert message != null; if (message.equals("timeout") || message.equals("Read time out")) { - ToastUtils.Message(getActivity(),"请求超时"); + ToastUtils.showToast(getActivity(),"请求超时"); } else { - ToastUtils.Message(getActivity(),message); + ToastUtils.showToast(getActivity(),message); } } }); @@ -785,7 +793,7 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe */ private void initSubmitPolygonTask(String url, PoiEntity poiEntity) { if (poiEntity.getTaskId() == 0) { - ToastUtils.Message(getActivity(),"无此任务"); + ToastUtils.showToast(getActivity(),"无此任务"); return; } HttpParams httpParams = new HttpParams(); @@ -820,7 +828,7 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe dismissLoadingDialog(); if (response.getCode() == 200) { - ToastUtils.Message(getActivity(), "结束采集成功!"); + ToastUtils.showToast(getActivity(), "结束采集成功!"); new Thread(new Runnable() { @Override public void run() { @@ -841,7 +849,7 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe } else if (response.getCode() == 230) { FlushTokenUtil.flushToken(getActivity()); } else { - ToastUtils.Message(getActivity(),response.getMessage()); + ToastUtils.showToast(getActivity(),response.getMessage()); } } @@ -851,9 +859,9 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe String message = e.getMessage(); assert message != null; if (message.equals("timeout") || message.equals("Read time out")) { - ToastUtils.Message(getActivity(),"请求超时"); + ToastUtils.showToast(getActivity(),"请求超时"); } else { - ToastUtils.Message(getActivity(),message); + ToastUtils.showToast(getActivity(),message); } } }); @@ -864,7 +872,7 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe */ private void receivedTaskByNet(String url, PoiEntity poiEntity, boolean isSaver, int statusId) { if (poiEntity.getTaskId() == 0) { - ToastUtils.Message(getActivity(),"无此任务"); + ToastUtils.showToast(getActivity(),"无此任务"); return; } showLoadingDialog(); @@ -959,7 +967,7 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe } else if (response.getCode() == 230) { FlushTokenUtil.flushToken(getActivity()); } else { - ToastUtils.Message(getActivity(),response.getMessage()); + ToastUtils.showToast(getActivity(),response.getMessage()); } } @@ -969,9 +977,9 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe String message = e.getMessage(); assert message != null; if (message.equals("timeout") || message.equals("Read time out")) { - ToastUtils.Message(getActivity(),"请求超时"); + ToastUtils.showToast(getActivity(),"请求超时"); } else { - ToastUtils.Message(getActivity(),message); + ToastUtils.showToast(getActivity(),message); } } }); @@ -1077,7 +1085,7 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe } else if (response.getCode() == 230) { FlushTokenUtil.flushToken(getActivity()); } else { - ToastUtils.Message(getActivity(),response.getMessage()); + ToastUtils.showToast(getActivity(),response.getMessage()); } dismissLoadingDialog(); } @@ -1088,9 +1096,9 @@ public class GatherGetFragment extends BaseFragment implements View.OnClickListe String message = e.getMessage(); assert message != null; if (message.equals("timeout") || message.equals("Read time out")) { - ToastUtils.Message(getActivity(),"请求超时"); + ToastUtils.showToast(getActivity(),"请求超时"); } else { - ToastUtils.Message(getActivity(),message); + ToastUtils.showToast(getActivity(),message); } } }); diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java index 230eff0..50263a7 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java @@ -729,7 +729,7 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick } // 更新当前POI的置信度 - showPoiEntity.setCredible(data.getIntExtra(Constant.INTENT_PICTURES_CREDIBLE, 0)); + showPoiEntity.setScore(data.getIntExtra(Constant.INTENT_PICTURES_CREDIBLE, 0)); } } } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java index ac48969..3680686 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java @@ -640,23 +640,20 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList ToastUtils.Message(getActivity(), poiCheckResult.getMsg()); return; } - poiEntity.setTaskStatus(2); - new Thread(new Runnable() { - @Override - public void run() { - InsertAndUpdateUtils.getInstance().insertOrUpdate(getContext(), poiEntity); - requireActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - if (isLocal) { - roadSaveBetWork(poiEntity); - } else { - roadSaveWork(poiEntity); - } + if (existence == 0) { + DataSaveUtils.checkRoadPoiPicture(showPoiEntity, (List) fmRoadPic.getTag(), new DataSaveUtils.RoadPercentCheckCallback() { + @Override + public void callback(double percent) { + if (percent<=0.1) { + ToastUtils.Message(getActivity(), "手动拍摄的道路任务覆盖度小于10%时,不能选择‘道路正常开通’"); + return; } - }); - } - }).start(); + doSaveRoadData(poiEntity, isLocal); + } + }); + } else { + doSaveRoadData(poiEntity, isLocal); + } } else { ToastUtils.Message(getActivity(), "没有申请权限,请手动申请"); } @@ -673,6 +670,26 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList }); } + private void doSaveRoadData(PoiEntity poiEntity, boolean isLocal) { + poiEntity.setTaskStatus(2); + new Thread(new Runnable() { + @Override + public void run() { + InsertAndUpdateUtils.getInstance().insertOrUpdate(getContext(), poiEntity); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + if (isLocal) { + roadSaveBetWork(poiEntity); + } else { + roadSaveWork(poiEntity); + } + } + }); + } + }).start(); + } + private void roadSaveWork(PoiEntity poiEntity) { HttpParams httpParams = new HttpParams(); httpParams.put("taskId", poiEntity.getTaskId()); @@ -729,7 +746,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList @Override public void onError() { - + Constant.isPresent = true; } }); } else { @@ -986,6 +1003,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList poiEntity.setCreateTime(format); poiEntity.setType(4); poiEntity.setChecked(false); + poiEntity.setExistence(existence); if (showPoiEntity.getId() != null) { List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); if (fileListByUUID != null) { diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/StaySubmitFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/StaySubmitFragment.java index 4c4c585..214a939 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/StaySubmitFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/StaySubmitFragment.java @@ -115,6 +115,8 @@ public class StaySubmitFragment extends BaseFragment implements View.OnClickList Button btnStaySubmit = findViewById(R.id.btn_stay_submit); tvNumber = findViewById(R.id.tv_number); btnStaySubmit.setOnClickListener(this); + Button btnStayCancel = findViewById(R.id.btn_stay_cancel); + btnStayCancel.setOnClickListener(this); RecyclerView stayXrv = findViewById(R.id.stay_xrv); stayXrv.setLayoutManager(new LinearLayoutManager(getActivity())); stayXrv.addItemDecoration(new DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL)); @@ -363,6 +365,14 @@ public class StaySubmitFragment extends BaseFragment implements View.OnClickList ToastUtils.Message(getActivity(), "有正在提交的数据,等提交成功后,方可操作"); } break; + case R.id.btn_stay_cancel: + // 用户点击取消上传 + PoiSaveUtils.getInstance(requireActivity()).cancelUploadPoiEntityBatch(); + // 数据上传取消后重置上传状态 + staySubmitAdapter.setAllWorkType(0); + // 设置当前没有正在上传的数据 + Constant.isPresent = true; + break; } } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/TrafficHubFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/TrafficHubFragment.java index 6839fc0..5f4eebc 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/TrafficHubFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/TrafficHubFragment.java @@ -725,7 +725,7 @@ public class TrafficHubFragment extends BaseDrawerFragment implements View.OnCli } // 更新当前POI的置信度 - showPoiEntity.setCredible(data.getIntExtra(Constant.INTENT_PICTURES_CREDIBLE, 0)); + showPoiEntity.setScore(data.getIntExtra(Constant.INTENT_PICTURES_CREDIBLE, 0)); } } } diff --git a/app/src/main/java/com/navinfo/outdoor/room/PoiEntity.java b/app/src/main/java/com/navinfo/outdoor/room/PoiEntity.java index f7d4ba4..d46313d 100644 --- a/app/src/main/java/com/navinfo/outdoor/room/PoiEntity.java +++ b/app/src/main/java/com/navinfo/outdoor/room/PoiEntity.java @@ -53,7 +53,7 @@ public class PoiEntity implements Serializable { private int record_way; //等同于 canReceived : 1是可领取 0是不可领取 private int uploadProgress; // 上传进度 private int uploadMax; // 上传数据总量-这里一般使用需要上传的文件数量作为总数,因此上传进度为已上传的文件数 - private int credible; // 置信度 + private int score; // 置信度 private String drawLine; // 用户绘制的线型 private String uploadResult; //上传结果 @@ -302,12 +302,12 @@ public class PoiEntity implements Serializable { this.uploadMax = uploadMax; } - public int getCredible() { - return credible; + public int getScore() { + return score; } - public void setCredible(int credible) { - this.credible = credible; + public void setScore(int score) { + this.score = score; } public String getDrawLine() { diff --git a/app/src/main/java/com/navinfo/outdoor/util/DataSaveUtils.java b/app/src/main/java/com/navinfo/outdoor/util/DataSaveUtils.java index d6e30ee..3d84150 100644 --- a/app/src/main/java/com/navinfo/outdoor/util/DataSaveUtils.java +++ b/app/src/main/java/com/navinfo/outdoor/util/DataSaveUtils.java @@ -2,11 +2,14 @@ package com.navinfo.outdoor.util; import android.app.Activity; import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.os.Message; import android.util.Log; import androidx.appcompat.app.AppCompatActivity; +import com.elvishew.xlog.Logger; import com.elvishew.xlog.XLog; import com.github.lazylibrary.util.FileUtils; import com.github.lazylibrary.util.MD5; @@ -19,27 +22,38 @@ import com.kongzue.dialog.v3.WaitDialog; import com.lzy.okgo.OkGo; import com.lzy.okgo.model.HttpParams; import com.lzy.okgo.model.Response; +import com.navinfo.outdoor.activity.PicturesActivity; import com.navinfo.outdoor.api.Constant; import com.navinfo.outdoor.api.UserApplication; import com.navinfo.outdoor.bean.CommonRequestSend; import com.navinfo.outdoor.bean.CommonResponse; +import com.navinfo.outdoor.bean.LocationRecorder; import com.navinfo.outdoor.bean.PoiSaveBean; import com.navinfo.outdoor.http.Callback; import com.navinfo.outdoor.http.DialogCallback; import com.navinfo.outdoor.http.HttpInterface; import com.navinfo.outdoor.http.OkGoBuilder; import com.navinfo.outdoor.room.InsertAndUpdateUtils; +import com.navinfo.outdoor.room.LocationRecorderDao; import com.navinfo.outdoor.room.PoiDatabase; import com.navinfo.outdoor.room.PoiEntity; +import com.tencent.tencentmap.mapsdk.maps.model.LatLng; import com.umeng.commonsdk.debug.UMLog; import com.umeng.umcrash.UMCrash; import org.greenrobot.eventbus.EventBus; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.LineString; import java.io.File; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; @@ -60,10 +74,12 @@ import io.reactivex.schedulers.Schedulers; public class DataSaveUtils { private static DataSaveUtils instance; + private static Logger logger; public static DataSaveUtils getInstance() { if (instance == null) { instance = new DataSaveUtils(); + logger = XLogUtils.Companion.getInstance().getUploadLogWriter(); } return instance; } @@ -82,6 +98,9 @@ public class DataSaveUtils { @Override public void subscribe(ObservableEmitter emitter) throws Exception { if (!zipFile.exists()) { + // 首先检查图片中是否存在已损坏的图片 + List corruptImage = filterCorruptImages(poiPicList); + logger.d("存在损坏的照片:"+poiEntity.getId()+":"+poiEntity.getName()+list2Str(corruptImage)); // 开始压缩文件 ZipUtil.zipFiles(poiPicList, zipFile, "", null); } @@ -396,4 +415,69 @@ public class DataSaveUtils { } return result.toString(); } + + private List filterCorruptImages(List files) { + List corruptImage = new ArrayList<>(); + Iterator iterator = files.iterator(); + while (iterator.hasNext()) { + File file = iterator.next(); + if (file.length()==0) { + corruptImage.add(file); + iterator.remove(); + continue; + } + try { + Bitmap bitmap = BitmapFactory.decodeFile(file.getPath()); + if (bitmap == null) { + corruptImage.add(file); + iterator.remove(); + } + } catch (Exception e) { + corruptImage.add(file); + iterator.remove(); + } + } + + return corruptImage; + } + + /** + * 检查道路POI的照片数据,轨迹与道路任务长度比率必须大于0.1 + * */ + public static void checkRoadPoiPicture(PoiEntity poiEntity, List fileList, RoadPercentCheckCallback callback) { + new Thread(new Runnable() { + @Override + public void run() { + double lengthPercent = 0.0; + // 获取任务数据长度 + String geoWkt = poiEntity.getGeoWkt(); + if (geoWkt!=null) { + String geoDecode = Geohash.getInstance().decode(geoWkt); + Geometry originGeometry = GeometryTools.createGeometry(geoDecode); + + // 获取轨迹对应的geometry + if (fileList!=null&&!fileList.isEmpty()) { + File txtFile = new File(fileList.get(0).getParentFile(), "paper.txt"); + // 读取第一条数据和最后一条数据,获取时间,然后根据数据查询轨迹数据 + List txtStringList = FileUtils.readFileToList(txtFile.getAbsolutePath(), "utf-8"); + // 读取位置信息 + List latLngList = new ArrayList<>(txtStringList.size()); + for (String line: txtStringList) { + String[] itemArray = line.split(","); + // 获取数据的经纬度 + latLngList.add(new LatLng(Double.parseDouble(itemArray[2]), Double.parseDouble(itemArray[3]))); + } + // 构建轨迹的geometry + LineString trackLine = GeometryTools.getLineStainGeo(latLngList); + lengthPercent = trackLine.getLength()/originGeometry.getLength(); + } + } + callback.callback(lengthPercent); + } + }).start(); + } + + public interface RoadPercentCheckCallback{ + void callback(double percent); + } } diff --git a/app/src/main/java/com/navinfo/outdoor/util/PoiSaveUtils.java b/app/src/main/java/com/navinfo/outdoor/util/PoiSaveUtils.java index eedf67f..994079f 100644 --- a/app/src/main/java/com/navinfo/outdoor/util/PoiSaveUtils.java +++ b/app/src/main/java/com/navinfo/outdoor/util/PoiSaveUtils.java @@ -3,6 +3,7 @@ package com.navinfo.outdoor.util; import android.app.Activity; import android.os.Message; import android.util.Log; +import android.widget.Toast; import com.elvishew.xlog.Logger; import com.github.lazylibrary.util.FileUtils; @@ -55,6 +56,7 @@ public class PoiSaveUtils { private int bInt = 0; // 上传失败的个数 private int uploadCount = 0; // 上传的总个数 private Logger logger = XLogUtils.Companion.getInstance().getUploadLogWriter(); + private Disposable mDisposable;// Observeable取消订阅的对象 public static PoiSaveUtils getInstance(Activity mContext) { if (instance == null) { @@ -198,6 +200,7 @@ public class PoiSaveUtils { uploadCount = chargePoiEntityList.size()+spliteFilePoiEntityList.size()+otherPoiEntityList.size(); Log.d("PoiSaveUtils", "开始上传"); ToastUtils.showToast(mContext, "开始批量上传数据,本次共需上传"+uploadCount+"条数据"); + mDisposable = d; } @Override @@ -287,6 +290,8 @@ public class PoiSaveUtils { httpParams.put("address", poiEntity.getAddress()); httpParams.put("workType", 1); httpParams.put("memo", poiEntity.getMemo()); + httpParams.put("score", poiEntity.getScore()); + httpParams.put("drawLine", poiEntity.getDrawLine()); url = HttpInterface.INSIDE_API_LIST; } else if (poiEntity.getType() == 4) { httpParams.put("taskId", poiEntity.getTaskId()); @@ -705,4 +710,14 @@ public class PoiSaveUtils { } return isExistsPic; } + + public void cancelUploadPoiEntityBatch() { + if (mDisposable!=null&&!mDisposable.isDisposed()) { + mDisposable.dispose(); + Toast.makeText(mContext, "已取消批量上传流程", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(mContext, "没有需要取消的批量上传数据", Toast.LENGTH_SHORT).show(); + } + Constant.submitIdSet.clear(); // 清空记录的正在上传的id表 + } } diff --git a/app/src/main/res/layout/fragment_stay_submit.xml b/app/src/main/res/layout/fragment_stay_submit.xml index 2d1d681..25feafd 100644 --- a/app/src/main/res/layout/fragment_stay_submit.xml +++ b/app/src/main/res/layout/fragment_stay_submit.xml @@ -1,140 +1,168 @@ - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="wrap_content" + app:layout_constraintBottom_toBottomOf="parent">