管灌系统巡查员智能手机App
1.优化工单列表状态显示
2.接口添加token失效判断,失效后跳转到登录界面。
27个文件已修改
7个文件已添加
1346 ■■■■ 已修改文件
app/src/main/java/com/dayu/pipirrapp/MyApplication.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/MainActivity.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/OrderDetailActivity.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/adapter/ImageAdapter.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/adapter/OrderAdapter.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/bean/net/AddProcessingResult.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/bean/net/DealDetailResult.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/bean/net/OrderDetailResult.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/bean/net/OrderListResult.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/bean/net/UplodFileResule.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/bean/net/UplodFileState.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/fragment/OrderFragment.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/ApiService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/MqttManager.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/MyIntercepterApplication.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/upload/ProgressListener.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/upload/ProgressRequestBody.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/tool/InspectionUtils.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/utils/CommonKeyName.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/utils/DateUtils.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/utils/NetUtils.java 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/order_state_finish_bg.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/order_state_no_bg.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/order_state_reject_bg.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/order_state_wait_bg.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_order_deal.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_order_detail.xml 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_order.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_image.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_order.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/MyApplication.java
@@ -6,7 +6,7 @@
import com.jeremyliao.liveeventbus.LiveEventBus;
import com.tencent.bugly.crashreport.CrashReport;
//import cn.jpush.android.api.JPushInterface;
/**
 * author: zuo
@@ -19,7 +19,7 @@
    //数据库的tag值
    public String myTag = "-1";
    public String token;
    public String userId;
    public String userId;//2024120411461000002
    @Override
app/src/main/java/com/dayu/pipirrapp/activity/MainActivity.java
@@ -1,16 +1,14 @@
package com.dayu.pipirrapp.activity;
import android.net.ConnectivityManager;
import android.net.Network;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import com.dayu.pipirrapp.MyApplication;
import com.dayu.pipirrapp.R;
@@ -18,13 +16,15 @@
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;
import com.dayu.pipirrapp.fragment.MyFragment;
import com.dayu.pipirrapp.fragment.OrderFragment;
import com.dayu.pipirrapp.net.MqttManager;
import com.dayu.pipirrapp.tool.InspectionUtils;
import com.dayu.pipirrapp.utils.CommonKeyName;
import com.dayu.pipirrapp.utils.MyLog;
import com.dayu.pipirrapp.utils.NetUtils;
import com.jeremyliao.liveeventbus.LiveEventBus;
import java.util.ArrayList;
import java.util.List;
@@ -47,7 +47,7 @@
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(LayoutInflater.from(this));
        setContentView(binding.getRoot());
        registNetCallBack();
        setupFragments();
        initView();
        initTab();
@@ -60,6 +60,27 @@
        }
        mqttManager = new MqttManager(this);
        mqttManager.connect();
        LiveEventBus.get(CommonKeyName.NetworkCallback).observeForever(new Observer<Object>() {
            @Override
            public void onChanged(Object o) {
                switch ((int) o) {
                    case NetUtils.Available:
                        MyLog.i("MqttManager>>>Lost");
                        InspectionUtils.aginPutInspectionData(MainActivity.this);
                        break;
                    case NetUtils.Lost:
                        break;
                }
            }
        });
        registNetCallBack();
    }
    @Override
    protected void onStart() {
        super.onStart();
    }
    private void setupFragments() {
@@ -163,31 +184,12 @@
    //    注册网络监控
    private void registNetCallBack() {
        NetUtils.registerNetCallBack(this, networkCallback);
        NetUtils.registerNetCallBack(this);
    }
    private void unregisterNetworkCallback() {
        NetUtils.unregisterReceiver(this, networkCallback);
        NetUtils.unregisterReceiver(this);
    }
    //网络监控
    ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(@NonNull Network network) {
            super.onAvailable(network);
            // 这里可以执行网络可用后的逻辑,比如进行数据请求等
            MyLog.d("onAvailable");
            InspectionUtils.aginPutInspectionData(MainActivity.this);
        }
        @Override
        public void onLost(@NonNull Network network) {
            super.onLost(network);
            // 这里可以执行网络丢失后的逻辑,比如停止数据请求等
            MyLog.d("onLost");
        }
    };
app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java
@@ -1,24 +1,42 @@
package com.dayu.pipirrapp.activity;
import static com.dayu.pipirrapp.net.Constants.BASE_URL;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SimpleItemAnimator;
import com.dayu.pipirrapp.MyApplication;
import com.dayu.pipirrapp.adapter.AddPictureAdapter;
import com.dayu.pipirrapp.bean.db.LatLonBean;
import com.dayu.pipirrapp.bean.net.AddProcessingResult;
import com.dayu.pipirrapp.bean.net.InsectionResult;
import com.dayu.pipirrapp.bean.net.UplodFileState;
import com.dayu.pipirrapp.databinding.ActivityOrderDealBinding;
import com.dayu.pipirrapp.net.ApiManager;
import com.dayu.pipirrapp.net.BaseResponse;
import com.dayu.pipirrapp.net.subscribers.SubscriberListener;
import com.dayu.pipirrapp.net.upload.UploadFileListener;
import com.dayu.pipirrapp.service.MyLocationService;
import com.dayu.pipirrapp.tool.FullyGridLayoutManager;
import com.dayu.pipirrapp.tool.GlideEngine;
import com.dayu.pipirrapp.utils.CommonKeyName;
import com.dayu.pipirrapp.utils.ToastUtil;
import com.dayu.pipirrapp.view.TitleBar;
import com.jeremyliao.liveeventbus.LiveEventBus;
import com.luck.picture.lib.basic.PictureSelectionModel;
import com.luck.picture.lib.basic.PictureSelector;
import com.luck.picture.lib.config.PictureMimeType;
@@ -34,10 +52,13 @@
import com.luck.picture.lib.utils.DensityUtil;
import com.luck.picture.lib.utils.MediaUtils;
import com.luck.picture.lib.utils.PictureFileUtils;
import com.tencent.bugly.crashreport.CrashReport;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import top.zibin.luban.CompressionPredicate;
import top.zibin.luban.Luban;
@@ -62,14 +83,29 @@
    private final List<LocalMedia> mData = new ArrayList<>();
    private ActivityResultLauncher<Intent> launcherResult;
    private ImageEngine imageEngine;
    List<UplodFileState> uplodFileStates = new ArrayList<>();
    String workOrderId;
    LatLonBean latLonBean;
    /**
     * 定位监听
     */
    private Observer<Object> locationObserver = new Observer<Object>() {
        @Override
        public void onChanged(Object o) {
            latLonBean = (LatLonBean) o;
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityOrderDealBinding.inflate(LayoutInflater.from(this));
        setContentView(binding.getRoot());
        workOrderId = this.getIntent().getStringExtra("workOrderId");
        launcherResult = createActivityResultLauncher();
        initView();
        startLocation();
    }
@@ -104,6 +140,28 @@
            public void openPicture() {
                //添加图片
                mOpenPicture();
            }
        });
        binding.dealButton.setOnClickListener(v -> {
            boolean isAllPost = true;
            for (UplodFileState imgData : uplodFileStates) {
                if (imgData.getState() == 0) {
                    isAllPost = false;
                }
            }
            if (!TextUtils.isEmpty(binding.contentET.getText().toString())) {
                if (isAllPost) {
                    if (uplodFileStates.size() > 0) {
                        postData();
                    } else {
                        ToastUtil.showToast(OrderDealActivity.this, "请上传图片");
                    }
                } else {
                    ToastUtil.showToast(OrderDealActivity.this, "图片正在上传请稍后提交");
                }
            } else {
                ToastUtil.showToast(OrderDealActivity.this, "请输入反馈内容");
            }
        });
    }
@@ -166,6 +224,10 @@
     * @param result
     */
    private void analyticalSelectResults(ArrayList<LocalMedia> result) {
        Set<String> existingPaths = new HashSet<>();
        for (UplodFileState uplodData : uplodFileStates) {
            existingPaths.add(uplodData.getFilePath());
        }
        for (LocalMedia media : result) {
            if (media.getWidth() == 0 || media.getHeight() == 0) {
                if (PictureMimeType.isHasImage(media.getMimeType())) {
@@ -194,6 +256,17 @@
            Log.i(TAG, "裁剪宽高: " + media.getCropImageWidth() + "x" + media.getCropImageHeight());
            Log.i(TAG, "文件大小: " + PictureFileUtils.formatAccurateUnitFileSize(media.getSize()));
            Log.i(TAG, "文件时长: " + media.getDuration());
            String compressPath = media.getCompressPath();
            //判断是否有这个路径,没有的话上传该图片
            if (!existingPaths.contains(compressPath)) {
                UplodFileState uplodFileState = new UplodFileState();
                uplodFileState.setFilePath(media.getRealPath());
                uplodFileStates.add(uplodFileState);
                // 执行上传图片的操作
                uplodeImg(uplodFileState);
            }
        }
        runOnUiThread(new Runnable() {
            @Override
@@ -205,6 +278,7 @@
                mAdapter.getData().addAll(result);
                mAdapter.notifyItemRangeInserted(0, result.size());
            }
        });
    }
@@ -256,4 +330,77 @@
    }
    //上传图片
    private void uplodeImg(UplodFileState uplodFileState) {
        ApiManager.getInstance().uploadFile(this, uplodFileState, new UploadFileListener() {
            @Override
            public void onBack(UplodFileState state) {
                for (UplodFileState uplodFile : uplodFileStates) {
                    if (uplodFile.getFilePath().equals(state.getFilePath())) {
                        int index = uplodFileStates.indexOf(uplodFile);
                        if (index != -1) {
                            uplodFileStates.set(index, uplodFile); // 更新对应的项
                        }
                    }
                }
            }
        });
    }
    /**
     * 上报处理结果
     */
    private void postData() {
        AddProcessingResult result = new AddProcessingResult();
        result.setImages(uplodFileStates);
        result.setContent(binding.contentET.getText().toString());
        result.setInspectorId(MyApplication.myApplication.userId);
        result.setWorkOrderId(workOrderId);
        result.setCompleteTime(com.dayu.pipirrapp.utils.DateUtils.getNowDateToMMStr());
        if (latLonBean != null) {
            result.setLat(String.valueOf(latLonBean.getLatitude()));
            result.setLng(String.valueOf(latLonBean.getLongitude()));
        }
        ApiManager.getInstance().requestPostHideLoading(this, BASE_URL + "/app/workOrder/addProcessingResult", InsectionResult.class, result.toMap(result), new SubscriberListener<BaseResponse<List<InsectionResult>>>() {
            @Override
            public void onNext(BaseResponse<List<InsectionResult>> t) {
                try {
                    if (t.isSuccess()) {
                        ToastUtil.showToastLong(OrderDealActivity.this, "上报成功");
                        OrderDealActivity.this.finish();
                    } else {
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    CrashReport.postCatchedException(e);
                }
            }
        });
    }
    /**
     * 开始定位相关逻辑
     */
    private void startLocation() {
        Intent location = new Intent(this, MyLocationService.class);
        location.putExtra("isSingle", true);
        //开启定位
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(location);
        } else {
            startService(location);
        }
        //获取定位服务传过来的坐标点
        LiveEventBus.get(CommonKeyName.locationData).observeForever(locationObserver);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver);
    }
}
app/src/main/java/com/dayu/pipirrapp/activity/OrderDetailActivity.java
@@ -4,9 +4,12 @@
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import androidx.annotation.Nullable;
import com.dayu.pipirrapp.R;
import com.dayu.pipirrapp.bean.net.DealDetailResult;
import com.dayu.pipirrapp.bean.net.OrderDetailResult;
import com.dayu.pipirrapp.databinding.ActivityOrderDetailBinding;
import com.dayu.pipirrapp.net.ApiManager;
@@ -30,6 +33,7 @@
public class OrderDetailActivity extends BaseActivity {
    ActivityOrderDetailBinding binding;
    String workOrderId;
    String proResultId;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -43,12 +47,18 @@
    void initView() {
        workOrderId = this.getIntent().getStringExtra("workOrderId");
        if (this.getIntent().hasExtra("proResultId")) {
            proResultId = this.getIntent().getStringExtra("proResultId");
            getHandleData(proResultId);
        }
        if (!TextUtils.isEmpty(workOrderId)) {
            getMarkerData(workOrderId);
        } else {
            this.finish();
            ToastUtil.showToastLong(this, "当前workOrderId为空");
        }
        binding.setItemclidk(OrderDetailActivity.this);
    }
@@ -59,13 +69,70 @@
    private void getMarkerData(String workOrderId) {
        Map<String, Object> params = new HashMap<>();
        params.put("workOrderId", workOrderId);
        ApiManager.getInstance().requestGetHideLoading(this, Constants.BASE_URL + "/app/workOrder/getOneWorkOrder", OrderDetailResult.class, params, new SubscriberListener<BaseResponse<OrderDetailResult>>() {
        ApiManager.getInstance().requestGet(this, Constants.BASE_URL + "/app/workOrder/getOneWorkOrder", OrderDetailResult.class, params, new SubscriberListener<BaseResponse<OrderDetailResult>>() {
            @Override
            public void onNext(BaseResponse<OrderDetailResult> t) {
                if (t.isSuccess()) {
                    if (t.isSuccess()) {
                        if (t.getContent() != null) {
                            binding.setData(t.getContent());
                            OrderDetailResult orderDetailResult = t.getContent();
                            binding.setData(orderDetailResult);
                            if (!TextUtils.isEmpty(t.getContent().getProResultId()) && TextUtils.isEmpty(proResultId)) {
                                getHandleData(orderDetailResult.getProResultId());
                            }
                            switch (orderDetailResult.getProResultStateId()) {
                                case 0://未上报
                                    binding.stateText.setTextColor(OrderDetailActivity.this.getResources().getColor(R.color.black));
                                    binding.stateText.setBackground(OrderDetailActivity.this.getResources().getDrawable(R.drawable.order_state_no_bg));
                                    break;
                                case 1://已上报
                                    binding.stateText.setTextColor(OrderDetailActivity.this.getResources().getColor(R.color.white));
                                    binding.stateText.setBackground(OrderDetailActivity.this.getResources().getDrawable(R.drawable.order_state_wait_bg));
                                    binding.dealButton.setVisibility(View.GONE);
                                    break;
                                case 2://已完成
                                    binding.stateText.setTextColor(OrderDetailActivity.this.getResources().getColor(R.color.white));
                                    binding.stateText.setBackground(OrderDetailActivity.this.getResources().getDrawable(R.drawable.order_state_finish_bg));
                                    binding.dealButton.setVisibility(View.GONE);
                                    break;
                                case 3://被驳回
                                    binding.stateText.setTextColor(OrderDetailActivity.this.getResources().getColor(R.color.white));
                                    binding.stateText.setBackground(OrderDetailActivity.this.getResources().getDrawable(R.drawable.order_state_reject_bg));
                                    break;
                            }
                        } else {
                            ToastUtil.showToast(OrderDetailActivity.this, t.getMsg());
                        }
                    }
                } else {
                    ToastUtil.showToast(OrderDetailActivity.this, t.getMsg());
                }
            }
            @Override
            public void onCloose() {
                super.onCloose();
            }
        });
    }
    /**
     * 获取处理详情
     */
    private void getHandleData(String proResultId) {
        Map<String, Object> params = new HashMap<>();
        params.put("proResultId", proResultId);
        ApiManager.getInstance().requestGet(this, Constants.BASE_URL + "/app/workOrder/getProResult", DealDetailResult.class, params, new SubscriberListener<BaseResponse<DealDetailResult>>() {
            @Override
            public void onNext(BaseResponse<DealDetailResult> t) {
                if (t.isSuccess()) {
                    if (t.isSuccess()) {
                        if (t.getContent() != null) {
                            binding.setDealData(t.getContent());
                        } else {
                            ToastUtil.showToast(OrderDetailActivity.this, t.getMsg());
                        }
@@ -87,7 +154,7 @@
    public void startDealActivity() {
        Intent intent = new Intent(this, OrderDealActivity.class);
        intent.putExtra("workOrderId", workOrderId);
        startActivity(intent);
        startActivityForResult(intent, 1);
    }
}
app/src/main/java/com/dayu/pipirrapp/adapter/ImageAdapter.java
@@ -52,7 +52,20 @@
        public ImageViewHolder(View itemView) {
            super(itemView);
//            imageView = itemView.findViewById(R.id.thumbnailImageView);
            imageView = itemView.findViewById(R.id.thumbnailImageView);
        }
    }
    public interface OnItemClickListener {
        /**
         * Item click event
         *
         * @param v
         * @param position
         */
        void onItemClick(View v, int position);
    }
}
app/src/main/java/com/dayu/pipirrapp/adapter/OrderAdapter.java
@@ -56,6 +56,26 @@
            if (recordsList.size() > 0) {
                OrderListResult.Data record = recordsList.get(position);
                ((OrderAdapter.ViewHolder) holder).getBinding().setData(record);
                switch (record.getProResultStateId()) {
                    case 0://未上报
                        ((ViewHolder) holder).mBinding.stateText.setTextColor(context.getResources().getColor(R.color.black));
                        ((ViewHolder) holder).mBinding.stateText.setBackground(context.getResources().getDrawable(R.drawable.order_state_no_bg));
                        break;
                    case 1://已上报
                        ((ViewHolder) holder).mBinding.stateText.setTextColor(context.getResources().getColor(R.color.white));
                        ((ViewHolder) holder).mBinding.stateText.setBackground(context.getResources().getDrawable(R.drawable.order_state_wait_bg));
                        break;
                    case 2://已完成
                        ((ViewHolder) holder).mBinding.stateText.setTextColor(context.getResources().getColor(R.color.white));
                        ((ViewHolder) holder).mBinding.stateText.setBackground(context.getResources().getDrawable(R.drawable.order_state_finish_bg));
                        break;
                    case 3://被驳回
                        ((ViewHolder) holder).mBinding.stateText.setTextColor(context.getResources().getColor(R.color.white));
                        ((ViewHolder) holder).mBinding.stateText.setBackground(context.getResources().getDrawable(R.drawable.order_state_reject_bg));
                        break;
                }
            }
        }
    }
app/src/main/java/com/dayu/pipirrapp/bean/net/AddProcessingResult.java
New file
@@ -0,0 +1,105 @@
package com.dayu.pipirrapp.bean.net;
import java.util.ArrayList;
import java.util.List;
/**
 * AddProcessingResult -上报处理结果
 *
 * @author zuoxiao
 * @version 1.0
 * @since 2024-12-05
 */
public class AddProcessingResult extends BaseRequest {
    String workOrderId;//工单ID
    String inspectorId;//巡检员ID
    String content;//结果内容
    List<Image> images = new ArrayList<>();
    String completeTime;//任务完成时间
    String lng;
    String lat;
    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 getCompleteTime() {
        return completeTime;
    }
    public void setCompleteTime(String completeTime) {
        this.completeTime = completeTime;
    }
    public String getWorkOrderId() {
        return workOrderId;
    }
    public void setWorkOrderId(String workOrderId) {
        this.workOrderId = workOrderId;
    }
    public String getInspectorId() {
        return inspectorId;
    }
    public void setInspectorId(String inspectorId) {
        this.inspectorId = inspectorId;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public List<Image> getImages() {
        return images;
    }
    public void setImages(List<UplodFileState> states) {
        images.clear();
        for (UplodFileState data : states) {
            Image image = new Image();
            image.setWebPath(data.getWebPath());
            image.setId(data.getId());
            images.add(image);
        }
    }
    public class Image {
        String id;
        String webPath;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getWebPath() {
            return webPath;
        }
        public void setWebPath(String webPath) {
            this.webPath = webPath;
        }
    }
}
app/src/main/java/com/dayu/pipirrapp/bean/net/DealDetailResult.java
New file
@@ -0,0 +1,101 @@
package com.dayu.pipirrapp.bean.net;
/**
 * DealDetailResult -处理结果详情接口
 *
 * @author zuoxiao
 * @version 1.0
 * @since 2024-12-06
 */
public class DealDetailResult {
    String proResultId;//处理结果ID
    String workOrderId;//
    String inspector;// 巡检员
    String content;//结果内容
    double lng;// 经度
    double lat;// 纬度
    String completeTime;// 任务完成时间  精确到分
    String reportTime;//上报时间
    int state;//状态 1-已上报,2-已通过,3-已驳回
    String stateName;// 状态名称
    public String getProResultId() {
        return proResultId;
    }
    public void setProResultId(String proResultId) {
        this.proResultId = proResultId;
    }
    public String getWorkOrderId() {
        return workOrderId;
    }
    public void setWorkOrderId(String workOrderId) {
        this.workOrderId = workOrderId;
    }
    public String getInspector() {
        return inspector;
    }
    public void setInspector(String inspector) {
        this.inspector = inspector;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public double getLng() {
        return lng;
    }
    public void setLng(double lng) {
        this.lng = lng;
    }
    public double getLat() {
        return lat;
    }
    public void setLat(double lat) {
        this.lat = lat;
    }
    public String getCompleteTime() {
        return completeTime;
    }
    public void setCompleteTime(String completeTime) {
        this.completeTime = completeTime;
    }
    public String getReportTime() {
        return reportTime;
    }
    public void setReportTime(String reportTime) {
        this.reportTime = reportTime;
    }
    public int getState() {
        return state;
    }
    public void setState(int state) {
        this.state = state;
    }
    public String getStateName() {
        return stateName;
    }
    public void setStateName(String stateName) {
        this.stateName = stateName;
    }
}
app/src/main/java/com/dayu/pipirrapp/bean/net/OrderDetailResult.java
@@ -25,6 +25,151 @@
    public int rejectTimes;//驳回次数
    public String state;//工单状态
    public String processingState;//处理状态
    public String proResultId;//处理结果id
    public int proResultStateId;//1待审核 2审核通过 3驳回
    public int getProResultStateId() {
        return proResultStateId;
    }
    public void setProResultStateId(int proResultStateId) {
        this.proResultStateId = proResultStateId;
    }
    public String getWorkOrderId() {
        return workOrderId;
    }
    public void setWorkOrderId(String workOrderId) {
        this.workOrderId = workOrderId;
    }
    public String getDispatcherId() {
        return dispatcherId;
    }
    public void setDispatcherId(String dispatcherId) {
        this.dispatcherId = dispatcherId;
    }
    public String getDispatcher() {
        return dispatcher;
    }
    public void setDispatcher(String dispatcher) {
        this.dispatcher = dispatcher;
    }
    public String getInspectorId() {
        return inspectorId;
    }
    public void setInspectorId(String inspectorId) {
        this.inspectorId = inspectorId;
    }
    public String getInspector() {
        return inspector;
    }
    public void setInspector(String inspector) {
        this.inspector = inspector;
    }
    public String getTaskType() {
        return taskType;
    }
    public void setTaskType(String taskType) {
        this.taskType = taskType;
    }
    public String getTaskContent() {
        return taskContent;
    }
    public void setTaskContent(String taskContent) {
        this.taskContent = taskContent;
    }
    public String getCompleteCriteria() {
        return completeCriteria;
    }
    public void setCompleteCriteria(String completeCriteria) {
        this.completeCriteria = completeCriteria;
    }
    public String getDeadLine() {
        return deadLine;
    }
    public void setDeadLine(String deadLine) {
        this.deadLine = deadLine;
    }
    public String getClientReportId() {
        return clientReportId;
    }
    public void setClientReportId(String clientReportId) {
        this.clientReportId = clientReportId;
    }
    public String getInspectorReportId() {
        return inspectorReportId;
    }
    public void setInspectorReportId(String inspectorReportId) {
        this.inspectorReportId = inspectorReportId;
    }
    public String getCompleteTime() {
        return completeTime;
    }
    public void setCompleteTime(String completeTime) {
        this.completeTime = completeTime;
    }
    public String getDispatchTime() {
        return dispatchTime;
    }
    public void setDispatchTime(String dispatchTime) {
        this.dispatchTime = dispatchTime;
    }
    public int getRejectTimes() {
        return rejectTimes;
    }
    public void setRejectTimes(int rejectTimes) {
        this.rejectTimes = rejectTimes;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    public String getProcessingState() {
        return processingState;
    }
    public void setProcessingState(String processingState) {
        this.processingState = processingState;
    }
    public String getProResultId() {
        return proResultId;
    }
    public void setProResultId(String proResultId) {
        this.proResultId = proResultId;
    }
}
app/src/main/java/com/dayu/pipirrapp/bean/net/OrderListResult.java
@@ -76,6 +76,152 @@
        public int rejectTimes;//驳回次数
        public String state;//工单状态
        public String processingState;//处理状态
        public String proResultId;//处理结果id
        public int proResultStateId;//状态 1-已上报,2-已通过,3-已驳回
        public String getWorkOrderId() {
            return workOrderId;
        }
        public void setWorkOrderId(String workOrderId) {
            this.workOrderId = workOrderId;
        }
        public String getDispatcherId() {
            return dispatcherId;
        }
        public void setDispatcherId(String dispatcherId) {
            this.dispatcherId = dispatcherId;
        }
        public String getDispatcher() {
            return dispatcher;
        }
        public void setDispatcher(String dispatcher) {
            this.dispatcher = dispatcher;
        }
        public String getInspectorId() {
            return inspectorId;
        }
        public void setInspectorId(String inspectorId) {
            this.inspectorId = inspectorId;
        }
        public String getInspector() {
            return inspector;
        }
        public void setInspector(String inspector) {
            this.inspector = inspector;
        }
        public String getTaskType() {
            return taskType;
        }
        public void setTaskType(String taskType) {
            this.taskType = taskType;
        }
        public String getTaskContent() {
            return taskContent;
        }
        public void setTaskContent(String taskContent) {
            this.taskContent = taskContent;
        }
        public String getCompleteCriteria() {
            return completeCriteria;
        }
        public void setCompleteCriteria(String completeCriteria) {
            this.completeCriteria = completeCriteria;
        }
        public String getDeadLine() {
            return deadLine;
        }
        public void setDeadLine(String deadLine) {
            this.deadLine = deadLine;
        }
        public String getClientReportId() {
            return clientReportId;
        }
        public void setClientReportId(String clientReportId) {
            this.clientReportId = clientReportId;
        }
        public String getInspectorReportId() {
            return inspectorReportId;
        }
        public void setInspectorReportId(String inspectorReportId) {
            this.inspectorReportId = inspectorReportId;
        }
        public String getCompleteTime() {
            return completeTime;
        }
        public void setCompleteTime(String completeTime) {
            this.completeTime = completeTime;
        }
        public String getDispatchTime() {
            return dispatchTime;
        }
        public void setDispatchTime(String dispatchTime) {
            this.dispatchTime = dispatchTime;
        }
        public int getRejectTimes() {
            return rejectTimes;
        }
        public void setRejectTimes(int rejectTimes) {
            this.rejectTimes = rejectTimes;
        }
        public String getState() {
            return state;
        }
        public void setState(String state) {
            this.state = state;
        }
        public String getProcessingState() {
            return processingState;
        }
        public void setProcessingState(String processingState) {
            this.processingState = processingState;
        }
        public String getProResultId() {
            return proResultId;
        }
        public void setProResultId(String proResultId) {
            this.proResultId = proResultId;
        }
        public int getProResultStateId() {
            return proResultStateId;
        }
        public void setProResultStateId(int proResultStateId) {
            this.proResultStateId = proResultStateId;
        }
    }
app/src/main/java/com/dayu/pipirrapp/bean/net/UplodFileResule.java
New file
@@ -0,0 +1,75 @@
package com.dayu.pipirrapp.bean.net;
/**
 * UplodFileResule -文件上传返回参数
 *
 * @author zuoxiao
 * @version 1.0
 * @since 2024-12-05
 */
public class UplodFileResule {
    String downloadPath;//:http://127.0.0.1:8180/file/download/down?id=2024120515170600010,
    String extName;//jpg,
    String hash;//21457,
    String id;//2024120515170600010,
    String orgName;//IMG_20241205063339310,
    String webPath;//http://127.0.0.1:54321/webfiles/webFile4/photo/20241205/2412051517050000.jpg,
    String webPathZip;//http://127.0.0.1:54321/webfiles/webFile4/photo/20241205/2412051517050000_.jpg
    public String getDownloadPath() {
        return downloadPath;
    }
    public void setDownloadPath(String downloadPath) {
        this.downloadPath = downloadPath;
    }
    public String getExtName() {
        return extName;
    }
    public void setExtName(String extName) {
        this.extName = extName;
    }
    public String getHash() {
        return hash;
    }
    public void setHash(String hash) {
        this.hash = hash;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getOrgName() {
        return orgName;
    }
    public void setOrgName(String orgName) {
        this.orgName = orgName;
    }
    public String getWebPath() {
        return webPath;
    }
    public void setWebPath(String webPath) {
        this.webPath = webPath;
    }
    public String getWebPathZip() {
        return webPathZip;
    }
    public void setWebPathZip(String webPathZip) {
        this.webPathZip = webPathZip;
    }
}
app/src/main/java/com/dayu/pipirrapp/bean/net/UplodFileState.java
@@ -1,7 +1,5 @@
package com.dayu.pipirrapp.bean.net;
import java.io.File;
/**
 * Copyright (C), 2023,
 * Author: zuo
@@ -10,9 +8,10 @@
 */
public class UplodFileState {
    int state = 0;//0正在上传 1上传完成 2上传失败
    File file;//上传的文件
    String url;//上传文件后返回的url
    String filePath;//上传的文件
    int number;//失败后重试的次数
    String id;//上传后的id
    String webPath;//上传后的地址
    public int getNumber() {
        return number;
@@ -26,10 +25,6 @@
    }
    public UplodFileState(File file) {
        this.file = file;
    }
    public int getState() {
        return state;
    }
@@ -38,19 +33,27 @@
        this.state = state;
    }
    public File getFile() {
        return file;
    public String getFilePath() {
        return filePath;
    }
    public void setFile(File file) {
        this.file = file;
    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }
    public String getUrl() {
        return url;
    public String getId() {
        return id;
    }
    public void setUrl(String url) {
        this.url = url;
    public void setId(String id) {
        this.id = id;
    }
    public String getWebPath() {
        return webPath;
    }
    public void setWebPath(String webPath) {
        this.webPath = webPath;
    }
}
app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
@@ -450,12 +450,6 @@
        });
    }
    /**
     * 开始巡检
     */
    private void startInspection() {
    }
    /**
app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java
@@ -57,7 +57,6 @@
                        confirmDialog1.dismiss();
                        CleanDataUtils.cleanUserData(MyFragment.this.getContext());
                        Intent intent = new Intent(MyFragment.this.getContext(), LoginActivity.class);
                        MyFragment.this.getActivity().startActivity(intent);
                        MyFragment.this.getActivity().finish();
                    } catch (Exception e) {
app/src/main/java/com/dayu/pipirrapp/fragment/OrderFragment.java
@@ -3,15 +3,16 @@
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.dayu.pipirrapp.MyApplication;
import com.dayu.pipirrapp.R;
import com.dayu.pipirrapp.activity.OrderDetailActivity;
import com.dayu.pipirrapp.adapter.OrderAdapter;
@@ -27,8 +28,6 @@
import com.scwang.smart.refresh.footer.ClassicsFooter;
import com.scwang.smart.refresh.header.ClassicsHeader;
import com.scwang.smart.refresh.layout.api.RefreshLayout;
import com.scwang.smart.refresh.layout.listener.OnLoadMoreListener;
import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
import java.util.ArrayList;
import java.util.HashMap;
@@ -169,7 +168,7 @@
        params.put("pageSize", pageSize);
        params.put("pageCurr", page);
        params.put("state", state);
//        params.put("inspectorId", MyApplication.myApplication.userId);
        params.put("inspectorId", MyApplication.myApplication.userId);
        ApiManager.getInstance().requestGetHideLoading(this.getContext(), Constants.BASE_URL + "/app/workOrder/getWorkOrders", OrderListResult.class, params, new SubscriberListener<BaseResponse<OrderListResult>>() {
            @Override
@@ -210,9 +209,12 @@
        });
    }
    public void startDetail(String id) {
    public void startDetail(String workOrderId, String proResultId) {
        Intent intent = new Intent(this.getContext(), OrderDetailActivity.class);
        intent.putExtra("workOrderId", id);
        intent.putExtra("workOrderId", workOrderId);
        if (!TextUtils.isEmpty(proResultId)) {
            intent.putExtra("proResultId", proResultId);
        }
        startActivity(intent);
    }
app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java
@@ -1,9 +1,13 @@
package com.dayu.pipirrapp.net;
import static com.luck.picture.lib.thread.PictureThreadUtils.runOnUiThread;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.dayu.pipirrapp.MyApplication;
import com.dayu.pipirrapp.activity.LoginActivity;
import com.dayu.pipirrapp.bean.net.CodeResult;
import com.dayu.pipirrapp.bean.net.UplodFileState;
import com.dayu.pipirrapp.bean.net.WeatherResponse;
@@ -11,11 +15,18 @@
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.ProgressListener;
import com.dayu.pipirrapp.net.upload.ProgressRequestBody;
import com.dayu.pipirrapp.net.upload.UploadFileListener;
import com.dayu.pipirrapp.utils.CleanDataUtils;
import com.dayu.pipirrapp.utils.MapJpgUtils;
import com.dayu.pipirrapp.utils.MyJsonParser;
import com.dayu.pipirrapp.utils.MyLog;
import com.dayu.pipirrapp.utils.NetUtils;
import com.google.gson.Gson;
import com.google.gson.internal.LinkedTreeMap;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -124,6 +135,12 @@
                    public BaseResponse<T> apply(Object o) {
                        if (o instanceof BaseResponse) {
                            BaseResponse tem = (BaseResponse) o;
                            if (tem.getCode().equals("0000")) {
                                //当code为0000是跳转到登录界面
                                tem.setMsg("登录失效请重新登录");
                                redirectToLogin();
                                return tem;
                            }
                            BaseResponse<T> response = new BaseResponse<>();
                            response.setCode(tem.getCode());
                            response.setMsg(tem.getMsg());
@@ -261,34 +278,44 @@
     * 上传文件
     *
     * @param context
     * @param file
     * @param uplodData
     * @param listener
     */
    public void uploadFile(final Context context, final UplodFileState file, final UploadFileListener listener) {
    public void uploadFile(final Context context, final UplodFileState uplodData, final UploadFileListener listener) {
        // 创建 RequestBody,用于封装构建RequestBody
        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>() {
        File file = new File(uplodData.getFilePath());
        RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        ProgressRequestBody progressRequestBody = new ProgressRequestBody(requestBody, new ProgressListener() {
            @Override
            public void onProgress(long bytesWritten, long contentLength, boolean done) {
                // 更新进度条或进行其他操作
                int progress = (int) (100 * bytesWritten / contentLength);
                // 例如:更新 ProgressBar 或显示进度
                runOnUiThread(() -> {
                    // 进度条更新代码
                    // progressBar.setProgress(progress);
                    MyLog.d("progressRequestBody>>>" + "上传进度: " + progress + "%");
                });
            }
        });
        MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), progressRequestBody);
        RequestBody description = RequestBody.create(MediaType.parse("text/plain"), "file description");
        apiService.uploadFile(body, description).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);
                        uplodData.setState(1);
                        uplodData.setId(((LinkedTreeMap) response.body().getContent()).get("id").toString());
                        uplodData.setWebPath(((LinkedTreeMap) response.body().getContent()).get("webPath").toString());
                        listener.onBack(uplodData);
                    } else {
                        if (file.getNumber() <= uplodFilerepeatSize) {
                            file.setNumber(file.getNumber() + 1);
                            file.setState(2);
                            uploadFile(context, file, listener);
                        if (uplodData.getNumber() <= uplodFilerepeatSize) {
                            uplodData.setNumber(uplodData.getNumber() + 1);
                            uplodData.setState(2);
                            uploadFile(context, uplodData, listener);
                        } else {
                            listener.onBack(file);
                            listener.onBack(uplodData);
                        }
                    }
                }
@@ -296,16 +323,44 @@
            @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);
                if (uplodData.getNumber() <= uplodFilerepeatSize) {
                    uplodData.setNumber(uplodData.getNumber() + 1);
                    uplodData.setState(2);
                    uploadFile(context, uplodData, listener);
                } else {
                    listener.onBack(file);
                    listener.onBack(uplodData);
                }
            }
        });
    }
    /**
     * 判断当前code是否是未登录状态
     *
     * @param responseBody the response body in JSON format
     * @return true if login is required, false otherwise
     */
    private boolean isLoginRequired(String responseBody) {
        try {
            Gson gson = new Gson();
            Map<String, Object> responseMap = gson.fromJson(responseBody, Map.class);
            String code = (String) responseMap.get("code");
            return "0000".equals(code);  // Check if the code is not 0000
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 当code为“0000”时跳转到登录界面
     */
    private void redirectToLogin() {
        Context context = MyApplication.myApplication.getApplicationContext();
        CleanDataUtils.cleanUserData(context);
        Intent intent = new Intent(context, LoginActivity.class); // Assuming LoginActivity is your login screen
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // Clear task stack
        context.startActivity(intent);
    }
}
app/src/main/java/com/dayu/pipirrapp/net/ApiService.java
@@ -58,8 +58,8 @@
    Call<BaseResponse> uploadFiles(@PartMap Map<String, RequestBody> map);
    @Multipart
    @POST(Constants.BASE_URL + "app/webFile/upPhoto")
    Call<BaseResponse> uploadFile(@Part("description") RequestBody description, @Part MultipartBody.Part file);
    @POST(Constants.BASE_URL + "/app/webFile/upPhoto")
    Call<BaseResponse> uploadFile(@Part MultipartBody.Part file,@Part("description") RequestBody description);
    //获取验证码
    @GET(Constants.BASE_URL+"/app/captcha/get")
app/src/main/java/com/dayu/pipirrapp/net/MqttManager.java
@@ -2,9 +2,6 @@
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.util.Log;
import com.dayu.pipirrapp.utils.CommonKeyName;
@@ -49,7 +46,27 @@
            connectOptions.setKeepAliveInterval(60); // 设置保持连接的时间
            connectOptions.setAutomaticReconnect(true);  // 启用自动重连
            connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            checkNetwork();
//            LiveEventBus.get(CommonKeyName.NetworkCallback).observeForever(new Observer<Object>() {
//                @Override
//                public void onChanged(Object o) {
//                    switch ((int) o) {
//                        case NetUtils.Available:
//                            MyLog.i("MqttManager>>>Available");
//                            isHasNet = true;
//                            reconnect();
//                            break;
//                        case NetUtils.Lost:
//                            MyLog.i("MqttManager>>>Lost");
//                            isHasNet = false;
//                            try {
//                                mqttClient.disconnect();
//                            } catch (MqttException e) {
//                                e.printStackTrace();
//                            }
//                            break;
//                    }
//                }
//            });
        } catch (MqttException e) {
            e.printStackTrace();
        }
@@ -156,47 +173,18 @@
                Log.d("MqttManager", "Reconnected to MQTT broker! isHasNet=true");
            } else {
                Log.d("MqttManager", "isHasNet is false");
                Thread.sleep(5000);
                reconnect();
//                Thread.sleep(5000);
//                reconnect();
            }
        } catch (MqttException | InterruptedException e) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException ex) {
                e.printStackTrace();
            }// 每 5 秒重试一次
            reconnect();
//            try {
//                Thread.sleep(5000);
//            } catch (InterruptedException ex) {
//                e.printStackTrace();
//            }// 每 5 秒重试一次
//            reconnect();
        }
    }
    public void checkNetwork() {
        NetworkRequest request = new NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)  // 必须具备互联网能力
                .build();
        connectivityManager.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                super.onAvailable(network);
                // 网络可用时的处理逻辑
                Log.d("MqttManager", "Network is available.");
                isHasNet = true;
                reconnect();
            }
            @Override
            public void onLost(Network network) {
                super.onLost(network);
                // 网络丢失时的处理逻辑
                Log.d("MqttManager", "Network is lost.");
                isHasNet = false;
                try {
                    mqttClient.disconnect();
                } catch (MqttException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
app/src/main/java/com/dayu/pipirrapp/net/MyIntercepterApplication.java
@@ -39,6 +39,7 @@
                    e.printStackTrace();
                    return getNullResponse(request);
                }
                return response;
            } else {
                return getNullResponse(request);
@@ -99,4 +100,7 @@
        builder.message(message);
        return builder.build();
    }
}
app/src/main/java/com/dayu/pipirrapp/net/upload/ProgressListener.java
@@ -1,5 +1,5 @@
package com.dayu.pipirrapp.net.upload;
public interface ProgressListener {
    void onProgress(long bytesWritten, long totalBytes);
    void onProgress(long bytesWritten, long totalBytes, boolean done);
}
app/src/main/java/com/dayu/pipirrapp/net/upload/ProgressRequestBody.java
@@ -1,14 +1,14 @@
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.Buffer;
import okio.BufferedSink;
import okio.BufferedSource;
import okio.ForwardingSink;
import okio.Okio;
import okio.Sink;
/**
 * ProgressRequestBody -
@@ -18,36 +18,42 @@
 * @since 2024-11-28
 */
public class ProgressRequestBody extends RequestBody {
    private File file;
    private ProgressListener listener;
    private MediaType mediaType;
    private final RequestBody requestBody;
    private final ProgressListener progressListener;
    public ProgressRequestBody(File file, ProgressListener listener, String mimeType) {
        this.file = file;
        this.listener = listener;
        this.mediaType = MediaType.parse(mimeType);
    public ProgressRequestBody(RequestBody requestBody, ProgressListener progressListener) {
        this.requestBody = requestBody;
        this.progressListener = progressListener;
    }
    @Override
    public MediaType contentType() {
        return mediaType;
        return requestBody.contentType();
    }
    @Override
    public long contentLength() throws IOException {
        return requestBody.contentLength();
    }
    @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);
        Sink progressSink = new ForwardingSink(sink) {
            long totalBytesWritten = 0;
            @Override
            public void write(Buffer source, long byteCount) throws IOException {
                super.write(source, byteCount);
                totalBytesWritten += byteCount;
                if (progressListener != null) {
                    progressListener.onProgress(totalBytesWritten, contentLength(),false);
                }
            }
        }
        };
        BufferedSink bufferedSink = Okio.buffer(progressSink);
        requestBody.writeTo(bufferedSink);
        bufferedSink.flush();
    }
}
app/src/main/java/com/dayu/pipirrapp/tool/InspectionUtils.java
@@ -146,7 +146,9 @@
                                            .subscribeOn(Schedulers.io())
                                            .observeOn(Schedulers.io())
                                            .subscribe(inspectionLocationBeans -> {
                                                postInspectionData(context, inspectionBeans, inspectionLocationBeans);
                                                if (inspectionLocationBeans != null && inspectionLocationBeans.size() > 0) {
                                                    postInspectionData(context, inspectionBeans, inspectionLocationBeans);
                                                }
                                            });
                                });
                    }
app/src/main/java/com/dayu/pipirrapp/utils/CommonKeyName.java
@@ -21,4 +21,6 @@
    public final static String MQTTData = "MQTTData";
    public final static String NetworkCallback = "NetworkCallback";
}
app/src/main/java/com/dayu/pipirrapp/utils/DateUtils.java
@@ -28,5 +28,18 @@
        return sdf.format(date);
    }
    /**
     * 返回统一格式的当前时间截止到分钟
     *
     * @return yyyy-MM-dd HH:mm:ss
     */
    public static String getNowDateToMMStr() {
        // 当前时间
        Date date = new Date();
        // 创建 SimpleDateFormat 对象,设置日期格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        // 格式化当前时间为字符串
        return sdf.format(date);
    }
}
app/src/main/java/com/dayu/pipirrapp/utils/NetUtils.java
@@ -2,10 +2,15 @@
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.os.Build;
import androidx.annotation.NonNull;
import com.jeremyliao.liveeventbus.LiveEventBus;
/**
 * NetUtils - 网络相关公共方法
@@ -16,6 +21,10 @@
 */
public class NetUtils {
    public static final String TAG = "NetUtils";
    //有网
    public static final int Available = 1;
    //无网
    public static final int Lost = 2;
    /**
     * 判断当前是否有网络
@@ -49,26 +58,52 @@
    }
    public static void registerNetCallBack(Context context, ConnectivityManager.NetworkCallback networkCallback) {
    public static void registerNetCallBack(Context context) {
        MyLog.d("registerNetCallBack");
        // 注册网络状态监听
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        // 构建一个 NetworkRequest,指定感兴趣的网络类型
        NetworkRequest networkRequest = new NetworkRequest.Builder()
                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // 监听 Wi-Fi 网络
                .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)//// 监听移动数据网络
                .build();
        // 注册网络监听
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            cm.registerNetworkCallback(networkRequest, networkCallback);
        } else {
            // 对于较老版本,可以使用旧的方法注册网络状态监听
            // ConnectivityManager.setNetworkCallback() 无法在 API 级别 24 以下使用
        }
        cm.registerNetworkCallback(networkRequest, networkCallback);
    }
    // 注销广播接收器
    public static void unregisterReceiver(Context context,ConnectivityManager.NetworkCallback networkCallback) {
    public static void unregisterReceiver(Context context) {
        MyLog.d("unregisterReceiver");
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        cm.unregisterNetworkCallback(networkCallback);
    }
    //网络监控
    static ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(@NonNull Network network) {
            super.onAvailable(network);
            // 这里可以执行网络可用后的逻辑,比如进行数据请求等
            MyLog.d("networkCallback》onAvailable");
            LiveEventBus.get(CommonKeyName.NetworkCallback).post(Available);
        }
        @Override
        public void onLost(@NonNull Network network) {
            super.onLost(network);
            // 这里可以执行网络丢失后的逻辑,比如停止数据请求等
            MyLog.d("networkCallback》onLost");
            LiveEventBus.get(CommonKeyName.NetworkCallback).post(Lost);
        }
        @Override
        public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
            super.onCapabilitiesChanged(network, networkCapabilities);
            MyLog.d("networkCallback》onCapabilitiesChanged");
        }
    };
}
app/src/main/res/drawable/order_state_finish_bg.xml
New file
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#1890FF" />
    <corners android:radius="5dp" />
    <stroke
        android:width="1dp"
        android:color="#1572C6" />
</shape>
app/src/main/res/drawable/order_state_no_bg.xml
New file
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#F6F7FB" />
    <corners android:radius="5dp" />
    <stroke
        android:width="1dp"
        android:color="#ededed" />
</shape>
app/src/main/res/drawable/order_state_reject_bg.xml
New file
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#F44336" />
    <corners android:radius="5dp" />
    <stroke
        android:width="1dp"
        android:color="#C23626" />
</shape>
app/src/main/res/drawable/order_state_wait_bg.xml
New file
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#8BC34A" />
    <corners android:radius="5dp" />
    <stroke
        android:width="1dp"
        android:color="#4CAF50" />
</shape>
app/src/main/res/layout/activity_order_deal.xml
@@ -42,11 +42,15 @@
            <EditText
                android:id="@+id/contentET"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:text=""
                android:gravity="start"
                android:background="@drawable/edittext_backgroud"
                android:minHeight="100dp" />
                android:minHeight="100dp"
                android:maxHeight="200dp"/>
            <TextView
                android:layout_width="wrap_content"
app/src/main/res/layout/activity_order_detail.xml
@@ -11,6 +11,10 @@
        <variable
            name="data"
            type="com.dayu.pipirrapp.bean.net.OrderDetailResult" />
        <variable
            name="dealData"
            type="com.dayu.pipirrapp.bean.net.DealDetailResult" />
    </data>
    <RelativeLayout
@@ -27,7 +31,10 @@
            android:id="@+id/ScrollView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/title">
            android:layout_above="@+id/deal_button"
            android:layout_below="@+id/title"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp">
            <LinearLayout
@@ -47,8 +54,8 @@
                        android:id="@+id/ic_project"
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_marginRight="15dp"
                        android:layout_centerVertical="true"
                        android:layout_marginRight="15dp"
                        android:src="@mipmap/icon_project" />
                    <TextView
@@ -79,7 +86,7 @@
                        android:paddingTop="5dp"
                        android:paddingRight="10dp"
                        android:paddingBottom="5dp"
                        android:text="@{data.state}"
                        android:text="@{data.processingState}"
                        android:textSize="@dimen/manage_item_text_state_size" />
@@ -278,7 +285,7 @@
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:visibility="gone">
                    android:visibility="visible">
                    <TextView
                        android:layout_width="match_parent"
@@ -302,14 +309,40 @@
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="反馈:"
                            android:text="反馈详情:"
                            android:textColor="@color/manage_item_text"
                            android:textSize="@dimen/order_detail_text_size" />
                        <TextView
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:text="@{data.completeCriteria}"
                            android:text="@{dealData.content}"
                            android:textColor="@color/manage_item_text"
                            android:textSize="@dimen/order_detail_text_size" />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="10dp"
                        android:gravity="center_vertical"
                        android:orientation="horizontal">
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="反馈时间:"
                            android:textColor="@color/manage_item_text"
                            android:textSize="@dimen/order_detail_text_size" />
                        <TextView
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:text="@{dealData.reportTime}"
                            android:textColor="@color/manage_item_text"
                            android:textSize="@dimen/order_detail_text_size" />
@@ -352,8 +385,8 @@
            android:layout_alignParentBottom="true"
            android:background="@color/title_color"
            android:gravity="center"
            android:text="处理工单"
            android:onClick="@{()->itemclidk.startDealActivity()}"
            android:text="处理工单"
            android:textColor="@color/white"
            android:textSize="@dimen/order_detail_button_size" />
app/src/main/res/layout/fragment_order.xml
@@ -156,7 +156,7 @@
                android:layout_weight="1"
                android:background="@drawable/ic_choose_bg_whit"
                android:gravity="center"
                android:text="未解决"
                android:text="未完成"
                android:textColor="@color/title_color"
                android:textSize="@dimen/top_state_text_size"
                android:textStyle="bold" />
@@ -168,7 +168,7 @@
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:gravity="center"
                android:text="已解决"
                android:text="已完成"
                android:textColor="@color/black"
                android:textSize="@dimen/top_state_text_size" />
app/src/main/res/layout/item_image.xml
@@ -7,8 +7,8 @@
    <ImageView
        android:id="@+id/thumbnailImageView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:scaleType="centerCrop"/>
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop" />
</androidx.cardview.widget.CardView>
app/src/main/res/layout/item_order.xml
@@ -16,7 +16,7 @@
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:background="@drawable/ic_choose_gray_edge"
        android:onClick="@{()->itemclidk.startDetail(data.workOrderId)}"
        android:onClick="@{()->itemclidk.startDetail(data.workOrderId,data.proResultId)}"
        android:orientation="vertical"
        android:padding="10dp">
@@ -58,11 +58,12 @@
                android:layout_centerVertical="true"
                android:background="@drawable/ic_edt_gray_bg"
                android:gravity="center"
                android:textColor="@color/black"
                android:paddingLeft="10dp"
                android:paddingTop="5dp"
                android:paddingRight="10dp"
                android:paddingBottom="5dp"
                android:text="@{data.state}"
                android:text="@{data.processingState}"
                android:textSize="@dimen/manage_item_text_state_size" />