管灌系统巡查员智能手机App
zuoxiao
2024-12-23 5aa4aff7a2ea7953283cffccf3b1835931295d55
1.优化工单提醒功能,添加强制震动,防止同一个工单id重复提醒。
8个文件已修改
369 ■■■■■ 已修改文件
app/src/main/java/com/dayu/pipirrapp/activity/MainActivity.java 91 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/adapter/OrderAdapter.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/bean/net/OrderListResult.java 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/fragment/OrderFragment.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/utils/CommonKeyName.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_order_deal.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_order.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_order.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/MainActivity.java
@@ -1,12 +1,24 @@
package com.dayu.pipirrapp.activity;
import static androidx.core.content.ContextCompat.getSystemService;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
@@ -15,6 +27,7 @@
import com.dayu.pipirrapp.R;
import com.dayu.pipirrapp.adapter.TabAdapter;
import com.dayu.pipirrapp.bean.db.TagBean;
import com.dayu.pipirrapp.bean.net.OrderDetailResult;
import com.dayu.pipirrapp.dao.DaoSingleton;
import com.dayu.pipirrapp.databinding.ActivityMainBinding;
import com.dayu.pipirrapp.fragment.MapFragment;
@@ -36,11 +49,12 @@
 * 首页
 */
public class MainActivity extends AppCompatActivity {
    private static final String CHANNEL_ID = "order_channel";
    private ActivityMainBinding binding;
    private List<Fragment> fragments = new ArrayList<>();
    private long mExitTime;
    MqttManager mqttManager;
    private Map<String, String> workerIddata = new HashMap<>();
    public volatile static Map<String, String> workerIddata = new HashMap<>();
    private enum Tab {
@@ -77,16 +91,6 @@
                }
            }
        });
        //mq传来的消息
        LiveEventBus.get(CommonKeyName.MQTTData).observeForever(new Observer<Object>() {
            @Override
            public void onChanged(Object o) {
                workerIddata.put((String) o, (String) o);
                binding.redDotImg.setVisibility(View.VISIBLE);
            }
        });
        LiveEventBus.get(CommonKeyName.RedLotRefresh).observeForever(new Observer<Object>() {
            @Override
            public void onChanged(Object o) {
@@ -101,6 +105,19 @@
                        binding.redDotImg.setVisibility(View.GONE);
                    }
                }
            }
        });
        LiveEventBus.get(CommonKeyName.CreateNotification).observeForever(new Observer<Object>() {
            @Override
            public void onChanged(Object o) {
                if (o instanceof OrderDetailResult) {
                    OrderDetailResult orderDetailResult = ((OrderDetailResult) o);
                    workerIddata.put(orderDetailResult.getWorkOrderId(), orderDetailResult.getWorkOrderId());
                    binding.redDotImg.setVisibility(View.VISIBLE);
                    creatOrderNotification(orderDetailResult.getWorkOrderId().hashCode(), orderDetailResult.getTaskType(), orderDetailResult.getWorkOrderId());
                }
            }
        });
@@ -130,7 +147,7 @@
        binding.viewPager.setAdapter(adapter);
        binding.viewPager.setCurrentItem(1, false); // 默认显示地图页
        binding.viewPager.setOffscreenPageLimit(fragments.size());
        binding.viewPager.setUserInputEnabled(false);
    }
    @Override
@@ -222,5 +239,55 @@
        NetUtils.unregisterReceiver(this);
    }
    /**
     * 创建工单提示通知
     *
     * @param notifucId
     * @param data
     */
    private void creatOrderNotification(int notifucId, String data, String workOrderId) {
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        // 创建NotificationChannel(仅针对Android O及以上版本)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = getString(R.string.channel_name);
            String description = getString(R.string.channel_description);
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            // 注册通道
            notificationManager.createNotificationChannel(channel);
        }
        Intent notificationIntent = new Intent(this, OrderDetailActivity.class);
        notificationIntent.putExtra("workOrderId", workOrderId);
        int requestCode = workOrderId.hashCode(); // 使用workOrderId的哈希码作为requestCode
        PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode, notificationIntent, PendingIntent.FLAG_MUTABLE);
        // 创建震动效果
        // 获取 Vibrator 系统服务
        Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        long[] vibrationPattern = {0, 1000, 500, 1000}; // 震动模式:等待0ms,震动1000ms,等待500ms,震动1000ms
        int repeat = -1; // 不重复
        // 对于Android 26及以上版本,使用VibrationEffect
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            VibrationEffect effect = VibrationEffect.createWaveform(vibrationPattern, repeat);
            vibrator.vibrate(effect);
        } else {
            // 对于Android 25及以下版本,使用旧的vibrate方法
            vibrator.vibrate(vibrationPattern, repeat);
        }
        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("新工单")
                .setContentText(data)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pendingIntent)
                .setAutoCancel(true) // 点击通知后自动消失
                .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)// 使用默认的音效和震动
                .setVibrate(vibrationPattern)
                .build();
        notificationManager.notify(notifucId, notification);
    }
}
app/src/main/java/com/dayu/pipirrapp/adapter/OrderAdapter.java
@@ -9,6 +9,7 @@
import androidx.recyclerview.widget.RecyclerView;
import com.dayu.pipirrapp.R;
import com.dayu.pipirrapp.bean.net.OrderDetailResult;
import com.dayu.pipirrapp.bean.net.OrderListResult;
import com.dayu.pipirrapp.databinding.ItemNoMoreBinding;
import com.dayu.pipirrapp.databinding.ItemOrderBinding;
@@ -27,11 +28,11 @@
public class OrderAdapter extends BaseRecyclerAdapter<RecyclerView.ViewHolder> {
    List<OrderListResult.Data> recordsList;
    List<OrderDetailResult> recordsList;
    Context context;
    OrderFragment orderFragment;
    public OrderAdapter(Context context, List<OrderListResult.Data> recordsList, OrderFragment orderFragment) {
    public OrderAdapter(Context context, List<OrderDetailResult> recordsList, OrderFragment orderFragment) {
        this.context = context;
        this.recordsList = recordsList;
        this.orderFragment = orderFragment;
@@ -54,7 +55,7 @@
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof OrderAdapter.ViewHolder) {
            if (recordsList.size() > 0) {
                OrderListResult.Data record = recordsList.get(position);
                OrderDetailResult record = recordsList.get(position);
                ((OrderAdapter.ViewHolder) holder).getBinding().setData(record);
                switch (record.getProResultStateId()) {
                    case 0://未上报
app/src/main/java/com/dayu/pipirrapp/bean/net/OrderListResult.java
@@ -17,7 +17,7 @@
    int pageCurr;
    int pageSize;
    int pageTotal;
    List<Data> obj;
    List<OrderDetailResult> obj;
    public int getItemTotal() {
        return itemTotal;
@@ -51,178 +51,15 @@
        this.pageTotal = pageTotal;
    }
    public List<Data> getObj() {
    public List<OrderDetailResult> getObj() {
        return obj;
    }
    public void setObj(List<Data> obj) {
    public void setObj(List<OrderDetailResult> obj) {
        this.obj = obj;
    }
    public class Data {
        public String workOrderId;//工单ID
        public String dispatcherId;//派单人ID
        public String dispatcher;//派单人姓名
        public String inspectorId;//巡检员ID
        public String inspector;//巡检员姓名
        public String taskType;//任务类型
        public String taskContent;//任务内容
        public String completeCriteria;//完成标准
        public String deadLine;//要求完成时间
        public String clientReportId;//农户问题上报ID
        public String inspectorReportId;//巡检员问题上报ID
        public String completeTime;//任务完成时间
        public String dispatchTime;//派单时间
        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/fragment/OrderFragment.java
@@ -1,5 +1,7 @@
package com.dayu.pipirrapp.fragment;
import static androidx.core.content.ContextCompat.getSystemService;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -9,6 +11,8 @@
import android.graphics.Typeface;
import android.os.Build;
import android.os.Bundle;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -24,6 +28,7 @@
import com.dayu.pipirrapp.MyApplication;
import com.dayu.pipirrapp.R;
import com.dayu.pipirrapp.activity.MainActivity;
import com.dayu.pipirrapp.activity.OrderDetailActivity;
import com.dayu.pipirrapp.adapter.OrderAdapter;
import com.dayu.pipirrapp.bean.net.OrderDetailResult;
@@ -55,7 +60,7 @@
 */
public class OrderFragment extends BaseFragment {
    public static final int RESULT_REFRESH = 1001;
    private static final String CHANNEL_ID = "order_channel";
    private final int STATE_DONE = 2;
    private final int STATE_UNDONE = 1;
@@ -65,8 +70,8 @@
    int page = 1;
    int pageSize = 10;
    int state = 1;
    List<OrderListResult.Data> recordsListDone = new ArrayList<>();
    List<OrderListResult.Data> recordsList = new ArrayList<>();
    List<OrderDetailResult> recordsListDone = new ArrayList<>();
    List<OrderDetailResult> recordsList = new ArrayList<>();
    RefreshLayout myRefreshLayout;
    //最后刷新的时间
    long lastRefreshDate;
@@ -114,7 +119,7 @@
            @Override
            public void onChanged(Object o) {
                showRedlotDate = new Date().getTime();
                binding.redDotImg.setVisibility(View.VISIBLE);
//                binding.redDotImg.setVisibility(View.VISIBLE);
                getMarkerData((String) o);
            }
        });
@@ -124,7 +129,7 @@
    void initView() {
        //未完成
        binding.manageStateProgress.setOnClickListener(v -> {
        binding.manageStateProgressRL.setOnClickListener(v -> {
            chooseStateView(true);
            state = STATE_UNDONE;//1 未开始 2 已完成
@@ -145,7 +150,7 @@
            if (lastRefreshDate > showRedlotDate) {
                //消除红点
                LiveEventBus.get(CommonKeyName.RedLotRefresh).post(true);
                binding.redDotImg.setVisibility(View.GONE);
//                binding.redDotImg.setVisibility(View.GONE);
            }
            recordsList.clear();
            page = 0;
@@ -162,11 +167,10 @@
        binding.recyclerView.setAdapter(mAdapter);
        getMarkerData(myRefreshLayout, true, STATE_UNDONE);
        //已完成
        RefreshLayout myRefreshLayoutDone = (RefreshLayout) binding.refreshLayoutDone;
        RefreshLayout myRefreshLayoutDone = binding.refreshLayoutDone;
        myRefreshLayoutDone.setRefreshHeader(new ClassicsHeader(this.getContext()));
        myRefreshLayoutDone.setRefreshFooter(new ClassicsFooter(this.getContext()));
        myRefreshLayoutDone.setOnRefreshListener(refreshlayout -> {
//                refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败
            recordsListDone.clear();
            page = 0;
            getMarkerData(refreshlayout, true, STATE_DONE);
@@ -187,11 +191,11 @@
    public void onResume() {
        super.onResume();
        MyLog.d("OrderFragment>>onResume");
        if (showRedlotDate > lastRefreshDate) {
            binding.redDotImg.setVisibility(View.VISIBLE);
        } else {
            binding.redDotImg.setVisibility(View.GONE);
        }
//        if (showRedlotDate > lastRefreshDate) {
//            binding.redDotImg.setVisibility(View.VISIBLE);
//        } else {
//            binding.redDotImg.setVisibility(View.GONE);
//        }
    }
    @Override
@@ -223,19 +227,17 @@
            @Override
            public void onNext(BaseResponse<OrderListResult> t) {
                if (t.isSuccess()) {
                    if (t.isSuccess()) {
                        if (t.getContent().getObj() != null && t.getContent().getObj().size() > 0) {
                            if (state == STATE_UNDONE) {
                                recordsList.addAll(t.getContent().getObj());
                            } else {
                                recordsListDone.addAll(t.getContent().getObj());
                            }
                            if (t.getContent().getPageTotal() == page) {
                                refreshlayout.finishLoadMoreWithNoMoreData();
                            }
                    if (t.getContent().getObj() != null && t.getContent().getObj().size() > 0) {
                        if (state == STATE_UNDONE) {
                            recordsList.addAll(t.getContent().getObj());
                        } else {
                            recordsListDone.addAll(t.getContent().getObj());
                        }
                        if (t.getContent().getPageTotal() == page) {
                            refreshlayout.finishLoadMoreWithNoMoreData();
                        }
                    } else {
                        refreshlayout.finishLoadMoreWithNoMoreData();
                    }
                } else {
                    ToastUtil.showToast(OrderFragment.this.getContext(), t.getMsg());
@@ -276,59 +278,27 @@
        if (state) {
            binding.manageStateProgress.setTextColor(getResources().getColor(R.color.title_color, null));
            binding.manageStateProgress.setBackground(getResources().getDrawable(R.drawable.ic_choose_bg_whit, null));
            binding.manageStateProgressRL.setBackground(getResources().getDrawable(R.drawable.ic_choose_bg_whit, null));
            binding.manageStateProgress.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
            binding.manageStateFinish.setTextColor(getResources().getColor(R.color.black, null));
            binding.manageStateFinish.setBackground(getResources().getDrawable(R.color.title_choose_bg, null));
            binding.manageStateFinish.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
            binding.refreshLayout.setVisibility(View.VISIBLE);
            binding.refreshLayoutDone.setVisibility(View.GONE);
        } else {
            binding.manageStateFinish.setTextColor(getResources().getColor(R.color.title_color, null));
            binding.manageStateFinish.setBackground(getResources().getDrawable(R.drawable.ic_choose_bg_whit, null));
            binding.manageStateFinish.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
            binding.manageStateProgress.setTextColor(getResources().getColor(R.color.black, null));
            binding.manageStateProgress.setBackground(getResources().getDrawable(R.color.title_choose_bg, null));
            binding.manageStateProgressRL.setBackground(getResources().getDrawable(R.color.title_choose_bg, null));
            binding.manageStateProgress.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
            binding.refreshLayout.setVisibility(View.GONE);
            binding.refreshLayoutDone.setVisibility(View.VISIBLE);
        }
    }
    /**
     * 创建工单提示通知
     *
     * @param notifucId
     * @param data
     */
    private void creatOrderNotification(int notifucId, String data, String workOrderId) {
        NotificationManager notificationManager = (NotificationManager) requireContext().getSystemService(Context.NOTIFICATION_SERVICE);
        // 创建NotificationChannel(仅针对Android O及以上版本)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = getString(R.string.channel_name);
            String description = getString(R.string.channel_description);
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            // 注册通道
            notificationManager.createNotificationChannel(channel);
        }
        Intent notificationIntent = new Intent(this.getContext(), OrderDetailActivity.class);
        notificationIntent.putExtra("workOrderId", workOrderId);
        int requestCode = workOrderId.hashCode(); // 使用workOrderId的哈希码作为requestCode
        PendingIntent pendingIntent = PendingIntent.getActivity(this.getContext(), requestCode, notificationIntent, PendingIntent.FLAG_MUTABLE);
        Notification notification = new NotificationCompat.Builder(this.getContext(), CHANNEL_ID)
                .setContentTitle("新工单")
                .setContentText(data)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pendingIntent)
                .setAutoCancel(true) // 点击通知后自动消失
                .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)// 使用默认的音效和震动
                .build();
        notificationManager.notify(notifucId, notification);
    }
    /**
     * 获取工单详情
@@ -340,8 +310,12 @@
            @Override
            public void onNext(BaseResponse<OrderDetailResult> t) {
                if (t.isSuccess()) {
                    if (t.isSuccess()) {
                        creatOrderNotification(workOrderId.hashCode(), t.getContent().getTaskType(), workOrderId);
                    if (MainActivity.workerIddata != null) {
                        if (!MainActivity.workerIddata.containsKey(workOrderId)) {
                            LiveEventBus.get(CommonKeyName.CreateNotification).post(t.getContent());
                            recordsList.add(0, t.getContent());
                            mAdapter.notifyItemInserted(0);
                        }
                    }
                }
            }
app/src/main/java/com/dayu/pipirrapp/utils/CommonKeyName.java
@@ -26,4 +26,7 @@
    //刷新新工单小红点
    public final static String RedLotRefresh="RedLotRefresh";
    //创建通知
    public final static String CreateNotification="CreateNotification";
}
app/src/main/res/layout/activity_order_deal.xml
@@ -10,7 +10,7 @@
        <variable
            name="data"
            type="com.dayu.pipirrapp.bean.net.OrderListResult.Data" />
            type="com.dayu.pipirrapp.bean.net.OrderDetailResult" />
    </data>
    <RelativeLayout
app/src/main/res/layout/fragment_order.xml
@@ -149,6 +149,7 @@
            android:orientation="horizontal">
            <RelativeLayout
                android:id="@+id/manage_state_progressRL"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_margin="5dp"
app/src/main/res/layout/item_order.xml
@@ -8,7 +8,7 @@
        <variable
            name="data"
            type="com.dayu.pipirrapp.bean.net.OrderListResult.Data" />
            type="com.dayu.pipirrapp.bean.net.OrderDetailResult" />
    </data>
    <LinearLayout