Browse Source

修改自动外勤和自动打卡

RaoMeng 9 years ago
parent
commit
bd295deea6
22 changed files with 518 additions and 117 deletions
  1. 163 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/BaiDuLocationHelper.java
  2. 6 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/BdLocationHelper.java
  3. 11 5
      WeiChat/src/main/java/com/xzjmyk/pm/activity/MyApplication.java
  4. 136 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/bean/LocationEntity.java
  5. 10 3
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/circle/BasicInfoActivity.java
  6. 1 2
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/MissionActivity.java
  7. 4 36
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/TestActivity.java
  8. 11 5
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/adapter/MissionAdapter.java
  9. 22 10
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/model/MissionModel.java
  10. 64 39
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/MissionPresenter.java
  11. 1 3
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/WorkPresenter.java
  12. 2 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/attendance/AutoErpService.java
  13. 8 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/attendance/AutoErpSigninUitl.java
  14. 0 3
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/view/SwitchView.java
  15. 1 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/message/ChatActivity.java
  16. 1 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/message/MessageFragment.java
  17. 1 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/tool/ThreadPool.java
  18. 1 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/tool/ThreadUtil.java
  19. 0 1
      WeiChat/src/main/res/layout/activity_basic_info.xml
  20. 3 1
      WeiChat/src/main/res/layout/chat_from_item_text.xml
  21. 0 1
      WeiChat/src/main/res/layout/fragment_me.xml
  22. 72 4
      WeiChat/src/main/res/layout/item_mission.xml

+ 163 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/BaiDuLocationHelper.java

@@ -0,0 +1,163 @@
+package com.xzjmyk.pm.activity;
+
+import android.content.Intent;
+import android.util.Log;
+
+import com.baidu.location.BDLocation;
+import com.baidu.location.BDLocationListener;
+import com.baidu.location.LocationClient;
+import com.baidu.location.LocationClientOption;
+import com.xzjmyk.pm.activity.bean.LocationEntity;
+import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
+import com.xzjmyk.pm.activity.ui.tool.ThreadUtil;
+
+/**
+ * Created by Bitliker on 2016/12/23.
+ */
+
+public class BaiDuLocationHelper {
+    public static final String UPLOCATION_ACTION = "UPLOCATION_ACTION";//更新位置时候广播数据
+
+    private final Intent broadcast;//更新后广播
+
+    private LocationClient mLocationClient = null;
+    private LocationEntity locationEntity;//位置对象
+
+
+    public BaiDuLocationHelper() {
+        broadcast = new Intent();
+        broadcast.setAction(UPLOCATION_ACTION);
+        locationEntity = new LocationEntity();
+        initLocation();
+    }
+
+    private void initLocation() {
+        mLocationClient = new LocationClient(MyApplication.getInstance(), getOption());
+        mLocationClient.registerLocationListener(mListener);
+        mLocationClient.start();
+    }
+
+    public void unLocation() {
+        if (mLocationClient.isStarted()) mLocationClient.stop();
+        mLocationClient.unRegisterLocationListener(mListener);
+    }
+
+
+    private LocationClientOption getOption() {
+        LocationClientOption option = new LocationClientOption();
+        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
+        option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
+        option.setScanSpan(0);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
+        option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
+        option.setOpenGps(true);//可选,默认false,设置是否使用gps
+        option.setLocationNotify(false);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
+        option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
+        option.setIsNeedLocationPoiList(false);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
+        option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
+        option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
+        option.setEnableSimulateGps(true);//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
+        option.setNeedDeviceDirect(false);
+        return option;
+    }
+
+    public void requestLocation() {
+        mLocationClient.requestNotifyLocation();
+    }
+
+    private boolean runingLocation = false;
+    private long scanSpan = 0;
+
+    /**
+     * 重新启动定位
+     *
+     * @param time 循环间隔时间
+     */
+    public void requestLocation(long time) {
+        scanSpan = time;
+        if (runingLocation) {
+            return;
+        }
+        ThreadUtil.getInstance().addTask(new Runnable() {
+            @Override
+            public void run() {
+                do {
+                    mLocationClient.requestNotifyLocation();
+                    try {
+                        Thread.sleep(scanSpan);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                } while (runingLocation);
+            }
+        });
+        mLocationClient.requestNotifyLocation();
+    }
+
+    /**
+     * 更新地址位置后回调
+     **/
+    private BDLocationListener mListener = new BDLocationListener() {
+        @Override
+        public void onReceiveLocation(BDLocation location) {
+            try {
+                if (location == null)
+                    locationEntity = new LocationEntity();
+                if (location.getLocType() == BDLocation.TypeGpsLocation// GPS定位结果
+                        || location.getLocType() == BDLocation.TypeNetWorkLocation//网络定位
+                        || location.getLocType() == BDLocation.TypeOffLineLocation//离线定位(未验证离线定位的有效性)
+                        ) {
+                    //定位成功
+                    log("定位成功");
+                    log("getLatitude()" + location.getLatitude());
+                    log("getLongitude" + location.getLongitude());
+                    log("getAddrStr" + location.getAddrStr());
+                    log("getLocationDescribe" + location.getLocationDescribe());
+                    log("getProvince" + location.getProvince());
+                    log("getCity" + location.getCity());
+                    log("getDistrict" + location.getDistrict());
+                    locationEntity.setLocationOk(true);
+                    locationEntity.setLatitude(location.getLatitude());
+                    locationEntity.setLongitude(location.getLongitude());
+                    locationEntity.setAddress(location.getAddrStr());
+                    locationEntity.setLocation(location.getLocationDescribe());
+                    locationEntity.setProvince(location.getProvince());
+                    locationEntity.setCityName(location.getCity());
+                    locationEntity.setDistrict(location.getDistrict());
+                } else {
+                    //统一未定位失败
+                    locationEntity.setLocationOk(false);
+                    log("定位失败");
+                    if (location.getLocType() == BDLocation.TypeServerError) {
+                        //服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因
+                        locationEntity.setErrorMessage("服务端网络定位失败");
+                        log("服务端网络定位失败");
+                    } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
+                        //网络不同导致定位失败,请检查网络是否通畅
+                        locationEntity.setErrorMessage("网络不同导致定位失败,请检查网络是否通畅");
+                        log("网络不同导致定位失败,请检查网络是否通畅");
+                    } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
+                        //无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机
+                        locationEntity.setErrorMessage("无法获取有效定位依据导致定位失败");
+                        log("无法获取有效定位依据导致定位失败");
+                    } else {
+                        locationEntity.setErrorMessage("未知错误");
+                        log("未知错误");
+                    }
+                }
+                //TODO 发送广播
+                MyApplication.getInstance().sendBroadcast(broadcast);
+            } catch (Exception e) {
+            }
+        }
+    };
+
+    private void log(String message) {
+        try {
+            if (!AppConfig.DEBUG && StringUtils.isEmpty(message)) return;
+            Log.i("gongpengming", message);
+        } catch (Exception e) {
+
+        }
+    }
+
+}

+ 6 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/BdLocationHelper.java

@@ -14,6 +14,7 @@ import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
 import java.util.List;
 
 public class BdLocationHelper {
+
     private Context mContext;
     private double mLongitude;
     private double mLatitude;
@@ -31,6 +32,11 @@ public class BdLocationHelper {
 
     BdLocationHelper(Context context) {
         mContext = context;
+        initLocation(context);
+    }
+
+    private void initLocation(Context context) {
+
         // 获取上一次的定位数据
 //        mLongitude = LocationSp.getInstance(context).getLongitude(0);
 //        mLatitude = LocationSp.getInstance(context).getLatitude(0);

+ 11 - 5
WeiChat/src/main/java/com/xzjmyk/pm/activity/MyApplication.java

@@ -101,7 +101,7 @@ public class MyApplication extends Application {
 
         SharedUtil.init(this);
         initShareAPI();
-     //  CrashReport.initCrashReport(getApplicationContext(), "900050585", false);
+        //  CrashReport.initCrashReport(getApplicationContext(), "900050585", false);
         PreferenceUtils.putBoolean(this, Constants.IS_NOTIFICATION, false);//不进行通知
         new Handler().postDelayed(new Runnable() {
             @Override
@@ -112,8 +112,10 @@ public class MyApplication extends Application {
                 SDKInitializer.initialize(getApplicationContext());
                 // 初始化数据库
                 SQLiteHelper.copyDatabaseFile(getApplicationContext());
+                //TODO
                 // 初始化定位
                 getBdLocationHelper();
+
                 // 初始化App目录
                 initAppDir();
                 // 初始化图片加载
@@ -183,12 +185,16 @@ public class MyApplication extends Application {
      ************************/
     private BdLocationHelper mBdLocationHelper;
 
+
     public BdLocationHelper getBdLocationHelper() {
-        if (mBdLocationHelper == null) {
-            mBdLocationHelper = new BdLocationHelper(this);
+
+        {//TODO 原定位
+            if (mBdLocationHelper == null) {
+                mBdLocationHelper = new BdLocationHelper(this);
+            }
+            mBdLocationHelper.requestLocation();
+            return mBdLocationHelper;
         }
-        mBdLocationHelper.requestLocation();
-        return mBdLocationHelper;
     }
 
     /*********************

+ 136 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/bean/LocationEntity.java

@@ -0,0 +1,136 @@
+package com.xzjmyk.pm.activity.bean;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Created by Bitliker on 2016/12/23.
+ */
+
+public class LocationEntity implements Parcelable{
+    private boolean locationOk;//是否定位成功
+    private double longitude;//经度
+    private double latitude;//纬度
+    private String location;//位置信息
+    private String address;//详细地址
+    private String province;// 省份
+    private String cityName;// 城市
+    private String district;// 街道
+    private String errorMessage;//定位错误信息
+
+    public LocationEntity(){}
+
+    protected LocationEntity(Parcel in) {
+        locationOk = in.readByte() != 0;
+        longitude = in.readDouble();
+        latitude = in.readDouble();
+        location = in.readString();
+        address = in.readString();
+        province = in.readString();
+        cityName = in.readString();
+        district = in.readString();
+        errorMessage = in.readString();
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeByte((byte) (locationOk ? 1 : 0));
+        dest.writeDouble(longitude);
+        dest.writeDouble(latitude);
+        dest.writeString(location);
+        dest.writeString(address);
+        dest.writeString(province);
+        dest.writeString(cityName);
+        dest.writeString(district);
+        dest.writeString(errorMessage);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Creator<LocationEntity> CREATOR = new Creator<LocationEntity>() {
+        @Override
+        public LocationEntity createFromParcel(Parcel in) {
+            return new LocationEntity(in);
+        }
+
+        @Override
+        public LocationEntity[] newArray(int size) {
+            return new LocationEntity[size];
+        }
+    };
+
+    public boolean isLocationOk() {
+        return locationOk;
+    }
+
+    public void setLocationOk(boolean locationOk) {
+        this.locationOk = locationOk;
+    }
+
+    public double getLongitude() {
+        return longitude;
+    }
+
+    public void setLongitude(double longitude) {
+        this.longitude = longitude;
+    }
+
+    public double getLatitude() {
+        return latitude;
+    }
+
+    public void setLatitude(double latitude) {
+        this.latitude = latitude;
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    public void setLocation(String location) {
+        this.location = location;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCityName() {
+        return cityName;
+    }
+
+    public void setCityName(String cityName) {
+        this.cityName = cityName;
+    }
+
+    public String getDistrict() {
+        return district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+}

+ 10 - 3
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/circle/BasicInfoActivity.java

@@ -275,6 +275,7 @@ public class BasicInfoActivity extends BaseActivity implements NewFriendListener
         }
 
     }
+
     @Override
     public void onBackPressed() {
         Intent intent = new Intent();
@@ -727,7 +728,8 @@ public class BasicInfoActivity extends BaseActivity implements NewFriendListener
                 if (success) {
                     friend.setRemarkName(remarkName);
                     // 更新到数据库
-                    FriendDao.getInstance().setRemarkName(MyApplication.getInstance().mLoginUser.getUserId(),
+                    FriendDao.getInstance().setRemarkName(
+                            MyApplication.getInstance().mLoginUser.getUserId(),
                             friend.getUserId(), remarkName);
 
                     // 更新界面显示
@@ -742,9 +744,10 @@ public class BasicInfoActivity extends BaseActivity implements NewFriendListener
                     updateAllCardcastUi();
                     // 改了昵称,通知消息界面更新
                     MsgBroadcast.broadcastMsgUiUpdate(mContext);
+                    name_tv.setText(remarkName);
                 }
                 ProgressDialogUtil.dismiss(mProgressDialog);
-                updateUI();
+//                updateUI();
             }
         }, Void.class, params);
         addDefaultRequest(request);
@@ -1002,7 +1005,11 @@ public class BasicInfoActivity extends BaseActivity implements NewFriendListener
             MsgBroadcast.broadcastMsgUiUpdate(BasicInfoActivity.this);
             MsgBroadcast.broadcastMsgNumReset(BasicInfoActivity.this);
             Intent intent = new Intent(mContext, ChatActivity.class);
-            mFriend.setRemarkName(userName);
+            //TODO
+            String name = name_tv.getText().toString();
+            if (StringUtils.isEmpty(name))
+                name = userName;
+            mFriend.setRemarkName(name);
             intent.putExtra(ChatActivity.FRIEND, mFriend);
             startActivity(intent);
         }

+ 1 - 2
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/MissionActivity.java

@@ -218,10 +218,9 @@ public class MissionActivity extends BaseActivity implements View.OnClickListene
                     if (!StringUtils.isEmpty(m.getCompanyName()) || !StringUtils.isEmpty(m.getCompanyAddr()) ||
                             !StringUtils.isEmpty(m.getVisitTime())) {
                         AlertDialog.Builder builder = new AlertDialog.Builder(ct);
-                        builder.setTitle(R.string.prompt_title).setMessage("是否确认删除单号" + (position + 1)).setPositiveButton("确定", new DialogInterface.OnClickListener() {
+                        builder.setTitle(R.string.prompt_title).setMessage("你确定删除该外勤计划吗").setPositiveButton("确定", new DialogInterface.OnClickListener() {
                             @Override
                             public void onClick(DialogInterface dialogInterface, int i) {
-                                Log.i("gongpengming", "position2=" + position);
                                 adapter.getModels().remove(position);
                                 adapter.notifyItemRemoved(position);
                                 adapter.notifyItemRangeChanged(position, adapter.getModels().size());

+ 4 - 36
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/TestActivity.java

@@ -6,7 +6,6 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
-import android.widget.EditText;
 import android.widget.ListView;
 import android.widget.TextView;
 
@@ -15,11 +14,9 @@ import com.lidroid.xutils.view.annotation.ViewInject;
 import com.xzjmyk.pm.activity.AppConfig;
 import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.db.dao.MissionDao;
-import com.xzjmyk.pm.activity.db.dao.WorkModelDao;
 import com.xzjmyk.pm.activity.ui.base.BaseActivity;
 import com.xzjmyk.pm.activity.ui.erp.entity.ErrorEntity;
 import com.xzjmyk.pm.activity.ui.erp.model.MissionModel;
-import com.xzjmyk.pm.activity.ui.erp.model.WorkModel;
 import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
 import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
 
@@ -30,11 +27,6 @@ public class TestActivity extends BaseActivity implements View.OnClickListener {
     @ViewInject(R.id.listView)
     private ListView listView;
 
-    @ViewInject(R.id.edt1)
-    private EditText edt1;
-    @ViewInject(R.id.edt2)
-    private EditText edt2;
-
     private List<ErrorEntity> beans;
     private ErrorAdaptr adaptr;
 
@@ -58,39 +50,15 @@ public class TestActivity extends BaseActivity implements View.OnClickListener {
     public void onClick(View view) {
         switch (view.getId()) {
             case R.id.error_list:
-                List<WorkModel> beens = WorkModelDao.getInstance().query(false);
-                if (ListUtils.isEmpty(beens)) {
-                    show("models  为空");
-                } else {
-                    for (WorkModel m : beens) {
-                        show("getWorkTime" + m.getWorkTime());
-                        show("getOffTime" + m.getOffTime());
-                        show("getWorkStart" + m.getWorkStart());
-                        show("getWorkSignin" + m.getWorkSignin());
-                        show("getOffSignin" + m.getOffSignin());
-                        show("getOffend" + m.getOffend());
-                        show("getOffStart" + m.getOffStart());
-                        show("__________________________________");
-                    }
-                }
-                break;
-            case R.id.test_btn:
                 List<MissionModel> models = MissionDao.getInstance().queryByEnCode();
-                if (ListUtils.isEmpty(models)) {
-                    show("models  为空");
-                } else {
+                if (!ListUtils.isEmpty(models)) {
                     for (MissionModel m : models) {
-                        show("getCompanyName" + m.getCompanyName());
-                        show("getCompanyAddr" + m.getCompanyAddr());
-                        show("getStatus" + m.getStatus());
-                        show("getLocation" + m.getLocation());
-                        show("getDistance" + m.getDistance());
-                        show("getRecorddate" + m.getRecorddate());
-                        show("getVisitTime" + m.getVisitTime());
-                        show("__________________________________");
+                        Log.i("gongpengming", "getCompanyName" + m.getCompanyName());
                     }
                 }
                 break;
+            case R.id.test_btn:
+                break;
         }
     }
 

+ 11 - 5
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/adapter/MissionAdapter.java

@@ -4,6 +4,7 @@ import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.EditText;
 import android.widget.TextView;
 
 import com.xzjmyk.pm.activity.R;
@@ -60,11 +61,11 @@ public class MissionAdapter extends RecyclerView.Adapter<MissionAdapter.BaseView
         holder.item_title_tv.setText("目的地 " + (position + 1));
         holder.item_delete_tv.setVisibility((entity.getStatus() != 1 && position != 0) ? View.VISIBLE : View.GONE);
         //TODO 测试修改
-//        holder.item_length_tv.setText(entity.getDistance() + "米");
+        holder.item_length_tv.setText(entity.getDistance() + "米");
         if (entity.getLatLng() != null) {
-            holder.item_length_tv.setText(BaiduMapUtil.getInstence().getDistance(entity.getLatLng()) + "米");
+            holder.item_long_tv.setText(BaiduMapUtil.getInstence().getDistance(entity.getLatLng()) + "米");
         } else {
-            holder.item_length_tv.setText("");
+            holder.item_long_tv.setText("");
         }
         holder.item_reckontime_tv.setText(getStringNotNull(entity.getVisitTime()));
         holder.item_realtime_tv.setText(getStringNotNull(entity.getRealTime()));
@@ -73,6 +74,7 @@ public class MissionAdapter extends RecyclerView.Adapter<MissionAdapter.BaseView
         holder.item_companyaddr_tv.setText(getStringNotNull(entity.getCompanyAddr()));
         holder.item_time_tv.setText(getStringNotNull(entity.getRecorddate()));
         holder.item_location_tv.setText(getStringNotNull(entity.getLocation()));
+        holder.item_remark_tv.setText(getStringNotNull(entity.getRemark()));
     }
 
     private void initEvent(final BaseViewHolder holder, final int position) {
@@ -127,8 +129,10 @@ public class MissionAdapter extends RecyclerView.Adapter<MissionAdapter.BaseView
                 item_companyaddr_tv,//公司地址
                 item_location_tv,//创建地点
                 item_time_tv,//创建时间
-                item_company_tv;//公司名称
-
+        //UPDATE by 2016/12/26
+        item_long_tv,
+        item_company_tv;//公司名称
+        EditText item_remark_tv;
         public BaseViewHolder(View itemView) {
             super(itemView);
             item_title_tv = (TextView) itemView.findViewById(R.id.item_title_tv);//标题
@@ -141,6 +145,8 @@ public class MissionAdapter extends RecyclerView.Adapter<MissionAdapter.BaseView
             item_companyaddr_tv = (TextView) itemView.findViewById(R.id.item_companyaddr_tv);
             item_location_tv = (TextView) itemView.findViewById(R.id.item_location_tv);
             item_time_tv = (TextView) itemView.findViewById(R.id.item_time_tv);
+            item_long_tv = (TextView) itemView.findViewById(R.id.item_long_tv);
+            item_remark_tv = (EditText) itemView.findViewById(R.id.item_remark_tv);
         }
     }
 

+ 22 - 10
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/model/MissionModel.java

@@ -19,6 +19,7 @@ public class MissionModel implements Parcelable {
     private String realLeave;//实际离开时间  yyyy-MM-dd HH:mm:ss
     private LatLng latLng;//选择地址的经纬度
     private int visitcount;//拜访次数
+    private String remark;//备注
     private int status;//状态  1.已提交  0.未提交  (数据库中 0.未进行  1.进行中  2.已完成  3.签退后再回来签到  )
 
     //update by 2016/12/19
@@ -30,6 +31,7 @@ public class MissionModel implements Parcelable {
     public MissionModel() {
     }
 
+
     protected MissionModel(Parcel in) {
         id = in.readInt();
         code = in.readString();
@@ -41,10 +43,11 @@ public class MissionModel implements Parcelable {
         realLeave = in.readString();
         latLng = in.readParcelable(LatLng.class.getClassLoader());
         visitcount = in.readInt();
+        remark = in.readString();
+        status = in.readInt();
         distance = in.readDouble();
         location = in.readString();
         recorddate = in.readString();
-        status = in.readInt();
     }
 
     @Override
@@ -59,10 +62,11 @@ public class MissionModel implements Parcelable {
         dest.writeString(realLeave);
         dest.writeParcelable(latLng, flags);
         dest.writeInt(visitcount);
+        dest.writeString(remark);
+        dest.writeInt(status);
         dest.writeDouble(distance);
         dest.writeString(location);
         dest.writeString(recorddate);
-        dest.writeInt(status);
     }
 
     @Override
@@ -162,6 +166,22 @@ public class MissionModel implements Parcelable {
         this.visitcount = visitcount;
     }
 
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
     public double getDistance() {
         return distance;
     }
@@ -185,12 +205,4 @@ public class MissionModel implements Parcelable {
     public void setRecorddate(String recorddate) {
         this.recorddate = recorddate;
     }
-
-    public int getStatus() {
-        return status;
-    }
-
-    public void setStatus(int status) {
-        this.status = status;
-    }
 }

+ 64 - 39
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/MissionPresenter.java

@@ -15,7 +15,6 @@ import com.xzjmyk.pm.activity.db.dao.MissionDao;
 import com.xzjmyk.pm.activity.ui.erp.model.MissionModel;
 import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IMission;
 import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IMissionPresenter;
-import com.xzjmyk.pm.activity.ui.erp.util.CommonInterfaceUtil;
 import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
 import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
 import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
@@ -30,12 +29,16 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import static com.xzjmyk.pm.activity.R.id.position;
+
 
 /**
  * Created by Bitliker on 2016/12/19.
  */
 
 public class MissionPresenter implements IMissionPresenter, HttpHandler.OnResultListener {
+    private final int CODE_WHAT = 0x15;
+    private final int ID_WHAT = 0x14;
     private final int LOAD_PLAN = 0x11;
     private final int SAVE_PLAN = 0x12;
     private final int SAVE_ADDRESS = 0x13;
@@ -84,12 +87,11 @@ public class MissionPresenter implements IMissionPresenter, HttpHandler.OnResult
             if (iMission != null) iMission.showToast(R.string.networks_out, R.color.load_warning);
             return;
         }
-        CommonInterfaceUtil idUtil = new CommonInterfaceUtil();
         if (ListUtils.isEmpty(models)) return;
         for (int i = 0; i < models.size(); i++) {
             MissionModel e = models.get(i);
             if (canSubmit(e, i + 1)) {
-                savePlan2Net(e, i, idUtil);
+                savePlan2Net(e, i);
             }
         }
     }
@@ -99,39 +101,37 @@ public class MissionPresenter implements IMissionPresenter, HttpHandler.OnResult
      *
      * @param mode    对象
      * @param postion 指针
-     * @param idUtil  id、code获取工具类
      */
-    private void savePlan2Net(final MissionModel mode, final int postion, final CommonInterfaceUtil idUtil) {
+    private void savePlan2Net(MissionModel mode, int postion) {
         isSubmiting = true;
-        idUtil.getIdByNet("MOBILE_OUTPLAN_SEQ", new CommonInterfaceUtil.OnResultListener() {
-            @Override
-            public void result(int code, String result) {
-                try {
-                    if (StringUtils.isEmpty(result)) {
-                        if (iMission != null) iMission.showToast("获取id错误", R.color.load_warning);
-                        return;
-                    }
-                    final int id = Integer.valueOf(result);
-                    idUtil.getCodeByNet("MOBILE_OUTPLAN", new CommonInterfaceUtil.OnResultListener() {
-                        @Override
-                        public void result(int code, String result) {
-                            if (StringUtils.isEmpty(result)) {
-                                iMission.showToast("获取编号错误", R.color.load_warning);
-                                return;
-                            }
-                            savePlan2Net(id, result, mode, postion);
-                        }
-                    });
-                } catch (Exception e) {
+        loadId(mode, postion);
+    }
 
-                }
-            }
-        });
+    private void loadId(MissionModel entity, int position) {
+        isSubmiting = true;
+        Map<String, Object> param = new HashMap<>();
+        param.put("seq", "MOBILE_OUTPLAN_SEQ");
+        Bundle bundle = new Bundle();
+        bundle.putParcelable("data", entity);
+        bundle.putInt("position", position);
+        HttpHandler.getInstance().loadERPByNet(ID_WHAT, "common/getId.action", param, bundle, this);
     }
 
+    private void loadCode(Bundle bundle) {
+        Map<String, Object> param = new HashMap<>();
+        param.put("caller", "MOBILE_OUTPLAN");
+        param.put("type", 2);
+        HttpHandler.getInstance().loadERPByNet(CODE_WHAT, "common/getCodeString.action",
+                param, bundle, this);
+    }
 
     //保存外勤计划接口
-    private void savePlan2Net(int id, String code, MissionModel entity, int position) {
+    private void savePlan2Net(Bundle bundle) {
+        if (bundle == null) return;
+        int id = bundle.getInt("id");
+        String code = bundle.getString("code");
+        MissionModel entity = bundle.getParcelable("data");
+        if (id == 0 || StringUtils.isEmpty(code) || entity == null) return;
         isSubmiting = true;
         //获取网络数据
         if (iMission != null) iMission.showLoading();
@@ -153,6 +153,7 @@ public class MissionPresenter implements IMissionPresenter, HttpHandler.OnResult
         /***params***/
         params.put("mpd_detno", position + 1);
         params.put("mpd_id", "");
+        params.put("mpd_remark", entity.getRemark());
         params.put("mpd_distance", BaiduMapUtil.getInstence().getDistance(entity.getLatLng()));
         params.put("mpd_arrivedate", entity.getVisitTime());
         params.put("mpd_mpid", id);
@@ -166,9 +167,6 @@ public class MissionPresenter implements IMissionPresenter, HttpHandler.OnResult
 
         param.put("formStore", StringUtils.mapToJson(formStore));
         param.put("param", "[" + StringUtils.mapToJson(params) + "]");
-        Bundle bundle = new Bundle();
-        bundle.putInt("position", position);
-        bundle.putParcelable("data", entity);
         HttpHandler.getInstance().loadERPByNet(SAVE_PLAN, "mobile/addOutPlan.action", param, bundle, this);
         saveOutAddress(entity);
     }
@@ -225,6 +223,7 @@ public class MissionPresenter implements IMissionPresenter, HttpHandler.OnResult
         //没有网络情况下获取缓存的数据
         List<MissionModel> models = MissionDao.getInstance().queryByEnCode();
         if (!ListUtils.isEmpty(models)) {
+            this.models = models;
             if (iMission != null) {
                 iMission.dimssLoading();
                 iMission.showModels(models);
@@ -287,6 +286,22 @@ public class MissionPresenter implements IMissionPresenter, HttpHandler.OnResult
                             iMission.changModelStatus(1, position);
                         }
                         break;
+                    case ID_WHAT:
+                        if (isJSON && JSON.parseObject(message).containsKey("success") && JSON.parseObject(message).getBoolean("success")) {
+                            int id = JSON.parseObject(message).getInteger("id");
+                            if (id != 0 && bundle != null) {
+                                bundle.putInt("id", id);
+                                loadCode(bundle);
+                            }
+                        }
+                        break;
+                    case CODE_WHAT:
+                        String code = JSON.parseObject(message).getString("code");
+                        if (!StringUtils.isEmpty(code) && bundle != null) {
+                            bundle.putString("code", code);
+                            savePlan2Net(bundle);
+                        }
+                        break;
                 }
             }
         } catch (Exception e) {
@@ -316,8 +331,9 @@ public class MissionPresenter implements IMissionPresenter, HttpHandler.OnResult
     private void handlerData(JSONArray array) throws Exception {
         if (ListUtils.isEmpty(array)) {
             if (iMission != null) {
-                iMission.dimssLoading();
-                iMission.showModels(models);
+                loadMissionByDB();
+//                iMission.dimssLoading();
+//                iMission.showModels(models);
             }
             return; //获取到拜访计划数据
         } else {
@@ -351,6 +367,7 @@ public class MissionPresenter implements IMissionPresenter, HttpHandler.OnResult
                 }
                 entity.setStatus(1);
                 //TODO 添加时间和位置数据
+                entity.setRemark(object.getString("mpd_remark"));
                 entity.setDistance(object.getDoubleValue("MPD_DISTANCE"));
                 entity.setLocation(object.getString("MPD_LOCATION"));
                 entity.setRecorddate(object.getString("MPD_RECORDDATE"));
@@ -363,14 +380,22 @@ public class MissionPresenter implements IMissionPresenter, HttpHandler.OnResult
     }
 
     private void setModels() {
-        if (iMission != null) {
-            iMission.dimssLoading();
-            iMission.showModels(models);
-        }
+//        if (iMission != null) {
+//            iMission.dimssLoading();
+//            iMission.showModels(models);
+//        }
         ThreadUtil.getInstance().addTask(new Runnable() {
             @Override
             public void run() {
-                MissionDao.getInstance().updataOrCreate(models);
+                boolean saveOk = MissionDao.getInstance().updataOrCreate(models);
+                if (saveOk) {
+                    HttpHandler.getInstance().post(new Runnable() {
+                        @Override
+                        public void run() {
+                            loadMissionByDB();
+                        }
+                    });
+                }
             }
         });
     }

+ 1 - 3
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/WorkPresenter.java

@@ -348,8 +348,7 @@ public class WorkPresenter implements HttpHandler.OnResultListener, IWorkPresent
                         if (StringUtils.isEmpty(e.getWorkSignin()) || e.getWorkSignin().compareTo(timeLog) >= 0) {
                             models.get(j).setWorkSignin(timeLog);
                         }
-                    }
-                    if (e.getOffStart().compareTo(timeLog) <= 0) {
+                    } else if (e.getOffStart().compareTo(timeLog) <= 0) {
                         if (StringUtils.isEmpty(e.getOffSignin()) || e.getOffSignin().compareTo(timeLog) <= 0) {
                             models.get(j).setOffSignin(timeLog);
                         }
@@ -358,7 +357,6 @@ public class WorkPresenter implements HttpHandler.OnResultListener, IWorkPresent
                 }
             }
         }
-
         showModels(models, logTime);
     }
 

+ 2 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/attendance/AutoErpService.java

@@ -8,6 +8,7 @@ import android.content.IntentFilter;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
+import android.os.Looper;
 import android.os.Message;
 import android.util.Log;
 
@@ -262,6 +263,7 @@ public class AutoErpService extends Service {
                         if (isAuto) {
                             MissionModel mission = getReckonAutoUtil().reckonMission(plans);
                             if (mission != null) {//TODO 符合外勤签到
+                                Looper.prepare();
                                 Message message = handler.obtainMessage();
                                 message.what = STATUS_MISSION;
                                 Bundle bundle = new Bundle();

+ 8 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/attendance/AutoErpSigninUitl.java

@@ -102,7 +102,7 @@ public class AutoErpSigninUitl implements HttpHandler.OnResultListener {
         formStore.put("mo_man", name);//人员编号
         formStore.put("mo_remark", "自动外勤签到");//备注
         formStore.put("mo_company", model.getCompanyName());//TODO 当前公司
-        param.put("mpd_status", "签退");//备注
+//        param.put("mpd_status", "签退");//
         param.put("caller", "Mobile_outsign");
         param.put("mpd_id", model.getId());
         param.put("formStore", StringUtils.mapToJson(formStore));
@@ -112,6 +112,12 @@ public class AutoErpSigninUitl implements HttpHandler.OnResultListener {
                 "mobile/addAutoSign.action", param, bundle, this);
     }
 
+    private void endMission(MissionModel model) {
+        Map<String, Object> param = new HashMap<>();
+        param.put("id", model.getId());
+        HttpHandler.getInstance().loadERPByNet(SIGNIN_MISSION,
+                "mobile/mobileplanUpdate.action", param, null, this);
+    }
 
     private void validatorMac(WorkModel model, String macAddress) {
         Map<String, Object> param = new HashMap<>();
@@ -364,6 +370,7 @@ public class AutoErpSigninUitl implements HttpHandler.OnResultListener {
         if (mission == null) return;//如果数据库没有,一般不会出现这样的情况
         if (mission.getStatus() == 2) {//进来签退
             Log.i("gongpengming", "进来签退");
+            endMission(mission);
             mission.setRealLeave(TimeUtils.f_long_2_str(System.currentTimeMillis()));
             loadIsMission(mission);
         } else {//签到

+ 0 - 3
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/view/SwitchView.java

@@ -83,9 +83,6 @@ public class SwitchView extends View {
         setChecked(true);
     }
 
-    public void setIsClickAble(boolean clickAble) {
-        this.clickAble = clickAble;
-    }
 
     public void initAnimator() {
         mStartTime = System.currentTimeMillis();

+ 1 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/message/ChatActivity.java

@@ -147,7 +147,7 @@ public class ChatActivity extends ActionBackActivity
             }
         }
         mAudioManager = (AudioManager) getSystemService(android.app.Service.AUDIO_SERVICE);
-        mChatMessages = new ArrayList<ChatMessage>();
+        mChatMessages = new ArrayList<>();
         Downloader.getInstance().init(MyApplication.getInstance().mAppDir + File.separator + mLoginUserId
                 + File.separator + Environment.DIRECTORY_MUSIC);
         initView();

+ 1 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/message/MessageFragment.java

@@ -610,6 +610,7 @@ public class MessageFragment extends EasyFragment {
             time_tv.setText(TimeUtils.getFriendlyTimeDesc(mActivity, friend.getTimeSend()));
 
             CharSequence content = "";
+            Log.i("gongpengming", "getStatus" + friend.getStatus());
             if (friend.getType() == XmppMessage.TYPE_TEXT) {
                 String s = StringUtils.replaceSpecialChar(friend.getContent());
                 content = HtmlUtils.transform200SpanString(s.replaceAll("\n", "\r\n"), true);
@@ -617,7 +618,6 @@ public class MessageFragment extends EasyFragment {
                 content = friend.getContent();
             }
             content_tv.setText(content);
-
             if (friend.getUnReadNum() > 0) {
                 String numStr = friend.getUnReadNum() >= 99 ? "99+" : friend.getUnReadNum() + "";
                 num_tv.setText(numStr);

+ 1 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/tool/ThreadPool.java

@@ -10,7 +10,7 @@ public final class ThreadPool {
      private WorkThread[] workThreads;
     
      // 任务队列,作为一个缓冲,List线程不安全
-     private List<Runnable> taskQueue = new LinkedList<Runnable>();
+     private List<Runnable> taskQueue = new LinkedList<>();
 
      private static ThreadPool threadPool;
 

+ 1 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/tool/ThreadUtil.java

@@ -16,6 +16,7 @@ public class ThreadUtil {
         return instance;
     }
 
+
     //普通线程
     public void addTask(Runnable runnable) {
         ThreadPool.getThreadPool().addTask(runnable);//暂时的线程开启方式

+ 0 - 1
WeiChat/src/main/res/layout/activity_basic_info.xml

@@ -80,7 +80,6 @@
                         android:layout_centerHorizontal="true"
                         android:layout_marginTop="10dp"
                         android:textColor="@color/black"
-
                         android:textSize="@dimen/text_hine" />
 
                     <TextView

+ 3 - 1
WeiChat/src/main/res/layout/chat_from_item_text.xml

@@ -10,6 +10,7 @@
         android:layout_marginTop="5dp"
         android:background="@drawable/chatsystem_bg"
         android:gravity="center" />
+
     <CheckBox
         android:id="@+id/cb_remove"
         android:layout_width="wrap_content"
@@ -18,11 +19,12 @@
         android:layout_below="@+id/time_tv"
         android:layout_marginTop="15dp"
         android:visibility="gone" />
+
     <RelativeLayout
-        android:layout_toLeftOf="@+id/cb_remove"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_below="@+id/time_tv"
+        android:layout_toLeftOf="@+id/cb_remove"
         android:gravity="right"
         android:orientation="horizontal"
         android:padding="3dip">

+ 0 - 1
WeiChat/src/main/res/layout/fragment_me.xml

@@ -493,7 +493,6 @@
             android:id="@+id/test_rl"
             style="@style/IMTbleLine_UP_Me"
             android:layout_marginTop="7dp"
-            android:visibility="gone"
             android:background="@drawable/selector_me_menu_item_bg"
             >
             <TextView

+ 72 - 4
WeiChat/src/main/res/layout/item_mission.xml

@@ -112,7 +112,7 @@
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
             android:gravity="center"
-            android:text="公司名称"
+            android:text="出访单位"
             android:textColor="@color/text_main"
             android:textSize="@dimen/text_main" />
 
@@ -148,7 +148,7 @@
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
             android:gravity="center"
-            android:text="公司地址"
+            android:text="出访地址"
             android:textColor="@color/text_main"
             android:textSize="@dimen/text_main" />
 
@@ -156,20 +156,88 @@
             android:id="@+id/item_companyaddr_tv"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
-            android:layout_alignParentRight="true"
-            android:layout_toRightOf="@id/item_companyaddr_tag"
             android:drawableRight="@drawable/addr_bule"
             android:ellipsize="end"
             android:gravity="center|right"
             android:hint="选择"
             android:lines="1"
             android:textColor="@color/text_hine"
+            android:textSize="@dimen/text_hine"
+            android:layout_alignParentTop="true"
+            android:layout_alignParentRight="true"
+            android:layout_alignParentEnd="true" />
+    </RelativeLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="2px"
+        android:visibility="gone"
+        android:background="@color/item_line" />
+
+    <RelativeLayout
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/misson_item_height"
+        android:paddingLeft="@dimen/misson_item_pl"
+        android:visibility="gone"
+        android:paddingRight="@dimen/misson_item_pr">
+
+        <TextView
+            android:id="@+id/remark_tag"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:text="出访目的"
+            android:textColor="@color/text_main"
+            android:textSize="@dimen/text_main" />
+
+        <EditText
+            android:id="@+id/item_remark_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignParentRight="true"
+            android:layout_toRightOf="@+id/remark_tag"
+            android:background="@null"
+            android:gravity="right"
+            android:textColor="@color/text_hine"
+            android:textSize="@dimen/text_hine" />
+    </RelativeLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="2px"
+        android:background="@color/item_line" />
+
+    <RelativeLayout
+        android:visibility="gone"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/misson_item_height"
+        android:paddingLeft="@dimen/misson_item_pl"
+        android:paddingRight="@dimen/misson_item_pr">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:text="与目的地距离"
+            android:textColor="@color/text_main"
+            android:textSize="@dimen/text_main" />
+
+        <TextView
+            android:id="@+id/item_long_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignParentRight="true"
+            android:ellipsize="end"
+            android:gravity="center"
+            android:lines="1"
+            android:textColor="@color/text_hine"
             android:textSize="@dimen/text_hine" />
     </RelativeLayout>
 
     <View
         android:layout_width="match_parent"
         android:layout_height="2px"
+        android:visibility="gone"
         android:background="@color/item_line" />
 
     <RelativeLayout