Просмотр исходного кода

2024-05-30 新增

新增

1. 文档页面 团组酒店相关文档下载
2. 文档页面 团组机票相关文档下载
3. 文档页面 团组OP相关文档下载
4. 文档页面 团组经理主管相关文档下载
zhaiy 1 год назад
Родитель
Сommit
e79fee1410
39 измененных файлов с 1950 добавлено и 111 удалено
  1. 2 2
      app/build.gradle
  2. 3 0
      app/src/main/AndroidManifest.xml
  3. 15 0
      app/src/main/java/com/pan_american/android/OASystem.kt
  4. 0 4
      app/src/main/java/com/pan_american/android/data/model/GroupInfoListItem.kt
  5. 0 3
      app/src/main/java/com/pan_american/android/data/model/ServiceResourceListItem.kt
  6. 1 1
      app/src/main/java/com/pan_american/android/data/model/common/adapter/ServiceResourceAdapter.kt
  7. 3 0
      app/src/main/java/com/pan_american/android/data/model/common/entity/ServiceResourceListItem.kt
  8. 3 1
      app/src/main/java/com/pan_american/android/data/model/common/network/GroupSimpleInfoRequest.kt
  9. 9 0
      app/src/main/java/com/pan_american/android/data/model/document/network/DocumentGroupListRequest.kt
  10. 10 0
      app/src/main/java/com/pan_american/android/data/model/document/network/group_airplane_ticket/AirplaneReportFormGenerateRequest.kt
  11. 5 0
      app/src/main/java/com/pan_american/android/data/model/document/network/group_airplane_ticket/AirplaneTicketDocumentGenerateResponse.kt
  12. 8 0
      app/src/main/java/com/pan_american/android/data/model/document/network/group_airplane_ticket/AirplaneTravelItineraryGenerateRequest.kt
  13. 9 0
      app/src/main/java/com/pan_american/android/data/model/document/network/group_hotel/HotelDocumentGenerateRequest.kt
  14. 5 0
      app/src/main/java/com/pan_american/android/data/model/document/network/group_hotel/HotelDocumentGenerateResponse.kt
  15. 9 0
      app/src/main/java/com/pan_american/android/data/model/document/network/group_management/GroupCustomerListGenerateRequest.kt
  16. 5 0
      app/src/main/java/com/pan_american/android/data/model/document/network/group_management/GroupEnterExitCostGenerateRequest.kt
  17. 5 0
      app/src/main/java/com/pan_american/android/data/model/document/network/group_management/GroupManagerDocumentGenerateResponse.kt
  18. 5 0
      app/src/main/java/com/pan_american/android/data/model/document/network/group_management/GroupReverseTableGenerateRequest.kt
  19. 3 1
      app/src/main/java/com/pan_american/android/data/model/resource_management/market_customer/network/BusinessCardInfoRequest.kt
  20. 64 0
      app/src/main/java/com/pan_american/android/data/network/APIService.kt
  21. 15 10
      app/src/main/java/com/pan_american/android/data/network/TCPService.kt
  22. 3 3
      app/src/main/java/com/pan_american/android/ui/announcement/AnnouncementFragment.kt
  23. 190 1
      app/src/main/java/com/pan_american/android/ui/document/DocumentFragment.kt
  24. 734 0
      app/src/main/java/com/pan_american/android/ui/document/DocumentGroupListActivity.kt
  25. 10 0
      app/src/main/java/com/pan_american/android/ui/group_management/group_info/AddGroupInfoActivity.kt
  26. 1 1
      app/src/main/java/com/pan_american/android/ui/group_simple_info/GroupSimpleInfoFragment.kt
  27. 10 0
      app/src/main/java/com/pan_american/android/ui/resource_management/market_customer/AddNewCustomerActivity.kt
  28. 1 1
      app/src/main/java/com/pan_american/android/ui/resource_management/service_resource/ServiceResourceListFragment.kt
  29. 92 58
      app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceFragment.kt
  30. 28 0
      app/src/main/res/layout/activity_document_group_list.xml
  31. 612 4
      app/src/main/res/layout/fragment_document.xml
  32. 2 1
      app/src/main/res/layout/item_company_list.xml
  33. 14 13
      app/src/main/res/layout/item_group_info_list.xml
  34. 43 0
      app/src/main/res/layout/item_group_name_list.xml
  35. BIN
      app/src/main/res/mipmap-xxhdpi/icon_document_excel.png
  36. BIN
      app/src/main/res/mipmap-xxhdpi/icon_document_pdf.png
  37. BIN
      app/src/main/res/mipmap-xxhdpi/icon_document_word.png
  38. 30 4
      app/src/main/res/values/strings.xml
  39. 1 3
      app/src/main/res/xml/file_paths.xml

+ 2 - 2
app/build.gradle

@@ -15,8 +15,8 @@ android {
         applicationId "com.pan_american.android"
         minSdk 24
         targetSdk 33
-        versionCode 3
-        versionName "1.0.2"
+        versionCode 4
+        versionName "1.0.3"
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }

+ 3 - 0
app/src/main/AndroidManifest.xml

@@ -26,6 +26,9 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme"
         tools:targetApi="31">
+        <activity
+            android:name=".ui.document.DocumentGroupListActivity"
+            android:exported="false" />
         <activity
             android:name=".ui.group_invite_official.invite_data.AddInviteDataActivity"
             android:exported="false" />

+ 15 - 0
app/src/main/java/com/pan_american/android/OASystem.kt

@@ -131,12 +131,18 @@ class OASystem : Application() {
             name = "已完成"
         })
 
+        //查看权限
+        const val VIEW = 1
+
         // 删除权限
         const val DELETE = 2
 
         // 编辑权限
         const val EDIT = 3
 
+        //下载权限
+        const val DOWNLOAD = 4
+
         // 添加权限
         const val ADD = 11
 
@@ -191,12 +197,21 @@ class OASystem : Application() {
         //团组经理主管,接团客户名单
         const val GROUP_CLIENT_LIST = 104
 
+        //团组经理主管,倒推表
+        const val REVERSE_TABLE = 106
+
         // 车辆公司信息
         const val CAR_RESOURCE = 111
 
+        //团组经理主管,出入境费用明细
+        const val ENTER_AND_LEAVE_PAYMENT_DETAIL = 118
+
         // 机场三字码
         const val THREE_CODE_RESOURCE = 120
 
+        //OP行程单
+        const val OP_TRAVEL_ITINERARY = 122
+
         //机票费用录入
         const val AIRPLANE_PAYMENT_INSERT = 161
 

+ 0 - 4
app/src/main/java/com/pan_american/android/data/model/GroupInfoListItem.kt

@@ -1,4 +0,0 @@
-package com.pan_american.android.data.model
-
-class GroupInfoListItem(val groupInfoTitle: String, val customerUnit: String, val customerName: String,
-                        val customerLevel: String, val visitTime: String, val visitDays: String, val visitMembers: String, )

+ 0 - 3
app/src/main/java/com/pan_american/android/data/model/ServiceResourceListItem.kt

@@ -1,3 +0,0 @@
-package com.pan_american.android.data.model
-
-class ServiceResourceListItem(val city: String, val name: String, val scope: String, val phone: String, val email: String)

+ 1 - 1
app/src/main/java/com/pan_american/android/data/model/common/adapter/ServiceResourceAdapter.kt

@@ -7,7 +7,7 @@ import android.widget.ImageView
 import android.widget.TextView
 import androidx.recyclerview.widget.RecyclerView
 import com.pan_american.android.R
-import com.pan_american.android.data.model.ServiceResourceListItem
+import com.pan_american.android.data.model.common.entity.ServiceResourceListItem
 
 class ServiceResourceAdapter(private val listItem: List<ServiceResourceListItem>): RecyclerView.Adapter<ServiceResourceAdapter.ViewHolder>() {
 

+ 3 - 0
app/src/main/java/com/pan_american/android/data/model/common/entity/ServiceResourceListItem.kt

@@ -0,0 +1,3 @@
+package com.pan_american.android.data.model.common.entity
+
+class ServiceResourceListItem(val city: String, val name: String, val scope: String, val phone: String, val email: String)

+ 3 - 1
app/src/main/java/com/pan_american/android/data/model/common/network/GroupSimpleInfoRequest.kt

@@ -2,4 +2,6 @@ package com.pan_american.android.data.model.common.network
 
 import com.pan_american.android.base.BaseRequest
 
-class GroupSimpleInfoRequest(val userId: Int, val cTable: Int): BaseRequest()
+class GroupSimpleInfoRequest(val userId: Int, val cTable: Int): BaseRequest() {
+    var teamName = ""
+}

+ 9 - 0
app/src/main/java/com/pan_american/android/data/model/document/network/DocumentGroupListRequest.kt

@@ -0,0 +1,9 @@
+package com.pan_american.android.data.model.document.network
+
+import com.pan_american.android.OASystem
+import com.pan_american.android.base.BaseRequest
+
+class DocumentGroupListRequest: BaseRequest() {
+    val groupName = ""
+    val userId = OASystem.userInfo.userId
+}

+ 10 - 0
app/src/main/java/com/pan_american/android/data/model/document/network/group_airplane_ticket/AirplaneReportFormGenerateRequest.kt

@@ -0,0 +1,10 @@
+package com.pan_american.android.data.model.document.network.group_airplane_ticket
+
+import com.pan_american.android.OASystem
+import com.pan_american.android.base.BaseRequest
+
+class AirplaneReportFormGenerateRequest(val diId: Int): BaseRequest() {
+
+    val userId = OASystem.userInfo.userId
+    val isPaySign = 0
+}

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/document/network/group_airplane_ticket/AirplaneTicketDocumentGenerateResponse.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.document.network.group_airplane_ticket
+
+import com.pan_american.android.base.BaseResponse
+
+class AirplaneTicketDocumentGenerateResponse(val data: String): BaseResponse()

+ 8 - 0
app/src/main/java/com/pan_american/android/data/model/document/network/group_airplane_ticket/AirplaneTravelItineraryGenerateRequest.kt

@@ -0,0 +1,8 @@
+package com.pan_american.android.data.model.document.network.group_airplane_ticket
+
+import com.pan_american.android.OASystem
+
+class AirplaneTravelItineraryGenerateRequest(val diId: Int, val language: String) {
+
+    val userId = OASystem.userInfo.userId
+}

+ 9 - 0
app/src/main/java/com/pan_american/android/data/model/document/network/group_hotel/HotelDocumentGenerateRequest.kt

@@ -0,0 +1,9 @@
+package com.pan_american.android.data.model.document.network.group_hotel
+
+import com.pan_american.android.OASystem
+
+class HotelDocumentGenerateRequest(val pageId: Int, val diId: Int) {
+    val portType = 2
+    val userId = OASystem.userInfo.userId
+    val id = 0
+}

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/document/network/group_hotel/HotelDocumentGenerateResponse.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.document.network.group_hotel
+
+import com.pan_american.android.base.BaseResponse
+
+class HotelDocumentGenerateResponse(val data: String): BaseResponse()

+ 9 - 0
app/src/main/java/com/pan_american/android/data/model/document/network/group_management/GroupCustomerListGenerateRequest.kt

@@ -0,0 +1,9 @@
+package com.pan_american.android.data.model.document.network.group_management
+
+import com.pan_american.android.OASystem
+
+class GroupCustomerListGenerateRequest(val diId: Int, val language: Int) {
+    val portType = 2
+    val userId = OASystem.userInfo.userId
+    val pageId = OASystem.GROUP_CLIENT_LIST
+}

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/document/network/group_management/GroupEnterExitCostGenerateRequest.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.document.network.group_management
+
+class GroupEnterExitCostGenerateRequest(val diId: Int, val exportType: Int, val subTypeId: Int) {
+    val portType = 2
+}

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/document/network/group_management/GroupManagerDocumentGenerateResponse.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.document.network.group_management
+
+import com.pan_american.android.base.BaseResponse
+
+class GroupManagerDocumentGenerateResponse(val data: String): BaseResponse()

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/document/network/group_management/GroupReverseTableGenerateRequest.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.document.network.group_management
+
+class GroupReverseTableGenerateRequest(val diId: Int) {
+    val portType = 2
+}

+ 3 - 1
app/src/main/java/com/pan_american/android/data/model/resource_management/market_customer/network/BusinessCardInfoRequest.kt

@@ -1,3 +1,5 @@
 package com.pan_american.android.data.model.resource_management.market_customer.network
 
-class BusinessCardInfoRequest(val picBase64: String)
+class BusinessCardInfoRequest(val picBase64: String) {
+    val language = 1
+}

+ 64 - 0
app/src/main/java/com/pan_american/android/data/network/APIService.kt

@@ -29,6 +29,16 @@ import com.pan_american.android.data.model.daily_payment.network.DailyPaymentLis
 import com.pan_american.android.data.model.daily_payment.network.DailyPaymentSelectorItemResponse
 import com.pan_american.android.data.model.daily_payment.network.DailyPaymentSiftResponse
 import com.pan_american.android.data.model.daily_payment.network.UpdateDailyPaymentRequest
+import com.pan_american.android.data.model.document.network.DocumentGroupListRequest
+import com.pan_american.android.data.model.document.network.group_airplane_ticket.AirplaneReportFormGenerateRequest
+import com.pan_american.android.data.model.document.network.group_airplane_ticket.AirplaneTicketDocumentGenerateResponse
+import com.pan_american.android.data.model.document.network.group_airplane_ticket.AirplaneTravelItineraryGenerateRequest
+import com.pan_american.android.data.model.document.network.group_hotel.HotelDocumentGenerateRequest
+import com.pan_american.android.data.model.document.network.group_hotel.HotelDocumentGenerateResponse
+import com.pan_american.android.data.model.document.network.group_management.GroupCustomerListGenerateRequest
+import com.pan_american.android.data.model.document.network.group_management.GroupEnterExitCostGenerateRequest
+import com.pan_american.android.data.model.document.network.group_management.GroupManagerDocumentGenerateResponse
+import com.pan_american.android.data.model.document.network.group_management.GroupReverseTableGenerateRequest
 import com.pan_american.android.data.model.group_airplane_ticket.airplane_payment_insert.network.AirplaneCostDetailResponse
 import com.pan_american.android.data.model.group_airplane_ticket.airplane_payment_insert.network.AirplaneTicketDetailRequest
 import com.pan_american.android.data.model.group_airplane_ticket.airplane_payment_insert.network.AirplaneTicketDetailResponse
@@ -729,4 +739,58 @@ interface APIService {
      */
     @POST("/api/Resource/OpInvitationOfficialActivity")
     fun updateInviteData(@Body updateInviteDetailRequest: UpdateInviteDetailRequest): Call<BaseResponse>
+
+    /**
+     * 文档下载 团组list
+     */
+    @POST("api/Business/PostGroupNameScreen")
+    fun documentGroupList(@Body documentGroupListRequest: DocumentGroupListRequest): Call<SelectorResponse>
+
+    /**
+     * 文档下载 酒店资料 voucher
+     */
+    @POST("api/Groups/PostHotelReservationsCreateVoucher")
+    fun hotelVoucherGenerate(@Body hotelDocumentGenerateRequest: HotelDocumentGenerateRequest): Call<HotelDocumentGenerateResponse>
+
+    /**
+     * 文档下载 酒店资料 确认单
+     */
+    @POST("api/Groups/PostHotelReservationsConfirmationSlip")
+    fun hotelConfirmListGenerate(@Body hotelDocumentGenerateRequest: HotelDocumentGenerateRequest): Call<HotelDocumentGenerateResponse>
+
+    /**
+     * 文档下载 酒店资料 预订成本excel
+     */
+    @POST("api/Groups/PostHotelReservationsPredictedCostFileDownload")
+    fun hotelPredetermineCostGenerate(@Body hotelDocumentGenerateRequest: HotelDocumentGenerateRequest): Call<HotelDocumentGenerateResponse>
+
+    /**
+     * 文档下载 机票资料 导出报表
+     */
+    @POST("api/Groups/DeriveAirTicketRes")
+    fun airplaneTicketReportFormGenerate(@Body airplaneReportFormGenerateRequest: AirplaneReportFormGenerateRequest): Call<AirplaneTicketDocumentGenerateResponse>
+
+    /**
+     * 文档下载 机票资料 行程单导出
+     */
+    @POST("api/Groups/ItineraryAirTicketRes")
+    fun airplaneTravelItineraryGenerate(@Body airplaneTravelItineraryGenerateRequest: AirplaneTravelItineraryGenerateRequest): Call<AirplaneTicketDocumentGenerateResponse>
+
+    /**
+     * 文档下载 团组经理主管 团组名单
+     */
+    @POST("api/Groups/PostTourClientListDownloadFile")
+    fun groupCustomerListGenerate(@Body groupCustomerListGenerateRequest: GroupCustomerListGenerateRequest): Call<GroupManagerDocumentGenerateResponse>
+
+    /**
+     * 文档下载 团组经理主管 倒推表
+     */
+    @POST("api/Groups/PostInvertedListFileDownload")
+    fun groupReverseTableGenerate(@Body groupReverseTableGenerateRequest: GroupReverseTableGenerateRequest): Call<GroupManagerDocumentGenerateResponse>
+
+    /**
+     * 文档下载 出入境费用明细
+     */
+    @POST("api/Groups/PostEnterExitCostDownload")
+    fun groupEnterExitCostGenerate(@Body groupEnterExitCostGenerateRequest: GroupEnterExitCostGenerateRequest): Call<GroupManagerDocumentGenerateResponse>
 }

+ 15 - 10
app/src/main/java/com/pan_american/android/data/network/TCPService.kt

@@ -6,6 +6,7 @@ import android.os.Binder
 import android.os.Handler
 import android.os.Looper
 import android.util.Log
+import com.microsoft.signalr.HubConnection
 import com.microsoft.signalr.HubConnectionBuilder
 import com.pan_american.android.OASystem
 import com.pan_american.android.data.model.message.entity.MessageGetter
@@ -23,7 +24,18 @@ class TCPService: Service() {
     companion object {
 
         val TAG: String = TCPService::class.java.simpleName
+
         val apiService = ServiceCreator.create<APIService>()
+
+        const val HEART_SPACE_TIME: Long = 1000
+
+        //消息系统 MS HubConnection
+        val hubConnection: HubConnection = HubConnectionBuilder.create("http://132.232.92.186:8888/chatHub")
+            .withHeader("Authorization", OASystem.token)
+            .build().apply {
+                serverTimeout = 60 * HEART_SPACE_TIME
+                keepAliveInterval = HEART_SPACE_TIME
+            }
     }
 
     override fun onBind(p0: Intent?): ClientBinder {
@@ -32,20 +44,13 @@ class TCPService: Service() {
 
     class ClientBinder : Binder() {
         //心跳间隔时间
-        private val heartSpaceTime: Long = 1000
+
         private lateinit var readThread: ReadThread
         private val handler = Handler(Looper.getMainLooper())
         private lateinit var executorService: ExecutorService
         private var connectionTryCount = 0
         private var heartSpaceTryCount = 0
 
-        private val hubConnection = HubConnectionBuilder.create("http://132.232.92.186:8888/chatHub")
-            .withHeader("Authorization", OASystem.token)
-            .build().apply {
-            serverTimeout = 60 * 1000
-            keepAliveInterval = heartSpaceTime
-        }
-
         fun startConnect() {
             //在子线程进行网络操作
             //Service 运行在主线程
@@ -81,7 +86,7 @@ class TCPService: Service() {
 
                 Log.e(TAG, "Connection failed, try reconnect. Count: $connectionTryCount")
 
-                handler.postDelayed({ restartConnect() }, heartSpaceTime)
+                handler.postDelayed({ restartConnect() }, HEART_SPACE_TIME)
             }
         }
 
@@ -129,7 +134,7 @@ class TCPService: Service() {
                     hubConnection.send("SignalRLogin", OASystem.userInfo.userId)
 
                     //发送成功以后,重新建立一个心跳消息
-                    handler.postDelayed(heartRunnable, heartSpaceTime * 30)
+                    handler.postDelayed(heartRunnable, HEART_SPACE_TIME * 30)
 
 //                    Log.e(TAG, "Send message to server.")
 

+ 3 - 3
app/src/main/java/com/pan_american/android/ui/announcement/AnnouncementFragment.kt

@@ -145,9 +145,9 @@ class AnnouncementFragment : BaseFragment<FragmentAnnouncementBinding>() {
                                     messageList.add(item)
                                 }
 
-                                if (messageList.size == 0) {
-                                    showMessage(resources.getString(R.string.no_data))
-                                }
+//                                if (messageList.size == 0) {
+//                                    showMessage(resources.getString(R.string.no_data))
+//                                }
 
                                 when (type) {
                                     1 -> {

+ 190 - 1
app/src/main/java/com/pan_american/android/ui/document/DocumentFragment.kt

@@ -1,12 +1,16 @@
 package com.pan_american.android.ui.document
 
+import android.content.Intent
 import android.os.Bundle
 import android.view.LayoutInflater
+import android.view.View
+import android.view.View.OnClickListener
 import android.view.ViewGroup
+import com.pan_american.android.OASystem
 import com.pan_american.android.base.BaseFragment
 import com.pan_american.android.databinding.FragmentDocumentBinding
 
-class DocumentFragment : BaseFragment<FragmentDocumentBinding>() {
+class DocumentFragment : BaseFragment<FragmentDocumentBinding>(), OnClickListener {
 
     override fun getViewBinding(
         inflater: LayoutInflater,
@@ -14,4 +18,189 @@ class DocumentFragment : BaseFragment<FragmentDocumentBinding>() {
         bundle: Bundle?
     ) = FragmentDocumentBinding.inflate(inflater, container, false)
 
+    override fun onStart() {
+        super.onStart()
+
+        initViews()
+    }
+
+    override fun initViews() {
+
+        for (item in OASystem.authData) {
+            when (item.pageId) {
+
+                OASystem.HOTEL_PREDETERMINE -> {
+                    if (OASystem.authorization(OASystem.HOTEL_PREDETERMINE, OASystem.DOWNLOAD)) {
+                        if (binding.groupHotel.visibility == View.GONE) {
+                            binding.groupHotel.visibility = View.VISIBLE
+                        }
+
+                        binding.voucher.setOnClickListener(this)
+                        binding.confirmList.setOnClickListener(this)
+                        if (OASystem.userInfo.depName != "市场部") {
+                            binding.predetermineCost.setOnClickListener(this)
+                        }
+                    }
+                }
+
+                OASystem.AIRPLANE_PAYMENT_INSERT -> {
+                    if (OASystem.authorization(OASystem.AIRPLANE_PAYMENT_INSERT, OASystem.DOWNLOAD)) {
+                        if (binding.groupAirplaneTicket.visibility == View.GONE) {
+                            binding.groupAirplaneTicket.visibility = View.VISIBLE
+                        }
+
+                        if (OASystem.userInfo.depName != "市场部") {
+                            binding.airplaneReportForm.setOnClickListener(this)
+                        }
+
+                        binding.chTravelItinerary.setOnClickListener(this)
+                        binding.enTravelItinerary.setOnClickListener(this)
+                    }
+                }
+
+                OASystem.OP_TRAVEL_ITINERARY -> {
+                    if (OASystem.authorization(OASystem.OP_TRAVEL_ITINERARY, OASystem.DOWNLOAD)) {
+                        if (binding.groupOp.visibility == View.GONE) {
+                            binding.groupOp.visibility = View.VISIBLE
+                        }
+
+                        binding.opTravelItineraryWord.setOnClickListener(this)
+                        binding.opTravelItineraryPdf.setOnClickListener(this)
+                    }
+                }
+
+                OASystem.GROUP_CLIENT_LIST -> {
+                    if (OASystem.authorization(OASystem.GROUP_CLIENT_LIST, OASystem.DOWNLOAD)) {
+                        if (binding.groupManager.visibility == View.GONE) {
+                            binding.groupManager.visibility = View.VISIBLE
+                        }
+
+                        binding.groupCustomerListCh.visibility = View.VISIBLE
+                        binding.groupCustomerListCh.setOnClickListener(this)
+
+                        binding.groupCustomerListEn.visibility = View.VISIBLE
+                        binding.groupCustomerListEn.setOnClickListener(this)
+                    }
+                }
+
+                OASystem.REVERSE_TABLE -> {
+                    if (OASystem.authorization(OASystem.REVERSE_TABLE, OASystem.DOWNLOAD)) {
+                        if (binding.groupManager.visibility == View.GONE) {
+                            binding.groupManager.visibility = View.VISIBLE
+                        }
+
+                        binding.reverseTable.visibility = View.VISIBLE
+                        binding.reverseTable.setOnClickListener(this)
+                    }
+                }
+
+                OASystem.ENTER_AND_LEAVE_PAYMENT_DETAIL -> {
+                    if (OASystem.authorization(OASystem.ENTER_AND_LEAVE_PAYMENT_DETAIL, OASystem.DOWNLOAD)) {
+                        if (binding.groupManager.visibility == View.GONE) {
+                            binding.groupManager.visibility = View.VISIBLE
+                        }
+
+                        binding.foundsExamineForm.visibility = View.VISIBLE
+                        binding.foundsExamineForm.setOnClickListener(this)
+
+                        binding.foundsCalculateForm.visibility = View.VISIBLE
+                        binding.foundsCalculateForm.setOnClickListener(this)
+
+                        binding.provinceExamineForm.visibility = View.VISIBLE
+                        binding.provinceExamineForm.setOnClickListener(this)
+
+                        binding.cityExamineForm.visibility = View.VISIBLE
+                        binding.cityExamineForm.setOnClickListener(this)
+
+                        binding.leaveExamineForm.visibility = View.VISIBLE
+                        binding.leaveExamineForm.setOnClickListener(this)
+
+                        binding.reimbursementForm.visibility = View.VISIBLE
+                        binding.reimbursementForm.setOnClickListener(this)
+                    }
+                }
+            }
+        }
+    }
+
+    override fun onClick(view: View) {
+
+        val intent = Intent(OASystem.context, DocumentGroupListActivity::class.java)
+
+        var tag = ""
+
+        when(view.id) {
+            binding.voucher.id -> {
+                tag = "voucher"
+            }
+
+            binding.confirmList.id -> {
+                tag = "confirmList"
+            }
+
+            binding.predetermineCost.id -> {
+                tag = "predetermineCost"
+            }
+
+            binding.airplaneReportForm.id -> {
+                tag = "airplaneReportForm"
+            }
+
+            binding.chTravelItinerary.id -> {
+                tag = "chTravelItinerary"
+            }
+
+            binding.enTravelItinerary.id -> {
+                tag = "enTravelItinerary"
+            }
+
+            binding.opTravelItineraryWord.id -> {
+                tag = "opTravelItineraryWord"
+            }
+
+            binding.opTravelItineraryPdf.id -> {
+                tag = "opTravelItineraryPdf"
+            }
+
+            binding.groupCustomerListCh.id -> {
+                tag = "groupCustomerListCh"
+            }
+
+            binding.groupCustomerListEn.id -> {
+                tag = "groupCustomerListEn"
+            }
+
+            binding.reverseTable.id -> {
+                tag = "reverseTable"
+            }
+
+            binding.foundsExamineForm.id -> {
+                tag = "foundsExamineForm"
+            }
+
+            binding.foundsCalculateForm.id -> {
+                tag = "foundsCalculateForm"
+            }
+
+            binding.provinceExamineForm.id -> {
+                tag = "provinceExamineForm"
+            }
+
+            binding.cityExamineForm.id -> {
+                tag = "cityExamineForm"
+            }
+
+            binding.leaveExamineForm.id -> {
+                tag = "leaveExamineForm"
+            }
+
+            binding.reimbursementForm.id -> {
+                tag = "reimbursementForm"
+            }
+        }
+
+        intent.putExtra("tag", tag)
+
+        startActivity(intent)
+    }
 }

+ 734 - 0
app/src/main/java/com/pan_american/android/ui/document/DocumentGroupListActivity.kt

@@ -0,0 +1,734 @@
+package com.pan_american.android.ui.document
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.text.Editable
+import android.text.TextWatcher
+import android.view.View
+import android.widget.TextView
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.pan_american.android.OASystem
+import com.pan_american.android.R
+import com.pan_american.android.base.BaseActivity
+import com.pan_american.android.base.CustomAlertDialog
+import com.pan_american.android.base.ListAdapter
+import com.pan_american.android.data.model.common.entity.Selector
+import com.pan_american.android.data.model.common.network.SelectorResponse
+import com.pan_american.android.data.model.document.network.DocumentGroupListRequest
+import com.pan_american.android.data.model.document.network.group_airplane_ticket.AirplaneReportFormGenerateRequest
+import com.pan_american.android.data.model.document.network.group_airplane_ticket.AirplaneTicketDocumentGenerateResponse
+import com.pan_american.android.data.model.document.network.group_airplane_ticket.AirplaneTravelItineraryGenerateRequest
+import com.pan_american.android.data.model.document.network.group_hotel.HotelDocumentGenerateRequest
+import com.pan_american.android.data.model.document.network.group_hotel.HotelDocumentGenerateResponse
+import com.pan_american.android.data.model.document.network.group_management.GroupCustomerListGenerateRequest
+import com.pan_american.android.data.model.document.network.group_management.GroupEnterExitCostGenerateRequest
+import com.pan_american.android.data.model.document.network.group_management.GroupManagerDocumentGenerateResponse
+import com.pan_american.android.data.model.document.network.group_management.GroupReverseTableGenerateRequest
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.ActivityDocumentGroupListBinding
+import com.pan_american.android.databinding.LayoutTitleBinding
+import com.scwang.smart.refresh.footer.ClassicsFooter
+import com.scwang.smart.refresh.header.ClassicsHeader
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class DocumentGroupListActivity : BaseActivity<ActivityDocumentGroupListBinding>() {
+
+    lateinit var titleBinding: LayoutTitleBinding
+
+    private var tag = ""
+
+    private var groupNameListRequest = DocumentGroupListRequest()
+
+    private var pageIndex = 1
+
+    private var totalPage = 0
+
+    private val apiService = ServiceCreator.create<APIService>()
+
+    private var listInit = false
+
+    private var groupNameList = ArrayList<Selector>()
+
+    override fun getViewBinding() = ActivityDocumentGroupListBinding.inflate(layoutInflater)
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        intent.apply {
+            tag = this.getStringExtra("tag").toString()
+        }
+
+        initTitle()
+        initViews()
+    }
+
+    override fun initTitle() {
+        titleBinding = LayoutTitleBinding.bind(binding.root).apply {
+            titleText.text = resources.getString(R.string.group_select)
+
+            searchView.visibility = View.VISIBLE
+            searchText.addTextChangedListener(object : TextWatcher {
+                override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+                }
+
+                override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+                }
+
+                override fun afterTextChanged(p0: Editable?) {
+
+                }
+            })
+
+            backButton.setOnClickListener {
+                back()
+            }
+        }
+    }
+
+    override fun initViews() {
+
+        groupNameListRequest.pageIndex = pageIndex
+        groupNameListRequest.pageSize = 10
+
+        binding.groupListContainer.setRefreshHeader(ClassicsHeader(OASystem.context))
+        binding.groupListContainer.setRefreshFooter(ClassicsFooter(OASystem.context))
+
+        getGroupList(1)
+    }
+
+    private fun getGroupList(type: Int) {
+
+        if (!listInit) {
+            apiService.documentGroupList(groupNameListRequest).enqueue(object : Callback<SelectorResponse> {
+                override fun onResponse(
+                    call: Call<SelectorResponse>,
+                    response: Response<SelectorResponse>
+                ) {
+                    val groupNameListResponse = response.body()
+                    if (groupNameListResponse != null) {
+                        if (groupNameListResponse.code == 200) {
+
+                            for (item in groupNameListResponse.data) {
+                                groupNameList.add(item)
+                            }
+
+                            if (groupNameList.size == 0) {
+                                showMessage(resources.getString(R.string.no_data))
+                            }
+
+                            when (type) {
+                                1 -> {
+                                    totalPage = getTotalPage(groupNameListResponse.count)
+                                    binding.groupListContainer.setEnableLoadMore(pageIndex < totalPage)
+                                    initList()
+                                    listInit = true
+                                }
+
+                                2 -> {
+                                    binding.groupListContainer.finishRefresh()
+                                    totalPage = getTotalPage(groupNameListResponse.count)
+                                    binding.groupListContainer.setEnableLoadMore(pageIndex < totalPage)
+                                    initList()
+                                    listInit = true
+                                }
+
+                                3 -> {
+                                    binding.groupListContainer.finishLoadMore()
+                                    binding.groupListContainer.setEnableLoadMore(pageIndex < totalPage)
+                                    binding.groupList.adapter!!.notifyItemInserted(
+                                        groupNameList.size
+                                    )
+                                    listInit = true
+                                }
+                            }
+
+                        } else {
+                            showMessage(groupNameListResponse.msg)
+                        }
+                    }
+                }
+
+                override fun onFailure(call: Call<SelectorResponse>, t: Throwable) {
+                    showErrorInfo(R.string.group_list_get_failed)
+                }
+            })
+        }
+    }
+
+    private fun getTotalPage(dataCount: Int): Int {
+        var totalPage = dataCount / 10
+        if (dataCount % 10 != 0) {
+            totalPage++
+        }
+
+        return totalPage
+    }
+
+    private fun initList() {
+
+        val layoutManager = LinearLayoutManager(OASystem.context)
+        binding.groupList.layoutManager = layoutManager
+
+        val adapter = ListAdapter.Builder<Selector>().apply {
+            setLayoutId(R.layout.item_group_name_list)
+            setData(groupNameList)
+            addBindView { itemView, data ->
+                itemView.findViewById<TextView>(R.id.selector_item_name).text = data.groupName
+            }
+        }.create()
+
+        binding.groupList.adapter = adapter
+
+        adapter.onRecyclerViewItemClick =
+            object : ListAdapter.OnRecyclerViewItemClick<Selector> {
+                override fun onItemClick(position: Int) {
+
+                    var docTypeName: String
+                    var downloadUrl: String
+
+                    when (tag) {
+                        //voucher
+                        "voucher" -> {
+                            apiService.hotelVoucherGenerate(HotelDocumentGenerateRequest(OASystem.HOTEL_PREDETERMINE, groupNameList[position].id)).enqueue(object : Callback<HotelDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<HotelDocumentGenerateResponse>,
+                                    response: Response<HotelDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.voucher)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<HotelDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        //确认单
+                        "confirmList" -> {
+                            apiService.hotelConfirmListGenerate(HotelDocumentGenerateRequest(OASystem.HOTEL_PREDETERMINE, groupNameList[position].id)).enqueue(object : Callback<HotelDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<HotelDocumentGenerateResponse>,
+                                    response: Response<HotelDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.hotel_confirm_list)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<HotelDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        //预订成本
+                        "predetermineCost" -> {
+                            apiService.hotelPredetermineCostGenerate(HotelDocumentGenerateRequest(OASystem.HOTEL_PREDETERMINE, groupNameList[position].id)).enqueue(object : Callback<HotelDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<HotelDocumentGenerateResponse>,
+                                    response: Response<HotelDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.hotel_predetermine_cost)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<HotelDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        //机票报表
+                        "airplaneReportForm" -> {
+                            apiService.airplaneTicketReportFormGenerate(AirplaneReportFormGenerateRequest(groupNameList[position].id)).enqueue(object : Callback<AirplaneTicketDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<AirplaneTicketDocumentGenerateResponse>,
+                                    response: Response<AirplaneTicketDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.airplane_report_forms)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<AirplaneTicketDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        //中文行程单
+                        "chTravelItinerary" -> {
+                            apiService.airplaneTravelItineraryGenerate(AirplaneTravelItineraryGenerateRequest(groupNameList[position].id, "CN")).enqueue(object : Callback<AirplaneTicketDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<AirplaneTicketDocumentGenerateResponse>,
+                                    response: Response<AirplaneTicketDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.ch_travel_itinerary)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<AirplaneTicketDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        //英文行程单
+                        "enTravelItinerary" -> {
+                            apiService.airplaneTravelItineraryGenerate(AirplaneTravelItineraryGenerateRequest(groupNameList[position].id, "EN")).enqueue(object : Callback<AirplaneTicketDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<AirplaneTicketDocumentGenerateResponse>,
+                                    response: Response<AirplaneTicketDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.ch_travel_itinerary)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<AirplaneTicketDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        //OP行程单word
+                        "opTravelItineraryWord" -> {
+
+                        }
+
+                        //OP行程单pdf
+                        "opTravelItineraryPdf" -> {
+
+                        }
+
+                        //接团客户名单(中文版)
+                        "groupCustomerListCh" -> {
+                            apiService.groupCustomerListGenerate(GroupCustomerListGenerateRequest(groupNameList[position].id, 0)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    response: Response<GroupManagerDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.group_customer_list_ch)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        //接团客户名单(英文版)
+                        "groupCustomerListEn" -> {
+                            apiService.groupCustomerListGenerate(GroupCustomerListGenerateRequest(groupNameList[position].id, 1)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    response: Response<GroupManagerDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.group_customer_list_en)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        //倒推表
+                        "reverseTable" -> {
+                            apiService.groupReverseTableGenerate(GroupReverseTableGenerateRequest(groupNameList[position].id)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    response: Response<GroupManagerDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.reverse_table)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        "foundsExamineForm" -> {
+                            apiService.groupEnterExitCostGenerate(GroupEnterExitCostGenerateRequest(groupNameList[position].id, 1, 1005)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    response: Response<GroupManagerDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.founds_examine_form)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        "foundsCalculateForm" -> {
+                            apiService.groupEnterExitCostGenerate(GroupEnterExitCostGenerateRequest(groupNameList[position].id, 1, 1006)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    response: Response<GroupManagerDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.founds_calculate_form)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        "provinceExamineForm" -> {
+                            apiService.groupEnterExitCostGenerate(GroupEnterExitCostGenerateRequest(groupNameList[position].id, 1, 1007)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    response: Response<GroupManagerDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.province_examine_form)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        "cityExamineForm" -> {
+                            apiService.groupEnterExitCostGenerate(GroupEnterExitCostGenerateRequest(groupNameList[position].id, 1, 1066)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    response: Response<GroupManagerDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.city_examine_form)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        "leaveExamineForm" -> {
+                            apiService.groupEnterExitCostGenerate(GroupEnterExitCostGenerateRequest(groupNameList[position].id, 2, 1008)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    response: Response<GroupManagerDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.leave_examine_form)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+
+                        "reimbursementForm" -> {
+                            apiService.groupEnterExitCostGenerate(GroupEnterExitCostGenerateRequest(groupNameList[position].id, 2, 1009)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
+                                override fun onResponse(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    response: Response<GroupManagerDocumentGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.reimbursement_form)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
+
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    call: Call<GroupManagerDocumentGenerateResponse>,
+                                    t: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
+                        }
+                    }
+                }
+            }
+
+        binding.groupListContainer.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
+            override fun onRefresh(refreshLayout: RefreshLayout) {
+                pageIndex = 1
+                groupNameListRequest.pageIndex = pageIndex
+                groupNameList.clear()
+                listInit = false
+                getGroupList(2)
+            }
+
+            override fun onLoadMore(refreshLayout: RefreshLayout) {
+                if (pageIndex < totalPage) {
+                    pageIndex += 1
+                    groupNameListRequest.pageIndex = pageIndex
+                    listInit = false
+                    getGroupList(3)
+                }
+            }
+        })
+    }
+
+    private fun showDownloadHintDialog(groupName: String, docType: String, url: String) {
+        CustomAlertDialog.Builder(OASystem.context).apply {
+            setTitle(resources.getString(R.string.hint))
+            setMessage(String.format(resources.getString(R.string.document_generated), groupName, docType))
+            setNegativeButtonAndListener(resources.getString(R.string.cancel)) { dialog, _ ->
+                dialog.dismiss()
+            }
+            setPositiveButtonAndListener(resources.getString(R.string.confirm)) { _, _ ->
+                val uri = Uri.parse(url)
+                startActivity(Intent(Intent.ACTION_VIEW, uri))
+            }
+            setCancelable(false)
+        }.show()
+    }
+}

+ 10 - 0
app/src/main/java/com/pan_american/android/ui/group_management/group_info/AddGroupInfoActivity.kt

@@ -322,6 +322,16 @@ class AddGroupInfoActivity : BaseActivity<ActivityAddGroupInfoBinding>() {
 
         } while ((!base64Adjusted))
 
+//        val file = File(filesDir, "data.txt")
+//        if (file.exists()) {
+//            file.delete()
+//        }
+//        file.createNewFile()
+//        val writer = FileWriter(file)
+//        writer.append(Gson().toJson(GroupCustomerListRequest(transferBase64)))
+//        writer.flush()
+//        writer.close()
+
         apiService.getGroupCustomerList(GroupCustomerListRequest(transferBase64))
             .enqueue(object : Callback<GroupCustomerListResponse> {
 

+ 1 - 1
app/src/main/java/com/pan_american/android/ui/group_simple_info/GroupSimpleInfoFragment.kt

@@ -130,7 +130,7 @@ class GroupSimpleInfoFragment : BaseFragment<FragmentSimpleGroupBinding>() {
                     }
 
                     override fun onFailure(call: Call<GroupSimpleInfoResponse>, t: Throwable) {
-                        showErrorInfo(R.string.group_list_get_error)
+                        showErrorInfo(R.string.group_list_get_failed)
                     }
                 })
         } else {

+ 10 - 0
app/src/main/java/com/pan_american/android/ui/resource_management/market_customer/AddNewCustomerActivity.kt

@@ -835,6 +835,16 @@ class AddNewCustomerActivity : BaseActivity<ActivityAddNewCustomerBinding>() {
             bitmap.recycle()
         } while (!base64Adjusted)
 
+//        val file = File(filesDir, "data.txt")
+//        if (file.exists()) {
+//            file.delete()
+//        }
+//        file.createNewFile()
+//        val writer = FileWriter(file)
+//        writer.append(Gson().toJson(BusinessCardInfoRequest(transferBase64)))
+//        writer.flush()
+//        writer.close()
+
         apiService.getBusinessCardInfo(BusinessCardInfoRequest(transferBase64))
             .enqueue(object : Callback<BusinessCardInfoResponse> {
 

+ 1 - 1
app/src/main/java/com/pan_american/android/ui/resource_management/service_resource/ServiceResourceListFragment.kt

@@ -7,7 +7,7 @@ import android.view.ViewGroup
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.pan_american.android.OASystem
 import com.pan_american.android.base.BaseFragment
-import com.pan_american.android.data.model.ServiceResourceListItem
+import com.pan_american.android.data.model.common.entity.ServiceResourceListItem
 import com.pan_american.android.data.model.common.adapter.ServiceResourceAdapter
 import com.pan_american.android.databinding.FragmentServiceResourceListBinding
 

+ 92 - 58
app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceFragment.kt

@@ -63,18 +63,25 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
 
                 //效率工具
                 OASystem.ADDRESS_BOOK -> {
-                    binding.addressBook.visibility = View.VISIBLE
-                    binding.addressBook.setOnClickListener(this)
+                    if (OASystem.authorization(OASystem.ADDRESS_BOOK, OASystem.VIEW)) {
+                        binding.addressBook.visibility = View.VISIBLE
+                        binding.addressBook.setOnClickListener(this)
+                    }
                 }
 
                 OASystem.ITINERARY -> {
-                    binding.itinerary.visibility = View.VISIBLE
-                    binding.itinerary.setOnClickListener(this)
+                    if (OASystem.authorization(OASystem.ITINERARY, OASystem.VIEW)) {
+                        binding.itinerary.visibility = View.VISIBLE
+                        binding.itinerary.setOnClickListener(this)
+                    }
                 }
 
                 OASystem.DAILY_PAYMENT -> {
-                    binding.dailyPayment.visibility = View.VISIBLE
-                    binding.dailyPayment.setOnClickListener(this)
+                    if (OASystem.authorization(OASystem.DAILY_PAYMENT, OASystem.VIEW)) {
+                        binding.dailyPayment.visibility = View.VISIBLE
+                        binding.dailyPayment.setOnClickListener(this)
+                    }
+
                 }
 
 //                OASystem.GROUP_PAYMENT -> {
@@ -84,112 +91,139 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
 
                 //团组酒店
                 OASystem.HOTEL_RESOURCE -> {
-                    if (binding.groupHotel.visibility == View.GONE) {
-                        binding.groupHotel.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.HOTEL_RESOURCE, OASystem.VIEW)) {
+                        if (binding.groupHotel.visibility == View.GONE) {
+                            binding.groupHotel.visibility = View.VISIBLE
+                        }
+                        binding.hotelResource.visibility = View.VISIBLE
+                        binding.hotelResource.setOnClickListener(this)
                     }
-                    binding.hotelResource.visibility = View.VISIBLE
-                    binding.hotelResource.setOnClickListener(this)
                 }
 
                 OASystem.HOTEL_PREDETERMINE -> {
-                    if (binding.groupHotel.visibility == View.GONE) {
-                        binding.groupHotel.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.HOTEL_PREDETERMINE, OASystem.VIEW)) {
+                        if (binding.groupHotel.visibility == View.GONE) {
+                            binding.groupHotel.visibility = View.VISIBLE
+                        }
+                        binding.hotelPredetermine.visibility = View.VISIBLE
+                        binding.hotelPredetermine.setOnClickListener(this)
                     }
-                    binding.hotelPredetermine.visibility = View.VISIBLE
-                    binding.hotelPredetermine.setOnClickListener(this)
                 }
 
                 //团组OP
                 OASystem.GUIDE_RESOURCE -> {
-                    if (binding.groupOp.visibility == View.GONE) {
-                        binding.groupOp.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.GUIDE_RESOURCE, OASystem.VIEW)) {
+                        if (binding.groupOp.visibility == View.GONE) {
+                            binding.groupOp.visibility = View.VISIBLE
+                        }
+                        binding.guideResource.visibility = View.VISIBLE
+                        binding.guideResource.setOnClickListener(this)
                     }
-                    binding.guideResource.visibility = View.VISIBLE
-                    binding.guideResource.setOnClickListener(this)
                 }
 
                 OASystem.CAR_RESOURCE -> {
-                    if (binding.groupOp.visibility == View.GONE) {
-                        binding.groupOp.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.CAR_RESOURCE, OASystem.VIEW)) {
+                        if (binding.groupOp.visibility == View.GONE) {
+                            binding.groupOp.visibility = View.VISIBLE
+                        }
+                        binding.carResource.visibility = View.VISIBLE
+                        binding.carResource.setOnClickListener(this)
                     }
-                    binding.carResource.visibility = View.VISIBLE
-                    binding.carResource.setOnClickListener(this)
+
                 }
 
                 OASystem.GROUND_CONVEY_PAYMENT_INSERT -> {
-                    if (binding.groupOp.visibility == View.GONE) {
-                        binding.groupOp.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.GROUND_CONVEY_PAYMENT_INSERT, OASystem.VIEW)) {
+                        if (binding.groupOp.visibility == View.GONE) {
+                            binding.groupOp.visibility = View.VISIBLE
+                        }
+                        binding.groundConveyPaymentInsert.visibility = View.VISIBLE
+                        binding.groundConveyPaymentInsert.setOnClickListener(this)
                     }
-                    binding.groundConveyPaymentInsert.visibility = View.VISIBLE
-                    binding.groundConveyPaymentInsert.setOnClickListener(this)
                 }
 
                 //团组商邀公务
                 OASystem.INVITE_DATA -> {
-                    if (binding.groupInviteOfficial.visibility == View.GONE) {
-                        binding.groupInviteOfficial.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.INVITE_DATA, OASystem.VIEW)) {
+                        if (binding.groupInviteOfficial.visibility == View.GONE) {
+                            binding.groupInviteOfficial.visibility = View.VISIBLE
+                        }
+                        binding.inviteData.visibility = View.VISIBLE
+                        binding.inviteData.setOnClickListener(this)
                     }
-                    binding.inviteData.visibility = View.VISIBLE
-                    binding.inviteData.setOnClickListener(this)
                 }
 
                 OASystem.INVITE_OFFICIAL_PAYMENT -> {
-                    if (binding.groupInviteOfficial.visibility == View.GONE) {
-                        binding.groupInviteOfficial.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.INVITE_OFFICIAL_PAYMENT, OASystem.VIEW)) {
+                        if (binding.groupInviteOfficial.visibility == View.GONE) {
+                            binding.groupInviteOfficial.visibility = View.VISIBLE
+                        }
+                        binding.inviteOfficialPayment.visibility = View.VISIBLE
+                        binding.inviteOfficialPayment.setOnClickListener(this)
                     }
-                    binding.inviteOfficialPayment.visibility = View.VISIBLE
-                    binding.inviteOfficialPayment.setOnClickListener(this)
                 }
 
                 //团组经理主管
                 OASystem.GROUP_INFORMATION -> {
-                    if (binding.groupManager.visibility == View.GONE) {
-                        binding.groupManager.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.GROUP_INFORMATION, OASystem.VIEW)) {
+                        if (binding.groupManager.visibility == View.GONE) {
+                            binding.groupManager.visibility = View.VISIBLE
+                        }
+                        binding.groupOperation.visibility = View.VISIBLE
+                        binding.groupOperation.setOnClickListener(this)
                     }
-                    binding.groupOperation.visibility = View.VISIBLE
-                    binding.groupOperation.setOnClickListener(this)
                 }
 
                 //团组签证
                 OASystem.VISA_PAYMENT_INSERT -> {
-                    if (binding.groupVisa.visibility == View.GONE) {
-                        binding.groupVisa.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.VISA_PAYMENT_INSERT, OASystem.VIEW)) {
+                        if (binding.groupVisa.visibility == View.GONE) {
+                            binding.groupVisa.visibility = View.VISIBLE
+                        }
+                        binding.visaPaymentInsert.visibility = View.VISIBLE
+                        binding.visaPaymentInsert.setOnClickListener(this)
                     }
-                    binding.visaPaymentInsert.visibility = View.VISIBLE
-                    binding.visaPaymentInsert.setOnClickListener(this)
                 }
 
                 OASystem.INSURANCE_PAYMENT_INSERT -> {
-                    if (binding.groupVisa.visibility == View.GONE) {
-                        binding.groupVisa.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.INSURANCE_PAYMENT_INSERT, OASystem.VIEW)) {
+                        if (binding.groupVisa.visibility == View.GONE) {
+                            binding.groupVisa.visibility = View.VISIBLE
+                        }
+                        binding.insurancePaymentInsert.visibility = View.VISIBLE
+                        binding.insurancePaymentInsert.setOnClickListener(this)
                     }
-                    binding.insurancePaymentInsert.visibility = View.VISIBLE
-                    binding.insurancePaymentInsert.setOnClickListener(this)
                 }
 
                 //资源管理 (暂)
                 OASystem.MARKET_CUSTOMER -> {
-                    if (binding.customerResource.visibility == View.GONE) {
-                        binding.customerResource.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.MARKET_CUSTOMER, OASystem.VIEW)) {
+                        if (binding.customerResource.visibility == View.GONE) {
+                            binding.customerResource.visibility = View.VISIBLE
+                        }
+                        binding.companyCustomerResource.visibility = View.VISIBLE
+                        binding.companyCustomerResource.setOnClickListener(this)
                     }
-                    binding.companyCustomerResource.visibility = View.VISIBLE
-                    binding.companyCustomerResource.setOnClickListener(this)
                 }
 
                 //团组机票
                 OASystem.THREE_CODE_RESOURCE -> {
-                    if (binding.groupAirplaneTicket.visibility == View.GONE) {
-                        binding.groupAirplaneTicket.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.THREE_CODE_RESOURCE, OASystem.VIEW)) {
+                        if (binding.groupAirplaneTicket.visibility == View.GONE) {
+                            binding.groupAirplaneTicket.visibility = View.VISIBLE
+                        }
+                        binding.airplaneThreeCode.visibility = View.VISIBLE
+                        binding.airplaneThreeCode.setOnClickListener(this)
                     }
-                    binding.airplaneThreeCode.visibility = View.VISIBLE
-                    binding.airplaneThreeCode.setOnClickListener(this)
                 }
                 OASystem.AIRPLANE_PAYMENT_INSERT -> {
-                    if (binding.groupAirplaneTicket.visibility == View.GONE) {
-                        binding.groupAirplaneTicket.visibility = View.VISIBLE
+                    if (OASystem.authorization(OASystem.AIRPLANE_PAYMENT_INSERT, OASystem.VIEW)) {
+                        if (binding.groupAirplaneTicket.visibility == View.GONE) {
+                            binding.groupAirplaneTicket.visibility = View.VISIBLE
+                        }
+                        binding.airplanePaymentInsert.visibility = View.VISIBLE
+                        binding.airplanePaymentInsert.setOnClickListener(this)
                     }
-                    binding.airplanePaymentInsert.visibility = View.VISIBLE
-                    binding.airplanePaymentInsert.setOnClickListener(this)
                 }
             }
         }

+ 28 - 0
app/src/main/res/layout/activity_document_group_list.xml

@@ -0,0 +1,28 @@
+<?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"
+    android:background="@color/white"
+    tools:context=".ui.document.DocumentGroupListActivity">
+
+    <include
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        layout="@layout/layout_title" />
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/group_list_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="@dimen/common_padding">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/group_list"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
+
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+</LinearLayout>

+ 612 - 4
app/src/main/res/layout/fragment_document.xml

@@ -1,9 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
-<FrameLayout 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="match_parent"
     android:background="@color/background_color"
+    android:orientation="vertical"
     tools:context=".ui.announcement.AnnouncementFragment">
 
     <LinearLayout
@@ -18,10 +20,616 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center"
             android:layout_marginTop="@dimen/title_margin_top"
-            android:text="文档"
+            android:text="@string/document"
             android:textColor="@color/white"
             android:textSize="@dimen/text_size_large" />
-
     </LinearLayout>
 
-</FrameLayout>
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/common_padding"
+        android:scrollbars="none">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:id="@+id/group_hotel"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/white"
+                android:orientation="vertical"
+                android:visibility="gone">
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/common_padding"
+                    android:background="@color/background_color" />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="25dp"
+                    android:layout_marginEnd="25dp"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:text="@string/group_hotel"
+                        android:textColor="@color/text_color"
+                        android:textSize="@dimen/text_size_minimum" />
+
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="1dp"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:background="@color/line_color" />
+
+                    <LinearLayout
+                        android:id="@+id/voucher"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/voucher"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/confirm_list"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/hotel_confirm_list"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/predetermine_cost"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/hotel_predetermine_cost"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_excel" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+                </LinearLayout>
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/group_airplane_ticket"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/white"
+                android:orientation="vertical"
+                android:visibility="gone">
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/common_padding"
+                    android:background="@color/background_color" />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="25dp"
+                    android:layout_marginEnd="25dp"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:text="@string/group_airplane_ticket"
+                        android:textColor="@color/text_color"
+                        android:textSize="@dimen/text_size_minimum" />
+
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="1dp"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:background="@color/line_color" />
+
+                    <LinearLayout
+                        android:id="@+id/airplane_report_form"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/airplane_report_forms"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_excel" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/ch_travel_itinerary"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/ch_travel_itinerary"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/en_travel_itinerary"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/en_travel_itinerary"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                    </LinearLayout>
+
+                </LinearLayout>
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/group_op"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/white"
+                android:orientation="vertical"
+                android:visibility="gone">
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/common_padding"
+                    android:background="@color/background_color" />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="25dp"
+                    android:layout_marginEnd="25dp"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:text="@string/group_op"
+                        android:textColor="@color/text_color"
+                        android:textSize="@dimen/text_size_minimum" />
+
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="1dp"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:background="@color/line_color" />
+
+                    <LinearLayout
+                        android:id="@+id/op_travel_itinerary_word"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/op_travel_itinerary_word_version"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/op_travel_itinerary_pdf"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/op_travel_itinerary_pdf_version"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_pdf" />
+
+                    </LinearLayout>
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/group_manager"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/white"
+                android:orientation="vertical"
+                android:visibility="gone">
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/common_padding"
+                    android:background="@color/background_color" />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="25dp"
+                    android:layout_marginEnd="25dp"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:text="@string/group_manager"
+                        android:textColor="@color/text_color"
+                        android:textSize="@dimen/text_size_minimum" />
+
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="1dp"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:background="@color/line_color" />
+
+                    <LinearLayout
+                        android:id="@+id/group_customer_list_ch"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/group_customer_list_ch"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/group_customer_list_en"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/group_customer_list_en"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/reverse_table"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/reverse_table"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/founds_examine_form"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/founds_examine_form"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/founds_calculate_form"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/founds_calculate_form"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/province_examine_form"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/province_examine_form"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_excel" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/city_examine_form"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:ellipsize="marquee"
+                            android:gravity="center_vertical"
+                            android:maxLines="1"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/city_examine_form"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/leave_examine_form"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/leave_examine_form"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/reimbursement_form"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/reimbursement_form"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_document_word" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+        </LinearLayout>
+    </ScrollView>
+</LinearLayout>

+ 2 - 1
app/src/main/res/layout/item_company_list.xml

@@ -13,7 +13,8 @@
         android:layout_height="@dimen/common_padding_heavy"
         android:layout_gravity="center_horizontal"
         android:layout_marginStart="@dimen/common_padding"
-        android:src="@mipmap/icon_company" />
+        android:src="@mipmap/icon_company"
+        tools:ignore="ContentDescription"/>
 
     <LinearLayout
         android:layout_width="match_parent"

+ 14 - 13
app/src/main/res/layout/item_group_info_list.xml

@@ -309,26 +309,27 @@
 
         </LinearLayout>
 
-        <View
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/line"
-            android:layout_marginTop="@dimen/common_padding"
-            android:layout_marginBottom="@dimen/common_padding"
-            android:background="@color/line_color" />
-
         <LinearLayout
+            android:id="@+id/group_status_field"
             android:layout_width="match_parent"
-            android:layout_height="50dp"
-            android:layout_marginTop="@dimen/common_padding"
-            android:layout_marginBottom="@dimen/common_padding_huge"
-            android:background="@drawable/shape_corner_solid_blue"
+            android:layout_height="wrap_content"
             android:baselineAligned="false"
-            android:orientation="horizontal">
+            android:orientation="vertical">
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
 
             <TextView
                 android:id="@+id/group_status"
                 android:layout_width="match_parent"
-                android:layout_height="match_parent"
+                android:layout_height="50dp"
+                android:layout_marginTop="@dimen/common_padding"
+                android:layout_marginBottom="@dimen/common_padding_huge"
+                android:background="@drawable/shape_corner_solid_blue"
                 android:gravity="center"
                 android:textColor="@color/white"
                 android:textSize="@dimen/text_size_medium"

+ 43 - 0
app/src/main/res/layout/item_group_name_list.xml

@@ -0,0 +1,43 @@
+<?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="wrap_content"
+    android:layout_marginTop="@dimen/common_padding"
+    android:layout_marginBottom="@dimen/common_padding"
+    android:orientation="horizontal"
+    tools:viewBindingIgnore="true">
+
+    <ImageView
+        android:layout_width="@dimen/common_padding_heavy"
+        android:layout_height="@dimen/common_padding_heavy"
+        android:layout_marginStart="@dimen/common_padding"
+        android:src="@mipmap/icon_document"
+        tools:ignore="ContentDescription"/>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/selector_item_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:layout_marginStart="@dimen/common_padding"
+            android:layout_marginEnd="@dimen/common_padding"
+            android:maxLines="1"
+            android:textColor="@color/text_color"
+            android:textSize="@dimen/text_size_medium" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginStart="@dimen/common_padding"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:background="@color/line_color" />
+
+    </LinearLayout>
+
+</LinearLayout>

BIN
app/src/main/res/mipmap-xxhdpi/icon_document_excel.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_document_pdf.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_document_word.png


+ 30 - 4
app/src/main/res/values/strings.xml

@@ -107,11 +107,14 @@
     <string name="boss_name">Zhang Hailin</string>
 
     <string name="show_cost">显示成本</string>
-    
+
     <!-- AlertDialog通用文本 -->
     <string name="alert">警告</string>
     <string name="delete_alert_text">确认要删除:%s ?</string>
 
+    <string name="hint">提示</string>
+    <string name="document_generated">文档已生成, 点击确认跳转至浏览器下载\n\n团组名称: %s\n\n文档类型: %s</string>
+
     <string name="camera_permission_hint">请在设置中打开相机权限</string>
     <string name="permission_denied">未拥有该权限</string>
 
@@ -119,7 +122,6 @@
     <string name="network_error">%s,请检查网络设置</string>
     <string name="base_resource_data_get_failed">基础数据源获取失败</string>
     <string name="interface_request_error">接口请求错误</string>
-    <string name="group_list_get_error">团组列表获取失败</string>
     <string name="group_currency_get_failed">团组汇率获取失败</string>
     <string name="delete_error">删除失败</string>
     <string name="update_error">更新 / 添加失败</string>
@@ -138,7 +140,7 @@
 
     <!-- 登录错误 -->
     <string name="login_failed">登陆失败</string>
-    
+
     <!-- 底部菜单 -->
 
     <string name="message">消息</string>
@@ -865,7 +867,7 @@
 
     <string name="invite_data_detail">邀请公务活动资料详情</string>
     <string name="add_invite_data">新增邀请公务活动资料</string>
-    
+
     <string name="invitee_website">邀请方官网</string>
     <string name="invitee_info">邀请方信息</string>
     <string name="face_book">FaceBook</string>
@@ -881,4 +883,28 @@
     <string name="group_name_list_get_failed">团组名称列表获取失败</string>
     <string name="invite_data_info_get_failed">商邀资料详情获取失败</string>
 
+    <!-- 文档 -->
+    <string name="hotel_predetermine_cost">酒店预订成本</string>
+    <string name="hotel_confirm_list">酒店确认单</string>
+    <string name="voucher">VOUCHER</string>
+
+    <string name="airplane_report_forms">机票录入报表</string>
+    <string name="ch_travel_itinerary">中文行程单</string>
+    <string name="en_travel_itinerary">英文行程单</string>
+
+    <string name="op_travel_itinerary_word_version">OP行程单(WORD版)</string>
+    <string name="op_travel_itinerary_pdf_version">OP行程单(PDF版)</string>
+
+    <string name="group_customer_list_ch">团组名单(中文版)</string>
+    <string name="group_customer_list_en">团组名单(英文版)</string>
+    <string name="reverse_table">倒推表</string>
+    <string name="founds_examine_form">出国出境经费审核计算明细</string>
+    <string name="founds_calculate_form">因公出国(境)经费测算明细表</string>
+    <string name="province_examine_form">四川省商务厅出国经费财政先行审核表</string>
+    <string name="city_examine_form">成都市因公临时出国任务和预算审批意见表(外专培训团专用)</string>
+    <string name="leave_examine_form">派员单位出(境)任务和预算审批意见表</string>
+    <string name="reimbursement_form">省级单位出(境)经费报销单</string>
+
+    <string name="group_select">团组选择</string>
+
 </resources>

+ 1 - 3
app/src/main/res/xml/file_paths.xml

@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <paths xmlns:android="http://schemas.android.com/apk/res/android">
-    <external-path
-        name="my_images"
-        path="/" />
+    <external-path name="my_images" path="/" />
 </paths>