From 3ac1a2854f23f61c61e537ea6a7add0c9a70438e Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期一, 02 十二月 2024 15:28:15 +0800
Subject: [PATCH] 1.上传巡检定位点相关功能 2.上传文件相关

---
 app/src/main/java/com/dayu/pipirrapp/dao/InspectionLocationDao.java      |   36 +
 app/src/main/java/com/dayu/pipirrapp/dao/DaoSingleton.java               |    4 
 app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java            |    1 
 app/src/main/assets/js/map.js                                            |    6 
 app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java     |  186 +++++++++
 app/src/main/java/com/dayu/pipirrapp/fragment/OrderFragment.java         |    1 
 app/src/main/res/layout/activity_order_deal.xml                          |    3 
 app/src/main/java/com/dayu/pipirrapp/MyApplication.java                  |    2 
 app/src/main/java/com/dayu/pipirrapp/net/MyIntercepterApplication.java   |    5 
 app/src/main/java/com/dayu/pipirrapp/bean/db/InspectionLocationBean.java |   72 +++
 app/src/main/java/com/dayu/pipirrapp/utils/DateUtils.java                |   32 +
 app/src/main/java/com/dayu/pipirrapp/bean/net/BaseRequest.java           |   38 ++
 app/src/main/java/com/dayu/pipirrapp/dao/InspectionDao.java              |   34 +
 app/src/main/java/com/dayu/pipirrapp/dao/AppDatabase.java                |    9 
 app/build.gradle                                                         |    1 
 app/src/main/java/com/dayu/pipirrapp/activity/OrderDetailActivity.java   |    2 
 app/src/main/java/com/dayu/pipirrapp/view/TitleBar.java                  |    6 
 app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java                 |   59 +++
 app/src/main/java/com/dayu/pipirrapp/service/MyLocationService.java      |    2 
 app/src/main/java/com/dayu/pipirrapp/bean/net/UplodFileState.java        |   56 ++
 app/src/main/java/com/dayu/pipirrapp/view/TagDialog.java                 |    1 
 app/src/main/java/com/dayu/pipirrapp/activity/SplashScreenActivity.java  |   29 
 app/src/main/java/com/dayu/pipirrapp/tool/InspectionUtils.java           |  112 +++++
 app/src/main/java/com/dayu/pipirrapp/net/upload/ProgressListener.java    |    5 
 app/src/main/java/com/dayu/pipirrapp/net/upload/UploadFileListener.java  |   14 
 app/src/main/java/com/dayu/pipirrapp/tool/FullyGridLayoutManager.java    |    2 
 app/src/main/java/com/dayu/pipirrapp/activity/LoginActivity.java         |    1 
 app/src/main/java/com/dayu/pipirrapp/net/upload/ProgressRequestBody.java |   53 ++
 app/src/main/java/com/dayu/pipirrapp/activity/MainActivity.java          |    6 
 app/src/main/java/com/dayu/pipirrapp/bean/db/InspectionBean.java         |   46 ++
 app/src/main/java/com/dayu/pipirrapp/bean/net/InspectionRequest.java     |  104 +++++
 app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java           |  176 +++++++-
 app/src/main/java/com/dayu/pipirrapp/net/ApiService.java                 |    4 
 33 files changed, 1,022 insertions(+), 86 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index d407df2..023987e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -173,6 +173,7 @@
     implementation "androidx.room:room-ktx:2.3.0"
     runtimeOnly("androidx.room:room-common:2.3.0")
     annotationProcessor "androidx.room:room-compiler:2.3.0"
+    implementation "androidx.room:room-rxjava3:2.3.0"
 
     //鍥剧墖
     implementation 'com.github.bumptech.glide:glide:4.11.0'
diff --git a/app/src/main/assets/js/map.js b/app/src/main/assets/js/map.js
index a574c9c..4dc5294 100644
--- a/app/src/main/assets/js/map.js
+++ b/app/src/main/assets/js/map.js
@@ -275,15 +275,15 @@
  
     function updateLocation(log,lat){
         var lastLat=lat;
-        const intervalId = setInterval(() => {
-            lastLat=lastLat+0.0001;
+        // const intervalId = setInterval(() => {
+            // lastLat=lastLat+0.0001;
             var newPoint = new T.LngLat(log,lastLat);
             path.push(newPoint);
             lineLayer.setLngLats(path);
             map.addOverLay(lineLayer);
              // 绉诲姩鍦板浘瑙嗚鍒版渶鍚庝竴涓綅缃�
              map.panTo(newPoint);
-        }, 500);
+        // }, 500);
     
     }
 
diff --git a/app/src/main/java/com/dayu/pipirrapp/MyApplication.java b/app/src/main/java/com/dayu/pipirrapp/MyApplication.java
index d51ea9d..d0d67aa 100644
--- a/app/src/main/java/com/dayu/pipirrapp/MyApplication.java
+++ b/app/src/main/java/com/dayu/pipirrapp/MyApplication.java
@@ -16,10 +16,12 @@
  */
 public class MyApplication extends Application {
     public static MyApplication myApplication;
+    //鏁版嵁搴撶殑tag鍊�
     public String myTag = "-1";
     public String token;
     public String userId;
 
+
     @Override
     public void onCreate() {
         super.onCreate();
diff --git a/app/src/main/java/com/dayu/pipirrapp/activity/LoginActivity.java b/app/src/main/java/com/dayu/pipirrapp/activity/LoginActivity.java
index 4201472..8e62470 100644
--- a/app/src/main/java/com/dayu/pipirrapp/activity/LoginActivity.java
+++ b/app/src/main/java/com/dayu/pipirrapp/activity/LoginActivity.java
@@ -27,7 +27,6 @@
 import com.dayu.pipirrapp.net.BaseResponse;
 import com.dayu.pipirrapp.net.subscribers.SubscriberListener;
 import com.dayu.pipirrapp.observer.LoginObserver;
-import com.dayu.pipirrapp.utils.CommonData;
 import com.dayu.pipirrapp.utils.CommonKeyName;
 import com.dayu.pipirrapp.utils.SharedPreferencesHelper;
 import com.dayu.pipirrapp.utils.ToastUtil;
diff --git a/app/src/main/java/com/dayu/pipirrapp/activity/MainActivity.java b/app/src/main/java/com/dayu/pipirrapp/activity/MainActivity.java
index 4d3180b..2976fb0 100644
--- a/app/src/main/java/com/dayu/pipirrapp/activity/MainActivity.java
+++ b/app/src/main/java/com/dayu/pipirrapp/activity/MainActivity.java
@@ -9,8 +9,11 @@
 import androidx.core.content.ContextCompat;
 import androidx.fragment.app.Fragment;
 
+import com.dayu.pipirrapp.MyApplication;
 import com.dayu.pipirrapp.R;
 import com.dayu.pipirrapp.adapter.TabAdapter;
+import com.dayu.pipirrapp.bean.db.TagBean;
+import com.dayu.pipirrapp.dao.DaoSingleton;
 import com.dayu.pipirrapp.databinding.ActivityMainBinding;
 import com.dayu.pipirrapp.fragment.OrderFragment;
 import com.dayu.pipirrapp.fragment.MapFragment;
@@ -42,6 +45,9 @@
         setupFragments();
         initView();
         initTab();
+
+        TagBean tagBean = DaoSingleton.getInstance(this).tagDao().findFirst();
+        MyApplication.myApplication.myTag = tagBean.getTag();
         mqttManager = new MqttManager(this);
         mqttManager.connect();
     }
diff --git a/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java b/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java
index fb91e02..cebbdd9 100644
--- a/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java
+++ b/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java
@@ -1,14 +1,15 @@
 package com.dayu.pipirrapp.activity;
 
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
 import android.os.Bundle;
-import android.provider.MediaStore;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.view.animation.Animation;
-import android.view.animation.AnimationUtils;
 
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.recyclerview.widget.SimpleItemAnimator;
@@ -17,20 +18,31 @@
 import com.dayu.pipirrapp.databinding.ActivityOrderDealBinding;
 import com.dayu.pipirrapp.tool.FullyGridLayoutManager;
 import com.dayu.pipirrapp.tool.GlideEngine;
+import com.dayu.pipirrapp.view.TitleBar;
 import com.luck.picture.lib.basic.PictureSelectionModel;
 import com.luck.picture.lib.basic.PictureSelector;
-import com.luck.picture.lib.config.PictureConfig;
+import com.luck.picture.lib.config.PictureMimeType;
 import com.luck.picture.lib.config.SelectMimeType;
-import com.luck.picture.lib.config.SelectModeConfig;
 import com.luck.picture.lib.decoration.GridSpacingItemDecoration;
+import com.luck.picture.lib.engine.CompressFileEngine;
+import com.luck.picture.lib.engine.ImageEngine;
 import com.luck.picture.lib.entity.LocalMedia;
-import com.luck.picture.lib.interfaces.OnGridItemSelectAnimListener;
-import com.luck.picture.lib.interfaces.OnQueryFilterListener;
-import com.luck.picture.lib.interfaces.OnSelectAnimListener;
+import com.luck.picture.lib.entity.MediaExtraInfo;
+import com.luck.picture.lib.interfaces.OnExternalPreviewEventListener;
+import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
+import com.luck.picture.lib.utils.DateUtils;
 import com.luck.picture.lib.utils.DensityUtil;
+import com.luck.picture.lib.utils.MediaUtils;
+import com.luck.picture.lib.utils.PictureFileUtils;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
+
+import top.zibin.luban.CompressionPredicate;
+import top.zibin.luban.Luban;
+import top.zibin.luban.OnNewCompressListener;
+import top.zibin.luban.OnRenameListener;
 
 /**
  * OrderDealDetailActivity -
@@ -41,24 +53,28 @@
  * @since 2024-11-27
  */
 public class OrderDealActivity extends BaseActivity {
-
+    private String TAG = "OrderDealActivity";
     ActivityOrderDealBinding binding;
     RecyclerView mRecyclerView;
     AddPictureAdapter mAdapter;
     int maxSelectNum = 10;//鏈�澶х収鐗�
     int maxSelectVideoNum = 0;//鏈�澶ц棰�
     private final List<LocalMedia> mData = new ArrayList<>();
+    private ActivityResultLauncher<Intent> launcherResult;
+    private ImageEngine imageEngine;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         binding = ActivityOrderDealBinding.inflate(LayoutInflater.from(this));
         setContentView(binding.getRoot());
+        launcherResult = createActivityResultLauncher();
         initView();
     }
 
 
     void initView() {
+        new TitleBar(this).setTitleText("澶勭悊宸ュ崟").setLeftIco().setLeftIcoListening(v -> OrderDealActivity.this.finish());
         mRecyclerView = binding.recycler;
         FullyGridLayoutManager manager = new FullyGridLayoutManager(this,
                 4, GridLayoutManager.VERTICAL, false);
@@ -72,29 +88,171 @@
         mAdapter = new AddPictureAdapter(this, mData);
         mAdapter.setSelectMax(maxSelectNum + maxSelectVideoNum);
         mRecyclerView.setAdapter(mAdapter);
+        imageEngine = GlideEngine.createGlideEngine();
         mAdapter.setOnItemClickListener(new AddPictureAdapter.OnItemClickListener() {
             @Override
             public void onItemClick(View v, int position) {
-
+                // 棰勮鍥剧墖銆佽棰戙�侀煶棰�
+                PictureSelector.create(OrderDealActivity.this)
+                        .openPreview()
+                        .setImageEngine(imageEngine)
+                        .setExternalPreviewEventListener(new MyExternalPreviewEventListener())
+                        .startActivityPreview(position, true, mAdapter.getData());
             }
 
             @Override
             public void openPicture() {
+                //娣诲姞鍥剧墖
                 mOpenPicture();
             }
         });
     }
 
+    /**
+     * 娣诲姞鍥剧墖
+     */
     private void mOpenPicture() {
         // 杩涘叆鐩稿唽
         PictureSelectionModel selectionModel = PictureSelector.create(this)
                 .openGallery(SelectMimeType.ofImage())
                 .setMaxSelectNum(maxSelectNum)
                 .setMaxVideoSelectNum(maxSelectVideoNum)
-                .setImageEngine(GlideEngine.createGlideEngine())
+                .setImageEngine(imageEngine)
+                //璁剧疆鍥剧墖鍘嬬缉
+                .setCompressEngine(new ImageFileCompressEngine())
                 .setSelectedData(mAdapter.getData());
 
-        selectionModel.forResult(PictureConfig.CHOOSE_REQUEST);
+        selectionModel.forResult(launcherResult);
+    }
+
+    /**
+     * 鍒涘缓涓�涓狝ctivityResultLauncher
+     *
+     * @return
+     */
+    private ActivityResultLauncher<Intent> createActivityResultLauncher() {
+        return registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
+                result -> {
+                    int resultCode = result.getResultCode();
+                    if (resultCode == RESULT_OK) {
+                        ArrayList<LocalMedia> selectList = PictureSelector.obtainSelectorList(result.getData());
+                        analyticalSelectResults(selectList);
+                    } else if (resultCode == RESULT_CANCELED) {
+                        Log.i(TAG, "onActivityResult PictureSelector Cancel");
+                    }
+                });
+    }
+
+    /**
+     * 澶栭儴棰勮鐩戝惉浜嬩欢
+     */
+    private class MyExternalPreviewEventListener implements OnExternalPreviewEventListener {
+
+        @Override
+        public void onPreviewDelete(int position) {
+            mAdapter.remove(position);
+            mAdapter.notifyItemRemoved(position);
+        }
+
+        @Override
+        public boolean onLongPressDownload(Context context, LocalMedia media) {
+            return false;
+        }
+    }
+
+    /**
+     * 澶勭悊閫夋嫨缁撴灉
+     *
+     * @param result
+     */
+    private void analyticalSelectResults(ArrayList<LocalMedia> result) {
+        for (LocalMedia media : result) {
+            if (media.getWidth() == 0 || media.getHeight() == 0) {
+                if (PictureMimeType.isHasImage(media.getMimeType())) {
+                    MediaExtraInfo imageExtraInfo = MediaUtils.getImageSize(this, media.getPath());
+                    media.setWidth(imageExtraInfo.getWidth());
+                    media.setHeight(imageExtraInfo.getHeight());
+                } else if (PictureMimeType.isHasVideo(media.getMimeType())) {
+                    MediaExtraInfo videoExtraInfo = MediaUtils.getVideoSize(this, media.getPath());
+                    media.setWidth(videoExtraInfo.getWidth());
+                    media.setHeight(videoExtraInfo.getHeight());
+                }
+            }
+            Log.i(TAG, "鏂囦欢鍚�: " + media.getFileName());
+            Log.i(TAG, "鏄惁鍘嬬缉:" + media.isCompressed());
+            Log.i(TAG, "鍘嬬缉:" + media.getCompressPath());
+            Log.i(TAG, "鍒濆璺緞:" + media.getPath());
+            Log.i(TAG, "缁濆璺緞:" + media.getRealPath());
+            Log.i(TAG, "鏄惁瑁佸壀:" + media.isCut());
+            Log.i(TAG, "瑁佸壀璺緞:" + media.getCutPath());
+            Log.i(TAG, "鏄惁寮�鍚師鍥�:" + media.isOriginal());
+            Log.i(TAG, "鍘熷浘璺緞:" + media.getOriginalPath());
+            Log.i(TAG, "娌欑洅璺緞:" + media.getSandboxPath());
+            Log.i(TAG, "姘村嵃璺緞:" + media.getWatermarkPath());
+            Log.i(TAG, "瑙嗛缂╃暐鍥�:" + media.getVideoThumbnailPath());
+            Log.i(TAG, "鍘熷瀹介珮: " + media.getWidth() + "x" + media.getHeight());
+            Log.i(TAG, "瑁佸壀瀹介珮: " + media.getCropImageWidth() + "x" + media.getCropImageHeight());
+            Log.i(TAG, "鏂囦欢澶у皬: " + PictureFileUtils.formatAccurateUnitFileSize(media.getSize()));
+            Log.i(TAG, "鏂囦欢鏃堕暱: " + media.getDuration());
+        }
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                boolean isMaxSize = result.size() == mAdapter.getSelectMax();
+                int oldSize = mAdapter.getData().size();
+                mAdapter.notifyItemRangeRemoved(0, isMaxSize ? oldSize + 1 : oldSize);
+                mAdapter.getData().clear();
+
+                mAdapter.getData().addAll(result);
+                mAdapter.notifyItemRangeInserted(0, result.size());
+            }
+        });
+    }
+
+
+    /**
+     * 鑷畾涔夊浘鐗囧帇缂�
+     */
+    private static class ImageFileCompressEngine implements CompressFileEngine {
+
+        @Override
+        public void onStartCompress(Context context, ArrayList<Uri> source, OnKeyValueResultCallbackListener call) {
+            Luban.with(context).load(source).ignoreBy(100).setRenameListener(new OnRenameListener() {
+                @Override
+                public String rename(String filePath) {
+                    int indexOf = filePath.lastIndexOf(".");
+                    String postfix = indexOf != -1 ? filePath.substring(indexOf) : ".jpg";
+                    return DateUtils.getCreateFileName("CMP_") + postfix;
+                }
+            }).filter(new CompressionPredicate() {
+                @Override
+                public boolean apply(String path) {
+                    if (PictureMimeType.isUrlHasImage(path) && !PictureMimeType.isHasHttp(path)) {
+                        return true;
+                    }
+                    return !PictureMimeType.isUrlHasGif(path);
+                }
+            }).setCompressListener(new OnNewCompressListener() {
+                @Override
+                public void onStart() {
+
+                }
+
+                @Override
+                public void onSuccess(String source, File compressFile) {
+                    if (call != null) {
+                        call.onCallback(source, compressFile.getAbsolutePath());
+                    }
+                }
+
+                @Override
+                public void onError(String source, Throwable e) {
+                    if (call != null) {
+                        call.onCallback(source, null);
+                    }
+                }
+            }).launch();
+        }
     }
 
 
diff --git a/app/src/main/java/com/dayu/pipirrapp/activity/OrderDetailActivity.java b/app/src/main/java/com/dayu/pipirrapp/activity/OrderDetailActivity.java
index dc59338..9d7f7e9 100644
--- a/app/src/main/java/com/dayu/pipirrapp/activity/OrderDetailActivity.java
+++ b/app/src/main/java/com/dayu/pipirrapp/activity/OrderDetailActivity.java
@@ -37,7 +37,7 @@
         binding = ActivityOrderDetailBinding.inflate(LayoutInflater.from(this));
         setContentView(binding.getRoot());
 
-        new TitleBar(this).setTitleText("宸ュ崟璇︽儏");
+        new TitleBar(this).setTitleText("宸ュ崟璇︽儏").setLeftIco().setLeftIcoListening(v -> OrderDetailActivity.this.finish());
         initView();
     }
 
diff --git a/app/src/main/java/com/dayu/pipirrapp/activity/SplashScreenActivity.java b/app/src/main/java/com/dayu/pipirrapp/activity/SplashScreenActivity.java
index c9602bd..1fe2024 100644
--- a/app/src/main/java/com/dayu/pipirrapp/activity/SplashScreenActivity.java
+++ b/app/src/main/java/com/dayu/pipirrapp/activity/SplashScreenActivity.java
@@ -30,18 +30,23 @@
         binding = ActivitySplashScreenBinding.inflate(LayoutInflater.from(this));
         setContentView(binding.getRoot());
         new Handler().postDelayed(() -> {
-//            LoginBean loginBean = DaoSingleton.getInstance(SplashScreenActivity.this).loginDao().findFirst();
-//            String token = SharedPreferencesHelper.getInstance(SplashScreenActivity.this).get(CommonKeyName.Token, "");
-//            if (loginBean != null && !TextUtils.isEmpty(token)) {
-//                startMainActivity();
-//                MyApplication.myApplication.token = token;
-//                MyApplication.myApplication.userId = loginBean.getUserID();
-//            } else {
-//                startLoginActivity();
-//            }
-            Intent intent = new Intent(this, OrderDealActivity.class);
-            startActivity(intent);
-            SplashScreenActivity.this.finish();
+            try {
+                LoginBean loginBean = DaoSingleton.getInstance(SplashScreenActivity.this).loginDao().findFirst();
+                String token = SharedPreferencesHelper.getInstance(SplashScreenActivity.this).get(CommonKeyName.Token, "");
+                if (loginBean != null && !TextUtils.isEmpty(token)) {
+                    startMainActivity();
+                    MyApplication.myApplication.token = token;
+                    MyApplication.myApplication.userId = loginBean.getUserID();
+                } else {
+                    startLoginActivity();
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                startLoginActivity();
+            }
+//            Intent intent = new Intent(this, OrderDealActivity.class);
+//            startActivity(intent);
+//            SplashScreenActivity.this.finish();
         }, 1000);
     }
 
diff --git a/app/src/main/java/com/dayu/pipirrapp/bean/db/InspectionBean.java b/app/src/main/java/com/dayu/pipirrapp/bean/db/InspectionBean.java
new file mode 100644
index 0000000..e43d988
--- /dev/null
+++ b/app/src/main/java/com/dayu/pipirrapp/bean/db/InspectionBean.java
@@ -0,0 +1,46 @@
+package com.dayu.pipirrapp.bean.db;
+
+import androidx.room.Entity;
+import androidx.room.PrimaryKey;
+
+/**
+ * InspectionBean -宸℃璁板綍寮�濮嬫椂闂村拰缁撴潫鏃堕棿鐩稿叧淇℃伅
+ *
+ * @author zuoxiao
+ * @version 1.0
+ * @since 2024-11-29
+ */
+@Entity
+public class InspectionBean {
+    @PrimaryKey(autoGenerate = true)
+    public long id;
+    String inspectId;//宸℃ID
+    String startTime;//寮�濮嬪贰妫�鏃堕棿
+    String stopTime;//鍋滄宸℃鏃堕棿
+
+
+    public String getInspectId() {
+        return inspectId;
+    }
+
+    public void setInspectId(String inspectId) {
+        this.inspectId = inspectId;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getStopTime() {
+        return stopTime;
+    }
+
+    public void setStopTime(String stopTime) {
+        this.stopTime = stopTime;
+    }
+
+}
diff --git a/app/src/main/java/com/dayu/pipirrapp/bean/db/InspectionLocationBean.java b/app/src/main/java/com/dayu/pipirrapp/bean/db/InspectionLocationBean.java
new file mode 100644
index 0000000..31e37e2
--- /dev/null
+++ b/app/src/main/java/com/dayu/pipirrapp/bean/db/InspectionLocationBean.java
@@ -0,0 +1,72 @@
+package com.dayu.pipirrapp.bean.db;
+
+import androidx.room.Entity;
+import androidx.room.PrimaryKey;
+
+/**
+ * InspectionBean - 宸℃璁板綍鐨勫潗鏍囩浉鍏充俊鎭�
+ *
+ * @author zuoxiao
+ * @version 1.0
+ * @since 2024-11-29
+ */
+@Entity
+public class InspectionLocationBean {
+    @PrimaryKey(autoGenerate = true)
+    public long id;
+    String inspectorId;//宸℃鍛業D
+    String inspectId;//宸℃ID
+    String lng;//缁忓害
+    String lat;//绾害
+    String locateTime;//鎵撶偣鏃堕棿
+    boolean isPost;//鏄惁宸茬粡涓婁紶
+
+    public String getInspectorId() {
+        return inspectorId;
+    }
+
+    public void setInspectorId(String inspectorId) {
+        this.inspectorId = inspectorId;
+    }
+
+    public String getInspectId() {
+        return inspectId;
+    }
+
+    public void setInspectId(String inspectId) {
+        this.inspectId = inspectId;
+    }
+
+
+    public String getLng() {
+        return lng;
+    }
+
+    public void setLng(String lng) {
+        this.lng = lng;
+    }
+
+    public String getLat() {
+        return lat;
+    }
+
+    public void setLat(String lat) {
+        this.lat = lat;
+    }
+
+    public String getLocateTime() {
+        return locateTime;
+    }
+
+    public void setLocateTime(String locateTime) {
+        this.locateTime = locateTime;
+    }
+
+    public boolean isPost() {
+        return isPost;
+    }
+
+    public void setPost(boolean post) {
+        isPost = post;
+    }
+}
diff --git a/app/src/main/java/com/dayu/pipirrapp/bean/net/BaseRequest.java b/app/src/main/java/com/dayu/pipirrapp/bean/net/BaseRequest.java
new file mode 100644
index 0000000..e5dc869
--- /dev/null
+++ b/app/src/main/java/com/dayu/pipirrapp/bean/net/BaseRequest.java
@@ -0,0 +1,38 @@
+package com.dayu.pipirrapp.bean.net;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * BaseRequest -
+ *
+ * @author zuoxiao
+ * @version 1.0
+ * @since 2024-12-02
+ */
+public class BaseRequest {
+    /**
+     * 瀵硅薄杞琈ap
+     *
+     * @param object
+     * @return
+     * @throws IllegalAccessException
+     */
+    public Map toMap(Object object) {
+        Map<String, Object> map = null;
+        try {
+            map = new HashMap<String, Object>();
+            Field[] fields = object.getClass().getDeclaredFields();
+            for (Field field : fields) {
+                field.setAccessible(true);
+                if (field.get(object) != null) {
+                    map.put(field.getName(), field.get(object));
+                }
+            }
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+}
diff --git a/app/src/main/java/com/dayu/pipirrapp/bean/net/InspectionRequest.java b/app/src/main/java/com/dayu/pipirrapp/bean/net/InspectionRequest.java
new file mode 100644
index 0000000..d034eec
--- /dev/null
+++ b/app/src/main/java/com/dayu/pipirrapp/bean/net/InspectionRequest.java
@@ -0,0 +1,104 @@
+package com.dayu.pipirrapp.bean.net;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * InspectionRequest -
+ *
+ * @author zuoxiao
+ * @version 1.0
+ * @since 2024-12-02
+ */
+public class InspectionRequest extends BaseRequest{
+    private String inspectorId;
+    private String inspectId;
+    private String startTime;
+    private String stopTime;
+    private List<Track> tracks;
+
+
+    public String getInspectorId() {
+        return inspectorId;
+    }
+
+    public void setInspectorId(String inspectorId) {
+        this.inspectorId = inspectorId;
+    }
+
+    public String getInspectId() {
+        return inspectId;
+    }
+
+    public void setInspectId(String inspectId) {
+        this.inspectId = inspectId;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getStopTime() {
+        return stopTime;
+    }
+
+    public void setStopTime(String stopTime) {
+        this.stopTime = stopTime;
+    }
+
+    public List<Track> getTracks() {
+        return tracks;
+    }
+
+    public void setTracks(List<Track> tracks) {
+        this.tracks = tracks;
+    }
+
+    public void addTracks(Track track) {
+        if (tracks == null) {
+            tracks = new ArrayList<>();
+        }
+        tracks.add(track);
+    }
+
+
+
+    // Track 鏁版嵁绫�
+    public static class Track {
+        private String lng;
+        private String lat;
+        private String locateTime;
+
+
+        public String getLng() {
+            return lng;
+        }
+
+        public void setLng(String lng) {
+            this.lng = lng;
+        }
+
+        public String getLat() {
+            return lat;
+        }
+
+        public void setLat(String lat) {
+            this.lat = lat;
+        }
+
+        public String getLocateTime() {
+            return locateTime;
+        }
+
+        public void setLocateTime(String locateTime) {
+            this.locateTime = locateTime;
+        }
+
+    }
+}
+
+
diff --git a/app/src/main/java/com/dayu/pipirrapp/bean/net/UplodFileState.java b/app/src/main/java/com/dayu/pipirrapp/bean/net/UplodFileState.java
new file mode 100644
index 0000000..17ec2bf
--- /dev/null
+++ b/app/src/main/java/com/dayu/pipirrapp/bean/net/UplodFileState.java
@@ -0,0 +1,56 @@
+package com.dayu.pipirrapp.bean.net;
+
+import java.io.File;
+
+/**
+ * Copyright (C), 2023,
+ * Author: zuo
+ * Date: 2023-04-15 8:15
+ * Description:
+ */
+public class UplodFileState {
+    int state = 0;//0姝e湪涓婁紶 1涓婁紶瀹屾垚 2涓婁紶澶辫触
+    File file;//涓婁紶鐨勬枃浠�
+    String url;//涓婁紶鏂囦欢鍚庤繑鍥炵殑url
+    int number;//澶辫触鍚庨噸璇曠殑娆℃暟
+
+    public int getNumber() {
+        return number;
+    }
+
+    public void setNumber(int number) {
+        this.number = number;
+    }
+
+    public UplodFileState() {
+
+    }
+
+    public UplodFileState(File file) {
+        this.file = file;
+    }
+
+    public int getState() {
+        return state;
+    }
+
+    public void setState(int state) {
+        this.state = state;
+    }
+
+    public File getFile() {
+        return file;
+    }
+
+    public void setFile(File file) {
+        this.file = file;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}
diff --git a/app/src/main/java/com/dayu/pipirrapp/dao/AppDatabase.java b/app/src/main/java/com/dayu/pipirrapp/dao/AppDatabase.java
index 0fabe10..5316560 100644
--- a/app/src/main/java/com/dayu/pipirrapp/dao/AppDatabase.java
+++ b/app/src/main/java/com/dayu/pipirrapp/dao/AppDatabase.java
@@ -4,10 +4,11 @@
 import androidx.room.RoomDatabase;
 
 import com.dayu.pipirrapp.bean.db.CenterPointBean;
+import com.dayu.pipirrapp.bean.db.InspectionBean;
+import com.dayu.pipirrapp.bean.db.InspectionLocationBean;
 import com.dayu.pipirrapp.bean.db.LoginBean;
 import com.dayu.pipirrapp.bean.db.MarkerBean;
 import com.dayu.pipirrapp.bean.db.TagBean;
-
 
 
 /**
@@ -16,7 +17,7 @@
  * Date: 2023-11-05 16:23
  * Description:
  */
-@Database(entities = {TagBean.class, LoginBean.class, CenterPointBean.class, MarkerBean.class}, version = 1, exportSchema = false)
+@Database(entities = {InspectionBean.class,InspectionLocationBean.class, TagBean.class, LoginBean.class, CenterPointBean.class, MarkerBean.class}, version = 1, exportSchema = false)
 public abstract class AppDatabase extends RoomDatabase {
 
 
@@ -28,4 +29,8 @@
 
     public abstract MarkerDao markerDao();
 
+    public abstract InspectionDao inspectionDao();
+
+    public abstract InspectionLocationDao inspectionLocationDao();
+
 }
diff --git a/app/src/main/java/com/dayu/pipirrapp/dao/DaoSingleton.java b/app/src/main/java/com/dayu/pipirrapp/dao/DaoSingleton.java
index 225ea44..fe5d101 100644
--- a/app/src/main/java/com/dayu/pipirrapp/dao/DaoSingleton.java
+++ b/app/src/main/java/com/dayu/pipirrapp/dao/DaoSingleton.java
@@ -14,8 +14,8 @@
  * Description: 鍒涘缓鏁版嵁搴撳疄渚�
  */
 public class DaoSingleton {
-    public static AppDatabase baseDao;
-    public static AppDatabase AsynchBaseDao;
+    private static AppDatabase baseDao;
+    private static AppDatabase AsynchBaseDao;
     public static String name = "dayu_data";
 
     //MyFileUtil.SqlitePath +
diff --git a/app/src/main/java/com/dayu/pipirrapp/dao/InspectionDao.java b/app/src/main/java/com/dayu/pipirrapp/dao/InspectionDao.java
new file mode 100644
index 0000000..eb0ddb2
--- /dev/null
+++ b/app/src/main/java/com/dayu/pipirrapp/dao/InspectionDao.java
@@ -0,0 +1,34 @@
+package com.dayu.pipirrapp.dao;
+
+import androidx.room.Dao;
+import androidx.room.Delete;
+import androidx.room.Insert;
+import androidx.room.OnConflictStrategy;
+import androidx.room.Query;
+import androidx.room.Update;
+
+import com.dayu.pipirrapp.bean.db.InspectionBean;
+
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Single;
+
+
+@Dao
+public interface InspectionDao {
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    Completable insert(InspectionBean inspectionBean);
+
+    @Update
+    void update(InspectionBean inspectionBean);
+
+    @Delete
+    void delete(InspectionBean inspectionBean);
+
+    @Query("DELETE FROM InspectionBean")
+    void deleteAll();
+
+    //鏌ヨ褰撳墠娌℃湁鍏抽棴宸℃鐨勫贰妫�ID
+    @Query("SELECT * FROM InspectionBean WHERE stopTime IS NULL OR stopTime = '' ORDER BY startTime DESC LIMIT 1")
+    Single<InspectionBean> getMostRecentInspectionWithNoStopTime();
+
+}
diff --git a/app/src/main/java/com/dayu/pipirrapp/dao/InspectionLocationDao.java b/app/src/main/java/com/dayu/pipirrapp/dao/InspectionLocationDao.java
new file mode 100644
index 0000000..68b69ec
--- /dev/null
+++ b/app/src/main/java/com/dayu/pipirrapp/dao/InspectionLocationDao.java
@@ -0,0 +1,36 @@
+package com.dayu.pipirrapp.dao;
+
+import androidx.room.Dao;
+import androidx.room.Delete;
+import androidx.room.Insert;
+import androidx.room.OnConflictStrategy;
+import androidx.room.Query;
+import androidx.room.Update;
+
+import com.dayu.pipirrapp.bean.db.InspectionLocationBean;
+
+import java.util.List;
+
+import io.reactivex.rxjava3.core.Completable;
+
+@Dao
+public interface InspectionLocationDao {
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    Completable insert(InspectionLocationBean inspectionLocationBean);
+
+    @Update
+    Completable update(InspectionLocationBean inspectionLocationBean);
+
+    @Delete
+    void delete(InspectionLocationBean inspectionLocationBean);
+
+    @Query("DELETE FROM InspectionLocationBean")
+    void deleteAll();
+
+    @Query("select  * from InspectionLocationBean limit 1")
+    InspectionLocationBean findFirst();
+
+    //鏌ヨ鎵�鏈夋病鏈変笂浼犵殑鍧愭爣
+    @Query("select  * from InspectionLocationBean where isPost=false")
+    List<InspectionLocationBean> findByNoPost();
+}
diff --git a/app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java b/app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
index e8e1f24..1ce4b82 100644
--- a/app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
+++ b/app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
@@ -1,10 +1,15 @@
 package com.dayu.pipirrapp.fragment;
 
+import static com.dayu.pipirrapp.net.Constants.BASE_URL;
+import static com.dayu.pipirrapp.tool.InspectionUtils.addInspectionLocationData;
+import static com.dayu.pipirrapp.tool.InspectionUtils.updateInspectionLocationData;
+
 import android.content.Context;
 import android.content.Intent;
 import android.location.LocationManager;
 import android.os.Build;
 import android.os.Bundle;
+import android.text.TextUtils;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -20,10 +25,15 @@
 import androidx.annotation.Nullable;
 import androidx.lifecycle.Observer;
 
+import com.dayu.pipirrapp.MyApplication;
 import com.dayu.pipirrapp.bean.db.CenterPointBean;
+import com.dayu.pipirrapp.bean.db.InspectionBean;
+import com.dayu.pipirrapp.bean.db.InspectionLocationBean;
 import com.dayu.pipirrapp.bean.db.LatLonBean;
 import com.dayu.pipirrapp.bean.db.MarkerBean;
 import com.dayu.pipirrapp.bean.net.CenterPointResult;
+import com.dayu.pipirrapp.bean.net.InspectionRequest;
+import com.dayu.pipirrapp.bean.net.LoginResult;
 import com.dayu.pipirrapp.bean.net.MarkerResult;
 import com.dayu.pipirrapp.dao.DaoSingleton;
 import com.dayu.pipirrapp.databinding.FragmentMapBinding;
@@ -34,8 +44,10 @@
 import com.dayu.pipirrapp.net.subscribers.SubscriberListener;
 import com.dayu.pipirrapp.observer.MapFragmenObserver;
 import com.dayu.pipirrapp.service.MyLocationService;
+import com.dayu.pipirrapp.tool.InspectionUtils;
 import com.dayu.pipirrapp.utils.CommonData;
 import com.dayu.pipirrapp.utils.CommonKeyName;
+import com.dayu.pipirrapp.utils.DateUtils;
 import com.dayu.pipirrapp.utils.MapJpgUtils;
 import com.dayu.pipirrapp.utils.MyLog;
 import com.dayu.pipirrapp.utils.SharedPreferencesHelper;
@@ -43,12 +55,15 @@
 import com.dayu.pipirrapp.utils.WebViewUtils;
 import com.dayu.pipirrapp.view.ConfirmDialog;
 import com.jeremyliao.liveeventbus.LiveEventBus;
+import com.tencent.bugly.crashreport.CrashReport;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Random;
 
 import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
@@ -70,8 +85,13 @@
     WebView mWebView;
     CenterPointBean centerPointBean;
     String strMarkerJson;
+    //鏄惁鏄剧ず
     boolean isStartInspec = false;
     MapFragmenObserver mapFragmenObserver;
+    //褰撳墠宸℃璁板綍鐨勭浉鍏充俊鎭�
+    InspectionBean mInspectionBean;
+    LatLonBean lastLatLonBean;
+    InspectionRequest inspectionRequest;
 
     @Override
     public void onAttach(@NonNull Context context) {
@@ -86,48 +106,12 @@
         super.onCreate(savedInstanceState);
         Log.i(TAG, "onCreate");
         isStartInspec = SharedPreferencesHelper.getInstance(this.getContext()).get(CommonKeyName.isStartInspec, false);
-
     }
 
     @Override
     public void onStart() {
         super.onStart();
         Log.i(TAG, "onStart");
-    }
-
-    /**
-     * 淇敼宸℃鐘舵��
-     */
-    private void chageInspecState() {
-        Intent location = new Intent(this.getActivity(), MyLocationService.class);
-        location.putExtra("isSingle", false);
-        if (isStartInspec) {
-            //鑾峰彇瀹氫綅鏈嶅姟浼犺繃鏉ョ殑鍧愭爣鐐�
-            LiveEventBus.get(CommonKeyName.locationData).observeForever(new Observer<Object>() {
-                @Override
-                public void onChanged(Object o) {
-
-                    LatLonBean latLonBean = (LatLonBean) o;
-                    Log.i("chageInspecState", "lat:" + latLonBean.getLatitude() + ",log:" + latLonBean.getLongitude());
-                    mWebView.evaluateJavascript("javascript:updateLocation(\"" + latLonBean.getLatitude() + "\",\"" + latLonBean.getLongitude() + "\")", value -> {
-                    });
-                }
-            });
-            binding.stateText.setVisibility(View.VISIBLE);
-            binding.inspectButton.setText("缁�");
-            //寮�鍚畾浣�
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-                this.getActivity().startForegroundService(location);
-            } else {
-                this.getActivity().startService(location);
-            }
-        } else {
-            binding.stateText.setVisibility(View.GONE);
-            binding.inspectButton.setText("宸�");
-            //鍏抽棴瀹氫綅
-            this.getActivity().stopService(location);
-
-        }
     }
 
 
@@ -396,5 +380,125 @@
         binding.bottomLL.setVisibility(View.GONE);
     }
 
+    /**
+     * 涓婃姤宸℃璁板綍
+     */
+    private void pushLocationData(InspectionLocationBean inspectionLocationBean) {
+        inspectionRequest.setInspectId(inspectionLocationBean.getInspectId());
+        inspectionRequest.setInspectorId(inspectionLocationBean.getInspectorId());
+        if (mInspectionBean != null) {
+            inspectionRequest.setStartTime(mInspectionBean.getStartTime());
+            inspectionRequest.setStopTime(mInspectionBean.getStopTime());
+        }
+        InspectionRequest.Track track = new InspectionRequest.Track();
+        track.setLat(inspectionLocationBean.getLat());
+        track.setLng(inspectionLocationBean.getLng());
+        track.setLocateTime(inspectionLocationBean.getLocateTime());
+        inspectionRequest.getTracks().clear();
+        inspectionRequest.addTracks(track);
+        ApiManager.getInstance().requestPostHideLoading(MapFragment.this.getContext(), BASE_URL + "/app/inspect/save", LoginResult.class, inspectionRequest.toMap(inspectionRequest), new SubscriberListener<BaseResponse<LoginResult>>() {
+            @Override
+            public void onNext(BaseResponse<LoginResult> t) {
+                try {
+                    if (t.isSuccess()) {
+                        inspectionLocationBean.setPost(true);
+                        updateInspectionLocationData(MapFragment.this.getContext(), inspectionLocationBean);
+                    } else {
 
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    CrashReport.postCatchedException(e);
+                }
+
+            }
+        });
+    }
+
+    /**
+     * 寮�濮嬪贰妫�
+     */
+    private void startInspection() {
+        DaoSingleton.getAsynchInstance(this.getContext()).inspectionDao().getMostRecentInspectionWithNoStopTime()
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread()).subscribe(inspectionBean -> {
+                    // 鏇存柊 UI
+                    mInspectionBean = inspectionBean;
+                });
+    }
+
+
+    /**
+     * 瀹氫綅鐩戝惉
+     */
+    private Observer<Object> locationObserver = new Observer<Object>() {
+        @Override
+        public void onChanged(Object o) {
+            if (mInspectionBean != null) {
+                LatLonBean latLonBean = (LatLonBean) o;
+                if (InspectionUtils.isThanMinMeters(lastLatLonBean, latLonBean)) {
+                    //澶т簬鏈�灏忚窛绂�
+                    lastLatLonBean = latLonBean;
+                    Log.i("chageInspecState", "lat:" + latLonBean.getLatitude() + ",log:" + latLonBean.getLongitude());
+                    InspectionLocationBean inspectionLocationBean = createInspectionLocation(latLonBean);
+                    addInspectionLocationData(MapFragment.this.getContext(), inspectionLocationBean);
+                    //鏇存柊鍒板湴鍥�
+                    mWebView.evaluateJavascript("javascript:updateLocation(\"" + latLonBean.getLongitude() + "\",\"" + latLonBean.getLatitude() + "\")", value -> {
+                    });
+                    //涓婁紶鍧愭爣
+                    pushLocationData(inspectionLocationBean);
+                } else {
+                    Log.d(TAG, "isThanMinMeters>>>false");
+                }
+
+
+            }
+        }
+    };
+
+
+    /**
+     * 鍒涘缓InspectionLocationBean
+     */
+    private InspectionLocationBean createInspectionLocation(LatLonBean latLonBean) {
+        InspectionLocationBean inspectionLocationBean = new InspectionLocationBean();
+        inspectionLocationBean.setInspectId(mInspectionBean.getInspectId());
+        inspectionLocationBean.setLocateTime(DateUtils.getNowDateStr());
+        inspectionLocationBean.setPost(false);
+        inspectionLocationBean.setInspectorId(MyApplication.myApplication.userId);
+        inspectionLocationBean.setLng(String.valueOf(latLonBean.getLongitude()));
+        inspectionLocationBean.setLat(String.valueOf(latLonBean.getLatitude()));
+        return inspectionLocationBean;
+    }
+
+
+    /**
+     * 淇敼宸℃鐘舵��
+     */
+    private void chageInspecState() {
+        Intent location = new Intent(this.getActivity(), MyLocationService.class);
+        location.putExtra("isSingle", false);
+        if (isStartInspec) {
+            //娣诲姞鏂扮殑宸℃璁板綍
+            startInspection();
+            //鑾峰彇瀹氫綅鏈嶅姟浼犺繃鏉ョ殑鍧愭爣鐐�
+            LiveEventBus.get(CommonKeyName.locationData).observeForever(locationObserver);
+            binding.stateText.setVisibility(View.VISIBLE);
+            binding.inspectButton.setText("缁�");
+            //寮�鍚畾浣�
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                this.getActivity().startForegroundService(location);
+            } else {
+                this.getActivity().startService(location);
+            }
+            mInspectionBean = InspectionUtils.startInspection(this.getContext());
+            inspectionRequest = new InspectionRequest();
+        } else {
+            binding.stateText.setVisibility(View.GONE);
+            binding.inspectButton.setText("宸�");
+            LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver);
+            //鍏抽棴瀹氫綅
+            this.getActivity().stopService(location);
+        }
+    }
 }
diff --git a/app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java b/app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java
index 3eabb79..c2526b3 100644
--- a/app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java
+++ b/app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java
@@ -19,7 +19,6 @@
 import com.dayu.pipirrapp.utils.CleanDataUtils;
 import com.dayu.pipirrapp.utils.ToastUtil;
 import com.dayu.pipirrapp.view.ConfirmDialog;
-import com.dayu.pipirrapp.view.TitleBar;
 
 /**
  * author: zuo
diff --git a/app/src/main/java/com/dayu/pipirrapp/fragment/OrderFragment.java b/app/src/main/java/com/dayu/pipirrapp/fragment/OrderFragment.java
index 4ca4016..c0efb85 100644
--- a/app/src/main/java/com/dayu/pipirrapp/fragment/OrderFragment.java
+++ b/app/src/main/java/com/dayu/pipirrapp/fragment/OrderFragment.java
@@ -16,7 +16,6 @@
 import com.dayu.pipirrapp.activity.OrderDetailActivity;
 import com.dayu.pipirrapp.adapter.OrderAdapter;
 import com.dayu.pipirrapp.bean.net.OrderListResult;
-import com.dayu.pipirrapp.bean.net.WeatherResponse;
 import com.dayu.pipirrapp.databinding.FragmentOrderBinding;
 import com.dayu.pipirrapp.net.ApiManager;
 import com.dayu.pipirrapp.net.BaseResponse;
diff --git a/app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java b/app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java
index 0735ae5..8e03e6f 100644
--- a/app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java
+++ b/app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java
@@ -9,11 +9,13 @@
 
 import com.dayu.pipirrapp.MyApplication;
 import com.dayu.pipirrapp.bean.net.CodeResult;
+import com.dayu.pipirrapp.bean.net.UplodFileState;
 import com.dayu.pipirrapp.bean.net.WeatherResponse;
 import com.dayu.pipirrapp.net.subscribers.BaseProgressSubscriber;
 import com.dayu.pipirrapp.net.subscribers.CodeListener;
 import com.dayu.pipirrapp.net.subscribers.ProgressSubscriber;
 import com.dayu.pipirrapp.net.subscribers.SubscriberListener;
+import com.dayu.pipirrapp.net.upload.UploadFileListener;
 import com.dayu.pipirrapp.utils.MapJpgUtils;
 import com.dayu.pipirrapp.utils.MyJsonParser;
 
@@ -26,9 +28,13 @@
 import io.reactivex.rxjava3.disposables.CompositeDisposable;
 import io.reactivex.rxjava3.functions.Function;
 import io.reactivex.rxjava3.schedulers.Schedulers;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.RequestBody;
 import okhttp3.ResponseBody;
 import retrofit2.Call;
 import retrofit2.Callback;
+import retrofit2.Response;
 
 
 /**
@@ -285,4 +291,57 @@
         return false;  // 鏃犵綉缁滆繛鎺�
     }
 
+    /**
+     * 涓婁紶鏂囦欢
+     *
+     * @param context
+     * @param file
+     * @param listener
+     */
+    public void uploadFile(final Context context, final UplodFileState file, final UploadFileListener listener) {
+
+        // 鍒涘缓 RequestBody锛岀敤浜庡皝瑁呮瀯寤篟equestBody
+        RequestBody requestFile =
+                RequestBody.create(MediaType.parse("multipart/form-data"), file.getFile());
+        // MultipartBody.Part  鍜屽悗绔害瀹氬ソKey锛岃繖閲岀殑partName鏄敤image
+        MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getFile().getName(), requestFile);
+        // 娣诲姞鎻忚堪
+        String descriptionString = "hello, 杩欐槸鏂囦欢鎻忚堪";
+        RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);
+        apiService.uploadFile(description, body).enqueue(new Callback<BaseResponse>() {
+            @Override
+            public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) {
+                if (response.body() != null) {
+                    if (response.body().isSuccess()) {
+                        file.setState(1);
+                        file.setUrl(response.body().getMsg());
+                        listener.onBack(file);
+                    } else {
+                        if (file.getNumber() <= uplodFilerepeatSize) {
+                            file.setNumber(file.getNumber() + 1);
+                            file.setState(2);
+                            uploadFile(context, file, listener);
+                        } else {
+                            listener.onBack(file);
+                        }
+                    }
+                }
+            }
+
+            @Override
+            public void onFailure(Call<BaseResponse> call, Throwable t) {
+                if (file.getNumber() <= uplodFilerepeatSize) {
+                    file.setNumber(file.getNumber() + 1);
+                    file.setState(2);
+                    uploadFile(context, file, listener);
+                } else {
+                    listener.onBack(file);
+                }
+            }
+        });
+    }
+
+
+
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/dayu/pipirrapp/net/ApiService.java b/app/src/main/java/com/dayu/pipirrapp/net/ApiService.java
index 3e73681..ab0ee53 100644
--- a/app/src/main/java/com/dayu/pipirrapp/net/ApiService.java
+++ b/app/src/main/java/com/dayu/pipirrapp/net/ApiService.java
@@ -58,11 +58,11 @@
     Call<BaseResponse> uploadFiles(@PartMap Map<String, RequestBody> map);
 
     @Multipart
-    @POST(Constants.BASE_URL + "file/upload")
+    @POST(Constants.BASE_URL + "app/webFile/upPhoto")
     Call<BaseResponse> uploadFile(@Part("description") RequestBody description, @Part MultipartBody.Part file);
 
     //鑾峰彇楠岃瘉鐮�
-    @GET(Constants.BASE_URL+":8088/app/captcha/get")
+    @GET(Constants.BASE_URL+"/app/captcha/get")
     Observable<CodeResult> getCode(@QueryMap Map<String, Object> params);
 
     @GET()
diff --git a/app/src/main/java/com/dayu/pipirrapp/net/MyIntercepterApplication.java b/app/src/main/java/com/dayu/pipirrapp/net/MyIntercepterApplication.java
index bc2fba6..b32dfb5 100644
--- a/app/src/main/java/com/dayu/pipirrapp/net/MyIntercepterApplication.java
+++ b/app/src/main/java/com/dayu/pipirrapp/net/MyIntercepterApplication.java
@@ -1,11 +1,8 @@
 package com.dayu.pipirrapp.net;
 
 import com.dayu.pipirrapp.MyApplication;
-import com.dayu.pipirrapp.utils.CommonData;
-import com.dayu.pipirrapp.utils.SharedPreferencesHelper;
 import com.dayu.pipirrapp.utils.ToastUtil;
 import com.tencent.bugly.crashreport.CrashReport;
-
 
 import java.io.IOException;
 import java.net.ConnectException;
@@ -68,7 +65,7 @@
                     }
                 }
                 builder.addHeader("os", "app");
-                builder.addHeader("Authorization", SharedPreferencesHelper.getInstance(MyApplication.myApplication).get("token", ""));
+                builder.addHeader("token", MyApplication.myApplication.token);
             }
             builder.addHeader("tag", MyApplication.myApplication.myTag);
             return builder.build();
diff --git a/app/src/main/java/com/dayu/pipirrapp/net/upload/ProgressListener.java b/app/src/main/java/com/dayu/pipirrapp/net/upload/ProgressListener.java
new file mode 100644
index 0000000..bce7d0a
--- /dev/null
+++ b/app/src/main/java/com/dayu/pipirrapp/net/upload/ProgressListener.java
@@ -0,0 +1,5 @@
+package com.dayu.pipirrapp.net.upload;
+
+public interface ProgressListener {
+    void onProgress(long bytesWritten, long totalBytes);
+}
diff --git a/app/src/main/java/com/dayu/pipirrapp/net/upload/ProgressRequestBody.java b/app/src/main/java/com/dayu/pipirrapp/net/upload/ProgressRequestBody.java
new file mode 100644
index 0000000..964c1c4
--- /dev/null
+++ b/app/src/main/java/com/dayu/pipirrapp/net/upload/ProgressRequestBody.java
@@ -0,0 +1,53 @@
+package com.dayu.pipirrapp.net.upload;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import okhttp3.MediaType;
+import okhttp3.RequestBody;
+import okio.BufferedSink;
+import okio.BufferedSource;
+import okio.Okio;
+
+/**
+ * ProgressRequestBody -
+ *
+ * @author zuoxiao
+ * @version 1.0
+ * @since 2024-11-28
+ */
+public class ProgressRequestBody extends RequestBody {
+    private File file;
+    private ProgressListener listener;
+    private MediaType mediaType;
+
+    public ProgressRequestBody(File file, ProgressListener listener, String mimeType) {
+        this.file = file;
+        this.listener = listener;
+        this.mediaType = MediaType.parse(mimeType);
+    }
+
+    @Override
+    public MediaType contentType() {
+        return mediaType;
+    }
+
+    @Override
+    public void writeTo(BufferedSink sink) throws IOException {
+        try (FileInputStream fileInputStream = new FileInputStream(file);
+             BufferedSource source = (BufferedSource) Okio.source(fileInputStream)) {
+            long totalBytes = file.length();
+            long bytesWritten = 0;
+            long read;
+            byte[] buffer = new byte[2048];
+            while ((read = source.read(buffer)) != -1) {
+                sink.write(buffer, 0, (int) read);
+                bytesWritten += read;
+                if (listener != null) {
+                    listener.onProgress(bytesWritten, totalBytes);
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/dayu/pipirrapp/net/upload/UploadFileListener.java b/app/src/main/java/com/dayu/pipirrapp/net/upload/UploadFileListener.java
new file mode 100644
index 0000000..fc98806
--- /dev/null
+++ b/app/src/main/java/com/dayu/pipirrapp/net/upload/UploadFileListener.java
@@ -0,0 +1,14 @@
+package com.dayu.pipirrapp.net.upload;
+
+
+import com.dayu.pipirrapp.bean.net.UplodFileState;
+
+/**
+ * Copyright (C), 2023,
+ * Author: zuo
+ * Date: 2023-04-15 8:27
+ * Description:
+ */
+public interface UploadFileListener {
+    void onBack(UplodFileState state);
+}
diff --git a/app/src/main/java/com/dayu/pipirrapp/service/MyLocationService.java b/app/src/main/java/com/dayu/pipirrapp/service/MyLocationService.java
index df32098..00c7aea 100644
--- a/app/src/main/java/com/dayu/pipirrapp/service/MyLocationService.java
+++ b/app/src/main/java/com/dayu/pipirrapp/service/MyLocationService.java
@@ -225,7 +225,7 @@
             if (isSingle) {
                 stopSelf();  // 鑾峰彇鍒扮粡绾害浠ュ悗锛屽仠姝㈣service
             }
-            ToastUtil.showToast(MyLocationService.this, "鍘熺敓瀹氫綅onLocationChanged:  Latitude锛�" + latitude + "  Longitude锛�" + longitude);
+//            ToastUtil.showToast(MyLocationService.this, "鍘熺敓瀹氫綅onLocationChanged:  Latitude锛�" + latitude + "  Longitude锛�" + longitude);
         }
 
         // 鐘舵�佹敼鍙樻椂
diff --git a/app/src/main/java/com/dayu/pipirrapp/tool/FullyGridLayoutManager.java b/app/src/main/java/com/dayu/pipirrapp/tool/FullyGridLayoutManager.java
index 7ad0a08..d3b51c9 100644
--- a/app/src/main/java/com/dayu/pipirrapp/tool/FullyGridLayoutManager.java
+++ b/app/src/main/java/com/dayu/pipirrapp/tool/FullyGridLayoutManager.java
@@ -10,7 +10,7 @@
 
 /**
  * FullyGridLayoutManager -
- *
+ *  鑷畾涔塆rid鐢ㄤ互鏄剧ず
  * @author zuoxiao
  * @version 1.0
  * @since 2024-11-28
diff --git a/app/src/main/java/com/dayu/pipirrapp/tool/InspectionUtils.java b/app/src/main/java/com/dayu/pipirrapp/tool/InspectionUtils.java
new file mode 100644
index 0000000..eb3a256
--- /dev/null
+++ b/app/src/main/java/com/dayu/pipirrapp/tool/InspectionUtils.java
@@ -0,0 +1,112 @@
+package com.dayu.pipirrapp.tool;
+
+import android.content.Context;
+import android.location.Location;
+import android.util.Log;
+
+import com.dayu.pipirrapp.bean.db.InspectionBean;
+import com.dayu.pipirrapp.bean.db.InspectionLocationBean;
+import com.dayu.pipirrapp.bean.db.LatLonBean;
+import com.dayu.pipirrapp.dao.DaoSingleton;
+import com.dayu.pipirrapp.utils.DateUtils;
+
+import java.util.UUID;
+
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+
+/**
+ * InspectionUtils -宸℃璁板綍鐩稿叧鍔熻兘鍚堥泦
+ *
+ * @author zuoxiao
+ * @version 1.0
+ * @since 2024-11-29
+ */
+public class InspectionUtils {
+    private static final String TAG = "InspectionUtils";
+    //鎵撶偣鐨勬渶灏忎袱鐐规渶灏忚窛绂�
+    private static final int MinMeters = 10;
+
+    /**
+     * 鑾峰彇褰撳墠宸℃璁板綍ID
+     *
+     * @param context
+     * @return
+     */
+    public static String getInspectionId(Context context) {
+
+
+        return "";
+    }
+
+
+    /**
+     * 寮�濮嬪贰妫�骞舵彃鍏ュ贰妫�璁板綍
+     *
+     * @param context 涓婁笅鏂�
+     * @return Completable 琛ㄧず鎻掑叆瀹屾垚鎴栧け璐ョ殑娴�
+     */
+    public static InspectionBean startInspection(Context context) {
+        // 鍒涘缓宸℃璁板綍
+        InspectionBean inspectionBean = new InspectionBean();
+        inspectionBean.setInspectId(UUID.randomUUID().toString());
+        inspectionBean.setStartTime(DateUtils.getNowDateStr());
+        // 寮傛鎻掑叆鍒版暟鎹簱
+        DaoSingleton.getAsynchInstance(context)
+                .inspectionDao()
+                .insert(inspectionBean) // 鎻掑叆鎿嶄綔
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(() -> {
+                    Log.i(TAG, "Inspection started and inserted successfully.");
+                }, throwable -> {
+                    Log.e(TAG, "Error inserting inspection data: ", throwable);
+                });
+        // 鑾峰彇Dao骞舵墽琛屾彃鍏ユ搷浣�
+        return inspectionBean;  // 鎻掑叆瀹屾垚鍚庡垏鎹㈠埌涓荤嚎绋�
+    }
+
+
+    /**
+     * 娣诲姞宸℃璁板綍鍧愭爣
+     *
+     * @param context
+     * @param locationBean
+     */
+    public static void addInspectionLocationData(Context context, InspectionLocationBean locationBean) {
+        DaoSingleton.getAsynchInstance(context).inspectionLocationDao().insert(locationBean).subscribeOn(Schedulers.io());
+    }
+
+    /**
+     * 淇敼宸℃璁板綍鍧愭爣
+     *
+     * @param context
+     * @param locationBean
+     */
+    public static void updateInspectionLocationData(Context context, InspectionLocationBean locationBean) {
+        DaoSingleton.getAsynchInstance(context).inspectionLocationDao().update(locationBean).subscribeOn(Schedulers.io());
+    }
+
+    /**
+     * 鍒ゆ柇涓や釜鍦扮偣鐨勮窛绂绘槸鍚﹀ぇ浜庤瀹氱殑鏈�灏忚窛绂�
+     *
+     * @param lastLocation 绗竴涓湴鐐�
+     * @param newLocation  绗簩涓湴鐐�
+     * @return 濡傛灉璺濈澶т簬10绫筹紝杩斿洖true锛屽惁鍒欒繑鍥瀎alse
+     */
+    public static boolean isThanMinMeters(LatLonBean lastLocation, LatLonBean newLocation) {
+        //褰搇astLocation涓簄ull榛樿璁や负杩斿洖true
+        if (lastLocation != null) {
+            // 浣跨敤 Location.distanceBetween 璁$畻涓や釜鐐逛箣闂寸殑璺濈锛屽崟浣嶄负绫�
+            float[] results = new float[1];
+            Location.distanceBetween(lastLocation.getLatitude(), lastLocation.getLongitude(), newLocation.getLatitude(), newLocation.getLongitude(), results);
+            float distanceInMeters = results[0];
+
+            // 鍒ゆ柇璺濈鏄惁澶т簬10绫�
+            return distanceInMeters > MinMeters;
+        } else {
+            return true;
+        }
+
+    }
+}
diff --git a/app/src/main/java/com/dayu/pipirrapp/utils/DateUtils.java b/app/src/main/java/com/dayu/pipirrapp/utils/DateUtils.java
new file mode 100644
index 0000000..d95c903
--- /dev/null
+++ b/app/src/main/java/com/dayu/pipirrapp/utils/DateUtils.java
@@ -0,0 +1,32 @@
+package com.dayu.pipirrapp.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * DateUtils - 澶勭悊鏃堕棿缁熶竴鐨勭被
+ *
+ * @author zuoxiao
+ * @version 1.0
+ * @since 2024-11-29
+ */
+public class DateUtils {
+
+
+    /**
+     * 杩斿洖缁熶竴鏍煎紡鐨勫綋鍓嶆椂闂�
+     *
+     * @return yyyy-MM-dd HH:mm:ss
+     */
+    public static String getNowDateStr() {
+        // 褰撳墠鏃堕棿
+        Date date = new Date();
+        // 鍒涘缓 SimpleDateFormat 瀵硅薄锛岃缃棩鏈熸牸寮�
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
+        // 鏍煎紡鍖栧綋鍓嶆椂闂翠负瀛楃涓�
+        return sdf.format(date);
+    }
+
+
+}
diff --git a/app/src/main/java/com/dayu/pipirrapp/view/TagDialog.java b/app/src/main/java/com/dayu/pipirrapp/view/TagDialog.java
index 3114677..db668d5 100644
--- a/app/src/main/java/com/dayu/pipirrapp/view/TagDialog.java
+++ b/app/src/main/java/com/dayu/pipirrapp/view/TagDialog.java
@@ -78,6 +78,7 @@
                         @Override
                         public void onClick(View v) {
                             MyApplication.myApplication.myTag = tagBean.getTag();
+
                             tagDao.insert(tagBean);
                             mLibraryBack.listener(type);
                             TagDialog.this.dismiss();
diff --git a/app/src/main/java/com/dayu/pipirrapp/view/TitleBar.java b/app/src/main/java/com/dayu/pipirrapp/view/TitleBar.java
index 3422266..27d0426 100644
--- a/app/src/main/java/com/dayu/pipirrapp/view/TitleBar.java
+++ b/app/src/main/java/com/dayu/pipirrapp/view/TitleBar.java
@@ -4,14 +4,9 @@
 package com.dayu.pipirrapp.view;
 
 import android.app.Activity;
-import android.content.Context;
-import android.content.res.TypedArray;
 import android.graphics.Color;
 import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
 import android.view.View;
-import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.RelativeLayout;
@@ -194,6 +189,7 @@
      * @return
      */
     public TitleBar setRightIcoListening(View.OnClickListener listener) {
+
         if (iv_rightIco.getVisibility() == View.VISIBLE) {
             iv_rightIco.setOnClickListener(listener);
         }
diff --git a/app/src/main/res/layout/activity_order_deal.xml b/app/src/main/res/layout/activity_order_deal.xml
index 46c5be9..1465137 100644
--- a/app/src/main/res/layout/activity_order_deal.xml
+++ b/app/src/main/res/layout/activity_order_deal.xml
@@ -16,6 +16,7 @@
     <RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:background="@color/bg_color"
         android:orientation="vertical">
 
         <include
@@ -58,6 +59,8 @@
                 android:id="@+id/recycler"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
+                android:padding="5dp"
+                android:background="@color/white"
                 android:layout_marginTop="10dp"
                 android:overScrollMode="never" />
 

--
Gitblit v1.8.0