Browse Source

提交类型 修复bug
提交内容 修改会议出现两个情况

Bitliker 7 years ago
parent
commit
d0b6ab9636
57 changed files with 2767 additions and 232 deletions
  1. 135 0
      app_core/common/src/main/java/com/common/file/FileUtils.java
  2. 1 0
      app_core/common/src/main/java/com/core/app/Constants.java
  3. 1 0
      app_core/common/src/main/res/values/colors.xml
  4. 1 0
      app_modular/apputils/build.gradle
  5. 50 1
      app_modular/apputils/src/main/java/com/modular/apputils/activity/BillInputActivity.java
  6. 164 2
      app_modular/apputils/src/main/java/com/modular/apputils/adapter/BillAdapter.java
  7. 89 0
      app_modular/apputils/src/main/java/com/modular/apputils/fragment/ViewPagerLazyFragment.java
  8. 3 12
      app_modular/apputils/src/main/java/com/modular/apputils/model/BillGroupModel.java
  9. 1 0
      app_modular/apputils/src/main/java/com/modular/apputils/model/BillListGroupModel.java
  10. 142 21
      app_modular/apputils/src/main/java/com/modular/apputils/presenter/BillPresenter.java
  11. 2 0
      app_modular/apputils/src/main/java/com/modular/apputils/presenter/imp/IBill.java
  12. 2 0
      app_modular/apputils/src/main/java/com/modular/apputils/utils/BillTypeChangeUtils.java
  13. 93 0
      app_modular/apputils/src/main/java/com/modular/apputils/utils/UUHttpHelper.java
  14. BIN
      app_modular/apputils/src/main/res/drawable-hdpi/ic_bill_file.png
  15. BIN
      app_modular/apputils/src/main/res/drawable-xhdpi/ic_bill_file.png
  16. BIN
      app_modular/apputils/src/main/res/drawable-xxhdpi/ic_bill_file.png
  17. 1 0
      app_modular/apputils/src/main/res/layout/activity_bill_input.xml
  18. 40 0
      app_modular/apputils/src/main/res/layout/item_bill_enclosure.xml
  19. 43 0
      app_modular/apputils/src/main/res/layout/item_bill_enclosure_item.xml
  20. 6 0
      app_modular/apputils/src/main/res/menu/menu_bill_input.xml
  21. 3 1
      app_modular/appworks/src/main/AndroidManifest.xml
  22. 108 0
      app_modular/appworks/src/main/java/com/uas/appworks/adapter/BillListAdapter.java
  23. 571 0
      app_modular/appworks/src/main/java/com/uas/appworks/adapter/CustomerBillInputAdapter.java
  24. 328 0
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerBillInputActivity.java
  25. 199 0
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerDetails3_0Activity.java
  26. 7 6
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerListActivity.java
  27. 22 11
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerManageActivity.java
  28. 20 0
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/fragment/CustomerDetailsBottomListFragment.java
  29. 63 106
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/fragment/CustomerListDetailsFragment.java
  30. 23 10
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/fragment/CustomerListFragment.java
  31. 201 0
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/fragment/CustomerMapDetailsFragment.java
  32. 82 4
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/fragment/CustomerMapFragment.java
  33. 170 0
      app_modular/appworks/src/main/java/com/uas/appworks/presenter/CustomerDetailsPresenter.java
  34. 10 0
      app_modular/appworks/src/main/java/com/uas/appworks/presenter/imp/ICustomerDetails.java
  35. 8 0
      app_modular/appworks/src/main/res/color/color_public_customer_tab.xml
  36. BIN
      app_modular/appworks/src/main/res/drawable-hdpi/ic_customer_list.png
  37. BIN
      app_modular/appworks/src/main/res/drawable-hdpi/ic_customer_list_pass.png
  38. BIN
      app_modular/appworks/src/main/res/drawable-hdpi/ic_customer_map.png
  39. BIN
      app_modular/appworks/src/main/res/drawable-hdpi/ic_customer_map_pass.png
  40. BIN
      app_modular/appworks/src/main/res/drawable-xhdpi/ic_customer_list.png
  41. BIN
      app_modular/appworks/src/main/res/drawable-xhdpi/ic_customer_list_pass.png
  42. BIN
      app_modular/appworks/src/main/res/drawable-xhdpi/ic_customer_map.png
  43. BIN
      app_modular/appworks/src/main/res/drawable-xhdpi/ic_customer_map_pass.png
  44. BIN
      app_modular/appworks/src/main/res/drawable-xxhdpi/ic_customer_list.png
  45. BIN
      app_modular/appworks/src/main/res/drawable-xxhdpi/ic_customer_list_pass.png
  46. BIN
      app_modular/appworks/src/main/res/drawable-xxhdpi/ic_customer_map.png
  47. BIN
      app_modular/appworks/src/main/res/drawable-xxhdpi/ic_customer_map_pass.png
  48. 0 24
      app_modular/appworks/src/main/res/drawable/ic_customer_list.xml
  49. 8 0
      app_modular/appworks/src/main/res/drawable/selector_customer_list.xml
  50. 8 0
      app_modular/appworks/src/main/res/drawable/selector_customer_map.xml
  51. 39 0
      app_modular/appworks/src/main/res/layout/activity_customer_details_3_0.xml
  52. 22 13
      app_modular/appworks/src/main/res/layout/activity_customer_list_3_0.xml
  53. 5 4
      app_modular/appworks/src/main/res/layout/fragment_customer_list_3_0.xml
  54. 17 16
      app_modular/appworks/src/main/res/layout/fragment_customer_map_3_0.xml
  55. 24 0
      app_modular/appworks/src/main/res/layout/item_customer_bill_add_contact.xml
  56. 54 0
      app_modular/appworks/src/main/res/layout/item_customer_details_3_0.xml
  57. 1 1
      app_modular/appworks/src/main/res/layout/item_customer_list_details_list.xml

+ 135 - 0
app_core/common/src/main/java/com/common/file/FileUtils.java

@@ -1,10 +1,17 @@
 package com.common.file;
 
+import android.annotation.SuppressLint;
+import android.content.ContentUris;
+import android.content.Context;
 import android.content.Intent;
+import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Environment;
+import android.provider.DocumentsContract;
+import android.provider.MediaStore;
 import android.util.Log;
 
 import com.common.LogUtil;
@@ -289,4 +296,132 @@ public class FileUtils {
             return null;
         }
     }
+
+
+    public static String getRealPathFromURI(Context ct, Uri contentUri) {
+        String res = null;
+        String[] proj = {MediaStore.Images.Media.DATA};
+        Cursor cursor = ct.getContentResolver().query(contentUri, proj, null, null, null);
+        if (null != cursor && cursor.moveToFirst()) {
+            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
+            res = cursor.getString(column_index);
+            cursor.close();
+        }
+        return res;
+    }
+
+
+    /**
+     * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使
+     */
+    @SuppressLint("NewApi")
+    public static String getPath(final Context context, final Uri uri) {
+
+        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
+
+        // DocumentProvider
+        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
+            // ExternalStorageProvider
+            if (isExternalStorageDocument(uri)) {
+                final String docId = DocumentsContract.getDocumentId(uri);
+                final String[] split = docId.split(":");
+                final String type = split[0];
+
+                if ("primary".equalsIgnoreCase(type)) {
+                    return Environment.getExternalStorageDirectory() + "/" + split[1];
+                }
+            }
+            // DownloadsProvider
+            else if (isDownloadsDocument(uri)) {
+
+                final String id = DocumentsContract.getDocumentId(uri);
+                final Uri contentUri = ContentUris.withAppendedId(
+                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
+
+                return getDataColumn(context, contentUri, null, null);
+            }
+            // MediaProvider
+            else if (isMediaDocument(uri)) {
+                final String docId = DocumentsContract.getDocumentId(uri);
+                final String[] split = docId.split(":");
+                final String type = split[0];
+
+                Uri contentUri = null;
+                if ("image".equals(type)) {
+                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
+                } else if ("video".equals(type)) {
+                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
+                } else if ("audio".equals(type)) {
+                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
+                }
+
+                final String selection = "_id=?";
+                final String[] selectionArgs = new String[]{split[1]};
+
+                return getDataColumn(context, contentUri, selection, selectionArgs);
+            }
+        }
+        // MediaStore (and general)
+        else if ("content".equalsIgnoreCase(uri.getScheme())) {
+            return getDataColumn(context, uri, null, null);
+        }
+        // File
+        else if ("file".equalsIgnoreCase(uri.getScheme())) {
+            return uri.getPath();
+        }
+        return null;
+    }
+    /**
+     * @param uri The Uri to check.
+     * @return Whether the Uri authority is ExternalStorageProvider.
+     */
+    public static  boolean isExternalStorageDocument(Uri uri) {
+        return "com.android.externalstorage.documents".equals(uri.getAuthority());
+    }
+
+    /**
+     * @param uri The Uri to check.
+     * @return Whether the Uri authority is DownloadsProvider.
+     */
+    public static  boolean isDownloadsDocument(Uri uri) {
+        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
+    }
+
+    /**
+     * @param uri The Uri to check.
+     * @return Whether the Uri authority is MediaProvider.
+     */
+    public static  boolean isMediaDocument(Uri uri) {
+        return "com.android.providers.media.documents".equals(uri.getAuthority());
+    }
+    /**
+     * Get the value of the data column for this Uri. This is useful for
+     * MediaStore Uris, and other file-based ContentProviders.
+     *
+     * @param context       The context.
+     * @param uri           The Uri to query.
+     * @param selection     (Optional) Filter used in the query.
+     * @param selectionArgs (Optional) Selection arguments used in the query.
+     * @return The value of the _data column, which is typically a file path.
+     */
+    public static  String getDataColumn(Context context, Uri uri, String selection,
+                                String[] selectionArgs) {
+
+        Cursor cursor = null;
+        final String column = "_data";
+        final String[] projection = {column};
+
+        try {
+            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
+                    null);
+            if (cursor != null && cursor.moveToFirst()) {
+                final int column_index = cursor.getColumnIndexOrThrow(column);
+                return cursor.getString(column_index);
+            }
+        } finally {
+            if (cursor != null)
+                cursor.close();
+        }
+        return null;
+    }
 }

+ 1 - 0
app_core/common/src/main/java/com/core/app/Constants.java

@@ -568,5 +568,6 @@ public class Constants {
         String CALLER="mCaller";
         String ID="mId";
         String TITLE="mTitlte";
+        String HASHMAP="hashMap";
     }
 }

+ 1 - 0
app_core/common/src/main/res/values/colors.xml

@@ -359,6 +359,7 @@
     <color name="empty_text_color">#999999</color>
 
     <color name="b2b_quote_tab_selected">#4084f1</color>
+    <color name="customer_tab_selected">#1084D1</color>
 
     <color name="business_rank_no1">#FF830C</color>
     <color name="business_rank_no2">#01E83A</color>

+ 1 - 0
app_modular/apputils/build.gradle

@@ -10,6 +10,7 @@ android {
         versionCode rootProject.ext.android.versionCode
         versionName rootProject.ext.android.versionName
     }
+    useLibrary 'org.apache.http.legacy'
     buildTypes {
         release {
             minifyEnabled false

+ 50 - 1
app_modular/apputils/src/main/java/com/modular/apputils/activity/BillInputActivity.java

@@ -1,6 +1,9 @@
 package com.modular.apputils.activity;
 
+import android.app.Activity;
 import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.support.v7.widget.DividerItemDecoration;
 import android.support.v7.widget.LinearLayoutManager;
@@ -9,6 +12,7 @@ import android.text.TextUtils;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.widget.LinearLayout;
+import android.widget.Toast;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
@@ -17,6 +21,7 @@ import com.common.data.CalendarUtil;
 import com.common.data.JSONUtil;
 import com.common.data.ListUtils;
 import com.common.data.StringUtil;
+import com.common.file.FileUtils;
 import com.core.base.BaseActivity;
 import com.core.base.OABaseActivity;
 import com.core.model.SelectBean;
@@ -31,6 +36,7 @@ import com.modular.apputils.model.BillGroupModel;
 import com.modular.apputils.presenter.BillPresenter;
 import com.modular.apputils.presenter.imp.IBill;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.LinkedHashSet;
@@ -39,15 +45,17 @@ import java.util.Set;
 
 
 /**
- * 动态表单单据录入界面
+ * 动态表单单据录入界面,后续会尽量关闭修改,添加拓展功能
  */
 public class BillInputActivity extends OABaseActivity implements IBill {
     private final int REQUESTCODE_C = 0x11;
     private final int REQUESTCODE_DB_FIND = 0x12;
+    private final int REQUESTCODE_ENCLOSURE = 0x13;
 
     private RecyclerView mRecyclerView;
     private BillPresenter mBillPresenter;
     private BillAdapter mBillAdapter;
+    private int selectPosition = -1;//当前选择调转界面的index,本来不想添加全局变量的,没有办法
 
 
     @Override
@@ -79,6 +87,8 @@ public class BillInputActivity extends OABaseActivity implements IBill {
             if (item.getTitle().equals("提交")) {
                 mBillPresenter.saveAndSubmit(mBillAdapter.getBillGroupModels());
             }
+        } else if (item.getItemId() == R.id.list) {
+            //TODO 查看列表
         }
         return super.onOptionsItemSelected(item);
     }
@@ -106,6 +116,12 @@ public class BillInputActivity extends OABaseActivity implements IBill {
         finish();
     }
 
+    @Override
+    public void updateFileOk() {
+        dimssLoading();
+        mBillPresenter.saveAndSubmit(mBillAdapter.getBillGroupModels());
+    }
+
     private BillAdapter.OnAdapterListener mOnAdapterListener = new BillAdapter.OnAdapterListener() {
         @Override
         public void toSelect(int position, BillGroupModel.BillModel model) {
@@ -133,6 +149,19 @@ public class BillInputActivity extends OABaseActivity implements IBill {
                 }
             }
         }
+
+        @Override
+        public void toEnclosureSelect(int position) {
+            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+            //intent.setType(“image/*”);//选择图片
+            //intent.setType(“audio/*”); //选择音频
+            //intent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式)
+            //intent.setType(“video/*;image/*”);//同时选择视频和图片
+            selectPosition = position;
+            intent.setType("*/*");//无类型限制
+            intent.addCategory(Intent.CATEGORY_OPENABLE);
+            startActivityForResult(intent, REQUESTCODE_ENCLOSURE);
+        }
     };
 
     /**
@@ -239,6 +268,26 @@ public class BillInputActivity extends OABaseActivity implements IBill {
                 String nodeId = StringUtil.isEmpty(d.getJson()) ? "" : d.getJson();
                 mBillPresenter.getEmnameByReturn(name, nodeId);
                 break;
+            case REQUESTCODE_ENCLOSURE:
+                if (resultCode == Activity.RESULT_OK) {
+                    String path;
+                    Uri uri = data.getData();
+                    if ("file".equalsIgnoreCase(uri.getScheme())) {//使用第三方应用打开
+                        path = uri.getPath();
+                    } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后
+                        path = FileUtils.getPath(this, uri);
+                    } else {//4.4以下下系统调用方法
+                        path = FileUtils.getRealPathFromURI(this, uri);
+                    }
+                    File file = new File(path);
+                    if (file != null && file.exists() && file.isFile()) {
+                        String value = file.getName();
+                        String display = path;
+                        mBillAdapter.addBillModelData(selectPosition, value, display);
+                        selectPosition = -1;
+                    }
+                }
+                break;
         }
     }
 

+ 164 - 2
app_modular/apputils/src/main/java/com/modular/apputils/adapter/BillAdapter.java

@@ -11,18 +11,26 @@ import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.Button;
 import android.widget.EditText;
 import android.widget.ImageView;
 import android.widget.TextView;
 
 
+import com.alibaba.fastjson.JSON;
+import com.baidu.cyberplayer.utils.G;
 import com.chad.library.adapter.base.BaseViewHolder;
 import com.common.LogUtil;
 import com.common.data.ListUtils;
+import com.common.file.FileUtils;
 import com.core.model.SelectBean;
 import com.core.utils.ToastUtil;
 import com.core.widget.listener.EditChangeListener;
 import com.core.widget.view.Activity.SelectActivity;
+import com.core.widget.view.MyGridView;
+import com.me.imageloader.ImageLoaderUtil;
 import com.modular.apputils.R;
 import com.modular.apputils.model.BillGroupModel;
 import com.modular.apputils.utils.BillTypeChangeUtils;
@@ -50,6 +58,7 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
         this.mBillGroupModels = mBillGroupModels;
         this.mOnAdapterListener = mOnAdapterListener;
         changeBillModel();
+        LogUtil.i("gong", "mShowBillModels=" + JSON.toJSONString(mShowBillModels));
     }
 
     public void updateBillModelValues(int position, String values, String display) {
@@ -60,6 +69,19 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
         }
     }
 
+    public void addBillModelData(int position, String values, String display) {
+        if (position >= 0 && position < ListUtils.getSize(mShowBillModels)) {
+            if (mShowBillModels.get(position).getLocalDatas() == null) {
+                mShowBillModels.get(position).setLocalDatas(new ArrayList<BillGroupModel.LocalData>());
+            }
+            BillGroupModel.LocalData data = new BillGroupModel.LocalData();
+            data.value = values;
+            data.display = display;
+            mShowBillModels.get(position).getLocalDatas().add(data);
+            notifyItemChanged(position);
+        }
+    }
+
     public void setBillGroupModels(List<BillGroupModel> mBillGroupModels) {
         this.mBillGroupModels = mBillGroupModels;
         changeBillModel();
@@ -132,6 +154,9 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
             case 1:
                 viewHolder = new InputViewHolder(parent, R.layout.item_bill_input_select);
                 break;
+            case 2:
+                viewHolder = new EnclosureViewHolder(parent, R.layout.item_bill_enclosure);
+                break;//附件类型
             case 110:
                 viewHolder = new AddViewHolder(parent, R.layout.item_bill_add);
                 break;
@@ -189,6 +214,7 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
         }
     }
 
+    //选择和输入类型
     class InputViewHolder extends BaseViewHolder {
         private TextView captionTv;
         private TextView muchInputTv;
@@ -206,8 +232,24 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
             selectIv = (ImageView) itemView.findViewById(R.id.selectIv);
             valuesEd = (EditText) itemView.findViewById(R.id.valuesEd);
         }
+    }
+
+    //附件类型
+    class EnclosureViewHolder extends BaseViewHolder {
+        private TextView captionTv;
+        private TextView muchInputTv;
+        private MyGridView ffGv;
 
+        public EnclosureViewHolder(ViewGroup parent, int layoutId) {
+            super(parent, layoutId);
+        }
 
+        @Override
+        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);
+        }
     }
 
     class TitleViewHolder extends BaseViewHolder {
@@ -240,6 +282,8 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
                 bindTitleView((TitleViewHolder) holder, model, position);
             } else if (holder instanceof AddViewHolder) {
                 bindAddView((AddViewHolder) holder, model, position);
+            } else if (holder instanceof EnclosureViewHolder) {
+                bindEnclosureView((EnclosureViewHolder) holder, model, position);
             }
         } catch (Exception e) {
             LogUtil.i("gong", position + "  e=" + e.getMessage());
@@ -247,6 +291,26 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
 
     }
 
+    //绑定附件字段
+    private void bindEnclosureView(EnclosureViewHolder holder, BillGroupModel.BillModel model, int position) {
+        if (model != null) {
+            holder.captionTv.setText(model.getCaption());
+            holder.muchInputTv.setVisibility(model.getAllowBlank().equals("T") ? View.GONE : View.VISIBLE);
+            EnclosureAdapter mEnclosureAdapter = null;
+            if (holder.ffGv.getTag(R.id.tag_key) != null && holder.ffGv.getTag(R.id.tag_key) instanceof EnclosureAdapter) {
+                mEnclosureAdapter = (EnclosureAdapter) holder.ffGv.getTag(R.id.tag_key);
+                mEnclosureAdapter.setLocalDatas(model.getLocalDatas());
+                mEnclosureAdapter.setPosition(position);
+            } else {
+                mEnclosureAdapter = new EnclosureAdapter(position, model.getLocalDatas());
+            }
+            holder.ffGv.setAdapter(mEnclosureAdapter);
+            holder.ffGv.setTag(model);
+            holder.ffGv.setTag(R.id.tag_key2, position);
+        }
+    }
+
+
     private void bindAddView(AddViewHolder mAddViewHolder, BillGroupModel.BillModel model, int position) throws Exception {
         if (model != null) {
             mAddViewHolder.addTv.setTag(model.getGroupIndex());
@@ -305,6 +369,18 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
         }
     }
 
+    private AdapterView.OnItemClickListener mOnItemClickListener = new AdapterView.OnItemClickListener() {
+        @Override
+        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
+            if (mOnAdapterListener != null && adapterView.getTag() != null && adapterView.getTag(R.id.tag_key2) != null) {
+                if (adapterView.getTag() instanceof BillGroupModel.BillModel && adapterView.getTag(R.id.tag_key2) instanceof Integer) {
+                    int itemIndex = (int) adapterView.getTag(R.id.tag_key2);
+                    BillGroupModel.BillModel model = (BillGroupModel.BillModel) adapterView.getTag();
+                    mOnAdapterListener.toEnclosureSelect(position);
+                }
+            }
+        }
+    };
     private View.OnClickListener mOnClickListener = new View.OnClickListener() {
         @Override
         public void onClick(View view) {
@@ -338,6 +414,24 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
                     notifyDataSetChanged();
 
                 }
+            } else if (R.id.btn_del == view.getId()) {
+                if (view.getTag(R.id.tag_key) != null && view.getTag(R.id.tag_key2) != null
+                        && view.getTag(R.id.tag_key) instanceof Integer && view.getTag(R.id.tag_key2) instanceof Integer) {
+                    int position = (int) view.getTag(R.id.tag_key2);//当前在主列表的item
+                    int index = (int) view.getTag(R.id.tag_key);//当前在子列表的item
+                    if (position >= 0 && position < ListUtils.getSize(mShowBillModels)
+                            && ListUtils.getSize(mShowBillModels.get(position).getLocalDatas()) > index) {
+                        mShowBillModels.get(position).getLocalDatas().remove(index);
+                        notifyItemChanged(position);
+                    }
+                }
+            } else if (R.id.content == view.getId()) {
+                if (view.getTag(R.id.tag_key2) != null && view.getTag(R.id.tag_key2) instanceof Integer) {
+                    int position = (int) view.getTag(R.id.tag_key2);//当前在主列表的item
+                    if (mOnAdapterListener != null && position >= 0 && position < ListUtils.getSize(mShowBillModels)) {
+                        mOnAdapterListener.toEnclosureSelect(position);
+                    }
+                }
             }
         }
     };
@@ -371,8 +465,8 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
                     public void result(boolean clickSure) {
                         if (clickSure) {
                             if (mBillGroupModels != null && mBillGroupModels.size() > groupIndex && groupIndex >= 0) {
-                                boolean isLastItem=mBillGroupModels.get(groupIndex).isLastInType();
-                                if (isLastItem&&groupIndex - 1 > 0 && !mBillGroupModels.get(groupIndex - 1).isForm()) {
+                                boolean isLastItem = mBillGroupModels.get(groupIndex).isLastInType();
+                                if (isLastItem && groupIndex - 1 > 0 && !mBillGroupModels.get(groupIndex - 1).isForm()) {
                                     mBillGroupModels.get(groupIndex - 1).setLastInType(true);
                                 }
                                 mBillGroupModels.remove(groupIndex);
@@ -388,6 +482,74 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
 
     public interface OnAdapterListener {
         void toSelect(int position, BillGroupModel.BillModel model);
+
+        void toEnclosureSelect(int position);
     }
 
+    private class EnclosureAdapter extends BaseAdapter {
+        private int position;
+        private List<BillGroupModel.LocalData> localDatas;
+
+        public EnclosureAdapter(int position, List<BillGroupModel.LocalData> localDatas) {
+            this.position = position;
+            this.localDatas = localDatas;
+        }
+
+        public void setPosition(int position) {
+            this.position = position;
+        }
+
+        public void setLocalDatas(List<BillGroupModel.LocalData> localDatas) {
+            this.localDatas = localDatas;
+        }
+
+        @Override
+        public int getCount() {
+            return ListUtils.getSize(localDatas) < 9 ? (ListUtils.getSize(localDatas) + 1) : ListUtils.getSize(localDatas);
+        }
+
+        @Override
+        public Object getItem(int i) {
+            return localDatas.get(i);
+        }
+
+        @Override
+        public long getItemId(int i) {
+            return i;
+        }
+
+        @Override
+        public View getView(int i, View view, ViewGroup viewGroup) {
+            view = getLayoutInflater().inflate(R.layout.item_bill_enclosure_item, null);
+            ImageView content = (ImageView) view.findViewById(R.id.content);
+            TextView tvName = (TextView) view.findViewById(R.id.tv_name);
+            Button btnDel = (Button) view.findViewById(R.id.btn_del);
+            if (ListUtils.getSize(localDatas) > i) {
+                BillGroupModel.LocalData data = localDatas.get(i);
+                btnDel.setVisibility(View.VISIBLE);
+                String name = data.value == null ? "" : data.value;
+                tvName.setText(name);
+                btnDel.setTag(R.id.tag_key2, position);
+                btnDel.setTag(R.id.tag_key, i);
+                btnDel.setOnClickListener(mOnClickListener);
+                if (isImage(name)) {
+                    ImageLoaderUtil.getInstance().loadImage(data.display, content);
+                }
+            } else {
+                tvName.setText("");
+                btnDel.setVisibility(View.GONE);
+                content.setImageResource(R.drawable.add_picture);
+
+                content.setTag(R.id.tag_key2, position);
+                content.setOnClickListener(mOnClickListener);
+            }
+            return view;
+        }
+    }
+
+    private boolean isImage(String name) {
+        return name.toUpperCase().endsWith("JPEG")
+                || name.toUpperCase().endsWith("JPG")
+                || name.toUpperCase().endsWith("PNG");
+    }
 }

+ 89 - 0
app_modular/apputils/src/main/java/com/modular/apputils/fragment/ViewPagerLazyFragment.java

@@ -0,0 +1,89 @@
+package com.modular.apputils.fragment;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.core.base.BaseActivity;
+import com.core.base.EasyFragment;
+
+/**
+ * 时间:2017/10/30 17:18
+ * 功能介绍:viewpager 懒加载
+ */
+public abstract class ViewPagerLazyFragment extends EasyFragment {
+
+    private boolean isVisible = false;//当前Fragment是否可见
+    private boolean isInitView = false;//是否与View建立起映射关系
+    private boolean isFirstLoad = true;//是否是第一次加载数据
+
+    @Nullable
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        super.onCreateView(inflater, container, savedInstanceState);
+        if (getmRootView() != null) {
+            if (getmRootView().getParent() != null) {
+                ((ViewGroup) getmRootView().getParent()).removeView(getmRootView());
+            }
+        }
+        isInitView = true;
+        lazyLoadData();
+        return getmRootView();
+    }
+
+
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+    }
+
+    @Override
+    public void setUserVisibleHint(boolean isVisibleToUser) {
+        if (isVisibleToUser) {
+            isVisible = true;
+            lazyLoadData();
+        } else {
+            isVisible = false;
+        }
+        super.setUserVisibleHint(isVisibleToUser);
+    }
+
+    private void lazyLoadData() {
+        if (!isFirstLoad || !isVisible || !isInitView) {
+            onCreateView(null,false);
+        } else {
+            LazyData();
+            isFirstLoad = false;
+        }
+    }
+
+    public void showProgress() {
+        if (ct instanceof BaseActivity && ((BaseActivity) ct).progressDialog != null) {
+            ((BaseActivity) ct).progressDialog.show();
+        }
+    }
+
+    public void dismissProgress() {
+        if (ct instanceof BaseActivity && ((BaseActivity) ct).progressDialog != null && ((BaseActivity) ct).progressDialog.isShowing()) {
+            ((BaseActivity) ct).progressDialog.dismiss();
+        }
+    }
+
+    /**
+     * 加载要显示的数据
+     */
+    protected abstract void LazyData();
+
+
+
+
+    @Override
+    protected void onCreateView(Bundle savedInstanceState, boolean createView) {
+
+    }
+
+}

+ 3 - 12
app_modular/apputils/src/main/java/com/modular/apputils/model/BillGroupModel.java

@@ -24,7 +24,6 @@ public class BillGroupModel {
     private String statusValues;//状态
     private String statusField;//状态字段名称
 
-    private String caller;//caller
 
     private List<BillModel> hideBillFields;//当前组隐藏的字段列表
     private List<BillModel> showBillFields;//当前组显示的字段列表
@@ -57,14 +56,6 @@ public class BillGroupModel {
         return isForm;
     }
 
-    public String getCaller() {
-        return caller;
-    }
-
-    public void setCaller(String caller) {
-        this.caller = caller;
-    }
-
     public void setForm(boolean form) {
         isForm = form;
     }
@@ -294,7 +285,7 @@ public class BillGroupModel {
         }
 
         public String getReadOnly() {
-            return readOnly==null?"":readOnly;
+            return readOnly == null ? "" : readOnly;
         }
 
         public void setReadOnly(String readOnly) {
@@ -362,8 +353,8 @@ public class BillGroupModel {
      * 当C类型时候,本地选择数据
      */
     public static class LocalData {
-        public String value = "";//显示的值
-        public String display = "";//上传的值
+        public String value = "";//显示的值  ||附件时候表示 路径,文件名
+        public String display = "";//上传的值 ||附件时候表示上传的附件id
     }
 
 

+ 1 - 0
app_modular/apputils/src/main/java/com/modular/apputils/model/BillListGroupModel.java

@@ -9,6 +9,7 @@ public class BillListGroupModel {
     private int groupIndex;//当前组所在的整个显示集合里面的索引
     private List<BillListField> billFields;
 
+
     public int getGroupIndex() {
         return groupIndex;
     }

+ 142 - 21
app_modular/apputils/src/main/java/com/modular/apputils/presenter/BillPresenter.java

@@ -12,11 +12,20 @@ import com.common.LogUtil;
 import com.common.data.JSONUtil;
 import com.common.data.ListUtils;
 import com.common.data.StringUtil;
+import com.common.data.TextUtil;
+import com.common.ui.ImageUtil;
 import com.core.app.Constants;
+import com.core.app.MyApplication;
 import com.core.model.SelectBean;
 import com.core.net.http.ViewUtil;
 import com.core.utils.CommonUtil;
 import com.core.widget.view.Activity.SelectActivity;
+import com.lidroid.xutils.HttpUtils;
+import com.lidroid.xutils.exception.HttpException;
+import com.lidroid.xutils.http.RequestParams;
+import com.lidroid.xutils.http.ResponseInfo;
+import com.lidroid.xutils.http.callback.RequestCallBack;
+import com.lidroid.xutils.http.client.HttpRequest;
 import com.me.network.app.http.HttpClient;
 import com.me.network.app.http.rx.Result2Listener;
 import com.me.network.app.http.rx.ResultSubscriber;
@@ -28,6 +37,8 @@ import com.modular.apputils.network.Tags;
 import com.modular.apputils.presenter.imp.IBill;
 import com.modular.apputils.utils.TestDataUtils;
 
+import java.io.File;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -45,6 +56,7 @@ public class BillPresenter extends BaseNetPresenter {
     private IBill iBill;
     private String mCaller;//当前单据的Caller
     private int mId;//当前单据拥有的id,新增默认为0
+    private HashMap<String, String> hashMap;//从外面传进来的默认值
 
     private String detailKeyField;//从表id字段
     private String keyField;//主表id字段
@@ -71,6 +83,10 @@ public class BillPresenter extends BaseNetPresenter {
             mCaller = intent.getStringExtra(Constants.Intents.CALLER);
             String mTitle = intent.getStringExtra(Constants.Intents.TITLE);
             mId = intent.getIntExtra(Constants.Intents.ID, 0);
+            Serializable mSerializable = intent.getSerializableExtra(Constants.Intents.ID);
+            if (mSerializable != null && mSerializable instanceof HashMap) {
+                hashMap = (HashMap<String, String>) mSerializable;
+            }
             if (mTitle != null) {
                 iBill.setTitle(mTitle);
             }
@@ -78,8 +94,57 @@ public class BillPresenter extends BaseNetPresenter {
         loadFormandGridDetail();
     }
 
+    public void saveAndSubmit(List<BillGroupModel.BillModel> formFields, Map<String, List<BillGroupModel.BillModel>> gridBillMap) {
+        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.getValue());
+        }
+
+        List<Map<String, Object>> gridStoreList = new ArrayList<>();
+        for (Map.Entry<String, List<BillGroupModel.BillModel>> e : gridBillMap.entrySet()) {
+            if (!ListUtils.isEmpty(e.getValue())) {
+                Map<String, Object> gridStore = new HashMap<>();
+                for (BillGroupModel.BillModel billModel : e.getValue()) {
+                    if (TextUtils.isEmpty(billModel.getValue())
+                            && ("necessaryField".equals(billModel.getAllowBlank())
+                            || "F".equals(billModel.getAllowBlank())) && billModel.getIsdefault() == -1) {
+                        iBill.showToast(billModel.getField() + "为必填项");
+                        iBill.dimssLoading();
+                        return;
+                    }
+                    if (isEnclosureNeedSubmit(billModel)) {
+                        pushEnclosure(billModel);
+                        return;
+                    }
+                    gridStore.put(billModel.getField(), billModel.getValue());
+                }
+                gridStoreList.add(gridStore);
+            }
+        }
+        if (formStore == null || gridStoreList == null) {
+            iBill.dimssLoading();
+            return;
+        }
+        requestCompanyHttp(new Parameter.Builder()
+                        .url("mobile/oa/commonSaveAndSubmit.action")
+                        .addParams("caller", mCaller)
+                        .addParams("formStore", JSONUtil.map2JSON(formStore))
+                        .addParams("gridStore", JSONUtil.map2JSON(gridStoreList))
+                        .record(SAVE_AND_SUBMIT)
+
+                , mOnSmartHttpListener);
+    }
+
     public void saveAndSubmit(List<BillGroupModel> mGroupModels) {
-        LogUtil.i("gong", JSON.toJSONString(mGroupModels));
         iBill.showLoading();
         List<BillGroupModel.BillModel> formFields = new ArrayList<>();
         Map<String, List<BillGroupModel.BillModel>> gridBillMap = new HashMap<>();
@@ -103,29 +168,14 @@ public class BillPresenter extends BaseNetPresenter {
                 gridBillMap.put(e.getGroup(), gridBillFields);
             }
         }
-        Map<String, Object> formStore = getFormStore(formFields);
-        List<Map<String, Object>> gridStore = getGridStore(gridBillMap);
-        LogUtil.i("gong", "formStore=" + JSON.toJSONString(formStore));
-        LogUtil.i("gong", "gridStore=" + JSON.toJSONString(gridStore));
-        if (formStore == null || gridStore == null){
-            iBill.dimssLoading();
-            return;
-        }
-
-        requestCompanyHttp(new Parameter.Builder()
-                        .url("mobile/oa/commonSaveAndSubmit.action")
-                        .addParams("caller", mCaller)
-                        .addParams("formStore", JSONUtil.map2JSON(formStore))
-                        .addParams("gridStore", JSONUtil.map2JSON(gridStore))
-                        .record(SAVE_AND_SUBMIT)
-
-                , mOnSmartHttpListener);
+        saveAndSubmit(formFields, gridBillMap);
     }
 
+
     private Map<String, Object> getFormStore(List<BillGroupModel.BillModel> formFields) {
         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()))) {
+            if (TextUtils.isEmpty(e.getValue()) && e.getIsdefault() == -1 && ("necessaryField".equals(e.getAllowBlank()) || "F".equals(e.getAllowBlank()))) {
                 iBill.showToast(e.getCaption() + "为必填项");
                 return null;
             }
@@ -142,7 +192,7 @@ public class BillPresenter extends BaseNetPresenter {
                 for (BillGroupModel.BillModel billModel : e.getValue()) {
                     if (TextUtils.isEmpty(billModel.getValue())
                             && ("necessaryField".equals(billModel.getAllowBlank())
-                            || "F".equals(billModel.getAllowBlank()))&&billModel.getIsdefault()==-1) {
+                            || "F".equals(billModel.getAllowBlank())) && billModel.getIsdefault() == -1) {
                         iBill.showToast(billModel.getField() + "为必填项");
                         return null;
                     }
@@ -154,6 +204,64 @@ public class BillPresenter extends BaseNetPresenter {
         return gridStoreList;
     }
 
+    private void pushEnclosure(BillGroupModel.BillModel mBillModel) {
+        mBillModel.setLength(0);
+        uploadFile(mBillModel);
+    }
+
+    //上传文件
+    private void uploadFile(final BillGroupModel.BillModel mBillModel) {
+        String path = null;
+        if (mBillModel.getLength() < ListUtils.getSize(mBillModel.getLocalDatas())) {
+            //没有上传完成
+            BillGroupModel.LocalData data = mBillModel.getLocalDatas().get(mBillModel.getLength());
+            path = data.display;
+        } else {
+            iBill.showToast("开始上传完成=" + mBillModel.getLength());
+            iBill.updateFileOk();
+            return;
+        }
+        iBill.showToast("开始上传附件!!");
+        File mFile = new File(path);
+        RequestParams params = new RequestParams();
+        params.addQueryStringParameter("master", CommonUtil.getSharedPreferences(ct, "erp_master"));
+        params.addHeader("Cookie", "JSESSIONID=" + CommonUtil.getSharedPreferences(ct, "sessionId"));
+        params.addBodyParameter("em_code", CommonUtil.getSharedPreferences(ct, "erp_username"));
+        params.addBodyParameter("type", "common");
+        params.addBodyParameter("file", mFile);
+        String url = CommonUtil.getAppBaseUrl(ct) + "mobile/uploadAttachs.action";
+        final HttpUtils http = new HttpUtils();
+        http.send(HttpRequest.HttpMethod.POST, url, params, new RequestCallBack<String>() {
+            @Override
+            public void onStart() {
+            }
+
+            @Override
+            public void onLoading(long total, long current, boolean isUploading) {
+            }
+
+            @Override
+            public void onSuccess(ResponseInfo<String> responseInfo) {
+                String result = responseInfo.result;
+                LogUtil.i("gong", "result-" + result);
+                if (JSONUtil.validate(result) && JSON.parseObject(result).getBoolean("success")) {
+                    mBillModel.setLength(mBillModel.getLength() + 1);
+                    JSONObject resultObject = JSON.parseObject(result);
+                    String phoneId = JSONUtil.getText(resultObject, "id");
+                    mBillModel.setValue(mBillModel.getValue() + "" + StringUtil.getLastBracket(phoneId) + ";");
+                    uploadFile(mBillModel);
+                }
+            }
+
+            @Override
+            public void onFailure(HttpException error, String msg) {
+                iBill.showToast("附件上传失败");
+            }
+        });
+
+    }
+
+
     private void loadFormandGridDetail() {
         iBill.showLoading();
         requestCompanyHttp(new Parameter.Builder()
@@ -232,6 +340,14 @@ public class BillPresenter extends BaseNetPresenter {
         @Override
         public void onFailure(int what, String message, Tags tag) throws Exception {
             iBill.dimssLoading();
+            if (JSONUtil.validateJSONObject(message)) {
+                iBill.showToast(JSONUtil.getText(message, "exceptionInfo"));
+            } else {
+                iBill.showToast(message);
+            }
+            if (message.contains("该任务已经被接管,或该任务不存在!") && what == SELECT_APPROVAL) {
+                iBill.commitSuccess();
+            }
         }
     };
 
@@ -391,7 +507,9 @@ public class BillPresenter extends BaseNetPresenter {
         String defValue = JSONUtil.getText(object, "fd_defaultvalue");//默认值
         String allowBlank = JSONUtil.getText(object, "fd_allowblank");//是否允许为空(注:当作为标题的时候T:表示可以删除 F:表示不可删除)
         String findFunctionName = JSONUtil.getText(object, "dg_findfunctionname");
-
+        if (TextUtils.isEmpty(defValue) && hashMap != null && hashMap.containsKey(field)) {
+            defValue = hashMap.get(field);
+        }
         JSONArray combostore = JSONUtil.getJSONArray(object, "COMBOSTORE");
         if (!ListUtils.isEmpty(combostore)) {
             List<BillGroupModel.LocalData> localDatas = new ArrayList<>();
@@ -425,4 +543,7 @@ public class BillPresenter extends BaseNetPresenter {
     }
 
 
+    public boolean isEnclosureNeedSubmit(BillGroupModel.BillModel billModel) {
+        return billModel.getType().equals("FF") && TextUtils.isEmpty(billModel.getValue()) && !ListUtils.isEmpty(billModel.getLocalDatas());
+    }
 }

+ 2 - 0
app_modular/apputils/src/main/java/com/modular/apputils/presenter/imp/IBill.java

@@ -15,4 +15,6 @@ public interface IBill extends HttpImp{
     void commitSuccess();//提交成功
 
     void startActivityForResult(Intent intent, int requestCode);
+
+    void updateFileOk();
 }

+ 2 - 0
app_modular/apputils/src/main/java/com/modular/apputils/utils/BillTypeChangeUtils.java

@@ -30,6 +30,8 @@ public class BillTypeChangeUtils {
             case "S":
             case "SS":
                 return 1;
+            case "FF":
+                return 2;
             default:
                 return 1;
         }

+ 93 - 0
app_modular/apputils/src/main/java/com/modular/apputils/utils/UUHttpHelper.java

@@ -0,0 +1,93 @@
+package com.modular.apputils.utils;
+
+import com.common.LogUtil;
+import com.common.data.StringUtil;
+import com.core.app.MyApplication;
+import com.core.utils.CommonUtil;
+import com.me.network.app.http.HttpClient;
+import com.me.network.app.http.rx.Result2Listener;
+import com.me.network.app.http.rx.ResultSubscriber;
+import com.modular.apputils.listener.OnSmartHttpListener;
+import com.modular.apputils.network.Parameter;
+import com.modular.apputils.network.Tags;
+
+/**
+ * 便捷的网络封装
+ */
+public class UUHttpHelper {
+    private HttpClient mHttpClient;
+
+    public UUHttpHelper(String baseUrl) {
+        initHttpConfig(baseUrl);
+    }
+
+    private void initHttpConfig(String baseUrl) {
+        if (!StringUtil.isEmpty(baseUrl)) {
+            mHttpClient = new HttpClient.Builder(baseUrl).isDebug(true)
+                    .connectTimeout(5000)
+                    .readTimeout(5000).build();
+        }
+    }
+
+    public void requestHttp(Parameter.Builder builder, final OnSmartHttpListener onHttpListener) {
+        if (mHttpClient != null && builder != null) {
+            HttpClient.Builder httpBuilder = new HttpClient.Builder();
+            final Parameter parameter = builder.builder();
+            httpBuilder.addParams(parameter.getParams())
+                    .addHeaders(parameter.getHeaders())
+                    .method(parameter.getMode())
+                    .url(parameter.getUrl())
+                    .isDebug(false);
+            HttpClient mRequest = httpBuilder.build();
+            mHttpClient.Api().send(mRequest, new ResultSubscriber<>(new Result2Listener<Object>() {
+                @Override
+                public void onResponse(Object o) {
+                    if (onHttpListener != null) try {
+                        Tags tags = parameter.getTag();
+                        int record = 0;
+                        if (tags != null) {
+                            record = tags.getRecord();
+                        }
+                        String message = o.toString();
+                        onHttpListener.onSuccess(record, message, tags);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+
+                @Override
+                public void onFailure(Object t) {
+                    if (onHttpListener != null) try {
+                        Tags tags = parameter.getTag();
+                        int record = 0;
+                        if (tags != null) {
+                            record = tags.getRecord();
+                        }
+                        String message = t.toString();
+                        if (parameter.showLog()) {
+                            LogUtil.prinlnLongMsg("SmartHttp", "onFailure=" + message);
+                        }
+                        onHttpListener.onFailure(record, message, tags);
+                    } catch (Exception e) {
+                        LogUtil.i("oooo=" + e.getMessage());
+                        e.printStackTrace();
+                    }
+                }
+            }));
+        }
+    }
+
+    public void requestCompanyHttp(Parameter.Builder builder, final OnSmartHttpListener onHttpListener) {
+        if (builder != null) {
+            String sessionId = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "sessionId");
+            String emCode = CommonUtil.getEmcode();
+            builder.addSuperParams("sessionId", sessionId);
+            builder.addSuperParams("master", CommonUtil.getMaster());
+            builder.addSuperParams("sessionUser", emCode);
+            builder.addSuperHeaders("sessionUser", emCode);
+            builder.addSuperHeaders("Cookie", "JSESSIONID=" + sessionId);
+            requestHttp(builder, onHttpListener);
+        }
+    }
+
+}

BIN
app_modular/apputils/src/main/res/drawable-hdpi/ic_bill_file.png


BIN
app_modular/apputils/src/main/res/drawable-xhdpi/ic_bill_file.png


BIN
app_modular/apputils/src/main/res/drawable-xxhdpi/ic_bill_file.png


+ 1 - 0
app_modular/apputils/src/main/res/layout/activity_bill_input.xml

@@ -8,5 +8,6 @@
     <android.support.v7.widget.RecyclerView
         android:id="@+id/mRecyclerView"
         android:layout_width="match_parent"
+        android:layout_marginBottom="@dimen/padding"
         android:layout_height="match_parent"/>
 </RelativeLayout>

+ 40 - 0
app_modular/apputils/src/main/res/layout/item_bill_enclosure.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@color/white"
+    android:minHeight="50dp"
+    android:padding="@dimen/padding">
+
+
+    <TextView
+        android:id="@+id/captionTv"
+        android:layout_width="60dp"
+        android:layout_height="wrap_content"
+        android:text="商机阶段"
+        android:textColor="@color/text_hine"
+        android:textSize="@dimen/text_hine"
+        app:layout_constraintLeft_toLeftOf="parent" />
+
+
+    <TextView
+        android:id="@+id/muchInputTv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="3dp"
+        android:gravity="top"
+        android:text="*"
+        android:textColor="@color/red"
+        android:textSize="15sp"
+        android:visibility="visible"
+        app:layout_constraintLeft_toRightOf="@id/captionTv"
+        app:layout_constraintTop_toTopOf="@id/captionTv" />
+
+    <com.core.widget.view.MyGridView
+        android:id="@+id/ffGv"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:numColumns="3"
+        app:layout_constraintTop_toBottomOf="@id/captionTv" />
+</android.support.constraint.ConstraintLayout>

+ 43 - 0
app_modular/apputils/src/main/res/layout/item_bill_enclosure_item.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@android:color/transparent">
+
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@+id/content"
+            android:layout_width="60dp"
+            android:layout_height="60dp"
+            android:layout_centerHorizontal="true"
+            android:layout_gravity="center"
+            android:src="@drawable/ic_bill_file" />
+
+        <TextView
+            android:id="@+id/tv_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/content"
+            android:layout_marginTop="2dp"
+            android:ellipsize="end"
+            android:gravity="center_horizontal"
+            android:inputType="text"
+            android:lines="1"
+            android:textColor="@color/text_hine"
+            android:textSize="10sp" />
+    </LinearLayout>
+
+    <Button
+        android:id="@+id/btn_del"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        android:layout_gravity="top|center_horizontal"
+        android:layout_marginRight="30dp"
+        android:layout_toLeftOf="@id/content"
+        android:background="@drawable/bg_item_del" />
+</FrameLayout>

+ 6 - 0
app_modular/apputils/src/main/res/menu/menu_bill_input.xml

@@ -6,4 +6,10 @@
         android:id="@+id/saveAndSubmit"
         android:title="提交"
         app:showAsAction="always" />
+    <item
+        android:id="@+id/list"
+        android:icon="@drawable/xlist"
+        android:title="查看列表"
+        app:showAsAction="always" />
+
 </menu>

+ 3 - 1
app_modular/appworks/src/main/AndroidManifest.xml

@@ -496,9 +496,11 @@
         <activity android:name=".crm3_0.activity.CustomerVisitActivity"
             android:label="@string/crm_customer_visit"/>
         <activity android:name=".crm3_0.activity.CustomerListActivity"
-            android:label="@string/crm_customer_visit"/>
+            android:label="客户列表"/>
         <activity android:name=".crm3_0.activity.ContactsListActivity"></activity>
         <activity android:name=".crm3_0.activity.CustomerManageActivity"></activity>
+        <activity android:name=".crm3_0.activity.CustomerBillInputActivity"></activity>
+        <activity android:name=".crm3_0.activity.CustomerDetails3_0Activity"></activity>
 
 
         <!-- 商机管理 -->

+ 108 - 0
app_modular/appworks/src/main/java/com/uas/appworks/adapter/BillListAdapter.java

@@ -0,0 +1,108 @@
+package com.uas.appworks.adapter;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.common.data.ListUtils;
+import com.modular.apputils.model.BillListGroupModel;
+import com.uas.appworks.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BillListAdapter extends RecyclerView.Adapter<BillListAdapter.ViewHolder> {
+    private Context ct;
+    private List<BillListGroupModel> groupModels;
+    private List<BillListGroupModel.BillListField> listFields;
+    private OnAdapterListener mOnAdapterListener;
+
+    public BillListAdapter(Context ct, List<BillListGroupModel> groupModels, OnAdapterListener mOnAdapterListener) {
+        this.ct = ct;
+        this.groupModels = groupModels;
+        this.mOnAdapterListener = mOnAdapterListener;
+        changeFieldsList();
+    }
+
+    public void updateGroupModels(List<BillListGroupModel> groupModels) {
+        this.groupModels = groupModels;
+        changeFieldsList();
+    }
+
+    public List<BillListGroupModel> getGroupModels() {
+        return groupModels;
+    }
+
+    private void changeFieldsList() {
+        if (listFields == null) {
+            listFields = new ArrayList<>();
+        } else {
+            listFields.clear();
+        }
+        if (ListUtils.isEmpty(groupModels)) return;
+        for (BillListGroupModel groupModel : groupModels) {
+            if (!ListUtils.isEmpty(groupModel.getBillFields())) {
+                listFields.addAll(groupModel.getBillFields());
+            }
+        }
+    }
+
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) {
+        return new ViewHolder(LayoutInflater.from(ct).inflate(R.layout.item_customer_list_details_list, viewGroup, false));
+    }
+
+    @Override
+    public int getItemCount() {
+        int mItemCount = ListUtils.getSize(listFields);
+        return mItemCount;
+    }
+
+    class ViewHolder extends RecyclerView.ViewHolder {
+        private TextView captionTV;
+        private TextView valueTv;
+        private View lineView;
+
+        public ViewHolder(View itemView) {
+            super(itemView);
+            captionTV = (TextView) itemView.findViewById(R.id.captionTV);
+            valueTv = (TextView) itemView.findViewById(R.id.valueTv);
+            lineView = itemView.findViewById(R.id.lineView);
+            lineView.setVisibility(View.GONE);
+        }
+    }
+
+
+    @Override
+    public void onBindViewHolder(ViewHolder mViewHolder, int position) {
+        BillListGroupModel.BillListField field = listFields.get(position);
+        mViewHolder.captionTV.setText(field.getCaption());
+        mViewHolder.valueTv.setText(field.getValue());
+        if (field.getGroupIndex() != 0 && position >= 1 && field.getGroupIndex() > listFields.get(position - 1).getGroupIndex()) {
+            mViewHolder.lineView.setVisibility(View.VISIBLE);
+        } else {
+            mViewHolder.lineView.setVisibility(View.GONE);
+        }
+        mViewHolder.itemView.setTag(field);
+        mViewHolder.itemView.setOnClickListener(mOnClickListener);
+    }
+
+    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View view) {
+            if (view.getTag() != null && view.getTag() instanceof BillListGroupModel.BillListField) {
+                if (mOnAdapterListener != null) {
+                    mOnAdapterListener.onClick((BillListGroupModel.BillListField) view.getTag());
+                }
+            }
+        }
+    };
+
+    public interface OnAdapterListener {
+        void onClick(BillListGroupModel.BillListField field);
+    }
+}

+ 571 - 0
app_modular/appworks/src/main/java/com/uas/appworks/adapter/CustomerBillInputAdapter.java

@@ -0,0 +1,571 @@
+package com.uas.appworks.adapter;
+
+import android.content.Context;
+import android.support.annotation.LayoutRes;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.common.LogUtil;
+import com.common.data.ListUtils;
+import com.core.widget.listener.EditChangeListener;
+import com.core.widget.view.MyGridView;
+import com.core.widget.view.SwitchView;
+import com.me.imageloader.ImageLoaderUtil;
+import com.modular.apputils.model.BillGroupModel;
+import com.modular.apputils.utils.BillTypeChangeUtils;
+import com.modular.apputils.widget.VeriftyDialog;
+import com.uas.appworks.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CustomerBillInputAdapter extends RecyclerView.Adapter<CustomerBillInputAdapter.BaseViewHolder> {
+
+    private Context ct;
+    private List<BillGroupModel> mBillGroupModels;
+    private List<BillGroupModel.BillModel> mShowBillModels;
+    private CustomerBillInputAdapter.OnAdapterListener mOnAdapterListener;
+    private boolean addContact = true;//保存后继续新增联系人
+
+    public CustomerBillInputAdapter(Context ct, List<BillGroupModel> mBillGroupModels, CustomerBillInputAdapter.OnAdapterListener mOnAdapterListener) {
+        this.ct = ct;
+        this.mBillGroupModels = mBillGroupModels;
+        this.mOnAdapterListener = mOnAdapterListener;
+        changeBillModel();
+    }
+
+    public boolean isAddContact() {
+        return addContact;
+    }
+
+    public void updateBillModelValues(int position, String values, String display) {
+        if (position >= 0 && position < ListUtils.getSize(mShowBillModels)) {
+            mShowBillModels.get(position).setValue(values);
+            mShowBillModels.get(position).setDisplay(display);
+            notifyItemChanged(position);
+        }
+    }
+
+    public void addBillModelData(int position, String values, String display) {
+        if (position >= 0 && position < ListUtils.getSize(mShowBillModels)) {
+            if (mShowBillModels.get(position).getLocalDatas() == null) {
+                mShowBillModels.get(position).setLocalDatas(new ArrayList<BillGroupModel.LocalData>());
+            }
+            BillGroupModel.LocalData data = new BillGroupModel.LocalData();
+            data.value = values;
+            data.display = display;
+            mShowBillModels.get(position).getLocalDatas().add(data);
+            notifyItemChanged(position);
+        }
+    }
+
+    public void setBillGroupModels(List<BillGroupModel> mBillGroupModels) {
+        this.mBillGroupModels = mBillGroupModels;
+        changeBillModel();
+    }
+
+    /**
+     * 当外界的因素引起mBillGroupModels变化时候,通过遍历将mBillGroupModels转成mShowBillModels进行显示
+     */
+    private void changeBillModel() {
+        if (mShowBillModels == null) {
+            mShowBillModels = new ArrayList<>();
+        } else {
+            mShowBillModels.clear();
+        }
+        for (int i = 0; i < mBillGroupModels.size(); i++) {
+            BillGroupModel e = mBillGroupModels.get(i);
+            if (e != null && 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());
+                if (!e.isForm() && e.isLastInType()) {
+                    mShowBillModels.add(getAddModel(i));
+                }
+            }
+        }
+    }
+
+    private BillGroupModel.BillModel getAddModel(int index) {
+        BillGroupModel.BillModel mTitleBillModel = new BillGroupModel.BillModel();
+        mTitleBillModel.setGroupIndex(index);
+        mTitleBillModel.setType(BillGroupModel.Constants.TYPE_ADD);
+        mTitleBillModel.setCaption("添加单据");
+        return mTitleBillModel;
+    }
+
+    public List<BillGroupModel> getBillGroupModels() {
+        return mBillGroupModels;
+    }
+
+    public BillGroupModel getBillGroupModel(int position) {
+        if (position >= 0 && ListUtils.getSize(mBillGroupModels) > position) {
+            return mBillGroupModels.get(position);
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        if (mShowBillModels != null && mShowBillModels.size() > position) {
+            return BillTypeChangeUtils.getItemViewType(mShowBillModels.get(position).getType());
+        } else {
+            return 220;
+        }
+    }
+
+    @NonNull
+    @Override
+    public CustomerBillInputAdapter.BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        CustomerBillInputAdapter.BaseViewHolder viewHolder = null;
+        switch (viewType) {
+            case 0:
+                viewHolder = new CustomerBillInputAdapter.TitleViewHolder(parent, R.layout.item_bill_title);
+                break;
+            case 1:
+                viewHolder = new CustomerBillInputAdapter.InputViewHolder(parent, R.layout.item_bill_input_select);
+                break;
+            case 2:
+                viewHolder = new CustomerBillInputAdapter.EnclosureViewHolder(parent, R.layout.item_bill_enclosure);
+                break;//附件类型
+            case 110:
+                viewHolder = new CustomerBillInputAdapter.AddViewHolder(parent, R.layout.item_bill_add);
+                break;
+            case 220://个性化添加是否保存后继续添加联系人
+                viewHolder = new CustomerBillInputAdapter.AddcontentViewHolder(parent, R.layout.item_customer_bill_add_contact);
+
+                break;
+            default:
+                viewHolder = new CustomerBillInputAdapter.BaseViewHolder(parent, R.layout.item_bill_title) {
+                    @Override
+                    void initView(View view) {
+
+                    }
+                };
+        }
+        return viewHolder;
+    }
+
+
+    @Override
+    public int getItemCount() {
+        return mShowBillModels == null ? 1 : mShowBillModels.size()+1;
+    }
+
+
+    private LayoutInflater mLayoutInflater;
+
+    public LayoutInflater getLayoutInflater() {
+        if (mLayoutInflater == null) {
+            mLayoutInflater = LayoutInflater.from(ct);
+        }
+        return mLayoutInflater;
+    }
+
+    abstract class BaseViewHolder extends RecyclerView.ViewHolder {
+
+        public BaseViewHolder(ViewGroup parent, @LayoutRes int layoutId) {
+            this(getLayoutInflater().inflate(layoutId, parent, false));
+        }
+
+        abstract void initView(View view);
+
+        public BaseViewHolder(View itemView) {
+            super(itemView);
+            initView(itemView);
+        }
+    }
+
+
+    class AddcontentViewHolder extends CustomerBillInputAdapter.BaseViewHolder {
+        private SwitchView saveContactSv;
+
+        public AddcontentViewHolder(ViewGroup parent, int layoutId) {
+            super(parent, layoutId);
+        }
+
+        @Override
+        void initView(View view) {
+            saveContactSv = (SwitchView) view.findViewById(R.id.saveContactSv);
+        }
+    }
+
+    class AddViewHolder extends CustomerBillInputAdapter.BaseViewHolder {
+        private TextView addTv;
+
+        public AddViewHolder(ViewGroup parent, int layoutId) {
+            super(parent, layoutId);
+        }
+
+        @Override
+        void initView(View view) {
+            addTv = (TextView) view.findViewById(R.id.addTv);
+        }
+    }
+
+    //选择和输入类型
+    class InputViewHolder extends CustomerBillInputAdapter.BaseViewHolder {
+        private TextView captionTv;
+        private TextView muchInputTv;
+        private ImageView selectIv;
+        private EditText valuesEd;
+
+        public InputViewHolder(ViewGroup parent, int layoutId) {
+            super(parent, layoutId);
+        }
+
+        @Override
+        void initView(View itemView) {
+            captionTv = (TextView) itemView.findViewById(R.id.captionTv);
+            muchInputTv = (TextView) itemView.findViewById(R.id.muchInputTv);
+            selectIv = (ImageView) itemView.findViewById(R.id.selectIv);
+            valuesEd = (EditText) itemView.findViewById(R.id.valuesEd);
+        }
+    }
+
+    //附件类型
+    class EnclosureViewHolder extends CustomerBillInputAdapter.BaseViewHolder {
+        private TextView captionTv;
+        private TextView muchInputTv;
+        private MyGridView ffGv;
+
+        public EnclosureViewHolder(ViewGroup parent, int layoutId) {
+            super(parent, layoutId);
+        }
+
+        @Override
+        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);
+        }
+    }
+
+    class TitleViewHolder extends CustomerBillInputAdapter.BaseViewHolder {
+        private TextView tvTitle;
+        private TextView deleteTv;
+
+        public TitleViewHolder(ViewGroup parent, int layoutId) {
+            super(parent, layoutId);
+        }
+
+        @Override
+        void initView(View view) {
+            tvTitle = (TextView) view.findViewById(R.id.tv_title);
+            deleteTv = (TextView) view.findViewById(R.id.deleteTv);
+        }
+
+    }
+
+
+    @Override
+    public void onBindViewHolder(@NonNull CustomerBillInputAdapter.BaseViewHolder holder, int position) {
+        BillGroupModel.BillModel model = null;
+        if (mShowBillModels != null && mShowBillModels.size() > position) {
+            model = mShowBillModels.get(position);
+        }
+        try {
+            if (holder instanceof CustomerBillInputAdapter.InputViewHolder) {
+                bindInputView((CustomerBillInputAdapter.InputViewHolder) holder, model, position);
+            } else if (holder instanceof CustomerBillInputAdapter.TitleViewHolder) {
+                bindTitleView((CustomerBillInputAdapter.TitleViewHolder) holder, model, position);
+            } else if (holder instanceof CustomerBillInputAdapter.AddViewHolder) {
+                bindAddView((CustomerBillInputAdapter.AddViewHolder) holder, model, position);
+            } else if (holder instanceof CustomerBillInputAdapter.EnclosureViewHolder) {
+                bindEnclosureView((CustomerBillInputAdapter.EnclosureViewHolder) holder, model, position);
+            } else if (holder instanceof AddcontentViewHolder) {
+                bindAddContentView((AddcontentViewHolder) holder, model, position);
+            }
+        } catch (Exception e) {
+            LogUtil.i("gong", position + "  e=" + e.getMessage());
+        }
+
+    }
+
+    private void bindAddContentView(AddcontentViewHolder holder, BillGroupModel.BillModel model, int position) {
+        holder.saveContactSv.setOnCheckedChangeListener(new SwitchView.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(View view, boolean isChecked) {
+                addContact = isChecked;
+            }
+        });
+    }
+
+    //绑定附件字段
+    private void bindEnclosureView(CustomerBillInputAdapter.EnclosureViewHolder holder, BillGroupModel.BillModel model, int position) {
+        if (model != null) {
+            holder.captionTv.setText(model.getCaption());
+            holder.muchInputTv.setVisibility(model.getAllowBlank().equals("T") ? View.GONE : View.VISIBLE);
+            CustomerBillInputAdapter.EnclosureAdapter mEnclosureAdapter = null;
+            if (holder.ffGv.getTag(R.id.tag_key) != null && holder.ffGv.getTag(R.id.tag_key) instanceof CustomerBillInputAdapter.EnclosureAdapter) {
+                mEnclosureAdapter = (CustomerBillInputAdapter.EnclosureAdapter) holder.ffGv.getTag(R.id.tag_key);
+                mEnclosureAdapter.setLocalDatas(model.getLocalDatas());
+                mEnclosureAdapter.setPosition(position);
+            } else {
+                mEnclosureAdapter = new CustomerBillInputAdapter.EnclosureAdapter(position, model.getLocalDatas());
+            }
+            holder.ffGv.setAdapter(mEnclosureAdapter);
+            holder.ffGv.setTag(model);
+            holder.ffGv.setTag(R.id.tag_key2, position);
+        }
+    }
+
+
+    private void bindAddView(CustomerBillInputAdapter.AddViewHolder mAddViewHolder, BillGroupModel.BillModel model, int position) throws Exception {
+        if (model != null) {
+            mAddViewHolder.addTv.setTag(model.getGroupIndex());
+            mAddViewHolder.addTv.setOnClickListener(mOnClickListener);
+        }
+    }
+
+    private void bindInputView(CustomerBillInputAdapter.InputViewHolder mInputViewHolder, BillGroupModel.BillModel model, int position) throws Exception {
+        if (model != null) {
+            if (mInputViewHolder.valuesEd.getTag() != null && mInputViewHolder.valuesEd.getTag() instanceof CustomerBillInputAdapter.TextChangListener) {
+                mInputViewHolder.valuesEd.removeTextChangedListener((CustomerBillInputAdapter.TextChangListener) mInputViewHolder.valuesEd.getTag());
+            }
+            mInputViewHolder.captionTv.setText(model.getCaption());
+            mInputViewHolder.muchInputTv.setVisibility(model.getAllowBlank().equals("T") ? View.GONE : View.VISIBLE);
+            mInputViewHolder.valuesEd.setText(model.getValue());
+            if (model.getReadOnly().equals("T")) {
+                mInputViewHolder.valuesEd.setFocusable(false);
+                mInputViewHolder.valuesEd.setClickable(true);
+                mInputViewHolder.valuesEd.setOnClickListener(null);
+            } else if (BillTypeChangeUtils.isSelect(model.getType())) {
+                //选择类型
+                mInputViewHolder.valuesEd.setHint("请选择");
+                mInputViewHolder.valuesEd.setFocusable(false);
+                mInputViewHolder.valuesEd.setClickable(true);
+                mInputViewHolder.selectIv.setVisibility(View.VISIBLE);
+                mInputViewHolder.valuesEd.setTag(R.id.tag, position);
+                mInputViewHolder.valuesEd.setTag(R.id.tag2, model);
+                mInputViewHolder.valuesEd.setOnClickListener(mOnClickListener);
+            } else {
+                //输入类型
+                mInputViewHolder.valuesEd.setHint("请输入");
+                mInputViewHolder.selectIv.setVisibility(View.GONE);
+                mInputViewHolder.valuesEd.setFocusable(true);
+                mInputViewHolder.valuesEd.setClickable(false);
+                mInputViewHolder.valuesEd.setFocusableInTouchMode(true);
+                CustomerBillInputAdapter.TextChangListener mTextChangListener = new CustomerBillInputAdapter.TextChangListener(mInputViewHolder.valuesEd, position);
+                mInputViewHolder.valuesEd.setTag(mTextChangListener);
+                mInputViewHolder.valuesEd.addTextChangedListener(mTextChangListener);
+                mInputViewHolder.valuesEd.setOnClickListener(null);
+            }
+
+        }
+    }
+
+    private void bindTitleView(CustomerBillInputAdapter.TitleViewHolder mTitleViewHolder, BillGroupModel.BillModel model, int position) throws Exception {
+        if (model != null) {
+            if (model.getAllowBlank().equals("T")) {
+                mTitleViewHolder.deleteTv.setVisibility(View.VISIBLE);
+                mTitleViewHolder.deleteTv.setTag(model.getGroupIndex());
+                mTitleViewHolder.deleteTv.setOnClickListener(mOnClickListener);
+            } else {
+                mTitleViewHolder.deleteTv.setVisibility(View.GONE);
+                mTitleViewHolder.deleteTv.setOnClickListener(null);
+            }
+            mTitleViewHolder.tvTitle.setText(model.getCaption());
+        }
+    }
+
+    private AdapterView.OnItemClickListener mOnItemClickListener = new AdapterView.OnItemClickListener() {
+        @Override
+        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
+            if (mOnAdapterListener != null && adapterView.getTag() != null && adapterView.getTag(R.id.tag_key2) != null) {
+                if (adapterView.getTag() instanceof BillGroupModel.BillModel && adapterView.getTag(R.id.tag_key2) instanceof Integer) {
+                    int itemIndex = (int) adapterView.getTag(R.id.tag_key2);
+                    BillGroupModel.BillModel model = (BillGroupModel.BillModel) adapterView.getTag();
+                    mOnAdapterListener.toEnclosureSelect(position);
+                }
+            }
+        }
+    };
+    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View view) {
+            if (view.getId() == R.id.deleteTv) {
+                if (view.getTag() != null && view.getTag() instanceof Integer) {
+                    showDeleteGroup((Integer) view.getTag());
+                }
+            } else if (view.getId() == R.id.valuesEd) {
+                if (mOnAdapterListener != null) {
+                    if (view.getTag(R.id.tag2) != null && view.getTag(R.id.tag2) instanceof BillGroupModel.BillModel) {
+                        int position = view.getTag(R.id.tag) != null && view.getTag(R.id.tag) instanceof Integer ? ((int) view.getTag(R.id.tag)) : 0;
+                        mOnAdapterListener.toSelect(position, (BillGroupModel.BillModel) view.getTag(R.id.tag2));
+                    }
+                }
+
+            } else if (view.getId() == R.id.addTv) {
+                if (view.getTag() != null && view.getTag() instanceof Integer) {
+                    int groupIndex = (int) view.getTag();
+                    BillGroupModel mBillGroupModel = mBillGroupModels.get(groupIndex);
+                    mBillGroupModel.setLastInType(false);
+                    BillGroupModel newBillGroupModel = new BillGroupModel();
+                    newBillGroupModel.setForm(mBillGroupModel.isForm());
+                    newBillGroupModel.setGroup(mBillGroupModel.getGroup());
+                    newBillGroupModel.setDeleteAble(true);
+                    newBillGroupModel.setLastInType(true);
+                    for (BillGroupModel.BillModel e : mBillGroupModel.getShowBillFields()) {
+                        newBillGroupModel.addShow(new BillGroupModel.BillModel(e));
+                    }
+                    mBillGroupModels.add(groupIndex + 1, newBillGroupModel);
+                    setBillGroupModels(mBillGroupModels);
+                    notifyDataSetChanged();
+
+                }
+            } else if (R.id.btn_del == view.getId()) {
+                if (view.getTag(R.id.tag_key) != null && view.getTag(R.id.tag_key2) != null
+                        && view.getTag(R.id.tag_key) instanceof Integer && view.getTag(R.id.tag_key2) instanceof Integer) {
+                    int position = (int) view.getTag(R.id.tag_key2);//当前在主列表的item
+                    int index = (int) view.getTag(R.id.tag_key);//当前在子列表的item
+                    if (position >= 0 && position < ListUtils.getSize(mShowBillModels)
+                            && ListUtils.getSize(mShowBillModels.get(position).getLocalDatas()) > index) {
+                        mShowBillModels.get(position).getLocalDatas().remove(index);
+                        notifyItemChanged(position);
+                    }
+                }
+            } else if (R.id.content == view.getId()) {
+                if (view.getTag(R.id.tag_key2) != null && view.getTag(R.id.tag_key2) instanceof Integer) {
+                    int position = (int) view.getTag(R.id.tag_key2);//当前在主列表的item
+                    if (mOnAdapterListener != null && position >= 0 && position < ListUtils.getSize(mShowBillModels)) {
+                        mOnAdapterListener.toEnclosureSelect(position);
+                    }
+                }
+            }
+        }
+    };
+
+
+    private class TextChangListener extends EditChangeListener {
+        EditText ed;
+        private int position;
+
+        public TextChangListener(EditText ed, int position) {
+            this.ed = ed;
+            this.position = position;
+        }
+
+        @Override
+        public void afterTextChanged(Editable s) {
+            if (this.position >= 0 && mShowBillModels != null && mShowBillModels.size() > this.position && ed != null) {
+                String valueEt = ed.getText().toString();
+                mShowBillModels.get(this.position).setValue(valueEt == null ? "" : valueEt);
+            }
+        }
+    }
+
+
+    private void showDeleteGroup(final int groupIndex) {
+        new VeriftyDialog.Builder(ct)
+                .setTitle(ct.getString(R.string.app_name))
+                .setContent("是否确认删除该单据?")
+                .build(new VeriftyDialog.OnDialogClickListener() {
+                    @Override
+                    public void result(boolean clickSure) {
+                        if (clickSure) {
+                            if (mBillGroupModels != null && mBillGroupModels.size() > groupIndex && groupIndex >= 0) {
+                                boolean isLastItem = mBillGroupModels.get(groupIndex).isLastInType();
+                                if (isLastItem && groupIndex - 1 > 0 && !mBillGroupModels.get(groupIndex - 1).isForm()) {
+                                    mBillGroupModels.get(groupIndex - 1).setLastInType(true);
+                                }
+                                mBillGroupModels.remove(groupIndex);
+                                setBillGroupModels(mBillGroupModels);
+                                notifyDataSetChanged();
+                            }
+                        }
+                    }
+                });
+
+    }
+
+
+    public interface OnAdapterListener {
+        void toSelect(int position, BillGroupModel.BillModel model);
+
+        void toEnclosureSelect(int position);
+    }
+
+    private class EnclosureAdapter extends BaseAdapter {
+        private int position;
+        private List<BillGroupModel.LocalData> localDatas;
+
+        public EnclosureAdapter(int position, List<BillGroupModel.LocalData> localDatas) {
+            this.position = position;
+            this.localDatas = localDatas;
+        }
+
+        public void setPosition(int position) {
+            this.position = position;
+        }
+
+        public void setLocalDatas(List<BillGroupModel.LocalData> localDatas) {
+            this.localDatas = localDatas;
+        }
+
+        @Override
+        public int getCount() {
+            return ListUtils.getSize(localDatas) < 9 ? (ListUtils.getSize(localDatas) + 1) : ListUtils.getSize(localDatas);
+        }
+
+        @Override
+        public Object getItem(int i) {
+            return localDatas.get(i);
+        }
+
+        @Override
+        public long getItemId(int i) {
+            return i;
+        }
+
+        @Override
+        public View getView(int i, View view, ViewGroup viewGroup) {
+            view = getLayoutInflater().inflate(R.layout.item_bill_enclosure_item, null);
+            ImageView content = (ImageView) view.findViewById(R.id.content);
+            TextView tvName = (TextView) view.findViewById(R.id.tv_name);
+            Button btnDel = (Button) view.findViewById(R.id.btn_del);
+            if (ListUtils.getSize(localDatas) > i) {
+                BillGroupModel.LocalData data = localDatas.get(i);
+                btnDel.setVisibility(View.VISIBLE);
+                String name = data.value == null ? "" : data.value;
+                tvName.setText(name);
+                btnDel.setTag(R.id.tag_key2, position);
+                btnDel.setTag(R.id.tag_key, i);
+                btnDel.setOnClickListener(mOnClickListener);
+                if (isImage(name)) {
+                    ImageLoaderUtil.getInstance().loadImage(data.display, content);
+                }
+            } else {
+                tvName.setText("");
+                btnDel.setVisibility(View.GONE);
+                content.setImageResource(R.drawable.add_picture);
+                content.setTag(R.id.tag_key2, position);
+                content.setOnClickListener(mOnClickListener);
+            }
+            return view;
+        }
+    }
+    private boolean isImage(String name) {
+        return name.toUpperCase().endsWith("JPEG")
+                || name.toUpperCase().endsWith("JPG")
+                || name.toUpperCase().endsWith("PNG");
+    }
+}

+ 328 - 0
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerBillInputActivity.java

@@ -0,0 +1,328 @@
+package com.uas.appworks.crm3_0.activity;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v7.widget.DividerItemDecoration;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.LinearLayout;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.common.LogUtil;
+import com.common.data.CalendarUtil;
+import com.common.data.JSONUtil;
+import com.common.data.ListUtils;
+import com.common.data.StringUtil;
+import com.common.file.FileUtils;
+import com.core.app.Constants;
+import com.core.base.OABaseActivity;
+import com.core.model.SelectBean;
+import com.core.utils.time.wheel.DateTimePicker;
+import com.core.widget.view.Activity.SelectActivity;
+import com.modular.apputils.activity.BillInputActivity;
+import com.modular.apputils.activity.SelectNetAcitivty;
+import com.modular.apputils.model.BillGroupModel;
+import com.modular.apputils.presenter.BillPresenter;
+import com.modular.apputils.presenter.imp.IBill;
+import com.uas.appworks.R;
+import com.uas.appworks.adapter.CustomerBillInputAdapter;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 客户录入界面
+ */
+public class CustomerBillInputActivity extends OABaseActivity implements IBill {
+    private final int REQUESTCODE_C = 0x11;
+    private final int REQUESTCODE_DB_FIND = 0x12;
+    private final int REQUESTCODE_ENCLOSURE = 0x13;
+
+    private RecyclerView mRecyclerView;
+    private BillPresenter mBillPresenter;
+    private CustomerBillInputAdapter mBillAdapter;
+    private int selectPosition = -1;//当前选择调转界面的index,本来不想添加全局变量的,没有办法
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_bill_input);
+        initView();
+        mBillPresenter = new BillPresenter(this, this);
+        mBillPresenter.start(getIntent());
+    }
+
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.menu_bill_input, menu);
+        return super.onCreateOptionsMenu(menu);
+    }
+
+    //更新菜单时候
+    @Override
+    public boolean onPrepareOptionsMenu(Menu menu) {
+        MenuItem itemMenu = menu.findItem(R.id.saveAndSubmit);
+        return super.onPrepareOptionsMenu(menu);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == R.id.saveAndSubmit) {
+            if (item.getTitle().equals("提交")) {
+                mBillPresenter.saveAndSubmit(mBillAdapter.getBillGroupModels());
+            }
+        } else if (item.getItemId() == R.id.list) {
+            startActivity(new Intent(ct, CustomerListActivity.class));
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    private void initView() {
+        mRecyclerView = findViewById(R.id.mRecyclerView);
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(ct));
+        mRecyclerView.addItemDecoration(new DividerItemDecoration(ct, LinearLayout.VERTICAL));
+    }
+
+    @Override
+    public void setAdapter(List<BillGroupModel> groupModels) {
+        if (mBillAdapter == null) {
+            mBillAdapter = new CustomerBillInputAdapter(ct, groupModels, mOnAdapterListener);
+            mRecyclerView.setAdapter(mBillAdapter);
+        } else {
+            mBillAdapter.setBillGroupModels(groupModels);
+            mBillAdapter.notifyDataSetChanged();
+        }
+    }
+
+    @Override
+    public void commitSuccess() {
+        ToastMessage("提交成功!");
+        if (mBillAdapter.isAddContact()) {
+            HashMap<String, String> hashMap = new HashMap<>();
+            List<BillGroupModel> mGroupModels = mBillAdapter.getBillGroupModels();
+            for (BillGroupModel e : mGroupModels) {
+                if (e.isForm() && !ListUtils.isEmpty(e.getShowBillFields())) {
+                    for (BillGroupModel.BillModel billModel : e.getShowBillFields()) {
+                        hashMap.put(billModel.getField(), billModel.getValue());
+                    }
+                }
+            }
+            startActivity(new Intent(ct, BillInputActivity.class)
+                    .putExtra(Constants.Intents.CALLER, "Contact")
+                    .putExtra(Constants.Intents.TITLE, "客户联系人")
+                    .putExtra(Constants.Intents.ID, 0)
+            .putExtra(Constants.Intents.CALLER,hashMap));
+        } else {
+            startActivity(new Intent(ct, CustomerListActivity.class));
+
+        }
+        finish();
+    }
+
+    @Override
+    public void updateFileOk() {
+        dimssLoading();
+        mBillPresenter.saveAndSubmit(mBillAdapter.getBillGroupModels());
+    }
+
+    private CustomerBillInputAdapter.OnAdapterListener mOnAdapterListener = new CustomerBillInputAdapter.OnAdapterListener() {
+        @Override
+        public void toSelect(int position, BillGroupModel.BillModel model) {
+            if (TextUtils.isEmpty(model.getType())) return;
+            if (!ListUtils.isEmpty(model.getLocalDatas())) {
+                //本地数据不为空的情况下
+                selectByLocal(position, model);
+            } else {
+                //本地数据为空,获取网络数据
+                switch (model.getType()) {
+                    case "D"://日期选择
+                        showDateDialog(true, position);
+                        break;
+                    case "T"://时间选择
+                        showDateDialog(true, position);
+                        break;
+                    case "SF":
+                    case "DF":
+                        //DBFind 选择
+                        findBydbFind(model);
+                        break;
+                    case "MF":
+                        break;
+
+                }
+            }
+        }
+
+        @Override
+        public void toEnclosureSelect(int position) {
+            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+            //intent.setType(“image/*”);//选择图片
+            //intent.setType(“audio/*”); //选择音频
+            //intent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式)
+            //intent.setType(“video/*;image/*”);//同时选择视频和图片
+            selectPosition = position;
+            intent.setType("*/*");//无类型限制
+            intent.addCategory(Intent.CATEGORY_OPENABLE);
+            startActivityForResult(intent, REQUESTCODE_ENCLOSURE);
+        }
+    };
+
+    /**
+     * 选择日期
+     */
+    public void showDateDialog(final boolean needTime, final int position) {
+        DateTimePicker picker = new DateTimePicker(this, needTime ? DateTimePicker.HOUR_OF_DAY : DateTimePicker.YEAR_MONTH_DAY);
+        picker.setRange(CalendarUtil.getYear() - 10, CalendarUtil.getYear() + 10);
+        if (needTime) {
+            picker.setSelectedItem(CalendarUtil.getYear(), CalendarUtil.getMonth(), CalendarUtil.getDay(), CalendarUtil.getHour(), CalendarUtil.getMinute());
+        } else {
+            picker.setSelectedItem(CalendarUtil.getYear(), CalendarUtil.getMonth(), CalendarUtil.getDay());
+        }
+        picker.setOnDateTimePickListener(new DateTimePicker.OnYearMonthDayTimePickListener() {
+            @Override
+            public void onDateTimePicked(String year, String month, String day, String hour, String minute) {
+                String date = year + "-" + month + "-" + day;
+                if (needTime) {
+                    date += " " + hour + ":" + minute + ":00";
+                }
+                mBillAdapter.updateBillModelValues(position, date, date);
+            }
+        });
+
+        picker.show();
+    }
+
+    /**
+     * dbfind 查找
+     *
+     * @param model
+     */
+    private void findBydbFind(BillGroupModel.BillModel model) {
+        String gridCaller = "";
+        String fieldKey = model.getField();
+        BillGroupModel mGroupModel = mBillAdapter.getBillGroupModel(model.getGroupIndex());
+        boolean isForm = mGroupModel == null || mGroupModel.isForm();
+        LogUtil.i("gong", "isForm=" + isForm);
+        if (!isForm && !StringUtil.isEmpty(model.getFindFunctionName())) {
+            String[] mFindFunctionNames = model.getFindFunctionName().split("\\|");
+            if (mFindFunctionNames != null && mFindFunctionNames.length > 1) {
+                gridCaller = mFindFunctionNames[0];
+//                fieldKey = mFindFunctionNames[1];
+            }
+        }
+        startActivityForResult(new Intent(ct, SelectNetAcitivty.class)
+                        .putExtra("fieldKey", fieldKey)
+                        .putExtra("caller", mBillPresenter.getFormCaller())
+                        .putExtra("gCaller", gridCaller)
+                        .putExtra("isDevice", false)
+                        .putExtra("isForm", isForm)
+                        .putExtra("groupId", model.getGroupIndex())
+                , REQUESTCODE_DB_FIND);
+    }
+
+    /**
+     * 选择本地数据选项
+     *
+     * @param position 索引
+     * @param model    点击对象
+     */
+    private void selectByLocal(int position, BillGroupModel.BillModel model) {
+        ArrayList<SelectBean> beans = new ArrayList<>();
+        SelectBean bean;
+        for (BillGroupModel.LocalData localData : model.getLocalDatas()) {
+            bean = new SelectBean();
+            bean.setJson(localData.value);
+            bean.setShowName(localData.display);
+            bean.setName(localData.display);
+            bean.setIndex(position);
+            beans.add(bean);
+        }
+        Intent intent = new Intent(ct, SelectActivity.class);
+        intent.putExtra("type", 2);
+        intent.putParcelableArrayListExtra("data", beans);
+        intent.putExtra("title", model.getCaption());
+        startActivityForResult(intent, REQUESTCODE_C);
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (data == null) return;
+        switch (requestCode) {
+            case REQUESTCODE_C:
+                SelectBean mSelectBeanC = data.getParcelableExtra("data");
+                if (mSelectBeanC != null) {
+                    int position = mSelectBeanC.getIndex();
+                    String display = StringUtil.isEmpty(mSelectBeanC.getShowName()) ? "" : mSelectBeanC.getShowName();
+                    String value = StringUtil.isEmpty(mSelectBeanC.getJson()) ? "" : mSelectBeanC.getJson();
+                    mBillAdapter.updateBillModelValues(position, value, display);
+                }
+                break;
+            case REQUESTCODE_DB_FIND:
+                String json = data.getStringExtra("data");
+                int groupIndex = data.getIntExtra("groupId", 0);
+                LogUtil.i("gong", "groupIndex=" + groupIndex);
+                handlerSelectDbFind(JSON.parseObject(json), groupIndex);
+                break;
+            case 0x22:
+                SelectBean d = data.getParcelableExtra("data");
+                if (d == null) return;
+                String name = StringUtil.isEmpty(d.getName()) ? "" : d.getName();
+                String nodeId = StringUtil.isEmpty(d.getJson()) ? "" : d.getJson();
+                mBillPresenter.getEmnameByReturn(name, nodeId);
+                break;
+            case REQUESTCODE_ENCLOSURE:
+                if (resultCode == Activity.RESULT_OK) {
+                    String path;
+                    Uri uri = data.getData();
+                    if ("file".equalsIgnoreCase(uri.getScheme())) {//使用第三方应用打开
+                        path = uri.getPath();
+                    } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后
+                        path = FileUtils.getPath(this, uri);
+                    } else {//4.4以下下系统调用方法
+                        path = FileUtils.getRealPathFromURI(this, uri);
+                    }
+                    File file = new File(path);
+                    if (file != null && file.exists() && file.isFile()) {
+                        String value = file.getName();
+                        String display = path;
+                        mBillAdapter.addBillModelData(selectPosition, value, display);
+                        selectPosition = -1;
+                    }
+                }
+                break;
+        }
+    }
+
+    private void handlerSelectDbFind(JSONObject object, int groupId) {
+        BillGroupModel mBillGroupModel = mBillAdapter.getBillGroupModel(groupId);
+        if (mBillGroupModel != null) {
+            if (!ListUtils.isEmpty(mBillGroupModel.getShowBillFields())) {
+                for (BillGroupModel.BillModel e : mBillGroupModel.getShowBillFields()) {
+                    if (object.containsKey(e.getField())) {
+                        e.setValue(JSONUtil.getText(object, e.getField()));
+                    }
+                }
+            }
+            if (!ListUtils.isEmpty(mBillGroupModel.getHideBillFields())) {
+                for (BillGroupModel.BillModel e : mBillGroupModel.getHideBillFields()) {
+                    if (object.containsKey(e.getField())) {
+                        e.setValue(JSONUtil.getText(object, e.getField()));
+                    }
+                }
+            }
+        }
+        mBillAdapter.notifyDataSetChanged();
+    }
+}

+ 199 - 0
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerDetails3_0Activity.java

@@ -0,0 +1,199 @@
+package com.uas.appworks.crm3_0.activity;
+
+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.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.common.data.ListUtils;
+import com.core.base.OABaseActivity;
+import com.modular.apputils.model.BillGroupModel;
+import com.uas.appworks.R;
+import com.uas.appworks.crm3_0.fragment.CustomerListDetailsFragment;
+import com.uas.appworks.presenter.CustomerDetailsPresenter;
+import com.uas.appworks.presenter.imp.ICustomerDetails;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 客户详情界面
+ */
+public class CustomerDetails3_0Activity extends OABaseActivity implements ICustomerDetails {
+    private ListView mListView;
+    private TabLayout mTabLayout;
+    private ViewPager mViewPager;
+
+    private String[] tabTitle;
+    private CustomerDetailsPresenter mPresenter;
+    private ListAdapter mListAdapter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_customer_details_3_0);
+        initView();
+        mPresenter = new CustomerDetailsPresenter(ct, this);
+        mPresenter.start(getIntent());
+    }
+
+    private void initView() {
+        tabTitle = new String[]{getString(R.string.my_responsible), getString(R.string.my_subordinate)};
+        mListView = findViewById(R.id.mListView);
+        mTabLayout = (TabLayout) findViewById(R.id.mTabLayout);
+        mViewPager = (ViewPager) findViewById(R.id.mViewPager);
+        mTabLayout.setTabMode(TabLayout.MODE_FIXED);//设置tab模式,当前为系统默认模式
+        for (String tab : tabTitle) {
+            mTabLayout.addTab(mTabLayout.newTab().setText(tab));
+        }
+        ViewPageAdapter mAdapter = new ViewPageAdapter(getSupportFragmentManager());
+        mViewPager.setAdapter(mAdapter);//给ViewPager设置适配器
+        mTabLayout.setupWithViewPager(mViewPager);//将TabLayout和ViewPager关联起来。
+    }
+
+
+    @Override
+    public void setAdapter(List<BillGroupModel> groupModels) {
+        if (mListAdapter == null) {
+            mListAdapter = new ListAdapter(groupModels);
+            mListView.setAdapter(mListAdapter);
+        } else {
+            mListAdapter.updateGroupModels(groupModels);
+            mListAdapter.notifyDataSetChanged();
+        }
+    }
+
+
+    private class ViewPageAdapter extends FragmentPagerAdapter {
+
+        public ViewPageAdapter(FragmentManager fm) {
+            super(fm);
+        }
+
+        @Override
+        public void setPrimaryItem(ViewGroup container, int position, Object object) {
+            if (object != null && object instanceof CustomerListDetailsFragment) {
+                //获取当前的fragment
+//                mCurrentFragment = (CustomerListDetailsFragment) object;
+            }
+            super.setPrimaryItem(container, position, object);
+        }
+
+        @Override
+        public Fragment getItem(int position) {
+            return CustomerListDetailsFragment.newInstance("", "");
+        }
+
+        @Override
+        public CharSequence getPageTitle(int position) {
+            return tabTitle[position];
+        }
+
+        @Override
+        public int getCount() {
+            return tabTitle.length;
+        }
+    }
+
+
+    private class ListAdapter extends BaseAdapter {
+        private List<BillGroupModel> groupModels;
+        private List<BillGroupModel.BillModel> mShowBillModels;
+
+        public ListAdapter(List<BillGroupModel> groupModels) {
+            this.groupModels = groupModels;
+            changeBillModel();
+        }
+
+        public void updateGroupModels(List<BillGroupModel> groupModels) {
+            this.groupModels = groupModels;
+            changeBillModel();
+        }
+
+        public List<BillGroupModel> getGroupModels() {
+            return groupModels;
+        }
+
+        /**
+         * 当外界的因素引起mBillGroupModels变化时候,通过遍历将mBillGroupModels转成mShowBillModels进行显示
+         */
+        private void changeBillModel() {
+            if (mShowBillModels == null) {
+                mShowBillModels = new ArrayList<>();
+            } 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());
+                }
+            }
+        }
+
+
+        @Override
+        public int getCount() {
+            return mShowBillModels == null ? 0 : mShowBillModels.size();
+        }
+
+        @Override
+        public Object getItem(int i) {
+            return mShowBillModels.get(i);
+        }
+
+        @Override
+        public long getItemId(int i) {
+            return i;
+        }
+
+        @Override
+        public View getView(int position, View view, ViewGroup viewGroup) {
+            ViewHolder mViewHolder = null;
+            if (view == null) {
+                view = LayoutInflater.from(ct).inflate(R.layout.item_customer_details_3_0, null);
+                mViewHolder = new ViewHolder();
+                mViewHolder.tvTitle = (TextView) view.findViewById(R.id.tv_title);
+                mViewHolder.captionTv = (TextView) view.findViewById(R.id.captionTv);
+                mViewHolder.valuesTv = (TextView) view.findViewById(R.id.valuesTv);
+                view.setTag(mViewHolder);
+            } else {
+                mViewHolder = (ViewHolder) view.getTag();
+            }
+            BillGroupModel.BillModel field = mShowBillModels.get(position);
+            mViewHolder.captionTv.setText(field.getCaption());
+            mViewHolder.valuesTv.setText(field.getValue());
+            if (field.getGroupIndex() != 0 && position >= 1 && field.getGroupIndex() > mShowBillModels.get(position - 1).getGroupIndex()) {
+                mViewHolder.tvTitle.setVisibility(View.VISIBLE);
+                String mGroupName = null;
+                if (ListUtils.getSize(groupModels) > field.getGroupIndex()) {
+                    mGroupName = groupModels.get(field.getGroupIndex()).getGroup();
+                }
+                mViewHolder.tvTitle.setText(TextUtils.isEmpty(mGroupName) ? "" : mGroupName);
+            } else {
+                mViewHolder.tvTitle.setVisibility(View.GONE);
+            }
+            return view;
+        }
+
+
+        class ViewHolder {
+            private TextView tvTitle;
+            private TextView captionTv;
+            private TextView valuesTv;
+
+
+        }
+
+
+    }
+}

+ 7 - 6
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerListActivity.java

@@ -8,15 +8,16 @@ import android.support.v4.app.FragmentTransaction;
 import com.core.base.BaseActivity;
 
 import com.modular.apputils.widget.DivideRadioGroup;
-import com.uas.appworks.OA.platform.fragment.CharitableListFragment;
 import com.uas.appworks.R;
 import com.uas.appworks.crm3_0.fragment.CustomerListFragment;
 import com.uas.appworks.crm3_0.fragment.CustomerMapFragment;
 
+/**
+ * 客户列表界面
+ */
 public class CustomerListActivity extends BaseActivity {
-    private final String LIST = "listFragment";
-    private final String MAP = "activityFragment";
-
+    private final String LIST = "List";
+    private final String MAP = "Map";
 
     private Fragment lastFragment;
 
@@ -29,7 +30,7 @@ public class CustomerListActivity extends BaseActivity {
 
     private void init() {
         DivideRadioGroup tabBottomRg = findViewById(R.id.tabBottomRg);
-        CustomerListFragment listFragment = new CustomerListFragment();
+        CustomerListFragment listFragment = CustomerListFragment.newInstance(1);
         changeFragment(listFragment, LIST);
         tabBottomRg.setOnCheckedChangeListener(new DivideRadioGroup.OnCheckedChangeListener() {
             @Override
@@ -39,7 +40,7 @@ public class CustomerListActivity extends BaseActivity {
                 if (R.id.customerListRb == checkedId) {
                     fragment = getSupportFragmentManager().findFragmentByTag(LIST);
                     if (fragment == null) {
-                        fragment = new CustomerListFragment();
+                        fragment = CustomerListFragment.newInstance(1);
                     }
                     tag = LIST;
                 } else if (R.id.customerLocationRb == checkedId) {

+ 22 - 11
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerManageActivity.java

@@ -173,6 +173,7 @@ public class CustomerManageActivity extends OABaseActivity implements ICustomerM
             plist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                 @Override
                 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                    toAddPager(position);
                     if(menuPopWindow!=null){
                         menuPopWindow.dismiss();
                     }
@@ -180,7 +181,7 @@ public class CustomerManageActivity extends OABaseActivity implements ICustomerM
             });
             menuPopWindow =new PopupWindow(view);
             menuPopWindow.setWidth(DisplayUtil.dip2px(ct,140));
-            menuPopWindow.setHeight(DisplayUtil.dip2px(ct,135));
+            menuPopWindow.setHeight(DisplayUtil.dip2px(ct,160));
         }
         // 使其聚集
         menuPopWindow.setFocusable(true);
@@ -201,15 +202,19 @@ public class CustomerManageActivity extends OABaseActivity implements ICustomerM
     private List<Map<String, Object>> getPopData() {
         List<Map<String, Object>> list = new ArrayList<>();
         Map<String, Object> map = new HashMap<>();
-        if (getIntent() == null || getIntent().getIntExtra("type", 0) != 1) {
-            map.put("item_name", getString(R.string.oacreat_task));
-            list.add(map);
-            map = new HashMap<>();
-            map.put("item_name", getString(R.string.oacreat_calender));
-            list.add(map);
-            map = new HashMap<>();
-        }
-        map.put("item_name", getString(R.string.crm_add_visitrecord));
+        map.put("item_name","正式客户");
+        list.add(map);
+
+        map = new HashMap<>();
+        map.put("item_name", "预录入客户");
+        list.add(map);
+
+        map = new HashMap<>();
+        map.put("item_name","客户联系人");
+        list.add(map);
+
+        map = new HashMap<>();
+        map.put("item_name","拜访报告");
         list.add(map);
         return list;
     }
@@ -295,28 +300,34 @@ public class CustomerManageActivity extends OABaseActivity implements ICustomerM
 
 
     private void toAddPager(int position) {
+        LogUtil.i("gong","position="+position);
         String mCaller = "";
         String mTitle = "";
         int mId = 0;
+        Class clazz=null;
         switch (position) {
             case 0:
                 mCaller = "Customer!Base";
                 mTitle = "正式客户";
+                clazz=CustomerBillInputActivity.class;
                 break;
             case 1:
                 mCaller = "PreCustomer";
                 mTitle = "预录入客户";
+                clazz=CustomerBillInputActivity.class;
                 break;
             case 2:
                 mCaller = "Contact";
                 mTitle = "客户联系人";
+                clazz=BillInputActivity.class;
                 break;
             case 3:
                 mCaller = "VisitRecord";
                 mTitle = "拜访报告";
+                clazz=BillInputActivity.class;
                 break;
         }
-        startActivity(new Intent(ct, BillInputActivity.class)
+        startActivity(new Intent(ct, clazz)
                 .putExtra(Constants.Intents.CALLER, mCaller)
                 .putExtra(Constants.Intents.TITLE, mTitle)
                 .putExtra(Constants.Intents.ID, mId)

+ 20 - 0
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/fragment/CustomerDetailsBottomListFragment.java

@@ -0,0 +1,20 @@
+package com.uas.appworks.crm3_0.fragment;
+
+import android.os.Bundle;
+
+import com.modular.apputils.fragment.ViewPagerLazyFragment;
+
+public class CustomerDetailsBottomListFragment extends ViewPagerLazyFragment {
+
+
+    @Override
+    protected int inflateLayoutId() {
+        return 0;
+    }
+
+
+    @Override
+    protected void LazyData() {
+
+    }
+}

+ 63 - 106
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/fragment/CustomerListDetailsFragment.java

@@ -1,42 +1,40 @@
 package com.uas.appworks.crm3_0.fragment;
 
+import android.content.Intent;
 import android.os.Bundle;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.baidu.cyberplayer.utils.G;
 import com.common.LogUtil;
 import com.common.data.JSONUtil;
 import com.common.data.ListUtils;
+import com.core.app.Constants;
 import com.core.app.MyApplication;
-import com.core.base.EasyFragment;
 import com.core.utils.CommonUtil;
-import com.me.network.app.base.HttpParams;
 import com.me.network.app.http.Method;
-import com.modular.apputils.fragment.BaseNetFragment;
+import com.modular.apputils.fragment.ViewPagerLazyFragment;
 import com.modular.apputils.listener.OnSmartHttpListener;
 import com.modular.apputils.model.BillListGroupModel;
 import com.modular.apputils.network.Parameter;
 import com.modular.apputils.network.Tags;
+import com.modular.apputils.utils.UUHttpHelper;
+import com.module.recyclerlibrary.ui.refresh.BaseRefreshLayout;
+import com.module.recyclerlibrary.ui.refresh.EmptyRecyclerView;
+import com.module.recyclerlibrary.ui.refresh.simlpe.SimpleRefreshLayout;
 import com.uas.appworks.R;
+import com.uas.appworks.adapter.BillListAdapter;
+import com.uas.appworks.crm3_0.activity.CustomerDetails3_0Activity;
 
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 
 /**
  * 客户列表中的列表界面
  */
-public class CustomerListDetailsFragment extends BaseNetFragment {
+public class CustomerListDetailsFragment extends ViewPagerLazyFragment {
     private final int PAGE_SIZE = 20;
     private final int LOAD_LIST_DATA = 0x11;
 
@@ -45,10 +43,10 @@ public class CustomerListDetailsFragment extends BaseNetFragment {
     private int mPageIndex = 1;
     private RecyclerView mRecyclerView;
 
-    @Override
-    public String getBaseUrl() {
-        return CommonUtil.getAppBaseUrl(MyApplication.getInstance());
-    }
+
+    private UUHttpHelper mUUHttpHelper;
+    private SimpleRefreshLayout mRefreshLayout;
+
 
     public static CustomerListDetailsFragment newInstance(String mCaller, String mCondition) {
         Bundle args = new Bundle();
@@ -65,27 +63,46 @@ public class CustomerListDetailsFragment extends BaseNetFragment {
     }
 
     @Override
-    protected void onCreateView(Bundle savedInstanceState, boolean createView) {
-        if (createView) {
-            initView();
-        }
+    protected void LazyData() {
+        mUUHttpHelper = new UUHttpHelper(CommonUtil.getAppBaseUrl(MyApplication.getInstance()));
+        initView();
+
     }
 
+
     private void initView() {
         Bundle args = getArguments();
         if (args != null) {
             mCondition = args.getString("mCondition");
             mCaller = args.getString("mCaller");
         }
-        mRecyclerView = findViewById(R.id.mRecyclerView);
+
+        mRefreshLayout = (SimpleRefreshLayout) findViewById(R.id.mRefreshLayout);
+        EmptyRecyclerView mEmptyRecyclerView = (EmptyRecyclerView) findViewById(R.id.mEmptyRecyclerView);
+        mRecyclerView = mEmptyRecyclerView.getRecyclerView();
         mRecyclerView.setLayoutManager(new LinearLayoutManager(ct));
+
+        mRefreshLayout.setOnRefreshListener(new BaseRefreshLayout.onRefreshListener() {
+            @Override
+            public void onRefresh() {
+                loadListData();
+            }
+
+            @Override
+            public void onLoadMore() {
+                mPageIndex++;
+                loadListData();
+            }
+        });
         loadListData();
     }
 
 
     private void loadListData() {
-        showProgress();
-        requestCompanyHttp(new Parameter.Builder()
+        if (!mRefreshLayout.isRefreshing()) {
+            showProgress();
+        }
+        mUUHttpHelper.requestCompanyHttp(new Parameter.Builder()
                 .record(LOAD_LIST_DATA)
                 .addParams("caller", mCaller)
                 .addParams("condition", mCondition)
@@ -104,7 +121,7 @@ public class CustomerListDetailsFragment extends BaseNetFragment {
                     handlerListData(object);
                     break;
             }
-
+            mRefreshLayout.stopRefresh();
             dismissProgress();
         }
 
@@ -125,9 +142,10 @@ public class CustomerListDetailsFragment extends BaseNetFragment {
             groupModels = new ArrayList<>();
             int index = -1;
             for (int i = 0; i < listdata.size(); i++) {
-                BillListGroupModel groupModel = new BillListGroupModel();
                 List<BillListGroupModel.BillListField> billListFields = null;
+                BillListGroupModel groupModel = new BillListGroupModel();
                 JSONObject data = listdata.getJSONObject(i);
+                int id = JSONUtil.getInt(data, keyField);
                 for (int j = 0; j < columns.size(); j++) {
                     JSONObject column = columns.getJSONObject(j);
                     if (JSONUtil.getInt(column, "width") > 0) {
@@ -139,6 +157,7 @@ public class CustomerListDetailsFragment extends BaseNetFragment {
                         String dataIndex = JSONUtil.getText(column, "dataIndex");
                         String values = JSONUtil.getText(data, dataIndex);
                         BillListGroupModel.BillListField billListField = new BillListGroupModel.BillListField();
+                        billListField.setId(id);
                         billListField.setCaption(caption);
                         billListField.setField(dataIndex);
                         billListField.setValue(values);
@@ -152,98 +171,36 @@ public class CustomerListDetailsFragment extends BaseNetFragment {
                     groupModels.add(groupModel);
                 }
             }
+        } else if (mPageIndex > 1) {
+            mPageIndex--;
         }
         setAdapter(groupModels);
     }
 
-    private ListAdapter mListAdapter;
+    private BillListAdapter mListAdapter;
 
     private void setAdapter(List<BillListGroupModel> groupModels) {
-        LogUtil.i("gong", "groupModels=" + JSON.toJSONString(groupModels));
         if (mListAdapter == null) {
-            mListAdapter = new ListAdapter(groupModels);
+            mListAdapter = new BillListAdapter(ct, groupModels, new BillListAdapter.OnAdapterListener() {
+                @Override
+                public void onClick(BillListGroupModel.BillListField field) {
+                    startActivity(new Intent(ct, CustomerDetails3_0Activity.class)
+                            .putExtra(Constants.Intents.CALLER, mCaller)
+                            .putExtra(Constants.Intents.TITLE, getActivity().getTitle())
+                            .putExtra(Constants.Intents.ID, field.getId()));
+                }
+            });
             mRecyclerView.setAdapter(mListAdapter);
         } else {
-            mListAdapter.updateGroupModels(groupModels);
-        }
-    }
-
-    private class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {
-        private List<BillListGroupModel> groupModels;
-        private List<BillListGroupModel.BillListField> listFields;
-
-        public ListAdapter(List<BillListGroupModel> groupModels) {
-            this.groupModels = groupModels;
-            changeFieldsList();
-        }
-
-        public void updateGroupModels(List<BillListGroupModel> groupModels) {
-            this.groupModels = groupModels;
-            changeFieldsList();
-        }
-
-        public List<BillListGroupModel> getGroupModels() {
-            return groupModels;
-        }
-
-        private void changeFieldsList() {
-            if (listFields == null) {
-                listFields = new ArrayList<>();
-            } else {
-                listFields.clear();
-            }
-            if (ListUtils.isEmpty(groupModels)) return;
-            for (BillListGroupModel groupModel : groupModels) {
-                if (!ListUtils.isEmpty(groupModel.getBillFields())) {
-                    listFields.addAll(groupModel.getBillFields());
-                }
-            }
-            LogUtil.i("gong","listFields="+ListUtils.getSize(listFields));
-
-        }
-
-
-        @Override
-        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) {
-            return new ViewHolder(LayoutInflater.from(ct).inflate(R.layout.item_customer_list_details_list, viewGroup, false));
-        }
-
-        @Override
-        public int getItemCount() {
-            int mItemCount=ListUtils.getSize(listFields);
-            LogUtil.i("gong","mItemCount="+mItemCount);
-            return mItemCount;
-        }
-
-        class ViewHolder extends RecyclerView.ViewHolder {
-            private TextView captionTV;
-            private TextView valueTv;
-            private View lineView;
-
-            public ViewHolder(View itemView) {
-                super(itemView);
-                captionTV = (TextView) itemView.findViewById(R.id.captionTV);
-                valueTv = (TextView) itemView.findViewById(R.id.valueTv);
-                lineView = itemView.findViewById(R.id.lineView);
-                lineView.setVisibility(View.GONE);
-            }
-        }
-
-
-
-
-        @Override
-        public void onBindViewHolder(ViewHolder mViewHolder, int position) {
-            BillListGroupModel.BillListField field = listFields.get(position);
-            mViewHolder.captionTV.setText(field.getCaption());
-            mViewHolder.valueTv.setText(field.getValue());
-            if (field.getGroupIndex()!=0&&position>=1&&field.getGroupIndex()>listFields.get(position-1).getGroupIndex()){
-                mViewHolder.lineView.setVisibility(View.VISIBLE);
-            }else{
-                mViewHolder.lineView.setVisibility(View.GONE);
+            List<BillListGroupModel> showModels = mListAdapter.getGroupModels();
+            if (ListUtils.isEmpty(showModels)) {
+                showModels = groupModels;
+            } else if (mPageIndex > 1) {
+                showModels.addAll(groupModels);
             }
+            mListAdapter.updateGroupModels(showModels);
         }
+    }
 
 
-    }
 }

+ 23 - 10
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/fragment/CustomerListFragment.java

@@ -10,19 +10,28 @@ import android.support.v4.view.ViewPager;
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.common.LogUtil;
 import com.core.base.EasyFragment;
 import com.core.utils.CommonUtil;
 import com.uas.appworks.R;
 
 /**
- * 客户列表
+ * 客户列表|客户地图列表
  */
 public class CustomerListFragment extends EasyFragment {
 
     private String[] tabTitle;
     private TabLayout mTabLayout;
     private ViewPager mViewPager;
-
+    private int type;//当前类型,1.列表界面  2.地图界面
+
+    public static CustomerListFragment newInstance(int type) {
+        Bundle args = new Bundle();
+        CustomerListFragment fragment = new CustomerListFragment();
+        args.putInt("type", type);
+        fragment.setArguments(args);
+        return fragment;
+    }
 
     @Override
     protected int inflateLayoutId() {
@@ -32,15 +41,16 @@ public class CustomerListFragment extends EasyFragment {
     @Override
     protected void onCreateView(Bundle savedInstanceState, boolean createView) {
         if (createView) {
+            type = getArguments().getInt("type", 1);
+            LogUtil.i("gong","type="+type);
             initView(getmRootView());
         }
     }
 
     private void initView(View rootView) {
         tabTitle = new String[]{getString(R.string.my_responsible), getString(R.string.my_subordinate)};
-        mTabLayout = (TabLayout) findViewById(R.id.mTabLayout);
-        mViewPager = (ViewPager) findViewById(R.id.mViewPager);
-
+        mTabLayout = findViewById(R.id.mTabLayout);
+        mViewPager = findViewById(R.id.mViewPager);
         mTabLayout.setTabMode(TabLayout.MODE_FIXED);//设置tab模式,当前为系统默认模式
         for (String tab : tabTitle) {
             mTabLayout.addTab(mTabLayout.newTab().setText(tab));
@@ -71,16 +81,19 @@ public class CustomerListFragment extends EasyFragment {
             String mCaller = "Customer!Base";
             String mCondition;
             if (position == 0) {
-                mCondition = "cu_sellercode=\'" + CommonUtil.getEmcode()+"\'";
+                mCondition = "cu_sellercode=\'" + CommonUtil.getEmcode() + "\'";
             } else {
                 mCondition = "cu_sellercode in ( " +
                         " select em_code from employee left join job on em_defaulthsid=jo_subof where jo_subof=" +
                         " (select em_defaulthsid from employee where em_code =\'" + CommonUtil.getEmcode() + "\')" +
-                        ")" ;
+                        ")";
+            }
+            LogUtil.i("gong","mCaller="+mCaller);
+            if (type == 2) {//地图界面
+                return CustomerMapDetailsFragment.newInstance(mCaller, mCondition);
+            } else {//列表界面
+                return CustomerListDetailsFragment.newInstance(mCaller, mCondition);
             }
-            mCaller = "Device";
-            mCondition = "1=1";
-            return CustomerListDetailsFragment.newInstance(mCaller, mCondition);
         }
 
         @Override

+ 201 - 0
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/fragment/CustomerMapDetailsFragment.java

@@ -0,0 +1,201 @@
+package com.uas.appworks.crm3_0.fragment;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baidu.mapapi.map.MapView;
+import com.common.LogUtil;
+import com.common.data.JSONUtil;
+import com.common.data.ListUtils;
+import com.core.app.Constants;
+import com.core.app.MyApplication;
+import com.core.utils.CommonUtil;
+import com.me.network.app.http.Method;
+import com.modular.apputils.fragment.ViewPagerLazyFragment;
+import com.modular.apputils.listener.OnSmartHttpListener;
+import com.modular.apputils.model.BillListGroupModel;
+import com.modular.apputils.network.Parameter;
+import com.modular.apputils.network.Tags;
+import com.modular.apputils.utils.UUHttpHelper;
+import com.module.recyclerlibrary.ui.refresh.BaseRefreshLayout;
+import com.module.recyclerlibrary.ui.refresh.EmptyRecyclerView;
+import com.module.recyclerlibrary.ui.refresh.simlpe.SimpleRefreshLayout;
+import com.uas.appworks.R;
+import com.uas.appworks.adapter.BillListAdapter;
+import com.uas.appworks.crm3_0.activity.CustomerDetails3_0Activity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 客户地图分布
+ */
+public class CustomerMapDetailsFragment extends ViewPagerLazyFragment {
+    private final int PAGE_SIZE = 20;
+    private final int LOAD_LIST_DATA = 0x11;
+    private String mCaller;
+    private String mCondition;
+    private int mPageIndex = 1;
+    private MapView mMapView;
+    private SimpleRefreshLayout mRefreshLayout;
+    private RecyclerView mRecyclerView;
+    private UUHttpHelper mUUHttpHelper;
+
+    public static CustomerMapDetailsFragment newInstance(String mCaller, String mCondition) {
+        Bundle args = new Bundle();
+        CustomerMapDetailsFragment fragment = new CustomerMapDetailsFragment();
+        args.putString("mCaller", mCaller);
+        args.putString("mCondition", mCondition);
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    protected int inflateLayoutId() {
+        return R.layout.fragment_customer_map_3_0;
+    }
+
+    @Override
+    protected void LazyData() {
+        Bundle args = getArguments();
+        if (args != null) {
+            mCondition = args.getString("mCondition");
+            mCaller = args.getString("mCaller");
+        }
+        initView();
+    }
+
+    private void initView() {
+        mUUHttpHelper = new UUHttpHelper(CommonUtil.getAppBaseUrl(MyApplication.getInstance()));
+        mMapView = (MapView) findViewById(R.id.mMapView);
+
+        mRefreshLayout = (SimpleRefreshLayout) findViewById(R.id.mRefreshLayout);
+        EmptyRecyclerView mEmptyRecyclerView = (EmptyRecyclerView) findViewById(R.id.mEmptyRecyclerView);
+        mRecyclerView = mEmptyRecyclerView.getRecyclerView();
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(ct));
+
+        mRefreshLayout.setOnRefreshListener(new BaseRefreshLayout.onRefreshListener() {
+            @Override
+            public void onRefresh() {
+                loadListData();
+            }
+
+            @Override
+            public void onLoadMore() {
+                mPageIndex++;
+                loadListData();
+            }
+        });
+        loadListData();
+    }
+
+    private void loadListData() {
+        if (!mRefreshLayout.isRefreshing()) {
+            showProgress();
+        }
+        mUUHttpHelper.requestCompanyHttp(new Parameter.Builder()
+                .record(LOAD_LIST_DATA)
+                .addParams("caller", mCaller)
+                .addParams("condition", mCondition)
+                .mode(Method.GET)
+                .addParams("page", mPageIndex)
+                .addParams("pageSize", PAGE_SIZE)
+                .url("mobile/common/list.action"), mOnSmartHttpListener);
+    }
+
+    private OnSmartHttpListener mOnSmartHttpListener = new OnSmartHttpListener() {
+        @Override
+        public void onSuccess(int what, String message, Tags tag) throws Exception {
+            JSONObject object = JSON.parseObject(message);
+            switch (what) {
+                case LOAD_LIST_DATA:
+                    handlerListData(object);
+                    break;
+            }
+            mRefreshLayout.stopRefresh();
+            dismissProgress();
+        }
+
+        @Override
+        public void onFailure(int what, String message, Tags tag) throws Exception {
+            LogUtil.i("gong", "onFailure=" + message);
+            dismissProgress();
+        }
+    };
+
+    private void handlerListData(JSONObject object) throws Exception {
+        JSONArray columns = JSONUtil.getJSONArray(object, "columns");
+        JSONArray listdata = JSONUtil.getJSONArray(object, "listdata");
+        String keyField = JSONUtil.getText(object, "keyField");
+        String pfField = JSONUtil.getText(object, "pfField");
+        List<BillListGroupModel> groupModels = null;
+        if (!ListUtils.isEmpty(columns) && !ListUtils.isEmpty(listdata)) {
+            groupModels = new ArrayList<>();
+            int index = -1;
+            for (int i = 0; i < listdata.size(); i++) {
+                List<BillListGroupModel.BillListField> billListFields = null;
+                BillListGroupModel groupModel = new BillListGroupModel();
+                JSONObject data = listdata.getJSONObject(i);
+                int id = JSONUtil.getInt(data, keyField);
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject column = columns.getJSONObject(j);
+                    if (JSONUtil.getInt(column, "width") > 0) {
+                        if (billListFields == null) {
+                            billListFields = new ArrayList<>();
+                            index++;
+                        }
+                        String caption = JSONUtil.getText(column, "caption");
+                        String dataIndex = JSONUtil.getText(column, "dataIndex");
+                        String values = JSONUtil.getText(data, dataIndex);
+                        BillListGroupModel.BillListField billListField = new BillListGroupModel.BillListField();
+                        billListField.setId(id);
+                        billListField.setCaption(caption);
+                        billListField.setField(dataIndex);
+                        billListField.setValue(values);
+                        billListField.setGroupIndex(index);
+                        groupModel.setGroupIndex(index);
+                        billListFields.add(billListField);
+                    }
+                }
+                if (!ListUtils.isEmpty(billListFields)) {
+                    groupModel.setBillFields(billListFields);
+                    groupModels.add(groupModel);
+                }
+            }
+        } else if (mPageIndex > 1) {
+            mPageIndex--;
+        }
+        setAdapter(groupModels);
+    }
+
+    private BillListAdapter mListAdapter;
+
+    private void setAdapter(List<BillListGroupModel> groupModels) {
+        if (mListAdapter == null) {
+            mListAdapter = new BillListAdapter(ct, groupModels, new BillListAdapter.OnAdapterListener() {
+                @Override
+                public void onClick(BillListGroupModel.BillListField field) {
+                    startActivity(new Intent(ct, CustomerDetails3_0Activity.class)
+                            .putExtra(Constants.Intents.CALLER, mCaller)
+                            .putExtra(Constants.Intents.TITLE, getActivity().getTitle())
+                            .putExtra(Constants.Intents.ID, field.getId()));
+                }
+            });
+            mRecyclerView.setAdapter(mListAdapter);
+        } else {
+            List<BillListGroupModel> showModels = mListAdapter.getGroupModels();
+            if (ListUtils.isEmpty(showModels)) {
+                showModels = groupModels;
+            } else if (mPageIndex > 1) {
+                showModels.addAll(groupModels);
+            }
+            mListAdapter.updateGroupModels(showModels);
+        }
+    }
+
+}

+ 82 - 4
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/fragment/CustomerMapFragment.java

@@ -1,21 +1,99 @@
 package com.uas.appworks.crm3_0.fragment;
 
 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.view.View;
+import android.view.ViewGroup;
 
+import com.common.LogUtil;
 import com.core.base.EasyFragment;
+import com.core.utils.CommonUtil;
 import com.uas.appworks.R;
 
-/**
- * 客户地图分布
- */
 public class CustomerMapFragment extends EasyFragment {
+
+    private String[] tabTitle;
+    private TabLayout mTabLayout;
+    private ViewPager mViewPager;
+
+
+    public static CustomerListFragment newInstance( ) {
+        Bundle args = new Bundle();
+        CustomerListFragment fragment = new CustomerListFragment();
+
+        fragment.setArguments(args);
+        return fragment;
+    }
+
     @Override
     protected int inflateLayoutId() {
-        return R.layout.fragment_customer_map_3_0;
+        return R.layout.fragment_customer_3_0;
     }
 
     @Override
     protected void onCreateView(Bundle savedInstanceState, boolean createView) {
+        if (createView) {
+            initView(getmRootView());
+        }
+    }
+
+    private void initView(View rootView) {
+        tabTitle = new String[]{getString(R.string.my_responsible), getString(R.string.my_subordinate)};
+        mTabLayout = findViewById(R.id.mTabLayout);
+        mViewPager = findViewById(R.id.mViewPager);
+        mTabLayout.setTabMode(TabLayout.MODE_FIXED);//设置tab模式,当前为系统默认模式
+        for (String tab : tabTitle) {
+            mTabLayout.addTab(mTabLayout.newTab().setText(tab));
+        }
+        ViewPageAdapter mAdapter = new ViewPageAdapter(getActivity().getSupportFragmentManager());
+        mViewPager.setAdapter(mAdapter);//给ViewPager设置适配器
+        mTabLayout.setupWithViewPager(mViewPager);//将TabLayout和ViewPager关联起来。
+
+    }
+
+    private class ViewPageAdapter extends FragmentPagerAdapter {
+
+        public ViewPageAdapter(FragmentManager fm) {
+            super(fm);
+        }
+
+        @Override
+        public void setPrimaryItem(ViewGroup container, int position, Object object) {
+            if (object != null && object instanceof CustomerListDetailsFragment) {
+                //获取当前的fragment
+//                mCurrentFragment = (CustomerListDetailsFragment) object;
+            }
+            super.setPrimaryItem(container, position, object);
+        }
+
+        @Override
+        public Fragment getItem(int position) {
+            String mCaller = "Customer!Base";
+            String mCondition;
+            if (position == 0) {
+                mCondition = "cu_sellercode=\'" + CommonUtil.getEmcode() + "\'";
+            } else {
+                mCondition = "cu_sellercode in ( " +
+                        " select em_code from employee left join job on em_defaulthsid=jo_subof where jo_subof=" +
+                        " (select em_defaulthsid from employee where em_code =\'" + CommonUtil.getEmcode() + "\')" +
+                        ")";
+            }
+            LogUtil.i("gong", "mCaller=" + mCaller);
+            return CustomerMapDetailsFragment.newInstance(mCaller, mCondition);
+        }
+
+        @Override
+        public CharSequence getPageTitle(int position) {
+            return tabTitle[position];
+        }
 
+        @Override
+        public int getCount() {
+            return tabTitle.length;
+        }
     }
 }

+ 170 - 0
app_modular/appworks/src/main/java/com/uas/appworks/presenter/CustomerDetailsPresenter.java

@@ -0,0 +1,170 @@
+package com.uas.appworks.presenter;
+
+import android.content.Context;
+import android.content.Intent;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.common.LogUtil;
+import com.common.data.JSONUtil;
+import com.common.data.ListUtils;
+import com.common.data.StringUtil;
+import com.core.app.Constants;
+import com.core.utils.CommonUtil;
+import com.modular.apputils.listener.OnSmartHttpListener;
+import com.modular.apputils.model.BillGroupModel;
+import com.modular.apputils.network.Parameter;
+import com.modular.apputils.network.Tags;
+import com.modular.apputils.presenter.BaseNetPresenter;
+
+import com.uas.appworks.presenter.imp.ICustomerDetails;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CustomerDetailsPresenter extends BaseNetPresenter {
+    private final int LOAD_FORM = 0x11;//获取配置接口
+
+    private ICustomerDetails iCustomerDetails;
+    private String mCaller;//当前单据的Caller
+    private int mId;//当前单据拥有的id,新增默认为0
+
+    public CustomerDetailsPresenter(Context ct, ICustomerDetails iCustomerDetails) {
+        super(ct);
+        this.iCustomerDetails = iCustomerDetails;
+    }
+
+    @Override
+    public String getBaseUrl() {
+        return CommonUtil.getAppBaseUrl(ct);
+    }
+
+    public void start(Intent intent) {
+        if (intent != null) {
+            mCaller = intent.getStringExtra(Constants.Intents.CALLER);
+            String mTitle = intent.getStringExtra(Constants.Intents.TITLE);
+            mId = intent.getIntExtra(Constants.Intents.ID, 0);
+            if (mTitle != null) {
+                iCustomerDetails.setTitle(mTitle);
+            }
+        }
+        loadFormandGridDetail();
+    }
+
+
+    private void loadFormandGridDetail() {
+        iCustomerDetails.showLoading();
+        requestCompanyHttp(new Parameter.Builder()
+                        .url("mobile/common/getformandgriddata.action")
+                        .addParams("caller", mCaller)
+                        .addParams("id", mId)
+                        .record(LOAD_FORM)
+                , mOnSmartHttpListener);
+    }
+
+
+    private OnSmartHttpListener mOnSmartHttpListener = new OnSmartHttpListener() {
+        @Override
+        public void onSuccess(int what, String message, Tags tag) throws Exception {
+            JSONObject jsonObject = JSON.parseObject(message);
+            switch (what) {
+                case LOAD_FORM:
+                    handlerFormData(JSONUtil.getJSONObject(jsonObject,"datas"));
+                    break;
+
+            }
+            iCustomerDetails.dimssLoading();
+        }
+
+        @Override
+        public void onFailure(int what, String message, Tags tag) throws Exception {
+            iCustomerDetails.dimssLoading();
+            if (JSONUtil.validateJSONObject(message)) {
+                iCustomerDetails.showToast(JSONUtil.getText(message, "exceptionInfo"));
+            } else {
+                iCustomerDetails.showToast(message);
+            }
+
+        }
+    };
+
+    private void handlerFormData(JSONObject datas) throws Exception {
+        List<BillGroupModel> mBillGroupModels = new ArrayList<>();
+        //配置主表
+        JSONArray formdatas = JSONUtil.getJSONArray(datas, "formdata");
+        if (!ListUtils.isEmpty(formdatas)) {
+            JSONObject formdata = formdatas.getJSONObject(0);//主表数据
+            JSONArray formconfigs = JSONUtil.getJSONArray(datas, "formconfigs");//主表配置
+            BillGroupModel mGroupModel = new BillGroupModel();
+            mGroupModel.setForm(true);
+            mGroupModel.setDeleteAble(false);
+            mGroupModel.setGroupIndex(0);
+            mGroupModel.setGroup(" ");
+            handlerModelByObject(mGroupModel, formconfigs, formdata);
+            mBillGroupModels.add(mGroupModel);
+        }
+        JSONArray gridconfigs = JSONUtil.getJSONArray(datas, "gridconfigs");
+        if (!ListUtils.isEmpty(gridconfigs)) {
+            JSONArray griddatas = JSONUtil.getJSONArray(datas, "griddata");
+            for (int i = 0; i < griddatas.size(); i++) {
+                JSONObject griddata = gridconfigs.getJSONObject(i);
+                BillGroupModel mGroupModel = new BillGroupModel();
+                mGroupModel.setForm(false);
+                mGroupModel.setGroupIndex(i + 1);
+                mGroupModel.setGroup("明细表" + mGroupModel.getGroupIndex());
+                mGroupModel.setDeleteAble(false);
+                handlerModelByObject(mGroupModel, gridconfigs, griddata);
+                mBillGroupModels.add(mGroupModel);
+            }
+        }
+        LogUtil.i("gong", "mBillGroupModels=" + JSON.toJSONString(mBillGroupModels));
+        iCustomerDetails.setAdapter(mBillGroupModels);
+    }
+
+    private void handlerModelByObject(BillGroupModel mGroupModel, JSONArray configs, JSONObject object) {
+        for (int i = 0; i < configs.size(); i++) {
+            JSONObject config = configs.getJSONObject(i);
+            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");
+            String dbFind = JSONUtil.getText(config, "FD_DBFIND", "DG_TYPE");
+            int isdefault = JSONUtil.getInt(config, "MFD_ISDEFAULT", "MDG_ISDEFAULT");
+            int appwidth = JSONUtil.getInt(config, "FD_APPWIDTH", "DG_APPWIDTH");
+            String findFunctionName = JSONUtil.getText(config, "DG_FINDFUNCTIONNAME");
+            String allowBlank = JSONUtil.getText(config, "FD_ALLOWBLANK", "DG_ALLOWBLANK");
+            String logicType = JSONUtil.getText(config, "FD_LOGICTYPE", "DG_LOGICTYPE");
+            JSONArray combostore = JSONUtil.getJSONArray(config, "COMBOSTORE");//本地值
+            BillGroupModel.BillModel mBillModel = new BillGroupModel.BillModel();
+            mBillModel.setFindFunctionName(findFunctionName);
+            mBillModel.setCaption(caption);
+            mBillModel.setAppwidth(appwidth);
+            mBillModel.setIsdefault(isdefault);
+            mBillModel.setDbfind(dbFind);
+            mBillModel.setType(type);
+            mBillModel.setLogicType(logicType);
+            mBillModel.setField(field);
+            mBillModel.setAllowBlank(allowBlank);
+            mBillModel.setValue(JSONUtil.getText(object, field));
+            if (!ListUtils.isEmpty(combostore)) {
+                List<BillGroupModel.LocalData> localDatas = new ArrayList<>();
+                for (int j = 0; j < combostore.size(); j++) {
+                    JSONObject combosModel = combostore.getJSONObject(j);
+                    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 (mBillModel.getIsdefault() == -1 && !mBillModel.getType().equals("H")) {
+                mGroupModel.addShow(mBillModel);
+            } else {
+                mGroupModel.addHide(mBillModel);
+            }
+
+        }
+    }
+}

+ 10 - 0
app_modular/appworks/src/main/java/com/uas/appworks/presenter/imp/ICustomerDetails.java

@@ -0,0 +1,10 @@
+package com.uas.appworks.presenter.imp;
+
+import com.core.base.HttpImp;
+import com.modular.apputils.model.BillGroupModel;
+
+import java.util.List;
+
+public interface  ICustomerDetails extends HttpImp {
+    void setAdapter(List<BillGroupModel> groupModels);
+}

+ 8 - 0
app_modular/appworks/src/main/res/color/color_public_customer_tab.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@color/customer_tab_selected" android:state_checked="true" />
+    <item android:color="@color/customer_tab_selected" android:state_pressed="true" />
+    <item android:color="@color/customer_tab_selected" android:state_selected="true" />
+
+    <item android:color="@color/main_text_color" />
+</selector>

BIN
app_modular/appworks/src/main/res/drawable-hdpi/ic_customer_list.png


BIN
app_modular/appworks/src/main/res/drawable-hdpi/ic_customer_list_pass.png


BIN
app_modular/appworks/src/main/res/drawable-hdpi/ic_customer_map.png


BIN
app_modular/appworks/src/main/res/drawable-hdpi/ic_customer_map_pass.png


BIN
app_modular/appworks/src/main/res/drawable-xhdpi/ic_customer_list.png


BIN
app_modular/appworks/src/main/res/drawable-xhdpi/ic_customer_list_pass.png


BIN
app_modular/appworks/src/main/res/drawable-xhdpi/ic_customer_map.png


BIN
app_modular/appworks/src/main/res/drawable-xhdpi/ic_customer_map_pass.png


BIN
app_modular/appworks/src/main/res/drawable-xxhdpi/ic_customer_list.png


BIN
app_modular/appworks/src/main/res/drawable-xxhdpi/ic_customer_list_pass.png


BIN
app_modular/appworks/src/main/res/drawable-xxhdpi/ic_customer_map.png


BIN
app_modular/appworks/src/main/res/drawable-xxhdpi/ic_customer_map_pass.png


+ 0 - 24
app_modular/appworks/src/main/res/drawable/ic_customer_list.xml

@@ -1,24 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportHeight="13"
-    android:viewportWidth="16">
-    <path
-        android:fillColor="#878787"
-        android:fillType="evenOdd"
-        android:pathData="M1.5,0L14.5,0A1.5,1.5 0,0 1,16 1.5L16,1.5A1.5,1.5 0,0 1,14.5 3L1.5,3A1.5,1.5 0,0 1,0 1.5L0,1.5A1.5,1.5 0,0 1,1.5 0z"
-        android:strokeColor="#00000000"
-        android:strokeWidth="1" />
-    <path
-        android:fillColor="#878787"
-        android:fillType="evenOdd"
-        android:pathData="M1.5,5L14.5,5A1.5,1.5 0,0 1,16 6.5L16,6.5A1.5,1.5 0,0 1,14.5 8L1.5,8A1.5,1.5 0,0 1,0 6.5L0,6.5A1.5,1.5 0,0 1,1.5 5z"
-        android:strokeColor="#00000000"
-        android:strokeWidth="1" />
-    <path
-        android:fillColor="#878787"
-        android:fillType="evenOdd"
-        android:pathData="M1.5,10L14.5,10A1.5,1.5 0,0 1,16 11.5L16,11.5A1.5,1.5 0,0 1,14.5 13L1.5,13A1.5,1.5 0,0 1,0 11.5L0,11.5A1.5,1.5 0,0 1,1.5 10z"
-        android:strokeColor="#00000000"
-        android:strokeWidth="1" />
-</vector>

+ 8 - 0
app_modular/appworks/src/main/res/drawable/selector_customer_list.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:drawable="@drawable/ic_customer_list_pass" android:state_checked="true" />
+    <item android:drawable="@drawable/ic_customer_list" android:state_checked="false" />
+    <item android:drawable="@drawable/ic_customer_list" />
+
+</selector>

+ 8 - 0
app_modular/appworks/src/main/res/drawable/selector_customer_map.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:drawable="@drawable/ic_customer_map_pass" android:state_checked="true" />
+    <item android:drawable="@drawable/ic_customer_map" android:state_checked="false" />
+    <item android:drawable="@drawable/ic_customer_map" />
+
+</selector>

+ 39 - 0
app_modular/appworks/src/main/res/layout/activity_customer_details_3_0.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.core.widget.CustomerScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusableInTouchMode="true">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:focusableInTouchMode="true"
+        android:orientation="vertical">
+
+        <com.core.widget.MyListView
+            android:id="@+id/mListView"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:divider="@color/item_line"
+            android:dividerHeight="@dimen/line"
+            android:focusableInTouchMode="false" />
+
+        <android.support.design.widget.TabLayout
+            android:id="@+id/mTabLayout"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:background="@color/white"
+            app:tabIndicatorColor="#33A2EE"
+            app:tabIndicatorHeight="4dp"
+            app:tabSelectedTextColor="#1084D1"
+            app:tabTextColor="#666666" />
+
+        <android.support.v4.view.ViewPager
+            android:id="@+id/mViewPager"
+            android:layout_width="match_parent"
+            android:layout_height="200dp"
+            android:layout_marginTop="@dimen/padding" />
+    </LinearLayout>
+
+</com.core.widget.CustomerScrollView>

+ 22 - 13
app_modular/appworks/src/main/res/layout/activity_customer_list_3_0.xml

@@ -1,15 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:orientation="vertical"
     android:layout_height="match_parent">
-    <FrameLayout
-        android:id="@+id/customerFl"
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1"/>
     <com.modular.apputils.widget.DivideRadioGroup
         android:id="@+id/tabBottomRg"
+        android:layout_alignParentBottom="true"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:background="@color/white"
@@ -22,12 +17,12 @@
             android:layout_weight="1"
             android:button="@null"
             android:checked="true"
-            android:drawableTop="@drawable/ic_customer_list"
+            android:drawableTop="@drawable/selector_customer_list"
             android:gravity="center"
             android:padding="@dimen/padding"
             android:text="客户列表"
-            android:textColor="@color/color_public_inquiry_quote"
-            android:textSize="15sp" />
+            android:textColor="@color/color_public_customer_tab"
+            android:textSize="12sp" />
 
         <View
             android:layout_width="@dimen/line"
@@ -40,15 +35,29 @@
             android:layout_height="wrap_content"
             android:layout_weight="1"
             android:button="@null"
+            android:checked="false"
+            android:drawableTop="@drawable/selector_customer_map"
             android:gravity="center"
             android:padding="@dimen/padding"
             android:text="地图分布"
-            android:textColor="@color/color_public_inquiry_quote"
-            android:textSize="15sp" />
+            android:textColor="@color/color_public_customer_tab"
+            android:textSize="12sp" />
 
     </com.modular.apputils.widget.DivideRadioGroup>
 
+    <FrameLayout
+        android:id="@+id/customerFl"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginBottom="@dimen/line"
+        android:layout_above="@id/tabBottomRg" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/line"
+        android:layout_above="@id/tabBottomRg"
+        android:background="@color/item_line" />
 
 
 
-</LinearLayout>
+</RelativeLayout>

+ 5 - 4
app_modular/appworks/src/main/res/layout/fragment_customer_list_3_0.xml

@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<com.module.recyclerlibrary.ui.refresh.simlpe.SimpleRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
+    android:id="@+id/mRefreshLayout"
     android:layout_height="match_parent">
 
-    <android.support.v7.widget.RecyclerView
-        android:id="@+id/mRecyclerView"
+    <com.module.recyclerlibrary.ui.refresh.EmptyRecyclerView
+        android:id="@+id/mEmptyRecyclerView"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
 
-</RelativeLayout>
+</com.module.recyclerlibrary.ui.refresh.simlpe.SimpleRefreshLayout>

+ 17 - 16
app_modular/appworks/src/main/res/layout/fragment_customer_map_3_0.xml

@@ -1,26 +1,27 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:orientation="vertical">
 
-    <android.support.design.widget.TabLayout
-        android:id="@+id/mTabLayout"
+    <com.baidu.mapapi.map.MapView
+        android:id="@+id/mMapView"
         android:layout_width="match_parent"
-        android:layout_height="40dp"
-        android:background="@color/white"
-        app:tabIndicatorColor="#33A2EE"
-        app:tabIndicatorHeight="4dp"
-        app:tabSelectedTextColor="#1084D1"
-        app:tabTextColor="#666666" />
+        android:layout_height="0dp"
+        android:layout_weight="2" />
 
-    <android.support.v4.view.ViewPager
-        android:id="@+id/mViewPager"
+    <com.module.recyclerlibrary.ui.refresh.simlpe.SimpleRefreshLayout
+        android:id="@+id/mRefreshLayout"
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:layout_marginTop="@dimen/padding"
-        android:background="@color/white"
-        app:layout_constraintTop_toBottomOf="@id/mTabLayout" />
+        android:layout_weight="3">
+
+        <com.module.recyclerlibrary.ui.refresh.EmptyRecyclerView
+            android:id="@+id/mEmptyRecyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
 
+    </com.module.recyclerlibrary.ui.refresh.simlpe.SimpleRefreshLayout>
 
-</android.support.constraint.ConstraintLayout>
+</LinearLayout>

+ 24 - 0
app_modular/appworks/src/main/res/layout/item_customer_bill_add_contact.xml

@@ -0,0 +1,24 @@
+<?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="wrap_content"
+    android:background="@color/white"
+    android:orientation="horizontal"
+    android:padding="@dimen/padding"
+    android:layout_marginTop="@dimen/paddingMin"
+    android:weightSum="2">
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="保存后继续新增联系人"
+        android:textColor="#FF333333"
+        android:textSize="15sp" />
+
+    <com.core.widget.view.SwitchView
+        android:id="@+id/saveContactSv"
+        android:layout_width="40dp"
+        android:layout_height="25dp"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true" />
+</RelativeLayout>

+ 54 - 0
app_modular/appworks/src/main/res/layout/item_customer_details_3_0.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="left"
+        android:layout_weight="1"
+        android:drawablePadding="5dp"
+        android:text="基本信息"
+        android:visibility="gone"
+        android:textColor="@color/titleBlue"
+        android:textSize="@dimen/text_main" />
+
+    <android.support.constraint.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@color/white"
+        android:maxHeight="180dp"
+        android:minHeight="50dp"
+        android:padding="@dimen/padding">
+
+        <TextView
+            android:id="@+id/captionTv"
+            android:layout_width="60dp"
+            android:layout_height="wrap_content"
+            android:text="商机阶段"
+            android:textColor="@color/text_hine"
+            android:textSize="@dimen/text_hine"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+
+        <TextView
+            android:id="@+id/valuesTv"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_marginLeft="@dimen/padding"
+            android:background="@null"
+            android:gravity="right|center"
+            android:textColor="@color/text_main"
+            android:textSize="@dimen/text_hine"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toRightOf="@id/captionTv"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+    </android.support.constraint.ConstraintLayout>
+</LinearLayout>

+ 1 - 1
app_modular/appworks/src/main/res/layout/item_customer_list_details_list.xml

@@ -8,7 +8,7 @@
         android:id="@+id/lineView"
         android:layout_width="match_parent"
         android:layout_height="@dimen/padding"
-        android:background="@color/linen"/>
+        android:background="@color/item_line"/>
 
     <LinearLayout
         style="@style/approvalStyle"