|
|
@@ -3,6 +3,7 @@ package com.xzjmyk.pm.activity.ui.erp.fragment;
|
|
|
|
|
|
import android.os.Bundle;
|
|
|
import android.os.Looper;
|
|
|
+import android.util.Log;
|
|
|
import android.view.LayoutInflater;
|
|
|
import android.view.View;
|
|
|
import android.view.ViewGroup;
|
|
|
@@ -11,20 +12,33 @@ import android.widget.ListView;
|
|
|
import android.widget.ScrollView;
|
|
|
import android.widget.TextView;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
import com.lidroid.xutils.ViewUtils;
|
|
|
import com.lidroid.xutils.view.annotation.ViewInject;
|
|
|
+import com.xzjmyk.pm.activity.MyApplication;
|
|
|
import com.xzjmyk.pm.activity.R;
|
|
|
import com.xzjmyk.pm.activity.ui.base.EasyFragment;
|
|
|
+import com.xzjmyk.pm.activity.ui.erp.model.oa.WorkModel;
|
|
|
+import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
|
|
|
+import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
|
|
|
import com.xzjmyk.pm.activity.ui.erp.util.LogUtil;
|
|
|
+import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
|
|
|
+import com.xzjmyk.pm.activity.ui.erp.util.auto.HttpHandler;
|
|
|
import com.xzjmyk.pm.activity.ui.erp.view.oacalender.CalenderView;
|
|
|
import com.xzjmyk.pm.activity.util.TimeUtils;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Iterator;
|
|
|
+import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
- * 个人考勤
|
|
|
+ * 废接口,不做代码规划,乱写以完成任务
|
|
|
*/
|
|
|
-public class AttendanceFragment extends EasyFragment {
|
|
|
+public class AttendanceFragment extends EasyFragment implements HttpHandler.OnResultListener {
|
|
|
@ViewInject(R.id.calender)
|
|
|
private CalenderView calender;
|
|
|
@ViewInject(R.id.month_sv)
|
|
|
@@ -32,6 +46,32 @@ public class AttendanceFragment extends EasyFragment {
|
|
|
@ViewInject(R.id.day_lv)
|
|
|
private ListView day_lv;
|
|
|
|
|
|
+ @ViewInject(R.id.l1)
|
|
|
+ private TextView l1;
|
|
|
+ @ViewInject(R.id.l2)
|
|
|
+ private TextView l2;
|
|
|
+ @ViewInject(R.id.l3)
|
|
|
+ private TextView l3;
|
|
|
+ @ViewInject(R.id.l4)
|
|
|
+ private TextView l4;
|
|
|
+ @ViewInject(R.id.l5)
|
|
|
+ private TextView l5;
|
|
|
+ @ViewInject(R.id.l6)
|
|
|
+ private TextView l6;
|
|
|
+
|
|
|
+ @ViewInject(R.id.r1)
|
|
|
+ private TextView r1;
|
|
|
+ @ViewInject(R.id.r2)
|
|
|
+ private TextView r2;
|
|
|
+ @ViewInject(R.id.r3)
|
|
|
+ private TextView r3;
|
|
|
+ @ViewInject(R.id.r4)
|
|
|
+ private TextView r4;
|
|
|
+ @ViewInject(R.id.r5)
|
|
|
+ private TextView r5;
|
|
|
+ @ViewInject(R.id.r6)
|
|
|
+ private TextView r6;
|
|
|
+
|
|
|
private WorkAdapter adapter;
|
|
|
private Date selectDate = null;
|
|
|
|
|
|
@@ -43,15 +83,23 @@ public class AttendanceFragment extends EasyFragment {
|
|
|
|
|
|
@Override
|
|
|
protected void onCreateView(Bundle savedInstanceState, boolean createView) {
|
|
|
+ if (!createView) return;
|
|
|
ViewUtils.inject(getmRootView());
|
|
|
initView();
|
|
|
initEvent();
|
|
|
}
|
|
|
|
|
|
private void initView() {
|
|
|
-
|
|
|
+ calender.setOnMonthChangeListener(new CalenderView.OnMonthChangeListener() {
|
|
|
+ @Override
|
|
|
+ public void selected(String yyyyMM) {
|
|
|
+ loadByNet(yyyyMM);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ loadByNet(TimeUtils.long2str(System.currentTimeMillis(), "yyyyMM"));
|
|
|
}
|
|
|
|
|
|
+
|
|
|
private void initEvent() {
|
|
|
calender.setOnDateChangeListener(new CalenderView.OnDateSelectListener() {
|
|
|
@Override
|
|
|
@@ -66,11 +114,11 @@ public class AttendanceFragment extends EasyFragment {
|
|
|
@Override
|
|
|
public void selected(String yyyyMM) {
|
|
|
LogUtil.d("yyyyMM=" + yyyyMM);
|
|
|
+ loadByNet(yyyyMM);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* 显示日历下面数据
|
|
|
*
|
|
|
@@ -83,9 +131,186 @@ public class AttendanceFragment extends EasyFragment {
|
|
|
} else {
|
|
|
month_sv.setVisibility(View.GONE);
|
|
|
day_lv.setVisibility(View.VISIBLE);
|
|
|
+ loadWorkData(selectDate.getTime());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void loadByNet(String date) {
|
|
|
+ Map<String, Object> param = new HashMap<>();
|
|
|
+ param.put("emcode", CommonUtil.getSharedPreferences(ct, "erp_username"));
|
|
|
+ param.put("yearmonth", date);
|
|
|
+ HttpHandler.getInstance().loadERPByNet(0x11, "mobile/getPersonAttend.action", param
|
|
|
+ , null, this);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void loadWorkData(long time) {
|
|
|
+ Map<String, Object> param = new HashMap<>();
|
|
|
+ param.put("date", TimeUtils.int_long_2_str(time));
|
|
|
+ param.put("emcode", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username"));
|
|
|
+ Bundle bundle = new Bundle();
|
|
|
+ bundle.putLong("time", time);
|
|
|
+ HttpHandler.getInstance().loadERPByNet(0x12, "mobile/getWorkDate.action", param, bundle, this);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void loadLog(ArrayList<WorkModel> models, Bundle bundle) {
|
|
|
+ long time = 0;
|
|
|
+ if (bundle != null) time = bundle.getLong("time");
|
|
|
+ String date = TimeUtils.s_long_2_str(time);
|
|
|
+ //获取网络数据
|
|
|
+ Map<String, Object> param = new HashMap<>();
|
|
|
+ String code = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username");
|
|
|
+ param.put("currentMaster", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_master"));
|
|
|
+ param.put("page", 1);
|
|
|
+ param.put("pageSize", 100);
|
|
|
+ param.put("condition", "cl_emcode='" + code + "' and to_char(cl_time,'yyyy-MM-dd')='" + date + "'");
|
|
|
+ param.put("caller", "CardLog");
|
|
|
+ param.put("emcode", code);
|
|
|
+ param.put("master", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_master"));
|
|
|
+ bundle.putParcelableArrayList("models", models);
|
|
|
+ bundle.putLong("time", time);
|
|
|
+ HttpHandler.getInstance().loadERPByNet(0x13, "mobile/oa/workdata.action", param, bundle, this);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理打卡签到
|
|
|
+ */
|
|
|
+ private void handlerWorkData(JSONObject object, Bundle bundle) throws Exception {
|
|
|
+ ArrayList<WorkModel> models = new ArrayList<>();
|
|
|
+ if (object.containsKey("wd_degree")) {//有排班
|
|
|
+ if (object.containsKey("Class1")) {
|
|
|
+ handlerByClass(models, object.getJSONObject("Class1"));
|
|
|
+ }
|
|
|
+ if (object.containsKey("Class2")) {
|
|
|
+ handlerByClass(models, object.getJSONObject("Class2"));
|
|
|
+ }
|
|
|
+ if (object.containsKey("Class3")) {
|
|
|
+ handlerByClass(models, object.getJSONObject("Class3"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ListUtils.isEmpty(models)) {
|
|
|
+ //TODO 数据为空时候
|
|
|
}
|
|
|
+ loadLog(models, bundle);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 处理班次情况,简化代码 分开函数
|
|
|
+ *
|
|
|
+ * @param models
|
|
|
+ * @param object
|
|
|
+ */
|
|
|
+ private void handlerByClass(ArrayList<WorkModel> models, JSONObject object) {
|
|
|
+ String wd_onbeg = object.getString("wd_onbeg");
|
|
|
+ String wd_onduty = object.getString("wd_onduty");
|
|
|
+ String wd_offduty = object.getString("wd_offduty");
|
|
|
+ String wd_offend = object.getString("wd_offend");
|
|
|
+ if (StringUtils.isEmpty(wd_onbeg)
|
|
|
+ || StringUtils.isEmpty(wd_onduty)
|
|
|
+ || StringUtils.isEmpty(wd_offduty)
|
|
|
+ || StringUtils.isEmpty(wd_offend)) return;
|
|
|
+ WorkModel model = new WorkModel();
|
|
|
+ model.setWorkStart(wd_onbeg);
|
|
|
+ model.setWorkTime(wd_onduty);
|
|
|
+ String rangeTime = null;
|
|
|
+ try {
|
|
|
+ rangeTime = getStartAndEndTime(true, wd_onduty);
|
|
|
+ if (!StringUtils.isEmpty(rangeTime)) {
|
|
|
+ model.setWorkend(rangeTime);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ model.setOffTime(wd_offduty);
|
|
|
+ model.setOffend(wd_offend);
|
|
|
+ try {
|
|
|
+ rangeTime = getStartAndEndTime(false, wd_offduty);
|
|
|
+ if (!StringUtils.isEmpty(rangeTime)) {
|
|
|
+ model.setOffStart(rangeTime);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ models.add(model);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理打卡签到列表,建议在线程钟使用
|
|
|
+ *
|
|
|
+ * @param models 获取班次信息时候的数据
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ private void handlerWorkLog(JSONObject object, final ArrayList<WorkModel> models) throws Exception {
|
|
|
+ JSONArray listdata = object.getJSONArray("listdata");
|
|
|
+ if (ListUtils.isEmpty(listdata)) {
|
|
|
+ Log.i("gongpengmng", "ListUtils.isEmpty(listdata) 数据为空,容错处理");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String timeLog = null;
|
|
|
+ for (int i = 0; i < listdata.size(); i++) {
|
|
|
+ timeLog = getMinTime(listdata.getJSONObject(i).getString("cl_time"));
|
|
|
+ for (int j = 0; j < models.size(); j++) {
|
|
|
+ WorkModel e = models.get(j);
|
|
|
+ if (StringUtils.isEmpty(e.getWorkStart()) || StringUtils.isEmpty(e.getWorkTime()) ||
|
|
|
+ StringUtils.isEmpty(e.getOffend()) || StringUtils.isEmpty(e.getOffTime()))
|
|
|
+ continue;
|
|
|
+ if (e.getWorkStart().compareTo(timeLog) <= 0 && e.getOffend().compareTo(timeLog) >= 0) {
|
|
|
+ //符合该班次 上班开始时间<time<下班结束时间
|
|
|
+ if (enoughWork(e, timeLog)) {//属于上班打卡
|
|
|
+ models.get(j).setWorkSignin(timeLog);
|
|
|
+ } else if (enoughOff(e, timeLog)) {//属于下班打卡
|
|
|
+ models.get(j).setOffSignin(timeLog);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Log.i("gongpengming", "end showModels");
|
|
|
+ if (!ListUtils.isEmpty(models))
|
|
|
+ for (WorkModel e : models) {
|
|
|
+ Log.i("gongpengming", "getWorkTime" + e.getWorkTime());
|
|
|
+ Log.i("gongpengming", "getOffTime" + e.getOffTime());
|
|
|
+ Log.i("gongpengming", "getWorkSignin" + e.getWorkSignin());
|
|
|
+ Log.i("gongpengming", "getOffSignin" + e.getOffSignin());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getMinTime(String time) {
|
|
|
+ if (StringUtils.isEmpty(time)) {
|
|
|
+ return "";
|
|
|
+ } else {
|
|
|
+ return TimeUtils.long2str(TimeUtils.f_str_2_long(time), "HH:mm");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean enoughWork(WorkModel e, String time) {
|
|
|
+ if (!StringUtils.isEmpty(e.getWorkSignin())) return false;
|
|
|
+ if (time.compareTo(e.getWorkTime()) < 0) return true;//小于上班时间
|
|
|
+ if (time.compareTo(e.getOffTime()) < 0 && time.compareTo(e.getWorkend()) < 0)
|
|
|
+ return true;//小于(下班时间于上班结束计算时间)最小值,小于但是上班没有签到过
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean enoughOff(WorkModel e, String time) {
|
|
|
+ if (time.compareTo(e.getOffTime()) > 0) return true;//大于下班时间
|
|
|
+ if (time.compareTo(e.getWorkTime()) > 0 && time.compareTo(e.getOffStart()) > 0 &&
|
|
|
+ !StringUtils.isEmpty(e.getWorkSignin()))
|
|
|
+ return true;//小于下班时间,但是上班没有签到过
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取截至时间
|
|
|
+ *
|
|
|
+ * @param isWork 是否上班
|
|
|
+ * @param workTime 时间 (上班时间||下班时间)
|
|
|
+ * @return 服务器没有给的时间
|
|
|
+ */
|
|
|
+ private String getStartAndEndTime(boolean isWork, String workTime) throws Exception {
|
|
|
+ long dayTime = TimeUtils.f_str_2_long(TimeUtils.s_long_2_str(System.currentTimeMillis()) + " " + workTime + ":00");//获取当前天的workTime
|
|
|
+ long time = isWork ? dayTime + 90 * 60 * 1000 : dayTime - 90 * 60 * 1000;
|
|
|
+ return TimeUtils.long2str(time, "HH:mm");
|
|
|
+ }
|
|
|
|
|
|
private void setDate2Adapter() {
|
|
|
if (adapter == null) {
|
|
|
@@ -96,6 +321,66 @@ public class AttendanceFragment extends EasyFragment {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void result(int what, boolean isJSON, String message, Bundle bundle) {
|
|
|
+ if (!isJSON) return;
|
|
|
+ JSONObject object = JSON.parseObject(message);
|
|
|
+ switch (what) {
|
|
|
+ case 0x11:
|
|
|
+ handlerDate(object);
|
|
|
+ break;
|
|
|
+ case 0x12:
|
|
|
+ try {
|
|
|
+ handlerWorkData(object, bundle);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 0x13:
|
|
|
+ ArrayList<WorkModel> models = null;
|
|
|
+ if (bundle != null) models = bundle.getParcelableArrayList("models");
|
|
|
+ try {
|
|
|
+ handlerWorkLog(object, models);
|
|
|
+ Iterator<WorkModel> aa = models.iterator();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private void handlerDate(JSONObject object) {
|
|
|
+ l1.setText("应该出勤 " + getNull(object, "ychuqin") + " 天");
|
|
|
+ r1.setText("实际出勤 " + getNull(object, "achuqin") + " 天");
|
|
|
+ l2.setText("正常打卡 " + getNull(object, "nday") + " 天");
|
|
|
+ r2.setText("实际工时 " + getNull(object, "atime") + " 天");
|
|
|
+ l3.setText("迟到 " + getNull(object, "latecount") + " 天");
|
|
|
+ r3.setText("早退 " + getNull(object, "earlycount") + " 天");
|
|
|
+
|
|
|
+ l4.setText("旷工 " + getNull(object, "noncount") + " 天");
|
|
|
+ r4.setText("补卡 " + getNull(object, "qjdaty") + " 天");
|
|
|
+
|
|
|
+ l5.setText("请假 " + getNull(object, "qjdaty") + " 天");
|
|
|
+ r5.setText("加班 " + getNull(object, "qjdaty") + " 天");
|
|
|
+
|
|
|
+ l6.setText("出差 " + getNull(object, "outdays") + " 天");
|
|
|
+ r6.setText("补卡 " + getNull(object, "outcount") + " 天");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private int getNull(JSONObject object, String key) {
|
|
|
+ if (object == null || !object.containsKey(key)) return 0;
|
|
|
+ return object.getIntValue(key);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void error(int what, int statuCode, String message, Bundle bundle) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
class WorkAdapter extends BaseAdapter {
|
|
|
@Override
|