Bitliker 9 лет назад
Родитель
Сommit
59c478fe25
22 измененных файлов с 1277 добавлено и 170 удалено
  1. 16 16
      WeiChat/build.gradle
  2. 19 15
      WeiChat/src/main/AndroidManifest.xml
  3. 34 23
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/AddFlihtsActivity.java
  4. 1 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/FlightsActivity.java
  5. 3 5
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/FlihtsTimeActivity.java
  6. 86 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/StatisticsActivity.java
  7. 15 13
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/WorkActivity.java
  8. 9 6
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/adapter/oa/FlightsAdapter.java
  9. 27 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/fragment/AttendanceFragment.java
  10. 23 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/fragment/AttendancesFragment.java
  11. 63 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/model/oa/EmployeesModel.java
  12. 52 64
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/model/oa/FlightsModel.java
  13. 7 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/model/oa/FlightsTimeModel.java
  14. 44 9
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/FlightsPresernter.java
  15. 111 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/FlightsUtil.java
  16. 75 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/view/oacalender/CalendarFragmet.java
  17. 147 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/view/oacalender/CalenderView.java
  18. 438 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/view/oacalender/OACalendarView.java
  19. 4 4
      WeiChat/src/main/res/layout/activity_statistics.xml
  20. 13 0
      WeiChat/src/main/res/layout/fragment_attendance.xml
  21. 9 0
      WeiChat/src/main/res/layout/fragment_attendances.xml
  22. 81 14
      WeiChat/src/main/res/values/strings.xml

+ 16 - 16
WeiChat/build.gradle

@@ -96,15 +96,6 @@ dependencies {
     compile files('libs/volley.jar')
     compile files('libs/xutils.jar')
     compile files('libs/flexjson-2.1.jar')
-    compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
-    compile 'com.android.support:support-v4:22.2.0'
-    compile 'com.android.support:appcompat-v7:22.2.0'
-    compile 'com.android.support:cardview-v7:22.2.0'
-    compile 'com.android.support:design:22.2.0'
-    compile 'com.commit451:PhotoView:1.2.5'
-    compile 'me.gujun.android.taggroup:library:1.4@aar'
-    compile 'com.umeng.analytics:analytics:latest.integration'
-    compile 'com.android.support:multidex:1.0.1'
     compile project(':library-swipemenu_lv')
     compile project(':library-viewpager-indicator')
     compile project(':lib-zxing')
@@ -118,20 +109,29 @@ dependencies {
     compile files('libs/SocialSDK_umengsina.jar')
     compile files('libs/SocialSDK_Sina.jar')
     compile files('libs/weiboSDKCore_3.1.4.jar')
-    compile 'cat.ereza:customactivityoncrash:1.5.0'
     compile('com.facebook.stetho:stetho:1.4.1') {
         force = true
     }
-    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
-    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
-    androidTestCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
-    compile 'se.emilsjolander:stickylistheaders:2.7.0'
     compile project(':library-refreshlayout')
     compile files('src/main/jniLibs/pushservice-5.3.0.99.jar')
-    compile 'com.github.TonicArtos:StickyGridHeaders:1.0.1'
     compile files('libs/lite-orm-1.7.0.jar')
     //    compile fileTree(include: ['*.jar'], dir: 'libs')
-    testCompile 'junit:junit:4.12'
     compile files('libs/Msc.jar')
     compile project(':library')
+    compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
+    compile 'com.android.support:support-v4:22.2.1'
+    compile 'com.android.support:appcompat-v7:22.2.1'
+    compile 'com.android.support:cardview-v7:22.2.1'
+    compile 'com.android.support:design:22.2.1'
+    compile 'com.commit451:PhotoView:1.2.5'
+    compile 'me.gujun.android.taggroup:library:1.4@aar'
+    compile 'com.umeng.analytics:analytics:latest.integration'
+    compile 'com.android.support:multidex:1.0.1'
+    compile 'cat.ereza:customactivityoncrash:1.5.0'
+    compile 'se.emilsjolander:stickylistheaders:2.7.0'
+    compile 'com.github.TonicArtos:StickyGridHeaders:1.0.1'
+    testCompile 'junit:junit:4.12'
+    androidTestCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
+    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
+    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
 }

+ 19 - 15
WeiChat/src/main/AndroidManifest.xml

@@ -107,7 +107,8 @@
     <uses-feature android:name="android.hardware.camera.autofocus" />
     <!-- 计步器用到 -->
     <uses-feature android:name="android.hardware.sensor.accelerometer" />
-    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
+
+    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
     <!-- 自动聚焦权限 -->
     <!-- 全局样式不要随意改动  @style/AppTheme -->
     <application
@@ -784,9 +785,10 @@
             android:name="com.xzjmyk.pm.basepedo.ui.MyPedometerActivity"
             android:label="UU运动" />
 
-        <service android:name="com.xzjmyk.pm.basepedo.service.StepService"
-                 android:process="com.uu.step"
-                    android:priority="1000">
+        <service
+            android:name="com.xzjmyk.pm.basepedo.service.StepService"
+            android:priority="1000"
+            android:process="com.uu.step">
             <intent-filter android:priority="1000">
 
                 <!-- 系统启动完成后会调用 -->
@@ -819,7 +821,7 @@
         <activity
             android:name=".ui.erp.activity.oa.FlightsActivity"
             android:label="@string/activity_flights" />
-            android:label="拜访目的" />
+        android:label="拜访目的" />
         <activity
             android:name=".ui.me.OfficeAddressSettingsActivity"
             android:label="办公地址设置" />
@@ -828,12 +830,11 @@
             android:label="高级设置" />
         <activity
             android:name=".ui.erp.activity.form.SelectCalendarActivity"
-            android:label="@string/title_activity_select_calendar"
-            >
-        </activity>
+            android:label="@string/title_activity_select_calendar"></activity>
         <activity android:name=".ui.erp.activity.oa.AddFlihtsActivity" />
-        <activity android:name=".ui.erp.activity.oa.FlihtsTimeActivity"
-            android:label="时间设置"/>
+        <activity
+            android:name=".ui.erp.activity.oa.FlihtsTimeActivity"
+            android:label="时间设置" />
         <activity
             android:name=".ui.erp.activity.oa.FlightsDateActivity"
             android:label="日期设置" />
@@ -849,10 +850,13 @@
         <activity
             android:name=".ui.erp.activity.oa.StatisticsActivity"
             android:label="考勤统计" />
-        <activity android:name=".ui.erp.activity.oa.DepartmentActivity"
-            android:label="选择部门"
-            />
-        <activity android:name=".ui.erp.activity.oa.SignStatisticalActivity"
-            android:label="考勤统计"/>
+        <activity
+            android:name=".ui.erp.activity.oa.DepartmentActivity"
+            android:label="选择部门" />
+        <activity
+            android:name=".ui.erp.activity.oa.SignStatisticalActivity"
+            android:label="考勤统计" />
+        <activity android:name=".ui.erp.fragment.AttendancesFragment"></activity>
     </application>
+
 </manifest>

+ 34 - 23
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/AddFlihtsActivity.java

@@ -70,20 +70,17 @@ public class AddFlihtsActivity extends OABaseActivity implements View.OnClickLis
             model = new FlightsModel();
         } else {
             title = "修改班次";
-            weeks = model.getWorkday();
             timeModel = model.getTimeModel();
-            employeesList = model.getEmployeesList();
-            hrorgsList = model.getHrorgsList();
-            String name = getMumber(employeesList);
-            munber_tv.setText(name);
-            String hrorgs = getHrorgs(hrorgsList);
+            weeks = model.getDay();
+            if (model.getEmployeesModel() != null && !StringUtils.isEmpty(model.getEmployeesModel().getEmployeeNames()))
+                munber_tv.setText(model.getEmployeesModel().getEmployeeNames());
+            if (model.getHrorgsModel() != null && !StringUtils.isEmpty(model.getHrorgsModel().getEmployeeNames()))
+                department_tv.setText(model.getHrorgsModel().getEmployeeNames());
             String time = getTime(timeModel);
             String week = geWeek(weeks);
             date_tv.setText(week);
             time_tv.setText(time);
-            department_tv.setText(hrorgs);
-            rule_name_et.setText(getNull(model.getWorkName()));
-            rule_name_et.setText(getNull(model.getWorkName()));
+            rule_name_et.setText(getNull(model.getName()));
         }
         getSupportActionBar().setTitle(title);
 
@@ -113,7 +110,6 @@ public class AddFlihtsActivity extends OABaseActivity implements View.OnClickLis
             case R.id.click_btn:
                 //TODO 提交保存 并返回页面
                 submit();
-
                 break;
         }
     }
@@ -186,21 +182,34 @@ public class AddFlihtsActivity extends OABaseActivity implements View.OnClickLis
         }
         if (!ListUtils.isEmpty(employeesList)) {
             StringBuilder builder = new StringBuilder();
-            for (EmployeesEntity e : employeesList)
+            StringBuilder wd_man = new StringBuilder();
+            for (EmployeesEntity e : employeesList) {
                 builder.append(e.getEM_CODE() + ",");
+                wd_man.append(e.getEM_NAME() + ",");
+
+            }
             removieLast(builder);
+            removieLast(wd_man);
             formStore.put("wd_emcode", builder.toString());
+            formStore.put("wd_man", builder.toString());
         } else {
             formStore.put("wd_emcode", "");
+            formStore.put("wd_man", "");
         }
         if (!ListUtils.isEmpty(hrorgsList)) {
-            StringBuilder builder = new StringBuilder();
-            for (HrorgsEntity e : hrorgsList)
-                builder.append(e.getOr_code() + ",");
-            removieLast(builder);
-            formStore.put("wd_defaultorcode", builder.toString());
+            StringBuilder or_code = new StringBuilder();
+            StringBuilder wd_defaultor = new StringBuilder();
+            for (HrorgsEntity e : hrorgsList) {
+                or_code.append(e.getOr_code() + ",");
+                wd_defaultor.append(e.getOr_name() + ",");
+            }
+            removieLast(or_code);
+            removieLast(wd_defaultor);
+            formStore.put("wd_defaultorcode", or_code.toString());
+            formStore.put("wd_defaultor", wd_defaultor.toString());
         } else {
             formStore.put("wd_defaultorcode", "");
+            formStore.put("wd_defaultor", "");
         }
         param.put("formStore", StringUtils.mapToJson(formStore));
         Bundle bundle = null;
@@ -211,13 +220,14 @@ public class AddFlihtsActivity extends OABaseActivity implements View.OnClickLis
                         progressDialog.dismiss();
                         if (model == null)
                             model = new FlightsModel();
-                        model.setWorkName(rule_name_et.getText().toString());
-                        model.setType(1);
-                        model.setWeek(date_tv.getText().toString() + " " + time_tv.getText().toString());
-                        model.setTimeModel(timeModel);
-                        model.setEmployeesList(employeesList);
-                        model.setHrorgsList(hrorgsList);
-                        model.setWorkpcount(employeesList.size());
+                        //TODO 需要修改
+//                        model.setWorkName(rule_name_et.getText().toString());
+//                        model.setType(1);
+//                        model.setWeek(date_tv.getText().toString() + " " + time_tv.getText().toString());
+//                        model.setTimeModel(timeModel);
+//                        model.setEmployeesList(employeesList);
+//                        model.setHrorgsList(hrorgsList);
+//                        model.setWorkpcount(employeesList.size());
                         Intent intent = new Intent();
                         intent.putExtra("data", model);
                         setResult(0x20, intent);
@@ -281,6 +291,7 @@ public class AddFlihtsActivity extends OABaseActivity implements View.OnClickLis
         if (!StringUtils.isEmpty(timeModel.getWd_ondutythree())) {
             builder.append(timeModel.getWd_ondutythree() + "-" + timeModel.getWd_ondutythree() + " ");
         }
+        builder.append(timeModel.getAllTime() / (1000 * 60 * 60) + "小时");
         removieLast(builder);
         return builder.toString();
     }

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

@@ -106,6 +106,7 @@ public class FlightsActivity extends OABaseActivity implements IFlightsView, Fli
                 return;
             adapter.getModels().remove(position);
             adapter.notifyItemRemoved(position);
+            adapter.notifyItemRangeChanged(position, adapter.getModels().size());
         }
     }
 }

+ 3 - 5
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/FlihtsTimeActivity.java

@@ -16,9 +16,9 @@ import com.lidroid.xutils.view.annotation.ViewInject;
 import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.bean.oa.SelectBean;
 import com.xzjmyk.pm.activity.ui.erp.model.oa.FlightsTimeModel;
+import com.xzjmyk.pm.activity.ui.erp.util.FlightsUtil;
 import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
 import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
-import com.xzjmyk.pm.activity.util.TimeUtils;
 import com.xzjmyk.pm.activity.view.MostLinearLayoutManager;
 import com.xzjmyk.pm.activity.view.RecycleViewDivider;
 import com.xzjmyk.pm.activity.view.crouton.Crouton;
@@ -112,7 +112,7 @@ public class FlihtsTimeActivity extends OABaseActivity implements View.OnClickLi
                 }
                 break;
             case R.id.add_tv:
-                if (ListUtils.isEmpty(mapList) || mapList.size() <= 3)
+                if (ListUtils.isEmpty(mapList) || mapList.size() < 3)
                     addEmpty();
                 else Crouton.showToast(ct, "最多添加三个时间", R.color.load_warning);
                 break;
@@ -271,9 +271,7 @@ public class FlihtsTimeActivity extends OABaseActivity implements View.OnClickLi
 
 
     private long setTime(String start, String end) {
-        long startMin = TimeUtils.f_str_2_long(TimeUtils.s_long_2_str(System.currentTimeMillis()) + " " + start + ":00");
-        long endMin = TimeUtils.f_str_2_long(TimeUtils.s_long_2_str(System.currentTimeMillis()) + " " + end + ":00");
-        return endMin - startMin;
+        return FlightsUtil.getTime(start, end);
     }
 
     private void addEmpty() {

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

@@ -1,15 +1,100 @@
 package com.xzjmyk.pm.activity.ui.erp.activity.oa;
 
 import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentTransaction;
+import android.view.View;
+import android.widget.TextView;
 
+import com.lidroid.xutils.ViewUtils;
+import com.lidroid.xutils.view.annotation.ViewInject;
 import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.ui.base.BaseActivity;
+import com.xzjmyk.pm.activity.ui.erp.fragment.AttendanceFragment;
+import com.xzjmyk.pm.activity.ui.erp.fragment.AttendancesFragment;
 
-public class StatisticsActivity extends BaseActivity {
+public class StatisticsActivity extends BaseActivity implements View.OnClickListener {
+
+    @ViewInject(R.id.attendances_tag)
+    private View attendances_tag;
+    @ViewInject(R.id.attendance_tag)
+    private View attendance_tag;
+    @ViewInject(R.id.attendances_tv)
+    private TextView attendances_tv;
+    @ViewInject(R.id.attendance_tv)
+    private TextView attendance_tv;
+
+
+    private boolean isAttendance = false;//是否显示个人考勤
+
+    private AttendanceFragment attendanceFragment;
+    private AttendancesFragment attendancesFragment;
+    private Fragment mLastFragment;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_statistics);
+        ViewUtils.inject(this);
+    }
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.attendances_tv://团队考勤
+                if (!isAttendance) return;
+                chaneTAG(false);
+                break;
+            case R.id.attendance_tv://个人考勤
+                if (isAttendance) return;
+                chaneTAG(true);
+                break;
+
+        }
+    }
+
+    //设置标签
+    private void chaneTAG(boolean isAttendance) {
+        this.isAttendance = isAttendance;
+        if (isAttendance) {
+            attendance_tv.setTextColor(getResources().getColor(R.color.darkorange));
+            attendances_tv.setTextColor(getResources().getColor(R.color.dimgrey));
+            attendance_tag.setBackgroundResource(R.color.darkorange);
+            attendances_tag.setBackgroundResource(R.color.item_line);
+
+            if (attendanceFragment == null) {
+                attendanceFragment = new AttendanceFragment();
+            }
+            changeFragment(attendanceFragment, "attendanceFragment");
+        } else {
+            attendance_tv.setTextColor(getResources().getColor(R.color.dimgrey));
+            attendances_tv.setTextColor(getResources().getColor(R.color.darkorange));
+            attendance_tag.setBackgroundResource(R.color.item_line);
+            attendances_tag.setBackgroundResource(R.color.darkorange);
+            if (attendancesFragment == null) {
+                attendancesFragment = new AttendancesFragment();
+            }
+            changeFragment(attendancesFragment, "attendancesFragment");
+        }
     }
+
+    private void changeFragment(Fragment addFragment, String tag) {
+        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();// 开始事物
+        if (mLastFragment == addFragment) {
+            return;
+        }
+        if (mLastFragment != null && mLastFragment != addFragment) {// 如果最后一次加载的不是现在要加载的Fragment,那么僵最后一次加载的移出
+            fragmentTransaction.detach(mLastFragment);
+        }
+        if (addFragment == null) {
+            return;
+        }
+        if (!addFragment.isAdded())// 如果还没有添加,就加上
+            fragmentTransaction.add(R.id.main_content, addFragment, tag);
+        if (addFragment.isDetached())
+            fragmentTransaction.attach(addFragment);
+        mLastFragment = addFragment;
+        fragmentTransaction.commitAllowingStateLoss();
+    }
+
 }

+ 15 - 13
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/WorkActivity.java

@@ -91,11 +91,11 @@ public class WorkActivity extends BaseActivity implements View.OnClickListener,
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.title:
-                Intent intent = new Intent(ct, AlarmaActivity.class);
-                intent.putExtra("macAddress", macAddress);
-                startActivity(intent);
+//                Intent intent = new Intent(ct, AlarmaActivity.class);
+//                intent.putExtra("macAddress", macAddress);
+//                startActivity(intent);
                 //TODO 测试版本先关闭
-//                showPopupWindow();
+                showPopupWindow();
                 break;
         }
         return super.onOptionsItemSelected(item);
@@ -134,7 +134,8 @@ public class WorkActivity extends BaseActivity implements View.OnClickListener,
         listview.setLayoutManager(new LinearLayoutManager(ct));
         listview.setAdapter(adapter);
         presenter.start();
-        date_tv.setText(TimeUtils.long2str(System.currentTimeMillis(), "yyyy年MM月dd日") + TimeUtils.getWeek(System.currentTimeMillis()));
+        date_tv.setText(TimeUtils.long2str(System.currentTimeMillis(), "yyyy年MM月dd日") +
+                TimeUtils.getWeek(System.currentTimeMillis()));
         findViewById(R.id.signin_btn).setOnClickListener(this);
         findViewById(R.id.unoffice_).setOnClickListener(this);
         date_tv.setOnClickListener(this);
@@ -170,13 +171,14 @@ public class WorkActivity extends BaseActivity implements View.OnClickListener,
     @Override
     public void showModel(List<WorkModel> models) {
         if (!ListUtils.isEmpty(models)) {
-            for (WorkModel m : models) {
-                Log.i("gongpengming", "showModel: " + m.getWorkTime());
-                Log.i("gongpengming", "showModel: " + m.getOffTime());
-                Log.i("gongpengming", "++++++++++++++++++++++++++++");
-            }
+            //TODO 发布版本隐藏
+//            for (WorkModel m : models) {
+//                Log.i("gongpengming", "showModel: " + m.getWorkTime());
+//                Log.i("gongpengming", "showModel: " + m.getOffTime());
+//                Log.i("gongpengming", "++++++++++++++++++++++++++++");
+//            }
         }
-        Log.i("gongpengming", "进来了 showModel" + (ListUtils.isEmpty(models) ? 0 : models.size()));
+
         adapter.setModels(isToday, selectTime, models);
     }
 
@@ -263,7 +265,7 @@ public class WorkActivity extends BaseActivity implements View.OnClickListener,
 
     @Override
     public void onClick(View view) {
-        Intent intent=null;
+        Intent intent = null;
         switch (view.getId()) {
             case R.id.signin_btn:
                 if (isSubmitAble())
@@ -294,7 +296,7 @@ public class WorkActivity extends BaseActivity implements View.OnClickListener,
                 closePopupWindow();
                 break;
             case R.id.work_setting_tv:
-                intent=new Intent(ct,FlightsActivity.class);
+                intent = new Intent(ct, FlightsActivity.class);
                 startActivity(intent);
                 closePopupWindow();
                 break;

+ 9 - 6
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/adapter/oa/FlightsAdapter.java

@@ -46,21 +46,24 @@ public class FlightsAdapter extends RecyclerView.Adapter<FlightsAdapter.FlightVi
         try {
             final FlightsModel model = models.get(position);
             setType(holder, model.getType());//设置隐藏和显示
-            holder.rule_name_tv.setText(StringUtils.getNull(model.getWorkName()));
-            holder.mumber_tv.setText(getNumber(model.getWorkpcount()));
-            holder.week_tv.setText(StringUtils.getNull(model.getWeek()));
+            holder.rule_name_tv.setText(StringUtils.getNull(model.getName()));
+            holder.mumber_tv.setText(getNumber(model.getCount()));
+            if (model.getTimeModel() != null) {
+                String week =model.getWeek();
+                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);
+                        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);
+                        onItemClickListener.click(model, position, false);
                 }
             });
         } catch (Exception e) {
@@ -119,6 +122,6 @@ public class FlightsAdapter extends RecyclerView.Adapter<FlightsAdapter.FlightVi
     }
 
     public interface OnItemClickListener {
-        void click(FlightsModel model, int position,boolean itemView);
+        void click(FlightsModel model, int position, boolean itemView);
     }
 }

+ 27 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/fragment/AttendanceFragment.java

@@ -0,0 +1,27 @@
+package com.xzjmyk.pm.activity.ui.erp.fragment;
+
+
+import android.os.Bundle;
+
+import com.xzjmyk.pm.activity.R;
+import com.xzjmyk.pm.activity.ui.base.EasyFragment;
+
+/**
+ * 个人考勤
+ */
+public class AttendanceFragment extends EasyFragment {
+
+
+
+    @Override
+    protected int inflateLayoutId() {
+        return R.layout.fragment_attendance;
+    }
+
+    @Override
+    protected void onCreateView(Bundle savedInstanceState, boolean createView) {
+
+    }
+
+
+}

+ 23 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/fragment/AttendancesFragment.java

@@ -0,0 +1,23 @@
+package com.xzjmyk.pm.activity.ui.erp.fragment;
+
+import android.os.Bundle;
+
+import com.xzjmyk.pm.activity.R;
+import com.xzjmyk.pm.activity.ui.base.EasyFragment;
+
+/**
+ * 团队考勤
+ */
+public class AttendancesFragment extends EasyFragment {
+
+    @Override
+    protected int inflateLayoutId() {
+        return R.layout.fragment_attendances;
+    }
+
+    @Override
+    protected void onCreateView(Bundle savedInstanceState, boolean createView) {
+
+    }
+
+}

+ 63 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/model/oa/EmployeesModel.java

@@ -0,0 +1,63 @@
+package com.xzjmyk.pm.activity.ui.erp.model.oa;
+
+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 void setEmployeeNames(String employeeNames) {
+        this.employeeNames = employeeNames;
+    }
+
+    public String getEmployeecode() {
+        return employeecode;
+    }
+
+    public void setEmployeecode(String employeecode) {
+        this.employeecode = employeecode;
+    }
+}

+ 52 - 64
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/model/oa/FlightsModel.java

@@ -3,8 +3,9 @@ package com.xzjmyk.pm.activity.ui.erp.model.oa;
 import android.os.Parcel;
 import android.os.Parcelable;
 
-import com.xzjmyk.pm.activity.ui.erp.entity.EmployeesEntity;
-import com.xzjmyk.pm.activity.ui.erp.entity.HrorgsEntity;
+import com.xzjmyk.pm.activity.ui.erp.util.FlightsUtil;
+import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
+import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
 
 import java.util.ArrayList;
 
@@ -15,24 +16,13 @@ import java.util.ArrayList;
 public class FlightsModel implements Parcelable {
     private int id;              //id
     private int type;           //类型  1、正常班次(可有排版 可删除)  2.默认班次 (有排版  无删除) 3.自由排班
+    private String name;     //规则名称
+    private int count;         //成员个数
+    private ArrayList<Integer> day;
 
-    private String workName;     //规则名称
-
-    private int workpcount;         //成员个数
-
-    private ArrayList<EmployeesEntity> employeesList = null;//人员
-
-    private ArrayList<HrorgsEntity> hrorgsList = null;//部门
-
-    private FlightsTimeModel timeModel;
-
-
-    private ArrayList<Integer> workday;         //工作日期
-
-    private int earlyTime;         //最早上班时间,小时
-
-
-    private String week;//显示出来的week 在适配器中不做运算
+    private FlightsTimeModel timeModel;  //时间,包含最早上班 和总时间 和上班日期
+    private EmployeesModel employeesModel;
+    private EmployeesModel hrorgsModel;
 
     public FlightsModel() {
     }
@@ -41,26 +31,22 @@ public class FlightsModel implements Parcelable {
     protected FlightsModel(Parcel in) {
         id = in.readInt();
         type = in.readInt();
-        workName = in.readString();
-        workpcount = in.readInt();
-        employeesList = in.createTypedArrayList(EmployeesEntity.CREATOR);
-        hrorgsList = in.createTypedArrayList(HrorgsEntity.CREATOR);
+        name = in.readString();
+        count = in.readInt();
         timeModel = in.readParcelable(FlightsTimeModel.class.getClassLoader());
-        earlyTime = in.readInt();
-        week = in.readString();
+        employeesModel = in.readParcelable(EmployeesModel.class.getClassLoader());
+        hrorgsModel = in.readParcelable(EmployeesModel.class.getClassLoader());
     }
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
         dest.writeInt(id);
         dest.writeInt(type);
-        dest.writeString(workName);
-        dest.writeInt(workpcount);
-        dest.writeTypedList(employeesList);
-        dest.writeTypedList(hrorgsList);
+        dest.writeString(name);
+        dest.writeInt(count);
         dest.writeParcelable(timeModel, flags);
-        dest.writeInt(earlyTime);
-        dest.writeString(week);
+        dest.writeParcelable(employeesModel, flags);
+        dest.writeParcelable(hrorgsModel, flags);
     }
 
     @Override
@@ -96,36 +82,28 @@ public class FlightsModel implements Parcelable {
         this.type = type;
     }
 
-    public String getWorkName() {
-        return workName;
+    public String getName() {
+        return name;
     }
 
-    public void setWorkName(String workName) {
-        this.workName = workName;
+    public void setName(String name) {
+        this.name = name;
     }
 
-    public int getWorkpcount() {
-        return workpcount;
+    public int getCount() {
+        return count;
     }
 
-    public void setWorkpcount(int workpcount) {
-        this.workpcount = workpcount;
+    public void setCount(int count) {
+        this.count = count;
     }
 
-    public ArrayList<EmployeesEntity> getEmployeesList() {
-        return employeesList;
+    public ArrayList<Integer> getDay() {
+        return day;
     }
 
-    public void setEmployeesList(ArrayList<EmployeesEntity> employeesList) {
-        this.employeesList = employeesList;
-    }
-
-    public ArrayList<HrorgsEntity> getHrorgsList() {
-        return hrorgsList;
-    }
-
-    public void setHrorgsList(ArrayList<HrorgsEntity> hrorgsList) {
-        this.hrorgsList = hrorgsList;
+    public void setDay(ArrayList<Integer> day) {
+        this.day = day;
     }
 
     public FlightsTimeModel getTimeModel() {
@@ -136,27 +114,37 @@ public class FlightsModel implements Parcelable {
         this.timeModel = timeModel;
     }
 
-    public ArrayList<Integer> getWorkday() {
-        return workday;
+    public EmployeesModel getEmployeesModel() {
+        return employeesModel;
     }
 
-    public void setWorkday(ArrayList<Integer> workday) {
-        this.workday = workday;
+    public void setEmployeesModel(EmployeesModel employeesModel) {
+        this.employeesModel = employeesModel;
     }
 
-    public int getEarlyTime() {
-        return earlyTime;
+    public EmployeesModel getHrorgsModel() {
+        return hrorgsModel;
     }
 
-    public void setEarlyTime(int earlyTime) {
-        this.earlyTime = earlyTime;
+    public void setHrorgsModel(EmployeesModel hrorgsModel) {
+        this.hrorgsModel = hrorgsModel;
     }
 
     public String getWeek() {
-        return week;
-    }
-
-    public void setWeek(String week) {
-        this.week = week;
+        if (timeModel == null) return "";
+        StringBuilder builder = new StringBuilder();
+        if (!ListUtils.isEmpty(day)) {
+            builder.append(FlightsUtil.getDay(day) + " ");
+        }
+        if (!StringUtils.isEmpty(timeModel.getWd_ondutyone()) && !StringUtils.isEmpty(timeModel.getWd_offdutyone())) {
+            builder.append(timeModel.getWd_ondutyone() + "-" + timeModel.getWd_offdutyone());
+        }
+        if (!StringUtils.isEmpty(timeModel.getWd_ondutytwo()) && !StringUtils.isEmpty(timeModel.getWd_offdutytwo())) {
+            builder.append(timeModel.getWd_ondutytwo() + "-" + timeModel.getWd_offdutytwo());
+        }
+        if (!StringUtils.isEmpty(timeModel.getWd_ondutythree()) && !StringUtils.isEmpty(timeModel.getWd_offdutythree())) {
+            builder.append(timeModel.getWd_ondutythree() + "-" + timeModel.getWd_offdutythree());
+        }
+        return builder.toString();
     }
 }

+ 7 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/model/oa/FlightsTimeModel.java

@@ -3,6 +3,8 @@ package com.xzjmyk.pm.activity.ui.erp.model.oa;
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import com.xzjmyk.pm.activity.ui.erp.util.FlightsUtil;
+
 /**
  * Created by Bitliker on 2017/1/20.
  */
@@ -113,15 +115,20 @@ public class FlightsTimeModel implements Parcelable {
         this.wd_offdutythree = wd_offdutythree;
     }
 
+
+
     public int getEarlyTime() {
         return earlyTime;
     }
 
+
+
     public void setEarlyTime(int earlyTime) {
         this.earlyTime = earlyTime;
     }
 
     public long getAllTime() {
+        if (allTime == 0) return FlightsUtil.getAllTime(this);
         return allTime;
     }
 

+ 44 - 9
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/FlightsPresernter.java

@@ -2,12 +2,16 @@ package com.xzjmyk.pm.activity.ui.erp.presenter;
 
 import android.os.Bundle;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.xzjmyk.pm.activity.MyApplication;
 import com.xzjmyk.pm.activity.R;
+import com.xzjmyk.pm.activity.ui.erp.model.oa.EmployeesModel;
 import com.xzjmyk.pm.activity.ui.erp.model.oa.FlightsModel;
+import com.xzjmyk.pm.activity.ui.erp.model.oa.FlightsTimeModel;
 import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IFlightsView;
+import com.xzjmyk.pm.activity.ui.erp.util.FlightsUtil;
 import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
 import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
 import com.xzjmyk.pm.activity.ui.erp.util.auto.HttpHandler;
@@ -70,7 +74,8 @@ public class FlightsPresernter implements HttpHandler.OnResultListener {
     public void result(int what, boolean isJSON, String message, Bundle bundle) {
         switch (what) {
             case WORK_DATA:
-
+                JSONArray array = JSON.parseObject(message).getJSONArray("listdata");
+                handlerWork(array);
                 break;
         }
     }
@@ -89,20 +94,50 @@ public class FlightsPresernter implements HttpHandler.OnResultListener {
         List<FlightsModel> models = new ArrayList<>();
         for (int i = 0; i < array.size(); i++) {
             object = array.getJSONObject(i);
-
-
+            models.add(handlerFlights(object));
         }
+        iFlightsView.dimssLoading();
+        iFlightsView.showModel(models);
     }
 
     private FlightsModel handlerFlights(JSONObject object) {
         FlightsModel model = new FlightsModel();
+        FlightsTimeModel timeModel = new FlightsTimeModel();
+        EmployeesModel employeesModel = new EmployeesModel();
+        EmployeesModel hrorgsModel = new EmployeesModel();
+        timeModel.setEarlyTime(object.containsKey("wd_earlytime") ? object.getIntValue("wd_earlytime") : 0);
+        timeModel.setWd_ondutyone(FlightsUtil.getNull(object, "wd_ondutyone"));
+        timeModel.setWd_offdutyone(FlightsUtil.getNull(object, "wd_offdutyone"));
+        timeModel.setWd_ondutytwo(FlightsUtil.getNull(object, "wd_ondutytwo"));
+        timeModel.setWd_offdutytwo(FlightsUtil.getNull(object, "wd_offdutytwo"));
+        timeModel.setWd_ondutythree(FlightsUtil.getNull(object, "wd_ondutythree"));
+        timeModel.setWd_offdutythree(FlightsUtil.getNull(object, "wd_offdutythree"));
+        timeModel.setAllTime(FlightsUtil.getAllTime(timeModel));
+        employeesModel.setEmployeecode(FlightsUtil.getNull(object, "wd_emcode"));
+        employeesModel.setEmployeeNames(FlightsUtil.getNull(object, "wd_man"));
+        hrorgsModel.setEmployeecode(FlightsUtil.getNull(object, "wd_defaultorcode"));
+        hrorgsModel.setEmployeeNames(FlightsUtil.getNull(object, "wd_defaultor"));
+        model.setId(object.containsKey("id") ? object.getIntValue("id") : 0);
+        model.setTimeModel(timeModel);
+        model.setDay(FlightsUtil.getDay(FlightsUtil.getNull(object, "wd_day")));
+        model.setEmployeesModel(employeesModel);
+        model.setHrorgsModel(hrorgsModel);
+        model.setType(1);
+        model.setName(FlightsUtil.getNull(object, "wd_name"));
+        String countAll = null;
+        if (StringUtils.isEmpty(employeesModel.getEmployeecode())) {
+            countAll = StringUtils.isEmpty(hrorgsModel.getEmployeecode()) ? "" : hrorgsModel.getEmployeecode();
+        } else {
+            countAll = employeesModel.getEmployeecode() + "" + (StringUtils.isEmpty(hrorgsModel.getEmployeecode()) ? "" : ("," + hrorgsModel.getEmployeecode()));
+        }
+        try {
+            String[] conut = countAll.split(",");
+            model.setCount(conut == null ? 0 : conut.length);
+        } catch (Exception e) {
+        }
 
-        return null;
+        return model;
     }
 
-    private String getNull(JSONObject object, String key) {
-        if (object == null || !object.containsKey(key) || StringUtils.isEmpty(object.getString(key)))
-            return "";
-        return object.getString(key);
-    }
+
 }

+ 111 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/FlightsUtil.java

@@ -0,0 +1,111 @@
+package com.xzjmyk.pm.activity.ui.erp.util;
+
+import android.util.Log;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xzjmyk.pm.activity.ui.erp.model.oa.FlightsTimeModel;
+import com.xzjmyk.pm.activity.util.TimeUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Bitliker on 2017/1/22.
+ */
+
+public class FlightsUtil {
+
+
+    public static ArrayList<Integer> getDay(String str) {
+        ArrayList<Integer> integers = new ArrayList<>();
+        try {
+            if (StringUtils.isEmpty(str)) return integers;
+            String[] day = str.split(",");
+            for (String e : day) {
+                integers.add(Integer.valueOf(e));
+            }
+            return integers;
+        } catch (Exception e) {
+            Log.i("gongpengming","e="+e.getMessage());
+            return integers;
+        }
+    }
+
+    public static String getDay(List<Integer> integers) {
+        try {
+            if (ListUtils.isEmpty(integers)) return "";
+            StringBuilder builder = new StringBuilder("周");
+            for (int e : integers) {
+                builder.append(getWeek(e) + "、");
+            }
+            removieLast(builder);
+            return builder.toString();
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    public static long getAllTime(FlightsTimeModel model) {
+        long time = 0;
+        if (!StringUtils.isEmpty(model.getWd_ondutyone()) && !StringUtils.isEmpty(model.getWd_offdutyone())) {
+            time += getTime(model.getWd_ondutyone(), model.getWd_offdutyone());
+        }
+        if (!StringUtils.isEmpty(model.getWd_ondutytwo()) && !StringUtils.isEmpty(model.getWd_offdutytwo())) {
+            time += getTime(model.getWd_ondutytwo(), model.getWd_offdutytwo());
+        }
+        if (!StringUtils.isEmpty(model.getWd_ondutythree()) && !StringUtils.isEmpty(model.getWd_offdutythree())) {
+            time += getTime(model.getWd_ondutythree(), model.getWd_offdutythree());
+        }
+        return time;
+    }
+
+    public static String getAllTimeShow(FlightsTimeModel model) {
+        return null;
+    }
+
+    public static String getNull(JSONObject object, String key) {
+        if (object == null || !object.containsKey(key) || StringUtils.isEmpty(object.getString(key)))
+            return "";
+        return object.getString(key);
+    }
+
+    public static 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 + "、";
+    }
+
+    public static StringBuilder removieLast(StringBuilder b) {
+        if (b.length() > 1) ;
+        b.deleteCharAt(b.length() - 1);
+        return b;
+    }
+
+    public static 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);
+    }
+}

+ 75 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/view/oacalender/CalendarFragmet.java

@@ -0,0 +1,75 @@
+package com.xzjmyk.pm.activity.ui.erp.view.oacalender;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.gxut.bitliker.oa.R;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Created by pengminggong on 2016/9/28.
+ */
+
+public class CalendarFragmet extends Fragment {
+    private OACalendarView calendarView;
+    private Date date;
+
+    /**
+     * @param date 显示月份
+     * @return
+     */
+    public static CalendarFragmet getInstance(Date date) {
+        CalendarFragmet fragment = new CalendarFragmet();
+        Bundle bundle = new Bundle();
+        bundle.putSerializable("DATA", date);
+        fragment.setArguments(bundle);
+        return fragment;
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(R.layout.item_calendar, container, false);
+        calendarView = (OACalendarView) view.findViewById(R.id.calender);
+        date = (Date) getArguments().getSerializable("DATA");
+        calendarView.setCurDate(date);
+        Set<Integer> dada = new HashSet<>();
+        calendarView.setDecoratDays(dada);
+        calendarView.setDateListener(new OACalendarView.OnSelectDateListener() {
+            @Override
+            public void result(Date date) {
+                CalendarFragmet.this.date=date;
+                if (onDateListener != null)
+                    onDateListener.result(date);
+            }
+        });
+        return view;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setonDecoratDay(Set<Integer> decoratDays) {
+        if (calendarView != null) {
+            calendarView.setDecoratDays(decoratDays);
+        }
+    }
+
+    public void setOnDateListener(OnDateListener onDateListener) {
+        this.onDateListener = onDateListener;
+    }
+
+    private OnDateListener onDateListener;
+
+    public interface OnDateListener {
+        void result(Date date);
+    }
+}

+ 147 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/view/oacalender/CalenderView.java

@@ -0,0 +1,147 @@
+package com.xzjmyk.pm.activity.ui.erp.view.oacalender;
+
+import android.content.Context;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.util.AttributeSet;
+import android.view.ViewGroup;
+
+import com.xzjmyk.pm.activity.ui.base.BaseActivity;
+import com.xzjmyk.pm.activity.util.TimeUtils;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * Created by Bitliker on 2017/1/9.
+ */
+
+public class CalenderView extends ViewPager {
+    private CalendarFragmet fragmet;
+    private final int MAX_PAGER = 30;
+    private final String MONTH_TAG = "yyyy-MM";
+
+    private Date[] date = new Date[MAX_PAGER];
+
+    public CalenderView(Context context) {
+        this(context, null);
+    }
+
+    public CalenderView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        if (context instanceof BaseActivity) {
+            initDate();
+            init(context);
+        } else {
+        }
+    }
+
+
+    private void init(Context context) throws ClassCastException {
+        ViewAdapter adapter = new ViewAdapter(((BaseActivity) context).getSupportFragmentManager());
+        setAdapter(adapter);
+        setCurrentItem(MAX_PAGER / 2);
+        this.addOnPageChangeListener(new OnPageChangeListener() {
+            @Override
+            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+
+            }
+
+            @Override
+            public void onPageSelected(int position) {
+                if (onMonthChangeListener != null) {
+                    String yyyyMM = TimeUtils.long2str(CalenderView.this.date[position].getTime(), MONTH_TAG);
+                    onMonthChangeListener.selected(yyyyMM);
+                }
+
+            }
+
+            @Override
+            public void onPageScrollStateChanged(int state) {
+
+            }
+        });
+    }
+
+    private void initDate() {
+        //当天在 MAX_PAGER/2 位置
+        Calendar c = Calendar.getInstance();
+        Date date = new Date();
+        for (int i = 0; i < MAX_PAGER; i++) {
+            int month = i - (MAX_PAGER / 2);
+            c.setTime(date);
+            if (month != 0) {
+                c.add(Calendar.MONTH, month);
+                c.set(Calendar.DAY_OF_MONTH, 1);
+            }
+            this.date[i] = c.getTime();
+        }
+    }
+
+    class ViewAdapter extends FragmentPagerAdapter {
+
+        public ViewAdapter(FragmentManager fm) {
+            super(fm);
+        }
+
+        @Override
+        public Fragment getItem(int position) {
+            return CalendarFragmet.getInstance(date[position]);
+        }
+
+        @Override
+        public int getCount() {
+            return MAX_PAGER;
+        }
+
+
+        @Override
+        public void setPrimaryItem(ViewGroup container, final int position, Object object) {
+            fragmet = (CalendarFragmet) object;
+            fragmet.setOnDateListener(new CalendarFragmet.OnDateListener() {
+                @Override
+                public void result(Date date) {
+                    CalenderView.this.date[position] = date;
+                    if (onDateChangeListener != null)
+                        onDateChangeListener.selected(date);
+                }
+            });
+            super.setPrimaryItem(container, position, object);
+        }
+    }
+
+    /**
+     * 设置有任务日期
+     *
+     * @param decoratDays
+     */
+    public void setonDecoratDay(Set<Integer> decoratDays) {
+        if (fragmet != null)
+            fragmet.setonDecoratDay(decoratDays);
+    }
+
+    public void setOnDateChangeListener(OnDateSelectListener onDateChangeListener) {
+        this.onDateChangeListener = onDateChangeListener;
+    }
+
+    public void setOnMonthChangeListener(OnMonthChangeListener onMonthChangeListener) {
+        this.onMonthChangeListener = onMonthChangeListener;
+    }
+
+
+    private OnDateSelectListener onDateChangeListener;
+
+    public interface OnDateSelectListener {
+        void selected(Date date);
+
+    }
+
+    private OnMonthChangeListener onMonthChangeListener;
+
+    public interface OnMonthChangeListener {
+        void selected(String yyyyMM);
+    }
+}

+ 438 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/view/oacalender/OACalendarView.java

@@ -0,0 +1,438 @@
+package com.xzjmyk.pm.activity.ui.erp.view.oacalender;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+import com.gxut.bitliker.oa.util.DisplayUtil;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+/**
+ * Created by pengminggong on 2016/9/20.
+ */
+public class OACalendarView extends View implements View.OnTouchListener {
+    //日期记录
+    private Date curDate; // 当前日历显示的月
+    private Date downDate; // 手指按下状态时临时日期
+    //索引
+    private String yeasMonth = "";//年月  yyyymm
+    private int todayIndex; // 今天的索引
+    private int downIndex=-1; // 按下的格子索引
+    private int startIndex; // 开始的格子索引(当月)
+    private int endIndex; // 开始的格子索引(当月)
+    //装饰物 decorat
+    private String decoratDays;
+    private int maxDay;//当月有多少天
+
+
+    private Calendar calendar;
+    private Surface surface;
+    private int[] date; // 日历显示格子数目
+
+    public OACalendarView(Context context) {
+        this(context, null);
+    }
+
+    public OACalendarView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        surface = new Surface();
+        curDate = new Date();
+        calendar = Calendar.getInstance();
+        calendar.setTime(curDate);
+        todayIndex = calendar.get(Calendar.DAY_OF_MONTH);
+        setBackgroundColor(surface.bgColor);
+        surface.density = getResources().getDisplayMetrics().density;
+        //计算格子数
+        calendar.set(Calendar.DAY_OF_MONTH, 1);//设置为当月第一天
+        startIndex = calendar.get(Calendar.DAY_OF_WEEK) - 1;//获取第一天在当周的星期几,返回多1,所以减1
+        maxDay = calendar.getActualMaximum(Calendar.DATE);//获取当月有多少天
+        //如果从星期日开始作为第一天
+        date = new int[maxDay + startIndex];
+        //如果从星期一作为开始第一天         date = new int[daysCountOfMonth + dayInWeek-1];
+        endIndex = date.length - 1;
+        todayIndex += startIndex - 1;
+        for (int i = startIndex, j = 1; i < date.length; i++, j++) {
+            date[i] = j;
+        }
+//        downIndex = todayIndex;
+        setOnTouchListener(this);
+    }
+
+
+    private void setCalendar(Date d) {
+        curDate = d;
+        calendar.setTime(curDate);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);//设置为当月第一天
+        startIndex = calendar.get(Calendar.DAY_OF_WEEK) - 1;//获取第一天在当周的星期几,返回多1,所以减1
+        maxDay = calendar.getActualMaximum(Calendar.DATE);//获取当月有多少天
+
+        //如果从星期日开始作为第一天
+        date = new int[maxDay + startIndex];
+        endIndex = date.length - 1;
+        for (int i = startIndex, j = 1; i < date.length; i++, j++) {
+            date[i] = j;
+        }
+        if (isThisMonth())
+            downIndex = todayIndex;
+        else
+            downIndex = startIndex;
+        surface.init();
+    }
+
+    /**
+     * 它有三种模式:计算视图大小
+     * UNSPECIFIED(未指定),父元素不对子元素施加任何束缚,子元素可以得到任意想要的大小;(具体值)
+     * EXACTLY(完全),父元素决定子元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;(match_parent)
+     * AT_MOST(至多),子元素至多达到指定大小的值。(wrap_parent)
+     */
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+        switch (widthMode) {
+            case MeasureSpec.UNSPECIFIED:
+                surface.width = widthSize;
+                break;
+            case MeasureSpec.EXACTLY:
+                surface.width = getResources().getDisplayMetrics().widthPixels;
+                break;
+            case MeasureSpec.AT_MOST:
+                surface.width = getResources().getDisplayMetrics().widthPixels;
+                break;
+        }
+        switch (heightMode) {
+            case MeasureSpec.UNSPECIFIED:
+                surface.height = heightSize;
+                break;
+            case MeasureSpec.EXACTLY:
+                surface.height = (getResources().getDisplayMetrics().heightPixels * 1 / 3);
+                break;
+            case MeasureSpec.AT_MOST:
+                surface.height = (getResources().getDisplayMetrics().heightPixels * 1 / 3);
+                break;
+        }
+        widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(surface.width, widthMode);
+        heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(surface.height, heightMode);
+        setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+//        surface.width = getResources().getDisplayMetrics().widthPixels;
+//        surface.height = (getResources().getDisplayMetrics().heightPixels * 1 / 3);
+//        widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(surface.width, View.MeasureSpec.EXACTLY);
+//        heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(surface.height, View.MeasureSpec.EXACTLY);
+//        setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
+//        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        if (changed) {
+            surface.init();
+        }
+        super.onLayout(changed, left, top, right, bottom);
+    }
+
+    float x;
+    float y;
+
+    @Override
+    public boolean onTouch(View view, MotionEvent event) {
+        switch (event.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                x = event.getX();
+                y = event.getY();
+                break;
+            case MotionEvent.ACTION_MOVE:
+                break;
+            case MotionEvent.ACTION_UP:
+                if (Math.abs(event.getX() - x) < 10 && Math.abs(event.getY() - y) < 10) {//为点击事件
+                    if (setReckon()) {
+                        if (dateListener != null)
+                            this.dateListener.result(downDate);
+                        invalidate();
+                    }
+                } else {
+                    return true;
+                }
+                break;
+        }
+        return true;
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        //画星期
+        drawWeek(canvas);
+        //画背景
+        drawSelect(canvas);
+        //画日期
+        drawDay(canvas);
+    }
+
+    //绘画点击的内容
+    private void drawSelect(Canvas canvas) {
+        if (downIndex >= startIndex && downIndex <= endIndex) {
+            //圆的最中心
+            float cellY = surface.weekHeight + surface.cellHeight * (downIndex / 7) + surface.cellHeight / 2;
+            float cellX = surface.cellWidth * (downIndex % 7) + surface.cellWidth / 2;
+//            float radius = Math.min(surface.cellHeight, surface.cellWidth) * surface.downScale;
+            canvas.drawCircle(cellX, cellY, surface.downTaxtSize, surface.selectPaint);
+        }
+    }
+
+    //画日期
+    private void drawDay(Canvas canvas) {
+        String chche = "";
+        //画上个月日期
+        calendar.setTime(curDate);
+        calendar.add(Calendar.MONTH, -1);
+        int startItem = calendar.getActualMaximum(Calendar.DATE) - startIndex + 1;//获取当月有多少天
+        calendar.set(Calendar.DAY_OF_MONTH, startItem);
+        //使文字垂直居中
+        Paint.FontMetrics fontMetrics = surface.hineDatePaint.getFontMetrics();
+        float fontHeight = fontMetrics.bottom - fontMetrics.top;
+//        float dayTextY = surface.weekHeight +(surface.cellHeight +surface.dateTaxtSize) / 2;
+        float dayTextY = surface.weekHeight + (surface.cellHeight + fontHeight) / 2 - fontMetrics.bottom;
+
+        for (int i = 0; i < startIndex; i++) {
+            float dayTextX = i * surface.cellWidth + (surface.cellWidth - surface.hineDatePaint.measureText("今")) / 2f;
+            canvas.drawText(calendar.get(Calendar.DAY_OF_MONTH) + "", dayTextX, dayTextY, surface.hineDatePaint);
+            calendar.add(Calendar.DAY_OF_MONTH, 1);
+        }
+        //画当月
+        for (int i = startIndex; i < date.length; i++) {
+            int item = i % surface.weekText.length;
+            if (i != 0 && item == 0) {
+                dayTextY += surface.cellHeight;
+            }
+            if (todayIndex == i && isThisMonth()) {
+                chche = "今";
+                surface.datePaint.setColor(surface.todayColor);
+            } else {
+                chche = String.valueOf(date[i]);
+                surface.datePaint.setColor(surface.dateColor);
+            }
+            if (downIndex == i) {
+                surface.datePaint.setColor(surface.selectColor);
+            }
+            float dayTextX = surface.cellWidth * (i % surface.weekText.length) +
+                    (surface.cellWidth - surface.datePaint.measureText(chche)) / 2f;
+            canvas.drawText(chche, dayTextX, dayTextY, surface.datePaint);
+            //画装饰物
+            int day = (i - startIndex + 1);
+            if (decoratDays != null && !decoratDays.isEmpty() && getIsDecorat(day)) {
+                drawDecorat(canvas, i, surface.decorPaint);
+            }
+        }
+        //画下个月日期
+        calendar.setTime(curDate);
+        calendar.add(Calendar.MONTH, 1);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        int next = date.length % 7 == 0 ? 0 : (date.length + (7 - date.length % 7));
+        for (int i = date.length; i < next; i++) {
+            float dayTextX = surface.cellWidth * (i % surface.weekText.length) + (surface.cellWidth - surface.datePaint.measureText("今")) / 2f;
+            canvas.drawText(calendar.get(Calendar.DAY_OF_MONTH) + "", dayTextX, dayTextY, surface.hineDatePaint);
+            calendar.add(Calendar.DAY_OF_MONTH, 1);
+        }
+    }
+
+    /*判断*/
+    private boolean getIsDecorat(int day) {
+        Pattern p = Pattern.compile("," + day + ",");//遍历对象
+        Matcher m = p.matcher(decoratDays);//遍历源
+        return m.find();
+    }
+
+    /*判断是否是当月*/
+    public boolean isThisMonth() {
+        calendar.setTime(curDate);
+        int month = calendar.get(Calendar.MONTH);
+        int year = calendar.get(Calendar.YEAR);
+        calendar.setTime(new Date());
+        if (year != calendar.get(Calendar.YEAR))
+            return false;
+        if (month != calendar.get(Calendar.MONTH))
+            return false;
+        return true;
+    }
+    /*end 判断*/
+
+    /**
+     * 绘画装饰物
+     *
+     * @param index      date索引
+     * @param decorPaint 画笔
+     */
+    private void drawDecorat(Canvas canvas, int index, Paint decorPaint) {
+        //圆的最中心
+        float cellY = surface.weekHeight + surface.cellHeight * (index / 7) + surface.cellHeight / 2;
+        float cellX = surface.cellWidth * (index % 7) + surface.cellWidth / 2;
+//        float radius = Math.min(surface.cellWidth, surface.weekHeight) * surface.downScale;
+        canvas.drawCircle(cellX, cellY, surface.downTaxtSize, decorPaint);
+    }
+
+    //画星期
+    private void drawWeek(Canvas canvas) {
+        //1.星期的Y抽位置,星期字体为星期框高度的一半,所以在3/4的位置开始绘画
+        float weekTextY = surface.weekHeight - (surface.weekHeight - surface.weekTaxtSize) / 2;
+        for (int i = 0; i < surface.weekText.length; i++) {
+            //Paint.measureText  获取该字的宽度值
+            float weekTextX = surface.cellWidth * i + (surface.cellWidth - surface.weekPaint.measureText(surface.weekText[i])) / 2f;
+            canvas.drawText(surface.weekText[i], weekTextX, weekTextY, surface.weekPaint);
+        }
+    }
+
+    /*计算判断的点击的索引*/
+    private boolean setReckon() {
+        int indexX = (int) Math.floor(x / surface.cellWidth);
+        int indexY = (int) Math.floor((y - surface.weekHeight) / surface.cellHeight);
+        downIndex = indexY * 7 + indexX;
+        if (downIndex < startIndex || downIndex > endIndex) return false;//当点击的是非本月的日期时候
+        calendar.setTime(curDate);
+        calendar.set(Calendar.DAY_OF_MONTH, date[downIndex]);
+        downDate = calendar.getTime();
+        return true;
+    }
+
+    public Date getCurDate() {
+        return curDate;
+    }
+
+    /*设置月份*/
+    public void setCurDate(Date date) {
+        curDate = date;
+        calendar.setTime(curDate);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        startIndex = calendar.get(Calendar.DAY_OF_WEEK) - 1;//获取第一天在当周的星期几,返回多1,所以减1
+        maxDay = calendar.getActualMaximum(Calendar.DATE);//获取当月有多少天
+        //如果从星期日开始作为第一天
+        this.date = new int[maxDay + startIndex];
+        endIndex = this.date.length - 1;
+        for (int i = startIndex, j = 1; i < this.date.length; i++, j++) {
+            this.date[i] = j;
+        }
+//        if (isThisMonth())
+//            downIndex = todayIndex;
+//        else {
+//            calendar.setTime(date);
+//            downIndex = startIndex + calendar.get(Calendar.DAY_OF_MONTH) - 1;
+//        }
+        surface.init();
+        invalidate();
+    }
+
+    /*设置为上个月*/
+    private void setNextMonth() {
+        calendar.setTime(curDate);
+        calendar.add(Calendar.MONTH, 1);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        setCalendar(calendar.getTime());
+    }
+
+    /*设置为下个月*/
+    private void setLastMonth() {
+        calendar.setTime(curDate);
+        calendar.add(Calendar.MONTH, -1);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        setCalendar(calendar.getTime());
+    }
+
+    public void setDecoratDays(Set<Integer> decoratDays) {
+        this.decoratDays = "";
+        StringBuilder builder = new StringBuilder();
+        builder.append(",");
+        for (Integer e : decoratDays) {
+            builder.append(e + ",");
+        }
+        this.decoratDays = builder.toString();
+        invalidate();
+    }
+
+    private class Surface {
+        private float density;//手机屏幕密度
+        private int width;//整个控件宽度
+        private int height;   //整个控件高度
+        private float weekHeight;//周的方框高度
+        private float cellWidth; // 日期方框宽度
+        private float cellHeight; // 日期方框高度
+        private int bgColor = 0xEBE9E9;
+        private int weekColor = Color.BLACK;//周视图的画笔颜色
+        private int dateColor = Color.BLACK;//月视图的画笔颜色x
+        private int selectColor = Color.WHITE;//选择中的画笔颜色
+        private int selectBgColor = Color.RED;//选择中的画笔颜色
+        private int todayColor = Color.RED;//选择中的画笔颜色
+        private int decorColor = Color.RED;//装饰画笔颜色
+        private int hineDateColor = Color.parseColor("#BFD3D3D3");//装饰画笔颜色
+
+        private Paint weekPaint;//周视图的画笔
+        private Paint datePaint;//月视图的画笔
+        private Paint selectPaint;//选择中的画笔
+        private Paint decorPaint;//装饰画笔
+        private Paint hineDatePaint;//非本月日期
+
+        private float weekTaxtSize = 55f;
+        private float dateTaxtSize = 55f;
+        private float downTaxtSize;
+        private String[] weekText = {"日", "一", "二", "三", "四", "五", "六"};
+
+        private void init() {
+            dateTaxtSize = weekTaxtSize = DisplayUtil.dip2px(getContext(), 18);
+            downTaxtSize = (dateTaxtSize + DisplayUtil.dip2px(getContext(), 10)) / 2;
+            //计算周框的高度 1.获取日期共多少行
+            int dateRowNum = date.length / 7 + (date.length % 7 > 0 ? 1 : 0);
+            cellHeight = weekHeight = height / (dateRowNum + 1);
+            cellWidth = width / 7f;
+            selectPaint = new Paint();//选择中的画笔
+            selectPaint.setColor(selectBgColor);
+            selectPaint.setAntiAlias(true);
+            decorPaint = new Paint();//装饰画笔
+            decorPaint.setColor(decorColor);
+            decorPaint.setStyle(Paint.Style.STROKE);
+            decorPaint.setStrokeWidth(3);
+            decorPaint.setAntiAlias(true);
+
+            weekPaint = new Paint();//周视图的画笔
+            weekPaint.setColor(weekColor);
+            weekPaint.setAntiAlias(true);
+            weekPaint.setTextSize(weekTaxtSize);
+
+            datePaint = new Paint();//日期视图的画笔
+            datePaint.setColor(dateColor);
+            datePaint.setAntiAlias(true);
+            datePaint.setTextSize(dateTaxtSize);
+
+            hineDatePaint = new Paint();//日期视图的画笔
+            hineDatePaint.setColor(hineDateColor);
+            hineDatePaint.setAntiAlias(true);
+            hineDatePaint.setTextSize(dateTaxtSize);
+        }
+    }
+
+    // 接口管理
+    public void setDateListener(OnSelectDateListener dateListener) {
+        this.dateListener = dateListener;
+    }
+
+    private OnSelectDateListener dateListener;
+
+    public interface OnSelectDateListener {
+        /**
+         * @param date 日期对象
+         */
+        void result(Date date);
+    }
+
+}

+ 4 - 4
WeiChat/src/main/res/layout/activity_statistics.xml

@@ -13,7 +13,7 @@
         android:orientation="horizontal">
 
         <TextView
-            android:id="@+id/subord_log"
+            android:id="@+id/attendances_tv"
             android:layout_width="0dp"
             android:layout_height="match_parent"
             android:layout_weight="1"
@@ -28,7 +28,7 @@
             android:background="@color/default_shadow_color" />
 
         <TextView
-            android:id="@+id/my_log"
+            android:id="@+id/attendance_tv"
             android:layout_width="0dp"
             android:layout_height="match_parent"
             android:layout_weight="1"
@@ -46,7 +46,7 @@
         android:paddingRight="10dp">
 
         <View
-            android:id="@+id/subord_log_tag"
+            android:id="@+id/attendances_tag"
             android:layout_width="0dp"
             android:layout_height="4px"
             android:layout_marginRight="20dp"
@@ -54,7 +54,7 @@
             android:background="@color/item_line" />
 
         <View
-            android:id="@+id/my_log_tag"
+            android:id="@+id/attendance_tag"
             android:layout_width="0dp"
             android:layout_height="4px"
             android:layout_marginLeft="20dp"

+ 13 - 0
WeiChat/src/main/res/layout/fragment_attendance.xml

@@ -0,0 +1,13 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.xzjmyk.pm.activity.ui.erp.fragment.AttendanceFragment">
+
+    <!-- TODO: Update blank fragment layout -->
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="@string/hello_blank_fragment" />
+
+</FrameLayout>

+ 9 - 0
WeiChat/src/main/res/layout/fragment_attendances.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/activity_attendances"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.xzjmyk.pm.activity.ui.erp.fragment.AttendancesFragment">
+
+</RelativeLayout>

+ 81 - 14
WeiChat/src/main/res/values/strings.xml

@@ -17,30 +17,94 @@
         <item>30分钟</item>
     </string-array>
     <string-array name="sign_distance">
-        <item>200米</item> <item>300米</item> <item>500米</item> <item>1000米</item> <item>1500米</item>
+        <item>200米</item>
+        <item>300米</item>
+        <item>500米</item>
+        <item>1000米</item>
+        <item>1500米</item>
     </string-array>
     <string-array name="work_distance">
-        <item>200米</item> <item>300米</item> <item>500米</item> <item>1000米</item> <item>1500米</item>
+        <item>200米</item>
+        <item>300米</item>
+        <item>500米</item>
+        <item>1000米</item>
+        <item>1500米</item>
     </string-array>
     <string-array name="late_time">
-         <item>1分钟</item> <item>2分钟</item> <item>3分钟</item> <item>4分钟</item> <item>5分钟</item> <item>6分钟</item>
-         <item>7分钟</item> <item>8分钟</item> <item>9分钟</item> <item>10分钟</item> <item>11分钟</item> <item>12分钟</item>
-         <item>1分钟</item> <item>1分钟</item> <item>1分钟</item> <item>1分钟</item> <item>1分钟</item> <item>1分钟</item>
-         <item>13分钟</item> <item>14分钟</item> <item>15分钟</item> <item>16分钟</item> <item>17分钟</item> <item>18分钟</item>
-         <item>19分钟</item> <item>20分钟</item> <item>21分钟</item> <item>22分钟</item> <item>23分钟</item> <item>24分钟</item>
-         <item>25分钟</item> <item>26分钟</item> <item>27分钟</item> <item>28分钟</item> <item>29分钟</item> <item>30分钟</item>
+        <item>1分钟</item>
+        <item>2分钟</item>
+        <item>3分钟</item>
+        <item>4分钟</item>
+        <item>5分钟</item>
+        <item>6分钟</item>
+        <item>7分钟</item>
+        <item>8分钟</item>
+        <item>9分钟</item>
+        <item>10分钟</item>
+        <item>11分钟</item>
+        <item>12分钟</item>
+        <item>1分钟</item>
+        <item>1分钟</item>
+        <item>1分钟</item>
+        <item>1分钟</item>
+        <item>1分钟</item>
+        <item>1分钟</item>
+        <item>13分钟</item>
+        <item>14分钟</item>
+        <item>15分钟</item>
+        <item>16分钟</item>
+        <item>17分钟</item>
+        <item>18分钟</item>
+        <item>19分钟</item>
+        <item>20分钟</item>
+        <item>21分钟</item>
+        <item>22分钟</item>
+        <item>23分钟</item>
+        <item>24分钟</item>
+        <item>25分钟</item>
+        <item>26分钟</item>
+        <item>27分钟</item>
+        <item>28分钟</item>
+        <item>29分钟</item>
+        <item>30分钟</item>
     </string-array>
     <string-array name="serious_late_time">
-        <item>10分钟</item> <item>15分钟</item> <item>20分钟</item> <item>25分钟</item> <item>30分钟</item> <item>35分钟</item>
-        <item>40分钟</item> <item>45分钟</item> <item>50分钟</item> <item>55分钟</item> <item>60分钟</item>
+        <item>10分钟</item>
+        <item>15分钟</item>
+        <item>20分钟</item>
+        <item>25分钟</item>
+        <item>30分钟</item>
+        <item>35分钟</item>
+        <item>40分钟</item>
+        <item>45分钟</item>
+        <item>50分钟</item>
+        <item>55分钟</item>
+        <item>60分钟</item>
     </string-array>
     <string-array name="serious_leave_early_time">
-        <item>10分钟</item> <item>15分钟</item> <item>20分钟</item> <item>25分钟</item> <item>30分钟</item> <item>35分钟</item>
-        <item>40分钟</item> <item>45分钟</item> <item>50分钟</item> <item>55分钟</item> <item>60分钟</item>
+        <item>10分钟</item>
+        <item>15分钟</item>
+        <item>20分钟</item>
+        <item>25分钟</item>
+        <item>30分钟</item>
+        <item>35分钟</item>
+        <item>40分钟</item>
+        <item>45分钟</item>
+        <item>50分钟</item>
+        <item>55分钟</item>
+        <item>60分钟</item>
     </string-array>
     <string-array name="absenteeism_time">
-        <item>30分钟</item> <item>40分钟</item> <item>50分钟</item> <item>60分钟</item> <item>70分钟</item> <item>80分钟</item>
-        <item>90分钟</item> <item>100分钟</item> <item>110分钟</item> <item>120分钟</item>
+        <item>30分钟</item>
+        <item>40分钟</item>
+        <item>50分钟</item>
+        <item>60分钟</item>
+        <item>70分钟</item>
+        <item>80分钟</item>
+        <item>90分钟</item>
+        <item>100分钟</item>
+        <item>110分钟</item>
+        <item>120分钟</item>
     </string-array>
     <string name="super_setting">高级设置</string>
     <string name="work_setting">排班设置</string>
@@ -562,4 +626,7 @@
     <string name="title_activity_process_msg">ProcessMsgActivity</string>
     <string name="title_activity_select_calendar">按时间请假</string>
 
+    <!-- TODO: Remove or change this placeholder text -->
+    <string name="hello_blank_fragment">Hello blank fragment</string>
+
 </resources>