Browse Source

Merge branch 'developer' of https://gitlab.com/Arisono/SkWeiChat-Baidu into uu_v1.0

SpringBoots 8 years ago
parent
commit
8d7e028918
21 changed files with 493 additions and 206 deletions
  1. 22 22
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/message/ProcessMsgActivity.java
  2. 0 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/AddMeetTaskActivity.java
  3. 58 16
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/ApprovalActivity.java
  4. 89 16
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/adapter/oa/ApprovalAdapter.java
  5. 5 4
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/model/oa/Approval.java
  6. 1 2
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/model/oa/ApprovalRecord.java
  7. 158 94
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/ApprovaPresenter.java
  8. 1 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/imp/IApproval.java
  9. 1 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/OpenFilesUtils.java
  10. 12 11
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/platform/task/TaskAddErpActivity.java
  11. 25 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/view/CrashLinearLayoutManager.java
  12. BIN
      WeiChat/src/main/res/drawable-hdpi/edit_template.png
  13. BIN
      WeiChat/src/main/res/drawable-xhdpi/edit_template.png
  14. BIN
      WeiChat/src/main/res/drawable-xxhdpi/edit_template.png
  15. 8 0
      WeiChat/src/main/res/layout/item_approval_node.xml
  16. 66 0
      WeiChat/src/main/res/layout/item_approval_node_tag.xml
  17. 4 0
      WeiChat/src/main/res/layout/item_approval_tag.xml
  18. 1 0
      WeiChat/src/main/res/menu/menu_aproval_set.xml
  19. 2 2
      WeiChat/src/main/res/raw/versionconfiguration.properties
  20. 1 0
      WeiChat/src/main/res/values/values.xml
  21. 39 36
      app_core/network/src/main/java/network/app/http/HttpBase.java

+ 22 - 22
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/message/ProcessMsgActivity.java

@@ -123,7 +123,8 @@ public class ProcessMsgActivity extends BaseActivity implements View.OnClickList
 //                        handleImids(1,array);
                         getEmimids(array);
                         tv_process_un_num.setVisibility(View.VISIBLE);
-                        tv_process_un_num.setText(array.size() + "");
+                        int numSize = ListUtils.getSize(array);
+                        tv_process_un_num.setText(numSize > 99 ? "99+" : (numSize <= 0 ? "" : String.valueOf(numSize)));
                     }
 
                     if (tab_type == 1 && mPosition > 0) {
@@ -599,7 +600,7 @@ public class ProcessMsgActivity extends BaseActivity implements View.OnClickList
                     int tdem_imid = OACheckUtil.getJsonIntager(jsonArray.getJSONObject(position), "EM_IMID");
                     model.name.setText(jp_launchername + "的" + jp_name);
                     if (jp_launchtime != null) {
-                        model.date.setText(DateFormatUtil.getStrDate4Date(new Date(jp_launchtime), "MM-dd HH:mm")+"");
+                        model.date.setText(DateFormatUtil.getStrDate4Date(new Date(jp_launchtime), "MM-dd HH:mm") + "");
                     } else {
                         model.date.setText("");
                     }
@@ -633,31 +634,30 @@ public class ProcessMsgActivity extends BaseActivity implements View.OnClickList
                     String jn_dealresult = jsonArray.getJSONObject(position).getString("JN_DEALRESULT");
                     int done_emid = OACheckUtil.getJsonIntager(jsonArray.getJSONObject(position), "EM_IMID");
                     model.name.setText(jn_dealmanname + "的" + jp_name);
-                    if (!StringUtils.isEmpty(jn_dealtime)){
-                        String ttt =  DateFormatUtil.getStrDate4Date(new Date(TimeUtils.f_str_2_long(jn_dealtime)), "MM-dd HH:mm");
-                        model.date.setText(ttt+"");
-                    }else {
+                    if (!StringUtils.isEmpty(jn_dealtime)) {
+                        String ttt = DateFormatUtil.getStrDate4Date(new Date(TimeUtils.f_str_2_long(jn_dealtime)), "MM-dd HH:mm");
+                        model.date.setText(ttt + "");
+                    } else {
                         model.date.setText("");
                     }
                     if (!StringUtils.isEmpty(jn_dealresult)) {
-                        if ("不同意".equals(jn_dealresult)) {
-                            model.status.setTextColor(getResources().getColor(R.color.red));
-                            model.status.setText("已拒绝");
-
-                        } else {
-                            if ("变更处理人".equals(jn_dealresult)) {
-                                model.status.setTextColor(getResources().getColor(R.color.done_approval));
-                                if (!StringUtils.isEmpty(jsonArray.getJSONObject(position).getString("JN_OPERATEDDESCRIPTION"))) {
-                                    model.status.setText("已变更处理人(" + jsonArray.getJSONObject(position).getString("JN_OPERATEDDESCRIPTION") + ")");
-                                } else {
-                                    model.status.setText("已变更处理人");
-                                }
+                        model.status.setText(jn_dealresult);
+                        int statusTextId = R.color.done_approval;
+                        if (jn_dealresult.startsWith("不同意") || jn_dealresult.startsWith("结束流程") || jn_dealresult.startsWith("未通过")) {
+                            statusTextId = R.color.red;
+                        } else if (jn_dealresult.startsWith("变更处理人")) {
+                            statusTextId = R.color.done_approval;
+                            if (!StringUtils.isEmpty(jsonArray.getJSONObject(position).getString("JN_OPERATEDDESCRIPTION"))) {
+                                model.status.setText("已变更处理人(" + jsonArray.getJSONObject(position).getString("JN_OPERATEDDESCRIPTION") + ")");
                             } else {
-                                model.status.setTextColor(getResources().getColor(R.color.titleBlue));
-                                model.status.setText("已同意");
+                                model.status.setText("已变更处理人");
                             }
-
+                        } else {
+                            statusTextId=  R.color.titleBlue;
                         }
+                        model.status.setTextColor(getResources().getColor(statusTextId));
+                    } else {
+                        model.status.setText("");
                     }
                     model.JP_NODEID = JP_NODEID;
                     model.imid.setVisibility(View.VISIBLE);
@@ -704,7 +704,7 @@ public class ProcessMsgActivity extends BaseActivity implements View.OnClickList
                         if (!StringUtils.isEmpty(name)) name = name.substring(0, name.length() - 2);
                         model.name.setText(name);
                         if (time != null) {
-                            model.date.setText(DateFormatUtil.getStrDate4Date(new Date(time), "MM-dd HH:mm")+"");
+                            model.date.setText(DateFormatUtil.getStrDate4Date(new Date(time), "MM-dd HH:mm") + "");
                         } else {
                             model.date.setText("");
                         }

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

@@ -92,7 +92,6 @@ public class AddMeetTaskActivity extends BaseActivity {
 
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (data == null) return;
         if (requestCode == 0x11 && resultCode == 0x20) {
             if (!isPower)
                 handler.postDelayed(new Runnable() {

+ 58 - 16
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/ApprovalActivity.java

@@ -2,7 +2,7 @@ package com.xzjmyk.pm.activity.ui.erp.activity.oa;
 
 import android.content.Intent;
 import android.os.Bundle;
-import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.DefaultItemAnimator;
 import android.support.v7.widget.RecyclerView;
 import android.text.Editable;
 import android.view.Gravity;
@@ -48,9 +48,12 @@ import com.xzjmyk.pm.activity.ui.erp.util.oa.OAConfig;
 import com.xzjmyk.pm.activity.ui.erp.util.oa.RecognizerDialogUtil;
 import com.xzjmyk.pm.activity.util.DisplayUtil;
 import com.xzjmyk.pm.activity.util.PreferenceUtils;
+import com.xzjmyk.pm.activity.view.CrashLinearLayoutManager;
 
 import java.util.ArrayList;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -70,7 +73,7 @@ public class ApprovalActivity extends OABaseActivity implements IApproval, Appro
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         if (item.getItemId() == R.id.oa_approval_set && mAdapter != null && !ListUtils.isEmpty(mAdapter.getApprovals())) {
-            mPresenter.trun2SetActivity(this, mAdapter.getApprovals());
+            mPresenter.trun2SetActivity(this);
         } else if (item.getItemId() == R.id.returnOld) {
             Intent intent = new Intent(ct, AppWebViewActivity.class);
             String title = getIntent().getStringExtra("title");
@@ -106,16 +109,28 @@ public class ApprovalActivity extends OABaseActivity implements IApproval, Appro
 
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (data != null && requestCode == 0x20) {
-            SelectEmUser user = data.getParcelableExtra("data");
-            if (user != null && !StringUtils.isEmpty(user.getEmCode())) {
-                mPresenter.updateAssignee(user.getEmCode(), OACheckUtil.getText(opinionET));
+        if (requestCode == 0x20) {
+            if (data==null){
+                mPresenter.updateAssignee(null, OACheckUtil.getText(opinionET));
+            }else{
+                SelectEmUser user = data.getParcelableExtra("data");
+                if (user != null && !StringUtils.isEmpty(user.getEmCode())) {
+                    mPresenter.updateAssignee(user.getEmCode(), OACheckUtil.getText(opinionET));
+                }
             }
-        } else if (data != null && 0x22 == requestCode) {
+
+        } else if (data != null && (0x22 == requestCode || 0x21 == requestCode)) {
             SelectBean d = data.getParcelableExtra("data");
             if (d == null) return;
             String name = StringUtils.isEmpty(d.getName()) ? "" : d.getName();
-            getEmnameByReturn(name);
+            if (0x21 == requestCode) {
+                getEmnameByReturn(name);
+            } else {
+                if (name.equals("回退发起人")) {
+                    name = "RECORDER";
+                }
+                mPresenter.disAgree(OACheckUtil.getText(opinionET), name);
+            }
         } else if (0x25 == requestCode && 0x25 == resultCode) {
             mPresenter.initLoad();
         }
@@ -131,7 +146,7 @@ public class ApprovalActivity extends OABaseActivity implements IApproval, Appro
     }
 
     private void initView() {
-        contentRV.setLayoutManager(new LinearLayoutManager(ct));
+        contentRV.setLayoutManager(new CrashLinearLayoutManager(ct));
         findViewById(R.id.commonWordsIV).setOnClickListener(this);//常用语
         findViewById(R.id.nextTV).setOnClickListener(this);
         findViewById(R.id.voiceIV).setOnClickListener(this);
@@ -185,7 +200,17 @@ public class ApprovalActivity extends OABaseActivity implements IApproval, Appro
                 mPresenter.loadProcessUpdate(OACheckUtil.getText(opinionET), approvals);
                 break;
             case R.id.disagreeTV://不同意
-                mPresenter.disAgree(OACheckUtil.getText(opinionET));
+                List<String> nodes = mPresenter.getNodesCanReturn();
+                if (StringUtils.isEmpty(OACheckUtil.getText(opinionET))) {
+                    opinionET.setFocusable(true);
+                    showToast(R.string.approval_opinion_error, R.color.load_submit);
+                } else {
+                    if (ListUtils.isEmpty(nodes)) {
+                        mPresenter.disAgree(OACheckUtil.getText(opinionET), null);
+                    } else {
+                        sendToSelect(nodes, 0x22, "选择回退节点");
+                    }
+                }
                 break;
             case R.id.nextTV: //下一条
                 hineOpinion();
@@ -255,8 +280,10 @@ public class ApprovalActivity extends OABaseActivity implements IApproval, Appro
 
 
     @Override
-    public void showModels(List<Approval> approvals) {
-        mAdapter = new ApprovalAdapter(this, approvals, mPresenter.isApprovaling());
+    public void showModels(List<Approval> approvals, List<Approval> historyNodes) {
+        mAdapter = new ApprovalAdapter(this, approvals, historyNodes, mPresenter.isApprovaling());
+        contentRV.setHasFixedSize(false);
+        contentRV.setItemAnimator(new DefaultItemAnimator());
         contentRV.setAdapter(mAdapter);
         mAdapter.setOnChangeClickListener(this);
     }
@@ -302,19 +329,34 @@ public class ApprovalActivity extends OABaseActivity implements IApproval, Appro
 
     @Override
     public void sendToSelect(JSONArray data) {
+        List<String> nodes = new ArrayList<>();
+        for (int i = 0; i < data.size(); i++) {
+            nodes.add(data.getString(i));
+        }
+        sendToSelect(nodes, 0x21, "选择审批人");
+    }
+
+    public void sendToSelect(List<String> seletcNodes, int requestCode, String title) {
         ArrayList<SelectBean> beans = new ArrayList<>();
         SelectBean bean = null;
-        for (int i = 0; i < data.size(); i++) {
+        Set<String> set = new LinkedHashSet<String>();
+        set.addAll(seletcNodes);
+        for (String s : set) {
             bean = new SelectBean();
-            bean.setName(data.getString(i));
+            bean.setName(s);
             bean.setClick(false);
             beans.add(bean);
         }
+        if (requestCode == 0x22) {
+            bean = new SelectBean();
+            bean.setName("回退发起人");
+            beans.add(0, bean);
+        }
         Intent intent = new Intent(ct, SelectActivity.class);
         intent.putExtra("type", 2);
         intent.putParcelableArrayListExtra("data", beans);
-        intent.putExtra("title", "选择审批人");
-        startActivityForResult(intent, 0x22);
+        intent.putExtra("title", title);
+        startActivityForResult(intent, requestCode);
     }
 
 

+ 89 - 16
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/adapter/oa/ApprovalAdapter.java

@@ -25,14 +25,15 @@ import com.xzjmyk.pm.activity.ui.erp.entity.EditChangeListener;
 import com.xzjmyk.pm.activity.ui.erp.model.oa.Approval;
 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.OACheckUtil;
 import com.xzjmyk.pm.activity.ui.erp.util.OpenFilesUtils;
 import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
+import com.xzjmyk.pm.activity.ui.erp.view.CustomProgressDialog;
 import com.xzjmyk.pm.activity.ui.tool.SingleImagePreviewActivity;
 import com.xzjmyk.pm.activity.util.CalendarUtils;
 import com.xzjmyk.pm.activity.view.wheel.DatePicker;
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -42,12 +43,14 @@ import java.util.List;
 public class ApprovalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
     private OABaseActivity ct;
     private List<Approval> approvals;
+    private List<Approval> historyNodes;
     private boolean isApprovaling;
 
-    public ApprovalAdapter(OABaseActivity ct, List<Approval> approvals, boolean isApprovaling) {
+    public ApprovalAdapter(OABaseActivity ct, List<Approval> approvals, List<Approval> historyNodes, boolean isApprovaling) {
         this.isApprovaling = isApprovaling;
         this.ct = ct;
         this.approvals = approvals;
+        this.historyNodes = historyNodes;
     }
 
     public List<Approval> getApprovals() {
@@ -85,6 +88,8 @@ public class ApprovalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
                 return new PointsViewHolder(parent);
             case Approval.NODES:
                 return new NodeViewHolder(parent);
+            case Approval.NODES_TAG:
+                return new NodeTagViewHolder(parent);
             default: return new BaseRVViewHodler(parent);
         }
     }
@@ -102,18 +107,51 @@ public class ApprovalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
                 bindPointsView((PointsViewHolder) holder, position);
             } else if (holder instanceof NodeViewHolder) {
                 bindNodeView((NodeViewHolder) holder, position);
+            } else if (holder instanceof NodeTagViewHolder) {
+                bindNodeTagView((NodeTagViewHolder) holder, position);
             }
         } catch (Exception e) {
 
         }
     }
 
+    private void bindNodeTagView(NodeTagViewHolder holder, int position) {
+        View.OnClickListener listener = new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                boolean isNode = v.getId() == R.id.nodeTv;
+                if ((isNode && holder.nodeTag.getVisibility() == View.GONE) || (!isNode && holder.historyTag.getVisibility() == View.GONE)) {
+                    List<Approval> newApprovals = new ArrayList<Approval>();
+                    List<Approval> approvals1 = approvals.subList(0, position + 1);
+                    List<Approval> approvals2 = approvals.subList(position + 1, approvals.size());
+                    newApprovals.addAll(approvals1);
+                    newApprovals.addAll(historyNodes);
+                    historyNodes = approvals2;
+                    if (newApprovals.get(position).getType() == Approval.NODES_TAG) {
+                        newApprovals.get(position).setNeerInput(!isNode);
+                    }
+                    approvals = newApprovals;
+                    notifyItemRangeChanged(position, approvals.size() - 1);
+                }
+            }
+        };
+        holder.historyTV.setOnClickListener(listener);
+        holder.nodeTv.setOnClickListener(listener);
+        if (approvals.get(position).isNeerInput()) {
+            holder.nodeTag.setVisibility(View.GONE);
+            holder.historyTag.setVisibility(View.VISIBLE);
+        } else {
+            holder.nodeTag.setVisibility(View.VISIBLE);
+            holder.historyTag.setVisibility(View.GONE);
+        }
+    }
+
     private void bindNodeView(NodeViewHolder holder, int position) {
         Approval approval = approvals.get(position);
-        if (position > 0 && approvals.get(position - 1).getType() != Approval.NODES) {
-            holder.padding.setVisibility(View.VISIBLE);
-        } else {
+        if (position > 0 && approvals.get(position - 1).getType() == Approval.NODES_TAG || approvals.get(position - 1).getType() == Approval.NODES) {
             holder.padding.setVisibility(View.GONE);
+        } else {
+            holder.padding.setVisibility(View.VISIBLE);
         }
         int textColor = R.color.hintColor;
         int reId = R.drawable.weishenpi;
@@ -122,10 +160,10 @@ public class ApprovalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
             if (approval.getIdKey().startsWith("待审批")) {
                 textColor = R.color.approvaling;
                 reId = R.drawable.daishenpi;
-            } else if (approval.getIdKey().startsWith("未通过") || approval.getIdKey().startsWith("结束")) {
+            } else if (approval.getIdKey().startsWith("未通过") || approval.getIdKey().startsWith("结束") || approval.getIdKey().startsWith("不同意")) {
                 textColor = R.color.crimson;
                 reId = R.drawable.node_delete;
-            } else if (approval.getIdKey().startsWith("已审批") || approval.getIdKey().startsWith("变更")) {
+            } else if (approval.getIdKey().startsWith("已审批") || approval.getIdKey().startsWith("变更") || approval.getIdKey().startsWith("同意")) {
                 reId = R.drawable.node_finished3;
             }
         } else {
@@ -136,18 +174,20 @@ public class ApprovalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
         holder.statusIV.setImageResource(reId);
         AvatarHelper.getInstance().display(String.valueOf(approval.getId()), holder.handIv, true, false);
         if (reId == R.drawable.daishenpi && isApprovaling) {
-            holder.timeTv.setText(OACheckUtil.getString(R.string.common_changedealman));
-            holder.timeTv.setOnClickListener(new View.OnClickListener() {
+            holder.changeUser.setVisibility(View.VISIBLE);
+            holder.timeTv.setText("");
+            holder.changeUser.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                     if (onChangeClickListener != null)
                         onChangeClickListener.click();
                 }
             });
-            holder.timeTv.setTextColor(ct.getResources().getColor(R.color.titleBlue));
+//            holder.timeTv.setTextColor(ct.getResources().getColor(R.color.titleBlue));
         } else {
+            holder.changeUser.setVisibility(View.GONE);
             holder.timeTv.setOnClickListener(null);
-            holder.timeTv.setTextColor(ct.getResources().getColor(R.color.text_normal));
+//            holder.timeTv.setTextColor(ct.getResources().getColor(R.color.text_normal));
             holder.timeTv.setText(approval.getValues());
         }
 
@@ -239,10 +279,12 @@ public class ApprovalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
 
     private void gotoReadEnclosure(Approval approval) {
         String url = approval.getIdKey();
+        final CustomProgressDialog progressDialog = CustomProgressDialog.createDialog(ct);
+        progressDialog.setTitile("正在下载");
+        progressDialog.setMessage("正在下载,请勿关闭程序");
+        LogUtil.i("gotoReadEnclosure");
         if (!StringUtils.isEmpty(approval.getCaption())) {
-            if (approval.getCaption().endsWith("jpeg")
-                    || approval.getCaption().endsWith("jpg")
-                    || approval.getCaption().endsWith("png")) {
+            if (isImage(approval.getCaption())) {
                 Intent intent = new Intent(ct, SingleImagePreviewActivity.class);
                 intent.putExtra(AppConstant.EXTRA_IMAGE_URI, url);
                 ct.startActivity(intent);
@@ -250,11 +292,15 @@ public class ApprovalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
                 OpenFilesUtils.downLoadFile(url, approval.getCaption(), new OpenFilesUtils.OnFileLoadListener() {
                     @Override
                     public void onLoadIng(int progress, int allProgress) {
-                        //TODO 下载进行中回调
+                        if (progressDialog != null)
+                            progressDialog.show();
+                        LogUtil.i("TODO 下载进行中回调");
                     }
 
                     @Override
                     public void onSuccess(File file) {
+                        if (progressDialog != null)
+                            progressDialog.dismiss();
                         OpenFilesUtils.openCommonFils(ct, file);
                     }
 
@@ -423,7 +469,7 @@ public class ApprovalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
     }
 
     private class NodeViewHolder extends RecyclerView.ViewHolder {
-        ImageView handIv, statusIV;
+        ImageView handIv, statusIV, changeUser;
         TextView timeTv, keyTv, valuesTv;
         View padding;
 
@@ -438,7 +484,27 @@ public class ApprovalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
             valuesTv = (TextView) itemView.findViewById(R.id.valuesTv);
             handIv = (ImageView) itemView.findViewById(R.id.handIv);
             statusIV = (ImageView) itemView.findViewById(R.id.statusIV);
+            changeUser = (ImageView) itemView.findViewById(R.id.changeUser);
             padding = itemView.findViewById(R.id.padding);
+            changeUser.setVisibility(View.GONE);
+        }
+    }
+
+    private class NodeTagViewHolder extends RecyclerView.ViewHolder {
+        TextView nodeTv, historyTV;
+        View nodeTag, historyTag;
+
+        public NodeTagViewHolder(ViewGroup parent) {
+            this(LayoutInflater.from(ct).inflate(R.layout.item_approval_node_tag, parent, false));
+        }
+
+        public NodeTagViewHolder(View itemView) {
+            super(itemView);
+            nodeTv = (TextView) itemView.findViewById(R.id.nodeTv);
+            historyTV = (TextView) itemView.findViewById(R.id.historyTV);
+            nodeTag = itemView.findViewById(R.id.nodeTag);
+            historyTag = itemView.findViewById(R.id.historyTag);
+            historyTag.setVisibility(View.GONE);
         }
     }
 
@@ -521,4 +587,11 @@ public class ApprovalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
     public interface OnChangeClickListener {
         void click();
     }
+
+
+    private boolean isImage(String name) {
+        return name.toUpperCase().endsWith("jpeg".toUpperCase())
+                || name.toUpperCase().endsWith("jpg".toUpperCase())
+                || name.toUpperCase().endsWith("png".toUpperCase());
+    }
 }

+ 5 - 4
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/model/oa/Approval.java

@@ -24,10 +24,11 @@ public class Approval {
             , MAIN = 12  //主表
             , DETAIL = 13//从表
             , SETUPTASK = 14//历史审批要点
-            ,ENCLOSURE = 16//附件
+            , ENCLOSURE = 16//附件
             , POINTS = 17//要点
-            , NODES = 18//审批节点
-            , TAG = 19;//标题
+            , NODES_TAG = 18//审批节点标记
+            , NODES = 19//审批节点
+            , TAG = 20;//标题
 
     private boolean neerInput = false;//是否需要输入
     private boolean mustInput = false;//是否是必填字段
@@ -255,7 +256,7 @@ public class Approval {
         }
     }
 
-    @IntDef({TITLE, MAIN, DETAIL, ENCLOSURE, POINTS, NODES, TAG,SETUPTASK})
+    @IntDef({TITLE, MAIN, DETAIL, ENCLOSURE, POINTS, NODES, TAG, SETUPTASK, NODES_TAG})
     @Retention(RetentionPolicy.SOURCE)
     public @interface Duration {
     }

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

@@ -10,6 +10,7 @@ import java.util.Map;
  */
 
 public class ApprovalRecord {
+    public boolean isForknode = false;
     public int id = 0;
     public int nodeId = 0;
     public String title;
@@ -23,8 +24,6 @@ public class ApprovalRecord {
     public String caller = "";
 
 
-
-
     @Override
     public String toString() {
         Map<String, Object> map = new HashMap<>();

+ 158 - 94
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/ApprovaPresenter.java

@@ -69,22 +69,26 @@ public class ApprovaPresenter implements OnHttpResultListener {
     private String title;
     private String master;
     private List<Approval> approvals;
-    private List<Approval> hineApprovals;
 
-    private boolean submit, loading;
+    private List<Approval> hineApprovals;//隐藏字段
+    private List<Approval> showApprovals;//显示字段
+    private List<Approval> historyNodes;
+
+    private boolean submit, loading, endActivity;
 
     public ApprovaPresenter(IApproval iApproval, Intent intent) {
         this.iApproval = iApproval;
+        endActivity = false;
         if (intent != null) {
             int id = intent.getIntExtra("nodeid", -1);
-            String imid = intent.getStringExtra("imid");
+//            String imid = intent.getStringExtra("imid");
             title = intent.getStringExtra("title");
             master = intent.getStringExtra("master");
             if (StringUtils.isEmpty(master)) master = CommonUtil.getMaster();
             if (id != -1) {
-                initLoad(id, imid);
+                initLoad(id);
             } else {
-                initLoad(0, imid);
+                initLoad(0);
             }
         } else {
             initLoad(0);
@@ -96,38 +100,23 @@ public class ApprovaPresenter implements OnHttpResultListener {
         return title.equals(OACheckUtil.getString(R.string.title_approval));
     }
 
-    public void trun2SetActivity(Activity activity, List<Approval> approvals) {
+    public boolean isApprovaled() {
+        if (StringUtils.isEmpty(title)) return false;
+        return title.equals(OACheckUtil.getString(R.string.task_confimed));
+    }
+
+    public void trun2SetActivity(Activity activity) {
         if (loading) return;
         ArrayList<Data> fields = new ArrayList<>();
         ArrayList<Data> fieldsDis = new ArrayList<>();
-        boolean addDetailed = false;
-        boolean canAddDetail = true;
-        for (Approval approval : approvals) {
-            if (approval.getType() == Approval.MAIN) {
-                Data data = new Data(true, approval);
-                fieldsDis.add(data);
-            } else if (approval.getType() == DETAIL && canAddDetail) {
-                Data data = new Data(false, approval);
-                fieldsDis.add(data);
-                addDetailed = true;
-            } else if (addDetailed) {
-                canAddDetail = false;
-            }
-        }
-        addDetailed = false;
-        canAddDetail = true;
         if (!ListUtils.isEmpty(hineApprovals)) {
             for (Approval approval : hineApprovals) {
-                if (approval.getType() == Approval.MAIN) {
-                    Data data = new Data(true, approval);
-                    fields.add(data);
-                } else if (approval.getType() == DETAIL && canAddDetail) {
-                    Data data = new Data(false, approval);
-                    fields.add(data);
-                    addDetailed = true;
-                } else if (addDetailed) {
-                    canAddDetail = false;
-                }
+                fields.add(new Data(approval.getType() == Approval.MAIN, approval));
+            }
+        }
+        if (!ListUtils.isEmpty(showApprovals)) {
+            for (Approval approval : showApprovals) {
+                fieldsDis.add(new Data(approval.getType() == Approval.MAIN, approval));
             }
         }
         activity.startActivityForResult(new Intent(activity, DataFormFieldActivity.class)
@@ -139,10 +128,7 @@ public class ApprovaPresenter implements OnHttpResultListener {
     }
 
     public void closeDB() {
-//        if (manager != null) {
-//            manager.closeDB();
-//            manager = null;
-//        }
+        endActivity = true;
     }
 
     public String getUrl(String baseUrl, String title) {
@@ -153,6 +139,18 @@ public class ApprovaPresenter implements OnHttpResultListener {
         return baseUrl + record.nodeId + endStatus;
     }
 
+    public List<String> getNodesCanReturn() {
+        List<String> list = new ArrayList<>();
+        if (record.isForknode && !ListUtils.isEmpty(historyNodes)) {
+            for (Approval a : historyNodes) {
+                if (a.getIdKey().startsWith("同意") && a.isNeerInput()) {
+                    list.add(a.getValuesKey());
+                }
+            }
+        }
+        return list;
+    }
+
     public String getMaster() {
         return master == null ? CommonUtil.getMaster() : master;
     }
@@ -161,17 +159,14 @@ public class ApprovaPresenter implements OnHttpResultListener {
         initLoad(record.nodeId);
     }
 
-    private void initLoad(int nodeId) {
-        initLoad(nodeId, "");
-    }
 
-    private void initLoad(int nodeId, String imid) {
+    private void initLoad(int nodeId) {
         record = new ApprovalRecord();
         approvals = new ArrayList<>();
         hineApprovals = new ArrayList<>();
+        showApprovals = new ArrayList<>();
+        historyNodes = null;
         record.nodeId = nodeId;
-        if (imid != null)
-            record.imid = imid;
         iApproval.initStatus();
         submit = false;
         loading = false;
@@ -192,6 +187,10 @@ public class ApprovaPresenter implements OnHttpResultListener {
             iApproval.showToast(R.string.submit_cannot_submit_again, R.color.load_submit);
             return;
         }
+        if (StringUtils.isEmpty(emCode)) {
+            loadNextProcess();
+            return;
+        }
         iApproval.showLoading();
         String url = "common/setAssignee.action";
         Map<String, Object> param = new HashMap<>();
@@ -296,12 +295,26 @@ public class ApprovaPresenter implements OnHttpResultListener {
 
     //结束流程
     private void loadEndProcess() {
-        String url = "common/endProcessInstance.action";
+        //结束流程接口部分
+//        String url = "common/endProcessInstance.action";
+//        Map<String, Object> param = new HashMap<>();
+//        param.put("processInstanceId", record.processInstanceId);
+//        param.put("holdtime", 435);
+//        param.put("nodeId", record.nodeId);
+//        param.put("master", master);
+        if (!canSubmit()) return;
+        iApproval.showLoading();
+        String url = "common/review.action";
         Map<String, Object> param = new HashMap<>();
-        param.put("processInstanceId", record.processInstanceId);
-        param.put("holdtime", 435);
-        param.put("nodeId", record.nodeId);
+        param.put("taskId", record.nodeId);
+        param.put("nodeName", record.nodeName);
+        param.put("nodeLog", "流程异常,结束流程");
         param.put("master", master);
+        param.put("result", false);
+        param.put("backTaskName", "RECORDER");//jn_name
+        param.put("attachs", "");//附件id
+        param.put("_noc", 1);//权限管控
+        param.put("holdtime", 4311);//holdtime
         Request.Bulider bulider = new Request.Bulider()
                 .setUrl(url)
                 .setWhat(LOAD_END_PROCESS)
@@ -328,7 +341,7 @@ public class ApprovaPresenter implements OnHttpResultListener {
     }
 
     /*不同意 submiting*/
-    public void disAgree(String nodeLog) {
+    public void disAgree(String nodeLog, String backTaskName) {
         if (StringUtils.isEmpty(nodeLog)) {
             iApproval.showToast(R.string.approval_opinion_error, R.color.load_submit);
             return;
@@ -343,7 +356,8 @@ public class ApprovaPresenter implements OnHttpResultListener {
         param.put("nodeLog", nodeLog);
         param.put("master", master);
         param.put("result", false);
-        param.put("backTaskName", "RECORDER");
+        if (StringUtils.isEmpty(backTaskName)) backTaskName = "RECORDER";
+        param.put("backTaskName", backTaskName);//jn_name
         param.put("attachs", "");//附件id
         param.put("_noc", 1);//权限管控
         param.put("holdtime", 4311);//holdtime
@@ -502,6 +516,11 @@ public class ApprovaPresenter implements OnHttpResultListener {
 
     @Override
     public void result(int what, boolean isJSON, String message, Bundle bundle) {
+        if (endActivity) {
+            loading = false;
+            submit = false;
+            return;
+        }
         try {
             if (!isJSON) {
                 LogUtil.i("!isJSON");
@@ -518,11 +537,13 @@ public class ApprovaPresenter implements OnHttpResultListener {
 
     @Override
     public void error(int what, String message, Bundle bundle) {
+        if (endActivity) return;
         iApproval.dimssLoading();
         switch (what) {
             case LOAD_AGREE:
                 if (message.contains("程序错误")) {
                     loadEndProcess();
+//                    disAgree("流程异常,结束流程", null);
                 }
             case LOAD_TAKE_OVER:  /*提交部分*/
             case LOAD_PROCESS_UPDATE:
@@ -658,8 +679,8 @@ public class ApprovaPresenter implements OnHttpResultListener {
     //处理当前结点信息
     private void handlerCurrentNode(JSONObject object) throws Exception {
         if (object != null && !loading) {
-            String instanceId = getJson2Text(object, "InstanceId");
-            record.processInstanceId = instanceId;
+            record.processInstanceId = getJson2Text(object, "InstanceId");
+            record.isForknode = OACheckUtil.getJsonIntager(object, "forknode") == 0;
             JSONObject currentnode = OACheckUtil.getJSONObject(object, "currentnode");
             if (currentnode != null) {
                 String recordName = getJson2Text(currentnode, "jp_launcherName");
@@ -696,6 +717,7 @@ public class ApprovaPresenter implements OnHttpResultListener {
             handerTitle(0);
             loadDetailedList();//获取明细表
         } else {
+            LogUtil.i("loading=" + loading);
             loading = false;
         }
     }
@@ -705,10 +727,10 @@ public class ApprovaPresenter implements OnHttpResultListener {
             //计算主表
             JSONArray formdatas = OACheckUtil.getJsonArray(object, "formdata");
             JSONArray formconfigs = OACheckUtil.getJsonArray(object, "formconfigs");
-            if (!ListUtils.isEmpty(formdatas) && !ListUtils.isEmpty(formconfigs)) {
-                final JSONObject formdata = formdatas.getJSONObject(0);
-                if (!ListUtils.isEmpty(formconfigs) && formdata != null) {
-                    final List<Approval> mainApproval = formandGriddata(formdata, formconfigs, record.caller, true);
+            if (!ListUtils.isEmpty(formconfigs)) {
+                final JSONObject formdata = ListUtils.isEmpty(formdatas) ? null : formdatas.getJSONObject(0);
+                if (!ListUtils.isEmpty(formconfigs)) {
+                    final List<Approval> mainApproval = formandGriddata(formdata, formconfigs, record.caller, true, true);
                     setData2ListThread(Approval.MAIN, mainApproval);
                 }
             }
@@ -716,15 +738,21 @@ public class ApprovaPresenter implements OnHttpResultListener {
             JSONArray griddatas = OACheckUtil.getJsonArray(object, "griddata");
             JSONArray gridconfigs = OACheckUtil.getJsonArray(object, "gridconfigs");
             final List<Approval> detailedList = new ArrayList<>();
-            if (!ListUtils.isEmpty(griddatas) && !ListUtils.isEmpty(gridconfigs)) {
-                for (int i = 0; i < griddatas.size(); i++) {
-                    //获取到单个明细表单
-                    final List<Approval> detailedApproval = formandGriddata(griddatas.getJSONObject(i), gridconfigs, record.caller, false);
-                    if (!ListUtils.isEmpty(detailedApproval)) {
-                        Approval approval = new Approval(Approval.TAG);
-                        approval.setCaption(getString(R.string.serial_number) + (i + 1));
-                        detailedApproval.add(0, approval);
-                        detailedList.addAll(detailedApproval);
+            if (!ListUtils.isEmpty(gridconfigs)) {
+                if (ListUtils.isEmpty(griddatas)) {
+                    formandGriddata(null, gridconfigs, record.caller, false, true);
+                } else {
+                    for (int i = 0; i < griddatas.size(); i++) {
+                        //获取到单个明细表单
+                        final List<Approval> detailedApproval = formandGriddata(griddatas.getJSONObject(i),
+                                gridconfigs, record.caller,
+                                false, i == 0);
+                        if (!ListUtils.isEmpty(detailedApproval)) {
+                            Approval approval = new Approval(Approval.TAG);
+                            approval.setCaption(getString(R.string.serial_number) + (i + 1));
+                            detailedApproval.add(0, approval);
+                            detailedList.addAll(detailedApproval);
+                        }
                     }
                 }
             }
@@ -745,7 +773,7 @@ public class ApprovaPresenter implements OnHttpResultListener {
                     if (!ListUtils.isEmpty(otherGriddata) && !ListUtils.isEmpty(otherGridconfigs)) {
                         for (int j = 0; j < otherGriddata.size(); j++) {
                             //获取到单个明细表单
-                            final List<Approval> detailedApproval = formandGriddata(otherGriddata.getJSONObject(j), otherGridconfigs, caller, false);
+                            final List<Approval> detailedApproval = formandGriddata(otherGriddata.getJSONObject(j), otherGridconfigs, caller, false, false);
                             if (!ListUtils.isEmpty(detailedApproval)) {
                                 Approval approval = new Approval(Approval.TAG);
                                 approval.setCaption(name + " " + getString(R.string.serial_number) + (j + 1));
@@ -772,8 +800,12 @@ public class ApprovaPresenter implements OnHttpResultListener {
         }
     }
 
-
-    private List<Approval> formandGriddata(final JSONObject data, final JSONArray configs, String caller, boolean isMain) throws Exception {
+    //TODO 1.隐藏字段明细表重复 2.不该显示字段被显示
+    private List<Approval> formandGriddata(final JSONObject data,
+                                           final JSONArray configs,
+                                           String caller,
+                                           boolean isMain,
+                                           boolean addHint) throws Exception {
         List<Approval> approvals = new ArrayList<>();
         String idTag = "";
         int id = 0;
@@ -810,13 +842,22 @@ public class ApprovaPresenter implements OnHttpResultListener {
             if (approval.isDftypeEQ("H")
                     || isdefault != -1
                     || appwidth == 0
-                    || (!isMain && OACheckUtil.getJsonIntager(config, "DG_WIDTH") == 0)
-                    || OACheckUtil.isEmpty(valueKey)
-                    || OACheckUtil.isEmpty(caption)
-                    || (merged.length() > 0 && merged.toString().contains(valueKey))) {
-                if (isdefault == 0) {
+                    || (!isMain && OACheckUtil.getJsonIntager(config, "DG_WIDTH") == 0)) {
+                continue;
+            }
+            boolean showAble = data != null && data.containsKey(valueKey);
+            if (!OACheckUtil.isEmpty(caption)) {
+                if (showAble) {
+                    approval.setValues(OACheckUtil.getJson2Text(data, valueKey)); //获取第一个字段的值
+                    if (addHint) {
+                        showApprovals.add(approval);
+                    }
+                } else if (addHint) {
                     hineApprovals.add(approval);
                 }
+            }
+
+            if (OACheckUtil.isEmpty(valueKey) || OACheckUtil.isEmpty(caption) || (merged.length() > 0 && merged.toString().contains("," + valueKey + ","))) {
                 continue;
             }
             //添加下拉数据
@@ -829,7 +870,6 @@ public class ApprovaPresenter implements OnHttpResultListener {
                         approval.getDatas().add(new Approval.Data(display, value));
                 }
             }
-            approval.setValues(OACheckUtil.getJson2Text(data, valueKey)); ;//获取第一个字段的值
             boolean mergeAble = appwidth == 1 || (approval.isDftypeEQ("MT"));
             approval.data2Values();
             approval.setMustInput(true);
@@ -848,7 +888,7 @@ public class ApprovaPresenter implements OnHttpResultListener {
             }
             if (!isApprovaling())
                 approval.setNeerInput(false);
-            if (!approval.isNeerInput() && StringUtils.isEmpty(approval.getValues())) {
+            if ((!approval.isNeerInput() && StringUtils.isEmpty(approval.getValues())) || !showAble || approval.getValues().equals("null") || !showAble || approval.getValues().equals("(null)")) {
                 continue;//如果不是要输入的对象,同时显示值为空,需要隐藏去
             }
             if (mergeAble) {
@@ -856,7 +896,7 @@ public class ApprovaPresenter implements OnHttpResultListener {
                 if (!StringUtils.isEmpty(valueTagKey)) {
                     String valueTag = OACheckUtil.getJson2Text(data, valueTagKey);
                     if (!StringUtils.isEmpty(valueTag)) {
-                        merged.append(valueTagKey + ",");
+                        merged.append("," + valueTagKey + ",");
                         approval.addValues("/" + valueTag);
                     }
                 }
@@ -864,7 +904,10 @@ public class ApprovaPresenter implements OnHttpResultListener {
             approval.setCaller(caller);
             approvals.add(approval);
         }
-        for (Approval approval : approvals) {
+        for (
+                Approval approval : approvals)
+
+        {
             approval.setId(id);
             approval.setIdKey(idTag);
         }
@@ -904,14 +947,17 @@ public class ApprovaPresenter implements OnHttpResultListener {
         return itemSetuptasks;
     }
 
+    //    //1.forknode==0 (非并行节点)    2.jn_dealResult == '同意'   3.jn_attach == 'T'
     private Approval getNodeApproval(JSONObject object) {
         String nodeName = OACheckUtil.getJson2Text(object, "jn_name");//当前结点名称
         String emCode = OACheckUtil.getJson2Text(object, "jn_dealManId");//节点处理人编号
         String manName = OACheckUtil.getJson2Text(object, "jn_dealManName");//处理人名字
         String dealTime = OACheckUtil.getJson2Text(object, "jn_dealTime");//审批时间
         String result = OACheckUtil.getJson2Text(object, "jn_dealResult");//审批结果
+        String attach = OACheckUtil.getJson2Text(object, "jn_attach");//选择类型
         String description = OACheckUtil.getJson2Text(object, "jn_nodeDescription");//审批意见
         Approval approval = new Approval(Approval.NODES);
+        approval.setNeerInput("T".equals(attach));
         approval.setCaption(manName);
         approval.setDfType(emCode);
         if (!StringUtils.isEmpty(dealTime)) {
@@ -919,19 +965,17 @@ public class ApprovaPresenter implements OnHttpResultListener {
         }
         StringBuilder resultBuilder = new StringBuilder();
         if (!StringUtils.isEmpty(result)) {
-            if (result.equals("同意")) {
-                resultBuilder.append("已审批");
-            } else if (result.equals("不同意")) {
-                resultBuilder.append("未通过");
-            } else {
-                resultBuilder.append(result);
-            }
+            resultBuilder.append(result);
         }
         if (!StringUtils.isEmpty(description)) {
             resultBuilder.append("(" + description + ")");
         }
         approval.setIdKey(resultBuilder.toString());
         approval.setValuesKey(nodeName);
+        if (!StringUtils.isEmpty(emCode)) {
+            int imId = getImByCode(emCode);
+            approval.setId(imId);
+        }
         return approval;
     }
 
@@ -951,15 +995,16 @@ public class ApprovaPresenter implements OnHttpResultListener {
         ThreadUtil.getInstance().addTask(new Runnable() {
             @Override
             public void run() {
+                boolean showNode = true;
                 JSONArray nodes = OACheckUtil.getJsonArray(object, "nodes");
                 JSONArray processs = OACheckUtil.getJsonArray(object, "processs");
                 JSONArray datas = OACheckUtil.getJsonArray(object, "data");
                 List<Approval> approvals = getNodDatas(datas);
-                List<Approval> historyNodes = null;
                 if (bundle != null && !StringUtils.isEmpty(bundle.getString("historyNode"))) {
                     historyNodes = handlerHistorySetuptask(JSON.parseObject(bundle.getString("historyNode")));
                 }
-                if (ListUtils.isEmpty(approvals) && !ListUtils.isEmpty(historyNodes)) {
+                if ((isApprovaled() || ListUtils.isEmpty(approvals)) && !ListUtils.isEmpty(historyNodes)) {
+                    showNode = false;
                     approvals = historyNodes;
                 }
                 if (!ListUtils.isEmpty(processs)) {
@@ -968,25 +1013,42 @@ public class ApprovaPresenter implements OnHttpResultListener {
                 if (!ListUtils.isEmpty(nodes)) {
                     mergeNode(nodes, approvals, true);
                 }
-                //判断当前
                 boolean hanNotApproval = false;
                 for (Approval a : approvals) {
                     if (!a.getIdKey().startsWith("已审批")) {
                         hanNotApproval = true;
+                        if (a.getIdKey().startsWith("待审批"))
+                            a.setValues("");
+                    }
+                    String emcode = null;
+                    if (a.getDfType().contains(",")) {
+                        String[] emcodes = a.getDfType().split(",");
+                        if (!StringUtils.isEmpty(emcodes[0])) {
+                            emcode = emcodes[0];
+                        }
+                    } else {
+                        emcode = a.getDfType();
                     }
-                    String[] emcode = a.getDfType().split(",");
-                    if (!StringUtils.isEmpty(emcode[0])) {
-                        int imId = getImByCode(emcode[0]);
+                    if (!StringUtils.isEmpty(emcode)) {
+                        int imId = getImByCode(emcode);
                         a.setId(imId);
                     }
                 }
                 int reId = -1;
                 if ("未通过".equals(record.status) || "已结束".equals(record.status)) {
                     reId = R.drawable.unapproved;
-                } else if (!hanNotApproval) {
+                } else if (!hanNotApproval && !isApprovaling()) {//没有未审批的数据
+                    showNode = false;
+                    if (!ListUtils.isEmpty(historyNodes)) {
+                        approvals = historyNodes;
+                    }
                     reId = R.drawable.approved;
                 }
                 handerTitle(reId);
+                if (!ListUtils.isEmpty(approvals) && !ListUtils.isEmpty(historyNodes) && showNode) {
+                    Approval nodeTag = new Approval(Approval.NODES_TAG);
+                    approvals.add(0, nodeTag);
+                }
                 setData2ListThread(Approval.NODES, approvals);
                 loading = false;
             }
@@ -1032,10 +1094,12 @@ public class ApprovaPresenter implements OnHttpResultListener {
                         enclosureList.add(enclosure);
                     }
                 }
-                Approval tag = new Approval(Approval.TAG);
-                tag.setCaption("附件");
-                enclosureList.add(0, tag);
-                setData2ListThread(Approval.ENCLOSURE, enclosureList);
+                if (!ListUtils.isEmpty(enclosureList)) {
+                    Approval tag = new Approval(Approval.TAG);
+                    tag.setCaption("附件");
+                    enclosureList.add(0, tag);
+                    setData2ListThread(Approval.ENCLOSURE, enclosureList);
+                }
             }
         });
     }
@@ -1382,7 +1446,7 @@ public class ApprovaPresenter implements OnHttpResultListener {
                 if (type == Approval.TITLE) {
                     iApproval.showOpinion();
                 }
-                iApproval.showModels(merges);
+                iApproval.showModels(merges, historyNodes);
 
             }
         });

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

@@ -14,7 +14,7 @@ public interface IApproval extends HttpImp {
 
     void nodeDealMan(String nodeDealMan);
 
-    void showModels(List<Approval> approvals);
+    void showModels(List<Approval> approvals,List<Approval> historyNodes);
 
     void initStatus();
 

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

@@ -39,7 +39,7 @@ public class OpenFilesUtils {
     //定义用于检查要打开的文件的后缀是否在遍历后缀数组中,调用下面的方法之前必须先用这个方法判断
     public static boolean checkEndsWithInStringArray(String checkItsEnd, String[] fileEndings) {
         for (String aEnd : fileEndings) {
-            if (checkItsEnd.endsWith(aEnd))
+            if (checkItsEnd.toUpperCase().endsWith(aEnd.toUpperCase()))
                 return true;
         }
         return false;

+ 12 - 11
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/platform/task/TaskAddErpActivity.java

@@ -50,7 +50,7 @@ import java.util.Map;
  * Created by FANGlh on 2017/3/30.
  * function:erp添加任务界面同步于b2b任务添加界面
  */
-public class TaskAddErpActivity extends BaseActivity implements View.OnClickListener,RecognizerDialogListener {
+public class TaskAddErpActivity extends BaseActivity implements View.OnClickListener, RecognizerDialogListener {
     private static final int TASK_ADD_ERP = 0x330;
     @ViewInject(R.id.et_title)
     private EditText et_title;
@@ -119,7 +119,7 @@ public class TaskAddErpActivity extends BaseActivity implements View.OnClickList
         voice_search_iv.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                RecognizerDialogUtil.showRecognizerDialog(ct,TaskAddErpActivity.this);
+                RecognizerDialogUtil.showRecognizerDialog(ct, TaskAddErpActivity.this);
             }
         });
     }
@@ -131,12 +131,12 @@ public class TaskAddErpActivity extends BaseActivity implements View.OnClickList
 //                CommonUtil.showDateDialog(mContext, v);
 //                showDateDialog(this, et_startime);
 
-                startActivityForResult(new Intent(mContext,SelectCalendarActivity.class)
+                startActivityForResult(new Intent(mContext, SelectCalendarActivity.class)
                                 .putExtra("startDate", et_startime.getText().toString())
                                 .putExtra("endDate", et_endtime.getText().toString())
-                                .putExtra("hasMenu",false)
+                                .putExtra("hasMenu", false)
                                 .putExtra("caller", "Workovertime")
-                        ,0x30);
+                        , 0x30);
                 break;
             case R.id.iv_find:
                 Intent intent = new Intent(ct, SelectCollisionActivity.class);
@@ -151,12 +151,12 @@ public class TaskAddErpActivity extends BaseActivity implements View.OnClickList
             case R.id.et_endtime:
 //                showDateDialog(this, et_endtime);
 
-                startActivityForResult(new Intent(mContext,SelectCalendarActivity.class)
+                startActivityForResult(new Intent(mContext, SelectCalendarActivity.class)
                                 .putExtra("startDate", et_startime.getText().toString())
                                 .putExtra("endDate", et_endtime.getText().toString())
-                                .putExtra("hasMenu",false)
+                                .putExtra("hasMenu", false)
                                 .putExtra("caller", "Workovertime")
-                        ,0x30);
+                        , 0x30);
                 break;
             default:
                 break;
@@ -218,9 +218,9 @@ public class TaskAddErpActivity extends BaseActivity implements View.OnClickList
                 break;
         }
 
-        if (requestCode == 0x30 && resultCode == 0x11){
-            String startDate=data.getStringExtra("startDate");
-            String endDate=data.getStringExtra("endDate");
+        if (requestCode == 0x30 && resultCode == 0x11) {
+            String startDate = data.getStringExtra("startDate");
+            String endDate = data.getStringExtra("endDate");
 //            startDate=startDate+":00";
 //            endDate=endDate+":00";
             et_startime.setText(startDate);
@@ -340,6 +340,7 @@ public class TaskAddErpActivity extends BaseActivity implements View.OnClickList
                         Log.i("task_erp_result", task_erp_result + "");
                         if (JSON.parseObject(task_erp_result).containsKey("success") && JSON.parseObject(task_erp_result).getBoolean("success")) {
                             Toast.makeText(mContext, getString(R.string.task_send_success), Toast.LENGTH_LONG).show();
+                            setResult(0x20, null);
                             finish();
                         }
                     }

+ 25 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/view/CrashLinearLayoutManager.java

@@ -0,0 +1,25 @@
+package com.xzjmyk.pm.activity.view;
+
+import android.content.Context;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+
+/**
+ * Created by Bitliker on 2017/8/17.
+ */
+
+public class CrashLinearLayoutManager extends LinearLayoutManager {
+    public CrashLinearLayoutManager(Context context) {
+        super(context);
+    }
+
+    @Override
+    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+        try {
+            super.onLayoutChildren(recycler, state);
+        } catch (IndexOutOfBoundsException e) {
+            e.printStackTrace();
+        }
+    }
+
+}

BIN
WeiChat/src/main/res/drawable-hdpi/edit_template.png


BIN
WeiChat/src/main/res/drawable-xhdpi/edit_template.png


BIN
WeiChat/src/main/res/drawable-xxhdpi/edit_template.png


+ 8 - 0
WeiChat/src/main/res/layout/item_approval_node.xml

@@ -29,6 +29,14 @@
             android:layout_marginRight="10dp"
             android:layout_toRightOf="@id/statusIV"/>
 
+
+        <ImageView
+            android:id="@+id/changeUser"
+            android:layout_width="22dp"
+            android:layout_height="22dp"
+            android:layout_alignParentRight="true"
+            android:visibility="gone"/>
+
         <TextView
             android:id="@+id/timeTv"
             style="@style/commonTextStyle"

+ 66 - 0
WeiChat/src/main/res/layout/item_approval_node_tag.xml

@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="50dp">
+
+    <View
+        android:id="@+id/padding"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/paddingApp"
+        android:background="@color/item_line"/>
+
+    <View
+        android:id="@+id/line"
+        android:layout_width="2px"
+        android:layout_height="match_parent"
+        android:layout_below="@id/padding"
+        android:layout_centerHorizontal="true"
+        android:layout_margin="5dp"
+        android:layout_marginBottom="4px"
+        android:background="@color/item_line"/>
+
+
+    <TextView
+        android:id="@+id/nodeTv"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@id/padding"
+        android:layout_marginBottom="4px"
+        android:layout_toLeftOf="@id/line"
+        android:gravity="center"
+        android:text="审批节点"
+        android:textSize="@dimen/text_main"/>
+
+
+    <TextView
+        android:id="@+id/historyTV"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@id/padding"
+        android:layout_marginBottom="4px"
+        android:layout_toRightOf="@id/line"
+        android:gravity="center"
+        android:text="审批历史"
+        android:textCursorDrawable="@color/yellow_home"
+        android:textSize="@dimen/text_main"/>
+
+    <View
+        android:id="@+id/nodeTag"
+        android:layout_width="match_parent"
+        android:layout_height="4px"
+        android:layout_alignParentBottom="true"
+        android:layout_marginLeft="10dp"
+        android:layout_marginRight="10dp"
+        android:layout_toLeftOf="@id/line"
+        android:background="@color/darkorange"/>
+
+    <View
+        android:id="@+id/historyTag"
+        android:layout_width="match_parent"
+        android:layout_height="4px"
+        android:layout_alignParentBottom="true"
+        android:layout_marginLeft="10dp"
+        android:layout_marginRight="10dp"
+        android:layout_toRightOf="@id/line"
+        android:background="@color/darkorange"/>
+</RelativeLayout>

+ 4 - 0
WeiChat/src/main/res/layout/item_approval_tag.xml

@@ -21,7 +21,11 @@
         style="@style/approvalItemStyle"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:ellipsize="middle"
+        android:lines="1"
+        android:paddingBottom="8dp"
         android:paddingLeft="10dp"
+        android:paddingTop="8dp"
         android:text="tagTv"
         android:textColor="@color/titleBlue"/>
 </LinearLayout>

+ 1 - 0
WeiChat/src/main/res/menu/menu_aproval_set.xml

@@ -4,6 +4,7 @@
     <item
         android:id="@+id/oa_approval_set"
         android:title="编辑模板"
+        android:icon="@drawable/edit_template"
         app:showAsAction="always" />
 
 

+ 2 - 2
WeiChat/src/main/res/raw/versionconfiguration.properties

@@ -1,3 +1,3 @@
 #发布版本状态改为true,测试版本状态为false
-#release_version=false
-release_version=true
+release_version=false
+#release_version=true

+ 1 - 0
WeiChat/src/main/res/values/values.xml

@@ -32,6 +32,7 @@
 
         <item>.bmp</item>
 
+
     </array>
 
 

+ 39 - 36
app_core/network/src/main/java/network/app/http/HttpBase.java

@@ -4,46 +4,49 @@ package network.app.http;
 import rx.Subscriber;
 
 public abstract class HttpBase {
-	
-	public HttpClient mbuilder;
-	/**
-	 * 设置全局builder 
-	 * 初始化全局参数
-	 * @param client
-	 */
-	public void setBuilder(HttpClient client) {
-		this.mbuilder=client;
-	}
-	
+
+    public HttpClient mbuilder;
+
+    /**
+     * 设置全局builder
+     * 初始化全局参数
+     *
+     * @param client
+     */
+    public void setBuilder(HttpClient client) {
+        this.mbuilder = client;
+    }
+
     /**
      * 初始化具体的网络请求客户端
      * 初始化全局参数
      * 比如Okhttp,Retrofit,Volley,HttpClient,HttpUrlConnection
      */
     public abstract void initClient();
-    
-	
-	/**
-	 * @param builder
-	 * @param s rxjava
-	 */
-	public  void send(HttpClient builder, Subscriber<Object> s){
-		if (builder.getMethod()==Method.GET) {
-			get(builder, s);
-		}
-		if (builder.getMethod()==Method.POST) {
-			post(builder, s);
-		}
-	}
-	/** 
-	  * @desc:上传功能 
-	 *         支持多文件上传
-	  * @author:Arison on 2017/5/17
-	  */
-	public void uploads(HttpClient builder,Subscriber<Object> s){}
-	
-	public abstract void get(HttpClient builder,Subscriber<Object> s);
-	
-	public abstract void post(HttpClient builder,Subscriber<Object> s);
-	
+
+
+    /**
+     * @param builder
+     * @param s       rxjava
+     */
+    public void send(HttpClient builder, Subscriber<Object> s) {
+        if (builder.getMethod() == Method.GET) {
+            get(builder, s);
+        }
+        if (builder.getMethod() == Method.POST) {
+            post(builder, s);
+        }
+    }
+
+    /**
+     * @desc:上传功能 支持多文件上传
+     * @author:Arison on 2017/5/17
+     */
+    public void uploads(HttpClient builder, Subscriber<Object> s) {
+    }
+
+    public abstract void get(HttpClient builder, Subscriber<Object> s);
+
+    public abstract void post(HttpClient builder, Subscriber<Object> s);
+
 }