FANGLH 8 years ago
parent
commit
bedd9bb49d
22 changed files with 3101 additions and 1 deletions
  1. 374 0
      app_core/common/src/main/java/com/core/utils/CommonInterface.java
  2. 78 0
      app_core/common/src/main/java/com/core/utils/CommonInterfaceHandler.java
  3. 126 0
      app_core/common/src/main/java/com/core/widget/RecycleViewDivider.java
  4. 1 0
      app_modular/appme/build.gradle
  5. 1 0
      app_modular/appme/src/main/java/com/uas/appme/settings/activity/MissionSetActivity.java
  6. 1 1
      app_modular/appme/src/main/java/com/uas/appme/settings/activity/SelectLanguageActivity.java
  7. 1 0
      app_modular/appme/src/main/java/com/uas/appme/settings/activity/SettingActivity.java
  8. 331 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/AddFlihtsActivity.java
  9. 152 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/FlightsActivity.java
  10. 133 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/adapter/FlightsAdapter.java
  11. 51 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/BaseNodeBean.java
  12. 64 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/EmployeesModel.java
  13. 284 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/FlightsModel.java
  14. 127 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/FlightsTimeModel.java
  15. 57 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/HrorgsModel.java
  16. 148 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/SelectCollisionTurnBean.java
  17. 174 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/SelectEmUser.java
  18. 546 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/presenter/AddFlihtsPresenter.java
  19. 310 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/presenter/FlightsPresernter.java
  20. 90 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/utils/MostLinearLayoutManager.java
  21. 36 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/view/IAddFlihtsView.java
  22. 16 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/view/IFlightsView.java

+ 374 - 0
app_core/common/src/main/java/com/core/utils/CommonInterface.java

@@ -0,0 +1,374 @@
+package com.core.utils;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.Log;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.common.data.DateFormatUtil;
+import com.common.data.JSONUtil;
+import com.core.api.wxapi.ApiConfig;
+import com.core.api.wxapi.ApiPlatform;
+import com.core.api.wxapi.ApiUtils;
+import com.core.app.MyApplication;
+import com.core.net.http.http.OAHttpHelper;
+import com.core.net.http.http.OnHttpResultListener;
+import com.core.net.http.http.Request;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 公用接口封装类
+ * Created by Bitliker on 2016/12/30.
+ */
+public class CommonInterface implements OnHttpResultListener {
+    private static CommonInterface instance;
+
+    public static final int CODE_WHAT = 0x11;//获取code
+    public static final int ID_WHAT = 0x12;//获取id
+    public static final int OUT_SET_WHAT = 0x13;//获取外勤设置
+    public static final int ADD_OUT_SET_WHAT = 0x14;//外勤设置
+    public static final int LOAD_COMPANY_WHAT = 0x15;//外勤设置
+    public static final int ISMAIN_WHAT = 0x16;//是否管理员
+    public static final int LOAD_CONFIG_WHAT = 0x17;//获取高级设置
+    public static final int WORK_DATA_WHAT = 0x18;//获取班次接口
+    public static final int WORK_LOG_WHAT = 0x19;//获取班次打卡记录接口
+    public static final int END_MISSION = 0x20;//更新外勤状态
+    public static final int ADD_CONTACT = 0x21;//添加了联系人
+
+    public static CommonInterface getInstance() {
+        if (instance == null) {
+            synchronized (CommonInterface.class) {
+                instance = new CommonInterface();
+            }
+        }
+        return instance;
+    }
+
+
+    /**
+     * 获取服务端表的id
+     *
+     * @param sql              表名+"_sql"
+     * @param onResultListener 回调
+     */
+    public void getIdByNet(String sql, OnResultListener onResultListener) {
+        if (ApiUtils.getApiModel() instanceof ApiPlatform) return;
+        Map<String, Object> param = new HashMap<>();
+        param.put("seq", sql);
+        loadNet(ID_WHAT, "common/getId.action", param, new Bundle(), Request.Mode.GET, onResultListener);
+    }
+
+    /**
+     * 获取服务端表的编号
+     *
+     * @param titleName        表名
+     * @param onResultListener 回调
+     */
+    public void getCodeByNet(String titleName, OnResultListener onResultListener) {
+        if (ApiUtils.getApiModel() instanceof ApiPlatform) return;
+        Map<String, Object> param = new HashMap<>();
+        param.put("type", 2);
+        param.put("caller", titleName);
+        loadNet(CODE_WHAT, "common/getCodeString.action", param, new Bundle(), Request.Mode.GET, onResultListener);
+    }
+
+
+    /**
+     * 获取外勤设置,判断是否是
+     *
+     * @param onResultListener 回调
+     */
+    public void getOutSetInfo(OnResultListener onResultListener) {
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        String url = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().getOutSet : "mobile/getOutSetInfo.action";
+        loadNet(OUT_SET_WHAT, url, new HashMap<String, Object>(), new Bundle(), Request.Mode.GET, onResultListener);
+    }
+
+
+    /**
+     * 更新外勤设置
+     *
+     * @param distance         范围
+     * @param time             预留时间
+     * @param isAuto           是否开启自动外勤
+     * @param onResultListener
+     */
+    public void addOutSet(int distance, int time, boolean isAuto, boolean needprocess, OnResultListener onResultListener) {
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        Map<String, Object> param = new HashMap<>();
+        Map<String, Object> formStore = new HashMap<>();
+        if (isB2b) {
+            formStore.put("enuu", CommonUtil.getSharedPreferences(MyApplication.getInstance().getApplicationContext(), "companyEnUu"));
+            formStore.put("emcode", CommonUtil.getSharedPreferences(MyApplication.getInstance().getApplicationContext(), "b2b_uu"));
+        } else param.put("caller", "OUTSET");
+
+        formStore.put("mo_distance", distance);//距离
+        formStore.put("mo_needprocess", needprocess ? 1 : 0);//距离
+        formStore.put("mo_time", time);//预留时间
+        formStore.put("mo_autosign", isAuto ? 1 : 0);//是否自动外勤
+        param.put("formStore", JSONUtil.map2JSON(formStore));
+        String url = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().saveOutSet : "mobile/addOutSet.action";
+        loadNet(ADD_OUT_SET_WHAT, url, param, new Bundle(), Request.Mode.POST, onResultListener);
+
+    }
+
+    /*获取企业架构数据*/
+    public void loadCompanyData(OnResultListener onResultListener) {
+        String master = CommonUtil.getMaster();
+        Map<String, Object> param = new HashMap<>();
+        param.put("master", master);
+        param.put("lastdate", "");
+        Bundle bundle = new Bundle();
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        bundle.putBoolean("isB2b", isB2b);
+        String url = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().getUsersInfo : "mobile/getAllHrorgEmps.action";
+        loadNet(LOAD_COMPANY_WHAT, url, param, bundle, Request.Mode.GET, onResultListener);
+    }
+
+
+    //判断是否管理员
+    public void judgeManager(OnResultListener onResultListener) {
+        Map<String, Object> param = new HashMap<>();
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        String url = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().getUserInfo : "mobile/ifadmin.action";
+        param.put("emcode", CommonUtil.getEmcode());
+        loadNet(ISMAIN_WHAT, url, param, new Bundle(), Request.Mode.GET, onResultListener);
+    }
+
+    //获取高级设置数据
+    public void loadConfigs(OnResultListener onResultListener) {
+        //获取考勤高级设置时间请求
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        Map<String, Object> param = new HashMap<>();
+        if (!isB2b)
+            param.put("code", 1);
+        String url = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().get_plat_senior_setting_url : "/mobile/getconfigs.action";
+        loadNet(LOAD_CONFIG_WHAT, url, param, new Bundle(), Request.Mode.GET, onResultListener);
+    }
+
+    //获取班次数据
+    private void loadWorkData(long time, OnResultListener onResultListener) {
+        Map<String, Object> param = new HashMap<>();
+        param.put("date", DateFormatUtil.long2Str(time,"yyyyMMdd"));
+        Bundle bundle = new Bundle();
+        bundle.putLong("time", time);
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        if (!isB2b)
+            param.put("emcode", CommonUtil.getEmcode());
+        String url = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().punch_schedule_url : "mobile/getWorkDate.action";
+        loadNet(WORK_DATA_WHAT, url, param, bundle, Request.Mode.GET, onResultListener);
+    }
+
+
+    /**
+     * 更新外勤计划状态
+     *
+     * @param id     外勤id
+     * @param isDone 是否已完成,否则未签退
+     */
+    public void endMission(int id, boolean isDone) {
+        if (id == 0) return;
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        Map<String, Object> param = new HashMap<>();
+        param.put("id", id);
+        String url = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().updateOutplanStatus : "mobile/mobileplanUpdate.action";
+        if (isB2b)
+            param.put("statuscode", isDone ? "done" : "CHECKOUT");//TODO done使用小写
+
+        Request request = new Request.Bulider()
+                .setWhat(END_MISSION)
+                .setUrl(url)
+                .setParam(param)
+                .setMode(Request.Mode.POST)
+                .bulid();
+        OAHttpHelper.getInstance().requestHttp(request, this);
+
+    }
+
+    //获取打卡数据
+    private void loadLog(Bundle bundle) {
+        long time = 0;
+        if (bundle == null) bundle = new Bundle();
+        else time = bundle.getLong("time");
+        if (time == 0)
+            time = System.currentTimeMillis();
+        String date = TimeUtils.s_long_2_str(time);
+        Map<String, Object> param = new HashMap<>();
+        String code = CommonUtil.getEmcode();
+        param.put("currentMaster", CommonUtil.getMaster());
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        if (isB2b)
+            param.put("pageNumber", 1);
+        else
+            param.put("page", 1);
+        param.put("pageSize", 100);
+        if (!isB2b)
+            param.put("condition", "cl_emcode='" + code + "' and to_char(cl_time,'yyyy-MM-dd')='" + date + "'");
+        else
+            param.put("date", DateFormatUtil.long2Str(time, "yyyyMMdd"));
+        param.put("caller", "CardLog");
+        param.put("emcode", code);
+        param.put("master", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_master"));
+        bundle.putLong("time", time);
+        String url = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().punch_record_url
+                : "mobile/oa/workdata.action";
+        Request request = new Request.Bulider()
+                .setWhat(WORK_LOG_WHAT)
+                .setUrl(url)
+                .setParam(param)
+                .setBundle(bundle)
+                .setMode(Request.Mode.GET)
+                .bulid();
+        OAHttpHelper.getInstance().requestHttp(request, this);
+
+    }
+
+    private void loadNet(int waht, String url, Map<String, Object> param, Bundle bundle, Request.Mode mode, OnResultListener onResultListener) {
+        if (bundle == null) bundle = new Bundle();
+        bundle.putSerializable("onResultListener", onResultListener);
+
+        Request request = new Request.Bulider()
+                .setWhat(waht)
+                .setUrl(url)
+                .setParam(param)
+                .setBundle(bundle)
+                .setMode(mode)
+                .bulid();
+        OAHttpHelper.getInstance().requestHttp(request, this);
+
+    }
+
+    /*添加联系人接口*/
+    public void addContact(List<Map<String, Object>> formStores, OnHttpResultListener listener) {
+        Map<String, Object> param = new HashMap<>();
+        param.put("caller", "contact");
+        param.put("formStore", JSONUtil.map2JSON(formStores));
+        Request request = new Request.Bulider()
+                .setWhat(ADD_CONTACT)
+                .setUrl("mobile/crm/addContactPerson.action")
+                .setParam(param)
+                .setMode(Request.Mode.POST)
+                .bulid();
+        OAHttpHelper.getInstance().requestHttp(request, listener == null ? this : listener);
+    }
+
+    /**
+     * @param sourcecode  来源编号
+     * @param contactName 联系人名字
+     * @param mobile      联系人手机
+     * @param cuname      客户名字
+     * @param cucode      客户编号
+     * @param address     客户地址
+     * @param job         岗位
+     * @return
+     */
+    public Map<String, Object> getFormStoreContact(String sourcecode,
+                                                   String contactName,
+                                                   String mobile,
+                                                   String cuname,
+                                                   String cucode,
+                                                   String address,
+                                                   String job) {
+        Map<String, Object> param = new HashMap<>();
+        param.put("ct_sourcecode", sourcecode);//来源编号
+        param.put("ct_name", contactName);//联系人名字
+        param.put("ct_mobile", mobile);//联系人手机
+        param.put("ct_cuname", cuname);//客户名字
+        param.put("ct_cucode", cucode);//客户编号
+        param.put("ct_address", address);//客户地址
+        param.put("ct_job", job);      //岗位
+
+        return param;
+    }
+
+    @Override
+    public void result(int what, boolean isJSON, String message, Bundle bundle) {
+        OnResultListener listener = (OnResultListener) bundle.getSerializable("onResultListener");
+        String resultMessage = message;
+        try {
+            if (!isJSON) {
+                if (listener != null)
+                    listener.result(false, what, message);
+                return;
+            }
+            JSONObject object = JSON.parseObject(message);
+            boolean success = true;
+            switch (what) {
+                case CODE_WHAT://获取编号
+                    resultMessage = object.getString("code");
+                    break;
+                case ID_WHAT:
+                    success = (object.containsKey("success") && object.getBoolean("success"));
+                    int id = JSONUtil.getInt(object, "id");
+                    if (id != 0)
+                        resultMessage = String.valueOf(id);
+                    else success = false;
+                    break;
+                case OUT_SET_WHAT://获取外勤地址
+                    success = CommonInterfaceHandler.getOutSet(object);
+                    break;
+                case ADD_OUT_SET_WHAT://添加外勤地址
+                    success = true;
+                    break;
+                case LOAD_COMPANY_WHAT://获取企业信息的内容,有与该信息比较特殊,将数据处理逻辑放到外面去
+                    break;
+                case ISMAIN_WHAT://判断是否是管理员
+                    success = CommonInterfaceHandler.saveMainStatus(object);
+                    break;
+                case LOAD_CONFIG_WHAT://获取高级设置
+                    WorkHandlerUtil.handlerWorkSet(object);
+                    break;
+                case WORK_DATA_WHAT://获取班次接口
+                    success = CommonInterfaceHandler.saveWorkData(object, bundle);
+                    if (success)
+                        loadLog(bundle);
+                    break;
+                case WORK_LOG_WHAT://获取班次打卡记录接口
+
+                    break;
+
+            }
+            if (listener != null)
+                listener.result(success, what, resultMessage);
+        } catch (NullPointerException e) {
+            if (e != null) {
+                Log.i("gongpengming", "handleMessage NullPointerException=" + e.getMessage());
+                resultMessage = e.getMessage();
+            }
+            if (listener != null)
+                listener.result(false, what, resultMessage);
+        } catch (Exception e) {
+            if (e != null) {
+                Log.i("gongpengming", "handleMessage Exception=" + e.getMessage());
+                resultMessage = e.getMessage();
+            }
+            if (listener != null)
+                listener.result(false, what, resultMessage);
+        }
+    }
+
+    @Override
+    public void error(int what, String message, Bundle bundle) {
+        OnResultListener listener = (OnResultListener) bundle.getSerializable("onResultListener");
+        if (listener != null)
+            listener.result(false, what, message);
+    }
+
+
+    public interface OnResultListener extends Serializable {
+        /**
+         * 通用接口保存后返回接口
+         *
+         * @param success 成功
+         * @param what    请求的what
+         * @param message 返回的外面需要用到的信息
+         */
+        void result(@NonNull boolean success, @NonNull int what, @Nullable String message);
+    }
+}

+ 78 - 0
app_core/common/src/main/java/com/core/utils/CommonInterfaceHandler.java

@@ -0,0 +1,78 @@
+package com.core.utils;
+
+import android.os.Bundle;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.common.data.JSONUtil;
+import com.common.data.ListUtils;
+import com.common.data.StringUtil;
+import com.common.preferences.PreferenceUtils;
+import com.core.api.wxapi.ApiPlatform;
+import com.core.api.wxapi.ApiUtils;
+import com.core.app.AppConfig;
+import com.core.model.WorkModel;
+
+import java.util.ArrayList;
+
+
+/**
+ * Created by Bitliker on 2017/3/23.
+ */
+
+public class CommonInterfaceHandler {
+
+    public static boolean saveWorkData(JSONObject object, Bundle bundle) throws Exception {
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        ArrayList<WorkModel> models = WorkHandlerUtil.handlerWorkData(object, isB2b);
+        bundle.putParcelableArrayList("models", models);
+        WorkHandlerUtil.handerLocation(object, isB2b);
+        String days = JSONUtil.getText(object, "wd_day", "day");
+        String name = JSONUtil.getText(object, "wd_name", "name");
+        bundle.putString("days", days);
+        bundle.putString("name", name);
+        return true;
+    }
+
+
+    /*保存管理员状态*/
+    public static boolean saveMainStatus(JSONObject object) throws Exception {
+        boolean isAdmin = false;
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        if (isB2b)
+            object = object.getJSONObject("data");
+        if (object.containsKey("isAdmin")) {
+            if (StringUtil.isEmpty(JSONUtil.getText(object, "isAdmin"))) {
+                isAdmin = JSONUtil.getInt(object, "isAdmin") > 0;
+            } else {
+                String adminStatus = JSONUtil.getText(object, "isAdmin");
+                isAdmin = Integer.valueOf(adminStatus) > 0;
+            }
+            PreferenceUtils.putBoolean(AppConfig.IS_ADMIN, isAdmin);
+        }
+        return isAdmin;
+    }
+
+    /*保存外勤设置*/
+    public static boolean getOutSet(JSONObject o) {
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        JSONObject object = null;
+        if (!isB2b) {
+            JSONArray array = o.getJSONArray("result");
+            if (ListUtils.isEmpty(array)) return false;
+            object = array.getJSONObject(0);
+        } else object = o;
+        int distance = JSONUtil.getInt(object, "mo_distance", "MO_DISTANCE");
+        int time = JSONUtil.getInt(object, "mo_time", "MO_TIME");
+        boolean isAuto = JSONUtil.getInt(object, "mo_autosign", "MO_AUTOSIGN") > 0;
+        boolean needprocess = JSONUtil.getInt(object, "MO_NEEDPROCESS", "MO_NEEDPROCESS") > 0;
+        //获取到外勤设置   保存下来
+        PreferenceUtils.putBoolean(AppConfig.AUTO_MISSION, isAuto);
+        PreferenceUtils.putBoolean(AppConfig.NEED_PROCESS, needprocess);
+        PreferenceUtils.putInt(AppConfig.ALARM_MISSION_DISTANCE, distance);
+        PreferenceUtils.putInt(AppConfig.AUTO_MISSION_TIME, time);
+        return true;
+    }
+
+
+}

+ 126 - 0
app_core/common/src/main/java/com/core/widget/RecycleViewDivider.java

@@ -0,0 +1,126 @@
+package com.core.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.support.v4.content.ContextCompat;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+public class RecycleViewDivider extends RecyclerView.ItemDecoration {
+
+    private Paint mPaint;
+    private Drawable mDivider;
+    private int mDividerHeight = 2;//分割线高度,默认为1px
+    private int mOrientation;//列表的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL
+    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
+
+    /**
+     * 默认分割线:高度为2px,颜色为灰色
+     *
+     * @param context
+     * @param orientation 列表方向
+     */
+    public RecycleViewDivider(Context context, int orientation) {
+        if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {
+            throw new IllegalArgumentException("请输入正确的参数!");
+        }
+        mOrientation = orientation;
+
+        final TypedArray a = context.obtainStyledAttributes(ATTRS);
+        mDivider = a.getDrawable(0);
+        a.recycle();
+    }
+
+    /**
+     * 自定义分割线
+     *
+     * @param context
+     * @param orientation 列表方向
+     * @param drawableId  分割线图片
+     */
+    public RecycleViewDivider(Context context, int orientation, int drawableId) {
+        this(context, orientation);
+        mDivider = ContextCompat.getDrawable(context, drawableId);
+        mDividerHeight = mDivider.getIntrinsicHeight();
+    }
+
+    /**
+     * 自定义分割线
+     *
+     * @param context
+     * @param orientation   列表方向
+     * @param dividerHeight 分割线高度
+     * @param dividerColor  分割线颜色
+     */
+    public RecycleViewDivider(Context context, int orientation, int dividerHeight, int dividerColor) {
+        this(context, orientation);
+        mDividerHeight = dividerHeight;
+        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+        mPaint.setColor(dividerColor);
+        mPaint.setStyle(Paint.Style.FILL);
+    }
+
+
+    //获取分割线尺寸
+    @Override
+    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
+        super.getItemOffsets(outRect, view, parent, state);
+        outRect.set(0, 0, 0, mDividerHeight);
+    }
+
+    //绘制分割线
+    @Override
+    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
+        super.onDraw(c, parent, state);
+        if (mOrientation == LinearLayoutManager.VERTICAL) {
+            drawVertical(c, parent);
+        } else {
+            drawHorizontal(c, parent);
+        }
+    }
+
+    //绘制横向 item 分割线
+    private void drawHorizontal(Canvas canvas, RecyclerView parent) {
+        final int left = parent.getPaddingLeft();
+        final int right = parent.getMeasuredWidth() - parent.getPaddingRight();
+        final int childSize = parent.getChildCount();
+        for (int i = 0; i < childSize; i++) {
+            final View child = parent.getChildAt(i);
+            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
+            final int top = child.getBottom() + layoutParams.bottomMargin;
+            final int bottom = top + mDividerHeight;
+            if (mDivider != null) {
+                mDivider.setBounds(left, top, right, bottom);
+                mDivider.draw(canvas);
+            }
+            if (mPaint != null) {
+                canvas.drawRect(left, top, right, bottom, mPaint);
+            }
+        }
+    }
+
+    //绘制纵向 item 分割线
+    private void drawVertical(Canvas canvas, RecyclerView parent) {
+        final int top = parent.getPaddingTop();
+        final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom();
+        final int childSize = parent.getChildCount();
+        for (int i = 0; i < childSize; i++) {
+            final View child = parent.getChildAt(i);
+            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
+            final int left = child.getRight() + layoutParams.rightMargin;
+            final int right = left + mDividerHeight;
+            if (mDivider != null) {
+                mDivider.setBounds(left, top, right, bottom);
+                mDivider.draw(canvas);
+            }
+            if (mPaint != null) {
+                canvas.drawRect(left, top, right, bottom, mPaint);
+            }
+        }
+    }
+}

+ 1 - 0
app_modular/appme/build.gradle

@@ -25,6 +25,7 @@ dependencies {
     //project
     compile project(':common')
     compile project(':message')
+    compile project(':appworks')
     compile project(':pullToRefershLibraryMy')
     compile project(':libbdupdatesdk')
 

+ 1 - 0
app_modular/appme/src/main/java/com/uas/appme/settings/activity/MissionSetActivity.java

@@ -16,6 +16,7 @@ import com.core.api.wxapi.ApiUtils;
 import com.core.app.AppConfig;
 import com.core.base.BaseActivity;
 import com.core.model.SelectBean;
+import com.core.utils.CommonInterface;
 import com.core.view.Activity.SelectActivity;
 import com.core.view.SwitchView;
 import com.lidroid.xutils.ViewUtils;

+ 1 - 1
app_modular/appme/src/main/java/com/uas/appme/settings/activity/SelectLanguageActivity.java

@@ -33,7 +33,7 @@ import java.util.ArrayList;
  * @desc:切换语言
  * @author:Arison on 2017/5/11
  */
-public class SelectLanguageActivity extends BaseActivity {
+public class  SelectLanguageActivity extends BaseActivity {
 
 
     @ViewInject(R.id.list_business)

+ 1 - 0
app_modular/appme/src/main/java/com/uas/appme/settings/activity/SettingActivity.java

@@ -52,6 +52,7 @@ import com.uas.appme.R;
 import com.uas.appme.pedometer.view.NewStepActivity;
 import com.uas.appme.pedometer.view.StepSplashActivity;
 import com.uas.appme.settings.Constant.Constant;
+import com.uas.appworks.OA.erp.activity.FlightsActivity;
 
 import java.io.File;
 

+ 331 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/AddFlihtsActivity.java

@@ -0,0 +1,331 @@
+package com.uas.appworks.OA.erp.activity;
+
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AlertDialog;
+import android.text.Editable;
+import android.text.Selection;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.common.data.ListUtils;
+import com.common.data.StringUtil;
+import com.core.api.wxapi.ApiPlatform;
+import com.core.api.wxapi.ApiUtils;
+import com.core.base.OABaseActivity;
+import com.core.utils.ToastUtil;
+import com.lidroid.xutils.ViewUtils;
+import com.lidroid.xutils.view.annotation.ViewInject;
+import com.uas.appme.R;
+import com.uas.appworks.OA.erp.model.SelectCollisionTurnBean;
+import com.uas.appworks.OA.erp.presenter.AddFlihtsPresenter;
+import com.uas.appworks.OA.erp.view.IAddFlihtsView;
+
+
+public class AddFlihtsActivity extends OABaseActivity implements IAddFlihtsView, View.OnClickListener {
+    private final int TIME_TV = 0x11,
+            DATE_TV = 0x12,
+            DEPARTMENT_TV = 0x13,
+            MUNBER_TV = 0x14,
+            COLLISION_MUNBER_TV = 0x15,
+            COLLISION_DEPARTMENT_TV = 0x16;
+
+    @ViewInject(R.id.rule_name_et)
+    private EditText rule_name_et;
+    @ViewInject(R.id.time_tv)
+    private TextView time_tv;
+    @ViewInject(R.id.date_tv)
+    private TextView date_tv;
+    @ViewInject(R.id.calender_select_ll)
+    private LinearLayout calender_select_ll;
+    @ViewInject(R.id.click_btn)
+    private Button click_btn;
+    @ViewInject(R.id.department_tv)
+    private TextView department_tv;
+    @ViewInject(R.id.munber_tv)
+    private TextView munber_tv;
+    @ViewInject(R.id.collision_department_tv)
+    private TextView collision_department_tv;//冲突部门
+    @ViewInject(R.id.collision_munber_tv)
+    private TextView collision_munber_tv;//冲突员工
+    @ViewInject(R.id.department_rl)
+    private RelativeLayout department_rl;
+    @ViewInject(R.id.munber_rl)
+    private RelativeLayout munber_rl;
+    private AddFlihtsPresenter presenter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_add_flihts);
+        ViewUtils.inject(this);
+        presenter = new AddFlihtsPresenter(this);
+        presenter.start(getIntent());
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        if (isB2b) {
+            department_rl.setVisibility(View.GONE);
+            munber_rl.setVisibility(View.GONE);
+        }
+        initEvent();
+    }
+
+    private void initEvent() {
+        boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        if (!isB2b) {
+            findViewById(R.id.date_tv).setOnClickListener(this);
+            findViewById(R.id.department_tv).setOnClickListener(this);
+            findViewById(R.id.munber_tv).setOnClickListener(this);
+            findViewById(R.id.calender_select_ll).setOnClickListener(this);
+            collision_department_tv.setOnClickListener(this);
+            collision_munber_tv.setOnClickListener(this);
+        } else {
+            rule_name_et.setFocusable(false);
+            rule_name_et.setClickable(false);
+        }
+        findViewById(R.id.time_tv).setOnClickListener(this);
+        findViewById(R.id.click_btn).setOnClickListener(this);
+    }
+
+
+    @Override
+    public void onClick(View view) {
+        Intent intent = null;
+        SelectCollisionTurnBean bean = null;
+        switch (view.getId()) {
+            case R.id.time_tv:
+                intent = new Intent(ct, FlihtsTimeActivity.class);
+                presenter.putData2Intent(view.getId(), intent);
+                startActivityForResult(intent, TIME_TV);
+                break;
+            case R.id.date_tv:
+                intent = new Intent(ct, FlightsDateActivity.class);
+                presenter.putData2Intent(view.getId(), intent);
+                startActivityForResult(intent, DATE_TV);
+                break;
+            case R.id.department_tv:
+                intent = new Intent(ct, SelectDepartmentActivity.class);
+                intent.putExtra(OAConfig.STRING_DATA, presenter.getHrorgsEmCode());
+                startActivityForResult(intent, DEPARTMENT_TV);
+                break;
+            case R.id.munber_tv:
+                intent = new Intent(ct, SelectCollisionActivity.class);
+                bean = new SelectCollisionTurnBean()
+                        .setSelectCode(presenter.getEmployeeEmCode());
+                intent.putExtra(OAConfig.MODEL_DATA, bean);
+                startActivityForResult(intent, MUNBER_TV);
+                break;
+            case R.id.click_btn:
+                if (isCanSubmit())
+                    presenter.submit(rule_name_et.getText().toString());
+                break;
+            case R.id.collision_munber_tv:
+                if (ListUtils.isEmpty(mans)) return;
+                intent = new Intent(ct, SelectCollisionActivity.class);
+                bean = new SelectCollisionTurnBean()
+                        .setSureText(getString(R.string.user_work))
+                        .setSelectType(getString(R.string.member))
+                        .setTitle(getString(R.string.conflict_personnel))
+                        .setReBackSelect(false)
+                        .setSelectCode(presenter.getEmployeeEmCode())
+                        .setSelectList(mans);
+                intent.putExtra(OAConfig.MODEL_DATA, bean);
+                startActivityForResult(intent, COLLISION_MUNBER_TV);
+                break;
+            case R.id.collision_department_tv:
+                if (ListUtils.isEmpty(defaultirs)) return;
+                intent = new Intent(ct, SelectCollisionActivity.class);
+                bean = new SelectCollisionTurnBean()
+                        .setSureText(getString(R.string.user_work))
+                        .setSelectType(getString(R.string.department))
+                        .setTitle(getString(R.string.conflict_department))
+                        .setReBackSelect(false)
+                        .setSelectCode(presenter.getEmployeeEmCode())
+                        .setSelectList(defaultirs);
+                intent.putExtra(OAConfig.MODEL_DATA, bean);
+                presenter.putData2Intent(view.getId(), intent);
+                startActivityForResult(intent, COLLISION_DEPARTMENT_TV);
+                break;
+            case R.id.calender_select_ll:
+                //TODO 进入修改班次的考勤日期选择,跳日历界面
+//                ToastMessage("进入修改班次的考勤日期选择,跳日历界面");
+                startActivity(new Intent(getApplicationContext(), FlihtsDateSelectActivity.class));
+                break;
+        }
+    }
+
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (resultCode != 0x20 || data == null) return;
+        switch (requestCode) {
+            case TIME_TV:
+                presenter.saveTime(data);
+                break;
+            case DATE_TV:
+                presenter.saveDate(data);
+                break;
+            case DEPARTMENT_TV:
+                presenter.saveHrorgs(data);
+                break;
+            case MUNBER_TV:
+                presenter.saveEmployees(data);
+                break;
+            case COLLISION_MUNBER_TV:
+                if (isClickAble)
+                    presenter.saveCollisionEmployees(data);
+                else
+                    showToast(R.string.default_not_edit_department, R.color.load_warning);
+                break;
+            case COLLISION_DEPARTMENT_TV:
+                if (isClickAble)
+                    presenter.saveCollisionDepartment(data);
+                else
+                    showToast(R.string.default_not_edit_member, R.color.load_warning);
+                break;
+        }
+    }
+
+
+    @Override
+    public void updateName(String name) {
+        if (!StringUtil.isEmpty(name)) {
+            rule_name_et.setText(name);
+            Editable etext = rule_name_et.getText();
+            Selection.setSelection(etext, etext.length());
+        } else
+            rule_name_et.setText("");
+    }
+
+    @Override
+    public void updateTime(String time) {
+        time_tv.setText(StringUtil.isEmpty(time) ? "" : time);
+    }
+
+    @Override
+    public void updateDate(String date, boolean isUpdate) {
+        if (isUpdate) {
+            date_tv.setVisibility(View.GONE);
+            calender_select_ll.setVisibility(View.VISIBLE);
+            click_btn.setText(getString(R.string.common_update_button));
+        }
+        date_tv.setText(StringUtil.isEmpty(date) ? "" : date);
+    }
+
+    @Override
+    public void updateDepartment(String department) {
+        Log.i("gongpengming", "department=" + department);
+        String showName = "";
+        if (!StringUtil.isEmpty(department)) {
+            showName = department.replaceAll("\'", "");
+        }
+        department_tv.setText(showName);
+    }
+
+    @Override
+    public void updateMunber(String munber) {
+        String showName = "";
+        if (!StringUtil.isEmpty(munber)) {
+            showName = munber.replaceAll("\'", "");
+        }
+        munber_tv.setText(showName);
+
+    }
+
+    @Override
+    public void endActivity(FlightsModel model, boolean isUpdate) {
+        Intent intent = new Intent();
+        intent.putExtra("data", model);
+        intent.putExtra("isUpdate", isUpdate);
+        setResult(0x20, intent);
+        finish();
+    }
+
+    private ArrayList<SelectEmUser> mans;
+
+    @Override
+    public void showCollisionMan(ArrayList<SelectEmUser> mans) {
+        //TODO 处理不来,测试版本先隐藏
+        this.mans = mans;
+        if (ListUtils.isEmpty(mans)) {
+            collision_munber_tv.setVisibility(View.GONE);
+        } else {
+            collision_munber_tv.setVisibility(View.VISIBLE);
+            collision_munber_tv.setText(getString(R.string.conflict_personnel) + mans.size() + getString(R.string.a));
+        }
+    }
+
+    private ArrayList<SelectEmUser> defaultirs;
+
+    @Override
+    public void showCollisionDefaultir(ArrayList<SelectEmUser> defaultirs) {
+        //TODO 处理不来,测试版本先隐藏
+        this.defaultirs = defaultirs;
+        if (ListUtils.isEmpty(defaultirs)) {
+            collision_department_tv.setVisibility(View.GONE);
+        } else {
+            collision_department_tv.setVisibility(View.VISIBLE);
+            collision_department_tv.setText(getString(R.string.conflict_department) + defaultirs.size() + getString(R.string.a));
+        }
+    }
+
+    boolean isClickAble = true;
+
+    @Override
+    public void setClickAble(boolean isClickAble) {
+        rule_name_et.setClickable(isClickAble);
+        rule_name_et.setFocusable(isClickAble);
+        this.isClickAble = isClickAble;
+
+    }
+
+    @Override
+    public void isB2b(boolean isB2b) {
+
+    }
+
+    public boolean isCanSubmit() {
+        if (StringUtil.isEmpty(rule_name_et.getText().toString())) {
+            ToastUtil.showToast(ct, R.string.work_name_not_be_null);
+            return false;
+        } else if (StringUtil.isEmpty(time_tv.getText().toString())) {
+            Crouton.showToast(ct, R.string.not_null_work_time, R.color.load_warning);
+            return false;
+        }
+        if (!getString(R.string.common_update_button).equals(click_btn.getText().toString())) {
+            if (StringUtil.isEmpty(date_tv.getText().toString())) {
+                Crouton.showToast(ct, R.string.not_null_work_day, R.color.load_warning);
+                return false;
+            }
+        }
+        if (!ListUtils.isEmpty(mans) || !ListUtils.isEmpty(defaultirs)) {
+            showDeleteDialog();
+            return false;
+        }
+        return true;
+    }
+
+    private void showDeleteDialog() {
+        AlertDialog.Builder builder = new AlertDialog.Builder(ct);
+
+        builder.setTitle(R.string.common_dialog_title).setMessage(R.string.will_save_conflict)
+                .setPositiveButton(R.string.common_sure, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialogInterface, int i) {
+                        presenter.submit(rule_name_et.getText().toString());
+                    }
+                })
+                .setNegativeButton(R.string.common_cancel, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialogInterface, int i) {
+
+                    }
+                }).show();
+    }
+}

+ 152 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/FlightsActivity.java

@@ -0,0 +1,152 @@
+package com.uas.appworks.OA.erp.activity;
+
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.LinearLayout;
+
+import com.common.data.ListUtils;
+import com.core.api.wxapi.ApiPlatform;
+import com.core.api.wxapi.ApiUtils;
+import com.core.base.OABaseActivity;
+import com.core.widget.RecycleViewDivider;
+import com.uas.appme.R;
+import com.uas.appworks.OA.erp.adapter.FlightsAdapter;
+import com.uas.appworks.OA.erp.model.FlightsModel;
+import com.uas.appworks.OA.erp.presenter.FlightsPresernter;
+import com.uas.appworks.OA.erp.utils.MostLinearLayoutManager;
+import com.uas.appworks.OA.erp.view.IFlightsView;
+
+import java.util.List;
+
+
+public class FlightsActivity extends OABaseActivity implements IFlightsView, FlightsAdapter.OnItemClickListener {
+
+    private FlightsPresernter presernter;
+    private RecyclerView recyclerView;
+    private FlightsAdapter adapter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_flights);
+        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
+        recyclerView.setLayoutManager(new LinearLayoutManager(ct));
+        RecycleViewDivider viewDivider = new RecycleViewDivider(this, LinearLayout.HORIZONTAL, 1, getResources().getColor(R.color.gray_light));
+        recyclerView.addItemDecoration(viewDivider);
+        initView();
+    }
+
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        if (!(ApiUtils.getApiModel() instanceof ApiPlatform))
+            getMenuInflater().inflate(R.menu.menu_add_icon, menu);
+        return super.onCreateOptionsMenu(menu);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (R.id.add_item == item.getItemId()) {
+            addMenuClicking(null);
+        } else if (android.R.id.home == item.getItemId()) {
+            endActivity();
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
+    public void onBackPressed() {
+        endActivity();
+        super.onBackPressed();
+    }
+
+    @Override
+    public void showModel(List<FlightsModel> models) {
+        if (adapter == null) {
+            adapter = new FlightsAdapter(models);
+            recyclerView.setLayoutManager(new MostLinearLayoutManager(ct));
+            recyclerView.setAdapter(adapter);
+            adapter.setOnItemClickListener(this);
+        } else {
+            adapter.setModels(models);
+            adapter.notifyDataSetChanged();
+        }
+    }
+
+    @Override
+    public void deleteModel(int position) {
+        if (adapter == null || ListUtils.isEmpty(adapter.getModels()) || adapter.getModels().size() <= position)
+            return;
+        adapter.getModels().remove(position);
+        adapter.notifyItemRemoved(position);
+        adapter.notifyItemRangeChanged(position, adapter.getModels().size());
+    }
+
+
+    private void addMenuClicking(FlightsModel model) {
+        Intent intent = new Intent(ct, AddFlihtsActivity.class);
+        intent.putExtra("data", model);
+        intent.putExtra("isUpdate", model != null);
+        startActivityForResult(intent, 0x21);
+    }
+
+    private void initView() {
+        presernter = new FlightsPresernter(this);
+        presernter.start();
+    }
+
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (data != null && 0x21 == requestCode && 0x20 == resultCode) {
+            presernter.start();
+        }
+    }
+
+    private int clickPosition = 0;
+
+    @Override
+    public void click(FlightsModel model, int position, boolean itemView) {
+        if (itemView) {
+//            if (model.getType() == 2) return;
+            clickPosition = position;
+            addMenuClicking(model);
+        } else {
+            if (ListUtils.isEmpty(adapter.getModels()) || adapter.getModels().size() <= position)
+                return;
+//            adapter.getModels().remove(position);
+//            adapter.notifyItemRemoved(position);
+//            adapter.notifyItemRangeChanged(position, adapter.getModels().size());
+            showDeleteDialog(position);
+        }
+    }
+
+    private void showDeleteDialog(final int position) {
+        AlertDialog.Builder builder = new AlertDialog.Builder(ct);
+        builder.setTitle(R.string.common_dialog_title).setMessage(R.string.delete_back_default_work)
+                .setPositiveButton(R.string.common_sure, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialogInterface, int i) {
+                        presernter.deleteWork(adapter.getModels(), position);
+                    }
+                })
+                .setNegativeButton(R.string.common_cancel, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialogInterface, int i) {
+                    }
+                }).show();
+    }
+
+    private void endActivity() {
+        Intent intent = new Intent();
+        setResult(0x20, intent);
+    }
+
+}

+ 133 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/adapter/FlightsAdapter.java

@@ -0,0 +1,133 @@
+package com.uas.appworks.OA.erp.adapter;
+
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.common.data.ListUtils;
+import com.common.data.StringUtil;
+import com.core.app.MyApplication;
+import com.uas.appme.R;
+import com.uas.appworks.OA.erp.model.FlightsModel;
+
+import java.util.List;
+
+
+/**
+ * Created by Bitliker on 2017/1/17.
+ */
+
+public class FlightsAdapter extends RecyclerView.Adapter<FlightsAdapter.FlightViewHolder> {
+
+    private List<FlightsModel> models;
+
+    public FlightsAdapter(List<FlightsModel> models) {
+        this.models = models;
+    }
+
+    public List<FlightsModel> getModels() {
+        return models;
+    }
+
+    public void setModels(List<FlightsModel> models) {
+        this.models = models;
+    }
+
+    @Override
+    public FlightViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        View view = LayoutInflater.from(MyApplication.getInstance()).inflate(R.layout.item_flights, parent, false);
+        return new FlightViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(FlightViewHolder holder, final int position) {
+        try {
+            final FlightsModel model = models.get(position);
+            setType(holder, model.getType());//设置隐藏和显示
+            holder.rule_name_tv.setText(StringUtil.getMessage(model.getName()));
+            holder.mumber_tv.setText(getNumber(model.getCount(), model.getDepartments()));
+            if (model.getTimeModel() != null) {
+                String week = model.getWeek() + " " + model.getTime();
+                holder.week_tv.setText(week);
+            }
+            holder.itemView.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    if (onItemClickListener != null)
+                        onItemClickListener.click(model, position, true);
+                }
+            });
+            holder.delete_rule_img.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    if (onItemClickListener != null)
+                        onItemClickListener.click(model, position, false);
+                }
+            });
+        } catch (Exception e) {
+
+        }
+    }
+
+    //  1、正常班次(可有排版 可删除)  2.默认班次 (有排版  无删除) 3.自由排班
+    private void setType(FlightViewHolder holder, int type) {
+        if (type == 1) {//正常班次
+            holder.week_tag_tv.setVisibility(View.VISIBLE);
+            holder.week_tv.setVisibility(View.VISIBLE);
+            holder.delete_rule_img.setVisibility(View.VISIBLE);
+        } else if (type == 2) {//默认班次
+            holder.week_tag_tv.setVisibility(View.VISIBLE);
+            holder.week_tv.setVisibility(View.VISIBLE);
+            holder.delete_rule_img.setVisibility(View.GONE);
+        } else {//自由排班
+            holder.week_tag_tv.setVisibility(View.GONE);
+            holder.week_tv.setVisibility(View.GONE);
+            holder.delete_rule_img.setVisibility(View.GONE);
+        }
+    }
+
+    private String getNumber(int count, int departments) {
+        if (departments == 0 && count == 0)
+            return 0 + getString(R.string.a_person);
+        return (departments == 0 ? "" : (departments + getString(R.string.a_department))) + (count == 0 ? "" : (count +getString(R.string.a_person)));
+    }
+
+    private String getString(int id) {
+        return MyApplication.getInstance().getString(id);
+    }
+
+    @Override
+    public int getItemCount() {
+        return ListUtils.isEmpty(models) ? 0 : models.size();
+    }
+
+    class FlightViewHolder extends RecyclerView.ViewHolder {
+        TextView rule_name_tv,
+                mumber_tv,
+                week_tag_tv,
+                week_tv;
+        ImageView delete_rule_img;
+
+        public FlightViewHolder(View itemView) {
+            super(itemView);
+            rule_name_tv = (TextView) itemView.findViewById(R.id.rule_name_tv);
+            mumber_tv = (TextView) itemView.findViewById(R.id.mumber_tv);
+            week_tag_tv = (TextView) itemView.findViewById(R.id.week_tag_tv);
+            week_tv = (TextView) itemView.findViewById(R.id.week_tv);
+            delete_rule_img = (ImageView) itemView.findViewById(R.id.delete_rule_img);
+        }
+    }
+
+    private OnItemClickListener onItemClickListener;
+
+    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
+        this.onItemClickListener = onItemClickListener;
+    }
+
+    public interface OnItemClickListener {
+        void click(FlightsModel model, int position, boolean itemView);
+    }
+}

+ 51 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/BaseNodeBean.java

@@ -0,0 +1,51 @@
+package com.uas.appworks.OA.erp.model;
+
+public class BaseNodeBean {
+    /**
+     * 节点Id
+     */
+    protected int id;
+    /**
+     * 节点父id
+     */
+    protected int pId;
+    /**
+     * 节点name
+     */
+    protected String name;
+
+
+    public BaseNodeBean(int id, int pId, String name) {
+        super();
+        this.id = id;
+        this.pId = pId;
+        this.name = name;
+    }
+
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public int getpId() {
+        return pId;
+    }
+
+    public void setpId(int pId) {
+        this.pId = pId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+}

+ 64 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/EmployeesModel.java

@@ -0,0 +1,64 @@
+package com.uas.appworks.OA.erp.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * 员工对象和部门对象   只要编号和名字   别的不要
+ * Created by Bitliker on 2017/1/22.
+ */
+
+public class EmployeesModel implements Parcelable {
+    private String employeeNames;
+    private String employeecode;
+
+    public EmployeesModel() {
+
+    }
+
+    protected EmployeesModel(Parcel in) {
+        employeeNames = in.readString();
+        employeecode = in.readString();
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(employeeNames);
+        dest.writeString(employeecode);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Creator<EmployeesModel> CREATOR = new Creator<EmployeesModel>() {
+        @Override
+        public EmployeesModel createFromParcel(Parcel in) {
+            return new EmployeesModel(in);
+        }
+
+        @Override
+        public EmployeesModel[] newArray(int size) {
+            return new EmployeesModel[size];
+        }
+    };
+
+    public String getEmployeeNames() {
+        return employeeNames;
+    }
+
+    public EmployeesModel setEmployeeNames(String employeeNames) {
+        this.employeeNames = employeeNames;
+        return this;
+    }
+
+    public String getEmployeecode() {
+        return employeecode;
+    }
+
+    public EmployeesModel setEmployeecode(String employeecode) {
+        this.employeecode = employeecode;
+        return this;
+    }
+}

+ 284 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/FlightsModel.java

@@ -0,0 +1,284 @@
+package com.uas.appworks.OA.erp.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.common.data.DateFormatUtil;
+import com.common.data.StringUtil;
+import com.core.app.MyApplication;
+import com.core.utils.TimeUtils;
+import com.uas.appme.R;
+
+
+/**
+ * Created by Bitliker on 2017/1/17.
+ */
+
+public class FlightsModel implements Parcelable {
+    private int id;              //id
+    private String code;//编号
+    private int type;         //类型  1、正常班次(可有排版 可删除)  2.默认班次 (有排版  无删除) 3.自由排班
+    private String name;     //规则名称
+    private int count;         //成员个数
+    private int departments;         //成员个数
+    private String day;    //日期   星期一,星期二
+
+    private FlightsTimeModel timeModel;  //时间,包含最早上班 和总时间 和上班日期
+    private EmployeesModel employeesModel;
+    private EmployeesModel hrorgsModel;
+
+    public FlightsModel() {
+    }
+
+
+    protected FlightsModel(Parcel in) {
+        id = in.readInt();
+        code = in.readString();
+        type = in.readInt();
+        name = in.readString();
+        count = in.readInt();
+        departments = in.readInt();
+        day = in.readString();
+        timeModel = in.readParcelable(FlightsTimeModel.class.getClassLoader());
+        employeesModel = in.readParcelable(EmployeesModel.class.getClassLoader());
+        hrorgsModel = in.readParcelable(EmployeesModel.class.getClassLoader());
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(id);
+        dest.writeString(code);
+        dest.writeInt(type);
+        dest.writeString(name);
+        dest.writeInt(count);
+        dest.writeInt(departments);
+        dest.writeString(day);
+        dest.writeParcelable(timeModel, flags);
+        dest.writeParcelable(employeesModel, flags);
+        dest.writeParcelable(hrorgsModel, flags);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Creator<FlightsModel> CREATOR = new Creator<FlightsModel>() {
+        @Override
+        public FlightsModel createFromParcel(Parcel in) {
+            return new FlightsModel(in);
+        }
+
+        @Override
+        public FlightsModel[] newArray(int size) {
+            return new FlightsModel[size];
+        }
+    };
+
+    public int getDepartments() {
+        return departments;
+    }
+
+    public void setDepartments(int departments) {
+        this.departments = departments;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getCount() {
+        return count;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+
+    public String getDay() {
+        return day;
+    }
+
+    public void setDay(String day) {
+        this.day = day;
+    }
+
+    public FlightsTimeModel getTimeModel() {
+        return timeModel;
+    }
+
+    public void setTimeModel(FlightsTimeModel timeModel) {
+        this.timeModel = timeModel;
+    }
+
+    public EmployeesModel getEmployeesModel() {
+        return employeesModel;
+    }
+
+    public void setEmployeesModel(EmployeesModel employeesModel) {
+        this.employeesModel = employeesModel;
+    }
+
+    public EmployeesModel getHrorgsModel() {
+        return hrorgsModel;
+    }
+
+    public void setHrorgsModel(EmployeesModel hrorgsModel) {
+        this.hrorgsModel = hrorgsModel;
+    }
+
+    /**
+     * 通过转过来的2,3,4转变成周一、
+     *
+     * @return
+     */
+    public String getWeek() {
+        try {
+            if (StringUtil.isEmpty(day)) return "";
+            StringBuilder builder = new StringBuilder("周");
+            String[] d = day.split(",");
+            for (String e : d) {
+                builder.append(getWeek(Integer.valueOf(e)));
+            }
+            StringUtil.removieLast(builder);
+            return builder.toString();
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    public String getWeek(int day) {
+        String str = "";
+        switch (day) {
+            case 1:
+                str = "一";
+                break;
+            case 2:
+                str = "二";
+                break;
+            case 3:
+                str = "三";
+                break;
+            case 4:
+                str = "四";
+                break;
+            case 5:
+                str = "五";
+                break;
+            case 6:
+                str = "六";
+                break;
+            case 7:
+                str = "日";
+                break;
+        }
+        return str + "、";
+    }
+
+    /**
+     * 通过FlightsTimeModel对象判断相关的时间显示
+     *
+     * @return
+     */
+    public String getTime() {
+        StringBuilder builder = new StringBuilder();
+        if (!StringUtil.isEmpty(timeModel.getWd_ondutyone())) {
+            builder.append(timeModel.getWd_ondutyone() + "-" + timeModel.getWd_offdutyone() + " ");
+        }
+        if (!StringUtil.isEmpty(timeModel.getWd_ondutytwo())) {
+            builder.append(timeModel.getWd_ondutytwo() + "-" + timeModel.getWd_offdutytwo() + " ");
+        }
+        if (!StringUtil.isEmpty(timeModel.getWd_ondutythree())) {
+            builder.append(timeModel.getWd_ondutythree() + "-" + timeModel.getWd_offdutythree() + " ");
+        }
+
+        //计算小时
+        float allTime = 0;//分钟
+        try {
+            allTime = getAllTime() / 60;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        float h = allTime / 60f;
+        String hour = float2String(h);
+        builder.append(hour + MyApplication.getInstance().getString(R.string.hour));
+        return builder.toString();
+    }
+
+    // 班次时间显示,不显示总时数
+    public String getTimeTable() {
+        StringBuilder builder = new StringBuilder();
+        if (!StringUtil.isEmpty(timeModel.getWd_ondutyone())) {
+            builder.append(timeModel.getWd_ondutyone() + "-" + timeModel.getWd_offdutyone() + " ");
+        }
+        if (!StringUtil.isEmpty(timeModel.getWd_ondutytwo())) {
+            builder.append(timeModel.getWd_ondutytwo() + "-" + timeModel.getWd_offdutytwo() + " ");
+        }
+        if (!StringUtil.isEmpty(timeModel.getWd_ondutythree())) {
+            builder.append(timeModel.getWd_ondutythree() + "-" + timeModel.getWd_offdutythree() + " ");
+        }
+        return builder.toString();
+    }
+
+    private String float2String(float hour) {
+        if (hour == 0) return "0";
+        String h = String.valueOf(hour);
+        if (!StringUtil.isEmpty(h) && h.length() > 2) {
+            h = h.substring(0, hour < 10 ? 3 : 4);
+        }
+        if (h.indexOf(".") > 0) {
+            //正则表达
+            h = h.replaceAll("0+?$", "");//去掉后面无用的零
+            h = h.replaceAll("[.]$", "");//如小数点后面全是零则去掉小数点
+        }
+        return h;
+    }
+
+    public int getAllTime() throws Exception {
+        int time = 0;
+        if (!StringUtil.isEmpty(timeModel.getWd_ondutyone()) && !StringUtil.isEmpty(timeModel.getWd_offdutyone())) {
+            time += DateFormatUtil.getDifferSS(timeModel.getWd_ondutyone(), timeModel.getWd_offdutyone());
+        }
+        if (!StringUtil.isEmpty(timeModel.getWd_ondutytwo()) && !StringUtil.isEmpty(timeModel.getWd_offdutytwo())) {
+            time += DateFormatUtil.getDifferSS(timeModel.getWd_ondutytwo(), timeModel.getWd_offdutytwo());
+        }
+        if (!StringUtil.isEmpty(timeModel.getWd_ondutythree()) && !StringUtil.isEmpty(timeModel.getWd_offdutythree())) {
+            time += DateFormatUtil.getDifferSS(timeModel.getWd_ondutythree(), timeModel.getWd_offdutythree());
+        }
+        return time;
+    }
+
+    public long getTime(String start, String end) {
+        String startTime = TimeUtils.s_long_2_str(System.currentTimeMillis()) + " " + start + ":00";
+        String endTime = TimeUtils.s_long_2_str(System.currentTimeMillis()) + " " + end + ":00";
+        return TimeUtils.f_str_2_long(endTime) - TimeUtils.f_str_2_long(startTime);
+    }
+}

+ 127 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/FlightsTimeModel.java

@@ -0,0 +1,127 @@
+package com.uas.appworks.OA.erp.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Created by Bitliker on 2017/1/20.
+ */
+
+public class FlightsTimeModel implements Parcelable {
+
+    private String wd_ondutyone;//    开始时间1
+    private String wd_offdutyone;  //   结束时间1
+    private String wd_ondutytwo;  //  开始时间2
+    private String wd_offdutytwo;  //   结束时间2
+    private String wd_ondutythree;   //  开始时间3
+    private String wd_offdutythree;  //   结束时间3
+
+
+    private int earlyTime;//最早时间  小时
+
+    public FlightsTimeModel() {
+
+    }
+
+
+    protected FlightsTimeModel(Parcel in) {
+        wd_ondutyone = in.readString();
+        wd_offdutyone = in.readString();
+        wd_ondutytwo = in.readString();
+        wd_offdutytwo = in.readString();
+        wd_ondutythree = in.readString();
+        wd_offdutythree = in.readString();
+        earlyTime = in.readInt();
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(wd_ondutyone);
+        dest.writeString(wd_offdutyone);
+        dest.writeString(wd_ondutytwo);
+        dest.writeString(wd_offdutytwo);
+        dest.writeString(wd_ondutythree);
+        dest.writeString(wd_offdutythree);
+        dest.writeInt(earlyTime);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Creator<FlightsTimeModel> CREATOR = new Creator<FlightsTimeModel>() {
+        @Override
+        public FlightsTimeModel createFromParcel(Parcel in) {
+            return new FlightsTimeModel(in);
+        }
+
+        @Override
+        public FlightsTimeModel[] newArray(int size) {
+            return new FlightsTimeModel[size];
+        }
+    };
+
+    public String getWd_ondutyone() {
+        return wd_ondutyone;
+    }
+
+    public void setWd_ondutyone(String wd_ondutyone) {
+        this.wd_ondutyone = wd_ondutyone;
+    }
+
+    public String getWd_offdutyone() {
+        return wd_offdutyone;
+    }
+
+    public void setWd_offdutyone(String wd_offdutyone) {
+        this.wd_offdutyone = wd_offdutyone;
+    }
+
+    public String getWd_ondutytwo() {
+        return wd_ondutytwo;
+    }
+
+    public void setWd_ondutytwo(String wd_ondutytwo) {
+        this.wd_ondutytwo = wd_ondutytwo;
+    }
+
+    public String getWd_offdutytwo() {
+        return wd_offdutytwo;
+    }
+
+    public void setWd_offdutytwo(String wd_offdutytwo) {
+        this.wd_offdutytwo = wd_offdutytwo;
+    }
+
+    public String getWd_ondutythree() {
+        return wd_ondutythree;
+    }
+
+    public void setWd_ondutythree(String wd_ondutythree) {
+        this.wd_ondutythree = wd_ondutythree;
+    }
+
+    public String getWd_offdutythree() {
+        return wd_offdutythree;
+    }
+
+    public void setWd_offdutythree(String wd_offdutythree) {
+        this.wd_offdutythree = wd_offdutythree;
+    }
+
+
+
+    public int getEarlyTime() {
+        return earlyTime;
+    }
+
+
+
+    public void setEarlyTime(int earlyTime) {
+        this.earlyTime = earlyTime;
+    }
+
+
+
+}

+ 57 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/HrorgsModel.java

@@ -0,0 +1,57 @@
+package com.uas.appworks.OA.erp.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Created by Bitliker on 2017/2/8.
+ */
+
+public class HrorgsModel extends BaseNodeBean implements Parcelable {
+    private String code;
+
+    public HrorgsModel(int id, int pId, String name, String code) {
+        super(id, pId, name);
+        this.code = code;
+    }
+
+
+    protected HrorgsModel(Parcel in) {
+        super(in.readInt(), in.readInt(), in.readString());
+        code = in.readString();
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(id);
+        dest.writeInt(pId);
+        dest.writeString(name);
+        dest.writeString(code);
+
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Creator<HrorgsModel> CREATOR = new Creator<HrorgsModel>() {
+        @Override
+        public HrorgsModel createFromParcel(Parcel in) {
+            return new HrorgsModel(in);
+        }
+
+        @Override
+        public HrorgsModel[] newArray(int size) {
+            return new HrorgsModel[size];
+        }
+    };
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+}

+ 148 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/SelectCollisionTurnBean.java

@@ -0,0 +1,148 @@
+package com.uas.appworks.OA.erp.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.core.app.MyApplication;
+import com.uas.appme.R;
+
+import java.util.List;
+
+/**
+ * Created by Bitliker on 2017/4/17.
+ */
+
+public class SelectCollisionTurnBean implements Parcelable {
+
+    private String title;//标题
+    private String sureText = MyApplication.getInstance().getString(R.string.common_sure);//选择按钮显示
+    private String selectType = MyApplication.getInstance().getString(R.string.personnel);//提示选择的类型
+    private boolean reBackSelect = true;//是否返回选中人员,否返回非选中人员
+    private String selectCode;//选中的人员Code
+    private int resultCode = 0x20;//返回的code
+    private boolean singleAble = false;//是否单选
+    private List<SelectEmUser> selectList;
+    
+
+    public SelectCollisionTurnBean() {
+
+    }
+
+
+    protected SelectCollisionTurnBean(Parcel in) {
+        title = in.readString();
+        sureText = in.readString();
+        selectType = in.readString();
+        reBackSelect = in.readByte() != 0;
+        selectCode = in.readString();
+        resultCode = in.readInt();
+        singleAble = in.readByte() != 0;
+        selectList = in.createTypedArrayList(SelectEmUser.CREATOR);
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(title);
+        dest.writeString(sureText);
+        dest.writeString(selectType);
+        dest.writeByte((byte) (reBackSelect ? 1 : 0));
+        dest.writeString(selectCode);
+        dest.writeInt(resultCode);
+        dest.writeByte((byte) (singleAble ? 1 : 0));
+        dest.writeTypedList(selectList);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Creator<SelectCollisionTurnBean> CREATOR = new Creator<SelectCollisionTurnBean>() {
+        @Override
+        public SelectCollisionTurnBean createFromParcel(Parcel in) {
+            return new SelectCollisionTurnBean(in);
+        }
+
+        @Override
+        public SelectCollisionTurnBean[] newArray(int size) {
+            return new SelectCollisionTurnBean[size];
+        }
+    };
+
+    public String getTitle() {
+        return title==null?"":title;
+    }
+
+
+    public String getSureText() {
+        return sureText;
+    }
+
+
+    public String getSelectType() {
+        return selectType;
+    }
+
+    public boolean isReBackSelect() {
+        return reBackSelect;
+    }
+
+
+    public String getSelectCode() {
+        return selectCode;
+    }
+
+
+    public int getResultCode() {
+        return resultCode;
+    }
+
+
+    public boolean isSingleAble() {
+        return singleAble;
+    }
+
+    public List<SelectEmUser> getSelectList() {
+        return selectList;
+    }
+
+    public SelectCollisionTurnBean setSingleAble(boolean singleAble) {
+        this.singleAble = singleAble;
+        return this;
+    }
+
+    public SelectCollisionTurnBean setResultCode(int resultCode) {
+        this.resultCode = resultCode;
+        return this;
+    }
+
+    public SelectCollisionTurnBean setSelectCode(String selectCode) {
+        this.selectCode = selectCode;
+        return this;
+    }
+
+    public SelectCollisionTurnBean setReBackSelect(boolean reBackSelect) {
+        this.reBackSelect = reBackSelect;
+        return this;
+    }
+
+    public SelectCollisionTurnBean setSelectType(String selectType) {
+        this.selectType = selectType;
+        return this;
+    }
+
+    public SelectCollisionTurnBean setSureText(String sureText) {
+        this.sureText = sureText;
+        return this;
+    }
+
+    public SelectCollisionTurnBean setTitle(String title) {
+        this.title = title;
+        return this;
+    }
+
+    public SelectCollisionTurnBean setSelectList(List<SelectEmUser> selectList) {
+        this.selectList = selectList;
+        return this;
+    }
+}

+ 174 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/SelectEmUser.java

@@ -0,0 +1,174 @@
+package com.uas.appworks.OA.erp.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.common.LogUtil;
+import com.core.model.EmployeesEntity;
+
+/**
+ * 通用选择员工和选择部门通用实体类
+ * Created by Bitliker on 2017/2/14.
+ */
+
+public class SelectEmUser implements Parcelable {
+
+    private int imId;       //imid,员工时候存在
+    private int emId;       //emId,员工时候存在
+    private int defaultorid;//部门id
+    private int number;     //部门人员数量
+
+    private String emCode;  //emcode(人员编号,部门编号)
+    private String emName;  //名字
+    private String position;//职位
+    private String depart;//部门名称
+
+    private String tag;//标记,如班次名称(当tag==“1”的时候表示是自己好友)
+
+    private boolean isClick;//是否点击了
+
+    public SelectEmUser() {
+    }
+
+    public SelectEmUser(EmployeesEntity e) {
+        setDefaultorid(e.getEm_defaultorid());
+        setDepart(e.getEM_DEPART());
+        setEmName(e.getEM_NAME());
+        setImId(e.getEm_IMID());
+        setEmCode(e.getEM_CODE());
+        setPosition(e.getEM_POSITION());
+        setEmId(e.getEM_ID());
+        LogUtil.i("getDefaultorid="+getDefaultorid());
+        LogUtil.i("getDepart="+getDepart());
+        LogUtil.i("getEmName="+getEmName());
+        LogUtil.i("getImId="+getImId());
+        LogUtil.i("getEmCode="+getEmCode());
+        LogUtil.i("getPosition="+getPosition());
+        LogUtil.i("getEmId="+getEmId());
+    }
+
+
+    protected SelectEmUser(Parcel in) {
+        imId = in.readInt();
+        emId = in.readInt();
+        defaultorid = in.readInt();
+        number = in.readInt();
+        emCode = in.readString();
+        emName = in.readString();
+        position = in.readString();
+        depart = in.readString();
+        tag = in.readString();
+        isClick = in.readByte() != 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(imId);
+        dest.writeInt(emId);
+        dest.writeInt(defaultorid);
+        dest.writeInt(number);
+        dest.writeString(emCode);
+        dest.writeString(emName);
+        dest.writeString(position);
+        dest.writeString(depart);
+        dest.writeString(tag);
+        dest.writeByte((byte) (isClick ? 1 : 0));
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Creator<SelectEmUser> CREATOR = new Creator<SelectEmUser>() {
+        @Override
+        public SelectEmUser createFromParcel(Parcel in) {
+            return new SelectEmUser(in);
+        }
+
+        @Override
+        public SelectEmUser[] newArray(int size) {
+            return new SelectEmUser[size];
+        }
+    };
+
+    public int getImId() {
+        return imId;
+    }
+
+    public void setImId(int imId) {
+        this.imId = imId;
+    }
+
+    public int getEmId() {
+        return emId;
+    }
+
+    public void setEmId(int emId) {
+        this.emId = emId;
+    }
+
+    public int getDefaultorid() {
+        return defaultorid;
+    }
+
+    public void setDefaultorid(int defaultorid) {
+        this.defaultorid = defaultorid;
+    }
+
+    public int getNumber() {
+        return number;
+    }
+
+    public void setNumber(int number) {
+        this.number = number;
+    }
+
+    public String getEmCode() {
+        return emCode;
+    }
+
+    public void setEmCode(String emCode) {
+        this.emCode = emCode;
+    }
+
+    public String getEmName() {
+        return emName;
+    }
+
+    public void setEmName(String emName) {
+        this.emName = emName;
+    }
+
+    public String getPosition() {
+        return position;
+    }
+
+    public void setPosition(String position) {
+        this.position = position;
+    }
+
+    public String getDepart() {
+        return depart;
+    }
+
+    public void setDepart(String depart) {
+        this.depart = depart;
+    }
+
+    public String getTag() {
+        return tag;
+    }
+
+    public void setTag(String tag) {
+        this.tag = tag;
+    }
+
+    public boolean isClick() {
+        return isClick;
+    }
+
+    public void setClick(boolean click) {
+        isClick = click;
+    }
+}

+ 546 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/presenter/AddFlihtsPresenter.java

@@ -0,0 +1,546 @@
+package com.uas.appworks.OA.erp.presenter;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.common.data.JSONUtil;
+import com.common.data.ListUtils;
+import com.common.data.StringUtil;
+import com.core.api.wxapi.ApiConfig;
+import com.core.api.wxapi.ApiPlatform;
+import com.core.api.wxapi.ApiUtils;
+import com.core.app.MyApplication;
+import com.core.constant.OAConfig;
+import com.core.net.http.http.OAHttpHelper;
+import com.core.net.http.http.OnHttpResultListener;
+import com.core.net.http.http.Request;
+import com.core.utils.CommonUtil;
+import com.core.utils.TimeUtils;
+import com.uas.appme.R;
+import com.uas.appworks.OA.erp.model.EmployeesModel;
+import com.uas.appworks.OA.erp.model.FlightsModel;
+import com.uas.appworks.OA.erp.model.FlightsTimeModel;
+import com.uas.appworks.OA.erp.model.HrorgsModel;
+import com.uas.appworks.OA.erp.model.SelectEmUser;
+import com.uas.appworks.OA.erp.view.IAddFlihtsView;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by Bitliker on 2017/2/9.
+ */
+
+public class AddFlihtsPresenter implements OnHttpResultListener {
+    private final int SUBMIT = 0x11;
+    private final int MAN_DEFAULTOR = 0x12;
+    private FlightsModel model = null;//唯一模型
+    boolean isUpdate = false;//判断是否是更新,不然是保存
+
+    private IAddFlihtsView iAddFlihtsView;
+    private int conuInDefaultor = 0;
+    private boolean isB2b;
+
+    public AddFlihtsPresenter(IAddFlihtsView iAddFlihtsView) {
+        this.iAddFlihtsView = iAddFlihtsView;
+    }
+
+    public void start(Intent intent) {
+        isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        model = intent.getParcelableExtra("data");
+        isUpdate = intent.getBooleanExtra("isUpdate", false);
+        String title = null;
+        if (model == null) {
+            title = MyApplication.getInstance().getString(R.string.add_flihts);
+            model = new FlightsModel();
+        } else {
+            title = MyApplication.getInstance().getString(R.string.edit_flihts);
+            if (model.getEmployeesModel() != null)
+                iAddFlihtsView.updateMunber(model.getEmployeesModel().getEmployeeNames());
+            if (model.getHrorgsModel() != null)
+                iAddFlihtsView.updateDepartment(model.getHrorgsModel().getEmployeeNames());
+            String time = model.getTime();
+            String date = model.getWeek();
+            iAddFlihtsView.updateDate(date, isUpdate);
+            iAddFlihtsView.updateTime(time);
+            iAddFlihtsView.updateName(model.getName());
+            iAddFlihtsView.setClickAble(!(MyApplication.getInstance().getString(R.string.default_work).equals(model.getName()) || model.getType() == 2));
+            iAddFlihtsView.isB2b(isB2b);
+        }
+        iAddFlihtsView.setTitle(title);
+    }
+
+    public void submit(String name) {
+        name = StringUtil.toHttpString(name);
+        name = name.replace("\n", "").replace(" ", "").replace("%", "");
+        if (StringUtil.isEmpty(name)) {
+            iAddFlihtsView.showToast(R.string.not_allowed_name, R.color.load_warning);
+            return;
+        }
+        Map<String, Object> param = new HashMap<>();
+        param.put("caller", "WorkDate");
+        Map<String, Object> formStore = new HashMap<>();
+        //id和code
+        if (model != null && model.getId() != 0)
+            formStore.put("wd_id", model.getId());
+        else formStore.put("wd_id", "");
+        if (model != null && !StringUtil.isEmpty(model.getCode()))
+            formStore.put("wd_code", model.getCode());
+        else formStore.put("wd_code", "");
+        //班次名称
+        formStore.put("wd_name", name);
+        //TODO 人数
+        //录入时间
+        if (isB2b)
+            formStore.put("wd_recorddate", TimeUtils.f_long_2_str(System.currentTimeMillis()));
+        else if (!isUpdate)
+            formStore.put("wd_recorddate", TimeUtils.f_long_2_str(System.currentTimeMillis()));
+
+        //考勤时间
+        FlightsTimeModel timeModel = model.getTimeModel();
+        if (timeModel != null) {
+            formStore.put("wd_ondutyone", timeModel.getWd_ondutyone());
+            formStore.put("wd_offdutyone", timeModel.getWd_offdutyone());
+            formStore.put("wd_ondutytwo", timeModel.getWd_ondutytwo());
+            formStore.put("wd_offdutytwo", timeModel.getWd_offdutytwo());
+            formStore.put("wd_ondutythree", timeModel.getWd_ondutythree());
+            formStore.put("wd_offdutythree", timeModel.getWd_offdutythree());
+            formStore.put("wd_earlytime", timeModel.getEarlyTime());
+            int degree = 0;
+            if (!StringUtil.isEmpty(timeModel.getWd_ondutyone()))
+                degree++;
+            if (!StringUtil.isEmpty(timeModel.getWd_ondutytwo()))
+                degree++;
+            if (!StringUtil.isEmpty(timeModel.getWd_ondutythree()))
+                degree++;
+            formStore.put("wd_degree", degree);
+        } else {
+            iAddFlihtsView.showToast(R.string.not_null_work_time, R.color.load_error);
+            return;
+        }
+        if (!isUpdate) {
+            if (!StringUtil.isEmpty(model.getDay())) {
+                formStore.put("wd_day", model.getDay());
+            } else {
+                iAddFlihtsView.showToast(R.string.not_null_work_day, R.color.load_error);
+                return;
+            }
+        } else {
+            formStore.put("wd_day", model.getDay());
+        }
+
+        //start 人员数据
+        EmployeesModel employeesModel = model.getEmployeesModel();
+        String employeesName;
+        String employeesCode;
+        int employNumber = 0;
+        if (employeesModel != null) {
+            if (StringUtil.isEmpty(employeesModel.getEmployeecode()))
+                employeesCode = "";
+            else {
+                employeesCode = employeesModel.getEmployeecode();
+                employNumber = employeesModel.getEmployeecode().split(",").length;
+            }
+            employeesName = StringUtil.isEmpty(employeesModel.getEmployeeNames()) ? "" : employeesModel.getEmployeeNames();
+        } else {
+            employeesName = "";
+            employeesCode = "";
+        }
+        formStore.put("wd_pcount", conuInDefaultor + employNumber);
+        formStore.put("wd_emcode", getNameOrCodeAdd(employeesCode));
+        formStore.put("wd_man", getNameOrCodeAdd(employeesName));
+        //end 人员数据
+
+        //处理部门数据
+        EmployeesModel hrorgsModel = model.getHrorgsModel();
+        String hrorgsName;
+        String hrorgsCode;
+        if (hrorgsModel != null) {
+            hrorgsCode = StringUtil.isEmpty(hrorgsModel.getEmployeecode()) ? "" : hrorgsModel.getEmployeecode();
+            hrorgsName = StringUtil.isEmpty(hrorgsModel.getEmployeeNames()) ? "" : hrorgsModel.getEmployeeNames();
+        } else {
+            hrorgsName = "";
+            hrorgsCode = "";
+        }
+        if (isB2b) {
+            formStore.put("enuu", CommonUtil.getSharedPreferences(MyApplication.getInstance().getApplicationContext(), "companyEnUu"));
+            formStore.put("emcode", CommonUtil.getSharedPreferences(MyApplication.getInstance().getApplicationContext(), "b2b_uu"));
+        }
+        formStore.put("wd_defaultorcode", getNameOrCodeAdd(hrorgsCode));
+        formStore.put("wd_defaultor", getNameOrCodeAdd(hrorgsName));
+        //end 部门
+        param.put("formStore", JSONUtil.map2JSON(formStore));
+        Bundle bundle = new Bundle();
+        bundle.putString("name", name);
+        iAddFlihtsView.showLoading();
+        String action = isUpdate ? "mobile/updateWorkDate.action" : "mobile/saveWorkDate.action";
+
+        String url = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().saveWorkData : action;
+        Request request = new Request.Bulider()
+                .setWhat(SUBMIT)
+                .setBundle(bundle)
+                .setMode(Request.Mode.POST)
+                .setUrl(url)
+                .setParam(param)
+                .bulid();
+        OAHttpHelper.getInstance().requestHttp(request, this);
+
+    }
+
+
+    public void loadManAndDefaultor(String manCode, String defaultorCode) {
+        Bundle bundle = null;
+        String url = "mobile/getManAndDefaultor.action";
+        Map<String, Object> param = new HashMap<>();
+        Map<String, Object> formStore = new HashMap<>();
+        formStore.put("wd_emcode", StringUtil.isEmpty(manCode) ? "" : manCode.replaceAll("\'", ""));
+        formStore.put("wd_defaultorcode", StringUtil.isEmpty(defaultorCode) ? "" : defaultorCode.replaceAll("\'", ""));
+        param.put("formStore", JSONUtil.map2JSON(formStore));
+        Request request = new Request.Bulider()
+                .setWhat(MAN_DEFAULTOR)
+                .setBundle(bundle)
+                .setMode(Request.Mode.POST)
+                .setUrl(url)
+                .setParam(param)
+                .bulid();
+        OAHttpHelper.getInstance().requestHttp(request, this);
+    }
+
+    public void saveTime(Intent data) {
+        FlightsTimeModel timeModel = data.getParcelableExtra("data");
+        model.setTimeModel(timeModel);
+        String time = model.getTime();
+        iAddFlihtsView.updateTime(time);
+    }
+
+    public void saveDate(Intent data) {
+        String days = data.getStringExtra("data");
+        model.setDay(days);
+        iAddFlihtsView.updateDate(model.getWeek(), isUpdate);
+    }
+
+    private String hrorgsCode = "";
+    private String employeesCode = "";
+
+    public void saveHrorgs(Intent data) {
+        List<HrorgsModel> hrorgsList = data.getParcelableArrayListExtra("data");
+        conuInDefaultor = data.getIntExtra("number", 0);
+        String hrorgsName = getHrorgs(hrorgsList, true);
+        hrorgsCode = getHrorgs(hrorgsList, false);
+        EmployeesModel hrorgs = new EmployeesModel();
+        hrorgs.setEmployeecode(hrorgsCode);
+        hrorgs.setEmployeeNames(hrorgsName);
+        model.setHrorgsModel(hrorgs);
+        iAddFlihtsView.updateDepartment(hrorgsName);
+        loadManAndDefaultor(employeesCode, hrorgsCode);
+    }
+
+    public void saveEmployees(Intent data) {
+        List<SelectEmUser> employeesList = data.getParcelableArrayListExtra("data");
+        String employeesName = getMumber(employeesList, true);
+        employeesCode = getMumber(employeesList, false);
+        EmployeesModel employees = new EmployeesModel();
+        employees.setEmployeeNames(employeesName);
+        employees.setEmployeecode(employeesCode);
+        model.setEmployeesModel(employees);
+        iAddFlihtsView.updateMunber(employeesName);
+        loadManAndDefaultor(employeesCode, hrorgsCode);
+    }
+
+
+    /**
+     * 选择冲突人员
+     *
+     * @param data
+     */
+    public void saveCollisionEmployees(Intent data) {
+        List<SelectEmUser> employeesList = data.getParcelableArrayListExtra("data");
+        handlerCollision(true, employeesList);
+    }
+
+    /**
+     * 选择冲突部门
+     *
+     * @param data
+     */
+    public void saveCollisionDepartment(Intent data) {
+        List<SelectEmUser> employeesList = data.getParcelableArrayListExtra("data");
+        handlerCollision(false, employeesList);
+    }
+
+    /**
+     * 处理去除冲突人员后数据
+     *
+     * @param isEmployees
+     * @param notSelect
+     */
+    private void handlerCollision(boolean isEmployees, List<SelectEmUser> notSelect) {
+        if (ListUtils.isEmpty(notSelect)) return;
+        EmployeesModel bean = isEmployees ? model.getEmployeesModel() : model.getHrorgsModel();
+        StringBuilder noSelectEmCodeBuilder = new StringBuilder();
+        StringBuilder noSelectEmNameBuilder = new StringBuilder();
+        for (SelectEmUser e : notSelect) {
+            noSelectEmCodeBuilder.append(e.getEmCode() + ",");
+            noSelectEmNameBuilder.append(e.getEmName() + ",");
+        }
+        String noSelectEmCode = noSelectEmCodeBuilder.toString();
+        String noSelectEmName = noSelectEmNameBuilder.toString();
+        if (bean != null) {
+            String names = bean.getEmployeeNames();
+            if (!StringUtil.isEmpty(names)) {
+                String emName = getNameOrCodeByCollision(names, noSelectEmName);
+                bean.setEmployeeNames(emName);
+                if (isEmployees)
+                    iAddFlihtsView.updateMunber(emName);
+                else
+                    iAddFlihtsView.updateDepartment(emName);
+            }
+            String codes = bean.getEmployeecode();
+            if (!StringUtil.isEmpty(codes)) {
+                String emCode = getNameOrCodeByCollision(codes, noSelectEmCode);
+                if (isEmployees)
+                    employeesCode = emCode;
+                else
+                    hrorgsCode = emCode;
+                bean.setEmployeecode(emCode);
+            }
+            if (isEmployees)
+                model.setEmployeesModel(bean);
+            else
+                model.setHrorgsModel(bean);
+        }
+        loadManAndDefaultor(employeesCode, hrorgsCode);
+    }
+
+
+    private StringBuilder removieLast(StringBuilder b) {
+        try {
+            if (b.length() > 1)
+                b.deleteCharAt(b.length() - 1);
+        } catch (StringIndexOutOfBoundsException e) {
+            Log.i("gongpengming", "removieLast" + e.getMessage());
+        }
+        return b;
+    }
+
+
+    private String getNameOrCodeByCollision(String names, String text) {
+        if (!StringUtil.isEmpty(names)) {
+            StringBuilder namBbuilder = new StringBuilder();
+            String[] aas = names.replace("\'", "").split(",");
+            if (aas != null && aas.length > 0) {
+                for (int i = 0; i < aas.length; i++) {
+                    if (!StringUtil.isInclude(text, aas[i]))
+                        namBbuilder.append(aas[i] + ",");
+                }
+            }
+            return removieLast(namBbuilder).toString();
+        }
+        return null;
+    }
+
+    private String getMumber(List<SelectEmUser> employeesList, boolean isName) {
+        if (!ListUtils.isEmpty(employeesList)) {
+            StringBuilder employee = new StringBuilder();
+            for (int i = 0; i < employeesList.size(); i++) {
+                employee.append("\'" + (isName ? employeesList.get(i).getEmName()
+                        : employeesList.get(i).getEmCode()) + "\'" + ",");
+            }
+            removieLast(employee);
+            return employee.toString();
+        }
+        return "";
+    }
+
+    /**
+     * 通过HrorgsModel列表获取对象
+     *
+     * @param hrorgsList
+     * @param isName     是否是获取名字  否则获取编号
+     * @return
+     */
+    private String getHrorgs(List<HrorgsModel> hrorgsList, boolean isName) {
+        if (!ListUtils.isEmpty(hrorgsList)) {
+            StringBuilder hrorgs = new StringBuilder();
+            for (int i = 0; i < hrorgsList.size(); i++) {
+                hrorgs.append("\'" + (isName ? hrorgsList.get(i).getName() : hrorgsList.get(i).getCode()) + "\'" + ",");
+            }
+            removieLast(hrorgs);
+            return hrorgs.toString();
+        }
+        return "";
+    }
+
+
+    @Override
+    public void result(int what, boolean isJSON, String message, Bundle bundle) {
+        if (!isJSON) {
+            //TODO 返回错误
+            return;
+        }
+        JSONObject object = JSON.parseObject(message);
+        switch (what) {
+            case SUBMIT:
+                iAddFlihtsView.dimssLoading();
+                if (model == null)
+                    model = new FlightsModel();
+                String name = null;
+                if (bundle != null) {
+                    name = bundle.getString("name");
+                }
+                model.setName(StringUtil.isEmpty(name) ? "" : name);
+                model.setType(1);
+                int id = JSONUtil.getInt(object, "id");
+                if (id != 0)
+                    model.setId(id);
+                iAddFlihtsView.endActivity(model, isUpdate);
+                break;
+            case MAN_DEFAULTOR://冲突部门和人员
+                handlerManAndDefaultir(object);
+                break;
+
+        }
+    }
+
+
+    @Override
+    public void error(int what, String message, Bundle bundle) {
+        iAddFlihtsView.dimssLoading();
+        if (!StringUtil.isEmpty(message))
+            iAddFlihtsView.showToast(message, R.color.load_error);
+    }
+
+    private void handlerManAndDefaultir(JSONObject object) {
+        if (!object.containsKey("listdata")) return;
+        JSONArray array = object.getJSONArray("listdata");
+        if (!ListUtils.isEmpty(array)) {
+            JSONObject man = array.getJSONObject(0);
+            if (man.containsKey("man")) {
+                handlerMan(man.getJSONArray("man"));
+            } else if (man.containsKey("defaultor")) {
+                handlerDefaultor(man.getJSONArray("defaultor"));
+            }
+        }
+
+        if (array.size() > 1) {
+            JSONObject defaultor = array.getJSONObject(1);
+            if (defaultor.containsKey("defaultor")) {
+                handlerDefaultor(defaultor.getJSONArray("defaultor"));
+            } else if (defaultor.containsKey("man")) {
+                handlerMan(defaultor.getJSONArray("man"));
+            }
+        }
+    }
+
+    private void handlerMan(JSONArray array) {
+        if (ListUtils.isEmpty(array)) {
+            iAddFlihtsView.showCollisionMan(null);
+            return;
+        }
+        SelectEmUser user = null;
+        JSONObject o = null;
+        ArrayList<SelectEmUser> chche = new ArrayList<>();
+        for (int i = 0; i < array.size(); i++) {
+            o = array.getJSONObject(i);
+            if (o.containsKey("workdatename") && !StringUtil.isEmpty(o.getString("workdatename"))
+                    && o.containsKey("em_name") && !StringUtil.isEmpty(o.getString("em_name"))) {
+                String workdatecode = o.getString("workdatecode");
+                if (isUpdate && model != null && !StringUtil.isEmpty(model.getCode()) && !StringUtil.isEmpty(workdatecode) && model.getCode().equals(workdatecode)) {
+                    continue;
+                }
+                user = new SelectEmUser();
+                user.setClick(true);
+                user.setDepart(o.getString("em_defaultorname"));
+                user.setPosition(o.getString("em_position"));
+                user.setEmName(o.getString("em_name"));
+                user.setEmCode(o.getString("ew_emcode"));
+                user.setTag(o.getString("workdatename"));
+                user.setImId(0);
+                chche.add(user);
+            }
+        }
+
+        iAddFlihtsView.showCollisionMan(chche);
+    }
+
+    private void handlerDefaultor(JSONArray array) {
+        if (ListUtils.isEmpty(array)) {
+            iAddFlihtsView.showCollisionDefaultir(null);
+            return;
+        }
+        SelectEmUser user = null;
+        JSONObject o = null;
+        ArrayList<SelectEmUser> chche = new ArrayList<>();
+        for (int i = 0; i < array.size(); i++) {
+            o = array.getJSONObject(i);
+            String workdatecode =JSONUtil.getText(o, "workdatescode");
+            if (!StringUtil.isEmpty(workdatecode) && !StringUtil.isEmpty(JSONUtil.getText(o, "workdatesname")) && !StringUtil.isEmpty(JSONUtil.getText(o, "conflictem_defaultorcode"))) {
+                if (isUpdate && model != null && !StringUtil.isEmpty(model.getCode()) && model.getCode().equals(workdatecode)) {
+                    continue;
+                }
+                user = new SelectEmUser();
+                user.setClick(true);
+                user.setNumber(o.getInteger("defaultormancount"));
+                user.setEmName(o.getString("conflictem_defaultorname"));
+                user.setEmCode(o.getString("conflictem_defaultorcode"));
+                user.setTag(o.getString("workdatesname"));
+                user.setImId(0);
+                chche.add(user);
+
+            }
+        }
+        iAddFlihtsView.showCollisionDefaultir(chche);
+    }
+
+    private String getNameOrCodeAdd(String name) {
+        try {
+            if (StringUtil.isEmpty(name)) return "";
+            name = name.replaceAll("\'", "");
+            String[] names = name.split(",");
+            StringBuilder builder = new StringBuilder();
+            for (String e : names) {
+                builder.append("\'" + e + "\'" + ",");
+            }
+            StringUtil.removieLast(builder);
+            return builder.toString();
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    public void putData2Intent(int id, Intent intent) {
+        switch (id) {
+            case R.id.date_tv:
+                String day = model.getDay();
+                Log.i("gongpengming", "day=" + day);
+                intent.putExtra("day", day);
+                break;
+            case R.id.time_tv:
+                FlightsTimeModel timeModel = model.getTimeModel();
+                intent.putExtra("model", timeModel);
+                break;
+            case R.id.munber_tv:
+                EmployeesModel employeesModel = model.getEmployeesModel();
+                intent.putExtra(OAConfig.STRING_DATA, employeesModel.getEmployeeNames());
+                break;
+        }
+    }
+
+    public String getEmployeeEmCode() {
+        if (model == null) return "";
+        if (model.getEmployeesModel() == null) return "";
+        return model.getEmployeesModel().getEmployeecode();
+    }
+
+    public String getHrorgsEmCode() {
+        if (model == null) return "";
+        if (model.getHrorgsModel() == null) return "";
+        return model.getHrorgsModel().getEmployeeNames();
+    }
+}

+ 310 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/presenter/FlightsPresernter.java

@@ -0,0 +1,310 @@
+package com.uas.appworks.OA.erp.presenter;
+
+import android.os.Bundle;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.common.data.JSONUtil;
+import com.common.data.ListUtils;
+import com.common.data.StringUtil;
+import com.core.api.wxapi.ApiConfig;
+import com.core.api.wxapi.ApiPlatform;
+import com.core.api.wxapi.ApiUtils;
+import com.core.app.MyApplication;
+import com.core.net.http.http.OAHttpHelper;
+import com.core.net.http.http.OnHttpResultListener;
+import com.core.net.http.http.Request;
+import com.core.utils.CommonUtil;
+import com.uas.appme.R;
+import com.uas.appworks.OA.erp.model.EmployeesModel;
+import com.uas.appworks.OA.erp.model.FlightsModel;
+import com.uas.appworks.OA.erp.model.FlightsTimeModel;
+import com.uas.appworks.OA.erp.view.IFlightsView;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.alibaba.fastjson.JSON.parseObject;
+
+/**
+ * Created by Bitliker on 2017/1/16.
+ */
+
+public class FlightsPresernter implements OnHttpResultListener {
+
+    private final int WORK_DATA = 0x11;
+    private final int WORK_DELETE = 0x12;
+    private IFlightsView iFlightsView;
+    private boolean isB2b;
+
+    public FlightsPresernter(IFlightsView iFlightsView) {
+        this.iFlightsView = iFlightsView;
+    }
+
+    public void start() {
+        isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+        loadDate();
+    }
+
+    private void loadDate() {
+        if (!MyApplication.getInstance().isNetworkActive()) {
+            showToast(R.string.networks_out, R.color.load_error);
+            return;
+        }
+        showLoading();
+        Map<String, Object> param = new HashMap<>();
+        param.put("emcode", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username"));
+        Bundle bundle = null;
+        String url = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().getAllWorkData :
+                "mobile/getAllWorkDate.action";
+        Request request = new Request.Bulider()
+                .setUrl(url)
+                .setBundle(bundle)
+                .setMode(Request.Mode.GET)
+                .setWhat(WORK_DATA)
+                .setParam(param).bulid();
+        OAHttpHelper.getInstance().requestHttp(request, this);
+
+    }
+
+    public void deleteWork(List<FlightsModel> models, int position) {
+        if (!MyApplication.getInstance().isNetworkActive()) {
+            showToast(R.string.networks_out, R.color.load_error);
+            return;
+        }
+        if (ListUtils.isEmpty(models)) return;
+        FlightsModel model = null;
+        try {
+            model = models.get(position);
+        } catch (IndexOutOfBoundsException e) {
+            return;
+        }
+        showLoading();
+        Map<String, Object> param = new HashMap<>();
+        param.put("caller", "WorkDate");
+        param.put("wdcode", model.getCode());
+        param.put("wd_id", model.getId());
+        Bundle bundle = new Bundle();
+        bundle.putInt("position", position);
+        String url = "mobile/deleteWorkDate.action";
+        Request request = new Request.Bulider()
+                .setUrl(url)
+                .setBundle(bundle)
+                .setMode(Request.Mode.GET)
+                .setWhat(WORK_DELETE)
+                .setParam(param).bulid();
+        OAHttpHelper.getInstance().requestHttp(request, this);
+
+    }
+
+    private void showLoading() {
+        if (iFlightsView != null) iFlightsView.showLoading();
+    }
+
+    private void dimssLoading() {
+        if (iFlightsView != null) iFlightsView.dimssLoading();
+    }
+
+    private void showToast(String message, int colorId) {
+        if (iFlightsView != null) iFlightsView.showToast(message, colorId);
+    }
+
+    private void showToast(int reId, int colorId) {
+        if (iFlightsView != null) iFlightsView.showToast(reId, colorId);
+    }
+
+    @Override
+    public void result(int what, boolean isJSON, String message, Bundle bundle) {
+        switch (what) {
+            case WORK_DATA:
+                if (isB2b) {
+                    JSONObject object = JSON.parseObject(message).getJSONObject("data");
+                    handlerWorkByB2b(object);
+                } else {
+                    JSONArray array = parseObject(message).getJSONArray("listdata");
+                    handlerWork(array);
+                }
+                break;
+            case WORK_DELETE:
+                dimssLoading();
+                int position = bundle.getInt("position");
+                iFlightsView.deleteModel(position);
+                break;
+        }
+    }
+
+
+    @Override
+    public void error(int what, String message, Bundle bundle) {
+        dimssLoading();
+    }
+
+    private void handlerWork(JSONArray array) {
+        if (ListUtils.isEmpty(array)) {
+            iFlightsView.dimssLoading();
+            iFlightsView.showModel(new ArrayList<FlightsModel>());
+            return;
+        }
+        JSONObject object = null;
+        List<FlightsModel> models = new ArrayList<>();
+        for (int i = 0; i < array.size(); i++) {
+            object = array.getJSONObject(i);
+            if (object.containsKey("ifDefaultClass") && object.getBoolean("ifDefaultClass"))
+                models.add(0, handlerDefFlights(object));
+            else
+                models.add(handlerFlights(object));
+        }
+        iFlightsView.dimssLoading();
+        iFlightsView.showModel(models);
+    }
+
+
+    private void handlerWorkByB2b(JSONObject object) {
+        List<FlightsModel> models = new ArrayList<>();
+        models.add(handlerFlights(object));
+        iFlightsView.dimssLoading();
+        iFlightsView.showModel(models);
+    }
+
+    /**
+     * 处理正常班次
+     *
+     * @param object
+     * @return
+     */
+    private FlightsModel handlerFlights(JSONObject object) {
+        FlightsModel model = new FlightsModel();
+        FlightsTimeModel timeModel = new FlightsTimeModel();
+        EmployeesModel employeesModel = new EmployeesModel();
+        EmployeesModel hrorgsModel = new EmployeesModel();
+        timeModel.setEarlyTime(JSONUtil.getInt(object, "wd_earlytime"));
+        timeModel.setWd_ondutyone(JSONUtil.getText(object, "wd_ondutyone"));
+        timeModel.setWd_offdutyone(JSONUtil.getText(object, "wd_offdutyone"));
+        timeModel.setWd_ondutytwo(JSONUtil.getText(object, "wd_ondutytwo"));
+        timeModel.setWd_offdutytwo(JSONUtil.getText(object, "wd_offdutytwo"));
+        timeModel.setWd_ondutythree(JSONUtil.getText(object, "wd_ondutythree"));
+        timeModel.setWd_offdutythree(JSONUtil.getText(object, "wd_offdutythree"));
+        String emcodes = JSONUtil.getText(object, "wd_emcode");
+        if (StringUtil.isEmpty(emcodes))
+            emcodes = JSONUtil.getText(object, "emcodes");
+
+        String emnames = JSONUtil.getText(object, "wd_man");
+        if (StringUtil.isEmpty(emnames))
+            emnames = JSONUtil.getText(object, "emnames");
+
+        employeesModel.setEmployeecode(emcodes);
+        employeesModel.setEmployeeNames(emnames);
+
+        String emdefaultorcodes = JSONUtil.getText(object, "wd_defaultorcode");
+        if (StringUtil.isEmpty(emdefaultorcodes))
+            emdefaultorcodes = JSONUtil.getText(object, "emdefaultorcodes");
+
+        String emdefaultors = JSONUtil.getText(object, "wd_defaultor");
+        if (StringUtil.isEmpty(emdefaultors))
+            emdefaultors = JSONUtil.getText(object, "emdefaultors");
+        hrorgsModel.setEmployeecode(emdefaultorcodes);
+        hrorgsModel.setEmployeeNames(emdefaultors);
+        model.setId(JSONUtil.getInt(object, "id"));
+//        model.setCount(JSONUtil.getInt(object, "wd_pcount"));
+        model.setCode(JSONUtil.getText(object, "wd_code"));
+        model.setTimeModel(timeModel);
+        if (isB2b)
+            model.setDay(JSONUtil.getText(object, "wd_day", "day"));
+        else
+            model.setDay(JSONUtil.getText(object, "wd_day"));//返回为1,2,3
+        model.setEmployeesModel(employeesModel);
+        model.setHrorgsModel(hrorgsModel);
+        model.setType(isB2b ? 2 : 1);
+        model.setName(JSONUtil.getText(object, "wd_name"));
+        try {
+            String names = employeesModel.getEmployeeNames();
+            if (!StringUtil.isEmpty(names)) {
+                model.setCount(names.split(",").length);
+            }
+            String hrorgs = hrorgsModel.getEmployeeNames();
+            if (!StringUtil.isEmpty(hrorgs)) {
+                model.setDepartments(hrorgs.split(",").length);
+            }
+        } catch (Exception e) {
+
+        }
+        return model;
+    }
+
+    /**
+     * 处理默认班次
+     *
+     * @param object
+     * @return
+     */
+    private FlightsModel handlerDefFlights(JSONObject object) {
+        FlightsModel model = new FlightsModel();
+        FlightsTimeModel timeModel = new FlightsTimeModel();
+        EmployeesModel employeesModel = new EmployeesModel();
+        EmployeesModel hrorgsModel = new EmployeesModel();
+        timeModel.setEarlyTime(JSONUtil.getInt(object, "wd_earlytime"));
+        timeModel.setEarlyTime(JSONUtil.getInt(object, "wd_earlytime"));
+        timeModel.setWd_ondutyone(JSONUtil.getText(object, "wd_ondutyone"));
+        timeModel.setWd_offdutyone(JSONUtil.getText(object, "wd_offdutyone"));
+        timeModel.setWd_ondutytwo(JSONUtil.getText(object, "wd_ondutytwo"));
+        timeModel.setWd_offdutytwo(JSONUtil.getText(object, "wd_offdutytwo"));
+        timeModel.setWd_ondutythree(JSONUtil.getText(object, "wd_ondutythree"));
+        timeModel.setWd_offdutythree(JSONUtil.getText(object, "wd_offdutythree"));
+        model.setTimeModel(timeModel);
+        model.setEmployeesModel(employeesModel);
+        model.setHrorgsModel(hrorgsModel);
+        JSONObject o = null;
+        if (object.containsKey("Class1")) {
+            o = object.getJSONObject("Class1");
+            timeModel.setWd_ondutyone(getByClass(o, true));
+            timeModel.setWd_offdutyone(getByClass(o, false));
+        }
+        if (object.containsKey("Class2")) {
+            o = object.getJSONObject("Class2");
+            timeModel.setWd_ondutytwo(getByClass(o, true));
+            timeModel.setWd_offdutytwo(getByClass(o, false));
+        }
+        if (object.containsKey("Class3")) {
+            o = object.getJSONObject("Class3");
+            timeModel.setWd_ondutythree(getByClass(o, true));
+            timeModel.setWd_offdutythree(getByClass(o, false));
+        }
+        String emnames =JSONUtil.getText(object, "emnames", "defaultmancode");
+        employeesModel.setEmployeecode(emnames);
+        employeesModel.setEmployeeNames(JSONUtil.getText(object, "defaultman"));
+        if (!StringUtil.isEmpty(emnames)) {
+            String[] es = emnames.split(",");
+            model.setCount(es.length);
+        }
+        model.setId(JSONUtil.getInt(object, "wd_id"));
+        model.setCode(JSONUtil.getText(object, "wd_code"));
+        model.setTimeModel(timeModel);
+        model.setDay(JSONUtil.getText(object, "wd_day"));//返回为1,2,3
+        model.setEmployeesModel(employeesModel);
+        model.setHrorgsModel(hrorgsModel);
+        model.setType(2);
+        model.setName(JSONUtil.getText(object, "wd_name"));
+
+        try {
+            String names = employeesModel.getEmployeeNames();
+            if (!StringUtil.isEmpty(names)) {
+                model.setCount(names.split(",").length);
+            }
+            String hrorgs = hrorgsModel.getEmployeeNames();
+            if (!StringUtil.isEmpty(hrorgs)) {
+                model.setDepartments(hrorgs.split(",").length);
+            }
+        } catch (Exception e) {
+
+        }
+        return model;
+    }
+
+    private String getByClass(JSONObject object, boolean work) {
+        return work ? (object.containsKey("wd_onduty") ? object.getString("wd_onduty") : "") : (
+                object.containsKey("wd_offduty") ? object.getString("wd_offduty") : "");
+    }
+}

+ 90 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/utils/MostLinearLayoutManager.java

@@ -0,0 +1,90 @@
+package com.uas.appworks.OA.erp.utils;
+
+import android.content.Context;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Created by Bitliker on 2016/11/17.
+ */
+
+public class MostLinearLayoutManager extends LinearLayoutManager {
+
+    public MostLinearLayoutManager(Context context) {
+        super(context);
+    }
+
+    public MostLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
+        super(context, orientation, reverseLayout);
+    }
+
+    private int[] mMeasuredDimension = new int[2];
+
+    @Override
+    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
+                          int widthSpec, int heightSpec) {
+
+        int widthMode = View.MeasureSpec.getMode(widthSpec);
+        int heightMode = View.MeasureSpec.getMode(heightSpec);
+        int widthSize = View.MeasureSpec.getSize(widthSpec);
+        int heightSize = View.MeasureSpec.getSize(heightSpec);
+        int width = 0;
+        int height = 0;
+        for (int i = 0; i < getItemCount(); i++) {
+            measureScrapChild(recycler, i,
+                    View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
+                    View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
+                    mMeasuredDimension);
+
+            if (getOrientation() == HORIZONTAL) {
+                width = width + mMeasuredDimension[0];
+                if (i == 0) {
+                    height = mMeasuredDimension[1];
+                }
+            } else {
+                height = height + mMeasuredDimension[1];
+                if (i == 0) {
+                    width = mMeasuredDimension[0];
+                }
+            }
+        }
+        switch (widthMode) {
+            case View.MeasureSpec.EXACTLY:
+                width = widthSize;
+            case View.MeasureSpec.AT_MOST:
+            case View.MeasureSpec.UNSPECIFIED:
+        }
+
+        switch (heightMode) {
+            case View.MeasureSpec.EXACTLY:
+                height = heightSize;
+            case View.MeasureSpec.AT_MOST:
+            case View.MeasureSpec.UNSPECIFIED:
+        }
+
+        setMeasuredDimension(width, height);
+    }
+
+    private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
+                                   int heightSpec, int[] measuredDimension) {
+        try {
+            View view = recycler.getViewForPosition(0);//fix 动态添加时报IndexOutOfBoundsException
+            if (view != null) {
+                RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
+                int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
+                        getPaddingLeft() + getPaddingRight(), p.width);
+                int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
+                        getPaddingTop() + getPaddingBottom(), p.height);
+                view.measure(childWidthSpec, childHeightSpec);
+                measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
+                measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
+                recycler.recycleView(view);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+        }
+    }
+}

+ 36 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/view/IAddFlihtsView.java

@@ -0,0 +1,36 @@
+package com.uas.appworks.OA.erp.view;
+
+
+import com.core.view.imp.HttpImp;
+import com.uas.appworks.OA.erp.model.FlightsModel;
+import com.uas.appworks.OA.erp.model.SelectEmUser;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Bitliker on 2017/2/9.
+ */
+
+public interface IAddFlihtsView extends HttpImp {
+
+    void updateName(String name);//更新数据
+
+    void updateTime(String time);//更新数据
+
+    void updateDate(String date, boolean isUpdate);//更新数据
+
+    void updateDepartment(String department);//更新数据
+
+    void updateMunber(String munber);//更新数据
+
+    void endActivity(FlightsModel model, boolean isUpdate);
+
+    void showCollisionMan(ArrayList<SelectEmUser> mans);
+
+    void showCollisionDefaultir(ArrayList<SelectEmUser> defaultirs);
+
+    void setClickAble(boolean isClickAble);
+
+    void isB2b(boolean isB2b);
+
+}

+ 16 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/view/IFlightsView.java

@@ -0,0 +1,16 @@
+package com.uas.appworks.OA.erp.view;
+
+import com.core.view.imp.HttpImp;
+import com.uas.appworks.OA.erp.model.FlightsModel;
+
+import java.util.List;
+
+
+/**
+ * Created by Bitliker on 2017/1/16.
+ */
+
+public interface IFlightsView extends HttpImp {
+    void showModel(List<FlightsModel> models);
+    void deleteModel(int position);
+}