Browse Source

审批详情变更处理人去掉审批意见必填的限制

RaoMeng 5 years ago
parent
commit
d1b9b147d8
100 changed files with 2389 additions and 1200 deletions
  1. 8 3
      WeiChat/build.gradle
  2. 17 23
      WeiChat/src/main/AndroidManifest.xml
  3. 4 4
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/MainActivity.java
  4. 0 5
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/PushNetMessageReceiver.java
  5. 5 2
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/WebViewCommActivity.java
  6. 3 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/WebViewLoadActivity.java
  7. 4 2
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/me/MeFragment.java
  8. BIN
      WeiChat/src/main/jniLibs/armeabi-v7a/libbdpush_V2_4.so
  9. BIN
      WeiChat/src/main/jniLibs/armeabi-v7a/libbdpush_V2_7.so
  10. BIN
      WeiChat/src/main/jniLibs/armeabi/libbdpush_V2_4.so
  11. BIN
      WeiChat/src/main/jniLibs/armeabi/libbdpush_V2_7.so
  12. BIN
      WeiChat/src/main/jniLibs/mips/libbdpush_V2_4.so
  13. BIN
      WeiChat/src/main/jniLibs/mips/libbdpush_V2_7.so
  14. BIN
      WeiChat/src/main/jniLibs/mips64/libbdpush_V2_4.so
  15. BIN
      WeiChat/src/main/jniLibs/mips64/libbdpush_V2_7.so
  16. BIN
      WeiChat/src/main/jniLibs/x86/libbdpush_V2_4.so
  17. BIN
      WeiChat/src/main/jniLibs/x86/libbdpush_V2_7.so
  18. BIN
      WeiChat/src/main/jniLibs/x86_64/libbdpush_V2_4.so
  19. BIN
      WeiChat/src/main/jniLibs/x86_64/libbdpush_V2_7.so
  20. 0 64
      WeiChat/src/main/res/layout/listitem_businessless_edit.xml
  21. 3 3
      WeiChat/version.properties
  22. BIN
      app_core/common/libs/pushservice-5.3.0.99.jar
  23. 15 12
      app_core/common/src/main/AndroidManifest.xml
  24. 9 0
      app_core/common/src/main/assets/work_menu.json
  25. 1 0
      app_core/common/src/main/java/com/common/data/RegexUtil.java
  26. 10 3
      app_core/common/src/main/java/com/core/app/ActionBackActivity.java
  27. 0 3
      app_core/common/src/main/java/com/core/app/AppConstant.java
  28. 6 1
      app_core/common/src/main/java/com/core/app/Constants.java
  29. 4 0
      app_core/common/src/main/java/com/core/base/HttpImp.java
  30. 1 1
      app_core/common/src/main/java/com/core/base/OABaseActivity.java
  31. 8 3
      app_core/common/src/main/java/com/core/model/Approval.java
  32. 3 0
      app_core/common/src/main/java/com/core/net/http/ViewUtil.java
  33. 8 6
      app_core/common/src/main/java/com/core/utils/CommonUtil.java
  34. 29 6
      app_core/common/src/main/java/com/core/widget/view/Activity/CommonWebviewActivity.java
  35. 5 3
      app_core/common/src/main/java/com/core/widget/view/Activity/SelectActivity.java
  36. BIN
      app_core/common/src/main/res/drawable-hdpi/ic_scan_gray.png
  37. BIN
      app_core/common/src/main/res/drawable-xhdpi/ic_scan_gray.png
  38. BIN
      app_core/common/src/main/res/drawable-xxhdpi/ic_scan_gray.png
  39. 3 3
      app_core/common/src/main/res/drawable/shape_from_edit.xml
  40. 12 5
      app_core/common/src/main/res/layout/action_data_inquiry_list.xml
  41. 17 18
      app_core/common/src/main/res/layout/activity_data_inquiry_list.xml
  42. 1 1
      app_core/common/src/main/res/layout/item_businessless_edit.xml
  43. 9 9
      app_core/common/src/main/res/layout/listitem_businessless_edit.xml
  44. 23 22
      app_core/common/src/main/res/layout/listitem_form_edit.xml
  45. 1 1
      app_core/common/src/main/res/values/dimens.xml
  46. 1 1
      app_core/network/src/main/java/com/me/network/app/base/HttpCallback.java
  47. 18 0
      app_core/network/src/main/java/com/me/network/app/base/HttpParams.java
  48. 34 5
      app_core/network/src/main/java/com/me/network/app/http/HttpRequest.java
  49. 1 1
      app_modular/appmessages/src/main/AndroidManifest.xml
  50. 3 0
      app_modular/appmessages/src/main/java/com/modular/appmessages/activity/AppWebViewActivity.java
  51. 79 5
      app_modular/appmessages/src/main/java/com/modular/appmessages/activity/ApprovalActivity.java
  52. 22 8
      app_modular/appmessages/src/main/java/com/modular/appmessages/activity/MsgThirdWebActivity.java
  53. 8 5
      app_modular/appmessages/src/main/java/com/modular/appmessages/activity/MsgsSecondCommonActivity.java
  54. 0 147
      app_modular/appmessages/src/main/java/com/modular/appmessages/activity/RealTimeFormActivity.java
  55. 4 0
      app_modular/appmessages/src/main/java/com/modular/appmessages/adapter/ApprovalAdapter.java
  56. 0 86
      app_modular/appmessages/src/main/java/com/modular/appmessages/adapter/RealTimeFormMenuAdapter.java
  57. 0 37
      app_modular/appmessages/src/main/java/com/modular/appmessages/model/RealTimeFormMenuBean.java
  58. 1 1
      app_modular/appmessages/src/main/java/com/modular/appmessages/presenter/MessagePresenter.java
  59. 0 40
      app_modular/appmessages/src/main/res/layout/activity_real_time_form.xml
  60. 0 34
      app_modular/appmessages/src/main/res/layout/item_grid_real_time_form_menu.xml
  61. 126 2
      app_modular/apputils/src/main/java/com/modular/apputils/activity/BillDetailsActivity.java
  62. 147 21
      app_modular/apputils/src/main/java/com/modular/apputils/activity/BillInputActivity.java
  63. 3 2
      app_modular/apputils/src/main/java/com/modular/apputils/activity/SelectNetAcitivty.java
  64. 239 105
      app_modular/apputils/src/main/java/com/modular/apputils/adapter/BillAdapter.java
  65. 169 85
      app_modular/apputils/src/main/java/com/modular/apputils/adapter/BillDetailsAdapter.java
  66. 1 1
      app_modular/apputils/src/main/java/com/modular/apputils/adapter/BillUpdateAdapter.java
  67. 52 7
      app_modular/apputils/src/main/java/com/modular/apputils/model/BillGroupModel.java
  68. 6 1
      app_modular/apputils/src/main/java/com/modular/apputils/network/FileDownloader.java
  69. 218 19
      app_modular/apputils/src/main/java/com/modular/apputils/presenter/BillDetailsPresenter.java
  70. 305 129
      app_modular/apputils/src/main/java/com/modular/apputils/presenter/BillPresenter.java
  71. 5 2
      app_modular/apputils/src/main/java/com/modular/apputils/presenter/imp/IBill.java
  72. 8 0
      app_modular/apputils/src/main/java/com/modular/apputils/presenter/imp/IBillDetails.java
  73. 43 1
      app_modular/apputils/src/main/res/layout/activity_bill_details.xml
  74. 14 7
      app_modular/apputils/src/main/res/layout/activity_bill_input.xml
  75. 15 2
      app_modular/apputils/src/main/res/layout/item_bill_details.xml
  76. 15 15
      app_modular/apputils/src/main/res/layout/item_bill_enclosure.xml
  77. 5 0
      app_modular/apputils/src/main/res/menu/menu_input_update.xml
  78. 1 0
      app_modular/apputils/src/main/res/values-en/strings.xml
  79. 1 0
      app_modular/apputils/src/main/res/values-zh-rCN/strings.xml
  80. 1 0
      app_modular/apputils/src/main/res/values-zh-rTW/strings.xml
  81. 2 0
      app_modular/apputils/src/main/res/values/color.xml
  82. 1 0
      app_modular/apputils/src/main/res/values/ids.xml
  83. 1 0
      app_modular/apputils/src/main/res/values/strings.xml
  84. 42 20
      app_modular/appworks/src/main/AndroidManifest.xml
  85. 0 4
      app_modular/appworks/src/main/java/com/uas/appworks/CRM/erp/activity/DeviceDataFormAddActivity.java
  86. 62 36
      app_modular/appworks/src/main/java/com/uas/appworks/CRM/erp/activity/DeviceManageActivity.java
  87. 4 2
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/CommonDocDetailsActivity.java
  88. 10 7
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/form/DataFormDetailActivity.java
  89. 3 0
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/form/TravelDataFormDetailActivity.java
  90. 3 0
      app_modular/appworks/src/main/java/com/uas/appworks/activity/CommonDataFormActivity.java
  91. 175 86
      app_modular/appworks/src/main/java/com/uas/appworks/activity/DeviceQueryActivity.java
  92. 2 1
      app_modular/appworks/src/main/java/com/uas/appworks/activity/businessManage/businessChangeStage/BusinessChangeStagePresenterImpl.java
  93. 6 5
      app_modular/appworks/src/main/java/com/uas/appworks/activity/businessManage/businessManageHome/BusinessManageHomeActivity.java
  94. 0 2
      app_modular/appworks/src/main/java/com/uas/appworks/adapter/DeviceQueryConditionAdapter.java
  95. 10 0
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/BillInputBindActivity.java
  96. 5 5
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerManageActivity.java
  97. 228 6
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerVisitDetailsActivity.java
  98. 2 0
      app_modular/appworks/src/main/java/com/uas/appworks/datainquiry/Constants.java
  99. 77 12
      app_modular/appworks/src/main/java/com/uas/appworks/datainquiry/activity/ReportQuerySearchActivity.java
  100. 2 42
      app_modular/appworks/src/main/java/com/uas/appworks/datainquiry/activity/ReportStatisticsActivity.java

+ 8 - 3
WeiChat/build.gradle

@@ -52,7 +52,6 @@ def getVersionCode() {
 
 
 android {
-    
     def versionArray = getVersionCode()
     //====================Add below two line=============
     dexOptions {
@@ -104,6 +103,12 @@ android {
         abortOnError false
     }
 
+    sourceSets {
+        main {
+            jniLibs.srcDirs = ['src/main/jniLibs']
+        }
+    }
+
     packagingOptions {
         exclude 'META-INF/LICENSE.txt'
         exclude 'META-INF/NOTICE.txt'
@@ -157,10 +162,10 @@ android {
         }
     }*/
 
-  
+
 }
 
-repositories{
+repositories {
     flatDir {
         dirs 'libs'
     }

+ 17 - 23
WeiChat/src/main/AndroidManifest.xml

@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
-<manifest package="com.xzjmyk.pm.activity"
-          xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
-          android:versionCode="158"
-          android:versionName="6.1.9">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="com.xzjmyk.pm.activity"
+    android:versionCode="158"
+    android:versionName="6.1.9">
 
     <uses-sdk
-        android:minSdkVersion="11"
-        android:targetSdkVersion="22" />
+        android:minSdkVersion="17"
+        android:targetSdkVersion="26" />
     <!-- share umeng -->
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
@@ -71,12 +71,11 @@
     <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
     <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
 
-    <!-- 适配Android N系统必需的ContentProvider写权限声明,写权限包含应用包名 -->
-    <!-- <uses-permission android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.baidu.push.example" /> -->
-    <!-- <permission -->
-    <!-- android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.baidu.push.example" -->
-    <!-- android:protectionLevel="normal"> -->
-    <!-- </permission> -->
+    <!-- 适配Android N系统必需的ContentProvider写权限声明,写权限包含应用包名-->
+    <uses-permission android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.xzjmyk.pm.activity" />
+    <permission
+        android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.xzjmyk.pm.activity"
+        android:protectionLevel="signature"></permission>
 
     <!-- 百度自动更新 -->
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -375,8 +374,7 @@
 
 
         <activity android:name=".video.VideoRecordActivity" />
-        <activity
-            android:name="com.uas.appme.other.activity.CardcastActivity" />
+        <activity android:name="com.uas.appme.other.activity.CardcastActivity" />
         <activity
             android:name="com.uas.appme.other.activity.BasicInfoEditActivity"
             android:windowSoftInputMode="stateHidden|stateAlwaysHidden" />
@@ -522,10 +520,10 @@
         <!-- 百度 -->
         <meta-data
             android:name="BDAPPID"
-            android:value="7178311" />
+            android:value="10537889" />
         <meta-data
             android:name="BDAPPKEY"
-            android:value="EmEVqG9NiKchcSbkoGkiyG2F2rp8YNmf" />
+            android:value="bCH2mzKcIjefS9PvqwDdBrNBGSWrHETK" />
         <!-- <meta-data -->
         <!-- android:name="BDAPPID" -->
         <!-- android:value="8037149" /> -->
@@ -556,8 +554,7 @@
         <!--</intent-filter>-->
         <!--</receiver>-->
 
-        <activity
-            android:name=".video.VideoActivity" />
+        <activity android:name=".video.VideoActivity" />
         <activity
             android:name=".ui.erp.activity.CompanyActivity"
             android:hardwareAccelerated="true" />
@@ -767,14 +764,12 @@
         </service>
         <!-- </service> -->
 
-
         <!-- 4.4版本新增的CommandService声明,提升小米和魅族手机上的实际推送到达率 -->
         <service
             android:name="com.baidu.android.pushservice.CommandService"
             android:exported="true" />
         <!-- push结束 -->
 
-
         <!-- 适配Android N系统必需的ContentProvider声明,写权限包含应用包名 -->
         <provider
             android:name="com.baidu.android.pushservice.PushInfoProvider"
@@ -803,7 +798,6 @@
         <!-- push应用定义消息receiver声明 -->
         <receiver android:name=".ui.PushNetMessageReceiver">
             <intent-filter android:priority="1000">
-
                 <!-- 接收push消息 -->
                 <action android:name="com.baidu.android.pushservice.action.MESSAGE" />
                 <!-- 接收bind,unbind,fetch,delete等反馈消息 -->
@@ -821,7 +815,7 @@
 
         <meta-data
             android:name="api_key"
-            android:value="EmEVqG9NiKchcSbkoGkiyG2F2rp8YNmf" />
+            android:value="bCH2mzKcIjefS9PvqwDdBrNBGSWrHETK" />
         <!-- 百度推送相关结束 -->
 
 

+ 4 - 4
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/MainActivity.java

@@ -601,7 +601,7 @@ public class MainActivity extends BaseActivity implements ImStatusListener, NetW
         SIP_SERVER_HOST = host == null ? "120.24.211.24" : host;
         PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY,
                 CommonUtil.getMetaValue(this, "api_key"));
-        int isPush = PreferenceUtils.getInt(MyApplication.getInstance(), AppConstant.BAIDU_PUSH);
+        int isPush = PreferenceUtils.getInt(MyApplication.getInstance(), com.core.app.Constants.BAIDU_PUSH, 1);
         if (isPush == 0) {
             PushManager.stopWork(this);
         }
@@ -923,10 +923,10 @@ public class MainActivity extends BaseActivity implements ImStatusListener, NetW
                 cal.set(Calendar.MILLISECOND, 0);
                 long startcal = cal.getTimeInMillis();
                 long endcal = cal.getTimeInMillis() + 24 * 60 * 60 * 1000;
-                List<Schedule> systemSchedule =null;
-                try{
+                List<Schedule> systemSchedule = null;
+                try {
                     ScheduleUtils.getSystemCalendar(MyApplication.getInstance(), startcal, endcal);
-                }catch (Exception e){
+                } catch (Exception e) {
 
                 }
                 for (int i = 0; i < dataArray.size(); i++) {

+ 0 - 5
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/PushNetMessageReceiver.java

@@ -59,7 +59,6 @@ public class PushNetMessageReceiver extends PushMessageReceiver {
 
             @Override
             public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
-                // TODO Auto-generated method stub
                 Log.d("wang", "上传channelId成功了");
             }
 
@@ -176,15 +175,11 @@ public class PushNetMessageReceiver extends PushMessageReceiver {
 
     @Override
     public void onSetTags(Context arg0, int arg1, List<String> arg2, List<String> arg3, String arg4) {
-        // TODO Auto-generated method stub
 
     }
 
     @Override
     public void onUnbind(Context arg0, int arg1, String arg2) {
-
         Log.i("wang", arg1 + "++++++" + arg2);
     }
-
-
 }

+ 5 - 2
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/WebViewCommActivity.java

@@ -94,7 +94,7 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
     private String mSubsAct;
     private int mPosition;
 
-    private String mSubsurl;
+    private String mSubsurl, mWhichPage;
     private TextView mPreTv;
     private TextView mNextTv;
     private List<Object> mReadSubs;
@@ -156,6 +156,7 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
         pb.setMax(100);
         url = intent.getStringExtra("url");
         mSubsurl = intent.getStringExtra("url");
+        mWhichPage = intent.getStringExtra("whichPage");
         isCookie = intent.getBooleanExtra("cookie", false);
         String msg_title = intent.getStringExtra("title");
         if (!StringUtil.isEmpty(msg_title)) {
@@ -555,7 +556,9 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
 
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
-        getMenuInflater().inflate(R.menu.menu_about, menu);
+        if (!"real_time".equals(mWhichPage)) {
+            getMenuInflater().inflate(R.menu.menu_about, menu);
+        }
         return true;
     }
 

+ 3 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/WebViewLoadActivity.java

@@ -61,6 +61,9 @@ public class WebViewLoadActivity extends BaseActivity {
                         String sessionId = FlexJsonUtil.fromJson(result).get("sessionId").toString();
                         String erpaccount = FlexJsonUtil.fromJson(result).get("erpaccount").toString();
                         String url = bundle.getString("url");
+                        if (url != null) {
+                            url = url.trim();
+                        }
                         String uu = bundle.getString("uu");
                         String master = bundle.getString("master");
                         String name = bundle.getString("name");

+ 4 - 2
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/me/MeFragment.java

@@ -193,7 +193,9 @@ public class MeFragment extends EasyFragment implements View.OnClickListener, On
                         LogUtil.i("extrajaSperurl=" + extrajaSperurl);
                         CommonUtil.setSharedPreferences(ct, "erp_uu", String.valueOf(results.get("uu")));
                         CommonUtil.setSharedPreferences(ct, "sessionId", sessionId);
+                        CommonUtil.setSharedPreferences(ct, "erp_emname", String.valueOf(results.get("emname")));
                         CommonUtil.setSharedPreferences(ct, "erp_master", master);
+                        CommonUtil.setSharedPreferences(ct, "erp_username", String.valueOf(results.get("erpaccount")));
                         CommonUtil.setSharedPreferences(ct, "Master_ch", master_ch);
                         master_tv.setText(master_ch);
                         // 发送给主页刷新的广播
@@ -321,7 +323,7 @@ public class MeFragment extends EasyFragment implements View.OnClickListener, On
         workCardRl.setVisibility(View.VISIBLE);
         workCardRl.setOnClickListener(this);
         workCardRedTv = findViewById(R.id.workCardRedTv);
-        workCardRedTv.setVisibility(RedSpUtil.api().getBoolean("workCardClicked",false)?View.GONE:View.VISIBLE);
+        workCardRedTv.setVisibility(RedSpUtil.api().getBoolean("workCardClicked", false) ? View.GONE : View.VISIBLE);
 
         findViewById(R.id.my_friend_rl).setOnClickListener(this);
         findViewById(R.id.my_space_rl).setOnClickListener(this);
@@ -508,7 +510,7 @@ public class MeFragment extends EasyFragment implements View.OnClickListener, On
         switch (id) {
             case R.id.workCardRl:
                 workCardRedTv.setVisibility(View.GONE);
-                RedSpUtil.api().put("workCardClicked",true);
+                RedSpUtil.api().put("workCardClicked", true);
                 startActivity(new Intent(ct, WorkCardActivity.class));
                 break;
             case R.id.rl_company_change://公司切换

BIN
WeiChat/src/main/jniLibs/armeabi-v7a/libbdpush_V2_4.so


BIN
WeiChat/src/main/jniLibs/armeabi-v7a/libbdpush_V2_7.so


BIN
WeiChat/src/main/jniLibs/armeabi/libbdpush_V2_4.so


BIN
WeiChat/src/main/jniLibs/armeabi/libbdpush_V2_7.so


BIN
WeiChat/src/main/jniLibs/mips/libbdpush_V2_4.so


BIN
WeiChat/src/main/jniLibs/mips/libbdpush_V2_7.so


BIN
WeiChat/src/main/jniLibs/mips64/libbdpush_V2_4.so


BIN
WeiChat/src/main/jniLibs/mips64/libbdpush_V2_7.so


BIN
WeiChat/src/main/jniLibs/x86/libbdpush_V2_4.so


BIN
WeiChat/src/main/jniLibs/x86/libbdpush_V2_7.so


BIN
WeiChat/src/main/jniLibs/x86_64/libbdpush_V2_4.so


BIN
WeiChat/src/main/jniLibs/x86_64/libbdpush_V2_7.so


+ 0 - 64
WeiChat/src/main/res/layout/listitem_businessless_edit.xml

@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <LinearLayout
-        android:id="@+id/ll_moment"
-        style="@style/LinearLayout_horizontal"
-        android:layout_height="wrap_content"
-        android:background="@color/white"
-        android:maxHeight="180dp"
-        android:paddingRight="@dimen/padding"
-        android:minHeight="50dp">
-
-        <TextView
-            android:id="@+id/tv_less_key"
-            style="@style/TextView_Basic"
-            android:layout_width="wrap_content"
-            android:maxWidth="60dp"
-            android:layout_gravity="center_vertical"
-            android:layout_marginBottom="10dp"
-            android:layout_marginLeft="10dp"
-            android:layout_marginRight="3dp"
-            android:layout_marginTop="10dp"
-            android:text="商机阶段商机阶段阶段:"
-            android:textColor="@color/text_main"
-            android:textSize="14sp" />
-
-        <TextView
-            android:id="@+id/muchInputTv"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="10dp"
-            android:text="*"
-            android:textColor="@color/red"
-            android:visibility="gone" />
-
-        <EditText
-            android:id="@+id/tv_less_value"
-            style="@style/TextView_Basic"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_gravity="center_vertical"
-            android:layout_marginLeft="@dimen/padding"
-            android:layout_weight="1"
-            android:background="@drawable/shape_from_edit"
-            android:gravity="right|center"
-            android:hint="@string/common_input"
-            android:maxHeight="150dp"
-            android:maxWidth="260dp"
-            android:minWidth="240dp"
-            android:padding="5dp"
-            android:textSize="14sp" />
-
-        <ImageView
-            android:id="@+id/selectIv"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:src="@drawable/oa_next"
-            android:visibility="gone" />
-    </LinearLayout>
-</LinearLayout>

+ 3 - 3
WeiChat/version.properties

@@ -1,5 +1,5 @@
-#Mon Aug 26 17:28:30 CST 2019
+#Tue Dec 31 14:04:12 CST 2019
 debugName=972
-versionName=695
+versionName=712
 debugCode=972
-versionCode=250
+versionCode=266

BIN
app_core/common/libs/pushservice-5.3.0.99.jar


+ 15 - 12
app_core/common/src/main/AndroidManifest.xml

@@ -2,8 +2,9 @@
     package="com.core.app">
 
 
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
-    <uses-permission android:name="android.permission.CALL_PHONE"/>
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.CALL_PHONE" />
+
     <application
         android:allowBackup="true"
         android:label="@string/app_name"
@@ -11,21 +12,23 @@
 
 
         <activity
-            android:configChanges="keyboardHidden|orientation"
-            android:name="com.core.widget.view.Activity.CommonWebviewActivity"/>
-        <activity android:name="com.core.widget.view.Activity.ImgFileListActivity"
-            android:label="相册列表"/>
-        <activity android:name="com.core.utils.pictureselector.ImgsActivity"
-            android:label="@string/selector_caption"/>
+            android:name="com.core.widget.view.Activity.CommonWebviewActivity"
+            android:configChanges="keyboardHidden|orientation|screenSize" />
+        <activity
+            android:name="com.core.widget.view.Activity.ImgFileListActivity"
+            android:label="相册列表" />
+        <activity
+            android:name="com.core.utils.pictureselector.ImgsActivity"
+            android:label="@string/selector_caption" />
 
-        <activity android:name="com.core.widget.view.Activity.SearchLocationActivity"
+        <activity
+            android:name="com.core.widget.view.Activity.SearchLocationActivity"
             android:hardwareAccelerated="true"
             android:windowSoftInputMode="stateUnspecified|adjustNothing" />
-        <activity android:name="com.core.widget.view.Activity.SelectActivity">
-        </activity>
+        <activity android:name="com.core.widget.view.Activity.SelectActivity"></activity>
         <activity
             android:name="com.core.widget.view.selectcalendar.SelectCalendarActivity"
-            android:label="@string/title_activity_select_calendar"/>
+            android:label="@string/title_activity_select_calendar" />
         <activity
             android:name="com.core.widget.view.Activity.MultiImagePreviewActivity"
             android:configChanges="orientation|screenSize" />

+ 9 - 0
app_core/common/src/main/assets/work_menu.json

@@ -332,6 +332,15 @@
         "menuUrl": "",
         "caller": "",
         "isHide": false
+      },{
+        "isLocalMenu": true,
+        "menuName": "work_menu_bi",
+        "menuIcon": "icon_bi",
+        "menuActivity":"com.modular.company.ReportStatisticsBiActivity",
+        "menuTag": "local_subs_bi",
+        "menuUrl": "",
+        "caller": "",
+        "isHide": false
       }
     ]
   },

+ 1 - 0
app_core/common/src/main/java/com/common/data/RegexUtil.java

@@ -15,6 +15,7 @@ public class RegexUtil {
     public static final String REGEX_BIRTHDAY = "[1-9]{4}([-./])\\d{1,2}\\1\\d{1,2}";//生日
     public static final String REGEX_IPADDRESS = "[1-9](\\d{1,2})?\\.(0|([1-9](\\d{1,2})?))\\.(0|([1-9](\\d{1,2})?))\\.(0|([1-9](\\d{1,2})?))";//ip地址
     public static final String REGEX_URL = "(http|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?";//网址
+    public static final String REGEX_HTML = "/^<(S*?)[^>]*>.*?|<.*? />$/";//HMTL
 
     public static boolean checkRegex(String text, String regex) {
         return Pattern.matches(regex, text);

+ 10 - 3
app_core/common/src/main/java/com/core/app/ActionBackActivity.java

@@ -43,7 +43,6 @@ public class ActionBackActivity extends StackActivity {
     }
 
 
-
     @Override
     public boolean isDestroyed() {
         if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
@@ -77,8 +76,6 @@ public class ActionBackActivity extends StackActivity {
     }
 
 
-
-
     @Override
     public void startActivity(Intent intent) {
         if (intent.getAction() != null) {
@@ -121,4 +118,14 @@ public class ActionBackActivity extends StackActivity {
             super.finish();
         }
     }
+
+    public void finish(int resultCode, Intent intent) {
+        if (intent == null) {
+            setResult(resultCode);
+        } else {
+            setResult(resultCode, intent);
+        }
+        finish();
+    }
+
 }

+ 0 - 3
app_core/common/src/main/java/com/core/app/AppConstant.java

@@ -58,7 +58,6 @@ public class AppConstant {
 
 
     public static final String UPHEAD = "UPHEAD";
-    public  static  final  String BAIDU_PUSH = "BAIDU_PUSH";
     public static final String FRIEND = "friend";
 
 
@@ -72,8 +71,6 @@ public class AppConstant {
     public static final String action_save_ = "NEW_FUNCTION_NOTICE";
 
 
-
-
     public static final String UPDATA_UUHELPER = "UPDATA_UUHELPER";
     public static final String UUSPORT_PUSH = "UUSPORT_PUSH";
     public static final String UPDATE_STEPRANKING_PRISE = "UPDATE_STEPRANKING_PRISE";

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

@@ -488,6 +488,7 @@ public class Constants {
          */
         String DEVICE_CALLER = "device_caller";
         String DEVICE_CLASS = "device_class";
+        String DEVICE_CONDITION = "device_condition ";
         String DEVICE_WHICH_PAGE = "device_which_page";
         String DEVICE_FROM_COMMON = "device_from_common";
         String DEVICE_FROM_QUERY = "device_from_query";
@@ -577,7 +578,7 @@ public class Constants {
         String BILL_STATUS = "bill_status";
         String CONDITION = "mCondition";
         String ID = "mId";
-        String TITLE = "mTitlte";
+        String TITLE = "title";
         String TYPE = "mType";
         String HASH_MAP = "hashMap";//录入界面带进去的内容
         String FIELD_CONFIG = "fieldConfig";//搜索配置
@@ -590,5 +591,9 @@ public class Constants {
         String BILL_LIST_FIELD_FORWARD = "Bill_List_Field_Forward";//录入界面,dbfind字段添加的前提Condition
 
         String FACE_SIGN_BASE64 = "face_sign_base64";//人脸识别的base64编码
+        String SHOW_HEADER = "show_header";//是否展示头部布局(头像,名字,状态)
+        String FORM_TO_GRID = "form_to_grid";//是否将主表和从表统一放到tab页展示
+
+        int RESULT_RESPONSE_CODE = 0x520;
     }
 }

+ 4 - 0
app_core/common/src/main/java/com/core/base/HttpImp.java

@@ -1,5 +1,7 @@
 package com.core.base;
 
+import android.content.Intent;
+
 /**
  * 有网络请求的接口
  * Created by Bitliker on 2016/12/15.
@@ -24,4 +26,6 @@ public interface HttpImp {
 
     void finish();
 
+    void finish(int resultCode, Intent intent);
+
 }

+ 1 - 1
app_core/common/src/main/java/com/core/base/OABaseActivity.java

@@ -1,5 +1,6 @@
 package com.core.base;
 
+import android.content.Intent;
 import android.os.Bundle;
 
 import com.common.data.StringUtil;
@@ -52,7 +53,6 @@ public class OABaseActivity extends BaseActivity implements HttpImp {
     }
 
 
-
     @Override
     public void setTitleStyles(int reid) {
         int theme = getSharedPreferences("cons", MODE_PRIVATE).getInt("theme", reid);

+ 8 - 3
app_core/common/src/main/java/com/core/model/Approval.java

@@ -154,8 +154,9 @@ public class Approval {
                 int floatcolumn = floatcolumn();//保留小数后几位
                 LogUtil.i("gong", values + "=" + floatcolumn);
                 if (floatcolumn == 0) {
-                    if (v2.length() - 1 > 3) {
-                        builder.append(v2.substring(0, 3));
+                    //默认保留6位小数
+                    if (v2.length() - 1 > 7) {
+                        builder.append(v2.substring(0, 7));
                     } else {
                         builder.append(v2);
                     }
@@ -244,6 +245,8 @@ public class Approval {
             return 2;
         } else if (isDftypeEQ("C")) {
             return 3;
+        } else if (isDftypeEQ("MF")) {
+            return 6;
         } else if (isDBFind()) {
             return 4;
         } else if (isDftypeEQ("B", "YN")) {
@@ -258,7 +261,9 @@ public class Approval {
                 || "DT".equals(dfType)
                 || "C".equals(dfType)
                 || "YN".equals(dfType)
-                || "B".equals(dfType);
+                || "B".equals(dfType)
+                || "MF".equals(dfType)
+                ;
     }
 
     public void data2Values() {

+ 3 - 0
app_core/common/src/main/java/com/core/net/http/ViewUtil.java

@@ -487,6 +487,9 @@ public class ViewUtil {
                 }
             }
         }, 1500);
+        if (erp_baseurl != null) {
+            erp_baseurl = erp_baseurl.trim();
+        }
         if (ct instanceof Activity) {
             if (!StringUtil.isEmpty(CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_baseurl"))) {
             } else {

+ 8 - 6
app_core/common/src/main/java/com/core/utils/CommonUtil.java

@@ -107,11 +107,11 @@ public class CommonUtil {
         }
         String baseUrl = getSharedPreferences(ct, "erp_baseurl");
 //        if (BaseConfig.isDebug()){
-//            baseUrl="http://192.168.253.243:8080/ERP/";
+//            baseUrl="http://117.25.180.218:8090/zz_test/";
 //        }
-//        baseUrl = "http://192.168.253.12/APP/";
-//        baseUrl = "http://192.168.253.52:8080/ERP/";
-//        baseUrl = "http://192.168.253.63:8080/ERP/";
+//        baseUrl = "http://117.25.180.218:8090/zz_test/";
+//        baseUrl = "http://10.1.80.180:8080/uas_war_exploded/";
+//        baseUrl = "http://10.1.80.28:8080/ERP/";
         return baseUrl;
     }
 
@@ -598,7 +598,9 @@ public class CommonUtil {
 
     public static String getEmcode() {
         boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
-        String emcode = isB2b ? CommonUtil.getSharedPreferences(MyApplication.getInstance().getApplicationContext(), "b2b_uu") : CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username");
+        String emcode = isB2b ?
+                CommonUtil.getSharedPreferences(MyApplication.getInstance().getApplicationContext(), "b2b_uu")
+                : CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username");
         if (emcode == null) emcode = "";
         return emcode;
     }
@@ -1315,7 +1317,7 @@ public class CommonUtil {
      * @param <T>
      * @return
      * @throws IOException
-     * @throws ClassNotFoundException
+     * @throws
      */
     public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
         ByteArrayOutputStream byteOut = new ByteArrayOutputStream();

+ 29 - 6
app_core/common/src/main/java/com/core/widget/view/Activity/CommonWebviewActivity.java

@@ -5,9 +5,11 @@ import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.KeyEvent;
+import android.view.WindowManager;
 import android.webkit.DownloadListener;
 import android.webkit.JavascriptInterface;
 import android.webkit.WebSettings;
@@ -35,7 +37,7 @@ public class CommonWebviewActivity extends BaseActivity {
 
         mWebView.addJavascriptInterface(new JavaScriptinterface(this),
                 "android");
-        
+
 
         WebSettings webSettings = mWebView.getSettings();
         //允许加载JavaScript
@@ -78,7 +80,7 @@ public class CommonWebviewActivity extends BaseActivity {
 
         Intent intent = getIntent();
         mUrl = intent.getStringExtra("scan_url");
-        String mTitle= intent.getStringExtra("title");
+        String mTitle = intent.getStringExtra("title");
         setTitle(mTitle);
         mWebView.loadUrl(mUrl);
     }
@@ -104,11 +106,32 @@ public class CommonWebviewActivity extends BaseActivity {
         }
     }
 
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+
+        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
+            if (getSupportActionBar() != null) {
+                getSupportActionBar().hide();
+            }
+            //设置全屏
+            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
+                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
+        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
+            if (getSupportActionBar() != null) {
+                getSupportActionBar().show();
+                //取消全屏
+                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
+            }
+        }
+    }
+
 
     public class JavaScriptinterface {
         Context context;
+
         public JavaScriptinterface(Context c) {
-            context= c;
+            context = c;
         }
 
         /**
@@ -121,14 +144,14 @@ public class CommonWebviewActivity extends BaseActivity {
         }
 
         @JavascriptInterface
-        public void requestedOrientationLandscape(){
+        public void requestedOrientationLandscape() {
             // 设置为横屏模式  
             setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
         }
 
         @JavascriptInterface
-        public void requestedOrientationPortrait(){
-            // 设置为横屏模式  
+        public void requestedOrientationPortrait() {
+            // 设置为竖屏模式
             setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
         }
     }

+ 5 - 3
app_core/common/src/main/java/com/core/widget/view/Activity/SelectActivity.java

@@ -308,11 +308,12 @@ public class SelectActivity extends BaseActivity {
                         bean.setName(item.getString(fieldkey) + "(" + value2 + ")");
                     }
                 }
+                item.put(showKey, bean.getName());
                 // 修改为显示所有的
                 bean.setShowName(getName(item));
                 bean.setDbfinds(dbfindsStr);
                 bean.setFields(JSON.toJSONString(values));
-                bean.setJson(JSON.toJSONString(datas.get(i)));
+                bean.setJson(JSON.toJSONString(item));
                 formBeaan.add(bean);
 
             }
@@ -327,8 +328,9 @@ public class SelectActivity extends BaseActivity {
                 } else {
                     bean.setName(item.getString(fieldkey));
                 }
-                bean.setObject(JSON.toJSONString(datas.get(i)));
-                bean.setJson(JSON.toJSONString(datas.get(i)));
+                item.put(showKey, bean.getName());
+                bean.setObject(JSON.toJSONString(item));
+                bean.setJson(JSON.toJSONString(item));
                 formBeaan.add(bean);
             }
         }

BIN
app_core/common/src/main/res/drawable-hdpi/ic_scan_gray.png


BIN
app_core/common/src/main/res/drawable-xhdpi/ic_scan_gray.png


BIN
app_core/common/src/main/res/drawable-xxhdpi/ic_scan_gray.png


+ 3 - 3
app_core/common/src/main/res/drawable/shape_from_edit.xml

@@ -3,21 +3,21 @@
     <item  android:state_focused="true" ><shape>
             <solid android:color="#FFFFFF" />
             <stroke android:width="0.6dp" android:color="#00EEEE" />
-            <corners android:radius="8dp" />
+            <corners android:radius="6dp" />
             <padding android:bottom="0.5dp" android:left="0.5dp" android:right="0.5dp" android:top="0.5dp" />
         </shape>
     </item>
     <item  android:state_pressed="true"><shape>
             <solid android:color="#FFFFFF" />
             <stroke android:width="0.6dp" android:color="#949494" />
-            <corners android:radius="8dp" />
+            <corners android:radius="6dp" />
             <padding android:bottom="0.5dp" android:left="0.5dp" android:right="0.5dp" android:top="0.5dp" />
         </shape>
     </item>
     <item ><shape>
             <solid android:color="#FFFFFF" />
             <stroke android:width="0.6dp" android:color="#949494" />
-            <corners android:radius="8dp" />
+            <corners android:radius="6dp" />
             <padding android:bottom="0.5dp" android:left="0.5dp" android:right="0.5dp" android:top="0.5dp" />
         </shape>
     </item>

+ 12 - 5
app_core/common/src/main/res/layout/action_data_inquiry_list.xml

@@ -1,12 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/top"
-    xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="?attr/actionBarSize"
     android:focusable="true"
     android:focusableInTouchMode="true"
-    android:paddingRight="@dimen/paddingMin">
+    android:paddingRight="10dp">
 
     <ImageView
         android:id="@+id/back"
@@ -37,22 +36,30 @@
             android:layout_height="fill_parent"
             android:layout_centerVertical="true"
             android:background="@drawable/search_input"
-            android:drawableLeft="@drawable/search"
             android:drawableRight="@drawable/search_clear"
             android:hint="@string/search"
             android:imeOptions="actionSearch"
             android:inputType="text"
+            android:paddingLeft="34dp"
             android:paddingRight="26dp"
             android:textColor="@color/dark_grey"
             android:textColorHint="@color/grey"
             android:textSize="14sp" />
 
+        <ImageView
+            android:id="@+id/data_inquiry_filter_scan_iv"
+            android:layout_width="24dp"
+            android:layout_height="24dp"
+            android:layout_centerVertical="true"
+            android:layout_marginLeft="6dp"
+            android:src="@drawable/ic_scan_gray" />
+
         <ImageView
             android:id="@+id/data_inquiry_voice_iv"
             android:layout_width="10dp"
             android:layout_height="16dp"
-            android:layout_alignParentRight="true"
             android:layout_alignRight="@+id/search_edit"
+            android:layout_alignParentRight="true"
             android:layout_centerVertical="true"
             android:layout_marginRight="6dp"
             android:background="@drawable/btn_yuyin_nor"

+ 17 - 18
app_core/common/src/main/res/layout/activity_data_inquiry_list.xml

@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout 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:focusable="true"
-                android:focusableInTouchMode="true"
-                android:orientation="vertical">
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:background="#f6f6f6"
+    android:focusableInTouchMode="true"
+    android:orientation="vertical">
 
     <RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:orientation="vertical">
 
-
         <com.handmark.pulltorefresh.library.PullToRefreshListView
             android:id="@+id/data_inquiry_list_ptlv"
             android:layout_width="match_parent"
@@ -54,8 +54,7 @@
             android:id="@+id/data_inquiry_list_total_hide_rl"
             android:layout_width="match_parent"
             android:layout_height="26dp"
-            android:background="@color/background"
-            >
+            android:background="@color/background">
 
             <ImageView
                 android:id="@+id/data_inquiry_list_total_hide_iv"
@@ -80,10 +79,10 @@
             android:id="@+id/data_inquiry_list_total_lv"
             android:layout_width="match_parent"
             android:layout_height="120dp"
-            android:layout_marginBottom="10dp"
             android:layout_marginTop="10dp"
-            android:scrollbars="none"
-            android:overScrollMode="never" />
+            android:layout_marginBottom="10dp"
+            android:overScrollMode="never"
+            android:scrollbars="none" />
     </LinearLayout>
 
     <View
@@ -114,10 +113,10 @@
                 android:background="#eeeeee"
                 android:clickable="true"
                 android:orientation="horizontal"
-                android:paddingBottom="8dp"
                 android:paddingLeft="16dp"
+                android:paddingTop="8dp"
                 android:paddingRight="16dp"
-                android:paddingTop="8dp">
+                android:paddingBottom="8dp">
 
                 <TextView
                     android:layout_width="0dp"
@@ -140,8 +139,8 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:background="@color/me_menu_item_normal"
-                android:scrollbars="none"
-                android:overScrollMode="never"/>
+                android:overScrollMode="never"
+                android:scrollbars="none" />
 
         </LinearLayout>
 
@@ -166,8 +165,8 @@
                 android:layout_width="match_parent"
                 android:layout_height="0dp"
                 android:layout_weight="1"
-                android:scrollbars="none"
-                android:overScrollMode="never"/>
+                android:overScrollMode="never"
+                android:scrollbars="none" />
 
             <LinearLayout
                 android:layout_width="match_parent"

+ 1 - 1
app_core/common/src/main/res/layout/item_businessless_edit.xml

@@ -24,7 +24,7 @@
             style="@style/TextView_Basic"
             android:maxWidth="260dp"
             android:minWidth="240dp"
-            
+
             android:maxHeight="150dp"
             android:textSize="14sp"
             android:layout_height="match_parent"

+ 9 - 9
app_core/common/src/main/res/layout/listitem_businessless_edit.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical">
@@ -8,20 +9,19 @@
         android:id="@+id/ll_moment"
         style="@style/LinearLayout_horizontal"
         android:layout_height="wrap_content"
-        android:paddingRight="@dimen/padding"
         android:background="@color/white"
-        android:maxHeight="180dp"
-        android:minHeight="50dp">
+        android:minHeight="50dp"
+        android:paddingRight="@dimen/padding">
 
         <TextView
             android:id="@+id/tv_less_key"
             style="@style/TextView_Basic"
             android:layout_width="60dp"
             android:layout_gravity="center_vertical"
-            android:layout_marginBottom="10dp"
             android:layout_marginLeft="10dp"
-            android:layout_marginRight="3dp"
             android:layout_marginTop="10dp"
+            android:layout_marginRight="3dp"
+            android:layout_marginBottom="10dp"
             android:text="商机阶段商机阶段阶段:"
             android:textColor="@color/text_main"
             android:textSize="14sp" />
@@ -39,18 +39,18 @@
             android:id="@+id/tv_less_value"
             style="@style/TextView_Basic"
             android:layout_width="0dp"
-            android:layout_height="match_parent"
+            android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"
             android:layout_marginLeft="@dimen/padding"
             android:layout_marginRight="@dimen/padding"
             android:layout_weight="1"
-            android:background="@drawable/shape_from_edit"
+            android:background="@null"
             android:gravity="right|center"
             android:hint="@string/common_input"
-            android:maxHeight="150dp"
             android:maxWidth="260dp"
             android:minWidth="240dp"
-            android:textSize="14sp" />
+            android:textSize="14sp"
+            tools:text="DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" />
 
         <ImageView
             android:id="@+id/selectIv"

+ 23 - 22
app_core/common/src/main/res/layout/listitem_form_edit.xml

@@ -1,48 +1,49 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
     <LinearLayout
         android:id="@+id/ll_moment"
-        android:background="@color/white"
+        style="@style/LinearLayout_horizontal"
         android:layout_height="wrap_content"
-        android:maxHeight="180dp"
-        android:minHeight="50dp"
-        style="@style/LinearLayout_horizontal">
+        android:background="@color/white"
+        android:minHeight="50dp">
+
         <TextView
             android:id="@+id/tv_less_key"
             style="@style/TextView_Basic"
-            android:layout_margin="10dp"
             android:layout_width="60dp"
-            android:textSize="14sp"
-            android:textColor="@color/text_main"
             android:layout_gravity="center_vertical"
-            android:text="商机阶段商机阶段阶段:" />
-<!--android:background="@drawable/shape_from_edit"-->
+            android:layout_margin="10dp"
+            android:text="商机阶段商机阶段阶段:"
+            android:textColor="@color/text_main"
+            android:textSize="14sp" />
+        <!--android:background="@drawable/shape_from_edit"-->
         <EditText
             android:id="@+id/tv_less_value"
             style="@style/TextView_Basic"
-            android:maxWidth="260dp"
-            android:minWidth="240dp"
-            android:maxHeight="150dp"
-            android:textSize="14sp"
-            android:layout_height="match_parent"
-            android:layout_gravity="center_vertical"
             android:layout_width="match_parent"
-            android:background="@drawable/shape_from_edit"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:layout_marginRight="10dp"
+            android:background="@null"
             android:gravity="right|center"
+            android:hint="@string/common_input"
+            android:maxWidth="260dp"
+            android:minWidth="240dp"
             android:padding="5dp"
-            android:layout_marginRight="10dp"
-            android:hint="@string/common_input" />
+            android:textSize="14sp" />
     </LinearLayout>
+
     <LinearLayout
         android:id="@+id/select_img_layout"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:background="@color/white"
-        android:visibility="gone"
-        android:padding="10dp">
+        android:padding="10dp"
+        android:visibility="gone">
 
         <com.core.widget.view.MyGridView
             android:id="@+id/grid_view"

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

@@ -41,7 +41,7 @@
     <dimen name="SmallerTextSize">13.0sp</dimen>
     <dimen name="emotion_height">180dp</dimen>
     <dimen name="paddingMax">12dp</dimen>
-    <dimen name="padding">8dp</dimen>
+    <dimen name="padding">6dp</dimen>
     <dimen name="paddingMin">4dp</dimen>
     <dimen name="paddingApp">8dp</dimen>
     <dimen name="pmsg_media_view_height">255dp</dimen>

+ 1 - 1
app_core/network/src/main/java/com/me/network/app/base/HttpCallback.java

@@ -6,7 +6,7 @@ package com.me.network.app.base;
  * @date 2017/11/9 14:47
  */
 
-public interface HttpCallback<T> {
+public interface HttpCallback<T> extends CallBack{
 
     void onSuccess(int flag, T t) throws Exception;
 

+ 18 - 0
app_core/network/src/main/java/com/me/network/app/base/HttpParams.java

@@ -1,5 +1,7 @@
 package com.me.network.app.base;
 
+import android.os.Bundle;
+
 import java.util.HashMap;
 import java.util.Map;
 
@@ -39,6 +41,11 @@ public class HttpParams {
      */
     private Map<String, Object> headers;
 
+    /**
+     * 传递值至接口回调
+     */
+    private Bundle bundle;
+
     /**
      * 请求方式
      */
@@ -60,6 +67,7 @@ public class HttpParams {
         this.flag = builder.flag;
         this.params = builder.params;
         this.headers = builder.headers;
+        this.bundle = builder.bundle;
         this.postBody = builder.postBody;
         this.method = builder.method;
         this.connectTimeOut = builder.connectTimeOut;
@@ -83,6 +91,10 @@ public class HttpParams {
         return headers;
     }
 
+    public Bundle getBundle() {
+        return bundle;
+    }
+
     public Object getPostBody() {
         return postBody;
     }
@@ -108,6 +120,7 @@ public class HttpParams {
         private int flag;
         private Map<String, Object> params = new HashMap<>();
         private Map<String, Object> headers = new HashMap<>();
+        private Bundle bundle;
         private Object postBody;
         private int method;
         private long connectTimeOut = CONNECT_TIME_OUT;
@@ -165,6 +178,11 @@ public class HttpParams {
             return this;
         }
 
+        public Builder setBundle(Bundle bundle) {
+            this.bundle = bundle;
+            return this;
+        }
+
         public Builder postBody(Object postBody) {
             this.postBody = postBody;
             return this;

+ 34 - 5
app_core/network/src/main/java/com/me/network/app/http/HttpRequest.java

@@ -10,7 +10,9 @@ import android.util.Log;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.me.network.app.base.BaseApplication;
+import com.me.network.app.base.CallBack;
 import com.me.network.app.base.HttpCallback;
+import com.me.network.app.base.HttpCallbackWithBundle;
 import com.me.network.app.base.HttpParams;
 import com.me.network.app.http.rx.Result2Listener;
 import com.me.network.app.http.rx.ResultSubscriber;
@@ -65,12 +67,31 @@ public class HttpRequest {
         mHttpClient.Api().uploads(getBuild(httpParams), getResult(httpParams, callback));
     }
 
-    private ResultSubscriber<Object> getResult(final HttpParams httpParams, final HttpCallback callback) {
+    public void sendRequest(final String requestHost, final HttpParams httpParams, final HttpCallbackWithBundle callback) {
+
+        if (validHttpParams(requestHost, httpParams, callback)) return;
+
+        mHttpClient.Api().send(getBuild(httpParams), getResult(httpParams, callback));
+    }
+
+    public void uploadFile(final String requestHost, final HttpParams httpParams, final HttpCallbackWithBundle callback) {
+
+        if (validHttpParams(requestHost, httpParams, callback)) return;
+
+        mHttpClient.Api().uploads(getBuild(httpParams), getResult(httpParams, callback));
+    }
+
+    private ResultSubscriber<Object> getResult(final HttpParams httpParams, final CallBack callback) {
         return new ResultSubscriber<Object>(new Result2Listener<Object>() {
             @Override
             public void onResponse(Object response) {
                 try {
-                    callback.onSuccess(httpParams.getFlag(), response == null ? "" : response);
+                    if (callback instanceof HttpCallback) {
+                        ((HttpCallback<Object>) callback).onSuccess(httpParams.getFlag(), response == null ? "" : response);
+                    } else if (callback instanceof HttpCallbackWithBundle) {
+                        ((HttpCallbackWithBundle<Object>) callback)
+                                .onSuccess(httpParams.getFlag(), response == null ? "" : response, httpParams.getBundle());
+                    }
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
@@ -102,7 +123,11 @@ public class HttpRequest {
                     if (failMsg.length() > 40) {
                         failMsg = "服务器异常";
                     }
-                    callback.onFail(httpParams.getFlag(), failMsg);
+                    if (callback instanceof HttpCallback) {
+                        ((HttpCallback<Object>) callback).onFail(httpParams.getFlag(), failMsg);
+                    } else if (callback instanceof HttpCallbackWithBundle) {
+                        ((HttpCallbackWithBundle<Object>) callback).onFail(httpParams.getFlag(), failMsg);
+                    }
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
@@ -123,7 +148,7 @@ public class HttpRequest {
                 .build();
     }
 
-    private boolean validHttpParams(String requestHost, HttpParams httpParams, HttpCallback callback) {
+    private boolean validHttpParams(String requestHost, HttpParams httpParams, CallBack callback) {
         if (httpParams == null) {
             throw new IllegalArgumentException("httpParams can not be NULL");
         }
@@ -139,7 +164,11 @@ public class HttpRequest {
 
         if (!isNetWorkConnected(BaseApplication.getInstance())) {
             try {
-                callback.onFail(httpParams.getFlag(), BaseApplication.getInstance().getString(R.string.networks_out));
+                if (callback instanceof HttpCallback) {
+                    ((HttpCallback<Object>) callback).onFail(httpParams.getFlag(), BaseApplication.getInstance().getString(R.string.networks_out));
+                } else if (callback instanceof HttpCallbackWithBundle) {
+                    ((HttpCallbackWithBundle<Object>) callback).onFail(httpParams.getFlag(), BaseApplication.getInstance().getString(R.string.networks_out));
+                }
                 return true;
             } catch (Exception e) {
                 e.printStackTrace();

+ 1 - 1
app_modular/appmessages/src/main/AndroidManifest.xml

@@ -92,7 +92,7 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".activity.RealTimeFormActivity">
+        <activity android:name="com.uas.appworks.activity.RealTimeFormActivity">
             <intent-filter>
                 <action android:name="com.modular.company.RealTimeFormActivity" />
                 <category android:name="android.intent.category.DEFAULT" />

+ 3 - 0
app_modular/appmessages/src/main/java/com/modular/appmessages/activity/AppWebViewActivity.java

@@ -62,6 +62,9 @@ public class AppWebViewActivity extends SupportToolBarActivity {
                         String sessionId = FlexJsonUtil.fromJson(result).get("sessionId").toString();
                         String erpaccount = FlexJsonUtil.fromJson(result).get("erpaccount").toString();
                         String url = bundle.getString("url");
+                        if (url != null) {
+                            url = url.trim();
+                        }
                         String uu = bundle.getString("uu");
                         String master = bundle.getString("master");
                         String name = bundle.getString("name");

+ 79 - 5
app_modular/appmessages/src/main/java/com/modular/appmessages/activity/ApprovalActivity.java

@@ -7,6 +7,7 @@ import android.support.annotation.NonNull;
 import android.support.v7.widget.DefaultItemAnimator;
 import android.support.v7.widget.RecyclerView;
 import android.text.Editable;
+import android.text.TextUtils;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -57,8 +58,10 @@ import com.modular.appmessages.adapter.CrashLinearLayoutManager;
 import com.modular.appmessages.presenter.ApprovaPresenter;
 import com.modular.appmessages.presenter.imp.IApproval;
 import com.modular.apputils.activity.SelectNetAcitivty;
+import com.modular.apputils.model.BillGroupModel;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -165,6 +168,9 @@ public class ApprovalActivity extends BaseActivity implements IApproval, Approva
             } catch (Exception e) {
                 e.printStackTrace();
             }
+        } else if (100 == requestCode && 0x21 == resultCode) {
+            ArrayList<SelectBean> muliData = data.getParcelableArrayListExtra("data");
+            updateMfFind(muliData);
         }
         super.onActivityResult(requestCode, resultCode, data);
     }
@@ -188,6 +194,51 @@ public class ApprovalActivity extends BaseActivity implements IApproval, Approva
         }
     }
 
+    private void updateMfFind(ArrayList<SelectBean> muliData) {
+        JSONObject object = null;
+        if (!ListUtils.isEmpty(muliData)) {
+            object = JSON.parseObject(muliData.get(0).getJson());
+            String dbFind = muliData.get(0).getDbfinds();
+            for (int i = 1; i < muliData.size(); i++) {
+                SelectBean b = muliData.get(i);
+                JSONObject bObject = JSON.parseObject(b.getJson());
+                for (Map.Entry<String, Object> entry : bObject.entrySet()) {
+                    String oldText = object.getString(entry.getKey());
+                    object.put(entry.getKey(), oldText + "#" + entry.getValue());
+                }
+            }
+            if (!TextUtils.isEmpty(dbFind)) {
+                JSONArray fbFindArray = JSON.parseArray(dbFind);
+                if (!ListUtils.isEmpty(fbFindArray)) {
+                    for (int i = 0; i < fbFindArray.size(); i++) {
+                        String dbGridField = JSONUtil.getText(fbFindArray.getJSONObject(i), "dbGridField");
+                        String field = JSONUtil.getText(fbFindArray.getJSONObject(i), "field");
+                        if (object.containsKey(dbGridField)) {
+                            object.put(field, object.get(dbGridField));
+                            object.remove(dbGridField);
+                        }
+                    }
+                }
+            }
+        }
+        if (object == null) {
+            return;
+        }
+        if (mAdapter != null) {
+            List<Approval> models = mAdapter.getDbFind();
+            for (Approval e : models) {
+                if (e.isNeerInput() && (e.getType() == Approval.MAIN || e.getType() == Approval.DETAIL)) {
+                    for (Map.Entry<String, Object> map : object.entrySet()) {
+                        if (map.getKey().equals(e.getValuesKey()) && map.getValue() != null) {
+                            e.setValues(map.getValue().toString());
+                        }
+                    }
+                }
+            }
+            mAdapter.notifyDataSetChanged();
+        }
+    }
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -235,7 +286,7 @@ public class ApprovalActivity extends BaseActivity implements IApproval, Approva
             }
         }
         mPresenter = new ApprovaPresenter(this, getIntent());
-        final LinearLayout mRootLL = findViewById(R.id.mRootLL);
+        final View mRootLL = findViewById(R.id.mRootLL);
         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
             mRootLL.post(new Runnable() {
                 @Override
@@ -259,6 +310,28 @@ public class ApprovalActivity extends BaseActivity implements IApproval, Approva
 
     }
 
+    public void findMore(Approval approval) {
+        HashMap param = new HashMap<>();
+        param.put("caller", approval.getCaller());
+        param.put("page", "1");
+        param.put("which", "form");
+        param.put("condition", "1=1");
+        param.put("pageSize", "1000");
+        param.put("field", approval.getValuesKey());
+        Bundle bundle = new Bundle();
+        bundle.putSerializable("param", param);
+        Intent intent = new Intent(ct, SelectActivity.class);
+        intent.putExtra("type", 1);
+        intent.putExtra("isSingle", false);
+        intent.putExtras(bundle);
+        intent.putExtra("key", "combdatas");
+        intent.putExtra("showKey", approval.getValuesKey());
+        intent.putExtra("action", "common/dbfind.action");
+        intent.putExtra("title", approval.getCaption());
+        intent.putExtra("isForm", approval.getType() == Approval.MAIN);
+        startActivityForResult(intent, 100);
+    }
+
     private void getEmnameByReturn(String text) {
         if (StringUtil.isEmpty(text)) return;
         Pattern pattern = Pattern.compile("(?<=\\()(.+?)(?=\\))");
@@ -307,10 +380,11 @@ public class ApprovalActivity extends BaseActivity implements IApproval, Approva
     }
 
     private void selectEmCode() {
-        if (StringUtil.isEmpty(StringUtil.getTextRexHttp(opinionET))) {
-            showToast(R.string.approval_opinion_error, R.color.load_submit);
-            return;
-        }
+        //变更处理人不需要这个限制
+//        if (StringUtil.isEmpty(StringUtil.getTextRexHttp(opinionET))) {
+//            showToast(R.string.approval_opinion_error, R.color.load_submit);
+//            return;
+//        }
         Intent intent = new Intent("com.modular.main.SelectCollisionActivity");
         SelectCollisionTurnBean bean = new SelectCollisionTurnBean()
                 .setSureText(getString(R.string.common_sure))

+ 22 - 8
app_modular/appmessages/src/main/java/com/modular/appmessages/activity/MsgThirdWebActivity.java

@@ -11,7 +11,9 @@ import android.webkit.WebChromeClient;
 import android.webkit.WebView;
 
 import com.common.LogUtil;
+import com.common.data.StringUtil;
 import com.common.data.TextUtil;
+import com.core.app.Constants;
 import com.core.utils.CommonUtil;
 import com.core.utils.IntentUtils;
 import com.modular.apputils.utils.OpenFilesUtils;
@@ -19,6 +21,7 @@ import com.core.utils.ToastUtil;
 import com.core.widget.CustomProgressDialog;
 import com.modular.appmessages.R;
 import com.modular.apputils.network.FileDownloader;
+import com.uas.appworks.CRM.erp.activity.DeviceBillInputActivity;
 import com.uas.appworks.OA.erp.activity.CommonDocDetailsActivity;
 
 import org.w3c.dom.Text;
@@ -55,14 +58,25 @@ public class MsgThirdWebActivity extends MessageWebActivity {
                     String title = intent.getStringExtra(IntentUtils.KEY_TITLE);
                     String caller = intent.getStringExtra("caller");
                     int keyValue = intent.getIntExtra("keyValue", -1);
-                    if (!TextUtils.isEmpty(title) && !TextUtils.isEmpty(caller) && keyValue != -1) {
-                        startActivity(new Intent(ct, CommonDocDetailsActivity.class)
-                                .putExtra("caller", caller)
-                                .putExtra("keyValue", keyValue)
-                                .putExtra("title", title)
-                                .putExtra("device", false)
-                                .putExtra("message", true)
-                                .putExtra("status", "已审批"));
+                    if (!TextUtils.isEmpty(caller) && keyValue != -1) {
+                        if ("DeviceChange!Repair".equals(caller)) {
+                            startActivity(new Intent(mContext, DeviceBillInputActivity.class)
+                                    .putExtra(Constants.Intents.CALLER, caller)
+                                    .putExtra(Constants.Intents.ID, keyValue)
+                                    .putExtra(Constants.Intents.INPUT_CLASS, DeviceBillInputActivity.class)
+                                    .putExtra(Constants.Intents.TITLE, "设备维修")
+                                    .putExtra("device", true)
+                                    .putExtra(Constants.Intents.SHOW_HEADER, true)
+                                    .putExtra(Constants.Intents.BILL_STATUS, "在录入"));
+                        } else if (!TextUtils.isEmpty(title)) {
+                            startActivity(new Intent(ct, CommonDocDetailsActivity.class)
+                                    .putExtra("caller", caller)
+                                    .putExtra("keyValue", keyValue)
+                                    .putExtra("title", title)
+                                    .putExtra("device", false)
+                                    .putExtra("message", true)
+                                    .putExtra("status", "已审批"));
+                        }
                     }
 
 

+ 8 - 5
app_modular/appmessages/src/main/java/com/modular/appmessages/activity/MsgsSecondCommonActivity.java

@@ -46,6 +46,8 @@ import com.lidroid.xutils.ViewUtils;
 import com.modular.appmessages.R;
 
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -283,6 +285,7 @@ public class MsgsSecondCommonActivity extends SupportToolBarActivity implements
     private void loadLocalData(String msg_type) {
         msgModel = MessageDao.getInstance().queryByType(msg_type);
         if (!ListUtils.isEmpty(msgModel)) { //当数据库中有数据时,
+            Collections.reverse(msgModel);//反转数据,将最新数据展示在列表前面
             if (!TextUtils.isEmpty(mark_time)) {
                 doSecondMarkSave(msgModel, mark_time); // 当第一层 有标为已读标志时,进行第二次更新本地及新来消息否读状态
             } else {
@@ -328,7 +331,7 @@ public class MsgsSecondCommonActivity extends SupportToolBarActivity implements
 
         msgAdapter.setMsgModel(msgModel);
         msgAdapter.notifyDataSetChanged();
-        myplv.getRefreshableView().setSelection(msgModel.size() - 1);
+//        myplv.getRefreshableView().setSelection(msgModel.size() - 1);
     }
 
     private void doSecondMarkSave(List<MessageModel> msgModel, String mark_time) {
@@ -437,18 +440,18 @@ public class MsgsSecondCommonActivity extends SupportToolBarActivity implements
     }
 
 
-    private void doClickEvent(int mPosition, MessageModel model ) {
+    private void doClickEvent(int mPosition, MessageModel model) {
         baseUrl = CommonUtil.getAppBaseUrl(ct);
         String url = baseUrl + "mobile/message/getDetail.action?id=" + model.getId();
-        Intent intent_web = new Intent(ct,MsgThirdWebActivity.class);
+        Intent intent_web = new Intent(ct, MsgThirdWebActivity.class);
         intent_web.putExtra(IntentUtils.KEY_URL, url);
         intent_web.putExtra(IntentUtils.KEY_TITLE, msg_title);
         intent_web.putExtra(IntentUtils.KEY_NEER_COOKIE, true);
         intent_web.putExtra(IntentUtils.KEY_NEER_SHARE, false);
         intent_web.putExtra(IntentUtils.KEY_SHARE_IMAGE, "");
         intent_web.putExtra(IntentUtils.KEY_SHARE_CONTENT, "");
-        intent_web.putExtra("caller",model.getCaller());
-        intent_web.putExtra("keyValue",model.getKeyValue());
+        intent_web.putExtra("caller", model.getCaller());
+        intent_web.putExtra("keyValue", model.getKeyValue());
         startActivityForResult(intent_web, MSG_MARKED_READED);
 //        intent_web.putExtra("url", url + "?id=" + msg_id);
 //        intent_web.putExtra("title", msg_title);

+ 0 - 147
app_modular/appmessages/src/main/java/com/modular/appmessages/activity/RealTimeFormActivity.java

@@ -1,147 +0,0 @@
-package com.modular.appmessages.activity;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v7.widget.GridLayoutManager;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.common.data.JSONUtil;
-import com.core.api.wxapi.ApiPlatform;
-import com.core.api.wxapi.ApiUtils;
-import com.core.base.BaseActivity;
-import com.core.utils.CommonUtil;
-import com.core.utils.ToastUtil;
-import com.me.network.app.http.HttpClient;
-import com.me.network.app.http.Method;
-import com.me.network.app.http.rx.Result2Listener;
-import com.me.network.app.http.rx.ResultSubscriber;
-import com.modular.appmessages.R;
-import com.modular.appmessages.adapter.RealTimeFormMenuAdapter;
-import com.modular.appmessages.model.RealTimeFormMenuBean;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author RaoMeng
- * @describe 实时看板菜单页面
- * @date 2017/10/25 18:46
- */
-
-public class RealTimeFormActivity extends BaseActivity {
-    private RecyclerView mRecyclerView;
-    private GridLayoutManager mGridLayoutManager;
-    private RealTimeFormMenuAdapter mRealTimeFormMenuAdapter;
-    private List<RealTimeFormMenuBean> mRealTimeFormMenuBeen;
-    private int[] mGridColors = new int[]{R.color.data_inquiry_gird_menu_color1, R.color.data_inquiry_gird_menu_color2
-            , R.color.data_inquiry_gird_menu_color3, R.color.data_inquiry_gird_menu_color4, R.color.data_inquiry_gird_menu_color5,
-            R.color.data_inquiry_gird_menu_color6};
-    private LinearLayout mEmptyLayout;
-    private TextView mEmptyTextView;
-    private boolean isB2b;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_real_time_form);
-        initView();
-        initData();
-        mRealTimeFormMenuAdapter.setOnItemClickListener(new RealTimeFormMenuAdapter.OnItemClickListener() {
-            @Override
-            public void onItemClick(View view, int position) {
-                String url = CommonUtil.getAppBaseUrl(RealTimeFormActivity.this)
-                        + "mobile/mobileRealTimeCharts.action?numId=" + mRealTimeFormMenuAdapter.getRealTimeFormMenuBeen().get(position).getId();
-                String title = mRealTimeFormMenuAdapter.getRealTimeFormMenuBeen().get(position).getTitle();
-                Intent intent = new Intent("com.modular.main.WebViewCommActivity");
-                intent.putExtra("url", url);
-                intent.putExtra("title", title);
-                intent.putExtra("ORIENTATION_PORTRAIT", false);
-                intent.putExtra("cookie", true);
-                startActivity(intent);
-            }
-        });
-    }
-
-    private void initData() {
-//        final String realTimeCache = CommonUtil.getSharedPreferences(this, Constants.REAL_TIME_CACHE);
-//        if (!TextUtils.isEmpty(realTimeCache) && JSONUtil.validate(realTimeCache)) {
-//            JSONArray realTimeArray = JSON.parseArray(realTimeCache);
-//            if (realTimeArray != null && realTimeArray.size() > 0) {
-//                for (int i = 0; i < realTimeArray.size(); i++) {
-//                    RealTimeFormMenuBean realTimeFormMenuBean = new RealTimeFormMenuBean();
-//                    JSONObject realTimeObject = realTimeArray.getJSONObject(i);
-//                    realTimeFormMenuBean.setId(JSONUtil.getInt(realTimeObject, "ID"));
-//                    realTimeFormMenuBean.setTitle(JSONUtil.getText(realTimeObject, "TITLE"));
-//                    realTimeFormMenuBean.setColor(mGridColors[(i) % mGridColors.length]);
-//
-//                    mRealTimeFormMenuBeen.add(realTimeFormMenuBean);
-//                }
-//            }
-//
-//            mRealTimeFormMenuAdapter.notifyDataSetChanged();
-//        } else {
-        progressDialog.show();
-        HttpClient mHttpClient = new HttpClient.Builder(CommonUtil.getAppBaseUrl(RealTimeFormActivity.this)).build();
-        mHttpClient.Api().send(new HttpClient.Builder()
-                .url("mobile/getRealTimeSubs.action")
-                .add("sessionId", CommonUtil.getSharedPreferences(ct, "sessionId"))
-                .header("Cookie", CommonUtil.getErpCookie(ct))
-                .method(Method.GET)
-                .build(), new ResultSubscriber<Object>(new Result2Listener<Object>() {
-            @Override
-            public void onResponse(Object o) {
-                progressDialog.dismiss();
-                String result = o.toString();
-                JSONObject object = JSON.parseObject(result);
-
-                JSONArray subsArray = object.getJSONArray("subs");
-                if (subsArray != null && subsArray.size() > 0) {
-                    for (int i = 0; i < subsArray.size(); i++) {
-                        RealTimeFormMenuBean realTimeFormMenuBean = new RealTimeFormMenuBean();
-                        JSONObject realTimeObject = subsArray.getJSONObject(i);
-                        realTimeFormMenuBean.setId(JSONUtil.getInt(realTimeObject, "ID"));
-                        realTimeFormMenuBean.setTitle(JSONUtil.getText(realTimeObject, "TITLE"));
-                        realTimeFormMenuBean.setColor(mGridColors[(i) % mGridColors.length]);
-
-                        mRealTimeFormMenuBeen.add(realTimeFormMenuBean);
-                    }
-                    mRealTimeFormMenuAdapter.notifyDataSetChanged();
-                } else {
-                    ToastUtil.showToast(RealTimeFormActivity.this, "看板数据为空");
-                    mEmptyLayout.setVisibility(View.VISIBLE);
-                    mEmptyTextView.setText("看板数据为空");
-                }
-            }
-
-            @Override
-            public void onFailure(Object t) {
-                progressDialog.dismiss();
-                ToastUtil.showToast(RealTimeFormActivity.this, "看板数据获取失败");
-                mEmptyLayout.setVisibility(View.VISIBLE);
-                mEmptyTextView.setText("看板数据获取失败");
-            }
-        }));
-//        }
-    }
-
-    private void initView() {
-        setTitle(R.string.real_time_form);
-        isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
-        mRecyclerView = (RecyclerView) findViewById(R.id.real_time_form_rv);
-        mEmptyLayout = (LinearLayout) findViewById(R.id.real_time_form_empty_ll);
-        mEmptyTextView = (TextView) findViewById(R.id.real_time_form_msg_tv);
-
-        mGridLayoutManager = new GridLayoutManager(this, 3, LinearLayoutManager.VERTICAL, false);
-        mRecyclerView.setLayoutManager(mGridLayoutManager);
-        mRealTimeFormMenuBeen = new ArrayList<>();
-        mRealTimeFormMenuAdapter = new RealTimeFormMenuAdapter(this, mRealTimeFormMenuBeen);
-        mRecyclerView.setAdapter(mRealTimeFormMenuAdapter);
-    }
-}

+ 4 - 0
app_modular/appmessages/src/main/java/com/modular/appmessages/adapter/ApprovalAdapter.java

@@ -473,6 +473,7 @@ public class ApprovalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
                 case 2:
                 case 3:
                 case 4:
+                case 6:
                     if (approval.isMustInput()) {
                         holder.valueEt.setHint(R.string.common_select);
                     } else {
@@ -489,6 +490,9 @@ public class ApprovalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
                             } else if (type == 4) {
                                 ct.toDbFind(approval);
                                 dbfindItem = position;
+                            } else if (type == 6) {
+                                ct.findMore(approval);
+                                dbfindItem = position;
                             } else {
                                 selectItem(approval, position);
                             }

+ 0 - 86
app_modular/appmessages/src/main/java/com/modular/appmessages/adapter/RealTimeFormMenuAdapter.java

@@ -1,86 +0,0 @@
-package com.modular.appmessages.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.LinearLayout;
-import android.widget.TextView;
-
-import com.core.widget.CircleTextView;
-import com.modular.appmessages.R;
-import com.modular.appmessages.model.RealTimeFormMenuBean;
-
-import java.util.List;
-
-/**
- * @author RaoMeng
- * @describe 实时看板菜单适配器
- * @date 2017/10/25 19:05
- */
-
-public class RealTimeFormMenuAdapter extends RecyclerView.Adapter<RealTimeFormMenuAdapter.RealTimeMenuViewHolder> {
-    private Context mContext;
-    private List<RealTimeFormMenuBean> mRealTimeFormMenuBeen;
-    private OnItemClickListener mOnItemClickListener;
-
-    public RealTimeFormMenuAdapter(Context context, List<RealTimeFormMenuBean> realTimeFormMenuBeen) {
-        mContext = context;
-        mRealTimeFormMenuBeen = realTimeFormMenuBeen;
-    }
-
-    public List<RealTimeFormMenuBean> getRealTimeFormMenuBeen() {
-        return mRealTimeFormMenuBeen;
-    }
-
-    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
-        mOnItemClickListener = onItemClickListener;
-    }
-
-    @Override
-    public RealTimeMenuViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        View view = LayoutInflater.from(mContext).inflate(R.layout.item_grid_real_time_form_menu, parent, false);
-        return new RealTimeMenuViewHolder(view);
-    }
-
-    @Override
-    public void onBindViewHolder(RealTimeMenuViewHolder holder, final int position) {
-        String title = mRealTimeFormMenuBeen.get(position).getTitle();
-        holder.contentTextView.setText(title);
-        if (title != null && title.length() >= 1) {
-            holder.iconTextView.setText(title.substring(0, 1));
-        }
-        holder.iconTextView.setMyBackgroundColor(mContext.getResources().getColor(mRealTimeFormMenuBeen.get(position).getColor()));
-        holder.menuLinearLayout.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mOnItemClickListener.onItemClick(v, position);
-            }
-        });
-    }
-
-    @Override
-    public int getItemCount() {
-        return mRealTimeFormMenuBeen == null ? 0 : mRealTimeFormMenuBeen.size();
-    }
-
-
-    public static class RealTimeMenuViewHolder extends RecyclerView.ViewHolder {
-        private CircleTextView iconTextView;
-        private TextView contentTextView;
-        private LinearLayout menuLinearLayout;
-
-        public RealTimeMenuViewHolder(View itemView) {
-            super(itemView);
-
-            iconTextView = (CircleTextView) itemView.findViewById(R.id.real_time_form_menu_icon);
-            contentTextView = (TextView) itemView.findViewById(R.id.real_time_form_menu_content);
-            menuLinearLayout = (LinearLayout) itemView.findViewById(R.id.real_time_form_menu_ll);
-        }
-    }
-
-    public interface OnItemClickListener {
-        void onItemClick(View view, int position);
-    }
-}

+ 0 - 37
app_modular/appmessages/src/main/java/com/modular/appmessages/model/RealTimeFormMenuBean.java

@@ -1,37 +0,0 @@
-package com.modular.appmessages.model;
-
-/**
- * @author RaoMeng
- * @describe
- * @date 2017/10/25 19:07
- */
-
-public class RealTimeFormMenuBean {
-    private int mId;
-    private int mColor;
-    private String mTitle;
-
-    public int getId() {
-        return mId;
-    }
-
-    public void setId(int id) {
-        mId = id;
-    }
-
-    public int getColor() {
-        return mColor;
-    }
-
-    public void setColor(int color) {
-        mColor = color;
-    }
-
-    public String getTitle() {
-        return mTitle;
-    }
-
-    public void setTitle(String title) {
-        mTitle = title;
-    }
-}

+ 1 - 1
app_modular/appmessages/src/main/java/com/modular/appmessages/presenter/MessagePresenter.java

@@ -49,7 +49,7 @@ import com.modular.appmessages.activity.ApprovalNewListActivity;
 import com.modular.appmessages.activity.BusinessTargetsActivity;
 import com.modular.appmessages.activity.MsgsSecondCommonActivity;
 import com.modular.appmessages.activity.ProcessB2BActivity;
-import com.modular.appmessages.activity.RealTimeFormActivity;
+import com.uas.appworks.activity.RealTimeFormActivity;
 import com.modular.appmessages.activity.Subscription2Activity;
 import com.modular.appmessages.activity.UUHelperActivity;
 import com.modular.appmessages.db.SubsDao;

+ 0 - 40
app_modular/appmessages/src/main/res/layout/activity_real_time_form.xml

@@ -1,40 +0,0 @@
-<?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="match_parent"
-    android:background="@color/me_menu_item_normal">
-
-    <android.support.v7.widget.RecyclerView
-        android:id="@+id/real_time_form_rv"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:overScrollMode="never"
-        android:padding="20dp" />
-
-    <LinearLayout
-        android:id="@+id/real_time_form_empty_ll"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_centerInParent="true"
-        android:background="@color/white"
-        android:gravity="center"
-        android:orientation="vertical"
-        android:visibility="gone">
-
-        <pl.droidsonroids.gif.GifImageView
-            android:layout_width="110dp"
-            android:layout_height="110dp"
-            android:scaleType="fitEnd"
-            android:src="@drawable/gif_empty_view" />
-
-        <TextView
-            android:id="@+id/real_time_form_msg_tv"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="90dp"
-            android:text="看板数据为空"
-            android:textColor="@color/empty_text_color"
-            android:textSize="14sp" />
-    </LinearLayout>
-</FrameLayout>

+ 0 - 34
app_modular/appmessages/src/main/res/layout/item_grid_real_time_form_menu.xml

@@ -1,34 +0,0 @@
-<?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"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/real_time_form_menu_ll"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@color/me_menu_item_normal"
-    android:gravity="center"
-    android:orientation="vertical"
-    android:padding="10dp">
-
-    <com.core.widget.CircleTextView
-        android:id="@+id/real_time_form_menu_icon"
-        android:layout_width="50dp"
-        android:layout_height="50dp"
-        android:gravity="center"
-        android:textColor="@color/white"
-        android:textSize="18sp"
-        app:backgroundColor="#4d70a6"
-        tools:text="B" />
-
-    <TextView
-        android:id="@+id/real_time_form_menu_content"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="10dp"
-        android:ellipsize="end"
-        android:gravity="center_horizontal"
-        android:lines="2"
-        android:textSize="14sp"
-        tools:text="BOM" />
-</LinearLayout>

+ 126 - 2
app_modular/apputils/src/main/java/com/modular/apputils/activity/BillDetailsActivity.java

@@ -6,11 +6,15 @@ import android.content.Intent;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.v7.widget.LinearLayoutManager;
+import android.support.design.widget.TabLayout;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.TextView;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -28,6 +32,7 @@ import com.core.base.OABaseActivity;
 import com.core.model.SelectBean;
 import com.core.utils.CommonUtil;
 import com.core.utils.ToastUtil;
+import com.core.utils.helper.AvatarHelper;
 import com.core.utils.time.wheel.DateTimePicker;
 import com.core.widget.view.Activity.ImgFileListActivity;
 import com.core.widget.view.Activity.SelectActivity;
@@ -38,6 +43,7 @@ import com.modular.apputils.presenter.BillDetailsPresenter;
 import com.modular.apputils.presenter.imp.IBillDetails;
 import com.modular.apputils.widget.BillUpdatePopup;
 import com.modular.apputils.widget.VeriftyDialog;
+import com.modular.apputils.widget.WrapContentLinearLayoutManager;
 import com.module.recyclerlibrary.ui.refresh.EmptyRecyclerView;
 
 import java.io.File;
@@ -46,6 +52,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import de.hdodenhof.circleimageview.CircleImageView;
+
 public class BillDetailsActivity extends OABaseActivity implements IBillDetails, BillUpdatePopup.OnUpdateSelectListener {
     public final int REQUESTCODE_C = 0x21;
     public final int REQUESTCODE_DB_FIND = 0x22;
@@ -59,6 +67,12 @@ public class BillDetailsActivity extends OABaseActivity implements IBillDetails,
     protected BillDetailsPresenter mBillDetailsPresenter;
     protected String status;
     protected BillDetailsAdapter mBillDetailsAdapter;
+    protected LinearLayout mHeaderLayout;//头部布局
+    protected CircleImageView mHeaderImageView;//头像
+    protected TextView mNameTextView, mStatusTextView;
+    public FrameLayout mTopLayout;//recycleview顶部悬浮布局
+    public TabLayout mTabLayout;//悬浮tablayout
+    private RecyclerView.AdapterDataObserver mAdapterDataObserver;
     protected boolean isMe;//是否是自己的单据
     protected BillUpdatePopup mBillUpdatePopup;
     public int selectPosition = -1;
@@ -140,11 +154,38 @@ public class BillDetailsActivity extends OABaseActivity implements IBillDetails,
 
 
     protected void initView() {
+        mHeaderLayout = findViewById(R.id.bill_detail_header_ll);
+        mHeaderImageView = findViewById(R.id.bill_detail_header_avatar_iv);
+        mNameTextView = findViewById(R.id.bill_detail_header_name_tv);
+        mStatusTextView = findViewById(R.id.bill_detail_header_status_tv);
+
+        mTopLayout = findViewById(R.id.bill_detail_top_fl);
         EmptyRecyclerView mEmptyRecyclerView = findViewById(R.id.mEmptyRecyclerView);
         mRecyclerView = mEmptyRecyclerView.getRecyclerView();
-        mRecyclerView.setLayoutManager(new LinearLayoutManager(ct));
+        mRecyclerView.setLayoutManager(new WrapContentLinearLayoutManager(ct));
 
         mBillUpdatePopup = new BillUpdatePopup(mContext, this);
+
+        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+                super.onScrolled(recyclerView, dx, dy);
+                //控制顶部TabLayout是否显示
+                if (mBillDetailsAdapter != null && mBillDetailsAdapter.mTabIndex != -1) {
+                    RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
+                    if (layoutManager instanceof WrapContentLinearLayoutManager && mTopLayout != null) {
+                        WrapContentLinearLayoutManager linearLayoutManager = (WrapContentLinearLayoutManager) layoutManager;
+                        int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
+                        if (firstVisibleItemPosition >= mBillDetailsAdapter.mTabIndex) {
+                            mTopLayout.setVisibility(View.VISIBLE);
+                            mTopLayout.requestLayout();
+                        } else {
+                            mTopLayout.setVisibility(View.GONE);
+                        }
+                    }
+                }
+            }
+        });
     }
 
 
@@ -157,6 +198,9 @@ public class BillDetailsActivity extends OABaseActivity implements IBillDetails,
             if (status.equals("已审核")) {
                 supportInvalidateOptionsMenu();
             }
+            if (mStatusTextView != null) {
+                mStatusTextView.setText(status == null ? "" : status);
+            }
         }
     }
 
@@ -165,6 +209,17 @@ public class BillDetailsActivity extends OABaseActivity implements IBillDetails,
         if (mBillDetailsAdapter == null) {
             mBillDetailsAdapter = newBillDetailsAdapter(groupModels);
             mRecyclerView.setAdapter(mBillDetailsAdapter);
+            mAdapterDataObserver = new RecyclerView.AdapterDataObserver() {
+                @Override
+                public void onChanged() {
+                    if (mBillDetailsAdapter.mTabIndex != -1 && mBillDetailsAdapter.mTabPosition != -1
+                            && mTabLayout != null && mTabLayout.getSelectedTabPosition() != mBillDetailsAdapter.mTabPosition) {
+                        //recycleview数据改变时,切换悬浮tablayout的选中状态
+                        mTabLayout.getTabAt(mBillDetailsAdapter.mTabPosition).select();
+                    }
+                }
+            };
+            mBillDetailsAdapter.registerAdapterDataObserver(mAdapterDataObserver);
         } else {
             mBillDetailsAdapter.updateGroupModels(groupModels);
             mBillDetailsAdapter.notifyDataSetChanged();
@@ -204,6 +259,68 @@ public class BillDetailsActivity extends OABaseActivity implements IBillDetails,
         mBillDetailsPresenter.saveAndSubmit(mBillDetailsAdapter.getBillGroupModels());
     }
 
+    @Override
+    public void addTopLayout(View... view) {
+        if (mTopLayout == null) {
+            return;
+        }
+        if (view != null && view.length > 0) {
+            mTopLayout.addView(view[0]);
+            if (view.length > 1 && view[1] instanceof TabLayout) {
+                mTabLayout = (TabLayout) view[1];
+                if (mTabLayout != null) {
+                    mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+                        @Override
+                        public void onTabSelected(TabLayout.Tab tab) {
+                            int tabPosition = tab.getPosition();
+                            if (mBillDetailsAdapter != null && mBillDetailsAdapter.mTabIndex != -1
+                                    && tabPosition != mBillDetailsAdapter.mTabPosition) {
+//                                mBillDetailsAdapter.switchTabIndex(tabPosition);
+                                mBillDetailsAdapter.switchTabData(tabPosition);
+                                mBillDetailsAdapter.notifyDataSetChanged();
+                                mRecyclerView.scrollToPosition(mBillDetailsAdapter.mTabIndex);
+//                                WrapContentLinearLayoutManager mLayoutManager =
+//                                        (WrapContentLinearLayoutManager) mRecyclerView.getLayoutManager();
+//                                mLayoutManager.scrollToPositionWithOffset(mBillAdapter.mTabIndex, 0);
+                            }
+                        }
+
+                        @Override
+                        public void onTabUnselected(TabLayout.Tab tab) {
+
+                        }
+
+                        @Override
+                        public void onTabReselected(TabLayout.Tab tab) {
+
+                        }
+                    });
+                }
+            }
+        } else {
+            mTopLayout.setVisibility(View.GONE);
+            mTopLayout.removeAllViews();
+            mTopLayout.invalidate();
+        }
+    }
+
+    @Override
+    public void showHeaderLayout(boolean show) {
+        if (mHeaderLayout == null) {
+            return;
+        }
+        if (show) {
+            String loginUserId = MyApplication.getInstance().mLoginUser.getUserId();
+            AvatarHelper.getInstance().display(loginUserId, mHeaderImageView, true, false);
+            String nickName = MyApplication.getInstance().mLoginUser.getNickName();
+            mNameTextView.setText(nickName == null ? "" : nickName);
+            mStatusTextView.setText(status);
+            mHeaderLayout.setVisibility(View.VISIBLE);
+        } else {
+            mHeaderLayout.setVisibility(View.GONE);
+        }
+    }
+
     @Override
     public void onUpdateSelect(int position, BillGroupModel.BillModel model) {
         if (TextUtils.isEmpty(model.getType())) {
@@ -600,4 +717,11 @@ public class BillDetailsActivity extends OABaseActivity implements IBillDetails,
         mBillUpdatePopup.getBillUpdateAdapter().notifyDataSetChanged();
     }
 
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (mBillDetailsAdapter != null && mAdapterDataObserver != null) {
+            mBillDetailsAdapter.unregisterAdapterDataObserver(mAdapterDataObserver);
+        }
+    }
 }

+ 147 - 21
app_modular/apputils/src/main/java/com/modular/apputils/activity/BillInputActivity.java

@@ -7,14 +7,18 @@ import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
+import android.support.design.widget.TabLayout;
 import android.support.v7.widget.DividerItemDecoration;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
+import android.widget.FrameLayout;
 import android.widget.LinearLayout;
+import android.widget.TableLayout;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -42,6 +46,7 @@ import com.modular.apputils.model.BillGroupModel;
 import com.modular.apputils.model.BillListConfig;
 import com.modular.apputils.presenter.BillPresenter;
 import com.modular.apputils.presenter.imp.IBill;
+import com.modular.apputils.widget.WrapContentLinearLayoutManager;
 
 import java.io.File;
 import java.io.Serializable;
@@ -49,6 +54,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 
 /**
@@ -66,9 +72,15 @@ public class BillInputActivity extends OABaseActivity implements IBill, BillAdap
     public RecyclerView mRecyclerView;
     public BillPresenter mBillPresenter;
     public BillAdapter mBillAdapter;
+    public FrameLayout mTopLayout;
+    public TabLayout mTabLayout;
     private String mListCondition;
+    private RecyclerView.AdapterDataObserver mAdapterDataObserver;
+    protected boolean needItemDecoration = true;
     public int selectPosition = -1;//当前选择调转界面的index,本来不想添加全局变量的,没有办法
     private HashMap<String, String> dbFindCondition;
+    private View mRootLL;
+    private boolean isAutoSwitch = false;
 
     //TODO 重写方法实现自定义的 BillPresenter,必须继承于BillPresenter
     public BillPresenter newBillPresenter() {
@@ -127,18 +139,24 @@ public class BillInputActivity extends OABaseActivity implements IBill, BillAdap
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_bill_input);
+        setLayout();
         initView();
         init();
     }
 
+    /**
+     * 设置页面资源文件,可以通过继承修改
+     */
+    protected void setLayout() {
+        setContentView(R.layout.activity_bill_input);
+    }
+
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         getMenuInflater().inflate(R.menu.menu_bill_input, menu);
         return super.onCreateOptionsMenu(menu);
     }
 
-
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         if (item.getItemId() == R.id.saveAndSubmit) {
@@ -172,13 +190,16 @@ public class BillInputActivity extends OABaseActivity implements IBill, BillAdap
 
     }
 
-
     private void initView() {
+        mTopLayout = findViewById(R.id.bill_input_top_fl);
         mRecyclerView = findViewById(R.id.mRecyclerView);
-        mRecyclerView.setLayoutManager(new LinearLayoutManager(ct));
-        mRecyclerView.addItemDecoration(new DividerItemDecoration(ct, LinearLayout.VERTICAL));
+        mRecyclerView.setLayoutManager(new WrapContentLinearLayoutManager(ct,
+                LinearLayoutManager.VERTICAL, false));
+        if (needItemDecoration) {
+            mRecyclerView.addItemDecoration(new DividerItemDecoration(ct, LinearLayout.VERTICAL));
+        }
+        mRootLL = findViewById(R.id.mRootLL);
         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
-            final View mRootLL = findViewById(R.id.mRootLL);
             mRootLL.post(new Runnable() {
                 @Override
                 public void run() {
@@ -187,6 +208,26 @@ public class BillInputActivity extends OABaseActivity implements IBill, BillAdap
                 }
             });
         }
+        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+                super.onScrolled(recyclerView, dx, dy);
+                //控制顶部TabLayout是否显示
+                if (mBillAdapter != null && mBillAdapter.mTabIndex != -1) {
+                    RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
+                    if (layoutManager instanceof WrapContentLinearLayoutManager && mTopLayout != null) {
+                        WrapContentLinearLayoutManager linearLayoutManager = (WrapContentLinearLayoutManager) layoutManager;
+                        int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
+                        if (firstVisibleItemPosition >= mBillAdapter.mTabIndex) {
+                            mTopLayout.setVisibility(View.VISIBLE);
+                            mTopLayout.requestLayout();
+                        } else {
+                            mTopLayout.setVisibility(View.GONE);
+                        }
+                    }
+                }
+            }
+        });
     }
 
     @Override
@@ -194,19 +235,87 @@ public class BillInputActivity extends OABaseActivity implements IBill, BillAdap
         if (mBillAdapter == null) {
             mBillAdapter = newBillAdapter(groupModels);
             mRecyclerView.setAdapter(mBillAdapter);
+            mAdapterDataObserver = new RecyclerView.AdapterDataObserver() {
+                @Override
+                public void onChanged() {
+                    if (mBillAdapter.mTabIndex != -1 && mBillAdapter.mTabPosition != -1
+                            && mTabLayout != null && mTabLayout.getSelectedTabPosition() != mBillAdapter.mTabPosition) {
+                        mTabLayout.getTabAt(mBillAdapter.mTabPosition).select();
+                    }
+                }
+            };
+            mBillAdapter.registerAdapterDataObserver(mAdapterDataObserver);
         } else {
             mBillAdapter.setBillGroupModels(groupModels);
             mBillAdapter.notifyDataSetChanged();
         }
     }
 
-
     @Override
     public void updateFileOk() {
         dimssLoading();
         mBillPresenter.saveAndSubmit(mBillAdapter.getBillGroupModels());
     }
 
+    @Override
+    public void addTopLayout(View... view) {
+        if (view != null && view.length > 0) {
+            mTopLayout.removeAllViews();
+            mTopLayout.addView(view[0]);
+
+            if (view.length > 1 && view[1] instanceof TabLayout) {
+                mTabLayout = (TabLayout) view[1];
+                if (mTabLayout != null) {
+                    mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+                        @Override
+                        public void onTabSelected(TabLayout.Tab tab) {
+                            final int tabPosition = tab.getPosition();
+                            if (mBillAdapter != null && mBillAdapter.mTabIndex != -1
+                                    && (isAutoSwitch || tabPosition != mBillAdapter.mTabPosition)) {
+                                if (isAutoSwitch) {
+                                    //自动切换到选中tab的数据源
+                                    new Handler().postDelayed(new Runnable() {
+                                        @Override
+                                        public void run() {
+                                            mBillAdapter.switchTabData(tabPosition);
+                                            mBillAdapter.notifyDataSetChanged();
+                                            mRecyclerView.scrollToPosition(mBillAdapter.mTabIndex);
+                                        }
+                                    }, 100);
+                                } else {
+                                    mBillAdapter.switchTabData(tabPosition);
+                                    mBillAdapter.notifyDataSetChanged();
+                                    mRecyclerView.scrollToPosition(mBillAdapter.mTabIndex);
+                                }
+                                isAutoSwitch = false;
+                            }
+                        }
+
+                        @Override
+                        public void onTabUnselected(TabLayout.Tab tab) {
+
+                        }
+
+                        @Override
+                        public void onTabReselected(TabLayout.Tab tab) {
+
+                        }
+                    });
+                    if (mBillAdapter != null && mTabLayout.getTabCount() > mBillAdapter.mTabPosition) {
+                        isAutoSwitch = true;
+                        mTabLayout.getTabAt(mBillAdapter.mTabPosition).select();
+                    }
+                }
+            }
+//            mTopLayout.invalidate();
+//            mRootLL.invalidate();
+        } else {
+            mTopLayout.setVisibility(View.GONE);
+            mTopLayout.removeAllViews();
+            mTopLayout.invalidate();
+        }
+    }
+
     @Override
     public void toSelect(int position, BillGroupModel.BillModel model) {
         if (TextUtils.isEmpty(model.getType())) return;
@@ -279,6 +388,10 @@ public class BillInputActivity extends OABaseActivity implements IBill, BillAdap
         }
     }
 
+    @Override
+    public void toOpenEnclosure(int position, BillGroupModel.BillModel model) {
+
+    }
 
     private void toSelectEnclosure() {
         Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
@@ -387,6 +500,10 @@ public class BillInputActivity extends OABaseActivity implements IBill, BillAdap
     }
 
     public void findBydbFind(BillGroupModel.BillModel model, String condition) {
+        findBydbFind(model, condition, null);
+    }
+
+    public void findBydbFind(BillGroupModel.BillModel model, String condition, Bundle extras) {
         String gridCaller = "";
         String fieldKey = model.getField();
         BillGroupModel mGroupModel = mBillAdapter.getBillGroupModel(model.getGroupIndex());
@@ -406,17 +523,21 @@ public class BillInputActivity extends OABaseActivity implements IBill, BillAdap
         } else {
             mCondition = condition;
         }
-
-        startActivityForResult(new Intent(ct, SelectNetAcitivty.class)
-                        .putExtra("fieldKey", fieldKey)
-                        .putExtra("caller", mGroupModel == null ? mBillPresenter.getFormCaller()
-                                : mGroupModel.getBillCaller())
-                        .putExtra("gCaller", gridCaller)
-                        .putExtra("mCondition", mCondition)
-                        .putExtra("isDevice", false)
-                        .putExtra("isForm", isForm)
-                        .putExtra("groupId", model.getGroupIndex())
-                , REQUESTCODE_DB_FIND);
+        Intent intent = new Intent(ct, SelectNetAcitivty.class)
+                .putExtra("fieldKey", fieldKey)
+                .putExtra("caller", mGroupModel == null ? mBillPresenter.getFormCaller()
+                        : mGroupModel.getBillCaller())
+                .putExtra("gCaller", gridCaller)
+                .putExtra("mCondition", mCondition)
+                .putExtra("isDevice", false)
+                .putExtra("isForm", isForm)
+                .putExtra("groupId", model.getGroupIndex());
+        if (extras != null) {
+            for (String key : extras.keySet()) {
+                intent.putExtra(key, extras.getString(key));
+            }
+        }
+        startActivityForResult(intent, REQUESTCODE_DB_FIND);
     }
 
     /**
@@ -489,8 +610,8 @@ public class BillInputActivity extends OABaseActivity implements IBill, BillAdap
                 SelectBean mSelectBeanC = data.getParcelableExtra("data");
                 int position = data.getIntExtra("id", -1);
                 if (mSelectBeanC != null && position >= 0) {
-                    String display = StringUtil.isEmpty(mSelectBeanC.getName()) ? "" : mSelectBeanC.getName();
                     String value = StringUtil.isEmpty(mSelectBeanC.getName()) ? "" : mSelectBeanC.getName();
+                    String display = StringUtil.isEmpty(mSelectBeanC.getName()) ? "" : mSelectBeanC.getName();
                     mBillAdapter.updateBillModelValues(position, value, display);
                 }
                 break;
@@ -609,9 +730,14 @@ public class BillInputActivity extends OABaseActivity implements IBill, BillAdap
                 }
             }
         }
-
         mBillAdapter.notifyDataSetChanged();
     }
 
-
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (mBillAdapter != null && mAdapterDataObserver != null) {
+            mBillAdapter.unregisterAdapterDataObserver(mAdapterDataObserver);
+        }
+    }
 }

+ 3 - 2
app_modular/apputils/src/main/java/com/modular/apputils/activity/SelectNetAcitivty.java

@@ -42,6 +42,7 @@ import com.uuzuche.lib_zxing.activity.CaptureActivity;
 import com.uuzuche.lib_zxing.activity.CodeUtils;
 
 import java.util.ArrayList;
+import java.util.IdentityHashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -340,7 +341,7 @@ public class SelectNetAcitivty extends OABaseActivity {
 
     private void setData2Adapter(JSONArray data, JSONArray dbfinds) throws Exception {
         if (configMap == null || TextUtils.isEmpty(fieldKeyLike)) {
-            configMap = new LinkedHashMap<>();
+            configMap = new IdentityHashMap<>();
             //获取配置
             JSONObject config = null;
             for (int i = 0; i < dbfinds.size(); i++) {
@@ -363,7 +364,7 @@ public class SelectNetAcitivty extends OABaseActivity {
             o = data.getJSONObject(i);
             b = new Bean();
             b.name = JSONUtil.getText(o, fieldKeyLike);
-            jsonMap = new LinkedHashMap<>();
+            jsonMap = new IdentityHashMap<>();
             for (Map.Entry<String, String> e : configMap.entrySet()) {
                 jsonMap.put(e.getValue(), JSONUtil.getText(o, e.getKey()));
             }

+ 239 - 105
app_modular/apputils/src/main/java/com/modular/apputils/adapter/BillAdapter.java

@@ -35,7 +35,8 @@ import java.util.List;
  * 0.标题
  * 1.请选择
  */
-public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder> implements View.OnClickListener {
+public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder>
+        implements View.OnClickListener {
 
     public Context ct;
     protected List<BillGroupModel> mBillGroupModels;
@@ -47,8 +48,8 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
     //所有字段列表
     protected List<BillGroupModel.BillModel> mAllBillModels;
     protected OnAdapterListener mOnAdapterListener;
-    protected int mTabIndex = -1;
-    private int mTabPosition = 0;
+    public int mTabIndex = -1;
+    public int mTabPosition = 0;
     private List<BillGroupModel> mOldTabModels;
 
     public BillAdapter(Context ct, List<BillGroupModel> mBillGroupModels, OnAdapterListener mOnAdapterListener) {
@@ -133,10 +134,12 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
             mAllBillModels.clear();
         }
 
+        //从表的起始Groupindex
+        int gridStartIndex = -1;
         for (int i = 0; i < mBillGroupModels.size(); i++) {
-            BillGroupModel e = mBillGroupModels.get(i);
-            if (e != null) {
-                List<BillGroupModel.GridTab> gridTabs = e.getGridTabs();
+            BillGroupModel groupModel = mBillGroupModels.get(i);
+            if (groupModel != null) {
+                List<BillGroupModel.GridTab> gridTabs = groupModel.getGridTabs();
                 if (gridTabs != null && gridTabs.size() > 0) {
                     BillGroupModel.BillModel mTabBillModel = new BillGroupModel.BillModel();
                     mTabBillModel.setType(BillGroupModel.Constants.TYPE_TAB);
@@ -144,40 +147,47 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
                     mTabBillModel.setGroupIndex(i);
                     mShowBillModels.add(mTabBillModel);
                 } else {
-                    if (e.getShowBillFields() != null && !e.getShowBillFields().isEmpty()) {
-                        if (!TextUtils.isEmpty(e.getGroup())) {
+                    if (groupModel.getShowBillFields() != null && !groupModel.getShowBillFields().isEmpty()) {
+                        if (!TextUtils.isEmpty(groupModel.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");
+                            if (groupModel.isForm()) {
+                                mTitleBillModel.setCaption(groupModel.getGroup());
+                            } else {
+                                if (gridStartIndex == -1) {
+                                    gridStartIndex = i;
+                                }
+                                mTitleBillModel.setCaption("明细" + (i - gridStartIndex + 1));
+                            }
+                            mTitleBillModel.setAllowBlank(groupModel.isDeleteAble() ? "T" : "F");
                             mShowBillModels.add(mTitleBillModel);
                         }
-                        mShowBillModels.addAll(e.getShowBillFields());
+                        mShowBillModels.addAll(groupModel.getShowBillFields());
 
-                        if (!e.isForm() && e.isLastInType()) {
+                        if (!groupModel.isForm() && groupModel.isLastInType()) {
                             mShowBillModels.add(getAddModel(i));
                         }
                     }
 
-                    if (e.getUpdateBillFields() != null && !e.getUpdateBillFields().isEmpty()) {
-                        mUpdateBillModels.addAll(e.getUpdateBillFields());
+                    if (groupModel.getUpdateBillFields() != null && !groupModel.getUpdateBillFields().isEmpty()) {
+                        mUpdateBillModels.addAll(groupModel.getUpdateBillFields());
                     }
                 }
 
-                if (e.isForm()) {
-                    if (e.getShowBillFields() != null) {
-                        mFormBillModels.addAll(e.getShowBillFields());
+                if (groupModel.isForm()) {
+                    if (groupModel.getShowBillFields() != null) {
+                        mFormBillModels.addAll(groupModel.getShowBillFields());
                     }
-                    if (e.getHideBillFields() != null) {
-                        mFormBillModels.addAll(e.getHideBillFields());
+                    if (groupModel.getHideBillFields() != null) {
+                        mFormBillModels.addAll(groupModel.getHideBillFields());
                     }
                 }
-                if (e.getShowBillFields() != null && !e.getShowBillFields().isEmpty()) {
-                    mAllBillModels.addAll(e.getShowBillFields());
+                if (groupModel.getShowBillFields() != null && !groupModel.getShowBillFields().isEmpty()) {
+                    mAllBillModels.addAll(groupModel.getShowBillFields());
                 }
-                if (e.getHideBillFields() != null && !e.getHideBillFields().isEmpty()) {
-                    mAllBillModels.addAll(e.getHideBillFields());
+                if (groupModel.getHideBillFields() != null && !groupModel.getHideBillFields().isEmpty()) {
+                    mAllBillModels.addAll(groupModel.getHideBillFields());
                 }
             }
         }
@@ -224,10 +234,14 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
     @Override
     public int getItemViewType(int position) {
         if (mShowBillModels != null && mShowBillModels.size() > position) {
-            int itemViewType = BillTypeChangeUtils.getItemViewType(mShowBillModels.get(position).getType());
+            BillGroupModel.BillModel billModel = mShowBillModels.get(position);
+            int itemViewType = BillTypeChangeUtils.getItemViewType(billModel.getType());
             if (itemViewType == 111) {
                 mTabIndex = position;
             }
+            if ("detailAttach".equals(billModel.getRenderer())) {
+                itemViewType = 2;
+            }
             return itemViewType;
         }
         return super.getItemViewType(position);
@@ -239,22 +253,23 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
         BaseViewHolder viewHolder = null;
         switch (viewType) {
             case 0:
-                viewHolder = new TitleViewHolder(parent, R.layout.item_bill_title);
+                viewHolder = new TitleViewHolder(parent, getTitleLayout());
                 break;
             case 1:
-                viewHolder = new InputViewHolder(parent, R.layout.item_bill_input_select);
+                viewHolder = new InputViewHolder(parent, getInputLayout());
+                break;
+            case 2://附件类型
+//                viewHolder = new EnclosureViewHolder(parent, R.layout.item_bill_enclosure);
+                viewHolder = new ImageViewHolder(parent, getImagesLayout());
                 break;
-            case 2:
-                viewHolder = new EnclosureViewHolder(parent, R.layout.item_bill_enclosure);
-                break;//附件类型
             case 110:
-                viewHolder = new AddViewHolder(parent, R.layout.item_bill_add);
+                viewHolder = new AddViewHolder(parent, getAddLayout());
                 break;
             case 111:
-                viewHolder = new TabViewHolder(parent, R.layout.item_bill_tab);
+                viewHolder = new TabViewHolder(parent, getTabLayout());
                 break;
             default:
-                viewHolder = new BaseViewHolder(parent, R.layout.item_bill_title) {
+                viewHolder = new BaseViewHolder(parent, getTitleLayout()) {
                     @Override
                     public void initView(View view) {
 
@@ -264,12 +279,35 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
         return viewHolder;
     }
 
-
     @Override
     public int getItemCount() {
         return mShowBillModels == null ? 0 : mShowBillModels.size();
     }
 
+    @LayoutRes
+    protected int getTitleLayout() {
+        return R.layout.item_bill_title;
+    }
+
+    @LayoutRes
+    protected int getInputLayout() {
+        return R.layout.item_bill_input_select;
+    }
+
+    @LayoutRes
+    protected int getImagesLayout() {
+        return R.layout.item_bill_images;
+    }
+
+    @LayoutRes
+    protected int getAddLayout() {
+        return R.layout.item_bill_add;
+    }
+
+    @LayoutRes
+    protected int getTabLayout() {
+        return R.layout.item_bill_tab;
+    }
 
     private LayoutInflater mLayoutInflater;
 
@@ -280,7 +318,6 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
         return mLayoutInflater;
     }
 
-
     public abstract class BaseViewHolder extends RecyclerView.ViewHolder {
 
         public BaseViewHolder(ViewGroup parent, @LayoutRes int layoutId) {
@@ -330,11 +367,29 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
 
     //附件类型
     class EnclosureViewHolder extends BaseViewHolder {
+        public TextView captionTv;
+        public TextView muchInputTv;
+        public TextView valueTv;
+
+        public EnclosureViewHolder(ViewGroup parent, int layoutId) {
+            super(parent, layoutId);
+        }
+
+        @Override
+        public void initView(View view) {
+            captionTv = view.findViewById(R.id.captionTv);
+            muchInputTv = view.findViewById(R.id.muchInputTv);
+            valueTv = view.findViewById(R.id.enclosure_values_tv);
+        }
+    }
+
+    //图片类型
+    class ImageViewHolder extends BaseViewHolder {
         private TextView captionTv;
         private TextView muchInputTv;
         private MyGridView ffGv;
 
-        public EnclosureViewHolder(ViewGroup parent, int layoutId) {
+        public ImageViewHolder(ViewGroup parent, int layoutId) {
             super(parent, layoutId);
         }
 
@@ -372,25 +427,30 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
         @Override
         public void initView(View view) {
             mTabLayout = (TabLayout) view.findViewById(R.id.bill_tab_tl);
-            final List<BillGroupModel.GridTab> tabList = mShowBillModels.get(mTabIndex).getTabList();
-            if (tabList != null && tabList.size() > 0) {
-                for (int i = 0; i < tabList.size(); i++) {
-                    BillGroupModel.GridTab gridTab = tabList.get(i);
-                    if (gridTab != null) {
-                        mTabLayout.addTab(mTabLayout.newTab().setText(gridTab.getTitle()));
+            if (mTabIndex != -1) {
+                BillGroupModel.BillModel billModel = mShowBillModels.get(mTabIndex);
+                final List<BillGroupModel.GridTab> tabList = billModel.getTabList();
+                if (tabList != null && tabList.size() > 0) {
+                    for (int i = 0; i < tabList.size(); i++) {
+                        BillGroupModel.GridTab gridTab = tabList.get(i);
+                        if (gridTab != null) {
+                            mTabLayout.addTab(mTabLayout.newTab().setText(gridTab.getTitle()));
+                        }
                     }
                 }
-            }
-            if (mTabLayout.getTabCount() > 4) {
-                mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
-            } else {
-                mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+                if (mTabPosition >= 0) {
+                    mTabLayout.getTabAt(mTabPosition).select();
+                }
+                if (mTabLayout.getTabCount() > 4) {
+                    mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
+                } else {
+                    mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+                }
             }
         }
 
     }
 
-
     @Override
     public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
         BillGroupModel.BillModel model = null;
@@ -398,16 +458,19 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
             model = mShowBillModels.get(position);
         }
         try {
+            holder.itemView.setTag(model);
             if (holder instanceof InputViewHolder) {
                 bindInputView((InputViewHolder) holder, model, position);
             } else if (holder instanceof TitleViewHolder) {
                 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);
+            } else if (holder instanceof ImageViewHolder) {
+                bindImageView((ImageViewHolder) holder, model, position);
             } else if (holder instanceof TabViewHolder) {
                 bindTabView((TabViewHolder) holder, model, position);
+            } else if (holder instanceof EnclosureViewHolder) {
+                bindEnclosureView((EnclosureViewHolder) holder, model, position);
             }
         } catch (Exception e) {
             LogUtil.i("gong", position + "  e=" + e.getMessage());
@@ -415,20 +478,34 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
 
     }
 
+    private void bindEnclosureView(EnclosureViewHolder mInputViewHolder, BillGroupModel.BillModel model, int position) {
+        if (model != null) {
+            mInputViewHolder.captionTv.setText(model.getCaption());
+            mInputViewHolder.muchInputTv.setVisibility(model.getAllowBlank().equals("F") ? View.VISIBLE : View.INVISIBLE);
+            mInputViewHolder.valueTv.setText(model.getValue());
+            mInputViewHolder.valueTv.setTag(R.id.tag_key, position);
+            mInputViewHolder.valueTv.setOnClickListener(this);
+        }
+    }
+
     private void bindTabView(TabViewHolder holder, final BillGroupModel.BillModel model, final int position) {
         if (holder.mTabLayout.getTag() != null && holder.mTabLayout.getTag() instanceof MyTabChangeListener) {
             holder.mTabLayout.removeOnTabSelectedListener((TabLayout.OnTabSelectedListener) holder.mTabLayout.getTag());
         }
-        MyTabChangeListener myTabChangeListener = new MyTabChangeListener(holder.mTabLayout, position);
+        MyTabChangeListener myTabChangeListener = new MyTabChangeListener(position);
         holder.mTabLayout.addOnTabSelectedListener(myTabChangeListener);
+        int selectedTabPosition = holder.mTabLayout.getSelectedTabPosition();
+        if (mTabPosition >= 0 && mTabPosition != selectedTabPosition) {
+            holder.mTabLayout.getTabAt(mTabPosition).select();
+        }
         holder.mTabLayout.setTag(myTabChangeListener);
     }
 
     //绑定附件字段
-    private void bindEnclosureView(EnclosureViewHolder holder, BillGroupModel.BillModel model, int position) {
+    private void bindImageView(ImageViewHolder holder, BillGroupModel.BillModel model, int position) {
         if (model != null) {
             holder.captionTv.setText(model.getCaption());
-            holder.muchInputTv.setVisibility(model.getAllowBlank().equals("F") ? View.VISIBLE : View.GONE);
+            holder.muchInputTv.setVisibility(model.getAllowBlank().equals("F") ? View.VISIBLE : View.INVISIBLE);
             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);
@@ -443,7 +520,6 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
         }
     }
 
-
     private void bindAddView(AddViewHolder mAddViewHolder, BillGroupModel.BillModel model, int position) throws Exception {
         if (model != null) {
             mAddViewHolder.addTv.setTag(model.getGroupIndex());
@@ -457,16 +533,17 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
                 mInputViewHolder.valuesEd.removeTextChangedListener((TextChangListener) mInputViewHolder.valuesEd.getTag());
             }
             mInputViewHolder.captionTv.setText(model.getCaption());
-            mInputViewHolder.muchInputTv.setVisibility(model.getAllowBlank().equals("F") ? View.VISIBLE : View.GONE);
-            mInputViewHolder.valuesEd.setText(model.getValue());
+            mInputViewHolder.muchInputTv.setVisibility(model.getAllowBlank().equals("F") ? View.VISIBLE : View.INVISIBLE);
+            setInputText(mInputViewHolder, model);
             if (model.getType().equals("N")) {
                 mInputViewHolder.valuesEd.setInputType(InputType.TYPE_CLASS_NUMBER);
             } else {
                 mInputViewHolder.valuesEd.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_CLASS_TEXT);
             }
-            if (model.getReadOnly().equals("T")) {
+            if (model.getReadOnly().equals("T") || model.getEditable().equals("F")) {
                 mInputViewHolder.valuesEd.setFocusable(false);
                 mInputViewHolder.valuesEd.setClickable(true);
+                mInputViewHolder.valuesEd.setLongClickable(false);
                 mInputViewHolder.valuesEd.setOnClickListener(null);
                 if (BillTypeChangeUtils.isSelect(model.getType())) {
                     mInputViewHolder.valuesEd.setHint("请选择");
@@ -480,6 +557,7 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
                 mInputViewHolder.valuesEd.setHint("请选择");
                 mInputViewHolder.valuesEd.setFocusable(false);
                 mInputViewHolder.valuesEd.setClickable(true);
+                mInputViewHolder.valuesEd.setLongClickable(true);
                 mInputViewHolder.selectIv.setVisibility(View.VISIBLE);
                 mInputViewHolder.valuesEd.setTag(R.id.tag, position);
                 mInputViewHolder.valuesEd.setTag(R.id.tag2, model);
@@ -500,6 +578,11 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
         }
     }
 
+    protected void setInputText(InputViewHolder mInputViewHolder, BillGroupModel.BillModel model) {
+        String value = model.getValue();
+        mInputViewHolder.valuesEd.setText(value);
+    }
+
     public void bindTitleView(TitleViewHolder mTitleViewHolder, BillGroupModel.BillModel model, int position) throws Exception {
         if (model != null) {
             if (model.getAllowBlank().equals("F")) {
@@ -551,31 +634,94 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
                     mOnAdapterListener.toEnclosureSelect(position, mShowBillModels.get(position));
                 }
             }
+        } else if (view.getId() == R.id.enclosure_values_tv) {
+            //查看附件
+            if (view.getTag(R.id.tag_key) != null && view.getTag(R.id.tag_key) instanceof Integer) {
+                int position = (int) view.getTag(R.id.tag_key);
+                if (mOnAdapterListener != null && position >= 0 && position < ListUtils.getSize(mShowBillModels)) {
+                    mOnAdapterListener.toOpenEnclosure(position, mShowBillModels.get(position));
+                }
+            }
         }
     }
 
     protected void addGroups(int mGroupIndex) {
-        BillGroupModel mBillGroupModel = mBillGroupModels.get(mGroupIndex);
-        mBillGroupModel.setLastInType(false);
-        int oldGridIndex = mBillGroupModel.getGridIndex();
-        boolean isForm = mBillGroupModel.isForm();
+        addGroupData(mGroupIndex);
+        setBillGroupModels(mBillGroupModels);
+
+        refreshTabData();
+        notifyDataSetChanged();
+    }
 
+    private void addGroupData(int mGroupIndex) {
+        BillGroupModel oldBillGroupModel = mBillGroupModels.get(mGroupIndex);
+        oldBillGroupModel.setLastInType(false);
+
+        BillGroupModel newBillGroupModel = newGridBillGroup(mGroupIndex, oldBillGroupModel);
+        mBillGroupModels.add(mGroupIndex + 1, newBillGroupModel);
+    }
+
+    private BillGroupModel newGridBillGroup(int mGroupIndex, BillGroupModel oldBillGroupModel) {
+        int oldGridIndex = oldBillGroupModel.getGridIndex();
+        boolean isForm = oldBillGroupModel.isForm();
         BillGroupModel newBillGroupModel = new BillGroupModel();
         newBillGroupModel.setForm(isForm);
         if (isForm) {
-            newBillGroupModel.setGroup(mBillGroupModel.getGroup());
+            newBillGroupModel.setGroup(oldBillGroupModel.getGroup());
         } else {
             newBillGroupModel.setGroup("明细" + (oldGridIndex + 1));
         }
+        newBillGroupModel.setBillCaller(oldBillGroupModel.getBillCaller());
         newBillGroupModel.setGridIndex(oldGridIndex + 1);
         newBillGroupModel.setDeleteAble(true);
         newBillGroupModel.setLastInType(true);
-        for (BillGroupModel.BillModel e : mBillGroupModel.getShowBillFields()) {
+        newBillGroupModel.setGroupIndex(mGroupIndex + 1);
+        for (BillGroupModel.BillModel e : oldBillGroupModel.getShowBillFields()) {
+            e.setGroupIndex(mGroupIndex);//保证添加的明细groupindex是正确的
             newBillGroupModel.addShow(new BillGroupModel.BillModel(e));
         }
-        mBillGroupModels.add(mGroupIndex + 1, newBillGroupModel);
+        for (BillGroupModel.BillModel e : oldBillGroupModel.getHideBillFields()) {
+            e.setGroupIndex(mGroupIndex);
+            newBillGroupModel.addHide(new BillGroupModel.BillModel(e));
+        }
+        return newBillGroupModel;
+    }
+
+    public void deleteGroup(int groupIndex) {
+        deleteGroupData(groupIndex);
         setBillGroupModels(mBillGroupModels);
 
+        refreshTabData();
+        notifyDataSetChanged();
+    }
+
+    private void deleteGroupData(int groupIndex) {
+        BillGroupModel deleteGroupModel = mBillGroupModels.get(groupIndex);
+        boolean isLastItem = deleteGroupModel.isLastInType();
+        if (isLastItem && groupIndex - 1 >= 0) {
+            BillGroupModel billGroupModel = mBillGroupModels.get(groupIndex - 1);
+            if (!deleteGroupModel.isForm()
+                    && (billGroupModel.isForm() || (billGroupModel.getGridTabs() != null && billGroupModel.getGridTabs().size() > 0))) {
+                //明细删除光了,要默认添加一个空明细表
+                deleteGroupModel.setGroupIndex(groupIndex - 1);
+                deleteGroupModel.setGridIndex(0);
+                BillGroupModel newGridGroup = newGridBillGroup(groupIndex - 1, deleteGroupModel);
+                newGridGroup.setDeleteAble(false);
+                mBillGroupModels.remove(groupIndex);
+                mBillGroupModels.add(newGridGroup);
+            } else {
+                billGroupModel.setLastInType(true);
+                mBillGroupModels.remove(groupIndex);
+            }
+        } else {
+            mBillGroupModels.remove(groupIndex);
+        }
+    }
+
+    /**
+     * 删除和添加明细时,更新tab数据
+     */
+    private void refreshTabData() {
         if (mTabIndex != -1) {
             BillGroupModel.BillModel tabModel = mShowBillModels.get(mTabIndex);
             if (tabModel != null) {
@@ -583,8 +729,6 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
                         .setBillGroupModels(mBillGroupModels.subList(tabModel.getGroupIndex() + 1, mBillGroupModels.size()));
             }
         }
-
-        notifyDataSetChanged();
     }
 
     public class TextChangListener extends EditChangeListener {
@@ -605,40 +749,16 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
         }
     }
 
-
     public class MyTabChangeListener implements TabLayout.OnTabSelectedListener {
-        private TabLayout mTabLayout;
-        private int mPosition;
 
-        public MyTabChangeListener(TabLayout tabLayout, int position) {
-            mTabLayout = tabLayout;
-            mPosition = position;
+        public MyTabChangeListener(int position) {
+            mTabIndex = position;
         }
 
         @Override
         public void onTabSelected(TabLayout.Tab tab) {
-            if (this.mPosition >= 0 && mShowBillModels != null && mShowBillModels.size() > this.mPosition && mTabLayout != null) {
-                mTabPosition = tab.getPosition();
-                BillGroupModel.BillModel model = mShowBillModels.get(mPosition);
-                if (model != null) {
-                    List<BillGroupModel.GridTab> tabList = model.getTabList();
-                    int tabGroupIndex = model.getGroupIndex();
-
-                    List<BillGroupModel> newGroupModels = new ArrayList<>();
-                    List<BillGroupModel> billGroupModels = mBillGroupModels.subList(0, tabGroupIndex + 1);
-                    mOldTabModels = mBillGroupModels.subList(tabGroupIndex + 1, mBillGroupModels.size());
-
-                    newGroupModels.addAll(billGroupModels);
-                    BillGroupModel.GridTab gridTab = tabList.get(mTabPosition);
-                    if (gridTab != null) {
-                        List<BillGroupModel> tabGroupModels = gridTab.getBillGroupModels();
-
-                        newGroupModels.addAll(tabGroupModels);
-                    }
-                    setBillGroupModels(newGroupModels);
-                    notifyDataSetChanged();
-                }
-            }
+            switchTabData(tab.getPosition());
+            notifyDataSetChanged();
         }
 
         @Override
@@ -652,11 +772,34 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
         }
     }
 
+    public void switchTabData(int tabPosition) {
+        mTabPosition = tabPosition;
+        if (mTabIndex >= 0 && mShowBillModels != null && mShowBillModels.size() > mTabIndex) {
+            BillGroupModel.BillModel model = mShowBillModels.get(mTabIndex);
+            if (model != null) {
+                List<BillGroupModel.GridTab> tabList = model.getTabList();
+                int tabGroupIndex = model.getGroupIndex();
+
+                List<BillGroupModel> newGroupModels = new ArrayList<>();
+                List<BillGroupModel> billGroupModels = mBillGroupModels.subList(0, tabGroupIndex + 1);
+                mOldTabModels = mBillGroupModels.subList(tabGroupIndex + 1, mBillGroupModels.size());
+
+                newGroupModels.addAll(billGroupModels);
+                BillGroupModel.GridTab gridTab = tabList.get(mTabPosition);
+                if (gridTab != null) {
+                    List<BillGroupModel> tabGroupModels = gridTab.getBillGroupModels();
+
+                    newGroupModels.addAll(tabGroupModels);
+                }
+                setBillGroupModels(newGroupModels);
+            }
+        }
+    }
 
     private void showDeleteGroup(final int groupIndex) {
         new VeriftyDialog.Builder(ct)
                 .setTitle(ct.getString(R.string.app_name))
-                .setContent("是否确认删除该单据?")
+                .setContent("是否确认删除该明细?")
                 .build(new VeriftyDialog.OnDialogClickListener() {
                     @Override
                     public void result(boolean clickSure) {
@@ -669,21 +812,12 @@ public class BillAdapter extends RecyclerView.Adapter<BillAdapter.BaseViewHolder
                 });
     }
 
-    public void deleteGroup(int groupIndex) {
-        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, BillGroupModel.BillModel model);
+
+        void toOpenEnclosure(int position, BillGroupModel.BillModel model);
     }
 
     private class EnclosureAdapter extends BaseAdapter {

+ 169 - 85
app_modular/apputils/src/main/java/com/modular/apputils/adapter/BillDetailsAdapter.java

@@ -39,13 +39,15 @@ import java.util.Map;
 
 public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.BaseViewHolder> {
 
-    private Context ct;
+    protected Context ct;
     private List<BillGroupModel> mBillGroupModels;
-    private List<BillGroupModel.BillModel> mShowBillModels;
-    private List<BillGroupModel.BillModel> mUpdateBillModels;
-    protected int mTabIndex = -1;
-    private int mTabPosition;
+    protected List<BillGroupModel.BillModel> mShowBillModels;
+    protected List<BillGroupModel.BillModel> mHideBillModels;
+    protected List<BillGroupModel.BillModel> mUpdateBillModels;
+    public int mTabIndex = -1;
+    public int mTabPosition = 0;
     private List<BillGroupModel> mOldTabModels;
+    private OnBillItemClickListener mOnBillItemClickListener;
 
     public BillDetailsAdapter(Context ct, List<BillGroupModel> mBillGroupModels) {
         this.ct = ct;
@@ -53,6 +55,10 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
         changeBillModel();
     }
 
+    public void setOnBillItemClickListener(OnBillItemClickListener onBillItemClickListener) {
+        mOnBillItemClickListener = onBillItemClickListener;
+    }
+
     public void updateGroupModels(List<BillGroupModel> groupModels) {
         this.mBillGroupModels = groupModels;
         changeBillModel();
@@ -75,6 +81,10 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
         return mShowBillModels;
     }
 
+    public List<BillGroupModel.BillModel> getHideBillModels() {
+        return mHideBillModels;
+    }
+
     public List<BillGroupModel.BillModel> getUpdateBillModels() {
         return mUpdateBillModels;
     }
@@ -92,6 +102,11 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
         } else {
             mShowBillModels.clear();
         }
+        if (mHideBillModels == null) {
+            mHideBillModels = new ArrayList<>();
+        } else {
+            mHideBillModels.clear();
+        }
         if (mUpdateBillModels == null) {
             mUpdateBillModels = new ArrayList<>();
         } else {
@@ -99,28 +114,33 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
         }
 
         for (int i = 0; i < mBillGroupModels.size(); i++) {
-            BillGroupModel e = mBillGroupModels.get(i);
-            if (e != null) {
-                List<BillGroupModel.GridTab> gridTabs = e.getGridTabs();
+            BillGroupModel groupModel = mBillGroupModels.get(i);
+            if (groupModel != null) {
+                List<BillGroupModel.GridTab> gridTabs = groupModel.getGridTabs();
                 if (gridTabs != null && gridTabs.size() > 0) {
                     BillGroupModel.BillModel mTabBillModel = new BillGroupModel.BillModel();
                     mTabBillModel.setType(BillGroupModel.Constants.TYPE_TAB);
                     mTabBillModel.setTabList(gridTabs);
                     mTabBillModel.setGroupIndex(i);
                     mShowBillModels.add(mTabBillModel);
-                } else if (e.getShowBillFields() != null && !e.getShowBillFields().isEmpty()) {
-                    if (!TextUtils.isEmpty(e.getGroup())) {
-                        BillGroupModel.BillModel mTitleBillModel = new BillGroupModel.BillModel();
-                        mTitleBillModel.setGroupIndex(i);
-                        mTitleBillModel.setType(BillGroupModel.Constants.TYPE_TITLE);
-                        mTitleBillModel.setCaption(e.getGroup());
-                        mTitleBillModel.setAllowBlank(e.isDeleteAble() ? "T" : "F");
-                        mShowBillModels.add(mTitleBillModel);
+                } else {
+                    if (groupModel.getShowBillFields() != null && !groupModel.getShowBillFields().isEmpty()) {
+                        if (!TextUtils.isEmpty(groupModel.getGroup())) {
+                            BillGroupModel.BillModel mTitleBillModel = new BillGroupModel.BillModel();
+                            mTitleBillModel.setGroupIndex(i);
+                            mTitleBillModel.setType(BillGroupModel.Constants.TYPE_TITLE);
+                            mTitleBillModel.setCaption(groupModel.getGroup());
+                            mTitleBillModel.setAllowBlank(groupModel.isDeleteAble() ? "T" : "F");
+                            mShowBillModels.add(mTitleBillModel);
+                        }
+                        mShowBillModels.addAll(groupModel.getShowBillFields());
                     }
-                    mShowBillModels.addAll(e.getShowBillFields());
 
-                    if (e.getUpdateBillFields() != null && !e.getUpdateBillFields().isEmpty()) {
-                        mUpdateBillModels.addAll(e.getUpdateBillFields());
+                    if (groupModel.getUpdateBillFields() != null && !groupModel.getUpdateBillFields().isEmpty()) {
+                        mUpdateBillModels.addAll(groupModel.getUpdateBillFields());
+                    }
+                    if (groupModel.getHideBillFields() != null && !groupModel.getHideBillFields().isEmpty()) {
+                        mHideBillModels.addAll(groupModel.getHideBillFields());
                     }
                 }
             }
@@ -129,11 +149,15 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
 
     @Override
     public int getItemViewType(int position) {
+        BillGroupModel.BillModel billModel = mShowBillModels.get(position);
         if (mShowBillModels != null && mShowBillModels.size() > position) {
-            int itemViewType = BillTypeChangeUtils.getItemViewType(mShowBillModels.get(position).getType());
+            int itemViewType = BillTypeChangeUtils.getItemViewType(billModel.getType());
             if (itemViewType == 111) {
                 mTabIndex = position;
             }
+            if ("detailAttach".equals(billModel.getRenderer())) {
+                itemViewType = 2;
+            }
             return itemViewType;
         }
         return super.getItemViewType(position);
@@ -158,9 +182,9 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
             case 1:
                 viewHolder = new TextViewHolder(parent, R.layout.item_bill_details);
                 break;
-            case 2:
-                viewHolder = new EnclosureViewHolder(parent, R.layout.item_bill_enclosure);
-                break;//附件类型
+            case 2://附件类型
+                viewHolder = new ImagesViewHolder(parent, R.layout.item_bill_images);
+                break;
             case 111:
                 viewHolder = new TabViewHolder(parent, R.layout.item_bill_tab);
                 break;
@@ -191,10 +215,12 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
                 bindText((TextViewHolder) holder, model, position);
             } else if (holder instanceof TitleViewHolder) {
                 bindTitleView((TitleViewHolder) holder, model, position);
-            } else if (holder instanceof EnclosureViewHolder) {
-                bindEnclosure((EnclosureViewHolder) holder, model, position);
+            } else if (holder instanceof ImagesViewHolder) {
+                bindImages((ImagesViewHolder) holder, model, position);
             } else if (holder instanceof TabViewHolder) {
                 bindTabView((TabViewHolder) holder, model, position);
+            } else if (holder instanceof EnclosureViewHolder) {
+                bindEnclosureView((EnclosureViewHolder) holder, model, position);
             }
         } catch (Exception e) {
             LogUtil.i("gong", position + "  e=" + e.getMessage());
@@ -202,12 +228,26 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
 
     }
 
+    private void bindEnclosureView(EnclosureViewHolder mInputViewHolder, BillGroupModel.BillModel model, int position) {
+        if (model != null) {
+            mInputViewHolder.captionTv.setText(model.getCaption());
+            mInputViewHolder.muchInputTv.setVisibility(model.getAllowBlank().equals("F") ? View.VISIBLE : View.GONE);
+            mInputViewHolder.valueTv.setText(model.getValue());
+            mInputViewHolder.valueTv.setTag(R.id.tag_key, position);
+            mInputViewHolder.valueTv.setOnClickListener(mOnClickListener);
+        }
+    }
+
     private void bindTabView(TabViewHolder holder, final BillGroupModel.BillModel model, final int position) {
         if (holder.mTabLayout.getTag() != null && holder.mTabLayout.getTag() instanceof MyTabChangeListener) {
             holder.mTabLayout.removeOnTabSelectedListener((TabLayout.OnTabSelectedListener) holder.mTabLayout.getTag());
         }
-        MyTabChangeListener myTabChangeListener = new MyTabChangeListener(holder.mTabLayout, position);
+        MyTabChangeListener myTabChangeListener = new MyTabChangeListener(position);
         holder.mTabLayout.addOnTabSelectedListener(myTabChangeListener);
+        int selectedTabPosition = holder.mTabLayout.getSelectedTabPosition();
+        if (mTabPosition >= 0 && mTabPosition != selectedTabPosition) {
+            holder.mTabLayout.getTabAt(mTabPosition).select();
+        }
         holder.mTabLayout.setTag(myTabChangeListener);
     }
 
@@ -225,7 +265,7 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
         }
     }
 
-    private void bindEnclosure(EnclosureViewHolder holder, BillGroupModel.BillModel model, int position) {
+    private void bindImages(ImagesViewHolder holder, BillGroupModel.BillModel model, int position) {
         holder.captionTv.setText(model.getCaption());
         holder.muchInputTv.setVisibility(model.getAllowBlank().equals("T") ? View.GONE : View.VISIBLE);
         EnclosureAdapter mEnclosureAdapter = null;
@@ -241,9 +281,10 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
         holder.ffGv.setAdapter(mEnclosureAdapter);
     }
 
-    private void bindText(TextViewHolder mViewHolder, BillGroupModel.BillModel field, int position) {
+    protected void bindText(TextViewHolder mViewHolder, BillGroupModel.BillModel field, int position) {
         mViewHolder.captionTv.setText(field.getCaption());
-        mViewHolder.valuesTv.setText(field.getValue());
+        setInputValue(mViewHolder, field);
+        mViewHolder.mustInputTv.setVisibility(field.getAllowBlank().equals("F") ? View.VISIBLE : View.GONE);
         BillJump mBillJump = field.getBillJump();
         if (mBillJump != null) {
             mViewHolder.valuesTv.setTag(R.id.tag_key, mBillJump);
@@ -255,54 +296,38 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
             mViewHolder.valuesTv.setOnClickListener(mOnClickListener);
         } else {
 //            mViewHolder.valuesTv.getPaint().setFlags(Paint.DEV_KERN_TEXT_FLAG);
-            mViewHolder.valuesTv.setOnClickListener(null);
+            mViewHolder.valuesTv.setTag(R.id.tag_key, 2);
+            mViewHolder.valuesTv.setTag(R.id.tag_key2, position);
+            mViewHolder.valuesTv.setTag(R.id.tag_key3, field);
+            mViewHolder.valuesTv.setOnClickListener(mOnClickListener);
         }
 
-        if (field.getGroupIndex() != 0 && position >= 1 && field.getGroupIndex() > mShowBillModels.get(position - 1).getGroupIndex()) {
-            mViewHolder.titleTv.setVisibility(View.VISIBLE);
-            String mGroupName = null;
-            if (ListUtils.getSize(mBillGroupModels) > field.getGroupIndex()) {
-                mGroupName = mBillGroupModels.get(field.getGroupIndex()).getGroup();
-            }
-            mViewHolder.titleTv.setText(TextUtils.isEmpty(mGroupName) ? "" : mGroupName);
-        } else {
-            mViewHolder.titleTv.setVisibility(View.GONE);
-        }
+//        if (field.getGroupIndex() != 0 && position >= 1 && field.getGroupIndex() > mShowBillModels.get(position - 1).getGroupIndex()) {
+//            mViewHolder.titleTv.setVisibility(View.VISIBLE);
+//            String mGroupName = null;
+//            if (ListUtils.getSize(mBillGroupModels) > field.getGroupIndex()) {
+//                mGroupName = mBillGroupModels.get(field.getGroupIndex()).getGroup();
+//            }
+//            mViewHolder.titleTv.setText(TextUtils.isEmpty(mGroupName) ? "" : mGroupName);
+//        } else {
+        mViewHolder.titleTv.setVisibility(View.GONE);
+//        }
+    }
+
+    protected void setInputValue(TextViewHolder mViewHolder, BillGroupModel.BillModel field) {
+        mViewHolder.valuesTv.setText(field.getValue());
     }
 
     public class MyTabChangeListener implements TabLayout.OnTabSelectedListener {
-        private TabLayout mTabLayout;
-        private int mPosition;
 
-        public MyTabChangeListener(TabLayout tabLayout, int position) {
-            mTabLayout = tabLayout;
-            mPosition = position;
+        public MyTabChangeListener(int position) {
+            mTabIndex = position;
         }
 
         @Override
         public void onTabSelected(TabLayout.Tab tab) {
-            if (this.mPosition >= 0 && mShowBillModels != null && mShowBillModels.size() > this.mPosition && mTabLayout != null) {
-                mTabPosition = tab.getPosition();
-                BillGroupModel.BillModel model = mShowBillModels.get(mPosition);
-                if (model != null) {
-                    List<BillGroupModel.GridTab> tabList = model.getTabList();
-                    int tabGroupIndex = model.getGroupIndex();
-
-                    List<BillGroupModel> newGroupModels = new ArrayList<>();
-                    List<BillGroupModel> billGroupModels = mBillGroupModels.subList(0, tabGroupIndex + 1);
-                    mOldTabModels = mBillGroupModels.subList(tabGroupIndex + 1, mBillGroupModels.size());
-
-                    newGroupModels.addAll(billGroupModels);
-                    BillGroupModel.GridTab gridTab = tabList.get(mTabPosition);
-                    if (gridTab != null) {
-                        List<BillGroupModel> tabGroupModels = gridTab.getBillGroupModels();
-
-                        newGroupModels.addAll(tabGroupModels);
-                    }
-                    setBillGroupModels(newGroupModels);
-                    notifyDataSetChanged();
-                }
-            }
+            switchTabData(tab.getPosition());
+            notifyDataSetChanged();
         }
 
         @Override
@@ -316,9 +341,29 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
         }
     }
 
-    public void setBillGroupModels(List<BillGroupModel> mBillGroupModels) {
-        this.mBillGroupModels = mBillGroupModels;
-        changeBillModel();
+    public void switchTabData(int tabPosition) {
+        mTabPosition = tabPosition;
+        if (mTabIndex >= 0 && mShowBillModels != null && mShowBillModels.size() > mTabIndex) {
+            BillGroupModel.BillModel model = mShowBillModels.get(mTabIndex);
+            if (model != null) {
+                List<BillGroupModel.GridTab> tabList = model.getTabList();
+                int tabGroupIndex = model.getGroupIndex();
+
+                List<BillGroupModel> newGroupModels = new ArrayList<>();
+                List<BillGroupModel> billGroupModels = mBillGroupModels.subList(0, tabGroupIndex + 1);
+                mOldTabModels = mBillGroupModels.subList(tabGroupIndex + 1, mBillGroupModels.size());
+
+                newGroupModels.addAll(billGroupModels);
+                BillGroupModel.GridTab gridTab = tabList.get(mTabPosition);
+                if (gridTab != null) {
+                    List<BillGroupModel> tabGroupModels = gridTab.getBillGroupModels();
+                    if (tabGroupModels != null) {
+                        newGroupModels.addAll(tabGroupModels);
+                    }
+                }
+                updateGroupModels(newGroupModels);
+            }
+        }
     }
 
     private View.OnClickListener mOnClickListener = new View.OnClickListener() {
@@ -326,7 +371,7 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
         public void onClick(View view) {
             if (view.getTag(R.id.tag_key) != null && view.getTag(R.id.tag_key) instanceof Integer) {
                 int type = (int) view.getTag(R.id.tag_key);
-                //类型  1.电话
+                //类型  1.电话 2.其他
                 switch (type) {
                     case 1:
                         if (view.getTag() != null && view.getTag() instanceof String) {
@@ -334,6 +379,16 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
                             SystemUtil.phoneAction(ct, phone);
                         }
                         break;
+                    case 2:
+                        if (mOnBillItemClickListener != null
+                                && view.getTag(R.id.tag_key2) != null
+                                && view.getTag(R.id.tag_key3) != null) {
+                            int position = (int) view.getTag(R.id.tag_key2);
+                            BillGroupModel.BillModel billModel = (BillGroupModel.BillModel) view.getTag(R.id.tag_key3);
+
+                            mOnBillItemClickListener.onBillItemClick(position, billModel);
+                        }
+                        break;
                 }
             } else if (view.getTag(R.id.tag_key) != null && view.getTag(R.id.tag_key) instanceof BillJump) {
                 BillJump mBillJump = (BillJump) view.getTag(R.id.tag_key);
@@ -377,16 +432,18 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
     }
 
 
-    class TextViewHolder extends BaseViewHolder {
+    public class TextViewHolder extends BaseViewHolder {
         private TextView titleTv;
         private TextView captionTv;
-        private TextView valuesTv;
+        private TextView mustInputTv;
+        public TextView valuesTv;
 
         @Override
         public void initView(View view) {
             titleTv = (TextView) itemView.findViewById(R.id.titleTv);
             captionTv = (TextView) itemView.findViewById(R.id.captionTv);
             valuesTv = (TextView) itemView.findViewById(R.id.valuesTv);
+            mustInputTv = (TextView) itemView.findViewById(R.id.muchInputTv);
         }
 
         public TextViewHolder(ViewGroup parent, int layoutId) {
@@ -420,19 +477,24 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
         @Override
         public void initView(View view) {
             mTabLayout = (TabLayout) view.findViewById(R.id.bill_tab_tl);
-            final List<BillGroupModel.GridTab> tabList = mShowBillModels.get(mTabIndex).getTabList();
-            if (tabList != null && tabList.size() > 0) {
-                for (int i = 0; i < tabList.size(); i++) {
-                    BillGroupModel.GridTab gridTab = tabList.get(i);
-                    if (gridTab != null) {
-                        mTabLayout.addTab(mTabLayout.newTab().setText(gridTab.getTitle()));
+            if (mTabIndex != -1) {
+                final List<BillGroupModel.GridTab> tabList = mShowBillModels.get(mTabIndex).getTabList();
+                if (tabList != null && tabList.size() > 0) {
+                    for (int i = 0; i < tabList.size(); i++) {
+                        BillGroupModel.GridTab gridTab = tabList.get(i);
+                        if (gridTab != null) {
+                            mTabLayout.addTab(mTabLayout.newTab().setText(gridTab.getTitle()));
+                        }
                     }
                 }
-            }
-            if (mTabLayout.getTabCount() > 4) {
-                mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
-            } else {
-                mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+                if (mTabPosition >= 0) {
+                    mTabLayout.getTabAt(mTabPosition).select();
+                }
+                if (mTabLayout.getTabCount() > 4) {
+                    mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
+                } else {
+                    mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+                }
             }
         }
 
@@ -440,11 +502,29 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
 
     //附件类型
     class EnclosureViewHolder extends BaseViewHolder {
+        public TextView captionTv;
+        public TextView muchInputTv;
+        public TextView valueTv;
+
+        public EnclosureViewHolder(ViewGroup parent, int layoutId) {
+            super(parent, layoutId);
+        }
+
+        @Override
+        public void initView(View view) {
+            captionTv = view.findViewById(R.id.captionTv);
+            muchInputTv = view.findViewById(R.id.muchInputTv);
+            valueTv = view.findViewById(R.id.enclosure_values_tv);
+        }
+    }
+
+    //图片类型
+    class ImagesViewHolder extends BaseViewHolder {
         private TextView captionTv;
         private TextView muchInputTv;
         private MyGridView ffGv;
 
-        public EnclosureViewHolder(ViewGroup parent, int layoutId) {
+        public ImagesViewHolder(ViewGroup parent, int layoutId) {
             super(parent, layoutId);
         }
 
@@ -562,4 +642,8 @@ public class BillDetailsAdapter extends RecyclerView.Adapter<BillDetailsAdapter.
                 || name.toUpperCase().endsWith("JPG")
                 || name.toUpperCase().endsWith("PNG");
     }
+
+    public interface OnBillItemClickListener {
+        void onBillItemClick(int position, BillGroupModel.BillModel billModel);
+    }
 }

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

@@ -209,7 +209,7 @@ public class BillUpdateAdapter extends RecyclerView.Adapter<BillUpdateAdapter.Ba
                 viewHolder = new InputViewHolder(parent, R.layout.item_bill_input_select);
                 break;
             case 2:
-                viewHolder = new EnclosureViewHolder(parent, R.layout.item_bill_enclosure);
+                viewHolder = new EnclosureViewHolder(parent, R.layout.item_bill_images);
                 break;//附件类型
             case 110:
                 viewHolder = new AddViewHolder(parent, R.layout.item_bill_add);

+ 52 - 7
app_modular/apputils/src/main/java/com/modular/apputils/model/BillGroupModel.java

@@ -1,5 +1,7 @@
 package com.modular.apputils.model;
 
+import android.text.TextUtils;
+
 import com.common.data.StringUtil;
 
 import java.io.Serializable;
@@ -24,7 +26,6 @@ public class BillGroupModel implements Serializable {
     private String group;//组名
     private String keyField;//提交时候主表或明细表id字段名称
     private Map<String, Object> mTagMap;//附带信息
-
     private String billCaller;//表caller
 
     private List<BillModel> hideBillFields;//当前组隐藏的字段列表
@@ -177,7 +178,7 @@ public class BillGroupModel implements Serializable {
         mGridTabs = gridTabs;
     }
 
-    public static class BillTitleModel implements Serializable{
+    public static class BillTitleModel implements Serializable {
         private int groupIndex;//组索引
         private boolean isDelete;
         private String showName;
@@ -214,7 +215,7 @@ public class BillGroupModel implements Serializable {
     /**
      * 字段详情
      */
-    public static class BillModel implements Serializable{
+    public static class BillModel implements Serializable {
         private int id;//id
         private int groupIndex;//所在组索引
         private float detno = 1000000;//序号
@@ -225,21 +226,25 @@ public class BillGroupModel implements Serializable {
         private String caption;//字段名称
         private String type;//类型(标题类型为Constants.TYPE_TITLE,不触发点击事件等 )
         private String logicType;//logic类型
-        private String readOnly;//是否只读
+        private String readOnly;//字段是否只读  T/F
         private String field;//字段
         private String value;//值
         private String display;//上传值
         private String defValue;//默认值
         private String findFunctionName;//默认值
         private String allowBlank;//是否允许为空(注:当作为标题的时候T:表示可以删除 F:表示不可删除)
+        private String renderer;
+        private String enclusureId;
         private List<LocalData> localDatas;//获取到的本地选择数据
         private BillJump mBillJump;//判断是否需要要跳转字段
         private List<GridTab> mTabList;
         private boolean updatable;//是否可更新
+        private String editable;//是否可编辑(临时属性,对某些字段的特殊处理,和字段本身属性无关,在添加明细时,要重置这个值)
 
         public BillModel() {
         }
 
+        //添加明细复制,value要置空
         public BillModel(BillModel e) {
             this.id = e.id;
             this.groupIndex = e.groupIndex + 1;
@@ -253,13 +258,24 @@ public class BillGroupModel implements Serializable {
             this.logicType = e.logicType;
             this.readOnly = e.readOnly;//
             this.field = e.field;//字段
-            this.value = "";//值
             this.defValue = e.defValue;//
+            this.renderer = e.renderer;
+            this.enclusureId = e.enclusureId;
             this.allowBlank = e.allowBlank;
             this.findFunctionName = e.findFunctionName;
             this.mBillJump = e.mBillJump;
+            this.localDatas = e.localDatas;
             this.mTabList = e.mTabList;
             this.updatable = e.updatable;
+            this.editable = "";//复制字段时要重置
+            if (!isShow(e) && !TextUtils.isEmpty(e.renderer) && e.renderer.contains("defaultValue")) {
+                //隐藏字段,renderer里包含defaultValue,则复制value
+                this.value = e.value;
+                this.display = e.display;
+            } else {
+                this.value = "";//值
+                this.display = "";
+            }
         }
 
         public float getDetno() {
@@ -366,7 +382,6 @@ public class BillGroupModel implements Serializable {
             this.field = field;
         }
 
-
         public String getValue() {
             return StringUtil.isEmpty(value) ? (defValue == null ? "" : defValue) : value;
         }
@@ -407,6 +422,22 @@ public class BillGroupModel implements Serializable {
             this.allowBlank = allowBlank;
         }
 
+        public String getRenderer() {
+            return renderer;
+        }
+
+        public void setRenderer(String renderer) {
+            this.renderer = renderer;
+        }
+
+        public String getEnclusureId() {
+            return enclusureId;
+        }
+
+        public void setEnclusureId(String enclusureId) {
+            this.enclusureId = enclusureId;
+        }
+
         public List<LocalData> getLocalDatas() {
             return localDatas;
         }
@@ -430,9 +461,22 @@ public class BillGroupModel implements Serializable {
         public void setUpdatable(boolean updatable) {
             this.updatable = updatable;
         }
+
+        public String getEditable() {
+            return editable == null ? "" : editable;
+        }
+
+        public void setEditable(String editable) {
+            this.editable = editable;
+        }
+
+
+        private boolean isShow(BillGroupModel.BillModel mBillModel) {
+            return mBillModel.getIsdefault() == -1 && !mBillModel.getType().equals("H");
+        }
     }
 
-    public static class GridTab implements Serializable{
+    public static class GridTab implements Serializable {
         private String title;
         private String caller;
         private int position;
@@ -502,4 +546,5 @@ public class BillGroupModel implements Serializable {
                 ", mGridTabs=" + mGridTabs +
                 '}';
     }
+
 }

+ 6 - 1
app_modular/apputils/src/main/java/com/modular/apputils/network/FileDownloader.java

@@ -141,7 +141,12 @@ public class FileDownloader {
             if (fileNames != null && fileNames.length > 1) {
                 String fileName = fileNames[1];
                 if (!TextUtils.isEmpty(fileName)) {
-                    fileName= fileName.substring(1,fileName.length()-1);
+                    if (fileName.startsWith("\"") || fileName.startsWith("“")) {
+                        fileName = fileName.substring(1, fileName.length());
+                    }
+                    if (fileName.endsWith("\"") || fileName.endsWith("”")) {
+                        fileName =  fileName.substring(0, fileName.length() - 1);
+                    }
                     if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                         final String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/uu/download";
                         File file = new File(path);

+ 218 - 19
app_modular/apputils/src/main/java/com/modular/apputils/presenter/BillDetailsPresenter.java

@@ -1,9 +1,12 @@
 package com.modular.apputils.presenter;
 
+import android.Manifest;
 import android.content.Context;
 import android.content.Intent;
 import android.support.annotation.Nullable;
+import android.support.design.widget.TabLayout;
 import android.text.TextUtils;
+import android.view.View;
 import android.widget.Toast;
 
 import com.alibaba.fastjson.JSON;
@@ -13,10 +16,14 @@ import com.common.LogUtil;
 import com.common.data.JSONUtil;
 import com.common.data.ListUtils;
 import com.common.data.StringUtil;
+import com.core.app.AppConstant;
 import com.core.app.Constants;
 import com.core.app.MyApplication;
+import com.core.base.BaseActivity;
 import com.core.base.BaseToolBarActivity;
 import com.core.utils.CommonUtil;
+import com.core.utils.ToastUtil;
+import com.core.widget.CustomProgressDialog;
 import com.lidroid.xutils.HttpUtils;
 import com.lidroid.xutils.exception.HttpException;
 import com.lidroid.xutils.http.RequestParams;
@@ -31,9 +38,13 @@ import com.modular.apputils.activity.BillInputActivity;
 import com.modular.apputils.listener.OnSmartHttpListener;
 import com.modular.apputils.model.BillGroupModel;
 import com.modular.apputils.model.BillJump;
+import com.modular.apputils.network.FileDownloader;
 import com.modular.apputils.network.Parameter;
 import com.modular.apputils.network.Tags;
+import com.modular.apputils.presenter.imp.IBill;
 import com.modular.apputils.presenter.imp.IBillDetails;
+import com.modular.apputils.utils.ImageViewUtils;
+import com.modular.apputils.utils.OpenFilesUtils;
 
 import java.io.File;
 import java.io.Serializable;
@@ -45,10 +56,11 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
-public class BillDetailsPresenter extends BaseNetPresenter {
+public class BillDetailsPresenter extends BaseNetPresenter implements HttpCallback {
     private final int LOAD_FORM = 0x11;//获取配置接口
     private final int LOAD_FILE_PATHS = 0x12;//获取附件详情
     private final int UN_SUBMIT = 0x13;//反提交
+    private static final int GET_FILE_PATHS = 0x14;//打开附件
 
     protected IBillDetails mIBillDetails;
     protected String mCaller;//当前单据的Caller
@@ -56,13 +68,13 @@ public class BillDetailsPresenter extends BaseNetPresenter {
     protected Class mInputClass;
     protected List<BillJump> mBillJumps;
 
-    private String detailKeyField;//从表id字段
+    public String detailKeyField;//从表id字段
     private String keyField;//主表id字段
     private String statusCodeField;//状态码字段
     private String statusField;//状态字段
     private String detailMainKeyField;//从表
-    private boolean multidetailgrid = false;
-    private String mStatusKey;
+    private boolean multidetailgrid = false, mFormToGrid = false;
+    protected String mStatusKey;
 
     public String getCaller() {
         return mCaller;
@@ -92,9 +104,17 @@ public class BillDetailsPresenter extends BaseNetPresenter {
                 mInputClass = (Class) mInputSerializable;
             }
             mBillJumps = intent.getParcelableArrayListExtra(Constants.Intents.BILL_JUMPS);
+            mBillJumps = intent.getParcelableArrayListExtra(Constants.Intents.BILL_JUMPS);
             if (mTitle != null) {
                 mIBillDetails.setTitle(mTitle);
             }
+            boolean showHeader = intent.getBooleanExtra(Constants.Intents.SHOW_HEADER, false);
+            mIBillDetails.showHeaderLayout(showHeader);
+            String status = intent.getStringExtra(Constants.Intents.BILL_STATUS);
+            if (!TextUtils.isEmpty(status)) {
+                mIBillDetails.updateStatus(status);
+            }
+            mFormToGrid = intent.getBooleanExtra(Constants.Intents.FORM_TO_GRID, false);
         }
         loadFormandGridDetail();
     }
@@ -104,7 +124,10 @@ public class BillDetailsPresenter extends BaseNetPresenter {
     }
 
     public void unSubmit(String status) {
-        LogUtil.i("gong", "status=" + status);
+        unSubmit(status, "mobile/commonres.action");
+    }
+
+    public void unSubmit(String status, String url) {
         if (status != null && status.equals("在录入")) {
             ct.startActivity(new Intent(ct, mInputClass == null ? BillInputActivity.class : mInputClass)
                     .putExtra(Constants.Intents.CALLER, mCaller)
@@ -115,7 +138,7 @@ public class BillDetailsPresenter extends BaseNetPresenter {
         } else {
             mIBillDetails.showLoading();
             requestCompanyHttp(new Parameter.Builder()
-                            .url("mobile/commonres.action")
+                            .url(url)
                             .addParams("caller", mCaller)
                             .addParams("id", mId)
                             .record(UN_SUBMIT)
@@ -136,7 +159,7 @@ public class BillDetailsPresenter extends BaseNetPresenter {
     }
 
     /*获取附件  */
-    private void loadFilePaths(String attachs) {
+    protected void loadFilePaths(String attachs) {
         if (StringUtil.isEmpty(attachs) || "null".equals(attachs)) {
             return;
         }
@@ -222,7 +245,11 @@ public class BillDetailsPresenter extends BaseNetPresenter {
         }
     };
 
-    private void handlerMultiBill(JSONObject resultObject) {
+    protected void handlerMultiBill(JSONObject resultObject) {
+        handlerMultiBill(resultObject, mFormToGrid, "");
+    }
+
+    protected void handlerMultiBill(JSONObject resultObject, boolean formToGrid, String formTitle) {
         try {
             List<BillGroupModel> showBillModels = new ArrayList<>();
             JSONObject config = JSONUtil.getJSONObject(resultObject, "config");
@@ -234,19 +261,34 @@ public class BillDetailsPresenter extends BaseNetPresenter {
             JSONObject data = JSONUtil.getJSONObject(resultObject, "data");
             JSONArray formdetail = JSONUtil.getJSONArray(data, "formdetail");
             Map<String, BillGroupModel> formdeMap = handlerFormdetail(formdetail);
+
+            List<BillGroupModel> formBillModels = new ArrayList<>();//主表显示字段
             if (formdeMap != null && !formdeMap.isEmpty()) {
                 for (Map.Entry<String, BillGroupModel> entry : formdeMap.entrySet()) {
-                    showBillModels.add(entry.getValue());
+                    formBillModels.add(entry.getValue());
                 }
-                if (!ListUtils.isEmpty(showBillModels)) {
-                    Collections.sort(showBillModels, mComparator);
+                if (!ListUtils.isEmpty(formBillModels)) {
+                    Collections.sort(formBillModels, mComparator);
                 }
             }
+            //从表
             multidetailgrid = JSONUtil.getBoolean(data, "multidetailgrid");
             if (multidetailgrid) {
                 JSONArray othergridetail = JSONUtil.getJSONArray(data, "othergridetail");
                 if (othergridetail != null && othergridetail.size() > 0) {
-                    List<BillGroupModel.GridTab> otherGridTabs = handlerGirdTabs(showBillModels.size() + 1, othergridetail);
+                    List<BillGroupModel.GridTab> otherGridTabs = new ArrayList<>();
+                    if (formToGrid) {
+                        BillGroupModel.GridTab formGridTab = new BillGroupModel.GridTab();
+                        formGridTab.setPosition(0);
+                        formGridTab.setTitle(TextUtils.isEmpty(formTitle) ? "基础信息" : formTitle);
+                        formGridTab.setCaller(mCaller);
+                        formGridTab.setBillGroupModels(formBillModels);
+                        otherGridTabs.add(formGridTab);
+                    } else {
+                        showBillModels.addAll(formBillModels);
+                    }
+                    otherGridTabs.addAll(
+                            handlerGirdTabs(showBillModels.size() + 1, othergridetail, otherGridTabs.size()));
                     if (otherGridTabs.size() > 0) {
                         BillGroupModel billTab = new BillGroupModel();
                         billTab.setForm(false);
@@ -256,9 +298,28 @@ public class BillDetailsPresenter extends BaseNetPresenter {
                         showBillModels.add(billTab);
 
                         showBillModels.addAll(otherGridTabs.get(0).getBillGroupModels());
+
+                        /**
+                         * 如果是多从表,则添加顶部悬浮的tablayout
+                         */
+                        View topLayout = View.inflate(ct, R.layout.item_bill_tab, null);
+                        TabLayout tabLayout = topLayout.findViewById(R.id.bill_tab_tl);
+                        if (tabLayout != null) {
+                            for (int i = 0; i < otherGridTabs.size(); i++) {
+                                tabLayout.addTab(tabLayout.newTab().setText(otherGridTabs.get(i).getTitle()));
+                            }
+                            if (tabLayout.getTabCount() > 4) {
+                                tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
+                            } else {
+                                tabLayout.setTabMode(TabLayout.MODE_FIXED);
+                            }
+                        }
+
+                        mIBillDetails.addTopLayout(topLayout, tabLayout);
                     }
                 }
             } else {
+                showBillModels.addAll(formBillModels);
                 JSONArray gridetail = JSONUtil.getJSONArray(data, "gridetail");
                 Map<String, BillGroupModel> gridGroupModelMap = handlerGridetail(showBillModels.size(), gridetail);
                 if (gridGroupModelMap != null && !gridGroupModelMap.isEmpty()) {
@@ -274,11 +335,11 @@ public class BillDetailsPresenter extends BaseNetPresenter {
 
             mIBillDetails.updateStatus(null);
         } catch (Exception e) {
-
+            e.printStackTrace();
         }
     }
 
-    private List<BillGroupModel.GridTab> handlerGirdTabs(int index, JSONArray othergridetail) {
+    private List<BillGroupModel.GridTab> handlerGirdTabs(int index, JSONArray othergridetail, int position) {
         List<BillGroupModel.GridTab> gridTabs = new ArrayList<>();
         for (int i = 0; i < othergridetail.size(); i++) {
             JSONObject otherGrid = othergridetail.getJSONObject(i);
@@ -288,7 +349,7 @@ public class BillDetailsPresenter extends BaseNetPresenter {
                     BillGroupModel.GridTab gridTab = new BillGroupModel.GridTab();
                     gridTab.setTitle(JSONUtil.getText(otherGrid, "dgtitle"));
                     gridTab.setCaller(JSONUtil.getText(otherGrid, "dgcaller"));
-                    gridTab.setPosition(i);
+                    gridTab.setPosition(position + i);
 
                     Map<String, BillGroupModel> gridGroupModelMap = handlerGridetail(index, detailgrid);
                     if (gridGroupModelMap != null && !gridGroupModelMap.isEmpty()) {
@@ -401,7 +462,9 @@ public class BillDetailsPresenter extends BaseNetPresenter {
                 object = formdetail.getJSONObject(i);
                 BillGroupModel.BillModel mBillModel = getBillModelByObject(object);
                 String group = JSONUtil.getText(object, "dg_group");
-
+                if ("0".equals(group)) {
+                    continue;
+                }
                 if (modelMap.containsKey("明细" + group)) {
                     BillGroupModel mBillGroupModel = modelMap.get("明细" + group);
                     if (mBillGroupModel == null) {
@@ -457,7 +520,7 @@ public class BillDetailsPresenter extends BaseNetPresenter {
         return mBillModel.getIsdefault() == -1 && !mBillModel.getType().equals("H");
     }
 
-    private BillGroupModel.BillModel getBillModelByObject(JSONObject object) {
+    protected BillGroupModel.BillModel getBillModelByObject(JSONObject object) {
         String status = null;
 
         BillGroupModel.BillModel mBillModel = new BillGroupModel.BillModel();
@@ -477,6 +540,7 @@ public class BillDetailsPresenter extends BaseNetPresenter {
         String allowBlank = JSONUtil.getText(object, "fd_allowblank");//是否允许为空(注:当作为标题的时候T:表示可以删除 F:表示不可删除)
         String findFunctionName = JSONUtil.getText(object, "dg_findfunctionname");
         String updatable = JSONUtil.getText(object, "fd_modify", "dg_modify");
+        String renderer = JSONUtil.getText(object, "dg_renderer");
 
         if (logicType.equals("necessaryField")) {
             allowBlank = "F";
@@ -502,8 +566,14 @@ public class BillDetailsPresenter extends BaseNetPresenter {
             for (int i = 0; i < combostore.size(); i++) {
                 JSONObject combosModel = combostore.getJSONObject(i);
                 BillGroupModel.LocalData mLocalData = new BillGroupModel.LocalData();
-                mLocalData.display = JSONUtil.getText(combosModel, "DLC_DISPLAY");
-                mLocalData.value = JSONUtil.getText(combosModel, "DLC_VALUE");
+                String dlc_display = JSONUtil.getText(combosModel, "DLC_DISPLAY");
+                String dlc_value = JSONUtil.getText(combosModel, "DLC_VALUE");
+                mLocalData.display = dlc_display;
+                mLocalData.value = dlc_value;
+                if ("C".equals(type)
+                        && !TextUtils.isEmpty(value) && value.equals(dlc_display)) {
+                    value = dlc_value;
+                }
                 localDatas.add(mLocalData);
             }
             mBillModel.setLocalDatas(localDatas);
@@ -533,6 +603,7 @@ public class BillDetailsPresenter extends BaseNetPresenter {
         mBillModel.setDefValue(defValue);
         mBillModel.setAllowBlank(allowBlank);
         mBillModel.setUpdatable("T".equals(updatable));
+        mBillModel.setRenderer(renderer);
         return mBillModel;
     }
 
@@ -899,4 +970,132 @@ public class BillDetailsPresenter extends BaseNetPresenter {
 
     }
 
+    /**
+     * 打开附件
+     *
+     * @param enclosureId 附件id
+     */
+    public void openEnclosure(String enclosureId) {
+        if (TextUtils.isEmpty(enclosureId)) {
+            mIBillDetails.showToast("附件为空");
+            return;
+        }
+        mIBillDetails.showLoading();
+        com.me.network.app.http.HttpRequest.getInstance().sendRequest(CommonUtil.getAppBaseUrl(ct),
+                new HttpParams.Builder()
+                        .url("common/getFilePaths.action")
+                        .method(Method.GET)
+                        .flag(GET_FILE_PATHS)
+                        .addParam("field", "fb_attach")
+                        .addParam("emcode", CommonUtil.getEmcode())
+                        .addParam("master", CommonUtil.getMaster())
+                        .addParam("sessionId", CommonUtil.getSharedPreferences(ct, "sessionId"))
+                        .addParam("id", enclosureId).build(), this);
+    }
+
+    @Override
+    public void onSuccess(int flag, Object o) throws Exception {
+        mIBillDetails.dimssLoading();
+        try {
+            String result = o.toString();
+            JSONObject resultObject = JSON.parseObject(result);
+            switch (flag) {
+                case GET_FILE_PATHS:
+                    JSONArray fileArray = resultObject.getJSONArray("files");
+                    if (fileArray != null && fileArray.size() > 0) {
+                        JSONObject fileObject = fileArray.getJSONObject(0);
+                        if (fileObject != null) {
+                            String fp_path = JSONUtil.getText(fileObject, "fp_path");
+                            if (TextUtils.isEmpty(fp_path)) {
+                                mIBillDetails.showToast("附件获取失败,请重试");
+                            } else {
+                                String fileUrl = ImageViewUtils.getErpImageUrl(fp_path);
+                                if (isImage(fp_path)) {
+                                    Intent intent = new Intent("com.modular.tool.SingleImagePreviewActivity");
+                                    intent.putExtra(AppConstant.EXTRA_IMAGE_URI, fileUrl);
+                                    ct.startActivity(intent);
+                                } else {
+                                    downFile(fileUrl);
+                                }
+                            }
+                        }
+                    } else {
+                        mIBillDetails.showToast("附件获取失败,请重试");
+                    }
+                    break;
+            }
+        } catch (Exception e) {
+            mIBillDetails.showToast("附件获取失败,请重试");
+        }
+
+    }
+
+    @Override
+    public void onFail(int flag, String failStr) throws Exception {
+        switch (flag) {
+            case GET_FILE_PATHS:
+                mIBillDetails.dimssLoading();
+                mIBillDetails.showToast("附件获取失败,请重试");
+                break;
+        }
+    }
+
+    private boolean isImage(String name) {
+        return name.toUpperCase().endsWith("jpeg".toUpperCase())
+                || name.toUpperCase().endsWith("jpg".toUpperCase())
+                || name.toUpperCase().endsWith("png".toUpperCase());
+    }
+
+    private void downFile(String downloadUrl) {
+        final CustomProgressDialog progressDialog = CustomProgressDialog.createDialog(ct);
+        progressDialog.setTitile("正在预览");
+        progressDialog.setMessage("正在生成附件预览,请勿关闭程序");
+        if (progressDialog != null && ct != null) {
+            progressDialog.show();
+        }
+        FileDownloader fileDownloader = new FileDownloader(downloadUrl, new FileDownloader.OnDownloaderListener() {
+            @Override
+            public void onProgress(long allProress, long progress) {
+            }
+
+            @Override
+            public void onSuccess(final File file) {
+                LogUtil.i("onSuccess=" + (file == null ? "" : file.getPath()));
+                LogUtil.i("file isfile=" + (file.isFile()));
+                if (ct != null) {
+                    if (progressDialog != null) {
+                        progressDialog.dismiss();
+                    }
+                    try {
+                        ((BaseActivity) ct).requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, new Runnable() {
+                            @Override
+                            public void run() {
+                                OpenFilesUtils.openCommonFils(ct, file);
+                            }
+                        }, new Runnable() {
+                            @Override
+                            public void run() {
+                                ToastUtil.showToast(ct, R.string.not_system_permission);
+                            }
+                        });
+                    } catch (Exception e) {
+
+                    }
+                }
+            }
+
+            @Override
+            public void onFailure(String exception) {
+                LogUtil.i("onFailure=" + (exception == null ? "" : exception));
+                if (ct != null) {
+                    ToastUtil.showToast(ct, exception);
+                    if (progressDialog != null) {
+                        progressDialog.dismiss();
+                    }
+                }
+            }
+        });
+        fileDownloader.download(0L);
+    }
+
 }

+ 305 - 129
app_modular/apputils/src/main/java/com/modular/apputils/presenter/BillPresenter.java

@@ -3,7 +3,9 @@ package com.modular.apputils.presenter;
 import android.content.Context;
 import android.content.Intent;
 import android.support.annotation.Nullable;
+import android.support.design.widget.TabLayout;
 import android.text.TextUtils;
+import android.view.View;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -42,16 +44,22 @@ import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+/**
+ * Created by RaoMeng
+ * Desc: 通用表单presenter操作类
+ */
 public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListener {
     public final int LOAD_FORM = 0x11;//获取配置接口
     public final int SAVE_AND_SUBMIT = 0x12;//保存提交接口
     public final int LOAD_JUDGE_APPROVAL = 0x13;//获取审批人员
     public final int SELECT_APPROVAL = 0x14;//选择审批人
+    public final int SAVE_MAINTENANCE_BILL = 0x15;//养护管理保存
 
     protected IBill iBill;
     protected String mCaller;//当前单据的Caller
     protected int mId;//当前单据拥有的id,新增默认为0   如果mid为-1,说明保存时候使用更新的接口
     protected HashMap<String, String> hashMap;//从外面传进来的默认值
+    protected boolean mFormToGrid = false;
 
     private String detailKeyField;//从表id字段
     private String keyField;//主表id字段
@@ -99,48 +107,41 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
             if (mTitle != null) {
                 iBill.setTitle(mTitle);
             }
+            mFormToGrid = intent.getBooleanExtra(Constants.Intents.FORM_TO_GRID, false);
         }
         loadFormandGridDetail();
     }
 
     public void saveAndSubmit(List<BillGroupModel.BillModel> formFields, List<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.getDisplay());
+        saveAndSubmit(formFields, gridBillMap, "mobile/oa/commonSaveAndSubmit.action", "mobile/commonUpdate.action");
+    }
+
+    public void saveAndSubmit(List<BillGroupModel.BillModel> formFields, List<List<BillGroupModel.BillModel>> gridBillMap,
+                              String saveUrl, String updateUrl) {
+        Map<String, Object> formStore = analysisForm(formFields);
+        if (formStore == null) {
+            iBill.dimssLoading();
+            return;
         }
 
         List<Map<String, Object>> gridStoreList = analysisGrid(gridBillMap);
         if (gridStoreList == null) {
-            return;
-        }
-        if (formStore == null || gridStoreList == null) {
             iBill.dimssLoading();
             return;
         }
 
-//        String formStoreStr = JSONUtil.map2JSON(formStore);
-//        String gridStoreStr = JSONUtil.map2JSON(gridStoreList);
         String formStoreStr = JSON.toJSONString(formStore);
         String gridStoreStr = JSON.toJSONString(gridStoreList);
 
-//        LogUtil.i("gong", "formStoreStr=" + formStoreStr);
-//        LogUtil.i("gong", "gridStoreStr=" + gridStoreStr);
+        LogUtil.prinlnLongMsg("raomengForm", formStoreStr);
+        LogUtil.prinlnLongMsg("raomengGrid", gridStoreStr);
         try {
             requestCompanyHttp(new Parameter.Builder()
-                            .url(mId == 0 ? "mobile/oa/commonSaveAndSubmit.action" : "mobile/commonUpdate.action")
+                            .url(mId == 0 ? saveUrl : updateUrl)
                             .addParams("caller", mCaller)
                             .mode(Method.POST)
                             .addParams("keyid", String.valueOf(mId))
+                            .addParams("id", String.valueOf(mId))
                             .addParams("formStore", formStoreStr)
                             .addParams("gridStore", gridStoreStr)
                             .record(SAVE_AND_SUBMIT)
@@ -151,28 +152,62 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
         }
     }
 
-    public void saveAndSubmit(List<BillGroupModel.BillModel> formFields, List<BillGroupModel.GridTab> otherGridList, int flag) {
-        Map<String, Object> formStore = new HashMap<>();
-        for (BillGroupModel.BillModel e : formFields) {
-            if (TextUtils.isEmpty(e.getValue()) && e.getIsdefault() == -1 &&
-                    ("necessaryField".equals(e.getAllowBlank()) || "F".equals(e.getAllowBlank()))) {
-                iBill.showToast(e.getCaption() + "为必填项");
-                iBill.dimssLoading();
-                return;
-            }
-            if (isEnclosureNeedSubmit(e)) {
-                pushEnclosure(e);
-                return;
-            }
-            formStore.put(e.getField(), e.getDisplay());
+    protected void saveAndSubmit(List<BillGroupModel.BillModel> formFields, List<BillGroupModel.GridTab> otherGridList, int flag) {
+        saveAndSubmit(formFields, otherGridList, flag, "mobile/oa/commonSaveAndSubmit.action", "mobile/commonUpdate.action");
+    }
+
+    protected void saveAndSubmit(List<BillGroupModel.BillModel> formFields, List<BillGroupModel.GridTab> otherGridList, int flag,
+                                 String saveUrl, String updateUrl) {
+        if (flag <= 0) {
+            flag = SAVE_AND_SUBMIT;
+        }
+        Map<String, Object> formStore = analysisForm(formFields);
+
+        if (formStore == null) {
+            iBill.dimssLoading();
+            return;
+        }
+        List<Map<String, Object>> otherGridStoreList = getOtherGirdList(otherGridList);
+        if (otherGridStoreList == null) {
+            iBill.dimssLoading();
+            return;
         }
 
+        String formStoreStr = JSON.toJSONString(formStore);
+        String otherGridStoreListStr = JSON.toJSONString(otherGridStoreList);
+
+        LogUtil.prinlnLongMsg("raomengForm", formStoreStr);
+        LogUtil.prinlnLongMsg("raomengGrid", otherGridStoreListStr);
+        try {
+            requestCompanyHttp(new Parameter.Builder()
+                            .url(mId == 0 ? saveUrl : updateUrl)
+                            .mode(Method.POST)
+                            .addParams("caller", mCaller)
+                            .addParams("keyid", String.valueOf(mId))
+                            .addParams("id", String.valueOf(mId))
+                            .addParams("formStore", formStoreStr)
+                            .addParams("othergridStore", otherGridStoreListStr)
+                            .record(flag)
+                    , this);
+        } catch (Exception e) {
+            iBill.dimssLoading();
+            iBill.showToast("网络请求异常");
+        }
+    }
+
+    /**
+     * 解析多从表
+     *
+     * @param otherGridList
+     * @return
+     */
+    protected List<Map<String, Object>> getOtherGirdList(List<BillGroupModel.GridTab> otherGridList) {
         List<Map<String, Object>> otherGridStoreList = new ArrayList<>();
         for (BillGroupModel.GridTab gridTab : otherGridList) {
             if (gridTab != null) {
                 List<BillGroupModel> tabGroupModels = gridTab.getBillGroupModels();
                 String otherCaller = gridTab.getCaller();
-                if (tabGroupModels != null && tabGroupModels.size() > 0) {
+                if (tabGroupModels != null) {
                     List<List<BillGroupModel.BillModel>> otherGridMap = new ArrayList<>();
                     for (BillGroupModel tabGroupModel : tabGroupModels) {
                         List<BillGroupModel.BillModel> otherGrid = new ArrayList<>();
@@ -189,9 +224,9 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
                     }
                     List<Map<String, Object>> otherGridStoreItem = analysisGrid(otherGridMap);
                     if (otherGridStoreItem == null) {
-                        return;
+                        return null;
                     }
-//                    String otherGridStoreItemStr = JSONUtil.map2JSON(otherGridStoreItem);
+
                     String otherGridStoreItemStr = JSON.toJSONString(otherGridStoreItem);
                     JSONArray otherGridStoreItemArray = JSON.parseArray(otherGridStoreItemStr);
 
@@ -203,34 +238,29 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
                 }
             }
         }
+        return otherGridStoreList;
+    }
 
-//        String formStoreStr = JSONUtil.map2JSON(formStore);
-//        String otherGridStoreListStr = JSONUtil.map2JSON(otherGridStoreList);
-        String formStoreStr = JSON.toJSONString(formStore);
-        String otherGridStoreListStr = JSON.toJSONString(otherGridStoreList);
-//        LogUtil.prinlnLongMsg("billJson", formStoreStr);
-//        LogUtil.prinlnLongMsg("billJson", otherGridStoreListStr);
-//        LogUtil.prinlnLongMsg("billJson2", formStoreStr);
-//        LogUtil.prinlnLongMsg("billJson2", otherGridStoreListStr);
-
-        try {
-            requestCompanyHttp(new Parameter.Builder()
-                            .url(mId == 0 ? "mobile/oa/commonSaveAndSubmit.action" : "mobile/commonUpdate.action")
-                            .mode(Method.POST)
-                            .addParams("caller", mCaller)
-                            .addParams("keyid", String.valueOf(mId))
-                            .addParams("formStore", formStoreStr)
-                            .addParams("othergridStore", otherGridStoreListStr)
-                            .record(SAVE_AND_SUBMIT)
-                    , this);
-        } catch (Exception e) {
-            iBill.dimssLoading();
-            iBill.showToast("网络请求异常");
+    public Map<String, Object> analysisForm(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()))) {
+                iBill.showToast(e.getCaption() + "为必填项");
+                iBill.dimssLoading();
+                return null;
+            }
+            if (isEnclosureNeedSubmit(e)) {
+                pushEnclosure(e);
+                return null;
+            }
+            formStore.put(e.getField(), e.getDisplay());
         }
+        return formStore;
     }
 
     @Nullable
-    private List<Map<String, Object>> analysisGrid(List<List<BillGroupModel.BillModel>> gridBillMap) {
+    public List<Map<String, Object>> analysisGrid(List<List<BillGroupModel.BillModel>> gridBillMap) {
         List<Map<String, Object>> gridStoreList = new ArrayList<>();
         for (List<BillGroupModel.BillModel> e : gridBillMap) {
             if (!ListUtils.isEmpty(e)) {
@@ -256,43 +286,30 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
     }
 
     public void saveAndSubmit(List<BillGroupModel> mGroupModels) {
-        iBill.showLoading();
-        List<BillGroupModel.BillModel> formFields = new ArrayList<>();
-        List<List<BillGroupModel.BillModel>> gridBillMap = new ArrayList<>();
-        List<BillGroupModel.GridTab> otherGridList = new ArrayList<>();
-        for (BillGroupModel e : mGroupModels) {
-            if (e.isForm()) {
-                if (e.getShowBillFields() != null) {
-                    formFields.addAll(e.getShowBillFields());
-                }
-                if (e.getHideBillFields() != null) {
-                    formFields.addAll(e.getHideBillFields());
-                }
+        saveAndSubmit(mGroupModels, "mobile/oa/commonSaveAndSubmit.action", "mobile/commonUpdate.action");
+    }
 
-            } else {
-                List<BillGroupModel.GridTab> gridTabs = e.getGridTabs();
-                if (gridTabs != null && gridTabs.size() > 0) {
-                    otherGridList = gridTabs;
-                    break;
-                }
-                List<BillGroupModel.BillModel> gridBillFields = new ArrayList<>();
-                if (e.getShowBillFields() != null) {
-                    gridBillFields.addAll(e.getShowBillFields());
-                }
-                if (e.getHideBillFields() != null) {
-                    gridBillFields.addAll(e.getHideBillFields());
-                }
-                gridBillMap.add(gridBillFields);
-            }
-        }
+    public void saveAndSubmit(List<BillGroupModel> mGroupModels, int flag) {
+        saveAndSubmit(mGroupModels, flag, "mobile/oa/commonSaveAndSubmit.action", "mobile/commonUpdate.action");
+    }
+
+    public void saveAndSubmit(List<BillGroupModel> mGroupModels, String saveUrl, String updateUrl) {
+        saveAndSubmit(mGroupModels, SAVE_AND_SUBMIT, saveUrl, updateUrl);
+    }
+
+    public void saveAndSubmit(List<BillGroupModel> mGroupModels, int flag, String saveUrl, String updateUrl) {
+        iBill.showLoading();
+        BillField billField = new BillField(mGroupModels).invoke();
+        List<BillGroupModel.BillModel> formFields = billField.getFormFields();
+        List<List<BillGroupModel.BillModel>> gridBillMap = billField.getGridBillMap();
+        List<BillGroupModel.GridTab> otherGridList = billField.getOtherGridList();
         if (otherGridList == null || otherGridList.size() <= 0) {
-            saveAndSubmit(formFields, gridBillMap);
+            saveAndSubmit(formFields, gridBillMap, saveUrl, updateUrl);
         } else {
-            saveAndSubmit(formFields, otherGridList, 0);
+            saveAndSubmit(formFields, otherGridList, flag, saveUrl, updateUrl);
         }
     }
 
-
     private Map<String, Object> getFormStore(List<BillGroupModel.BillModel> formFields) {
         Map<String, Object> formStore = new HashMap<>();
         for (BillGroupModel.BillModel e : formFields) {
@@ -439,13 +456,21 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
             case SAVE_AND_SUBMIT:
                 if (JSONUtil.getBoolean(jsonObject, "success")) {
                     if (mId <= 0) {
-                        int keyvalue = JSONUtil.getInt(jsonObject, "keyvalue");
+                        int keyvalue = JSONUtil.getInt(jsonObject, keyField, "keyvalue");
                         String formcode = JSONUtil.getText(jsonObject, "formcode");
-                        judgeApproval(keyvalue, formcode);
-                        iBill.showToast(R.string.save_success);
+                        boolean isSave = JSONUtil.getBoolean(jsonObject, "isSave");//是否是保存操作,true:保存,false:提交
+                        if (isSave) {
+                            iBill.commitSuccess(keyvalue, formcode);
+                        } else {
+                            judgeApproval(keyvalue, formcode);
+                        }
+                        if (!TextUtils.isEmpty(JSONUtil.getText(message, "exceptionInfo"))) {
+                            iBill.showToast(JSONUtil.getText(message, "exceptionInfo"));
+                        }
+                        iBill.showToast(R.string.submit_success);
                     } else {
                         judgeApproval(mId, "");
-                        iBill.showToast(R.string.save_success);
+                        iBill.showToast(R.string.submit_success);
                     }
                 }
                 break;
@@ -574,13 +599,14 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
         }
     };
 
-    protected void handlerMultiBill(JSONObject resultObject) {
-//        String localJson = CommonUtil.getAssetsJson(ct, "bill.json");
-//        LogUtil.prinlnLongMsg("billJson", localJson);
-        try {
-//            JSONObject resultObject = JSON.parseObject(localJson);
+    protected List<BillGroupModel> handlerMultiBill(JSONObject resultObject) {
+        return handlerMultiBill(resultObject, mFormToGrid, "");
+    }
 
-            List<BillGroupModel> showBillModels = new ArrayList<>();
+    protected List<BillGroupModel> handlerMultiBill(JSONObject resultObject, boolean formToGrid, String formTitle) {
+        List<BillGroupModel> showBillModels = new ArrayList<>();
+        try {
+            mFormToGrid = formToGrid;
             JSONObject config = JSONUtil.getJSONObject(resultObject, "config");
             detailKeyField = JSONUtil.getText(config, "fo_detailkeyfield");
             keyField = JSONUtil.getText(config, "fo_keyfield");
@@ -590,24 +616,39 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
             JSONObject data = JSONUtil.getJSONObject(resultObject, "data");
             JSONArray formdetail = JSONUtil.getJSONArray(data, "formdetail");
             Map<String, BillGroupModel> formdeMap = handlerFormdetail(formdetail);
+
+            List<BillGroupModel> formBillModels = new ArrayList<>();//主表显示字段
             if (formdeMap != null && !formdeMap.isEmpty()) {
                 for (Map.Entry<String, BillGroupModel> entry : formdeMap.entrySet()) {
                     BillGroupModel entryValue = entry.getValue();
                     if (entryValue != null) {
                         //主表caller为单据caller
                         entryValue.setBillCaller(mCaller);
-                        showBillModels.add(entryValue);
+                        formBillModels.add(entryValue);
                     }
                 }
-                if (!ListUtils.isEmpty(showBillModels)) {
-                    Collections.sort(showBillModels, mComparator);
+                if (!ListUtils.isEmpty(formBillModels)) {
+                    Collections.sort(formBillModels, mComparator);
                 }
             }
             multidetailgrid = JSONUtil.getBoolean(data, "multidetailgrid");
             if (multidetailgrid) {
                 JSONArray othergridetail = JSONUtil.getJSONArray(data, "othergridetail");
                 if (othergridetail != null && othergridetail.size() > 0) {
-                    List<BillGroupModel.GridTab> otherGridTabs = handlerGirdTabs(showBillModels.size() + 1, othergridetail);
+                    List<BillGroupModel.GridTab> otherGridTabs = new ArrayList<>();
+                    if (formToGrid) {
+//                        showBillModels.addAll(formBillModels);
+                        BillGroupModel.GridTab formGridTab = new BillGroupModel.GridTab();
+                        formGridTab.setPosition(0);
+                        formGridTab.setTitle(TextUtils.isEmpty(formTitle) ? "基础信息" : formTitle);
+                        formGridTab.setCaller(mCaller);
+                        formGridTab.setBillGroupModels(formBillModels);
+                        otherGridTabs.add(formGridTab);
+                    } else {
+                        showBillModels.addAll(formBillModels);
+                    }
+                    otherGridTabs.addAll(
+                            handlerGirdTabs(showBillModels.size() + 1, othergridetail, otherGridTabs.size()));
                     if (otherGridTabs.size() > 0) {
                         BillGroupModel billTab = new BillGroupModel();
                         billTab.setForm(false);
@@ -617,9 +658,31 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
                         showBillModels.add(billTab);
 
                         showBillModels.addAll(otherGridTabs.get(0).getBillGroupModels());
+
+                        /**
+                         * 如果是多从表,则添加顶部悬浮的tablayout
+                         */
+                        View topLayout = View.inflate(ct, R.layout.item_bill_tab, null);
+                        TabLayout tabLayout = topLayout.findViewById(R.id.bill_tab_tl);
+                        if (tabLayout != null) {
+                            for (int i = 0; i < otherGridTabs.size(); i++) {
+                                tabLayout.addTab(tabLayout.newTab().setText(otherGridTabs.get(i).getTitle()));
+                            }
+                            if (tabLayout.getTabCount() > 4) {
+                                tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
+                            } else {
+                                tabLayout.setTabMode(TabLayout.MODE_FIXED);
+                            }
+                            if (tabLayout.getTabCount() > 0) {
+                                tabLayout.getTabAt(0).select();
+                            }
+                        }
+
+                        iBill.addTopLayout(topLayout, tabLayout);
                     }
                 }
             } else {
+                showBillModels.addAll(formBillModels);
                 JSONArray gridetail = JSONUtil.getJSONArray(data, "gridetail");
                 Map<String, BillGroupModel> gridGroupModelMap = handlerGridetail(showBillModels.size(), gridetail);
                 if (gridGroupModelMap != null && !gridGroupModelMap.isEmpty()) {
@@ -636,36 +699,29 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
             LogUtil.i("gong", "showBillModels=" + JSON.toJSONString(showBillModels));
             iBill.setAdapter(showBillModels);
         } catch (Exception e) {
-
+            e.printStackTrace();
         }
+        return showBillModels;
     }
 
-    private List<BillGroupModel.GridTab> handlerGirdTabs(int index, JSONArray othergridetail) {
+    private List<BillGroupModel.GridTab> handlerGirdTabs(int index, JSONArray othergridetail, int position) {
         List<BillGroupModel.GridTab> gridTabs = new ArrayList<>();
         for (int i = 0; i < othergridetail.size(); i++) {
             JSONObject otherGrid = othergridetail.getJSONObject(i);
             if (otherGrid != null) {
                 JSONArray detailgrid = otherGrid.getJSONArray("detailgrid");
                 if (detailgrid != null && detailgrid.size() > 0) {
-                    BillGroupModel.GridTab gridTab = new BillGroupModel.GridTab();
                     String dgcaller = JSONUtil.getText(otherGrid, "dgcaller");
-                    gridTab.setTitle(JSONUtil.getText(otherGrid, "dgtitle"));
+                    String dgtitle = JSONUtil.getText(otherGrid, "dgtitle");
+
+                    BillGroupModel.GridTab gridTab = new BillGroupModel.GridTab();
+                    gridTab.setTitle(dgtitle);
                     gridTab.setCaller(dgcaller);
-                    gridTab.setPosition(i);
+                    gridTab.setPosition(position + i);
 
                     Map<String, BillGroupModel> gridGroupModelMap = handlerGridetail(index, detailgrid);
-                    if (gridGroupModelMap != null && !gridGroupModelMap.isEmpty()) {
-                        List<BillGroupModel> billGroupModels = new ArrayList<>();
-                        for (Map.Entry<String, BillGroupModel> entry : gridGroupModelMap.entrySet()) {
-                            BillGroupModel entryValue = entry.getValue();
-                            if (entryValue != null) {
-                                //多从表的情况下,从表caller与主表不同
-                                entryValue.setBillCaller(dgcaller);
-                                billGroupModels.add(entryValue);
-                            }
-                        }
-                        gridTab.setBillGroupModels(billGroupModels);
-                    }
+                    List<BillGroupModel> billGroupModels = handleTabGroupModels(gridGroupModelMap, dgcaller, dgtitle);
+                    gridTab.setBillGroupModels(billGroupModels);
 
                     gridTabs.add(gridTab);
                 }
@@ -674,6 +730,23 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
         return gridTabs;
     }
 
+    //返回多从表的某个从表内容
+    //可重写,控制某个从表内容
+    protected List<BillGroupModel> handleTabGroupModels(Map<String, BillGroupModel> gridGroupModelMap, String dgcaller, String dgtitle) {
+        List<BillGroupModel> billGroupModels = new ArrayList<>();
+        if (gridGroupModelMap != null && !gridGroupModelMap.isEmpty()) {
+            for (Map.Entry<String, BillGroupModel> entry : gridGroupModelMap.entrySet()) {
+                BillGroupModel entryValue = entry.getValue();
+                if (entryValue != null) {
+                    //多从表的情况下,从表caller与主表不同
+                    entryValue.setBillCaller(dgcaller);
+                    billGroupModels.add(entryValue);
+                }
+            }
+        }
+        return billGroupModels;
+    }
+
     //处理表单返回配置
     protected void handlerBill(JSONObject object) {
         LogUtil.i("gong", "object=" + object);
@@ -770,10 +843,11 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
      * @param formdetail
      * @return
      */
-    private Map<String, BillGroupModel> handlerGridetail(int index, JSONArray formdetail) {
+    protected Map<String, BillGroupModel> handlerGridetail(int index, JSONArray formdetail) {
         if (formdetail != null && !formdetail.isEmpty()) {
             Map<String, BillGroupModel> modelMap = new LinkedHashMap<>();
             if (mId <= 0) {
+                //id等于0,是新增单据,则默认添加一组从表
                 BillGroupModel mBillGroupModel = new BillGroupModel();
                 mBillGroupModel.setGroupIndex(index);
                 mBillGroupModel.setGridIndex(1);
@@ -796,12 +870,14 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
 
                 modelMap.put("明细1", mBillGroupModel);
             } else {
+                //id大于0 ,说明是在录入单据,则将在录入数据先添加进从表
                 JSONObject object = null;
                 String oldGroup = null;
                 for (int i = 0; i < formdetail.size(); i++) {
                     object = formdetail.getJSONObject(i);
                     BillGroupModel.BillModel mBillModel = getBillModelByObject(object);
-                    String group = JSONUtil.getText(object, "dg_group");
+                    String dg_group = JSONUtil.getText(object, "dg_group");
+                    String group = TextUtils.isEmpty(dg_group) ? "0" : dg_group;//dg_group为0代表是新增的单据明细
 
                     if (modelMap.containsKey("明细" + group)) {
                         BillGroupModel mBillGroupModel = modelMap.get("明细" + group);
@@ -855,7 +931,7 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
         }
     }
 
-    private BillGroupModel.BillModel getBillModelByObject(JSONObject object) {
+    protected BillGroupModel.BillModel getBillModelByObject(JSONObject object) {
         BillGroupModel.BillModel mBillModel = new BillGroupModel.BillModel();
         String caption = JSONUtil.getText(object, "fd_caption", "dg_caption");//字段名称
         String value = JSONUtil.getText(object, "fd_value", "dg_value");//字段名称
@@ -867,12 +943,13 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
         String dbfind = JSONUtil.getText(object, "fd_dbfind");//是否是dbfind字段判定
         String type = JSONUtil.getText(object, "fd_type", "dg_type");//类型(标题类型为Constants.TYPE_TITLE,不触发点击事件等 )
         String logicType = JSONUtil.getText(object, "fd_logictype", "dg_logictype");//logic类型
-        String readOnly = JSONUtil.getText(object, "fd_readonly");//是否只读
+        String readOnly = JSONUtil.getText(object, "fd_readonly", "dg_editable");//是否只读
         String field = JSONUtil.getText(object, "fd_field", "dg_field");//字段
         String defValue = JSONUtil.getText(object, "fd_defaultvalue");//默认值
         String allowBlank = JSONUtil.getText(object, "fd_allowblank");//是否允许为空(注:当作为标题的时候T:表示可以删除 F:表示不可删除)
         String findFunctionName = JSONUtil.getText(object, "dg_findfunctionname");
         String updatable = JSONUtil.getText(object, "fd_modify", "dg_modify");
+        String renderer = JSONUtil.getText(object, "dg_renderer");
 
         if (TextUtils.isEmpty(defValue) && hashMap != null && hashMap.containsKey(field)) {
             defValue = hashMap.get(field);
@@ -880,14 +957,23 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
         if (logicType.equals("necessaryField")) {
             allowBlank = "F";
         }
+        String display = "";
         JSONArray combostore = JSONUtil.getJSONArray(object, "COMBOSTORE");
         if (!ListUtils.isEmpty(combostore)) {
             List<BillGroupModel.LocalData> localDatas = new ArrayList<>();
             for (int i = 0; i < combostore.size(); i++) {
                 JSONObject combosModel = combostore.getJSONObject(i);
                 BillGroupModel.LocalData mLocalData = new BillGroupModel.LocalData();
-                mLocalData.display = JSONUtil.getText(combosModel, "DLC_DISPLAY");
-                mLocalData.value = JSONUtil.getText(combosModel, "DLC_VALUE");
+                String dlc_display = JSONUtil.getText(combosModel, "DLC_DISPLAY");
+                String dlc_value = JSONUtil.getText(combosModel, "DLC_VALUE");
+                mLocalData.display = dlc_display;
+                mLocalData.value = dlc_value;
+                if ("C".equals(type)
+                        && !TextUtils.isEmpty(value)
+                        && (value.equals(dlc_display) || value.equals(dlc_value))) {
+                    value = dlc_value;
+                    display = dlc_display;
+                }
                 localDatas.add(mLocalData);
             }
             mBillModel.setLocalDatas(localDatas);
@@ -901,11 +987,23 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
 //                mBillModel.setDisplay(defValue);
 //            }
 //        }
+
+        //附件格式处理
+        /*String enclosureId = "";
+        if ((BillTypeChangeUtils.getItemViewType(type) == 2 || "detailAttach".equals(renderer)) && !TextUtils.isEmpty(value)) {
+            String[] valueArr = value.split(";");
+            if (valueArr != null && valueArr.length >= 2) {
+                value = valueArr[0];
+                enclosureId = valueArr[1];
+            }
+        }*/
+
         mBillModel.setFindFunctionName(findFunctionName);
         mBillModel.setDetno(fd_detno);
         mBillModel.setCaption(caption);
         mBillModel.setId(id);
         mBillModel.setValue(value);
+        mBillModel.setDisplay(display);
         mBillModel.setLength(length);
         mBillModel.setAppwidth(appwidth);
         mBillModel.setIsdefault(isdefault);
@@ -917,6 +1015,8 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
         mBillModel.setDefValue(defValue);
         mBillModel.setAllowBlank(allowBlank);
         mBillModel.setUpdatable(updatable == "T");
+        mBillModel.setRenderer(renderer);
+//        mBillModel.setEnclusureId(enclosureId);
         return mBillModel;
     }
 
@@ -928,4 +1028,80 @@ public class BillPresenter extends BaseNetPresenter implements OnSmartHttpListen
     public boolean isEnclosureNeedSubmit(BillGroupModel.BillModel billModel) {
         return billModel.getType().equals("FF") && TextUtils.isEmpty(billModel.getValue()) && !ListUtils.isEmpty(billModel.getLocalDatas());
     }
+
+    /**
+     * 单据数据解析
+     */
+    public class BillField {
+        private List<BillGroupModel> mMGroupModels;
+        private List<BillGroupModel.BillModel> mFormFields;
+        private List<List<BillGroupModel.BillModel>> mGridBillMap;
+        private List<BillGroupModel.GridTab> mOtherGridList;
+
+        public BillField(List<BillGroupModel> mGroupModels) {
+            mMGroupModels = mGroupModels;
+        }
+
+        public List<BillGroupModel.BillModel> getFormFields() {
+            return mFormFields;
+        }
+
+        public List<List<BillGroupModel.BillModel>> getGridBillMap() {
+            return mGridBillMap;
+        }
+
+        public List<BillGroupModel.GridTab> getOtherGridList() {
+            return mOtherGridList;
+        }
+
+        public BillField invoke() {
+            mFormFields = new ArrayList<>();
+            mGridBillMap = new ArrayList<>();
+            mOtherGridList = new ArrayList<>();
+            for (BillGroupModel e : mMGroupModels) {
+                if (e.isForm()) {
+                    if (e.getShowBillFields() != null) {
+                        mFormFields.addAll(e.getShowBillFields());
+                    }
+                    if (e.getHideBillFields() != null) {
+                        mFormFields.addAll(e.getHideBillFields());
+                    }
+                } else {
+                    List<BillGroupModel.GridTab> gridTabs = e.getGridTabs();
+                    if (gridTabs != null && gridTabs.size() > 0) {
+                        if (mFormToGrid) {//如果主表放入tab,则主表数据在gridtabs里
+                            List<BillGroupModel> formGroupModels = gridTabs.get(0).getBillGroupModels();
+                            if (formGroupModels != null && formGroupModels.size() > 0) {
+                                for (BillGroupModel b : formGroupModels) {
+                                    if (b.isForm()) {
+                                        if (b.getShowBillFields() != null) {
+                                            mFormFields.addAll(b.getShowBillFields());
+                                        }
+                                        if (b.getHideBillFields() != null) {
+                                            mFormFields.addAll(b.getHideBillFields());
+                                        }
+                                    }
+                                }
+                            }
+                            if (gridTabs.size() > 1) {
+                                mOtherGridList = gridTabs.subList(1, gridTabs.size());
+                            }
+                        } else {
+                            mOtherGridList = gridTabs;
+                        }
+                        break;
+                    }
+                    List<BillGroupModel.BillModel> gridBillFields = new ArrayList<>();
+                    if (e.getShowBillFields() != null) {
+                        gridBillFields.addAll(e.getShowBillFields());
+                    }
+                    if (e.getHideBillFields() != null) {
+                        gridBillFields.addAll(e.getHideBillFields());
+                    }
+                    mGridBillMap.add(gridBillFields);
+                }
+            }
+            return this;
+        }
+    }
 }

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

@@ -2,20 +2,23 @@ package com.modular.apputils.presenter.imp;
 
 
 import android.content.Intent;
+import android.view.View;
 
 import com.core.base.HttpImp;
 import com.modular.apputils.model.BillGroupModel;
 
 import java.util.List;
 
-public interface IBill extends HttpImp{
+public interface IBill extends HttpImp {
     void setAdapter(List<BillGroupModel> groupModels);
+
     void setTitle(CharSequence title);
 
-    void commitSuccess(int keyValue,String code);//提交成功
+    void commitSuccess(int keyValue, String code);//提交成功
 
     void startActivityForResult(Intent intent, int requestCode);
 
     void updateFileOk();
 
+    void addTopLayout(View ...view);
 }

+ 8 - 0
app_modular/apputils/src/main/java/com/modular/apputils/presenter/imp/IBillDetails.java

@@ -1,5 +1,8 @@
 package com.modular.apputils.presenter.imp;
 
+import android.content.Intent;
+import android.view.View;
+
 import com.core.base.HttpImp;
 import com.modular.apputils.model.BillGroupModel;
 
@@ -15,4 +18,9 @@ public interface IBillDetails extends HttpImp {
     void updateDetail(List<BillGroupModel> mGroupModels);
 
     void updateFileOk();
+
+    void addTopLayout(View... view);
+
+    void showHeaderLayout(boolean show);
+
 }

+ 43 - 1
app_modular/apputils/src/main/res/layout/activity_bill_details.xml

@@ -1,10 +1,52 @@
 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
+    <LinearLayout
+        android:id="@+id/bill_detail_header_ll"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center_vertical"
+        android:orientation="horizontal"
+        android:padding="10dp"
+        android:visibility="gone">
+
+        <de.hdodenhof.circleimageview.CircleImageView
+            android:id="@+id/bill_detail_header_avatar_iv"
+            android:layout_width="42dp"
+            android:layout_height="42dp" />
+
+        <TextView
+            android:id="@+id/bill_detail_header_name_tv"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:paddingLeft="10dp"
+            android:textColor="@color/text_main"
+            tools:text="饶猛" />
+
+        <TextView
+            android:id="@+id/bill_detail_header_status_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingLeft="10dp"
+            android:textColor="@color/text_main"
+            tools:text="已审批" />
+    </LinearLayout>
+
     <com.module.recyclerlibrary.ui.refresh.EmptyRecyclerView
         android:id="@+id/mEmptyRecyclerView"
         android:layout_width="match_parent"
-        android:layout_height="match_parent" />
+        android:layout_height="match_parent"
+        android:layout_below="@id/bill_detail_header_ll" />
+
+    <FrameLayout
+        android:id="@+id/bill_detail_top_fl"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/bill_detail_header_ll"
+        android:background="@color/white"
+        android:visibility="gone" />
 </RelativeLayout>

+ 14 - 7
app_modular/apputils/src/main/res/layout/activity_bill_input.xml

@@ -1,14 +1,21 @@
 <?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:id="@+id/mRootLL"
     android:layout_width="match_parent"
+    android:layout_height="match_parent"
     android:fitsSystemWindows="true"
-    android:id="@+id/mRootLL"
-    android:focusableInTouchMode="true"
-    android:layout_height="match_parent">
+    android:focusableInTouchMode="true">
 
     <android.support.v7.widget.RecyclerView
         android:id="@+id/mRecyclerView"
-        android:focusableInTouchMode="false"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
-</LinearLayout>
+        android:layout_height="match_parent"
+        android:focusableInTouchMode="false" />
+
+    <FrameLayout
+        android:id="@+id/bill_input_top_fl"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@color/white"
+        android:visibility="gone" />
+</RelativeLayout>

+ 15 - 2
app_modular/apputils/src/main/res/layout/item_bill_details.xml

@@ -23,11 +23,14 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:background="@color/white"
-        android:padding="@dimen/padding">
+        android:paddingTop="5dp"
+        android:paddingBottom="5dp"
+        android:paddingLeft="@dimen/padding"
+        android:paddingRight="@dimen/padding">
 
         <TextView
             android:id="@+id/captionTv"
-            android:layout_width="100dp"
+            android:layout_width="60dp"
             android:layout_height="wrap_content"
             android:text="商机阶段"
             android:textColor="@color/text_hine"
@@ -36,6 +39,16 @@
             app:layout_constraintLeft_toLeftOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
 
+        <TextView
+            android:id="@+id/muchInputTv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="3dp"
+            android:layout_marginTop="8dp"
+            android:text="*"
+            android:textColor="@color/red"
+            android:visibility="visible"
+            app:layout_constraintLeft_toRightOf="@id/captionTv" />
 
         <TextView
             android:id="@+id/valuesTv"

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

@@ -1,21 +1,21 @@
 <?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"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:background="@color/white"
-    android:minHeight="50dp"
+    android:gravity="center_vertical"
+    android:minHeight="45dp"
     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" />
+        tools:text="商机阶段" />
 
 
     <TextView
@@ -23,18 +23,18 @@
         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="gone"
-        app:layout_constraintLeft_toRightOf="@id/captionTv"
-        app:layout_constraintTop_toTopOf="@id/captionTv" />
+        android:visibility="visible" />
 
-    <com.core.widget.view.MyGridView
-        android:id="@+id/ffGv"
+    <TextView
+        android:id="@+id/enclosure_values_tv"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:numColumns="3"
-        app:layout_constraintTop_toBottomOf="@id/captionTv" />
-</android.support.constraint.ConstraintLayout>
+        android:layout_marginLeft="@dimen/padding"
+        android:background="@drawable/bg_enclosure"
+        android:gravity="right|center"
+        android:textColor="@color/text_main"
+        android:textSize="@dimen/text_hine"
+        tools:text="附件" />
+</LinearLayout>

+ 5 - 0
app_modular/apputils/src/main/res/menu/menu_input_update.xml

@@ -6,4 +6,9 @@
         android:id="@+id/update"
         android:title="@string/updata"
         app:showAsAction="always" />
+    <item
+        android:id="@+id/cancel"
+        android:title="@string/cancel"
+        android:visible="false"
+        app:showAsAction="always" />
 </menu>

+ 1 - 0
app_modular/apputils/src/main/res/values-en/strings.xml

@@ -4,4 +4,5 @@
     <string name="str_error_wechat_pay_fail">支付失败</string>
     <string name="str_error_wechat_pay_cancel">支付已取消</string>
     <string name="no_fields_to_update">没有可更新的字段</string>
+    <string name="submit_success">提交成功</string>
 </resources>

+ 1 - 0
app_modular/apputils/src/main/res/values-zh-rCN/strings.xml

@@ -4,4 +4,5 @@
     <string name="str_error_wechat_pay_fail">支付失败</string>
     <string name="str_error_wechat_pay_cancel">支付已取消</string>
     <string name="no_fields_to_update">没有可更新的字段</string>
+    <string name="submit_success">提交成功</string>
 </resources>

+ 1 - 0
app_modular/apputils/src/main/res/values-zh-rTW/strings.xml

@@ -4,4 +4,5 @@
     <string name="str_error_wechat_pay_fail">支付失败</string>
     <string name="str_error_wechat_pay_cancel">支付已取消</string>
     <string name="no_fields_to_update">没有可更新的字段</string>
+    <string name="submit_success">提交成功</string>
 </resources>

+ 2 - 0
app_modular/apputils/src/main/res/values/color.xml

@@ -9,4 +9,6 @@
     <color name="cui_yellow">#EDFC71</color>
     <color name="approval_select_tab">#1084D1</color>
     <color name="approval_tab">#666666</color>
+
+    <color name="pale_blue">#E4F0F9</color>
 </resources>

+ 1 - 0
app_modular/apputils/src/main/res/values/ids.xml

@@ -2,4 +2,5 @@
 <resources>
     <item name="tag_key" type="id"></item>
     <item name="tag_key2" type="id"></item>
+    <item name="tag_key3" type="id"></item>
 </resources>

+ 1 - 0
app_modular/apputils/src/main/res/values/strings.xml

@@ -18,4 +18,5 @@
     <string name="kou_hao">标新 ,立异</string>
     <string name="advertisement">新一代梅赛德斯</string>
     <string name="no_fields_to_update">没有可更新的字段</string>
+    <string name="submit_success">提交成功</string>
 </resources>

+ 42 - 20
app_modular/appworks/src/main/AndroidManifest.xml

@@ -30,14 +30,14 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
-        <activity android:name=".OA.erp.activity.CommonDocDetailsActivity" >
+        <activity android:name=".OA.erp.activity.CommonDocDetailsActivity">
             <intent-filter>
                 <action android:name="com.modular.form.erp.activity.CommonDocDetailsActivity" />
 
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
-        <activity android:name=".OA.erp.activity.ZeTianDocDetailsActivity" >
+        <activity android:name=".OA.erp.activity.ZeTianDocDetailsActivity">
             <intent-filter>
                 <action android:name="com.modular.form.erp.activity.ZeTianDocDetailsActivity" />
 
@@ -67,7 +67,7 @@
             android:name=".OA.erp.activity.form.FormListSelectActivity"
             android:hardwareAccelerated="false"
             android:launchMode="singleTask"
-            android:windowSoftInputMode="adjustPan" >
+            android:windowSoftInputMode="adjustPan">
             <intent-filter>
                 <action android:name="com.modular.work.OA.erp.activity.form.FormListSelectActivity" />
 
@@ -252,6 +252,15 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
+
+        <activity android:name=".datainquiry.activity.ReportStatisticsBiActivity">
+            <intent-filter>
+                <action android:name="com.modular.company.ReportStatisticsBiActivity" />
+
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        
         <activity android:name=".datainquiry.activity.DataInquiryActivity">
             <intent-filter>
                 <action android:name="com.modular.company.DataInquiryActivity" />
@@ -520,35 +529,37 @@
             </intent-filter>
         </activity>
         <activity android:name=".activity.TimeHelperSettingActivity" />
-        <activity android:name=".crm3_0.activity.CustomerVisitActivity"
+        <activity
+            android:name=".crm3_0.activity.CustomerVisitActivity"
             android:label="@string/crm_customer_visit">
             <intent-filter>
                 <action android:name="com.modular.work.crm3_0.activity.CustomerVisitActivity" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
-        <activity android:name=".crm3_0.activity.CustomerListActivity"/>
-        <activity android:name=".crm3_0.activity.CustomerContactDetailActivity"/>
-        <activity android:name="com.modular.apputils.activity.BillListActivity"/>
-        <activity android:name=".crm3_0.activity.CustomerManageActivity"
+        <activity android:name=".crm3_0.activity.CustomerListActivity" />
+        <activity android:name=".crm3_0.activity.CustomerContactDetailActivity" />
+        <activity android:name="com.modular.apputils.activity.BillListActivity" />
+        <activity
+            android:name=".crm3_0.activity.CustomerManageActivity"
             android:label="客户管理">
             <intent-filter>
                 <action android:name="com.modular.work.crm3_0.activity.CustomerManageActivity" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
-        <activity android:name=".crm3_0.activity.CustomerBillInputActivity"
+        <activity
+            android:name=".crm3_0.activity.CustomerBillInputActivity"
             android:hardwareAccelerated="false"></activity>
         <activity android:name=".crm3_0.activity.CustomerDetails3_0Activity"></activity>
         <!-- 联系人 -->
-        <activity 
+        <activity
             android:name=".crm3_0.activity.ContactSearchActivity"
-            android:theme="@style/MainBaseTheme">
-        </activity>
+            android:theme="@style/MainBaseTheme"></activity>
         <activity
             android:name=".crm3_0.activity.ContactsListActivity"
-            android:theme="@style/MainBaseTheme"
             android:launchMode="singleTask"
+            android:theme="@style/MainBaseTheme"
             android:windowSoftInputMode="adjustPan|stateHidden">
             <intent-filter>
                 <action android:name="com.modular.work.ContactsListActivity" />
@@ -573,8 +584,8 @@
         <activity android:name=".activity.businessManage.BusinessRankListActivity" />
         <activity android:name=".activity.businessManage.businessMineList.BusinessMineListActivity" />
         <activity android:name=".activity.businessManage.businessStage.BusinessStageActivity" />
-      
-        <activity android:name=".crm3_0.activity.BillSearchActivity" >
+
+        <activity android:name=".crm3_0.activity.BillSearchActivity">
             <intent-filter>
                 <action android:name="com.modular.work.crm3_0.activity.BillSearchActivity" />
 
@@ -583,19 +594,30 @@
         </activity>
         <activity android:name=".crm3_0.activity.CustomerVisitDetailsActivity" />
         <activity android:name=".crm3_0.activity.CustomerCareListActivity" />
-        <activity android:name=".crm3_0.activity.VisitRecordBillInputActivity"
+        <activity
+            android:name=".crm3_0.activity.VisitRecordBillInputActivity"
             android:hardwareAccelerated="false" />
         <activity android:name=".crm3_0.activity.CusBillDetailsActivity" />
-        <activity android:name=".crm3_0.activity.CustomerVisitBillInputActivity"
+        <activity
+            android:name=".crm3_0.activity.CustomerVisitBillInputActivity"
             android:hardwareAccelerated="false" />
         <activity android:name=".crm3_0.activity.CustomerContactActivity" />
         <activity android:name=".activity.businessManage.businessDetailActivity.BusinessDetailNewActivity" />
         <activity android:name=".activity.businessManage.BusinessCompanyListActivity" />
         <activity android:name=".activity.businessManage.businessChangeStage.BusinessChangeStageActivity" />
-        <activity android:name=".activity.businessManage.BusinessBillInputActivity"
+        <activity
+            android:name=".activity.businessManage.BusinessBillInputActivity"
             android:hardwareAccelerated="false" />
-        
-        <activity android:name=".crm3_0.activity.BillInputBindActivity"/>
+
+        <activity android:name=".crm3_0.activity.BillInputBindActivity" />
+        <activity android:name=".CRM.erp.activity.DeviceDetailActivity" />
+        <activity android:name=".CRM.erp.activity.DeviceBillInputActivity" />
+        <activity android:name=".CRM.erp.activity.DeviceBillDetailActivity" />
+        <activity android:name=".CRM.erp.activity.DeviceInventoryQueryActivity" />
+        <activity android:name=".activity.DeviceListActivity" />
+        <activity android:name=".activity.DeviceBatchTransferActivity" />
+        <activity android:name=".CRM.erp.activity.DeviceBatchTransferAddActivity" />
+        <activity android:name=".CRM.erp.activity.DeviceBatchTransferDetailActivity" />
     </application>
 
 </manifest>

File diff suppressed because it is too large
+ 0 - 4
app_modular/appworks/src/main/java/com/uas/appworks/CRM/erp/activity/DeviceDataFormAddActivity.java


+ 62 - 36
app_modular/appworks/src/main/java/com/uas/appworks/CRM/erp/activity/DeviceManageActivity.java

@@ -12,19 +12,22 @@ import com.afollestad.materialdialogs.MaterialDialog;
 import com.common.data.StringUtil;
 import com.core.app.Constants;
 import com.core.app.MyApplication;
+import com.core.base.BaseActivity;
 import com.core.base.SupportToolBarActivity;
 import com.core.utils.ToastUtil;
 import com.uas.appworks.CRM.erp.adapter.DeviceManageAdapter;
 import com.uas.appworks.CRM.erp.model.DeviceManage;
 import com.uas.appworks.R;
+import com.uas.appworks.activity.DeviceBatchTransferActivity;
 import com.uas.appworks.activity.DeviceQueryActivity;
+import com.uas.appworks.activity.RealTimeFormActivity;
 import com.uuzuche.lib_zxing.activity.CaptureActivity;
 import com.uuzuche.lib_zxing.activity.CodeUtils;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class DeviceManageActivity extends SupportToolBarActivity {
+public class DeviceManageActivity extends BaseActivity {
 
     private RecyclerView contantRv;
 
@@ -37,21 +40,43 @@ public class DeviceManageActivity extends SupportToolBarActivity {
 
     private void initView() {
         contantRv = findViewById(R.id.contantRv);
-        contantRv.setLayoutManager(new GridLayoutManager(ct, 4));
+        contantRv.setLayoutManager(new GridLayoutManager(ct, 3));
         List<DeviceManage> models = new ArrayList<>();
         //扫一扫
-        models.add(new DeviceManage(1, R.drawable.icon_scan_device, StringUtil.getMessage(R.string.text_scan_device)).setCazz(CaptureActivity.class).setRequest(0x21));
+        models.add(new DeviceManage(1, R.drawable.ic_device_scan, StringUtil.getMessage(R.string.text_scan_device)).setCazz(CaptureActivity.class).setRequest(0x21));
         //设备查询
-        models.add(new DeviceManage(2, R.drawable.icon_device_query, StringUtil.getMessage(R.string.text_device_query)).setCazz(DeviceQueryActivity.class).addString(Constants.FLAG.DEVICE_CALLER, "Device").addString(Constants.FLAG.DEVICE_WHICH_PAGE, Constants.FLAG.DEVICE_FROM_QUERY));
+        models.add(new DeviceManage(2, R.drawable.ic_device_query, StringUtil.getMessage(R.string.text_device_query))
+                .setCazz(DeviceQueryActivity.class)
+                .addString(Constants.FLAG.DEVICE_CALLER, "Device")
+                .addString(Constants.FLAG.DEVICE_WHICH_PAGE, Constants.FLAG.DEVICE_FROM_QUERY));
         //通用配置表单
 
-        models.add(new DeviceManage(3, R.drawable.icon_application_use, StringUtil.getMessage(R.string.text_application_use)).setCazz(DeviceDataFormAddActivity.class).addString("caller", "DeviceChange!Use"));
-        models.add(new DeviceManage(4, R.drawable.icon_scrap_application, StringUtil.getMessage(R.string.text_scrap_application)).setCazz(DeviceDataFormAddActivity.class).addString("caller", "DeviceChange!Scrap"));
-        models.add(new DeviceManage(5, R.drawable.icon_maintenance, StringUtil.getMessage(R.string.text_maintenance)).setCazz(DeviceDataFormAddActivity.class).addString("caller", "DeviceChange!Maintain"));
-        models.add(new DeviceManage(6, R.drawable.icon_fault_inspection, StringUtil.getMessage(R.string.text_fault_inspection)).setCazz(DeviceDataFormAddActivity.class).addString("caller", "DeviceChange!Inspect"));
-        //周期盘点
-        models.add(new DeviceManage(7, R.drawable.icon_cycle_count, StringUtil.getMessage(R.string.text_cycle_count)).setCazz(DeviceCycleCountActivity.class));
-        models.add(new DeviceManage(8, R.drawable.icon_device_match, StringUtil.getMessage(R.string.text_device_query_match)).setCazz(DeviceMatchActivity.class));
+        models.add(new DeviceManage(3, R.drawable.ic_use_apply, StringUtil.getMessage(R.string.text_application_use))
+                .setCazz(DeviceDataFormAddActivity.class).addString("caller", "DeviceChange!Use"));
+        models.add(new DeviceManage(4, R.drawable.ic_scrap_apply, StringUtil.getMessage(R.string.text_scrap_application))
+                .setCazz(DeviceDataFormAddActivity.class).addString("caller", "DeviceChange!Scrap"));
+        models.add(new DeviceManage(5, R.drawable.ic_maintain_manage, StringUtil.getMessage(R.string.text_maintenance))
+                .setCazz(DeviceBillInputActivity.class)
+                .addString(Constants.Intents.CALLER, "DeviceChange!Maintain"));
+        models.add(new DeviceManage(6, R.drawable.ic_fault_check, StringUtil.getMessage(R.string.text_fault_inspection))
+                .setCazz(DeviceDataFormAddActivity.class).addString("caller", "DeviceChange!Inspect"));
+        models.add(new DeviceManage(9, R.drawable.ic_device_repair, StringUtil.getMessage(R.string.text_device_repair))
+                .setCazz(DeviceQueryActivity.class)
+                .addString(Constants.FLAG.DEVICE_CALLER, "DeviceChange!Repair")
+                .addString(Constants.FLAG.DEVICE_WHICH_PAGE, Constants.FLAG.DEVICE_FROM_COMMON));
+        models.add(new DeviceManage(7, R.drawable.ic_cycle_count, StringUtil.getMessage(R.string.text_cycle_count))
+                .setCazz(DeviceCycleCountActivity.class));
+        models.add(new DeviceManage(8, R.drawable.ic_require_match, StringUtil.getMessage(R.string.text_device_query_match))
+                .setCazz(DeviceMatchActivity.class));
+        models.add(new DeviceManage(10, R.drawable.ic_inventory_query, StringUtil.getMessage(R.string.text_inventory_query))
+                .setCazz(DeviceInventoryQueryActivity.class)
+                .addString(Constants.Intents.CALLER, "DeviceAppQuery"));
+        models.add(new DeviceManage(11, R.drawable.ic_batch_transfer, StringUtil.getMessage(R.string.text_batch_transfer))
+                .setCazz(DeviceBatchTransferActivity.class)
+                .addString(Constants.FLAG.DEVICE_CALLER, "DeviceBatch!Use")
+                .addString(Constants.FLAG.DEVICE_WHICH_PAGE, Constants.FLAG.DEVICE_FROM_COMMON));
+        models.add(new DeviceManage(12, R.drawable.ic_statistical_analysis, StringUtil.getMessage(R.string.text_statistical_analysis))
+                .setCazz(RealTimeFormActivity.class));
         DeviceManageAdapter adapter = new DeviceManageAdapter(this, models);
         contantRv.setAdapter(adapter);
         adapter.setItemClickListener(new DeviceManageAdapter.ItemClickListener() {
@@ -69,31 +94,33 @@ public class DeviceManageActivity extends SupportToolBarActivity {
     private void clickDevice(final DeviceManage manage) throws Exception {
         if (manage != null) {
             Class cazz = manage.getCazz();
-            final Intent intent = new Intent(ct, cazz);
-            intent.putExtra("title", manage.getName());
-            Bundle bundle = manage.getBundle();
-            if (bundle != null) {
-                intent.putExtra("data", bundle);
-                if (bundle.keySet() != null) {
-                    for (String e : bundle.keySet()) {
-                        intent.putExtra(e, bundle.getString(e));
+            if (cazz != null) {
+                final Intent intent = new Intent(ct, cazz);
+                intent.putExtra(Constants.Intents.TITLE, manage.getName());
+                Bundle bundle = manage.getBundle();
+                if (bundle != null) {
+                    intent.putExtra("data", bundle);
+                    if (bundle.keySet() != null) {
+                        for (String e : bundle.keySet()) {
+                            intent.putExtra(e, bundle.getString(e));
+                        }
                     }
                 }
-            }
-            if (manage.getRequest() > 0) {
-                requestPermission(Manifest.permission.CAMERA, new Runnable() {
-                    @Override
-                    public void run() {
-                        startActivityForResult(intent, manage.getRequest());
-                    }
-                }, new Runnable() {
-                    @Override
-                    public void run() {
-                        ToastUtil.showToast(ct, R.string.not_camera_permission);
-                    }
-                });
-            } else {
-                startActivity(intent);
+                if (manage.getRequest() > 0) {
+                    requestPermission(Manifest.permission.CAMERA, new Runnable() {
+                        @Override
+                        public void run() {
+                            startActivityForResult(intent, manage.getRequest());
+                        }
+                    }, new Runnable() {
+                        @Override
+                        public void run() {
+                            ToastUtil.showToast(ct, R.string.not_camera_permission);
+                        }
+                    });
+                } else {
+                    startActivity(intent);
+                }
             }
         }
     }
@@ -108,8 +135,7 @@ public class DeviceManageActivity extends SupportToolBarActivity {
                     if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
                         String result = bundle.getString(CodeUtils.RESULT_STRING);
                         Log.d("scanurl", result);
-//                        ToastUtil.showToast(ct, result);
-                        startActivityForResult(new Intent(ct, ScanDetailActivity.class).putExtra("decode", result), 0x22);
+                        startActivityForResult(new Intent(ct, DeviceDetailActivity.class).putExtra("decode", result), 0x22);
                     }
                 }
             } else if (requestCode == 0x22) {

+ 4 - 2
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/CommonDocDetailsActivity.java

@@ -325,8 +325,10 @@ public class CommonDocDetailsActivity extends BaseActivity {
             if (getToolBarTitle() != null) {
                 title = getToolBarTitle().toString();
             }
-            if (real_status == null || !(real_status.equals("已提交") || real_status.equals("已审核"))
-                    || title == null || !"出差单详情".equals(title)) {
+            //去预定按钮,只有出差单状态为【已审核】才显示
+            if ("出差单详情".equals(title) && "已审核".equals(real_status)) {
+                item.setVisible(true);
+            } else {
                 item.setVisible(false);
             }
         }

+ 10 - 7
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/form/DataFormDetailActivity.java

@@ -1460,6 +1460,9 @@ public class DataFormDetailActivity extends BaseActivity implements View.OnClick
                     if (!StringUtil.isEmpty(data.getValue()) && isLeave) {
                         model.editText.setText(data.getValue());
                     }
+                    if (editText.getText() != null) {
+                        editText.setSelection(editText.getText().toString().length());
+                    }
 
                     //TODO 判断是否允许为空
                     model.editText.setHint("请输入");
@@ -2362,7 +2365,7 @@ public class DataFormDetailActivity extends BaseActivity implements View.OnClick
             }
             LogUtil.d("forStore:" + forStore.toString());
 
-            saveData(forStore.toString(), "{}");
+            saveData(forStore.toString(), "[]");
         }
 
 
@@ -2377,12 +2380,12 @@ public class DataFormDetailActivity extends BaseActivity implements View.OnClick
             ToastMessage("界面字段为空,不能提交!");
             return;
         }
-        if ("[]".equals(gridStore)) {
-            ToastMessage("单据明细必填字段缺失,请联系管理员!");
-            if (!caller.equals("MainTain")) {
-                return;
-            }
-        }
+//        if ("[]".equals(gridStore)) {
+//            ToastMessage("单据明细必填字段缺失,请联系管理员!");
+//            if (!caller.equals("MainTain")) {
+//                return;
+//            }
+//        }
         if ("{}".equals(formStore) || "{".equals(formStore)) {
             ToastMessage("单据主表必填字段缺失,请联系管理员!");
             return;

+ 3 - 0
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/form/TravelDataFormDetailActivity.java

@@ -1355,6 +1355,9 @@ public class TravelDataFormDetailActivity extends BaseActivity implements View.O
                     if (!StringUtil.isEmpty(data.getValue()) && isLeave) {
                         model.editText.setText(data.getValue());
                     }
+                    if (editText.getText() != null) {
+                        editText.setSelection(editText.getText().toString().length());
+                    }
                     model.editText.setHint("请输入");
                     if (!TextUtils.isEmpty(data.getAllowblank()) && ("F".equals(data.getAllowblank())
                             || "necessaryField".equals(data.getAllowblank()))) {

+ 3 - 0
app_modular/appworks/src/main/java/com/uas/appworks/activity/CommonDataFormActivity.java

@@ -1368,6 +1368,9 @@ public class CommonDataFormActivity extends BaseActivity implements View.OnClick
                     if (!StringUtil.isEmpty(data.getValue()) && isLeave) {
                         model.editText.setText(data.getValue());
                     }
+                    if (editText.getText() != null) {
+                        editText.setSelection(editText.getText().toString().length());
+                    }
                     break;
             }
 

+ 175 - 86
app_modular/appworks/src/main/java/com/uas/appworks/activity/DeviceQueryActivity.java

@@ -1,6 +1,9 @@
 package com.uas.appworks.activity;
 
+import android.Manifest;
+import android.app.Activity;
 import android.content.Intent;
+import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.v7.app.ActionBar;
 import android.text.TextUtils;
@@ -32,6 +35,7 @@ import com.core.dao.historical.HistoricalRecordBean;
 import com.core.dao.historical.HistoricalRecordDao;
 import com.core.interfac.OnVoiceCompleteListener;
 import com.core.utils.CommonUtil;
+import com.core.utils.ToastUtil;
 import com.core.widget.ClearEditText;
 import com.core.widget.EmptyLayout;
 import com.core.widget.MyListView;
@@ -39,8 +43,9 @@ import com.handmark.pulltorefresh.library.PullToRefreshBase;
 import com.handmark.pulltorefresh.library.PullToRefreshListView;
 import com.me.network.app.base.HttpParams;
 import com.me.network.app.http.Method;
-import com.uas.appworks.CRM.erp.activity.ScanDetailActivity;
-import com.uas.appworks.OA.erp.activity.CommonDocDetailsActivity;
+import com.uas.appworks.CRM.erp.activity.DeviceBillDetailActivity;
+import com.uas.appworks.CRM.erp.activity.DeviceBillInputActivity;
+import com.uas.appworks.CRM.erp.activity.DeviceDetailActivity;
 import com.uas.appworks.R;
 import com.uas.appworks.adapter.DeviceQueryConditionAdapter;
 import com.uas.appworks.datainquiry.adapter.DataInquiryFlexAdapter;
@@ -49,8 +54,12 @@ import com.uas.appworks.datainquiry.bean.DataInquiryFlexBean;
 import com.uas.appworks.datainquiry.bean.SchemeConditionBean;
 import com.uas.appworks.presenter.WorkPlatPresenter;
 import com.uas.appworks.view.WorkPlatView;
+import com.uuzuche.lib_zxing.activity.CaptureActivity;
+import com.uuzuche.lib_zxing.activity.CodeUtils;
 
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -67,23 +76,24 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
     private final int OBTAIN_DEVICE_LIST = 0x11;
 
     private PullToRefreshListView mDataListView;
-    private ImageView mTotalImage, mBackImageView, mFilterImageView, mVoiceImageView;
+    protected ImageView mTotalImage, mBackImageView, mFilterImageView, mVoiceImageView, mScanImageView;
     private View mGrayBackGround;
-    private ClearEditText mSearchEditText;
+    protected ClearEditText mSearchEditText;
     private LinearLayout mHistoryWholeLl, mOptionWholeLl, mHistoryLayout, mOptionLayout;
     private TextView mClearHistoryTextView, mOptionCancelTextView, mOptionResetTextView, mOptionConfirmTextView;
     private MyListView mHistoryListView;
     private ListView mOptionListView;
-    private List<SchemeConditionBean> mConditionBeans, mResetConditionBeans, mfuzzyConditionBeans;
+    protected List<SchemeConditionBean> mConditionBeans, mResetConditionBeans, mfuzzyConditionBeans;
     private DeviceQueryConditionAdapter mDeviceQueryConditionAdapter;
     private List<HistoricalRecordBean> mHistoricalRecordBeans;
     private HistoricalRecordAdapter mHistoricalRecordAdapter;
     private EmptyLayout mEmptyLayout;
     private Animation mInAnimation, mOutAnimation;
 
-    private String fuzzyHint = "", mCondition = "1 = 1", mBaseCondition = "";
-    private int mPageIndex = 1, mPageSize = 25;
-    private List<DataInquiryFlexBean> mDeviceQueryFlexBeans;
+    protected String fuzzyHint = "", mCondition = "1 = 1", mBaseCondition = "";
+    protected int mPageIndex = 1;
+    protected int mPageSize = 25;
+    protected List<DataInquiryFlexBean> mDeviceQueryFlexBeans;
     private DataInquiryFlexAdapter mDeviceQueryFlexAdapter;
     private List<DataInquiryFlexBean.RowBean.RowChildBean> mRowChildBeans, mAllRowChildBeans;
     private String mFuzzyField = "";
@@ -92,7 +102,7 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
 
     @Override
     protected int getLayout() {
-        return R.layout.activity_data_inquiry_list;
+        return R.layout.activity_device_query_list;
     }
 
     @Override
@@ -102,15 +112,13 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
 
     @Override
     protected void initView() {
-        setTitle("");
         View view = LayoutInflater.from(ct).inflate(R.layout.action_data_inquiry_list, null);
         mBackImageView = (ImageView) view.findViewById(R.id.back);
         mFilterImageView = (ImageView) view.findViewById(R.id.data_inquiry_filter_iv);
         mVoiceImageView = (ImageView) view.findViewById(R.id.data_inquiry_voice_iv);
         mSearchEditText = (ClearEditText) view.findViewById(R.id.data_inquiry_filter_et);
-        ActionBar bar = this.getSupportActionBar();
-        bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
-        bar.setCustomView(view);
+        mScanImageView = (ImageView) view.findViewById(R.id.data_inquiry_filter_scan_iv);
+        setActionTitle(view);
 
         mDataListView = $(R.id.data_inquiry_list_ptlv);
         mTotalImage = $(R.id.data_inquiry_list_total_spread_iv);
@@ -142,7 +150,7 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
         mHistoryListView.setAdapter(mHistoricalRecordAdapter);
 
         mDeviceQueryFlexBeans = new ArrayList<>();
-        mDeviceQueryFlexAdapter = new DataInquiryFlexAdapter(mContext, mDeviceQueryFlexBeans);
+        mDeviceQueryFlexAdapter = new DataInquiryFlexAdapter(mContext, mDeviceQueryFlexBeans, true);
         mDataListView.setAdapter(mDeviceQueryFlexAdapter);
 
         Intent intent = getIntent();
@@ -170,6 +178,14 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
         }
     }
 
+    protected void setActionTitle(View view) {
+        setTitle("");
+
+        ActionBar bar = this.getSupportActionBar();
+        bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
+        bar.setCustomView(view);
+    }
+
     @Override
     protected WorkPlatPresenter initPresenter() {
         return new WorkPlatPresenter();
@@ -179,6 +195,7 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
     protected void initEvent() {
         mBackImageView.setOnClickListener(this);
         mFilterImageView.setOnClickListener(this);
+        mScanImageView.setOnClickListener(this);
         mVoiceImageView.setOnClickListener(this);
         mClearHistoryTextView.setOnClickListener(this);
         mOptionCancelTextView.setOnClickListener(this);
@@ -213,58 +230,7 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
         mDataListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-                int reallyPosition = (int) parent.getItemIdAtPosition(position);
-                if (Constants.FLAG.DEVICE_FROM_COMMON.equals(mWhichPage)) {
-                    String keyValue = null, status = null, title = null;
-                    if (ListUtils.getSize(mDeviceQueryFlexAdapter.getRowChildBeans()) <= reallyPosition)
-                        return;
-                    List<DataInquiryFlexBean.RowBean.RowChildBean> childBeans = mDeviceQueryFlexAdapter.getRowChildBeans().get(reallyPosition);
-                    for (DataInquiryFlexBean.RowBean.RowChildBean rowChildBean : childBeans) {
-                        if ("dc_id".equals(rowChildBean.getField())) {
-                            keyValue = rowChildBean.getValue();
-                        }
-                        if ("dc_class".equals(rowChildBean.getField())) {
-                            title = rowChildBean.getValue();
-                        }
-                        if ("dc_status".equals(rowChildBean.getField())) {
-                            status = rowChildBean.getValue();
-                        }
-                        if (keyValue != null && status != null) {
-                            break;
-                        }
-                    }
-                    startActivityForResult(new Intent(mContext, CommonDocDetailsActivity.class)
-                            .putExtra("caller", mCaller)
-                            .putExtra("keyValue", keyValue)
-                            .putExtra("title", StringUtil.isEmpty(title) ? "单据" : title)
-                            .putExtra("device", true)
-                            .putExtra("status", status), 0x981);
-
-                } else if (Constants.FLAG.DEVICE_FROM_QUERY.equals(mWhichPage)) {
-                    String decode = null;
-                    if (ListUtils.getSize(mDeviceQueryFlexAdapter.getRowChildBeans()) <= reallyPosition) {
-                        return;
-                    }
-                    List<DataInquiryFlexBean.RowBean.RowChildBean> childBeans = mDeviceQueryFlexAdapter.getRowChildBeans().get(reallyPosition);
-                    for (DataInquiryFlexBean.RowBean.RowChildBean rowChildBean : childBeans) {
-                        if ("de_code".equals(rowChildBean.getField())) {
-                            decode = rowChildBean.getValue();
-                            break;
-                        }
-                    }
-
-                    startActivityForResult(new Intent(ct, ScanDetailActivity.class).putExtra("decode", decode), 0x22);
-                } else {
-                    if (CommonUtil.isRepeatClick()) {
-                        if (mOldPosition == reallyPosition) {
-                            mDeviceQueryFlexAdapter.getObjects().get(reallyPosition).setIsFlex(!mDeviceQueryFlexAdapter.getObjects().get(reallyPosition).isFlex());
-                            mDeviceQueryFlexAdapter.notifyDataSetChanged();
-                        } else {
-                            mOldPosition = reallyPosition;
-                        }
-                    }
-                    mOldPosition = reallyPosition;
-                }
+                itemClickEvent(parent, position);
             }
         });
         mDataListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@@ -328,6 +294,80 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
         });
     }
 
+    protected void itemClickEvent(AdapterView<?> parent, int position) {
+        int reallyPosition = (int) parent.getItemIdAtPosition(position);
+        if (Constants.FLAG.DEVICE_FROM_COMMON.equals(mWhichPage)) {
+            String keyValue = null, status = null, title = null;
+            if (ListUtils.getSize(mDeviceQueryFlexAdapter.getRowChildBeans()) <= reallyPosition)
+                return;
+            List<DataInquiryFlexBean.RowBean.RowChildBean> childBeans = mDeviceQueryFlexAdapter.getRowChildBeans().get(reallyPosition);
+            for (DataInquiryFlexBean.RowBean.RowChildBean rowChildBean : childBeans) {
+                if ("dc_id".equals(rowChildBean.getField())) {
+                    keyValue = rowChildBean.getValue();
+                }
+                if ("dc_class".equals(rowChildBean.getField())) {
+                    title = rowChildBean.getValue();
+                }
+                if ("dc_status".equals(rowChildBean.getField()) || "dc_repstatus".equals(rowChildBean.getField())) {
+                    status = rowChildBean.getValue();
+                }
+                if (keyValue != null && status != null && title != null) {
+                    break;
+                }
+            }
+//                    startActivityForResult(new Intent(mContext, CommonDocDetailsActivity.class)
+//                            .putExtra("caller", mCaller)
+//                            .putExtra("keyValue", keyValue)
+//                            .putExtra("title", StringUtil.isEmpty(title) ? "单据" : title)
+//                            .putExtra("device", true)
+//                            .putExtra("status", status), 0x981);
+            int formId = 0;
+            try {
+                formId = Integer.parseInt(keyValue);
+            } catch (Exception e) {
+                formId = 0;
+            }
+            Class targetActivity = DeviceBillDetailActivity.class;
+            if ("在录入".equals(status)) {
+                targetActivity = DeviceBillInputActivity.class;
+            }
+            startActivityForResult(new Intent(mContext, targetActivity)
+                    .putExtra(Constants.Intents.CALLER, mCaller)
+                    .putExtra(Constants.Intents.ID, formId)
+                    .putExtra(Constants.Intents.INPUT_CLASS, DeviceBillInputActivity.class)
+                    .putExtra(Constants.Intents.TITLE, StringUtil.isEmpty(title) ? "单据" : title)
+                    .putExtra("device", true)
+                    .putExtra(Constants.Intents.SHOW_HEADER, true)
+                    .putExtra(Constants.Intents.BILL_STATUS, status), 0x981);
+
+        } else if (Constants.FLAG.DEVICE_FROM_QUERY.equals(mWhichPage)) {
+            String decode = null;
+            if (ListUtils.getSize(mDeviceQueryFlexAdapter.getRowChildBeans()) <= reallyPosition) {
+                return;
+            }
+            List<DataInquiryFlexBean.RowBean.RowChildBean> childBeans = mDeviceQueryFlexAdapter.getRowChildBeans().get(reallyPosition);
+            for (DataInquiryFlexBean.RowBean.RowChildBean rowChildBean : childBeans) {
+                if ("de_code".equals(rowChildBean.getField())) {
+                    decode = rowChildBean.getValue();
+                    break;
+                }
+            }
+
+//                    startActivityForResult(new Intent(ct, ScanDetailActivity.class).putExtra("decode", decode), 0x22);
+            startActivityForResult(new Intent(ct, DeviceDetailActivity.class).putExtra("decode", decode), 0x22);
+        } else {
+            if (CommonUtil.isRepeatClick()) {
+                if (mOldPosition == reallyPosition) {
+                    mDeviceQueryFlexAdapter.getObjects().get(reallyPosition).setIsFlex(!mDeviceQueryFlexAdapter.getObjects().get(reallyPosition).isFlex());
+                    mDeviceQueryFlexAdapter.notifyDataSetChanged();
+                } else {
+                    mOldPosition = reallyPosition;
+                }
+            }
+            mOldPosition = reallyPosition;
+        }
+    }
+
     @Override
     protected void initData() {
         mConditionBeans = new ArrayList<>();
@@ -354,7 +394,6 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
         } catch (Exception e) {
 
         }
-
         if (!CommonUtil.isNetWorkConnected(this)) {
             mEmptyLayout.setErrorMessage(getString(R.string.networks_out));
             mEmptyLayout.showError();
@@ -363,19 +402,29 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
         }
     }
 
-    private void obtainDeviceList() {
+    protected void obtainDeviceList() {
+        obtainDeviceList(mPageIndex, mPageSize);
+    }
+
+    protected void obtainDeviceList(int pageIndex, int pageSize) {
+        String conditionEncode = mCondition;
+        /*try {
+            conditionEncode = URLEncoder.encode(mCondition, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            conditionEncode = mCondition;
+        }*/
         Map<String, Object> params = new HashMap<>();
         params.put("caller", mCaller);
-        params.put("condition", mCondition);
-        params.put("page", mPageIndex);
-        params.put("pageSize", mPageSize);
+        params.put("condition", conditionEncode);
+        params.put("page", pageIndex);
+        params.put("pageSize", pageSize);
 
         LinkedHashMap<String, Object> header = new LinkedHashMap<>();
         header.put("Cookie", CommonUtil.getErpCookie(mContext));
 
         HttpParams httpParams = new HttpParams.Builder()
                 .url("mobile/common/list.action")
-                .method(Method.GET)
+                .method(Method.POST)
                 .setHeaders(header)
                 .setParams(params)
                 .flag(OBTAIN_DEVICE_LIST)
@@ -397,7 +446,7 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
         }
     }
 
-    private void initConditions() {
+    protected void initConditions() {
         if ("Device".equals(mCaller)) {
             SchemeConditionBean schemeConditionBean = null;
 
@@ -457,7 +506,7 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
 
             property = new SchemeConditionBean.Property();
             property.setDisplay("故障中");
-            property.setValue("BREAKIND");
+            property.setValue("BREAKING");
             properties.add(property);
 
             property = new SchemeConditionBean.Property();
@@ -470,6 +519,16 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
             property.setValue("LOSSED");
             properties.add(property);
 
+            property = new SchemeConditionBean.Property();
+            property.setDisplay("借用");
+            property.setValue("LEND");
+            properties.add(property);
+
+            property = new SchemeConditionBean.Property();
+            property.setDisplay("已验退");
+            property.setValue("CHECKBACK");
+            properties.add(property);
+
             schemeConditionBean.setProperties(properties);
             mConditionBeans.add(schemeConditionBean);
         } else {
@@ -481,7 +540,6 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
             schemeConditionBean = initCondition("设备编号", "dc_devcode", "S");
             mConditionBeans.add(schemeConditionBean);
             mfuzzyConditionBeans.add(schemeConditionBean);
-
         }
         try {
             mResetConditionBeans = CommonUtil.deepCopy(mConditionBeans);
@@ -496,15 +554,37 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         if (requestCode == 0x981) {
-            mPageIndex = 1;
-            obtainDeviceList();
+            refreshDataList();
         } else if (requestCode == 0x22) {
             if (data != null) {
                 showDialog(data.getStringExtra("data"));
             }
+        } else if (requestCode == 0x33 && resultCode == Activity.RESULT_OK) {
+            Bundle bundle = data.getExtras();
+            if (bundle != null) {
+                if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
+                    String result = bundle.getString(CodeUtils.RESULT_STRING);
+                    if ("Device".equals(mCaller)) {
+                        startActivityForResult(new Intent(ct, DeviceDetailActivity.class).
+                                putExtra("decode", result), 0x22);
+                    } else {
+                        mSearchEditText.setText(result);
+                        fuzzySearch();
+                    }
+                }
+            }
+        } else if (requestCode == 0x34) {
+            showDialog(data.getStringExtra("data"));
         }
     }
 
+    protected void refreshDataList() {
+        mDeviceQueryFlexBeans.clear();
+        mDeviceQueryFlexAdapter.setRowChildBeans(new ArrayList<List<DataInquiryFlexBean.RowBean.RowChildBean>>());
+        int pageSize = mPageIndex * mPageSize;
+        obtainDeviceList(1, pageSize);
+    }
+
     private void showDialog(String message) {
         if (StringUtil.isEmpty(message)) return;
         new MaterialDialog.Builder(ct)
@@ -527,7 +607,7 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
     }
 
     @NonNull
-    private SchemeConditionBean initCondition(String caption, String field, String type) {
+    protected SchemeConditionBean initCondition(String caption, String field, String type) {
         ArrayList<SchemeConditionBean.Property> properties = new ArrayList<>();
         SchemeConditionBean.Property property = new SchemeConditionBean.Property();
         property.setValue("");
@@ -609,6 +689,7 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
                 LogUtil.prinlnLongMsg("deviceQuery", result);
                 if (mPageIndex == 1) {
                     mDeviceQueryFlexBeans.clear();
+                    mDeviceQueryFlexAdapter.setRowChildBeans(new ArrayList<List<DataInquiryFlexBean.RowBean.RowChildBean>>());
                 }
                 try {
                     JSONObject resultObject = JSON.parseObject(result);
@@ -698,7 +779,6 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
                                 String caption = columnsConditionBeans.get(j).getCaption();
 
                                 String value = JSONUtil.getText(listdataObject, field);
-
                                 if (value != null) {
                                     DataInquiryFlexBean.RowBean.RowChildBean rowChildBean = new DataInquiryFlexBean.RowBean.RowChildBean();
                                     rowChildBean.setCaption(caption);
@@ -718,7 +798,6 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
                                 DataInquiryFlexBean.RowBean rowBean = new DataInquiryFlexBean.RowBean();
 
                                 List<DataInquiryFlexBean.RowBean.RowChildBean> childBeans = new ArrayList<>();
-
                                 DataInquiryFlexBean.RowBean.RowChildBean rowChildBean1 = mRowChildBeans.get(k);
                                 childBeans.add(rowChildBean1);
                                 if (rowChildBean1.getWidth() <= 100 && k < (mRowChildBeans.size() - 1)) {
@@ -728,16 +807,16 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
                                         k++;
                                     }
                                 }
-
                                 rowBean.setRowChildBeans(childBeans);
 
                                 rowBeans.add(rowBean);
                             }
+                            deviceQueryFlexBean.setAllRowBeans(mAllRowChildBeans);
                             deviceQueryFlexBean.setRowBeans(rowBeans);
                             mDeviceQueryFlexBeans.add(deviceQueryFlexBean);
                         }
                     }
-                    mDeviceQueryFlexAdapter.setRowChildBeans(rowChildBeans);
+                    mDeviceQueryFlexAdapter.addRowChildBeans(rowChildBeans);
                     mDeviceQueryFlexAdapter.notifyDataSetChanged();
                 } catch (Exception e) {
                     mDeviceQueryFlexAdapter.notifyDataSetChanged();
@@ -847,6 +926,19 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
                     mGrayBackGround.setVisibility(View.GONE);
                 }
             }
+        } else if (i == R.id.data_inquiry_filter_scan_iv) {
+            requestPermission(Manifest.permission.CAMERA, new Runnable() {
+                @Override
+                public void run() {
+                    startActivityForResult(new Intent(DeviceQueryActivity.this, CaptureActivity.class)
+                            , 0x33);
+                }
+            }, new Runnable() {
+                @Override
+                public void run() {
+                    ToastUtil.showToast(ct, R.string.not_camera_permission);
+                }
+            });
         }
     }
 
@@ -877,7 +969,6 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
                             + schemeConditionBean.getField()
                             + " <= " + schemeConditionBean.getProperties().get(1).getDisplay() + ") and ";
                 }
-
             } else if (("D".equals(schemeConditionBean.getType()) || "CD".equals(schemeConditionBean.getType())) && schemeConditionBean.getProperties().size() == 2) {
                 mCondition = mCondition + "("
                         + (TextUtils.isEmpty(schemeConditionBean.getTable()) ? "" : (schemeConditionBean.getTable() + "."))
@@ -936,7 +1027,6 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
                 }
             }
         }
-
         if (mCondition.length() >= 5) {
             mCondition = mCondition.substring(0, mCondition.length() - 5);
             mCondition = "(" + mCondition + ")";
@@ -967,7 +1057,6 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
             } else {
                 mGrayBackGround.setVisibility(View.GONE);
             }
-
         } else {
             CommonUtil.closeKeybord(mSearchEditText, DeviceQueryActivity.this);
             if (mHistoryWholeLl.getVisibility() == View.VISIBLE) {
@@ -975,7 +1064,7 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
                 mGrayBackGround.setVisibility(View.GONE);
                 mHistoryListView.setEnabled(false);
             }
-
         }
     }
+
 }

+ 2 - 1
app_modular/appworks/src/main/java/com/uas/appworks/activity/businessManage/businessChangeStage/BusinessChangeStagePresenterImpl.java

@@ -3,6 +3,7 @@ package com.uas.appworks.activity.businessManage.businessChangeStage;
 import android.content.Context;
 import android.os.Bundle;
 
+import com.common.data.DateFormatUtil;
 import com.common.data.StringUtil;
 import com.core.app.MyApplication;
 import com.core.base.presenter.BaseMvpPresenter;
@@ -58,7 +59,7 @@ public class BusinessChangeStagePresenterImpl extends BaseMvpPresenter<BusinessC
                 "\"bcd_bccode\":\"" + bc_code + "\",\n" +
                 "\"bcd_remark\":\"" + remark + "\",\n" +
                 "\"bcd_leader\":\"" + "" + "\",\n" +
-                "\"bcd_date\":\"" + "" + "\",\n" +
+                "\"bcd_date\":\"" + DateFormatUtil.long2Str(DateFormatUtil.YMD) + "\",\n" +
                 "\"bcd_bsname\":\"" + nextStage.getBS_NAME() + "\",\n" +
                 "\"bcd_bscode\":\"" + nextStage.getBS_CODE() + "\",\n" +
                 "\"bcd_id\":\"" + nextStage.getBS_ID() + "\",\n" +

+ 6 - 5
app_modular/appworks/src/main/java/com/uas/appworks/activity/businessManage/businessManageHome/BusinessManageHomeActivity.java

@@ -419,11 +419,12 @@ public class BusinessManageHomeActivity extends MvpBaseActivity<BusinessManageHo
             mAddCompanyBtn.setVisibility(View.VISIBLE);
             mAddProjectBtn.setVisibility(View.GONE);
             mAddOemBtn.setVisibility(View.GONE);
-        }
-        if (mMenuPopupWindow != null) {
-            View view = getWindow().findViewById(R.id.add_item);
-            mMenuPopupWindow.showAsDropDown(view);
-            DisplayUtil.backgroundAlpha(mContext, 0.5f);
+
+            if (mMenuPopupWindow != null) {
+                View view = getWindow().findViewById(R.id.add_item);
+                mMenuPopupWindow.showAsDropDown(view);
+                DisplayUtil.backgroundAlpha(mContext, 0.5f);
+            }
         }
     }
 

+ 0 - 2
app_modular/appworks/src/main/java/com/uas/appworks/adapter/DeviceQueryConditionAdapter.java

@@ -82,7 +82,6 @@ public class DeviceQueryConditionAdapter extends BaseAdapter {
         });
 
         switch (object.getType()) {
-
             case "N":
                 holder.stringEdittext.setVisibility(View.GONE);
                 holder.numEdittextLl.setVisibility(View.VISIBLE);
@@ -325,7 +324,6 @@ public class DeviceQueryConditionAdapter extends BaseAdapter {
                         strChanged = false;
                     }
                 }
-
                 break;
             case "S":
             default:

+ 10 - 0
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/BillInputBindActivity.java

@@ -210,6 +210,11 @@ public class BillInputBindActivity extends OABaseActivity implements IBill, Bill
         mBillPresenter.saveAndSubmit(mBillAdapter.getBillGroupModels());
     }
 
+    @Override
+    public void addTopLayout(View ...view) {
+
+    }
+
     @Override
     public void toSelect(int position, BillGroupModel.BillModel model) {
         if (TextUtils.isEmpty(model.getType())) return;
@@ -248,6 +253,11 @@ public class BillInputBindActivity extends OABaseActivity implements IBill, Bill
         }
     }
 
+    @Override
+    public void toOpenEnclosure(int position, BillGroupModel.BillModel model) {
+
+    }
+
 
     private void toSelectEnclosure() {
         Intent intent = new Intent(Intent.ACTION_GET_CONTENT);

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

@@ -247,11 +247,11 @@ public class CustomerManageActivity extends OABaseActivity implements ICustomerM
         list.add(map);
 
         String master = CommonUtil.getMaster();
-        if (!("DATACENTER".equals(master) || "N_SHYZ".equals(master) || "N_AJC".equals(master))) {
-            map = new HashMap<>();
-            map.put("item_name", "拜访报告");
-            list.add(map);
-        }
+//        if (!("DATACENTER".equals(master) || "N_SHYZ".equals(master) || "N_AJC".equals(master))) {
+        map = new HashMap<>();
+        map.put("item_name", "拜访报告");
+        list.add(map);
+//        }
 
 //        map = new HashMap<>();
 //        map.put("item_name", "正式客户");

+ 228 - 6
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerVisitDetailsActivity.java

@@ -54,6 +54,7 @@ import com.modular.apputils.network.Tags;
 import com.modular.apputils.utils.UUHttpHelper;
 import com.modular.apputils.widget.BillUpdatePopup;
 import com.modular.apputils.widget.VeriftyDialog;
+import com.modular.apputils.widget.compactcalender.BillCancelPopup;
 import com.uas.appworks.R;
 import com.uas.appworks.adapter.BillListDetailsAdapter;
 
@@ -62,12 +63,16 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
-public class CustomerVisitDetailsActivity extends OABaseActivity implements BillUpdatePopup.OnUpdateSelectListener {
+public class CustomerVisitDetailsActivity extends OABaseActivity implements BillUpdatePopup.OnUpdateSelectListener, BillCancelPopup.OnCancelListener {
     private final int LOAD_FORM = 0x11;
     private final int TURN_VISIT_RECORD = 0x12;
     private final int UN_SUBMIT = 0x13;
     private final int SAVE_OUT_ADDRESS = 0x14;
+    private final int GET_CONFIGS = 0x15;
+    private final int CANCEL_VISIT = 0x16;
 
     public final int REQUESTCODE_C = 0x21;
     public final int REQUESTCODE_DB_FIND = 0x22;
@@ -76,6 +81,11 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
     public final int REQUESTCODE_ENCLOSURE_LOW = 0x25;
     public final int REQUEST_CODE_CAPTURE_PHOTO = 0x26;
     public final int REQUEST_CODE_SELECT_MORE = 0x27;
+    public final int REQUEST_SELECT_APPROVAL = 0x28;
+
+    public final int LOAD_JUDGE_APPROVAL = 0x31;//获取审批人员
+    public final int SELECT_APPROVAL = 0x32;//选择审批人
+    private final int TAG_KEY_VALUE = 0x33, TAG_FORM_CODE = 0x34;
 
     private final int TAG_ADDRESS_SELECT = 0x652;
 
@@ -90,9 +100,11 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
     private String mBillStatus;
     private List<BillGroupModel> mBillGroupModels;
     private BillUpdatePopup mBillUpdatePopup;
+    private BillCancelPopup mBillCancelPopup;
     public int selectPosition = -1;
     private List<BillGroupModel> mUpdateGroupModels = new ArrayList<>();
     private SelectAimModel address;//当前地址
+    private boolean showCancel = false;
 
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
@@ -100,10 +112,20 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
         if (TextUtils.isEmpty(mBillStatus)) {
             return super.onPrepareOptionsMenu(menu);
         } else if ("已审核".equals(mBillStatus)) {
+            getMenuInflater().inflate(com.modular.apputils.R.menu.menu_input_update, menu);
+            MenuItem updateItem = menu.findItem(R.id.update);
+            MenuItem cancelItem = menu.findItem(R.id.cancel);
             if (TextUtils.isEmpty(status) || (!"已完成".equals(status) && !"已转单".equals(status))) {
                 if (mListAdapter != null && !ListUtils.isEmpty(mListAdapter.getUpdateBillModels())) {
-                    getMenuInflater().inflate(com.modular.apputils.R.menu.menu_input_update, menu);
+                    updateItem.setVisible(true);
+                } else {
+                    updateItem.setVisible(false);
                 }
+            } else {
+                updateItem.setVisible(false);
+            }
+            if (showCancel) {
+                cancelItem.setVisible(true);
             }
         } else {
             getMenuInflater().inflate(com.modular.apputils.R.menu.menu_input_edit, menu);
@@ -143,6 +165,11 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
             } else {
                 toast(R.string.no_fields_to_update);
             }
+        } else if (item.getItemId() == R.id.cancel) {
+            if (mBillCancelPopup == null) {
+                mBillCancelPopup = new BillCancelPopup(mContext, this);
+            }
+            mBillCancelPopup.showPopupWindow();
         }
 
         return super.onOptionsItemSelected(item);
@@ -177,6 +204,7 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
         if (intent != null) {
             mCaller = intent.getStringExtra(Constants.Intents.CALLER);
             status = intent.getStringExtra(Constants.Intents.STATUS);
+            mBillStatus = intent.getStringExtra(Constants.Intents.BILL_STATUS);
             isMe = intent.getBooleanExtra(Constants.Intents.MY_DOIT, false);
             String mTitle = intent.getStringExtra(Constants.Intents.TITLE);
             mId = intent.getIntExtra(Constants.Intents.ID, 0);
@@ -193,9 +221,20 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
             statusTv.setTextColor(0xFF666666);
             statusTv.setOnClickListener(null);
         }
+        getConfigs();
         loadFormandGridDetail();
     }
 
+    private void getConfigs() {
+        showLoading();
+        mUUHttpHelper.requestCompanyHttp(new Parameter.Builder()
+                        .url("ma/setting/config.action")
+                        .addParams("caller", "sys")
+                        .addParams("code", "isCancelPlan")
+                        .record(GET_CONFIGS)
+                , mOnSmartHttpListener);
+    }
+
     private void loadFormandGridDetail() {
         showLoading();
         mUUHttpHelper.requestCompanyHttp(new Parameter.Builder()
@@ -217,6 +256,18 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
                 , mOnSmartHttpListener);
     }
 
+    private void judgeApproval(int keyValue, String formcode) {
+        mUUHttpHelper.requestCompanyHttp(new Parameter.Builder()
+                        .url("common/getMultiNodeAssigns.action")
+                        .addParams("condition", "1=1")
+                        .addParams("caller", "CancelPlan")
+                        .addTag(TAG_KEY_VALUE, keyValue)
+                        .addTag(TAG_FORM_CODE, formcode)
+                        .addParams("id", keyValue)
+                        .record(LOAD_JUDGE_APPROVAL)
+                , mOnSmartHttpListener);
+    }
+
     private OnSmartHttpListener mOnSmartHttpListener = new OnSmartHttpListener() {
         @Override
         public void onSuccess(int what, String message, Tags tag) throws Exception {
@@ -253,6 +304,65 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
                     break;
                 case SAVE_OUT_ADDRESS:
                     break;
+                case GET_CONFIGS:
+                    showCancel = !TextUtils.isEmpty(message);
+                    invalidateOptionsMenu();
+                    break;
+                case CANCEL_VISIT:
+                    if (JSONUtil.getBoolean(jsonObject, "success")) {
+                        int keyvalue = JSONUtil.getInt(jsonObject, "keyvalue");
+                        String formcode = JSONUtil.getText(jsonObject, "formcode");
+
+                        //选择审批人
+                        judgeApproval(keyvalue, formcode);
+                        if (!TextUtils.isEmpty(JSONUtil.getText(message, "exceptionInfo"))) {
+                            showToast(JSONUtil.getText(message, "exceptionInfo"));
+                        }
+                    }
+                    break;
+                case LOAD_JUDGE_APPROVAL:
+                    int keyValue = 0;
+                    String formCode = "";
+                    if (tag.get(TAG_KEY_VALUE) != null && tag.get(TAG_FORM_CODE) != null) {
+                        if (tag.get(TAG_KEY_VALUE) instanceof Integer) {
+                            keyValue = (int) tag.get(TAG_KEY_VALUE);
+                        }
+                        if (tag.get(TAG_FORM_CODE) instanceof String) {
+                            formCode = (String) tag.get(TAG_FORM_CODE);
+                        }
+                    }
+                    if (jsonObject.containsKey("assigns")) {
+                        JSONArray array = JSONUtil.getJSONArray(jsonObject, "assigns");
+                        JSONObject o = array.getJSONObject(0);
+                        String noid = "";
+                        if (o != null && o.containsKey("JP_NODEID")) {
+                            noid = o.getString("JP_NODEID");
+                        }
+                        JSONArray dataArray = null;
+                        if (o != null && o.containsKey("JP_CANDIDATES")) {
+                            dataArray = o.getJSONArray("JP_CANDIDATES");
+                        }
+                        if (!StringUtil.isEmpty(noid) && dataArray != null && dataArray.size() > 0) {
+                            // 选择审批人
+                            sendToSelect(keyValue, formCode, noid, dataArray);
+                        }
+                    } else {
+                        cancelSuccess();
+                    }
+                    break;
+                case SELECT_APPROVAL:
+                    keyValue = 0;
+                    formCode = "";
+                    if (tag.get(TAG_KEY_VALUE) != null && tag.get(TAG_FORM_CODE) != null) {
+                        if (tag.get(TAG_KEY_VALUE) instanceof Integer) {
+                            keyValue = (int) tag.get(TAG_KEY_VALUE);
+                        }
+                        if (tag.get(TAG_FORM_CODE) instanceof String) {
+                            formCode = (String) tag.get(TAG_FORM_CODE);
+                        }
+                    }
+                    cancelSuccess();
+                    break;
             }
             dimssLoading();
         }
@@ -265,10 +375,53 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
             } else {
                 showToast(message);
             }
-
+            if (what == GET_CONFIGS) {
+                showCancel = false;
+                invalidateOptionsMenu();
+            }
+            if (message.contains("该任务已经被接管,或该任务不存在!") && what == SELECT_APPROVAL) {
+                int keyValue = 0;
+                String formCode = "";
+                if (tag.get(TAG_KEY_VALUE) != null && tag.get(TAG_FORM_CODE) != null) {
+                    if (tag.get(TAG_KEY_VALUE) instanceof Integer) {
+                        keyValue = (int) tag.get(TAG_KEY_VALUE);
+                    }
+                    if (tag.get(TAG_FORM_CODE) instanceof String) {
+                        formCode = (String) tag.get(TAG_FORM_CODE);
+                    }
+                }
+                cancelSuccess();
+            }
         }
     };
 
+    private void sendToSelect(int keyValue, String formCode, String noid, JSONArray data) {
+        ArrayList<SelectBean> beans = new ArrayList<>();
+        SelectBean bean = null;
+        Map<String, Object> map = new HashMap<>();
+        map.put("keyValue", keyValue);
+        map.put("formCode", formCode);
+        map.put("noid", noid);
+        String json = JSONUtil.map2JSON(map);
+        for (int i = 0; i < data.size(); i++) {
+            bean = new SelectBean();
+            bean.setName(data.getString(i));
+            bean.setJson(json);
+            bean.setClick(false);
+            beans.add(bean);
+        }
+        Intent intent = new Intent(ct, SelectActivity.class);
+        intent.putExtra("type", 2);
+        intent.putParcelableArrayListExtra("data", beans);
+        intent.putExtra("title", "选择审批人");
+        startActivityForResult(intent, REQUEST_SELECT_APPROVAL);
+    }
+
+    private void cancelSuccess() {
+        Toast.makeText(ct, "拜访计划取消成功", Toast.LENGTH_LONG).show();
+        finish();
+    }
+
     private void handlerFormData(JSONObject datas) throws Exception {
         mBillGroupModels = new ArrayList<>();
         //配置主表
@@ -468,6 +621,33 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
         }
     }
 
+    @Override
+    public void onCancelConfirm(String remark) {
+        cancelVisit(remark);
+    }
+
+    /**
+     * 取消拜访
+     *
+     * @param remark
+     */
+    private void cancelVisit(String remark) {
+        showLoading();
+        Map<String, Object> params = new HashMap<>();
+        params.put("cpd_planid", mId);
+        params.put("cpd_remark", remark);
+        mUUHttpHelper.requestCompanyHttp(new Parameter.Builder()
+                        .url("mobile/oa/commonSaveAndSubmit.action")
+                        .mode(Method.POST)
+                        .addParams("caller", "CancelPlan")
+                        .addParams("id", 0)
+                        .addParams("formStore", "")
+                        .addParams("othergridStore", "")
+                        .addParams("gridStore", JSON.toJSONString(params))
+                        .record(CANCEL_VISIT)
+                , mOnSmartHttpListener);
+    }
+
     @Override
     public void onUpdateConfirm(List<BillGroupModel> billGroupModels, List<BillGroupModel.BillModel> updateBillModels) {
         mUpdateGroupModels = billGroupModels;
@@ -545,8 +725,8 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
 
         saveAndSubmit(billGroupModels);
     }
-
     //保存外勤计划目的地
+
     private void saveOutAddress(Map<String, Object> tagMap) {
         String company = (String) tagMap.get("company");
         String companyAddress = (String) tagMap.get("companyAddress");
@@ -781,8 +961,8 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
         mBillModel.setLength(0);
         uploadFile(mBillModel);
     }
-
     //上传文件
+
     private void uploadFile(final BillGroupModel.BillModel mBillModel) {
         String path = null;
         if (mBillModel.getLength() < ListUtils.getSize(mBillModel.getLocalDatas())) {
@@ -1146,9 +1326,52 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
                 SelectAimModel chcheAimModel = data.getParcelableExtra("data");
                 sureSelectAim(chcheAimModel);
                 break;
+            case REQUEST_SELECT_APPROVAL:
+                SelectBean d = data.getParcelableExtra("data");
+                if (d == null) return;
+                String name = StringUtil.isEmpty(d.getName()) ? "" : d.getName();
+                String jsonObject = StringUtil.isEmpty(d.getJson()) ? "" : d.getJson();
+                getEmnameByReturn(name, jsonObject);
+                break;
         }
     }
 
+    public void getEmnameByReturn(String text, String jsonObject) {
+        LogUtil.i("gong", "text=" + text + "   ||jsonObject=" + jsonObject);
+        if (StringUtil.isEmpty(text)) {
+            return;
+        }
+        Pattern pattern = Pattern.compile("(?<=\\()(.+?)(?=\\))");
+        Matcher matcher = pattern.matcher(text);
+        while (matcher.find()) {
+            String name = matcher.group();
+            if (!StringUtil.isEmpty(name)) {
+                selectApproval(name, jsonObject);
+                return;
+            }
+        }
+    }
+
+    //提交动作,增加判断节点是否有多人的情况
+    private void selectApproval(String emName, String jsonObject) {
+        JSONObject object = JSON.parseObject(jsonObject);
+        String nodeId = JSONUtil.getText(object, "noid");
+        String formCode = JSONUtil.getText(object, "formCode");
+        int keyValue = JSONUtil.getInt(object, "keyValue");
+        showLoading();
+        Map<String, Object> params = new HashMap<>();
+        params.put("em_code", emName);
+        params.put("nodeId", nodeId);
+        mUUHttpHelper.requestCompanyHttp(new Parameter.Builder()
+                        .url("common/takeOverTask.action")
+                        .addParams("_noc", 1)
+                        .addTag(TAG_KEY_VALUE, keyValue)
+                        .addTag(TAG_FORM_CODE, formCode)
+                        .addParams("params", JSONUtil.map2JSON(params))
+                        .record(SELECT_APPROVAL)
+                , mOnSmartHttpListener);
+    }
+
     private void sureSelectAim(SelectAimModel entity) {
         if (entity == null || selectPosition < 0 || selectPosition > ListUtils.getSize(mBillUpdatePopup.getGroupModels())) {
             selectPosition = -1;
@@ -1220,5 +1443,4 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
 
         mBillUpdatePopup.getBillUpdateAdapter().notifyDataSetChanged();
     }
-
 }

+ 2 - 0
app_modular/appworks/src/main/java/com/uas/appworks/datainquiry/Constants.java

@@ -17,9 +17,11 @@ public interface Constants {
 
         String DATA_INQUIRY_MENU_CACHE = "data_inquiry_menu_cache";
         String REPORT_QUERY_MENU_CACHE = "report_query_menu_cache";
+        String REPORT_BI_MENU_CACHE = "report_bi_menu_cache";
 
         String DATA_INQUIRY_MENU_RECENT_CACHE = "data_inquiry_menu_recent_cache";
         String REPORT_QUERY_MENU_RECENT_CACHE = "report_query_menu_recent_cache";
+        String REPORT_BI_MENU_RECENT_CACHE = "report_bi_menu_recent_cache";
 
         //打印成功
         int DOWNLOAD_SUCCESS = 1;

+ 77 - 12
app_modular/appworks/src/main/java/com/uas/appworks/datainquiry/activity/ReportQuerySearchActivity.java

@@ -18,18 +18,24 @@ import android.widget.ListView;
 import android.widget.TextView;
 
 import com.alibaba.fastjson.JSON;
+import com.common.LogUtil;
 import com.common.data.StringUtil;
 import com.core.base.BaseActivity;
 import com.core.utils.CommonUtil;
 import com.core.widget.CircleTextView;
 import com.core.widget.ClearEditText;
 import com.core.widget.EmptyLayout;
+import com.core.widget.view.Activity.CommonWebviewActivity;
 import com.core.xmpp.utils.audio.voicerecognition.JsonParser;
 import com.iflytek.cloud.RecognizerResult;
 import com.iflytek.cloud.SpeechConstant;
 import com.iflytek.cloud.SpeechError;
 import com.iflytek.cloud.ui.RecognizerDialog;
 import com.iflytek.cloud.ui.RecognizerDialogListener;
+import com.me.network.app.base.HttpCallback;
+import com.me.network.app.base.HttpParams;
+import com.me.network.app.http.HttpRequest;
+import com.me.network.app.http.Method;
 import com.uas.appworks.R;
 import com.uas.appworks.datainquiry.Constants;
 import com.uas.appworks.datainquiry.bean.DataInquiryGirdItemBean;
@@ -53,8 +59,7 @@ public class ReportQuerySearchActivity extends BaseActivity {
     private ListView mResultListView;
     private ReportQuerySearchAdapter mReportQuerySearchAdapter;
     private List<ReportQuerySearchBean> mQuerySearchBeanList;
-    private String mCurrentMaster;
-    private String mCurrentUser;
+    private String mCurrentMaster, mCurrentUser, mWhichPage;
     private EmptyLayout mEmptyLayout;
 
     private int[] mColors = new int[]{R.color.data_inquiry_gird_menu_color1, R.color.data_inquiry_gird_menu_color2
@@ -65,7 +70,16 @@ public class ReportQuerySearchActivity extends BaseActivity {
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_report_query_search);
-        setTitle("报表统计");
+
+        Intent intent = getIntent();
+        if (intent != null) {
+            mWhichPage = intent.getStringExtra("whichPage");
+        }
+        if ("BI".equals(mWhichPage)) {
+            setTitle("BI服务");
+        } else {
+            setTitle("报表统计");
+        }
 
         initViews();
         initEvents();
@@ -123,17 +137,23 @@ public class ReportQuerySearchActivity extends BaseActivity {
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                 DataInquiryGirdItemBean dataInquiryGirdItemBean = new DataInquiryGirdItemBean();
                 dataInquiryGirdItemBean.setColor(mReportQuerySearchAdapter.getObjects().get(position).getColor());
-                dataInquiryGirdItemBean.setIconText(mReportQuerySearchAdapter.getObjects().get(position).getListBean().getTitle());
+                GridMenuReportStatisticsBean.ListBean selectBean = mReportQuerySearchAdapter.getObjects().get(position).getListBean();
+
+                dataInquiryGirdItemBean.setIconText(selectBean.getTitle());
 
+                String key = Constants.CONSTANT.REPORT_QUERY_MENU_RECENT_CACHE;
+                if ("BI".equals(mWhichPage)) {
+                    key = Constants.CONSTANT.REPORT_BI_MENU_RECENT_CACHE;
+                }
                 String dataInquiryMenuRecentCache = CommonUtil.getSharedPreferences(ReportQuerySearchActivity.this,
-                        mCurrentUser + mCurrentMaster + Constants.CONSTANT.REPORT_QUERY_MENU_RECENT_CACHE);
+                        mCurrentUser + mCurrentMaster + key);
                 List<DataInquiryGirdItemBean> recentBrowse = new ArrayList<DataInquiryGirdItemBean>();
                 if (!TextUtils.isEmpty(dataInquiryMenuRecentCache)) {
                     try {
                         recentBrowse = JSON.parseArray(dataInquiryMenuRecentCache, DataInquiryGirdItemBean.class);
 
                         for (int i = 0; i < recentBrowse.size(); i++) {
-                            if (mReportQuerySearchAdapter.getObjects().get(position).getListBean().getTitle() != null && mQuerySearchBeanList.get(position).getListBean().getTitle().equals(recentBrowse.get(i).getIconText())) {
+                            if (selectBean.getTitle() != null && mQuerySearchBeanList.get(position).getListBean().getTitle().equals(recentBrowse.get(i).getIconText())) {
                                 recentBrowse.remove(i);
                             }
                         }
@@ -146,13 +166,17 @@ public class ReportQuerySearchActivity extends BaseActivity {
 
                 String recentJson = JSON.toJSON(recentBrowse).toString();
                 CommonUtil.setSharedPreferences(ReportQuerySearchActivity.this
-                        , mCurrentUser + mCurrentMaster + Constants.CONSTANT.REPORT_QUERY_MENU_RECENT_CACHE
+                        , mCurrentUser + mCurrentMaster + key
                         , recentJson);
 
-                Intent intent = new Intent();
-                intent.setClass(ReportQuerySearchActivity.this, ReportQueryCriteriaActivity.class);
-                intent.putExtra("reportinfo", mReportQuerySearchAdapter.getObjects().get(position).getListBean());
-                startActivity(intent);
+                if ("BI".equals(mWhichPage)) {
+                    getBiUrl(selectBean.getCaller(), selectBean.getTitle());
+                } else {
+                    Intent intent = new Intent();
+                    intent.setClass(ReportQuerySearchActivity.this, ReportQueryCriteriaActivity.class);
+                    intent.putExtra("reportinfo", selectBean);
+                    startActivity(intent);
+                }
             }
         });
 
@@ -181,9 +205,50 @@ public class ReportQuerySearchActivity extends BaseActivity {
         });
     }
 
+    /**
+     * 获取UI报表网页URL
+     *
+     * @param caller
+     * @param title
+     */
+    private void getBiUrl(String caller, final String title) {
+        progressDialog.show();
+        HttpRequest.getInstance().sendRequest(CommonUtil.getAppBaseUrl(ct),
+                new HttpParams.Builder()
+                        .url("common/bi/getToken.action")
+                        .method(Method.GET)
+                        .addParam("emcode", CommonUtil.getSharedPreferences(ct, "erp_username"))
+                        .addParam("caller", caller)
+                        .addParam("master", CommonUtil.getMaster())
+                        .addHeader("Cookie", "JSESSIONID=" + CommonUtil.getSharedPreferences(ct, "sessionId"))
+                        .build(), new HttpCallback() {
+                    @Override
+                    public void onSuccess(int flag, Object o) throws Exception {
+                        progressDialog.dismiss();
+                        String data = o.toString();
+                        String url = JSON.parseObject(data).getString("data");
+                        if (!StringUtil.isEmpty(url)) {
+                            startActivity(new Intent(mContext, CommonWebviewActivity.class)
+                                    .putExtra("title", title)
+                                    .putExtra("scan_url", url));
+                        }
+                    }
+
+                    @Override
+                    public void onFail(int flag, String failStr) throws Exception {
+                        progressDialog.dismiss();
+                        toast(failStr);
+                    }
+                });
+    }
+
     private void initDatas() {
+        String key = Constants.CONSTANT.REPORT_QUERY_MENU_CACHE;
+        if ("BI".equals(mWhichPage)) {
+            key = Constants.CONSTANT.REPORT_BI_MENU_CACHE;
+        }
         String reportQueryMenuCache = CommonUtil.getSharedPreferences(this,
-                mCurrentUser + mCurrentMaster + Constants.CONSTANT.REPORT_QUERY_MENU_CACHE);
+                mCurrentUser + mCurrentMaster + key);
         if (TextUtils.isEmpty(reportQueryMenuCache)) {
             mEmptyLayout.showEmpty();
         } else {

+ 2 - 42
app_modular/appworks/src/main/java/com/uas/appworks/datainquiry/activity/ReportStatisticsActivity.java

@@ -17,14 +17,12 @@ import android.widget.TextView;
 
 import com.alibaba.fastjson.JSON;
 import com.common.LogUtil;
-import com.common.data.StringUtil;
 import com.core.app.Constants;
 import com.core.base.BaseActivity;
 import com.core.net.http.ViewUtil;
 import com.core.utils.CommonUtil;
 import com.core.widget.DrawableCenterTextView;
 import com.core.widget.EmptyLayout;
-import com.core.widget.view.Activity.CommonWebviewActivity;
 import com.core.widget.view.MyGridView;
 import com.handmark.pulltorefresh.library.PullToRefreshBase;
 import com.handmark.pulltorefresh.library.PullToRefreshListView;
@@ -50,7 +48,6 @@ import java.util.Map;
  */
 public class ReportStatisticsActivity extends BaseActivity {
     private final int GET_MENU_DATA = 0x16;
-    public static final int GET_CLICK_URL=0x17;
     private PullToRefreshListView mMenuListView;
     private List<GridMenuReportStatisticsBean> mGridMenuReportStatisticsBeans;
     private ReportStatisticsMenuListAdapter mReportStatisticsMenuListAdapter;
@@ -146,7 +143,6 @@ public class ReportStatisticsActivity extends BaseActivity {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                 DataInquiryGirdItemBean dataInquiryGirdItemBean = mDataInquiryMenuGridAdapter.getObjects().get(position);
-                
                 String iconText = dataInquiryGirdItemBean.getIconText();
                 String dataInquiryMenuRecentCache = CommonUtil.getSharedPreferences(ReportStatisticsActivity.this,
                         mCurrentUser + mCurrentMaster + com.uas.appworks.datainquiry.Constants.CONSTANT.REPORT_QUERY_MENU_RECENT_CACHE);
@@ -183,9 +179,7 @@ public class ReportStatisticsActivity extends BaseActivity {
                             Intent intent = new Intent();
                             intent.setClass(ReportStatisticsActivity.this, ReportQueryCriteriaActivity.class);
                             intent.putExtra("reportinfo", reportlist.get(j));
-                            String caller= reportlist.get(j).getCaller();
-                            clickItem(caller);
-                           // ReportStatisticsActivity.this.startActivity(intent);
+                            ReportStatisticsActivity.this.startActivity(intent);
                             return;
                         }
                     }
@@ -210,7 +204,6 @@ public class ReportStatisticsActivity extends BaseActivity {
         mGridMenuReportStatisticsBeans = new ArrayList<>();
         mReportStatisticsMenuListAdapter = new ReportStatisticsMenuListAdapter(this, mGridMenuReportStatisticsBeans);
         mMenuListView.setAdapter(mReportStatisticsMenuListAdapter);
-        mReportStatisticsMenuListAdapter.setmHandler(mHandler);
 
         mRecentBrowseLl = (LinearLayout) View.inflate(this, R.layout.item_list_data_inquiry_menu, null);
         mReportStatisticsModulView = (View) mRecentBrowseLl.findViewById(R.id.data_inquiry_modul_view);
@@ -305,51 +298,18 @@ public class ReportStatisticsActivity extends BaseActivity {
 
 
     private void getMenuData() {
-//        String url = CommonUtil.getAppBaseUrl(this) + "mobile/qry/getReport.action";
-//        Map<String, Object> params = new HashMap<>();
-//        params.put("emcode", CommonUtil.getSharedPreferences(ct, "erp_username"));
-//        LinkedHashMap<String, Object> headers = new LinkedHashMap<>();
-//        headers.put("Cookie", "JSESSIONID=" + CommonUtil.getSharedPreferences(ct, "sessionId"));
-//        ViewUtil.httpSendRequest(this, url, params, mHandler, headers, GET_MENU_DATA, null, null, "get");
-       
-        //common/getSearchByTree.action
-        String url = CommonUtil.getAppBaseUrl(this) + "common/getSearchByTree.action";
+        String url = CommonUtil.getAppBaseUrl(this) + "mobile/qry/getReport.action";
         Map<String, Object> params = new HashMap<>();
         params.put("emcode", CommonUtil.getSharedPreferences(ct, "erp_username"));
         LinkedHashMap<String, Object> headers = new LinkedHashMap<>();
         headers.put("Cookie", "JSESSIONID=" + CommonUtil.getSharedPreferences(ct, "sessionId"));
         ViewUtil.httpSendRequest(this, url, params, mHandler, headers, GET_MENU_DATA, null, null, "get");
-
-    }
-    
-    public  void clickItem(String caller){
-        String url = CommonUtil.getAppBaseUrl(this) + "common/bi/getToken.action";
-        Map<String, Object> params = new HashMap<>();
-        params.put("emcode", CommonUtil.getSharedPreferences(ct, "erp_username"));
-        params.put("caller",caller);
-        params.put("master",CommonUtil.getMaster());
-        LinkedHashMap<String, Object> headers = new LinkedHashMap<>();
-        headers.put("Cookie", "JSESSIONID=" + CommonUtil.getSharedPreferences(ct, "sessionId"));
-        ViewUtil.httpSendRequest(this, url, params, mHandler, headers, GET_CLICK_URL, null, null, "get");
     }
-    
-    
-    
 
     private Handler mHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
-                case GET_CLICK_URL:
-                    String data = msg.getData().getString("result");
-                    LogUtil.d("arison", "data:" + data);
-                    String url = JSON.parseObject(data).getString("data");
-                    if(!StringUtil.isEmpty(url)){
-                        startActivity(new Intent(mContext, CommonWebviewActivity.class)
-                                .putExtra("title",msg.getData().getString("mTitle"))
-                                .putExtra("scan_url",url));
-                    }
-                    break;
                 case GET_MENU_DATA:
                     if (progressDialog.isShowing()) {
                         progressDialog.dismiss();

Some files were not shown because too many files changed in this diff