Ver código fonte

增加简易任务单管理

wuhb 1 ano atrás
pai
commit
3178621dc3

+ 6 - 1
app/src/main/AndroidManifest.xml

@@ -62,6 +62,9 @@
             </intent-filter>
         </activity>
 
+        <activity
+            android:name=".activity.HomeActivity"
+            android:configChanges="keyboardHidden|screenSize" />
         <activity
             android:name=".activity.ControlActivity"
             android:configChanges="keyboardHidden|screenSize" />
@@ -71,7 +74,9 @@
         <activity
             android:name=".activity.LivePreviewActivity"
             android:configChanges="keyboardHidden|screenSize" />
-
+        <activity
+            android:name=".activity.OrderTaskInfoActivity"
+            android:configChanges="keyboardHidden|screenSize" />
         <service
             android:name=".receiver.SocketService"
             android:enabled="true"

+ 495 - 0
app/src/main/java/com/qy/agv/activity/HomeActivity.java

@@ -0,0 +1,495 @@
+package com.qy.agv.activity;
+
+import static com.qy.agv.comm.BaseApplication.mScanManager;
+import static com.qy.agv.util.Constant.CACHE_BIND_CONTROL;
+import static com.qy.agv.util.Constant.CACHE_LOGIN_KEY;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.IntentFilter;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.util.DisplayMetrics;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.AdapterView;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.PopupWindow;
+import android.widget.SimpleAdapter;
+import android.widget.TextView;
+
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.reflect.TypeToken;
+import com.qy.agv.R;
+import com.qy.agv.activity.adapter.HomeListViewAdapter;
+import com.qy.agv.activity.adapter.MainListViewAdapter;
+import com.qy.agv.activity.dao.MainDao;
+import com.qy.agv.activity.model.BinLocModel;
+import com.qy.agv.activity.model.EventMessage;
+import com.qy.agv.activity.model.OrderTaskModel;
+import com.qy.agv.activity.model.RobotModel;
+import com.qy.agv.activity.model.ShelfModel;
+import com.qy.agv.activity.model.TaskModel;
+import com.qy.agv.activity.model.UserModel;
+import com.qy.agv.comm.BaseActivity;
+import com.qy.agv.comm.CacheService;
+import com.qy.agv.comm.Res;
+import com.qy.agv.databinding.ActivityHomeBinding;
+import com.qy.agv.databinding.ActivityMainBinding;
+import com.qy.agv.update.UpdateManager;
+import com.qy.agv.util.Constant;
+import com.qy.agv.util.HttpsUtil;
+import com.qy.agv.util.MD5Encryption;
+import com.qy.agv.util.MyProgress;
+import com.qy.agv.util.Permission;
+import com.qy.agv.util.ProjectUtils;
+import com.qy.agv.util.StringUtils;
+import com.qy.agv.util.ToastUtils;
+import com.qy.agv.util.ToolUtils;
+
+import org.apache.log4j.Logger;
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.xutils.common.Callback;
+import org.xutils.http.RequestParams;
+import org.xutils.x;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+public class HomeActivity extends BaseActivity {
+    public static Logger mylog =Logger.getLogger(HomeActivity.class);
+
+    private ActivityHomeBinding binding;
+    private Context context;
+    private HomeListViewAdapter listViewAdapter;
+    private ArrayList<OrderTaskModel> mList;
+    private UserModel user;
+    private Button submit;
+    private PopupWindow popupWindow2;
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        binding = ActivityHomeBinding.inflate(getLayoutInflater());
+        setContentView(binding.getRoot());
+        context = this;
+        ProjectUtils.init(this);
+        registerReceiver();
+        initCommonTop2();
+        initLogin();
+        initView();
+        initData();
+        Permission.checkPermission(this);
+        EventBus.getDefault().register(this);
+        reloadData();
+        checkNet();
+//        update();
+    }
+
+    private void checkNet(){
+        new Thread(()->{
+            while (true){
+                try {
+                    boolean rs = ToolUtils.checkUrl(Constant.HTTP_URL);
+                    if(!rs){
+                        int times = ToolUtils.ping2("www.baidu.com", 1, 3000);
+                        runOnUiThread(()->{
+                            binding.showMsg.setVisibility(View.VISIBLE);
+                            if(times < 0){
+                                binding.showMsg.setText("网络连接异常");
+                            }else{
+                                binding.showMsg.setText("服务器连接异常");
+                            }
+                        });
+                    }else{
+                        runOnUiThread(()->{
+                            binding.showMsg.setVisibility(View.GONE);
+                        });
+                    }
+                    TimeUnit.SECONDS.sleep(5);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+    }
+
+    private void reloadData(){
+        new Handler().postDelayed(()->{
+            if(Constant.user != null) {
+                searchTask(1);
+            }
+            reloadData();
+        }, 5000);
+    }
+
+    private void initLogin(){
+        String userStr = CacheService.getInstance(context).getCache(CACHE_LOGIN_KEY, "user");
+        if(!StringUtils.isEmpty(userStr)){
+            user = new Gson().fromJson(userStr, UserModel.class);
+            if(!StringUtils.isEmpty(user.getLoginPwd()) && !StringUtils.isEmpty(user.getLoginName())){
+                checkToken(user.getLoginName(), user.getLoginPwd());
+            }
+        }
+    }
+
+
+    private void initData(){
+        mList = new ArrayList<>();
+        listViewAdapter = new HomeListViewAdapter(mList, context);
+        binding.swipeContainer.setAdapter(listViewAdapter);
+        binding.swipeContainer.setVisibility(View.GONE);
+        binding.tvEmpty.setVisibility(View.VISIBLE);
+        binding.swipeContainer.setColorSchemeResources(R.color.colorPrimary, R.color.colorPrimaryDark);
+        binding.swipeContainer.setProgressViewEndTarget(true, 200);
+        binding.swipeContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                searchTask(0);
+            }
+        });
+        binding.lvComment.setOnItemClickListener((parent, view, position, id) -> {
+            OrderTaskModel orderTaskModel = mList.get(position);
+            Bundle bundle = new Bundle();
+            bundle.putString("id", orderTaskModel.getId());
+            toActivity(OrderTaskInfoActivity.class, bundle);
+        });
+        binding.swipeContainer.autoRefresh();
+    }
+
+    private void initView(){
+        ImageView back = findViewById(R.id.c_iv_common_back);
+        back.setVisibility(View.GONE);
+
+        submit = findViewById(R.id.c_iv_common_submit);
+        submit.setBackgroundColor(Res.getColor("transparent"));
+        submit.setTextColor(Res.getColor("white"));
+        submit.setVisibility(View.VISIBLE);
+        submit.setText("未登录");
+        submit.setOnClickListener(view -> {
+            if("未登录".contentEquals(submit.getText())) {
+                login();
+            }else{
+                toActivity(RobotInfoActivity.class);
+            }
+        });
+        submit.setOnLongClickListener(v -> {
+            toActivity(RobotInfoActivity.class);
+            return false;
+        });
+    }
+
+    private void registerReceiver() {
+        if (mScanManager != null) {
+            IntentFilter filter = new IntentFilter();
+            if(Constant.MODEL.contains("ET")) {
+                filter.addAction(ET_SCAN_ACTION);
+            }
+            registerReceiver(mReceiver, filter);
+        }
+    }
+
+    public void checkToken(String loginName, String loginPwd) {
+        MyProgress progress = MyProgress.getInstance();
+        progress.show(context, "提示", "正在登录");
+        try {
+            RequestParams params = httParams(Constant.LOG_IN);
+            params.addBodyParameter("grant_type", "password");
+            params.addBodyParameter("username", loginName);
+            if (StringUtils.isEmpty(loginName)) {
+                ToastUtils.showToast(context, "账号不能为空");
+                return;
+            }
+            if (StringUtils.isEmpty(loginPwd)) {
+                ToastUtils.showToast(context, "密码不能为空");
+                return;
+            }
+            //      密码md5加密
+            String pwdMd5 = MD5Encryption.encrypt(loginPwd);
+            params.addBodyParameter("password", pwdMd5);
+            x.http().post(params, new Callback.CommonCallback<String>() {
+                @Override
+                public void onSuccess(String arg0) {
+                    mylog.debug(arg0);
+                    try {
+                        if (arg0.contains("error_description")) {
+                            JSONObject object = new JSONObject(arg0);
+                            ToastUtils.showToast(context, object.getString("error_description"));
+                        } else {
+                            user = new Gson().fromJson(arg0, UserModel.class);
+                            user.setLoginName(loginName);
+                            user.setLoginPwd(loginPwd);
+                            Constant.ACCESS_TOKEN = user.getAccess_token();
+                            Constant.REFRESH_TOKEN = user.getAccess_token();
+                            arg0 = new Gson().toJson(user);
+                            CacheService.getInstance(context).saveCache(CACHE_LOGIN_KEY, "user", arg0);
+                            if (user.getUser_id() != null) {
+                                if (popupWindow2 != null) {
+                                    popupWindow2.dismiss();
+                                }
+                                Constant.user = user;
+                                Object real_name_obj = user.getReal_name();
+                                if (real_name_obj != null) {
+                                    submit.setText(real_name_obj.toString());
+                                }
+                                searchTask(0);
+                            }
+                        }
+                    } catch (JSONException e) {
+                        e.printStackTrace();
+                        mylog.error(e);
+                    }
+                }
+
+                @Override
+                public void onError(Throwable ex, boolean isOnCallback) {
+                    ex.printStackTrace();
+                    HttpsUtil.parserError(HomeActivity.this, ex);
+                }
+
+                @Override
+                public void onFinished() {
+                    progress.close();
+                }
+
+                @Override
+                public void onCancelled(CancelledException arg0) {
+                    mylog.error("onRead:", arg0);
+                }
+            });
+        }catch (Exception e){
+            ToastUtils.showToast(context, "登录失败");
+            mylog.error(e);
+        }
+    }
+
+    @Override
+    protected String getCommonTopTitle() {
+        return Res.getString("app_name");
+    }
+
+    @Override
+    protected int getCommonTopICO() {
+        return 0;
+    }
+
+    @Override
+    public void receiverTask(String barcode) {
+        System.out.println("扫码:" + barcode);
+        try {
+            if (barcode.startsWith("05-")) {
+                String loginName = barcode.split("-")[1];
+                String[] login_password = loginName.split(",");
+                checkToken(login_password[0], login_password[1]);
+                return;
+            }
+            if (user == null) {
+                ToastUtils.showToast(context, "该设备没有登录");
+                return;
+            }
+
+        }catch (Exception ex){
+            mylog.error("任务发送异常:", ex);
+            ToastUtils.showToast(context, "发送异常");
+        }
+    }
+
+    public void setBackgroundAlpha(float bgAlpha) {
+        WindowManager.LayoutParams lp = getWindow().getAttributes();
+        lp.alpha = bgAlpha;
+        getWindow().setAttributes(lp);
+    }
+
+    private void searchTask(int from) {
+        MyProgress myProgress = MyProgress.getInstance();
+        if(from == 0) {
+            myProgress.show(context, "提示", "正在加载");
+        }
+        RequestParams params = httParams(Constant.ORDER_TASK_LIST);
+//        params.addBodyParameter("requester", Constant.user.getUser_id().toString());
+        params.addBodyParameter("current", "1");
+        params.addBodyParameter("size", "100");
+//        params.addBodyParameter("distributionTime", DateUtil.getCurrDate(Constant.DATE_FORMATE));
+        x.http().get(params, new Callback.CommonCallback<JSONObject>() {
+            @Override
+            public void onSuccess(JSONObject rs) {
+                mylog.info(rs.toString());
+                try {
+                    if (rs.getInt("code") != 200) {
+                        ToastUtils.showToast(context, "请求失败");
+                    } else {
+                        if (rs.getBoolean("success")) {
+                            System.out.println(rs.get("data"));
+                            Type rds = new TypeToken<Map<String, JsonElement>>() {
+                            }.getType();
+                            Map<String, JsonElement> records = new Gson().fromJson(rs.get("data").toString(), rds);
+                            int pages = rs.getJSONObject("data").getInt("pages");
+                            System.out.println(records.get("records"));
+                            Type lt = new TypeToken<ArrayList<OrderTaskModel>>() {}.getType();
+                            Object recodes_obj = records.get("records");
+                            if(recodes_obj!=null) {
+                                if(from == 0) {
+                                    mList.clear();
+                                    List<OrderTaskModel> taskModelList = new Gson().fromJson(recodes_obj.toString(), lt);
+                                    mList.addAll(taskModelList);
+                                    reloadView();
+                                }
+                                if(from == 1){
+                                    List<OrderTaskModel> taskModelList = new Gson().fromJson(recodes_obj.toString(), lt);
+                                    updateList(taskModelList);
+                                }
+                            }
+                        }
+                    }
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            @Override
+            public void onError(Throwable ex, boolean isOnCallback) {
+                ex.printStackTrace();
+                HttpsUtil.parserError(HomeActivity.this, ex);
+                mylog.error("请求异常:", ex);
+            }
+
+            @Override
+            public void onFinished() {
+                myProgress.close();
+            }
+
+            @Override
+            public void onCancelled(CancelledException arg0) {
+                mylog.error("onRead:", arg0);
+            }
+        });
+    }
+
+    public void reloadView(){
+        if(mList.size() > 0) {
+            binding.swipeContainer.setVisibility(View.VISIBLE);
+            binding.tvEmpty.setVisibility(View.GONE);
+        }else{
+            binding.swipeContainer.setVisibility(View.GONE);
+            binding.tvEmpty.setVisibility(View.VISIBLE);
+        }
+        listViewAdapter.notifyDataSetChanged();
+        binding.swipeContainer.setRefreshing(false);
+        binding.swipeContainer.setLoading(false);
+    }
+
+    public void updateList(List<OrderTaskModel> n_list){
+        if(mList.size() != n_list.size()){
+            mList.clear();
+            mList.addAll(n_list);
+            reloadView();
+        }else{
+            for (OrderTaskModel taskModel:mList){
+                String id = taskModel.getId();
+                for (OrderTaskModel nTaskModel:n_list){
+                    if(id.equals(nTaskModel.getId())){
+                        taskModel.setStatus(nTaskModel.getStatus());
+                    }
+                }
+            }
+            listViewAdapter.notifyDataSetChanged();
+        }
+    }
+
+    private void logout(){
+        Constant.user = null;
+        CacheService.getInstance(context).clear(CACHE_BIND_CONTROL);
+        CacheService.getInstance(context).clear(CACHE_LOGIN_KEY);
+        Constant.ACCESS_TOKEN = null;
+        Constant.REFRESH_TOKEN = null;
+        mList.clear();
+        listViewAdapter.notifyDataSetChanged();
+        binding.swipeContainer.setVisibility(View.GONE);
+        binding.tvEmpty.setVisibility(View.VISIBLE);
+        submit.setText("未登录");
+    }
+
+    private void login(){
+        View view = binding.getRoot().getRootView();
+        View popup_login_view= LayoutInflater.from(context).inflate(R.layout.popupwindow_login,null);
+        EditText loginName = popup_login_view.findViewById(R.id.tv_login_name);
+        EditText loginPassword = popup_login_view.findViewById(R.id.tv_login_password);
+        String userStr = CacheService.getInstance(context).getCache(CACHE_LOGIN_KEY, "user");
+        if(!StringUtils.isEmpty(userStr)){
+            user = new Gson().fromJson(userStr, UserModel.class);
+            loginName.setText(user.getLoginName());
+            loginPassword.setText(user.getLoginPwd());
+        }
+        Button cancel = popup_login_view.findViewById(R.id.bt_cancel);
+        Button ok = popup_login_view.findViewById(R.id.bt_ok);
+        cancel.setOnClickListener(v -> {
+            popupWindow2.dismiss();
+        });
+        ok.setOnClickListener(v -> {
+            String lName = loginName.getText().toString();
+            String lPassword = loginPassword.getText().toString();
+            checkToken(lName, lPassword);
+        });
+        WindowManager manager = this.getWindowManager();
+        DisplayMetrics outMetrics = new DisplayMetrics();
+        manager.getDefaultDisplay().getMetrics(outMetrics);
+        double width = outMetrics.widthPixels*0.8;
+        popupWindow2 = new PopupWindow(view, (int) width,
+                ViewGroup.LayoutParams.WRAP_CONTENT);
+        //设置窗体的内容
+        popupWindow2.setContentView(popup_login_view);
+        popupWindow2.setOutsideTouchable(true);
+        popupWindow2.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
+        popupWindow2.setFocusable(true);
+        popupWindow2.setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
+        popupWindow2.setOnDismissListener(new PopupWindow.OnDismissListener() {
+            @Override
+            public void onDismiss() {
+                setBackgroundAlpha(1.0f);
+            }
+        });
+        setBackgroundAlpha(0.5f);
+        popupWindow2.showAtLocation(view, Gravity.CENTER, 0, 0);
+    }
+
+    public void update(){
+        UpdateManager updateManager = new UpdateManager(context);
+        try {
+            updateManager.checkUpdate(context);
+        }catch (Exception ex){
+            ex.printStackTrace();
+            mylog.error("更新检测异常", ex);
+        }
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true, priority = 1)
+    public void onReceiveMsg(EventMessage message){
+        if(message.getType() == 2){
+            logout();
+        }
+        if(message.getType() == 3){
+            searchTask(1);
+        }
+    }
+}

+ 298 - 0
app/src/main/java/com/qy/agv/activity/OrderTaskInfoActivity.java

@@ -0,0 +1,298 @@
+package com.qy.agv.activity;
+
+import static com.qy.agv.comm.BaseApplication.mScanManager;
+import static com.qy.agv.util.Constant.CACHE_LOGIN_KEY;
+
+import android.content.Context;
+import android.content.IntentFilter;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.util.DisplayMetrics;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+import com.google.gson.Gson;
+import com.qy.agv.R;
+import com.qy.agv.activity.appEnum.StatusEnum;
+import com.qy.agv.activity.model.EventMessage;
+import com.qy.agv.activity.model.OrderTaskModel;
+import com.qy.agv.activity.model.UserModel;
+import com.qy.agv.comm.BaseActivity;
+import com.qy.agv.comm.CacheService;
+import com.qy.agv.comm.Res;
+import com.qy.agv.databinding.YgOrderTaskInfoBinding;
+import com.qy.agv.util.Constant;
+import com.qy.agv.util.HttpsUtil;
+import com.qy.agv.util.MyProgress;
+import com.qy.agv.util.StringUtils;
+import com.qy.agv.util.ToastUtils;
+
+import org.apache.log4j.Logger;
+import org.greenrobot.eventbus.EventBus;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.xutils.common.Callback;
+import org.xutils.http.RequestParams;
+import org.xutils.x;
+
+public class OrderTaskInfoActivity extends BaseActivity {
+    public static Logger mylog =Logger.getLogger(OrderTaskInfoActivity.class);
+
+    private YgOrderTaskInfoBinding binding;
+    private Context context;
+    private UserModel user;
+    private OrderTaskModel orderTaskModel;
+    private PopupWindow popupWindow;
+    private View popup_view;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        binding = YgOrderTaskInfoBinding.inflate(getLayoutInflater());
+        setContentView(binding.getRoot());
+        context = this;
+        registerReceiver();
+        initCommonTop2();
+        initView();
+        initData();
+    }
+
+
+    private void initData(){
+        String userStr = CacheService.getInstance(context).getCache(CACHE_LOGIN_KEY, "user");
+        if(!StringUtils.isEmpty(userStr)) {
+            user = new Gson().fromJson(userStr, UserModel.class);
+        }
+        String id = getParamString("id");
+        loadTask(id);
+    }
+
+    private void parserData(){
+        if(orderTaskModel == null){
+            ToastUtils.showToast(context, "该设备没有登录");
+            return;
+        }
+        if(orderTaskModel.getRunTime()==null){
+            orderTaskModel.setRunTime(0L);
+        }
+        binding.tvTaskCode.setText(orderTaskModel.getTaskCode());
+        binding.tvTaskName.setText(orderTaskModel.getTaskName());
+        binding.tvStartPoint.setText(orderTaskModel.getFromAreaName()+"("+orderTaskModel.getFromAreaId()+")");
+        binding.tvEndPoint.setText(orderTaskModel.getToAreaName()+"("+orderTaskModel.getToAreaId()+")");
+        binding.tvStartTime.setText(orderTaskModel.getStartTime());
+        binding.tvEndTime.setText(orderTaskModel.getEndTime());
+        binding.tvRunTime.setText(orderTaskModel.getRunTime().toString());
+        binding.tvCreateTime.setText(orderTaskModel.getCreateTime());
+        StatusEnum status = StatusEnum.filter(orderTaskModel.getStatus());
+        if(orderTaskModel.getStatus() == 1){
+            binding.tvStatus.setTextColor(Color.BLUE);
+        }else if(orderTaskModel.getStatus() == 2){
+            binding.tvStatus.setTextColor(Color.parseColor("#ff00ff"));
+        }else if(orderTaskModel.getStatus() == 3){
+            binding.tvStatus.setTextColor(Color.GREEN);
+        }else if(orderTaskModel.getStatus() == 4){
+            binding.tvStatus.setTextColor(Color.RED);
+        }else{
+            binding.tvStatus.setTextColor(Color.DKGRAY);
+        }
+        binding.tvStatus.setText(status.getText());
+        if(orderTaskModel.getStatus() == 1){
+            openDialog();
+        }
+    }
+
+    private void openDialog(){
+        View v = binding.getRoot().getRootView();
+        popup_view= LayoutInflater.from(context).inflate(R.layout.pw_order_task,null);
+        TextView taskNameView = popup_view.findViewById(R.id.tv_task_name);
+        taskNameView.setOnClickListener(view->{
+            receiverTask("Loc-1-1-3");
+            popupWindow.dismiss();
+        });
+
+        TextView startPointView = popup_view.findViewById(R.id.tv_start_point);
+        taskNameView.setText(orderTaskModel.getTaskName());
+        startPointView.setText(orderTaskModel.getFromAreaName());
+        WindowManager manager = this.getWindowManager();
+        DisplayMetrics outMetrics = new DisplayMetrics();
+        manager.getDefaultDisplay().getMetrics(outMetrics);
+        double width = outMetrics.widthPixels*0.9;
+        popupWindow = new PopupWindow(v, (int) width,
+                ViewGroup.LayoutParams.WRAP_CONTENT);
+        //设置窗体的内容
+        popupWindow.setContentView(popup_view);
+        popupWindow.setOutsideTouchable(false);
+        popupWindow.setFocusable(false);
+        popupWindow.setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
+        popupWindow.setOnDismissListener(() -> setBackgroundAlpha(1.0f));
+        setBackgroundAlpha(0.5f);
+        popupWindow.showAtLocation(v, Gravity.CENTER, 0, 0);
+    }
+
+    public void setBackgroundAlpha(float bgAlpha) {
+        WindowManager.LayoutParams lp = getWindow().getAttributes();
+        lp.alpha = bgAlpha;
+        getWindow().setAttributes(lp);
+    }
+
+    private void initView(){
+        ImageView back = findViewById(R.id.c_iv_common_back);
+        back.setVisibility(View.VISIBLE);
+        back.setOnClickListener(v->{
+            finish();
+        });
+        Button submit = findViewById(R.id.c_iv_common_submit);
+        submit.setVisibility(View.GONE);
+
+        binding.btnOk.setVisibility(View.GONE);
+        binding.btnOk.setOnClickListener(v->{
+            sendTask();
+        });
+    }
+
+    private void registerReceiver() {
+        if (mScanManager != null) {
+            IntentFilter filter = new IntentFilter();
+            if(Constant.MODEL.contains("ET")) {
+                filter.addAction(ET_SCAN_ACTION);
+            }
+            registerReceiver(mReceiver, filter);
+        }
+    }
+
+    @Override
+    protected String getCommonTopTitle() {
+        return Res.getString("app_name");
+    }
+
+    @Override
+    protected int getCommonTopICO() {
+        return 0;
+    }
+
+    @Override
+    public void receiverTask(String barcode) {
+        System.out.println("扫码:" + barcode);
+        try {
+            if (user == null) {
+                ToastUtils.showToast(context, "该设备没有登录");
+                finish();
+                return;
+            }
+            if(!barcode.equals(orderTaskModel.getFromAreaId())){
+                ToastUtils.showToast(context, "库位不存在");
+            }else{
+                ToastUtils.showToast(context, "核对成功");
+                binding.btnOk.setVisibility(View.VISIBLE);
+                popupWindow.dismiss();
+            }
+        }catch (Exception ex){
+            mylog.error("任务发送异常:", ex);
+            ToastUtils.showToast(context, "发送异常");
+        }
+    }
+
+    private void loadTask(String id) {
+        MyProgress myProgress = MyProgress.getInstance();
+        myProgress.show(context, "提示", "正在加载");
+        RequestParams params = httParams(Constant.ORDER_TASK_DETAIL);
+        params.addBodyParameter("id", id);
+        x.http().get(params, new Callback.CommonCallback<JSONObject>() {
+            @Override
+            public void onSuccess(JSONObject rs) {
+                mylog.info(rs.toString());
+                try {
+                    if (rs.getInt("code") != 200) {
+                        ToastUtils.showToast(context, "请求失败");
+                    } else {
+                        if (rs.getBoolean("success")) {
+                            System.out.println(rs.get("data"));
+                            orderTaskModel = new Gson().fromJson(rs.get("data").toString(), OrderTaskModel.class);
+                            parserData();
+                        }
+                    }
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            @Override
+            public void onError(Throwable ex, boolean isOnCallback) {
+                ex.printStackTrace();
+                HttpsUtil.parserError(OrderTaskInfoActivity.this, ex);
+                mylog.error("请求异常:", ex);
+            }
+
+            @Override
+            public void onFinished() {
+                myProgress.close();
+            }
+
+            @Override
+            public void onCancelled(CancelledException arg0) {
+                mylog.error("onRead:", arg0);
+            }
+        });
+    }
+
+    private void sendTask(){
+        if(orderTaskModel == null){
+            ToastUtils.showToast(context, "任务单不能为空");
+            return;
+        }
+        MyProgress myProgress = MyProgress.getInstance();
+        myProgress.show(context, "提示", "正在提交");
+        RequestParams params = httParams(Constant.PUSH_ORDER_TASK);
+        params.addBodyParameter("id", orderTaskModel.getId());
+        x.http().post(params, new Callback.CommonCallback<JSONObject>() {
+            @Override
+            public void onSuccess(JSONObject rs) {
+                mylog.info(rs.toString());
+                try {
+                    if(!rs.has("code")){
+                        ToastUtils.showToast(context, "请求失败");
+                    }else if (rs.getInt("code") != 200) {
+                        ToastUtils.showToast(context, rs.getString("msg"));
+                    } else {
+                        if (rs.getBoolean("success")) {
+                            ToastUtils.showToast(context, rs.getString("msg"));
+                            new Handler().postDelayed(()->{
+                                EventMessage message = new EventMessage(3, "刷新任务单");
+                                EventBus.getDefault().post(message);
+                            }, 100);
+                            finish();
+                        }
+                    }
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            @Override
+            public void onError(Throwable ex, boolean isOnCallback) {
+                ex.printStackTrace();
+                HttpsUtil.parserError(OrderTaskInfoActivity.this, ex);
+                mylog.error("请求异常:", ex);
+            }
+
+            @Override
+            public void onFinished() {
+                myProgress.close();
+            }
+
+            @Override
+            public void onCancelled(CancelledException arg0) {
+                mylog.error("onRead:", arg0);
+            }
+        });
+    }
+}

+ 96 - 0
app/src/main/java/com/qy/agv/activity/adapter/HomeListViewAdapter.java

@@ -0,0 +1,96 @@
+package com.qy.agv.activity.adapter;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+import com.qy.agv.R;
+import com.qy.agv.activity.appEnum.StatusEnum;
+import com.qy.agv.activity.model.OrderTaskModel;
+import com.qy.agv.activity.model.TaskModel;
+
+import java.util.ArrayList;
+
+public class HomeListViewAdapter extends BaseAdapter {
+    private ArrayList<OrderTaskModel> mList;
+    private Context mContext;
+    private LayoutInflater mLayoutInflater;
+
+    public HomeListViewAdapter(ArrayList<OrderTaskModel> list, Context context) {
+        this.mList=list;
+        this.mContext=context;
+        this.mLayoutInflater=LayoutInflater.from(context);
+    }
+
+
+    @Override
+    public int getCount() {
+        return mList.size();
+    }
+
+    @Override
+    public Object getItem(int i) {
+        return mList.get(i);
+    }
+
+    @Override
+    public long getItemId(int i) {
+        return i;
+    }
+
+
+    @Override
+    public View getView(int position, View view, ViewGroup parent) {
+        MainHolder mainHolder = null;
+        final OrderTaskModel orderTaskModel = mList.get(position);
+        if (view == null) {
+            view=mLayoutInflater.inflate(R.layout.item_home_listview,null);
+            mainHolder = new MainHolder();
+            mainHolder.tv_task_code = view.findViewById(R.id.tv_task_code);
+            mainHolder.tv_task_name = view.findViewById(R.id.tv_task_name);
+            mainHolder.tv_start_point = view.findViewById(R.id.tv_start_point);
+            mainHolder.tv_end_point = view.findViewById(R.id.tv_end_point);
+            mainHolder.tv_create_time = view.findViewById(R.id.tv_create_time);
+            mainHolder.tv_status = view.findViewById(R.id.tv_status);
+            mainHolder.tv_remark = view.findViewById(R.id.tv_remark);
+            view.setTag(mainHolder);
+        }else{
+            mainHolder= (MainHolder) view.getTag();
+        }
+        mainHolder.tv_task_code.setText(orderTaskModel.getTaskCode());
+        mainHolder.tv_task_name.setText(orderTaskModel.getTaskName());
+        mainHolder.tv_start_point.setText(orderTaskModel.getFromAreaName());
+        mainHolder.tv_end_point.setText(orderTaskModel.getToAreaName());
+        mainHolder.tv_create_time.setText(orderTaskModel.getCreateTime());
+        StatusEnum status = StatusEnum.filter(orderTaskModel.getStatus());
+        mainHolder.tv_status.setText(status.getText());
+        if(orderTaskModel.getStatus() == 1){
+            mainHolder.tv_status.setTextColor(Color.BLUE);
+        }else if(orderTaskModel.getStatus() == 2){
+            mainHolder.tv_status.setTextColor(Color.parseColor("#ff00ff"));
+        }else if(orderTaskModel.getStatus() == 3){
+            mainHolder.tv_status.setTextColor(Color.GREEN);
+        }else if(orderTaskModel.getStatus() == 4){
+            mainHolder.tv_status.setTextColor(Color.RED);
+        }else{
+            mainHolder.tv_status.setTextColor(Color.DKGRAY);
+        }
+        mainHolder.tv_remark.setText(orderTaskModel.getRemark());
+        return view;
+    }
+
+    static class MainHolder {
+        public TextView tv_task_code;
+        public TextView tv_task_name;
+        public TextView tv_start_point;
+        public TextView tv_end_point;
+        public TextView tv_create_time;
+        public TextView tv_status;
+        public TextView tv_remark;
+    }
+
+}

+ 28 - 0
app/src/main/java/com/qy/agv/activity/appEnum/StatusEnum.java

@@ -0,0 +1,28 @@
+package com.qy.agv.activity.appEnum;
+
+import android.graphics.Color;
+
+import com.qy.agv.activity.adapter.HomeListViewAdapter;
+
+public enum StatusEnum {
+    STATUS_1(Color.BLUE, "就绪"),
+    STATUS_2(Color.GREEN, "执行中"),
+    STATUS_3(Color.YELLOW, "已完成"),
+    STATUS_4(Color.RED, "异常中"),
+    STATUS_5(Color.BLACK, "已取消");
+
+    private final Integer color;
+    private final String text;
+
+    public String getText() {
+        return text;
+    }
+
+    StatusEnum(Integer color, String text) {
+        this.color = color;
+        this.text = text;
+    }
+    public static StatusEnum filter(int code){
+        return StatusEnum.valueOf("STATUS_"+code);
+    }
+}

+ 159 - 0
app/src/main/java/com/qy/agv/activity/model/OrderTaskModel.java

@@ -0,0 +1,159 @@
+package com.qy.agv.activity.model;
+
+import java.util.Date;
+
+public class OrderTaskModel {
+    private String id;
+    private String taskName;
+    private String taskCode;
+    private String fromAreaId;
+    private String fromAreaName;
+    private String toAreaId;
+    private String toAreaName;
+    private Long runTime;
+    private Long requestId;
+    private String remark;
+    private Integer status;
+    private String startTime;
+    private String endTime;
+    private String createUser;
+    private String createTime;
+    private String updateUser;
+    private String updateTime;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getTaskName() {
+        return taskName;
+    }
+
+    public void setTaskName(String taskName) {
+        this.taskName = taskName;
+    }
+
+    public String getTaskCode() {
+        return taskCode;
+    }
+
+    public void setTaskCode(String taskCode) {
+        this.taskCode = taskCode;
+    }
+
+    public String getFromAreaId() {
+        return fromAreaId;
+    }
+
+    public void setFromAreaId(String fromAreaId) {
+        this.fromAreaId = fromAreaId;
+    }
+
+    public String getFromAreaName() {
+        return fromAreaName;
+    }
+
+    public void setFromAreaName(String fromAreaName) {
+        this.fromAreaName = fromAreaName;
+    }
+
+    public String getToAreaId() {
+        return toAreaId;
+    }
+
+    public void setToAreaId(String toAreaId) {
+        this.toAreaId = toAreaId;
+    }
+
+    public String getToAreaName() {
+        return toAreaName;
+    }
+
+    public void setToAreaName(String toAreaName) {
+        this.toAreaName = toAreaName;
+    }
+
+    public Long getRunTime() {
+        return runTime;
+    }
+
+    public void setRunTime(Long runTime) {
+        this.runTime = runTime;
+    }
+
+    public Long getRequestId() {
+        return requestId;
+    }
+
+    public void setRequestId(Long requestId) {
+        this.requestId = requestId;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getCreateUser() {
+        return createUser;
+    }
+
+    public void setCreateUser(String createUser) {
+        this.createUser = createUser;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getUpdateUser() {
+        return updateUser;
+    }
+
+    public void setUpdateUser(String updateUser) {
+        this.updateUser = updateUser;
+    }
+
+    public String getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(String updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+}

+ 6 - 2
app/src/main/java/com/qy/agv/util/Constant.java

@@ -32,8 +32,8 @@ public class Constant {
 
 //  修改 string.xml APP 名称 “宇光同行” 内网
     public static String PROJECT_NAME = "qyzl";
-    public static String server_ip = "192.168.110.225:85";
-    public static String HTTP_URL = "http://"+server_ip+"/api";
+    public static String server_ip = "192.168.110.105:8081";
+    public static String HTTP_URL = "http://"+server_ip;
     public static String UPDATE_URL = "http://"+server_ip+"/app";
 
     public static String ACCESS_TOKEN = "";
@@ -58,6 +58,10 @@ public class Constant {
     public final static String SITE_DETAIL = "blade-site/site/detailByLocationId";
     public final static String RELOC_LIST = "blade-relocCoordinate/relocCoordinate/list";
 
+    public final static String ORDER_TASK_LIST = "blade-orderTask/orderTask/list2";
+    public final static String ORDER_TASK_DETAIL = "blade-orderTask/orderTask/detail";
+    public final static String PUSH_ORDER_TASK= "blade-orderTask/orderTask/send";
+
     public final static String RECEIVER_MSG = "com.qy.msg.RECEIVER";
 
     public static int REQUEST_CODE_MLKIT_SCAN_ONE = 204;

+ 47 - 0
app/src/main/res/layout/activity_home.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".activity.MainActivity">
+    <include layout="@layout/common_top" />
+    <com.qy.agv.ui.swipeView.SwipeRefreshView
+        android:id="@+id/swipe_container"
+        android:layout_width="match_parent"
+        android:layout_marginTop="48dp"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent">
+        <ListView android:id="@+id/lv_comment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:divider="#00000000"
+            android:dividerHeight="1dip"
+            android:background="@color/gray"
+            android:listSelector="@color/blue" />
+    </com.qy.agv.ui.swipeView.SwipeRefreshView>
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        android:id="@+id/show_msg"
+        android:layout_marginTop="48dp"
+        android:gravity="center"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:background="@color/cornsilk"
+        android:visibility="gone"
+        />
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:id="@+id/tv_empty"
+        android:visibility="gone"
+        android:hint="没有任务"
+        android:textSize="25dp"
+        android:gravity="center"
+        />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 126 - 0
app/src/main/res/layout/item_home_listview.xml

@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:gravity="top"
+    android:background="@color/white"
+    android:padding="3dp">
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:paddingLeft="3dp"
+        android:paddingRight="3dp"
+        android:id="@+id/ll_task_listview"
+        >
+        <LinearLayout
+            android:orientation="horizontal"
+            android:padding="2dp"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+            <TextView
+                android:layout_width="80dp"
+                android:layout_height="match_parent"
+                android:text="任务编号:"/>
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:id="@+id/tv_task_code"
+                android:text=""/>
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:text="状态:"/>
+            <TextView
+                android:layout_width="70dp"
+                android:layout_height="match_parent"
+                android:id="@+id/tv_status"
+                android:gravity="end"
+                android:paddingEnd="5dp"
+                android:textColor="@color/blue"
+                android:text=""/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:orientation="horizontal"
+            android:padding="2dp"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+            <TextView
+                android:layout_width="80dp"
+                android:layout_height="match_parent"
+                android:text="任务名称:"/>
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:id="@+id/tv_task_name"
+                android:text=""/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:orientation="horizontal"
+            android:padding="2dp"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+            <TextView
+                android:layout_width="80dp"
+                android:layout_height="match_parent"
+                android:text="起点:"/>
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:id="@+id/tv_start_point"
+                android:text=""/>
+            <TextView
+                android:layout_width="80dp"
+                android:layout_height="match_parent"
+                android:text="终点:"/>
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:id="@+id/tv_end_point"
+                android:layout_weight="1"
+                android:paddingEnd="5dp"
+                android:text=""/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:orientation="horizontal"
+            android:padding="2dp"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+            <TextView
+                android:layout_width="80dp"
+                android:layout_height="match_parent"
+                android:text="创建时间:"/>
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:id="@+id/tv_create_time"
+                android:text=""/>
+        </LinearLayout>
+        <LinearLayout
+            android:orientation="horizontal"
+            android:padding="2dp"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+            <TextView
+                android:id="@+id/bioli_time"
+                android:layout_width="80dp"
+                android:layout_height="match_parent"
+                android:text="描述:"/>
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:id="@+id/tv_remark"
+                android:text=""/>
+        </LinearLayout>
+
+    </LinearLayout>
+
+
+</LinearLayout>

+ 72 - 0
app/src/main/res/layout/pw_order_task.xml

@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:background="@color/white"
+    android:padding="5dp">
+    <LinearLayout
+        android:id="@+id/ll_title"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+        <TextView
+            android:id="@+id/tv_msg"
+            android:layout_width="wrap_content"
+            android:padding="5dp"
+            android:layout_height="wrap_content"
+            android:gravity="end"
+            android:layout_weight="1"
+            android:textSize="25sp"
+            android:text="请把" />
+        <TextView
+            android:id="@+id/tv_task_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:textSize="25sp"
+            android:textColor="@color/blue"
+            android:text="" />
+        <TextView
+            android:layout_width="wrap_content"
+            android:padding="5dp"
+            android:layout_height="wrap_content"
+            android:gravity="start"
+            android:layout_weight="1"
+            android:textSize="25sp"
+            android:text="放到库位" />
+    </LinearLayout>
+    <LinearLayout
+        android:id="@+id/ll_data"
+        app:layout_constraintTop_toBottomOf="@id/ll_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+        <TextView
+            android:id="@+id/tv_start_point"
+            android:layout_width="wrap_content"
+            android:padding="5dp"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:layout_weight="1"
+            android:textSize="35sp"
+            android:textColor="@color/red"
+            android:text="" />
+    </LinearLayout>
+    <LinearLayout
+        android:id="@+id/ll_footer"
+        app:layout_constraintTop_toBottomOf="@id/ll_data"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+        <TextView
+            android:layout_width="wrap_content"
+            android:padding="5dp"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:layout_weight="1"
+            android:textSize="25sp"
+            android:text="再扫库位码确认" />
+    </LinearLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 270 - 0
app/src/main/res/layout/yg_order_task_info.xml

@@ -0,0 +1,270 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical" android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <include layout="@layout/common_top"></include>
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:id="@+id/scrollView">
+        <LinearLayout
+            android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+            <LinearLayout
+                android:orientation="vertical"
+                android:paddingTop="10dp"
+                android:layout_width="match_parent"
+                android:background="@drawable/white"
+                android:layout_height="wrap_content">
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="30dp"
+                    android:id="@+id/ll_robot_id"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="100dp"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center_vertical"
+                        android:gravity="left"
+                        android:paddingLeft="10dp"
+                        android:text="任号编号:"/>
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/tv_task_code"
+                        android:layout_weight="1"
+                        android:text=""/>
+                </LinearLayout>
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_marginLeft="10dp"
+                    android:background="@color/dc_line"
+                    />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="100dp"
+                        android:layout_height="wrap_content"
+                        android:gravity="left"
+                        android:paddingLeft="10dp"
+                        android:text="任务名称:"/>
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/tv_task_name"
+                        android:layout_weight="1"
+                        android:text=""/>
+                </LinearLayout>
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_marginLeft="10dp"
+                    android:background="@color/dc_line"
+                    />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="100dp"
+                        android:layout_height="wrap_content"
+                        android:gravity="left"
+                        android:paddingLeft="10dp"
+                        android:text="起点:"/>
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/tv_start_point"
+                        android:layout_weight="1"
+                        android:text=""/>
+                </LinearLayout>
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_marginLeft="10dp"
+                    android:background="@color/dc_line"
+                    />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="100dp"
+                        android:layout_height="wrap_content"
+                        android:gravity="left"
+                        android:paddingLeft="10dp"
+                        android:text="终点:"/>
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/tv_end_point"
+                        android:layout_weight="1"
+                        android:text=""/>
+                </LinearLayout>
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_marginLeft="10dp"
+                    android:background="@color/dc_line"
+                    />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="100dp"
+                        android:layout_height="wrap_content"
+                        android:gravity="left"
+                        android:paddingLeft="10dp"
+                        android:text="开始时间:"/>
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/tv_start_time"
+                        android:layout_weight="1"
+                        android:text=""/>
+                </LinearLayout>
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_marginLeft="10dp"
+                    android:background="@color/dc_line"
+                    />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="100dp"
+                        android:layout_height="wrap_content"
+                        android:gravity="left"
+                        android:paddingLeft="10dp"
+                        android:text="结束时间:"/>
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/tv_end_time"
+                        android:layout_weight="1"
+                        android:text=""/>
+                </LinearLayout>
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_marginLeft="10dp"
+                    android:background="@color/dc_line"
+                    />
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="100dp"
+                        android:layout_height="wrap_content"
+                        android:gravity="left"
+                        android:paddingLeft="10dp"
+                        android:text="时长:"/>
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/tv_run_time"
+                        android:layout_weight="1"
+                        android:text=""/>
+                </LinearLayout>
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_marginLeft="10dp"
+                    android:background="@color/dc_line"
+                    />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="100dp"
+                        android:layout_height="wrap_content"
+                        android:gravity="left"
+                        android:paddingLeft="10dp"
+                        android:text="状态:"/>
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/tv_status"
+                        android:layout_weight="1"
+                        android:text=""/>
+                </LinearLayout>
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_marginLeft="10dp"
+                    android:background="@color/dc_line"
+                    />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="100dp"
+                        android:layout_height="wrap_content"
+                        android:gravity="left"
+                        android:paddingLeft="10dp"
+                        android:text="创建时间:"/>
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/tv_create_time"
+                        android:layout_weight="1"
+                        android:text=""/>
+                </LinearLayout>
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_marginLeft="10dp"
+                    android:background="@color/dc_line"
+                    />
+
+                <Button
+                    android:id="@+id/btn_ok"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="30dp"
+                    android:layout_marginStart="30dp"
+                    android:layout_marginTop="30dp"
+                    android:textColor="@color/white"
+                    android:background="@drawable/btn_shape"
+                    android:text="提交" />
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+    </ScrollView>
+</LinearLayout>