ソースを参照

多从表,明细表分组

RaoMeng 7 年 前
コミット
71ecf39136

+ 5 - 1
app_core/common/src/main/java/com/core/utils/CommonUtil.java

@@ -99,12 +99,15 @@ public class CommonUtil {
 
     public static String getAppBaseUrl(Context ct) {
         if (ct == null) {
-            ct=MyApplication.getInstance();
+            ct = MyApplication.getInstance();
         }
         String baseUrl = getSharedPreferences(ct, "erp_baseurl");
 //        if (BaseConfig.isDebug()){
 //            baseUrl="http://192.168.253.243:8080/ERP/";
 //        }
+        baseUrl = "http://192.168.253.12/APP/";
+//        baseUrl = "http://192.168.253.12/ERP/";
+//        baseUrl = "http://192.168.253.228:8080/ERP/";
         return baseUrl;
     }
 
@@ -217,6 +220,7 @@ public class CommonUtil {
         }
         return "https://api-inquiry.usoftchina.com/";
     }
+
     //日程管理网址
     public static String getSchedulerBaseUrl() {
 //        if(BaseConfig.isDebug()){

+ 3 - 1
app_modular/apputils/src/main/java/com/modular/apputils/adapter/BillAdapter.java

@@ -42,8 +42,8 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
     protected List<BillGroupModel.BillModel> mShowBillModels;
     protected OnAdapterListener mOnAdapterListener;
     protected int mTabIndex = -1;
-    private List<BillGroupModel> mOldTabModels;
     private int mTabPosition;
+    private List<BillGroupModel> mOldTabModels;
 
     public BillAdapter(Context ct, List<BillGroupModel> mBillGroupModels, OnAdapterListener mOnAdapterListener) {
         this.ct = ct;
@@ -395,8 +395,10 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
                 mInputViewHolder.valuesEd.setOnClickListener(null);
                 if (BillTypeChangeUtils.isSelect(model.getType())) {
                     mInputViewHolder.valuesEd.setHint("请选择");
+                    mInputViewHolder.selectIv.setVisibility(View.VISIBLE);
                 } else {
                     mInputViewHolder.valuesEd.setHint("请输入");
+                    mInputViewHolder.selectIv.setVisibility(View.GONE);
                 }
             } else if (BillTypeChangeUtils.isSelect(model.getType())) {
                 //选择类型

+ 249 - 65
app_modular/apputils/src/main/java/com/modular/apputils/adapter/BillDetailsAdapter.java

@@ -3,26 +3,23 @@ package com.modular.apputils.adapter;
 import android.Manifest;
 import android.content.Context;
 import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.Paint;
+import android.support.annotation.LayoutRes;
+import android.support.design.widget.TabLayout;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
-import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import com.alibaba.fastjson.JSON;
 import com.common.LogUtil;
 import com.common.data.ListUtils;
 import com.common.system.SystemUtil;
 import com.core.app.AppConstant;
 import com.core.app.Constants;
 import com.core.base.BaseActivity;
-import com.core.utils.CommonUtil;
 import com.core.utils.ToastUtil;
 import com.core.widget.CustomProgressDialog;
 import com.core.widget.view.MyGridView;
@@ -31,6 +28,7 @@ import com.modular.apputils.R;
 import com.modular.apputils.model.BillGroupModel;
 import com.modular.apputils.model.BillJump;
 import com.modular.apputils.network.FileDownloader;
+import com.modular.apputils.utils.BillTypeChangeUtils;
 import com.modular.apputils.utils.OpenFilesUtils;
 
 import java.io.File;
@@ -39,19 +37,23 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class BillDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.BaseViewHolder> {
+
     private Context ct;
-    private List<BillGroupModel> groupModels;
+    private List<BillGroupModel> mBillGroupModels;
     private List<BillGroupModel.BillModel> mShowBillModels;
+    protected int mTabIndex = -1;
+    private int mTabPosition;
+    private List<BillGroupModel> mOldTabModels;
 
-    public BillDetailsAdapter(Context ct, List<BillGroupModel> groupModels) {
+    public BillDetailsAdapter(Context ct, List<BillGroupModel> mBillGroupModels) {
         this.ct = ct;
-        this.groupModels = groupModels;
+        this.mBillGroupModels = mBillGroupModels;
         changeBillModel();
     }
 
     public void updateGroupModels(List<BillGroupModel> groupModels) {
-        this.groupModels = groupModels;
+        this.mBillGroupModels = groupModels;
         changeBillModel();
     }
 
@@ -59,8 +61,8 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
         return mShowBillModels;
     }
 
-    public List<BillGroupModel> getGroupModels() {
-        return groupModels;
+    public List<BillGroupModel> getBillGroupModels() {
+        return mBillGroupModels;
     }
 
     /**
@@ -72,51 +74,41 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
         } else {
             mShowBillModels.clear();
         }
-        for (int i = 0; i < groupModels.size(); i++) {
-            BillGroupModel e = groupModels.get(i);
-            if (e != null && e.getShowBillFields() != null && !e.getShowBillFields().isEmpty()) {
-                mShowBillModels.addAll(e.getShowBillFields());
+        for (int i = 0; i < mBillGroupModels.size(); i++) {
+            BillGroupModel e = mBillGroupModels.get(i);
+            if (e != null) {
+                List<BillGroupModel.GridTab> gridTabs = e.getGridTabs();
+                if (gridTabs != null && gridTabs.size() > 0) {
+                    BillGroupModel.BillModel mTabBillModel = new BillGroupModel.BillModel();
+                    mTabBillModel.setType(BillGroupModel.Constants.TYPE_TAB);
+                    mTabBillModel.setTabList(gridTabs);
+                    mTabBillModel.setGroupIndex(i);
+                    mShowBillModels.add(mTabBillModel);
+                } else if (e.getShowBillFields() != null && !e.getShowBillFields().isEmpty()) {
+                    if (!TextUtils.isEmpty(e.getGroup())) {
+                        BillGroupModel.BillModel mTitleBillModel = new BillGroupModel.BillModel();
+                        mTitleBillModel.setGroupIndex(i);
+                        mTitleBillModel.setType(BillGroupModel.Constants.TYPE_TITLE);
+                        mTitleBillModel.setCaption(e.getGroup());
+                        mTitleBillModel.setAllowBlank(e.isDeleteAble() ? "T" : "F");
+                        mShowBillModels.add(mTitleBillModel);
+                    }
+                    mShowBillModels.addAll(e.getShowBillFields());
+                }
             }
         }
-        LogUtil.i("gong", JSON.toJSONString(mShowBillModels));
-    }
-
-    //附件类型
-    class EnclosureViewHolder extends RecyclerView.ViewHolder {
-        private TextView captionTv;
-        private TextView muchInputTv;
-        private MyGridView ffGv;
-
-        public EnclosureViewHolder(View itemView) {
-            super(itemView);
-            captionTv = (TextView) itemView.findViewById(R.id.captionTv);
-            muchInputTv = (TextView) itemView.findViewById(R.id.muchInputTv);
-            ffGv = (MyGridView) itemView.findViewById(R.id.ffGv);
-            ffGv.setNumColumns(4);
-        }
-    }
-
-    class ViewHolder extends RecyclerView.ViewHolder {
-        private TextView titleTv;
-        private TextView captionTv;
-        private TextView valuesTv;
-
-        public ViewHolder(View itemView) {
-            super(itemView);
-            titleTv = (TextView) itemView.findViewById(R.id.titleTv);
-            captionTv = (TextView) itemView.findViewById(R.id.captionTv);
-            valuesTv = (TextView) itemView.findViewById(R.id.valuesTv);
-        }
     }
 
     @Override
     public int getItemViewType(int position) {
-        BillGroupModel.BillModel field = mShowBillModels.get(position);
-        if (field.getType().equals("FF")) {
-            return 1;
-        } else {
-            return 0;
+        if (mShowBillModels != null && mShowBillModels.size() > position) {
+            int itemViewType = BillTypeChangeUtils.getItemViewType(mShowBillModels.get(position).getType());
+            if (itemViewType == 111) {
+                mTabIndex = position;
+            }
+            return itemViewType;
         }
+        return super.getItemViewType(position);
     }
 
     private LayoutInflater mLayoutInflater;
@@ -129,27 +121,79 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
     }
 
     @Override
-    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
-        if (i == 1) {
-            return new EnclosureViewHolder(getLayoutInflater().inflate(R.layout.item_bill_enclosure, viewGroup, false));
-        } else {
-            return new ViewHolder(getLayoutInflater().inflate(R.layout.item_bill_details, viewGroup, false));
+    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        BaseViewHolder viewHolder = null;
+        switch (viewType) {
+            case 0:
+                viewHolder = new TitleViewHolder(parent, R.layout.item_bill_title);
+                break;
+            case 1:
+                viewHolder = new TextViewHolder(parent, R.layout.item_bill_details);
+                break;
+            case 2:
+                viewHolder = new EnclosureViewHolder(parent, R.layout.item_bill_enclosure);
+                break;//附件类型
+            case 111:
+                viewHolder = new TabViewHolder(parent, R.layout.item_bill_tab);
+                break;
+            default:
+                viewHolder = new BaseViewHolder(parent, R.layout.item_bill_title) {
+                    @Override
+                    public void initView(View view) {
+
+                    }
+                };
         }
+        return viewHolder;
     }
 
-
     @Override
     public int getItemCount() {
         return ListUtils.getSize(mShowBillModels);
     }
 
     @Override
-    public void onBindViewHolder(RecyclerView.ViewHolder mViewHolder, int position) {
-        BillGroupModel.BillModel field = mShowBillModels.get(position);
-        if (mViewHolder instanceof ViewHolder) {
-            bindViewHolder((ViewHolder) mViewHolder, field, position);
-        } else if (mViewHolder instanceof EnclosureViewHolder) {
-            bindEnclosure((EnclosureViewHolder) mViewHolder, field, position);
+    public void onBindViewHolder(BaseViewHolder holder, int position) {
+        BillGroupModel.BillModel model = null;
+        if (mShowBillModels != null && mShowBillModels.size() > position) {
+            model = mShowBillModels.get(position);
+        }
+        try {
+            if (holder instanceof TextViewHolder) {
+                bindText((TextViewHolder) holder, model, position);
+            } else if (holder instanceof TitleViewHolder) {
+                bindTitleView((TitleViewHolder) holder, model, position);
+            } else if (holder instanceof EnclosureViewHolder) {
+                bindEnclosure((EnclosureViewHolder) holder, model, position);
+            } else if (holder instanceof TabViewHolder) {
+                bindTabView((TabViewHolder) holder, model, position);
+            }
+        } catch (Exception e) {
+            LogUtil.i("gong", position + "  e=" + e.getMessage());
+        }
+
+    }
+
+    private void bindTabView(TabViewHolder holder, final BillGroupModel.BillModel model, final int position) {
+        if (holder.mTabLayout.getTag() != null && holder.mTabLayout.getTag() instanceof MyTabChangeListener) {
+            holder.mTabLayout.removeOnTabSelectedListener((TabLayout.OnTabSelectedListener) holder.mTabLayout.getTag());
+        }
+        MyTabChangeListener myTabChangeListener = new MyTabChangeListener(holder.mTabLayout, position);
+        holder.mTabLayout.addOnTabSelectedListener(myTabChangeListener);
+        holder.mTabLayout.setTag(myTabChangeListener);
+    }
+
+    public void bindTitleView(TitleViewHolder mTitleViewHolder, BillGroupModel.BillModel model, int position) throws Exception {
+        if (model != null) {
+            if (model.getAllowBlank().equals("F")) {
+                mTitleViewHolder.deleteTv.setVisibility(View.GONE);
+                mTitleViewHolder.deleteTv.setOnClickListener(null);
+            } else {
+                mTitleViewHolder.deleteTv.setVisibility(View.VISIBLE);
+                mTitleViewHolder.deleteTv.setTag(model.getGroupIndex());
+                mTitleViewHolder.deleteTv.setOnClickListener(null);
+            }
+            mTitleViewHolder.tvTitle.setText(model.getCaption());
         }
     }
 
@@ -169,7 +213,7 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
         holder.ffGv.setAdapter(mEnclosureAdapter);
     }
 
-    private void bindViewHolder(ViewHolder mViewHolder, BillGroupModel.BillModel field, int position) {
+    private void bindText(TextViewHolder mViewHolder, BillGroupModel.BillModel field, int position) {
         mViewHolder.captionTv.setText(field.getCaption());
         mViewHolder.valuesTv.setText(field.getValue());
         BillJump mBillJump = field.getBillJump();
@@ -189,8 +233,8 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
         if (field.getGroupIndex() != 0 && position >= 1 && field.getGroupIndex() > mShowBillModels.get(position - 1).getGroupIndex()) {
             mViewHolder.titleTv.setVisibility(View.VISIBLE);
             String mGroupName = null;
-            if (ListUtils.getSize(groupModels) > field.getGroupIndex()) {
-                mGroupName = groupModels.get(field.getGroupIndex()).getGroup();
+            if (ListUtils.getSize(mBillGroupModels) > field.getGroupIndex()) {
+                mGroupName = mBillGroupModels.get(field.getGroupIndex()).getGroup();
             }
             mViewHolder.titleTv.setText(TextUtils.isEmpty(mGroupName) ? "" : mGroupName);
         } else {
@@ -198,6 +242,57 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
         }
     }
 
+    public class MyTabChangeListener implements TabLayout.OnTabSelectedListener {
+        private TabLayout mTabLayout;
+        private int mPosition;
+
+        public MyTabChangeListener(TabLayout tabLayout, int position) {
+            mTabLayout = tabLayout;
+            mPosition = position;
+        }
+
+        @Override
+        public void onTabSelected(TabLayout.Tab tab) {
+            if (this.mPosition >= 0 && mShowBillModels != null && mShowBillModels.size() > this.mPosition && mTabLayout != null) {
+                mTabPosition = tab.getPosition();
+                BillGroupModel.BillModel model = mShowBillModels.get(mPosition);
+                if (model != null) {
+                    List<BillGroupModel.GridTab> tabList = model.getTabList();
+                    int tabGroupIndex = model.getGroupIndex();
+
+                    List<BillGroupModel> newGroupModels = new ArrayList<>();
+                    List<BillGroupModel> billGroupModels = mBillGroupModels.subList(0, tabGroupIndex + 1);
+                    mOldTabModels = mBillGroupModels.subList(tabGroupIndex + 1, mBillGroupModels.size());
+
+                    newGroupModels.addAll(billGroupModels);
+                    BillGroupModel.GridTab gridTab = tabList.get(mTabPosition);
+                    if (gridTab != null) {
+                        List<BillGroupModel> tabGroupModels = gridTab.getBillGroupModels();
+
+                        newGroupModels.addAll(tabGroupModels);
+                    }
+                    setBillGroupModels(newGroupModels);
+                    notifyDataSetChanged();
+                }
+            }
+        }
+
+        @Override
+        public void onTabUnselected(TabLayout.Tab tab) {
+
+        }
+
+        @Override
+        public void onTabReselected(TabLayout.Tab tab) {
+
+        }
+    }
+
+    public void setBillGroupModels(List<BillGroupModel> mBillGroupModels) {
+        this.mBillGroupModels = mBillGroupModels;
+        changeBillModel();
+    }
+
     private View.OnClickListener mOnClickListener = new View.OnClickListener() {
         @Override
         public void onClick(View view) {
@@ -240,6 +335,95 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
         }
     };
 
+    public abstract class BaseViewHolder extends RecyclerView.ViewHolder {
+        public BaseViewHolder(ViewGroup parent, @LayoutRes int layoutId) {
+            this(getLayoutInflater().inflate(layoutId, parent, false));
+        }
+
+        public abstract void initView(View view);
+
+        public BaseViewHolder(View itemView) {
+            super(itemView);
+            initView(itemView);
+        }
+    }
+
+
+    class TextViewHolder extends BaseViewHolder {
+        private TextView titleTv;
+        private TextView captionTv;
+        private TextView valuesTv;
+
+        @Override
+        public void initView(View view) {
+            titleTv = (TextView) itemView.findViewById(R.id.titleTv);
+            captionTv = (TextView) itemView.findViewById(R.id.captionTv);
+            valuesTv = (TextView) itemView.findViewById(R.id.valuesTv);
+        }
+
+        public TextViewHolder(ViewGroup parent, int layoutId) {
+            super(parent, layoutId);
+        }
+    }
+
+    class TitleViewHolder extends BaseViewHolder {
+        private TextView tvTitle;
+        private TextView deleteTv;
+
+        public TitleViewHolder(ViewGroup parent, int layoutId) {
+            super(parent, layoutId);
+        }
+
+        @Override
+        public void initView(View view) {
+            tvTitle = (TextView) view.findViewById(R.id.tv_title);
+            deleteTv = (TextView) view.findViewById(R.id.deleteTv);
+        }
+
+    }
+
+    class TabViewHolder extends BaseViewHolder {
+        TabLayout mTabLayout;
+
+        public TabViewHolder(ViewGroup parent, int layoutId) {
+            super(parent, layoutId);
+        }
+
+        @Override
+        public void initView(View view) {
+            mTabLayout = (TabLayout) view.findViewById(R.id.bill_tab_tl);
+            mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+            final List<BillGroupModel.GridTab> tabList = mShowBillModels.get(mTabIndex).getTabList();
+            if (tabList != null && tabList.size() > 0) {
+                for (int i = 0; i < tabList.size(); i++) {
+                    BillGroupModel.GridTab gridTab = tabList.get(i);
+                    if (gridTab != null) {
+                        mTabLayout.addTab(mTabLayout.newTab().setText(gridTab.getTitle()));
+                    }
+                }
+            }
+        }
+
+    }
+
+    //附件类型
+    class EnclosureViewHolder extends BaseViewHolder {
+        private TextView captionTv;
+        private TextView muchInputTv;
+        private MyGridView ffGv;
+
+        public EnclosureViewHolder(ViewGroup parent, int layoutId) {
+            super(parent, layoutId);
+        }
+
+        @Override
+        public void initView(View itemView) {
+            captionTv = (TextView) itemView.findViewById(R.id.captionTv);
+            muchInputTv = (TextView) itemView.findViewById(R.id.muchInputTv);
+            ffGv = (MyGridView) itemView.findViewById(R.id.ffGv);
+            ffGv.setNumColumns(4);
+        }
+    }
 
     private class EnclosureAdapter extends BaseAdapter {
         private int position;

+ 344 - 17
app_modular/apputils/src/main/java/com/modular/apputils/presenter/BillDetailsPresenter.java

@@ -11,13 +11,9 @@ import com.common.LogUtil;
 import com.common.data.JSONUtil;
 import com.common.data.ListUtils;
 import com.common.data.StringUtil;
-import com.common.thread.ThreadUtil;
 import com.core.app.Constants;
 import com.core.app.MyApplication;
 import com.core.base.BaseToolBarActivity;
-import com.core.model.Approval;
-import com.core.net.http.http.OAHttpHelper;
-import com.core.net.http.http.Request;
 import com.core.utils.CommonUtil;
 import com.modular.apputils.activity.BillInputActivity;
 import com.modular.apputils.listener.OnSmartHttpListener;
@@ -29,7 +25,9 @@ import com.modular.apputils.presenter.imp.IBillDetails;
 
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -44,6 +42,12 @@ public class BillDetailsPresenter extends BaseNetPresenter {
     protected Class mInputClass;
     protected List<BillJump> mBillJumps;
 
+    private String detailKeyField;//从表id字段
+    private String keyField;//主表id字段
+    private String statusCodeField;//状态码字段
+    private String statusField;//状态字段
+    private String detailMainKeyField;//从表
+    private boolean multidetailgrid = false;
 
     public String getCaller() {
         return mCaller;
@@ -85,15 +89,15 @@ public class BillDetailsPresenter extends BaseNetPresenter {
     }
 
     public void unSubmit(String status) {
-        LogUtil.i("gong","status="+status);
-        if (status!=null&&status.equals("在录入")){
+        LogUtil.i("gong", "status=" + status);
+        if (status != null && status.equals("在录入")) {
             ct.startActivity(new Intent(ct, mInputClass == null ? BillInputActivity.class : mInputClass)
                     .putExtra(Constants.Intents.CALLER, mCaller)
                     .putExtra(Constants.Intents.TITLE, ((BaseToolBarActivity) ct).getToolBarTitle())
                     .putExtra(Constants.Intents.ID, mId)
             );
             mIBillDetails.finish();
-        }else{
+        } else {
             mIBillDetails.showLoading();
             requestCompanyHttp(new Parameter.Builder()
                             .url("mobile/commonres.action")
@@ -108,7 +112,8 @@ public class BillDetailsPresenter extends BaseNetPresenter {
     private void loadFormandGridDetail() {
         mIBillDetails.showLoading();
         requestCompanyHttp(new Parameter.Builder()
-                        .url("mobile/common/getformandgriddata.action")
+                        .url("mobile/getformandgriddetail.action")
+                        .addParams("condition", "1=1")
                         .addParams("caller", mCaller)
                         .addParams("id", mId)
                         .record(LOAD_FORM)
@@ -135,7 +140,8 @@ public class BillDetailsPresenter extends BaseNetPresenter {
             JSONObject jsonObject = JSON.parseObject(message);
             switch (what) {
                 case LOAD_FORM:
-                    handlerFormData(JSONUtil.getJSONObject(jsonObject, "datas"));
+//                    handlerFormData(JSONUtil.getJSONObject(jsonObject, "datas"));
+                    handlerMultiBill(jsonObject);
                     break;
                 case UN_SUBMIT:
                     mIBillDetails.showToast("反提交成功");
@@ -171,7 +177,9 @@ public class BillDetailsPresenter extends BaseNetPresenter {
         if (!ListUtils.isEmpty(array)) {
             for (int i = 0; i < array.size(); i++) {
                 JSONObject o = array.getJSONObject(i);
-                if (o == null) continue;
+                if (o == null) {
+                    continue;
+                }
                 BillGroupModel.LocalData mLocalData = new BillGroupModel.LocalData();
                 int id = JSONUtil.getInt(o, "fp_id");
                 mLocalData.value = JSONUtil.getText(o, "fp_name");
@@ -192,6 +200,323 @@ public class BillDetailsPresenter extends BaseNetPresenter {
                 "&master=" + CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_master");
     }
 
+    private final Comparator<BillGroupModel> mComparator = new Comparator<BillGroupModel>() {
+        @Override
+        public int compare(BillGroupModel billGroupModel, BillGroupModel t1) {
+            return (billGroupModel.getMinDetno() > t1.getMinDetno()) ? 1 : -1;
+        }
+    };
+
+    private void handlerMultiBill(JSONObject resultObject) {
+        try {
+            List<BillGroupModel> showBillModels = new ArrayList<>();
+            JSONObject config = JSONUtil.getJSONObject(resultObject, "config");
+            detailKeyField = JSONUtil.getText(config, "fo_detailkeyfield");
+            keyField = JSONUtil.getText(config, "fo_keyfield");
+            statusCodeField = JSONUtil.getText(config, "fo_statuscodefield");
+            statusField = JSONUtil.getText(config, "fo_statusfield");
+            detailMainKeyField = JSONUtil.getText(config, "fo_detailmainkeyfield");
+            JSONObject data = JSONUtil.getJSONObject(resultObject, "data");
+            JSONArray formdetail = JSONUtil.getJSONArray(data, "formdetail");
+            Map<String, BillGroupModel> formdeMap = handlerFormdetail(formdetail);
+            if (formdeMap != null && !formdeMap.isEmpty()) {
+                for (Map.Entry<String, BillGroupModel> entry : formdeMap.entrySet()) {
+                    showBillModels.add(entry.getValue());
+                }
+                if (!ListUtils.isEmpty(showBillModels)) {
+                    Collections.sort(showBillModels, mComparator);
+                }
+            }
+            multidetailgrid = JSONUtil.getBoolean(data, "multidetailgrid");
+            if (multidetailgrid) {
+                JSONArray othergridetail = JSONUtil.getJSONArray(data, "othergridetail");
+                if (othergridetail != null && othergridetail.size() > 0) {
+                    List<BillGroupModel.GridTab> otherGridTabs = handlerGirdTabs(showBillModels.size() + 1, othergridetail);
+                    if (otherGridTabs.size() > 0) {
+                        BillGroupModel billTab = new BillGroupModel();
+                        billTab.setForm(false);
+                        billTab.setGridTabs(otherGridTabs);
+                        billTab.setGroupIndex(showBillModels.size());
+
+                        showBillModels.add(billTab);
+
+                        showBillModels.addAll(otherGridTabs.get(0).getBillGroupModels());
+                    }
+                }
+            } else {
+                JSONArray gridetail = JSONUtil.getJSONArray(data, "gridetail");
+                Map<String, BillGroupModel> gridGroupModelMap = handlerGridetail(showBillModels.size(), gridetail);
+                if (gridGroupModelMap != null && !gridGroupModelMap.isEmpty()) {
+                    for (Map.Entry<String, BillGroupModel> entry : gridGroupModelMap.entrySet()) {
+                        if (entry.getValue() != null) {
+                            showBillModels.add(entry.getValue());
+                        }
+                    }
+                }
+            }
+            LogUtil.i("gong", "showBillModels=" + JSON.toJSONString(showBillModels));
+            mIBillDetails.setAdapter(showBillModels);
+        } catch (Exception e) {
+
+        }
+    }
+
+    private List<BillGroupModel.GridTab> handlerGirdTabs(int index, JSONArray othergridetail) {
+        List<BillGroupModel.GridTab> gridTabs = new ArrayList<>();
+        for (int i = 0; i < othergridetail.size(); i++) {
+            JSONObject otherGrid = othergridetail.getJSONObject(i);
+            if (otherGrid != null) {
+                JSONArray detailgrid = otherGrid.getJSONArray("detailgrid");
+                if (detailgrid != null && detailgrid.size() > 0) {
+                    BillGroupModel.GridTab gridTab = new BillGroupModel.GridTab();
+                    gridTab.setTitle(JSONUtil.getText(otherGrid, "dgtitle"));
+                    gridTab.setCaller(JSONUtil.getText(otherGrid, "dgcaller"));
+                    gridTab.setPosition(i);
+
+                    Map<String, BillGroupModel> gridGroupModelMap = handlerGridetail(index, detailgrid);
+                    if (gridGroupModelMap != null && !gridGroupModelMap.isEmpty()) {
+                        List<BillGroupModel> billGroupModels = new ArrayList<>();
+                        for (Map.Entry<String, BillGroupModel> entry : gridGroupModelMap.entrySet()) {
+                            if (entry.getValue() != null) {
+                                billGroupModels.add(entry.getValue());
+                            }
+                        }
+                        gridTab.setBillGroupModels(billGroupModels);
+                    }
+
+                    gridTabs.add(gridTab);
+                }
+            }
+        }
+        return gridTabs;
+    }
+
+    /**
+     * 获取主表数据包含分组
+     *
+     * @param formdetail
+     * @return
+     */
+    private Map<String, BillGroupModel> handlerFormdetail(JSONArray formdetail) {
+        if (formdetail != null && !formdetail.isEmpty()) {
+            JSONObject object = null;
+            Map<String, BillGroupModel> modelMap = new LinkedHashMap<>();
+            for (int i = 0; i < formdetail.size(); i++) {
+                object = formdetail.getJSONObject(i);
+                BillGroupModel.BillModel mBillModel = getBillModelByObject(object);
+                String group = JSONUtil.getText(object, "fd_group");//是否允许为空(注:当作为标题的时候T:表示可以删除 F:表示不可删除)
+                //判断组别
+                if (modelMap.containsKey(group)) {
+                    BillGroupModel mapBillGroupModel = modelMap.get(group);
+                    if (mapBillGroupModel == null) {
+                        mapBillGroupModel = new BillGroupModel();
+                        mapBillGroupModel.setForm(true);
+                        mapBillGroupModel.setGroup(group);
+                        mapBillGroupModel.setGroupIndex(modelMap.size());
+                        modelMap.put(group, mapBillGroupModel);
+                    }
+                    mBillModel.setGroupIndex(mapBillGroupModel.getGroupIndex());
+                    float minDetno = mapBillGroupModel.getMinDetno();
+                    if (minDetno > mBillModel.getDetno()) {
+                        minDetno = mBillModel.getDetno();
+                    }
+                    mapBillGroupModel.setMinDetno(minDetno);
+                    if (isShow(mBillModel)) {
+                        mapBillGroupModel.addShow(mBillModel);
+                    } else {
+                        mapBillGroupModel.addHide(mBillModel);
+                    }
+                } else {
+                    BillGroupModel mapBillGroupModel = new BillGroupModel();
+                    mapBillGroupModel.setGroup(group);
+                    mapBillGroupModel.setForm(true);
+                    mapBillGroupModel.setGroupIndex(modelMap.size());
+                    modelMap.put(group, mapBillGroupModel);
+                    mBillModel.setGroupIndex(mapBillGroupModel.getGroupIndex());
+                    if (isShow(mBillModel)) {
+                        mapBillGroupModel.addShow(mBillModel);
+                    } else {
+                        mapBillGroupModel.addHide(mBillModel);
+                    }
+                }
+            }
+            return modelMap;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 获取从表配置
+     *
+     * @param index
+     * @param formdetail
+     * @return
+     */
+    private Map<String, BillGroupModel> handlerGridetail(int index, JSONArray formdetail) {
+        if (formdetail != null && !formdetail.isEmpty()) {
+            Map<String, BillGroupModel> modelMap = new LinkedHashMap<>();
+            /*if (!multidetailgrid) {
+                BillGroupModel mBillGroupModel = new BillGroupModel();
+                mBillGroupModel.setGroupIndex(index);
+                mBillGroupModel.setGroup("明细表");
+                mBillGroupModel.setLastInType(true);
+                mBillGroupModel.setForm(false);
+                List<BillGroupModel.BillModel> hideBillFields = new ArrayList<>();//当前组隐藏的字段列表
+                List<BillGroupModel.BillModel> showBillFields = new ArrayList<>();//当前组显示的字段列表
+                for (int i = 0; i < formdetail.size(); i++) {
+                    BillGroupModel.BillModel mBillModel = getBillModelByObject(formdetail.getJSONObject(i));
+                    mBillModel.setGroupIndex(index);
+                    if (isShow(mBillModel)) {
+                        showBillFields.add(mBillModel);
+                    } else {
+                        hideBillFields.add(mBillModel);
+                    }
+                }
+                mBillGroupModel.setHideBillFields(hideBillFields);
+                mBillGroupModel.setShowBillFields(showBillFields);
+
+                modelMap.put("明细表", mBillGroupModel);
+            } else {*/
+            JSONObject object = null;
+            String oldGroup = null;
+            for (int i = 0; i < formdetail.size(); i++) {
+                object = formdetail.getJSONObject(i);
+                BillGroupModel.BillModel mBillModel = getBillModelByObject(object);
+                String group = JSONUtil.getText(object, "dg_group");
+
+                if (modelMap.containsKey("明细" + group)) {
+                    BillGroupModel mBillGroupModel = modelMap.get("明细" + group);
+                    if (mBillGroupModel == null) {
+                        mBillGroupModel = new BillGroupModel();
+                        mBillGroupModel.setGroupIndex(index + modelMap.size() - 1);
+                        mBillGroupModel.setGroup("明细" + (modelMap.size() + 1));
+                        mBillGroupModel.setLastInType(true);
+                        mBillGroupModel.setForm(false);
+
+                        if (!TextUtils.isEmpty(oldGroup)) {
+                            modelMap.get(oldGroup).setLastInType(false);
+                        }
+                        oldGroup = "明细" + group;
+                        modelMap.put("明细" + group, mBillGroupModel);
+                    }
+
+                    mBillModel.setGroupIndex(mBillGroupModel.getGroupIndex());
+                    if (isShow(mBillModel)) {
+                        mBillGroupModel.addShow(mBillModel);
+                    } else {
+                        mBillGroupModel.addHide(mBillModel);
+                    }
+                } else {
+                    BillGroupModel mBillGroupModel = new BillGroupModel();
+                    mBillGroupModel.setGroupIndex(index + modelMap.size());
+                    mBillGroupModel.setGroup("明细" + (modelMap.size() + 1));
+                    mBillGroupModel.setLastInType(true);
+                    mBillGroupModel.setForm(false);
+                    modelMap.put("明细" + group, mBillGroupModel);
+
+                    mBillModel.setGroupIndex(mBillGroupModel.getGroupIndex());
+                    if (isShow(mBillModel)) {
+                        mBillGroupModel.addShow(mBillModel);
+                    } else {
+                        mBillGroupModel.addHide(mBillModel);
+                    }
+
+                    if (!TextUtils.isEmpty(oldGroup)) {
+                        modelMap.get(oldGroup).setLastInType(false);
+                    }
+                    oldGroup = "明细" + group;
+                }
+            }
+//            }
+            return modelMap;
+        } else {
+            return null;
+        }
+    }
+
+    private boolean isShow(BillGroupModel.BillModel mBillModel) {
+        return mBillModel.getIsdefault() == -1 && !mBillModel.getType().equals("H");
+    }
+
+    private BillGroupModel.BillModel getBillModelByObject(JSONObject object) {
+        String statusKey = null;
+        String status = null;
+
+        BillGroupModel.BillModel mBillModel = new BillGroupModel.BillModel();
+        String caption = JSONUtil.getText(object, "fd_caption", "dg_caption");//字段名称
+        String value = JSONUtil.getText(object, "fd_value", "dg_value");//字段名称
+        float fd_detno = JSONUtil.getFloat(object, "fd_detno");//序号
+        int id = JSONUtil.getInt(object, "fd_id", "gd_id");//id
+        int length = JSONUtil.getInt(object, "fd_maxlength", "dg_maxlength");//字符长度
+        int appwidth = JSONUtil.getInt(object, "fd_appwidth", "dg_appwidth");//宽度
+        int isdefault = JSONUtil.getInt(object, "mfd_isdefault", "mdg_isdefault");//是否显示
+        String dbfind = JSONUtil.getText(object, "fd_dbfind");//是否是dbfind字段判定
+        String type = JSONUtil.getText(object, "fd_type", "dg_type");//类型(标题类型为Constants.TYPE_TITLE,不触发点击事件等 )
+        String logicType = JSONUtil.getText(object, "fd_logictype", "dg_logictype");//logic类型
+        String readOnly = JSONUtil.getText(object, "fd_readonly");//是否只读
+        String field = JSONUtil.getText(object, "fd_field", "dg_field");//字段
+        String defValue = JSONUtil.getText(object, "fd_defaultvalue");//默认值
+        String allowBlank = JSONUtil.getText(object, "fd_allowblank");//是否允许为空(注:当作为标题的时候T:表示可以删除 F:表示不可删除)
+        String findFunctionName = JSONUtil.getText(object, "dg_findfunctionname");
+        if (logicType.equals("necessaryField")) {
+            allowBlank = "F";
+        }
+
+        if (TextUtils.isEmpty(statusKey) && ("单据状态".equals(caption) || "状态".equals(caption))) {
+            statusKey = field;
+            status = JSONUtil.getText(object, "cu_auditstatus", statusKey);
+
+            if (!TextUtils.isEmpty(status)) {
+                mIBillDetails.updateStatus(status);
+            }
+        }
+
+        //判断附件
+        if ("FF".equals(type) && !StringUtil.isEmpty(value)) {
+            loadFilePaths(value);
+        }
+
+        JSONArray combostore = JSONUtil.getJSONArray(object, "COMBOSTORE");
+        if (!ListUtils.isEmpty(combostore)) {
+            List<BillGroupModel.LocalData> localDatas = new ArrayList<>();
+            for (int i = 0; i < combostore.size(); i++) {
+                JSONObject combosModel = combostore.getJSONObject(i);
+                BillGroupModel.LocalData mLocalData = new BillGroupModel.LocalData();
+                mLocalData.display = JSONUtil.getText(combosModel, "DLC_DISPLAY");
+                mLocalData.value = JSONUtil.getText(combosModel, "DLC_VALUE");
+                localDatas.add(mLocalData);
+            }
+            mBillModel.setLocalDatas(localDatas);
+        }
+        //时间格式,默认添加时间(已取消)
+//        if ((type.equals("D") || type.equals("T")) && TextUtils.isEmpty(defValue)) {
+//            defValue = DateFormatUtil.long2Str(System.currentTimeMillis() + 1000 * 10 * 60, DateFormatUtil.YMD_HMS);
+//            if (caption.contains("生日")) {
+//                String day = DateFormatUtil.long2Str(System.currentTimeMillis(), DateFormatUtil.YMD);
+//                mBillModel.setValue(day);
+//                mBillModel.setDisplay(defValue);
+//            }
+//        }
+        mBillModel.setFindFunctionName(findFunctionName);
+        mBillModel.setDetno(fd_detno);
+        mBillModel.setCaption(caption);
+        mBillModel.setId(id);
+        mBillModel.setValue(value);
+        mBillModel.setLength(length);
+        mBillModel.setAppwidth(appwidth);
+        mBillModel.setIsdefault(isdefault);
+        mBillModel.setDbfind(dbfind);
+        mBillModel.setType(type);
+        mBillModel.setLogicType(logicType);
+        mBillModel.setReadOnly(readOnly);
+        mBillModel.setField(field);
+        mBillModel.setDefValue(defValue);
+        mBillModel.setAllowBlank(allowBlank);
+        return mBillModel;
+    }
+
+
     private void handlerFormData(JSONObject datas) throws Exception {
         String status = null;
         List<BillGroupModel> mBillGroupModels = new ArrayList<>();
@@ -205,8 +530,8 @@ public class BillDetailsPresenter extends BaseNetPresenter {
             mGroupModel.setDeleteAble(false);
             mGroupModel.setGroupIndex(0);
             mGroupModel.setGroup(" ");
-            String statusKey=   handlerModelByObject(mGroupModel, formconfigs, formdata);
-            status = JSONUtil.getText(formdata, "cu_auditstatus",statusKey);
+            String statusKey = handlerModelByObject(mGroupModel, formconfigs, formdata);
+            status = JSONUtil.getText(formdata, "cu_auditstatus", statusKey);
             mBillGroupModels.add(mGroupModel);
         }
         JSONArray gridconfigs = JSONUtil.getJSONArray(datas, "gridconfigs");
@@ -231,11 +556,13 @@ public class BillDetailsPresenter extends BaseNetPresenter {
 
 
     private String handlerModelByObject(BillGroupModel mGroupModel, JSONArray configs, JSONObject object) {
-        String statusKey=null;
+        String statusKey = null;
 
         for (int i = 0; i < configs.size(); i++) {
             JSONObject config = configs.getJSONObject(i);
-            if (config == null) continue;
+            if (config == null) {
+                continue;
+            }
             String caption = JSONUtil.getText(config, "FD_CAPTION", "DG_CAPTION");//获取第一个字段字段名称
             String field = JSONUtil.getText(config, "FD_FIELD", "DG_FIELD");//字段名称
             String type = JSONUtil.getText(config, "FD_TYPE", "DG_TYPE");
@@ -266,8 +593,8 @@ public class BillDetailsPresenter extends BaseNetPresenter {
                     }
                 }
             }
-            if (TextUtils.isEmpty(statusKey)&&("单据状态".equals(caption)||"状态".equals(caption))){
-                statusKey=field;
+            if (TextUtils.isEmpty(statusKey) && ("单据状态".equals(caption) || "状态".equals(caption))) {
+                statusKey = field;
             }
             if (!ListUtils.isEmpty(combostore)) {
                 List<BillGroupModel.LocalData> localDatas = new ArrayList<>();

+ 219 - 61
app_modular/apputils/src/main/java/com/modular/apputils/presenter/BillPresenter.java

@@ -2,6 +2,7 @@ package com.modular.apputils.presenter;
 
 import android.content.Context;
 import android.content.Intent;
+import android.support.annotation.Nullable;
 import android.text.TextUtils;
 
 import com.alibaba.fastjson.JSON;
@@ -118,26 +119,9 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
             formStore.put(e.getField(), e.getDisplay());
         }
 
-        List<Map<String, Object>> gridStoreList = new ArrayList<>();
-        for (List<BillGroupModel.BillModel> e : gridBillMap) {
-            if (!ListUtils.isEmpty(e)) {
-                Map<String, Object> gridStore = new HashMap<>();
-                for (BillGroupModel.BillModel billModel : e) {
-                    if (TextUtils.isEmpty(billModel.getValue())
-                            && ("necessaryField".equals(billModel.getAllowBlank())
-                            || "F".equals(billModel.getAllowBlank())) && billModel.getIsdefault() == -1) {
-                        iBill.showToast(billModel.getCaption() + "为必填项");
-                        iBill.dimssLoading();
-                        return;
-                    }
-                    if (isEnclosureNeedSubmit(billModel)) {
-                        pushEnclosure(billModel);
-                        return;
-                    }
-                    gridStore.put(billModel.getField(), billModel.getDisplay());
-                }
-                gridStoreList.add(gridStore);
-            }
+        List<Map<String, Object>> gridStoreList = analysisGrid(gridBillMap);
+        if (gridStoreList == null) {
+            return;
         }
         if (formStore == null || gridStoreList == null) {
             iBill.dimssLoading();
@@ -160,10 +144,105 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
                 , this);
     }
 
+    public void saveAndSubmit(List<BillGroupModel.BillModel> formFields, List<BillGroupModel.GridTab> otherGridList, int flag) {
+        Map<String, Object> formStore = new HashMap<>();
+        for (BillGroupModel.BillModel e : formFields) {
+            if (TextUtils.isEmpty(e.getValue()) && e.getIsdefault() == -1 &&
+                    ("necessaryField".equals(e.getAllowBlank()) || "F".equals(e.getAllowBlank()))) {
+                iBill.showToast(e.getCaption() + "为必填项");
+                iBill.dimssLoading();
+                return;
+            }
+            if (isEnclosureNeedSubmit(e)) {
+                pushEnclosure(e);
+                return;
+            }
+            formStore.put(e.getField(), e.getDisplay());
+        }
+
+        List<Map<String, Object>> otherGridStoreList = new ArrayList<>();
+        for (BillGroupModel.GridTab gridTab : otherGridList) {
+            if (gridTab != null) {
+                List<BillGroupModel> tabGroupModels = gridTab.getBillGroupModels();
+                String otherCaller = gridTab.getCaller();
+                if (tabGroupModels != null && tabGroupModels.size() > 0) {
+                    List<List<BillGroupModel.BillModel>> otherGridMap = new ArrayList<>();
+                    for (BillGroupModel tabGroupModel : tabGroupModels) {
+                        List<BillGroupModel.BillModel> otherGrid = new ArrayList<>();
+                        List<BillGroupModel.BillModel> otherShowFields = tabGroupModel.getShowBillFields();
+                        List<BillGroupModel.BillModel> otherHideFields = tabGroupModel.getHideBillFields();
+
+                        if (otherShowFields != null) {
+                            otherGrid.addAll(otherShowFields);
+                        }
+                        if (otherHideFields != null) {
+                            otherGrid.addAll(otherHideFields);
+                        }
+                        otherGridMap.add(otherGrid);
+                    }
+                    List<Map<String, Object>> otherGridStoreItem = analysisGrid(otherGridMap);
+                    if (otherGridStoreItem == null) {
+                        return;
+                    }
+                    String otherGridStoreItemStr = JSONUtil.map2JSON(otherGridStoreItem);
+                    JSONArray otherGridStoreItemArray = JSON.parseArray(otherGridStoreItemStr);
+
+                    Map<String, Object> OtherGridStoreItemMap = new HashMap<>();
+                    OtherGridStoreItemMap.put("dgcaller", otherCaller);
+                    OtherGridStoreItemMap.put("dgData", otherGridStoreItemArray);
+
+                    otherGridStoreList.add(OtherGridStoreItemMap);
+                }
+            }
+        }
+
+        String formStoreStr = JSONUtil.map2JSON(formStore);
+        String otherGridStoreListStr = JSONUtil.map2JSON(otherGridStoreList);
+        LogUtil.prinlnLongMsg("billJson", formStoreStr);
+        LogUtil.prinlnLongMsg("billJson", otherGridStoreListStr);
+
+        requestCompanyHttp(new Parameter.Builder()
+                        .url(mId == 0 ? "mobile/oa/commonSaveAndSubmit.action" : "mobile/commonUpdate.action")
+                        .mode(Method.POST)
+                        .addParams("caller", mCaller)
+                        .addParams("keyid", String.valueOf(mId))
+                        .addParams("formStore", formStoreStr)
+                        .addParams("othergridStore", otherGridStoreListStr)
+                        .record(SAVE_AND_SUBMIT)
+                , this);
+    }
+
+    @Nullable
+    private List<Map<String, Object>> analysisGrid(List<List<BillGroupModel.BillModel>> gridBillMap) {
+        List<Map<String, Object>> gridStoreList = new ArrayList<>();
+        for (List<BillGroupModel.BillModel> e : gridBillMap) {
+            if (!ListUtils.isEmpty(e)) {
+                Map<String, Object> gridStore = new HashMap<>();
+                for (BillGroupModel.BillModel billModel : e) {
+                    if (TextUtils.isEmpty(billModel.getValue())
+                            && ("necessaryField".equals(billModel.getAllowBlank())
+                            || "F".equals(billModel.getAllowBlank())) && billModel.getIsdefault() == -1) {
+                        iBill.showToast(billModel.getCaption() + "为必填项");
+                        iBill.dimssLoading();
+                        return null;
+                    }
+                    if (isEnclosureNeedSubmit(billModel)) {
+                        pushEnclosure(billModel);
+                        return null;
+                    }
+                    gridStore.put(billModel.getField(), billModel.getDisplay());
+                }
+                gridStoreList.add(gridStore);
+            }
+        }
+        return gridStoreList;
+    }
+
     public void saveAndSubmit(List<BillGroupModel> mGroupModels) {
         iBill.showLoading();
         List<BillGroupModel.BillModel> formFields = new ArrayList<>();
         List<List<BillGroupModel.BillModel>> gridBillMap = new ArrayList<>();
+        List<BillGroupModel.GridTab> otherGridList = new ArrayList<>();
         for (BillGroupModel e : mGroupModels) {
             if (e.isForm()) {
                 if (e.getShowBillFields() != null) {
@@ -174,6 +253,11 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
                 }
 
             } else {
+                List<BillGroupModel.GridTab> gridTabs = e.getGridTabs();
+                if (gridTabs != null && gridTabs.size() > 0) {
+                    otherGridList = gridTabs;
+                    break;
+                }
                 List<BillGroupModel.BillModel> gridBillFields = new ArrayList<>();
                 if (e.getShowBillFields() != null) {
                     gridBillFields.addAll(e.getShowBillFields());
@@ -184,7 +268,11 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
                 gridBillMap.add(gridBillFields);
             }
         }
-        saveAndSubmit(formFields, gridBillMap);
+        if (otherGridList == null || otherGridList.size() <= 0) {
+            saveAndSubmit(formFields, gridBillMap);
+        } else {
+            saveAndSubmit(formFields, otherGridList, 0);
+        }
     }
 
 
@@ -329,7 +417,7 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
         switch (what) {
             case LOAD_FORM:
 //                handlerBill(jsonObject);
-                handlerBillTest();
+                handlerMultiBill(jsonObject);
                 break;
             case SAVE_AND_SUBMIT:
                 if (JSONUtil.getBoolean(jsonObject, "success")) {
@@ -436,7 +524,9 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
 
     public void getEmnameByReturn(String text, String jsonObject) {
         LogUtil.i("gong", "text=" + text + "   ||jsonObject=" + jsonObject);
-        if (StringUtil.isEmpty(text)) return;
+        if (StringUtil.isEmpty(text)) {
+            return;
+        }
         Pattern pattern = Pattern.compile("(?<=\\()(.+?)(?=\\))");
         Matcher matcher = pattern.matcher(text);
         while (matcher.find()) {
@@ -455,11 +545,11 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
         }
     };
 
-    private void handlerBillTest() {
-        String localJson = CommonUtil.getAssetsJson(ct, "bill.json");
-        LogUtil.prinlnLongMsg("billJson", localJson);
+    protected void handlerMultiBill(JSONObject resultObject) {
+//        String localJson = CommonUtil.getAssetsJson(ct, "bill.json");
+//        LogUtil.prinlnLongMsg("billJson", localJson);
         try {
-            JSONObject resultObject = JSON.parseObject(localJson);
+//            JSONObject resultObject = JSON.parseObject(localJson);
 
             List<BillGroupModel> showBillModels = new ArrayList<>();
             JSONObject config = JSONUtil.getJSONObject(resultObject, "config");
@@ -492,14 +582,18 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
 
                         showBillModels.add(billTab);
 
-                        showBillModels.add(otherGridTabs.get(0).getBillGroupModels().get(0));
+                        showBillModels.addAll(otherGridTabs.get(0).getBillGroupModels());
                     }
                 }
             } else {
                 JSONArray gridetail = JSONUtil.getJSONArray(data, "gridetail");
-                BillGroupModel mGridetailModel = handlerGridetail(showBillModels.size(), gridetail);
-                if (mGridetailModel != null) {
-                    showBillModels.add(mGridetailModel);
+                Map<String, BillGroupModel> gridGroupModelMap = handlerGridetail(showBillModels.size(), gridetail);
+                if (gridGroupModelMap != null && !gridGroupModelMap.isEmpty()) {
+                    for (Map.Entry<String, BillGroupModel> entry : gridGroupModelMap.entrySet()) {
+                        if (entry.getValue() != null) {
+                            showBillModels.add(entry.getValue());
+                        }
+                    }
                 }
             }
             LogUtil.i("gong", "showBillModels=" + JSON.toJSONString(showBillModels));
@@ -516,19 +610,23 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
             if (otherGrid != null) {
                 JSONArray detailgrid = otherGrid.getJSONArray("detailgrid");
                 if (detailgrid != null && detailgrid.size() > 0) {
-                    BillGroupModel billGroupModel = handlerGridetail(index, detailgrid);
-                    if (billGroupModel != null) {
-                        BillGroupModel.GridTab gridTab = new BillGroupModel.GridTab();
-                        gridTab.setTitle(JSONUtil.getText(otherGrid, "dgtitle"));
-                        gridTab.setCaller(JSONUtil.getText(otherGrid, "dgcaller"));
-                        gridTab.setPosition(i);
+                    BillGroupModel.GridTab gridTab = new BillGroupModel.GridTab();
+                    gridTab.setTitle(JSONUtil.getText(otherGrid, "dgtitle"));
+                    gridTab.setCaller(JSONUtil.getText(otherGrid, "dgcaller"));
+                    gridTab.setPosition(i);
 
+                    Map<String, BillGroupModel> gridGroupModelMap = handlerGridetail(index, detailgrid);
+                    if (gridGroupModelMap != null && !gridGroupModelMap.isEmpty()) {
                         List<BillGroupModel> billGroupModels = new ArrayList<>();
-                        billGroupModels.add(billGroupModel);
+                        for (Map.Entry<String, BillGroupModel> entry : gridGroupModelMap.entrySet()) {
+                            if (entry.getValue() != null) {
+                                billGroupModels.add(entry.getValue());
+                            }
+                        }
                         gridTab.setBillGroupModels(billGroupModels);
-
-                        gridTabs.add(gridTab);
                     }
+
+                    gridTabs.add(gridTab);
                 }
             }
         }
@@ -557,9 +655,13 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
             }
         }
         JSONArray gridetail = JSONUtil.getJSONArray(data, "gridetail");
-        BillGroupModel mGridetailModel = handlerGridetail(showBillModels.size(), gridetail);
-        if (mGridetailModel != null) {
-            showBillModels.add(mGridetailModel);
+        Map<String, BillGroupModel> gridGroupModelMap = handlerGridetail(showBillModels.size(), gridetail);
+        if (gridGroupModelMap != null && !gridGroupModelMap.isEmpty()) {
+            for (Map.Entry<String, BillGroupModel> entry : gridGroupModelMap.entrySet()) {
+                if (entry.getValue() != null) {
+                    showBillModels.add(entry.getValue());
+                }
+            }
         }
         LogUtil.i("gong", "showBillModels=" + JSON.toJSONString(showBillModels));
         iBill.setAdapter(showBillModels);
@@ -627,27 +729,83 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
      * @param formdetail
      * @return
      */
-    private BillGroupModel handlerGridetail(int index, JSONArray formdetail) {
+    private Map<String, BillGroupModel> handlerGridetail(int index, JSONArray formdetail) {
         if (formdetail != null && !formdetail.isEmpty()) {
-            BillGroupModel mBillGroupModel = new BillGroupModel();
-            mBillGroupModel.setGroupIndex(index);
-            mBillGroupModel.setGroup("明细表");
-            mBillGroupModel.setLastInType(true);
-            mBillGroupModel.setForm(false);
-            List<BillGroupModel.BillModel> hideBillFields = new ArrayList<>();//当前组隐藏的字段列表
-            List<BillGroupModel.BillModel> showBillFields = new ArrayList<>();//当前组显示的字段列表
-            for (int i = 0; i < formdetail.size(); i++) {
-                BillGroupModel.BillModel mBillModel = getBillModelByObject(formdetail.getJSONObject(i));
-                mBillModel.setGroupIndex(index);
-                if (isShow(mBillModel)) {
-                    showBillFields.add(mBillModel);
-                } else {
-                    hideBillFields.add(mBillModel);
+            Map<String, BillGroupModel> modelMap = new LinkedHashMap<>();
+            if (mId <= 0) {
+                BillGroupModel mBillGroupModel = new BillGroupModel();
+                mBillGroupModel.setGroupIndex(index);
+                mBillGroupModel.setGroup("明细表");
+                mBillGroupModel.setLastInType(true);
+                mBillGroupModel.setForm(false);
+                List<BillGroupModel.BillModel> hideBillFields = new ArrayList<>();//当前组隐藏的字段列表
+                List<BillGroupModel.BillModel> showBillFields = new ArrayList<>();//当前组显示的字段列表
+                for (int i = 0; i < formdetail.size(); i++) {
+                    BillGroupModel.BillModel mBillModel = getBillModelByObject(formdetail.getJSONObject(i));
+                    mBillModel.setGroupIndex(index);
+                    if (isShow(mBillModel)) {
+                        showBillFields.add(mBillModel);
+                    } else {
+                        hideBillFields.add(mBillModel);
+                    }
+                }
+                mBillGroupModel.setHideBillFields(hideBillFields);
+                mBillGroupModel.setShowBillFields(showBillFields);
+
+                modelMap.put("明细表", mBillGroupModel);
+            } else {
+                JSONObject object = null;
+                String oldGroup = null;
+                for (int i = 0; i < formdetail.size(); i++) {
+                    object = formdetail.getJSONObject(i);
+                    BillGroupModel.BillModel mBillModel = getBillModelByObject(object);
+                    String group = JSONUtil.getText(object, "dg_group");
+
+                    if (modelMap.containsKey("明细" + group)) {
+                        BillGroupModel mBillGroupModel = modelMap.get("明细" + group);
+                        if (mBillGroupModel == null) {
+                            mBillGroupModel = new BillGroupModel();
+                            mBillGroupModel.setGroupIndex(index + modelMap.size() - 1);
+                            mBillGroupModel.setGroup("明细" + (modelMap.size() + 1));
+                            mBillGroupModel.setLastInType(true);
+                            mBillGroupModel.setForm(false);
+
+                            if (!TextUtils.isEmpty(oldGroup)) {
+                                modelMap.get(oldGroup).setLastInType(false);
+                            }
+                            oldGroup = "明细" + group;
+                            modelMap.put("明细" + group, mBillGroupModel);
+                        }
+
+                        mBillModel.setGroupIndex(mBillGroupModel.getGroupIndex());
+                        if (isShow(mBillModel)) {
+                            mBillGroupModel.addShow(mBillModel);
+                        } else {
+                            mBillGroupModel.addHide(mBillModel);
+                        }
+                    } else {
+                        BillGroupModel mBillGroupModel = new BillGroupModel();
+                        mBillGroupModel.setGroupIndex(index + modelMap.size());
+                        mBillGroupModel.setGroup("明细" + (modelMap.size() + 1));
+                        mBillGroupModel.setLastInType(true);
+                        mBillGroupModel.setForm(false);
+                        modelMap.put("明细" + group, mBillGroupModel);
+
+                        mBillModel.setGroupIndex(mBillGroupModel.getGroupIndex());
+                        if (isShow(mBillModel)) {
+                            mBillGroupModel.addShow(mBillModel);
+                        } else {
+                            mBillGroupModel.addHide(mBillModel);
+                        }
+
+                        if (!TextUtils.isEmpty(oldGroup)) {
+                            modelMap.get(oldGroup).setLastInType(false);
+                        }
+                        oldGroup = "明细" + group;
+                    }
                 }
             }
-            mBillGroupModel.setHideBillFields(hideBillFields);
-            mBillGroupModel.setShowBillFields(showBillFields);
-            return mBillGroupModel;
+            return modelMap;
         } else {
             return null;
         }

+ 1 - 11
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerDetails3_0Activity.java

@@ -1,41 +1,31 @@
 package com.uas.appworks.crm3_0.activity;
 
 import android.content.Intent;
-import android.os.Bundle;
 import android.support.design.widget.TabLayout;
 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.text.TextUtils;
 import android.util.SparseArray;
-import android.view.Menu;
-import android.view.MenuItem;
 import android.view.View;
 import android.widget.LinearLayout;
-import android.widget.ListView;
 import android.widget.TextView;
 
-import com.common.LogUtil;
 import com.common.data.ListUtils;
 import com.common.data.StringUtil;
 import com.core.app.Constants;
-import com.core.base.OABaseActivity;
 import com.modular.apputils.activity.BillDetailsActivity;
 import com.modular.apputils.model.BillGroupModel;
 import com.modular.apputils.presenter.BillDetailsPresenter;
-import com.modular.apputils.widget.VeriftyDialog;
 import com.uas.appworks.OA.erp.utils.MostLinearLayoutManager;
 import com.uas.appworks.R;
 import com.uas.appworks.activity.SchedulerCreateActivity;
-import com.uas.appworks.adapter.BillListDetailsAdapter;
 import com.uas.appworks.crm3_0.fragment.CustomerDetailsBottomListFragment;
 import com.uas.appworks.model.CustomerBindBill;
 import com.uas.appworks.model.Schedule;
 import com.uas.appworks.presenter.CustomerDetailsPresenter;
 import com.uas.appworks.presenter.imp.ICustomerDetails;
 
-import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -111,7 +101,7 @@ public class CustomerDetails3_0Activity extends BillDetailsActivity implements I
         @Override
         public void onClick(View view) {
             if (view == createScheduleTv) {
-                List<BillGroupModel> mGroupModels = mBillDetailsAdapter.getGroupModels();
+                List<BillGroupModel> mGroupModels = mBillDetailsAdapter.getBillGroupModels();
                 if (!ListUtils.isEmpty(mGroupModels)) {
                     BillGroupModel mGroupModel = mGroupModels.get(0);
                     if (mGroupModel != null) {

+ 1 - 1
app_modular/appworks/src/main/java/com/uas/appworks/presenter/CustomerContactBillPresenter.java

@@ -180,7 +180,7 @@ public class CustomerContactBillPresenter extends BillPresenter {
     public void onSuccess(int what, String message, Tags tag) throws Exception {
         switch (what) {
             case LOAD_FORM_INPUT:
-                handlerBill(JSON.parseObject(message));
+                handlerMultiBill(JSON.parseObject(message));
                 break;
             case LOAD_FORM_DETAILS:
                 handlerFormData(JSONUtil.getJSONObject(message, "datas"));