Explorar o código

2025-03-03 新增

新增:
1. 团组操作 添加/修改 新增 城市字段
2. 出入境费用明细 详情 部分接口 新增 provinceId字段
3. 出入境费用明细 - 草稿 新增 选择城市所属
4. 出入境费用明细 - 草稿 详情 部分接口 新增 provinceId字段
zhaiy hai 1 ano
pai
achega
4313bd1074
Modificáronse 23 ficheiros con 530 adicións e 47 borrados
  1. 3 0
      app/src/main/java/com/pan_american/android/OASystem.kt
  2. 2 0
      app/src/main/java/com/pan_american/android/data/model/common/entity/Selector.kt
  3. 2 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitDetailResponse.kt
  4. 5 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitDocumentListRequest.kt
  5. 6 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/EntryAndExitDraftDocumentListRequest.kt
  6. 2 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/EntryAndExitDraftTotalResponse.kt
  7. 10 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/UpdateDraftProvinceIdRequest.kt
  8. 1 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/UpdateEntryAndExitDraftCurrencyRateRequest.kt
  9. 1 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/UpdateEntryAndExitDraftTypeStatusRequest.kt
  10. 1 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/UpdateInBoardDraftPaymentRequest.kt
  11. 1 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/UpdateInternationalTravelDraftRequest.kt
  12. 5 0
      app/src/main/java/com/pan_american/android/data/model/group_management/group_info/network/GetGroupCountryListRequest.kt
  13. 2 0
      app/src/main/java/com/pan_american/android/data/model/group_management/group_info/network/GroupOperationRequest.kt
  14. 33 11
      app/src/main/java/com/pan_american/android/data/network/APIService.kt
  15. 21 2
      app/src/main/java/com/pan_american/android/ui/efficiency_tools/require_gather/RequireGatherActivity.kt
  16. 2 2
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitFeeTotalFragment.kt
  17. 28 1
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitFeeDraftActivity.kt
  18. 66 2
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitFeeDraftTotalFragment.kt
  19. 250 0
      app/src/main/java/com/pan_american/android/ui/group_management/group_info/GroupInfoBaseFragment.kt
  20. 1 1
      app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceFragment.kt
  21. 50 28
      app/src/main/res/layout/fragment_entry_and_entry_fee_draft_total.xml
  22. 34 0
      app/src/main/res/layout/fragment_group_info_base.xml
  23. 4 0
      app/src/main/res/values/strings.xml

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

@@ -373,6 +373,9 @@ class OASystem : Application() {
 
         //三公费用 & 草稿 最后一次选择的国家
         var entryAndExitLastChoiceCity = EntryAndExitPaymentPrinciple()
+
+        //三公费用 - 草稿 省份列表
+        var entryAndExitProvinceList = ArrayList<Selector>()
     }
 
     override fun onCreate() {

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

@@ -43,4 +43,6 @@ class Selector {
 
     var draftName = ""
     var isViewOrEdit = false
+
+    var provinceId = 0
 }

+ 2 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitDetailResponse.kt

@@ -4,6 +4,8 @@ import com.pan_american.android.data.model.common.entity.Selector
 
 data class EntryAndExitDetailResponse (val id: Int = 0, var diId: Int = 0, val currencys:ArrayList<Selector> = arrayListOf()){
 
+    var provinceId = 0
+
     var isAssignPerm = false
 
     var choiceOne = 0

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

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.OASystem
+
+class EntryAndExitDocumentListRequest(val portType: Int = 2, val provinceId: Int = OASystem.entryAndExitDetailResponse.provinceId)

+ 6 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/EntryAndExitDraftDocumentListRequest.kt

@@ -0,0 +1,6 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network
+
+import com.pan_american.android.OASystem
+
+class EntryAndExitDraftDocumentListRequest(val portType: Int = 2, val provinceId: Int = OASystem.entryAndExitDraftResponse.provinceId) {
+}

+ 2 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/EntryAndExitDraftTotalResponse.kt

@@ -4,6 +4,8 @@ import com.pan_american.android.data.model.common.entity.Selector
 
 data class EntryAndExitDraftTotalResponse(val id: Int = 0, val currencys:ArrayList<Selector> = arrayListOf()){
 
+    var provinceId = 0
+
     var draftName = ""
     var isAssignPerm = false
 

+ 10 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/UpdateDraftProvinceIdRequest.kt

@@ -0,0 +1,10 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network
+
+import com.pan_american.android.OASystem
+
+class UpdateDraftProvinceIdRequest(
+    val portType: Int = 2,
+    val draftId: Int = OASystem.entryAndExitDraftResponse.id,
+    val provinceId: Int,
+    val currUserId: Int = OASystem.userInfo.userId
+)

+ 1 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/UpdateEntryAndExitDraftCurrencyRateRequest.kt

@@ -6,6 +6,7 @@ import com.pan_american.android.data.model.common.entity.Selector
 class UpdateEntryAndExitDraftCurrencyRateRequest(
     val portType: Int = 2,
     val draftId: Int,
+    val provinceId: Int = OASystem.entryAndExitDraftResponse.provinceId,
     val currUserId: Int = OASystem.userInfo.userId,
     val currencys: ArrayList<Selector>
 )

+ 1 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/UpdateEntryAndExitDraftTypeStatusRequest.kt

@@ -5,6 +5,7 @@ import com.pan_american.android.OASystem
 class UpdateEntryAndExitDraftTypeStatusRequest(
     val portType: Int = 2,
     val draftId: Int,
+    val provinceId: Int = OASystem.entryAndExitDraftResponse.provinceId,
     val currUserId: Int = OASystem.userInfo.userId,
     val itemType: Int,
     val isSelected: Int

+ 1 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/UpdateInBoardDraftPaymentRequest.kt

@@ -5,6 +5,7 @@ import com.pan_american.android.OASystem
 class UpdateInBoardDraftPaymentRequest(
     val portType: Int = 2,
     val draftId: Int,
+    val provinceId: Int = OASystem.entryAndExitDraftResponse.provinceId,
     val currUserId: Int = OASystem.userInfo.userId,
     val choiceOne: Int,
     val visa: Double,

+ 1 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/UpdateInternationalTravelDraftRequest.kt

@@ -5,6 +5,7 @@ import com.pan_american.android.OASystem
 class UpdateInternationalTravelDraftRequest(
     val portType: Int = 2,
     val draftId: Int,
+    val provinceId: Int = OASystem.entryAndExitDraftResponse.provinceId,
     val currUserId: Int = OASystem.userInfo.userId,
     val choiceTwoJJ: Int,
     val choiceTwoGW: Int,

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

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.group_management.group_info.network
+
+import com.pan_american.android.base.BaseRequest
+
+class GetGroupCountryListRequest(var search: String = ""): BaseRequest()

+ 2 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/group_info/network/GroupOperationRequest.kt

@@ -7,6 +7,8 @@ class GroupOperationRequest: BaseRequest() {
 
     var status = 1
     var id = 0
+    var cityId = 0
+    var cityName = ""
     var userId = OASystem.userInfo.userId
     var salesQuoteNo = ""
     var jietuanOperator = 0

+ 33 - 11
app/src/main/java/com/pan_american/android/data/network/APIService.kt

@@ -156,6 +156,7 @@ import com.pan_american.android.data.model.group_management.entry_and_exit_fee_d
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDetailPermissionRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDetailRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDetailResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDocumentListRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDocumentListResponse
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitFileDownloadRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitFileDownloadResponse
@@ -188,6 +189,7 @@ import com.pan_american.android.data.model.group_management.entry_and_exit_fee_d
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.DraftFileTypeResponse
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.DraftWordFileDownloadRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.DraftWordFileDownloadResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.EntryAndExitDraftDocumentListRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.EntryAndExitDraftListRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.EntryAndExitDraftListResponse
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.EntryAndExitDraftOtherPaymentListResponse
@@ -203,6 +205,7 @@ import com.pan_american.android.data.model.group_management.entry_and_exit_fee_d
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.OtherPaymentDraftDataSourceRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.OtherPaymentDraftDataSourceResponse
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.SynchronizeDraftToGroupRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.UpdateDraftProvinceIdRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.UpdateEntryAndExitDraftCurrencyRateRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.UpdateEntryAndExitDraftPaymentDetailRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.UpdateEntryAndExitDraftPermissionRequest
@@ -212,6 +215,7 @@ import com.pan_american.android.data.model.group_management.entry_and_exit_fee_d
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.UpdateInternationalTravelDraftRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.UpdateInternationalTravelDraftResponse
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.UpdateOtherPaymentDraftRequest
+import com.pan_american.android.data.model.group_management.group_info.network.GetGroupCountryListRequest
 import com.pan_american.android.data.model.group_management.group_info.network.GetSellCodeResponse
 import com.pan_american.android.data.model.group_management.group_info.network.GroupCustomerListRequest
 import com.pan_american.android.data.model.group_management.group_info.network.GroupCustomerListResponse
@@ -806,37 +810,37 @@ interface APIService {
     fun getInsurancePaymentDetail(@Body insurancePaymentDetailRequest: InsurancePaymentDetailRequest): Call<InsurancePaymentDetailResponse>
 
     /**
-     * 接团信息, 基础数据源
+     * 团组操作, 基础数据源
      */
     @POST("/api/Groups/GroupEditBasicSource")
     fun getGroupInfoBaseData(@Body baseRequest: BaseRequest): Call<GroupInfoBaseDataResponse>
 
     /**
-     * 接团信息, 根据类型查询数据
+     * 团组操作, 根据类型查询数据
      */
     @POST("/api/Groups/GetGroupListByWhere")
     fun getGroupInfoList(@Body groupInfoListRequest: GroupInfoListRequest): Call<GroupInfoListResponse>
 
     /**
-     * 接团信息, 设置确认出团
+     * 团组操作, 设置确认出团
      */
     @POST("/api/Groups/SetConfirmationGroup")
     fun groupStatusChange(@Body groupStatusChangeRequest: GroupStatusChangeRequest): Call<GroupStatusChangeResponse>
 
     /**
-     * 接团信息, 删除团组信息
+     * 团组操作, 删除团组信息
      */
     @POST("/api/Groups/GroupDel")
     fun deleteGroup(@Body deleteRequest: DeleteRequest): Call<BaseResponse>
 
     /**
-     * 接团信息, 获取销售报价号
+     * 团组操作, 获取销售报价号
      */
     @POST("/api/Groups/GetGroupSalesQuoteNo")
     fun getSellCode(): Call<GetSellCodeResponse>
 
     /**
-     * 接团信息, 扫描并获取客户信息
+     * 团组操作, 扫描并获取客户信息
      */
     @POST("/api/BaiduOCR/ClientOCR")
     fun getGroupCustomerList(@Body picBase64: GroupCustomerListRequest): Call<GroupCustomerListResponse>
@@ -848,18 +852,24 @@ interface APIService {
     fun generateNameSpell(@Body nameSpellGenerateRequest: NameSpellGenerateRequest): Call<NameSpellGenerateResponse>
 
     /**
-     * 接团信息, 接团流程操作
+     * 团组操作, 接团流程操作
      * status:  1.新增    2.修改
      */
     @POST("/api/Groups/GroupProcessOperation")
     fun groupOperation(@Body groupOperationRequest: GroupOperationRequest): Call<BaseResponse>
 
     /**
-     * 接团信息, 根据id获取接团详情
+     * 团组操作, 根据id获取接团详情
      */
     @POST("/api/Groups/GetGroupInfo")
     fun getGroupInfoDetail(@Body groupInfoDetailRequest: GroupInfoDetailRequest): Call<GroupInfoDetailResponse>
 
+    /**
+     * 团组操作, 获取城市数据源
+     */
+    @POST("/api/Groups/GroupProvCityBasicSource")
+    fun getGroupCountryDataSource(@Body getGroupCountryListRequest: GetGroupCountryListRequest): Call<SelectorResponse>
+
     /**
      * 消息系统, 获取不同类别的消息未读条数
      */
@@ -1465,7 +1475,7 @@ interface APIService {
      * 出入境费用明细, 获取下载文件列表list
      */
     @POST("/api/Groups/EnterExitCostMobileDataSource")
-    fun getEntryAndExitDocumentList(@Body baseRequest: BaseRequest): Call<EntryAndExitDocumentListResponse>
+    fun getEntryAndExitDocumentList(@Body entryAndExitDocumentListRequest: EntryAndExitDocumentListRequest): Call<EntryAndExitDocumentListResponse>
 
     /**
      * 出入境费用明细, 文档下载
@@ -1479,6 +1489,12 @@ interface APIService {
     @POST("/api/Groups/EnterExitCostMobileCurrencyData")
     fun getCurrencyList(@Body currencyListRequest: CurrencyListRequest): Call<SelectorResponse>
 
+    /**
+     * 出入境费用明细 - 草稿, 获取省份list
+     */
+    @GET("/api/Groups/EnterExitDraftProvBelongCostDataSource")
+    fun getEntryAndExitProvinceList(): Call<SelectorResponse>
+
     /**
      * 出入境费用明细 - 草稿, 获取草稿名称列表
      */
@@ -1616,8 +1632,8 @@ interface APIService {
     /**
      * 出入境费用明细 - 草稿, 获取文档列表
      */
-    @POST("/api/Groups/EnterExitCostMobileDataSource")
-    fun getDraftFileList(@Body baseRequest: BaseRequest): Call<DraftFileTypeResponse>
+    @POST("/api/Groups/EnterExitCostDraftMobileDataSource")
+    fun getDraftFileList(@Body entryAndExitDraftDocumentListRequest: EntryAndExitDraftDocumentListRequest): Call<DraftFileTypeResponse>
 
     /**
      * 出入境费用明细 - 草稿, 文档下载
@@ -1625,4 +1641,10 @@ interface APIService {
     @POST("/api/Groups/EnterExitCostDraftDownload")
     fun downloadDraftWordFile(@Body draftWordFileDownloadRequest: DraftWordFileDownloadRequest): Call<DraftWordFileDownloadResponse>
 
+    /**
+     * 出入境费用明细 - 草稿, 更新省份id
+     */
+    @POST("/api/Groups/EnterExitCostDraftMobileOpProv")
+    fun updateDraftProvinceId(@Body updateDraftProvinceIdRequest: UpdateDraftProvinceIdRequest): Call<BaseResponse>
+
 }

+ 21 - 2
app/src/main/java/com/pan_american/android/ui/efficiency_tools/require_gather/RequireGatherActivity.kt

@@ -2,8 +2,10 @@ package com.pan_american.android.ui.efficiency_tools.require_gather
 
 import android.annotation.SuppressLint
 import android.os.Bundle
+import android.view.View
 import android.webkit.WebChromeClient
 import android.webkit.WebSettings
+import android.webkit.WebView
 import android.webkit.WebViewClient
 import com.pan_american.android.OASystem
 import com.pan_american.android.R
@@ -21,13 +23,24 @@ class RequireGatherActivity : BaseActivity<ActivityRequireGatherBinding>() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
+        WebView.setWebContentsDebuggingEnabled(true)
+
         initTitle()
 
+        binding.webView.settings.apply {
+            javaScriptEnabled = true
+            domStorageEnabled = true
+            loadWithOverviewMode = true
+            allowContentAccess = true
+            mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
+            cacheMode = WebSettings.LOAD_DEFAULT
+        }
+
         binding.webView.apply {
-            settings.javaScriptEnabled = true
-            settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
+            clearCache(true)
             webViewClient = WebViewClient()
             webChromeClient = WebChromeClient()
+            setLayerType(View.LAYER_TYPE_SOFTWARE, null)
             loadUrl("http://oa.pan-american-intl.com:4399/#/MarketplacePick?userid=${OASystem.userInfo.userId}")
         }
     }
@@ -41,4 +54,10 @@ class RequireGatherActivity : BaseActivity<ActivityRequireGatherBinding>() {
             }
         }
     }
+
+    override fun onDestroy() {
+        super.onDestroy()
+
+        binding.webView.destroy()
+    }
 }

+ 2 - 2
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitFeeTotalFragment.kt

@@ -10,13 +10,13 @@ import android.widget.TextView
 import com.pan_american.android.OASystem
 import com.pan_american.android.R
 import com.pan_american.android.base.BaseFragment
-import com.pan_american.android.base.BaseRequest
 import com.pan_american.android.base.BaseResponse
 import com.pan_american.android.base.CustomAlertDialog
 import com.pan_american.android.base.ListAdapter
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.entity.EntryAndExitFileItem
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.entity.EntryAndExitPaymentPrinciple
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDetailResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDocumentListRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDocumentListResponse
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitFileDownloadRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitFileDownloadResponse
@@ -412,7 +412,7 @@ class EntryAndExitFeeTotalFragment : BaseFragment<FragmentEntryAndExitFeeTotalBi
     }
 
     private fun getDocumentList() {
-        apiService.getEntryAndExitDocumentList(BaseRequest())
+        apiService.getEntryAndExitDocumentList(EntryAndExitDocumentListRequest())
             .enqueue(object : Callback<EntryAndExitDocumentListResponse> {
                 override fun onResponse(
                     call: Call<EntryAndExitDocumentListResponse>,

+ 28 - 1
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitFeeDraftActivity.kt

@@ -48,7 +48,7 @@ class EntryAndExitFeeDraftActivity : BaseActivity<ActivityEntryAndExitFeeDraftBi
 
         initTitle()
 
-        getDraftTotal()
+        getProvinceList()
     }
 
     override fun initTitle() {
@@ -222,4 +222,31 @@ class EntryAndExitFeeDraftActivity : BaseActivity<ActivityEntryAndExitFeeDraftBi
             }
         })
     }
+
+    private fun getProvinceList() {
+
+        OASystem.entryAndExitProvinceList.clear()
+
+        apiService.getEntryAndExitProvinceList().enqueue(object : Callback<SelectorResponse> {
+            override fun onResponse(call: Call<SelectorResponse>, response: Response<SelectorResponse>) {
+
+                val listResponse = response.body()
+
+                if (listResponse != null) {
+                    if (listResponse.code == 200) {
+                        for (item in listResponse.data) {
+                            OASystem.entryAndExitProvinceList.add(item)
+                        }
+
+                        getDraftTotal()
+                    }
+                }
+
+            }
+
+            override fun onFailure(p0: Call<SelectorResponse>, p1: Throwable) {
+                showErrorInfo(R.string.province_list_get_error)
+            }
+        })
+    }
 }

+ 66 - 2
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitFeeDraftTotalFragment.kt

@@ -18,7 +18,6 @@ import androidx.recyclerview.widget.LinearLayoutManager
 import com.pan_american.android.OASystem
 import com.pan_american.android.R
 import com.pan_american.android.base.BaseFragment
-import com.pan_american.android.base.BaseRequest
 import com.pan_american.android.base.BaseResponse
 import com.pan_american.android.base.CustomAlertDialog
 import com.pan_american.android.base.ListAdapter
@@ -29,8 +28,10 @@ import com.pan_american.android.data.model.group_management.entry_and_exit_fee_d
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.DraftFileTypeResponse
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.DraftWordFileDownloadRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.DraftWordFileDownloadResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.EntryAndExitDraftDocumentListRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.EntryAndExitDraftTotalResponse
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.SynchronizeDraftToGroupRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.UpdateDraftProvinceIdRequest
 import com.pan_american.android.data.network.APIService
 import com.pan_american.android.data.network.ServiceCreator
 import com.pan_american.android.databinding.FragmentEntryAndEntryFeeDraftTotalBinding
@@ -94,6 +95,12 @@ class EntryAndExitFeeDraftTotalFragment :
             bussinessTotalPayment = 0.0
             firstClassTotalPayment = 0.0
 
+            for (item in OASystem.entryAndExitProvinceList) {
+                if (provinceId == item.id) {
+                    binding.province.text = item.name
+                }
+            }
+
             binding.draftName.text = draftName
 
             binding.checkInBoard.isChecked = choiceOne == 1
@@ -238,6 +245,38 @@ class EntryAndExitFeeDraftTotalFragment :
 
     override fun initEvents() {
 
+        binding.province.setOnClickListener {
+            showSelector {
+                val adapter = ListAdapter.Builder<Selector>().apply {
+                    setData(OASystem.entryAndExitProvinceList)
+                    setLayoutId(R.layout.item_selector)
+                    addBindView { itemView, data ->
+                        itemView.findViewById<TextView>(R.id.selector_item_name).apply {
+
+                            text = data.name
+
+                            if (OASystem.entryAndExitDraftResponse.provinceId == data.id) {
+                                setTextColor(ResourcesCompat.getColor(resources, R.color.text_color_blue, null))
+                            } else {
+                                setTextColor(ResourcesCompat.getColor(resources, R.color.text_color, null))
+                            }
+                        }
+                    }
+                }.create()
+
+                selector.adapter = adapter
+
+                adapter.onRecyclerViewItemClick = object : ListAdapter.OnRecyclerViewItemClick<Selector> {
+                    override fun onItemClick(position: Int) {
+
+                        updateDraftProvince(OASystem.entryAndExitProvinceList[position])
+
+                        popupWindow.dismiss()
+                    }
+                }
+            }
+        }
+
         binding.inBoardFee.setOnClickListener {
 
             val bundle = Bundle().apply {
@@ -658,7 +697,7 @@ class EntryAndExitFeeDraftTotalFragment :
 
         wordTypeData.clear()
 
-        apiService.getDraftFileList(BaseRequest())
+        apiService.getDraftFileList(EntryAndExitDraftDocumentListRequest())
             .enqueue(object : Callback<DraftFileTypeResponse> {
                 override fun onResponse(
                     call: Call<DraftFileTypeResponse>,
@@ -760,4 +799,29 @@ class EntryAndExitFeeDraftTotalFragment :
             }
         })
     }
+
+    private fun updateDraftProvince(province: Selector) {
+        apiService.updateDraftProvinceId(UpdateDraftProvinceIdRequest(provinceId = province.id)).enqueue(object : Callback<BaseResponse> {
+            override fun onResponse(call: Call<BaseResponse>, response: Response<BaseResponse>) {
+
+                val updateResponse = response.body()
+
+                if (updateResponse != null) {
+                    if (updateResponse.code == 200) {
+
+                        OASystem.entryAndExitDraftResponse.provinceId = province.id
+
+                        binding.province.text = province.name
+
+                    } else {
+                        showMessage(updateResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<BaseResponse>, p1: Throwable) {
+                showErrorInfo(R.string.draft_province_update_error)
+            }
+        })
+    }
 }

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

@@ -3,19 +3,33 @@ package com.pan_american.android.ui.group_management.group_info
 import android.os.Bundle
 import android.text.Editable
 import android.text.TextWatcher
+import android.view.Gravity
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.EditText
+import android.widget.LinearLayout
+import android.widget.PopupWindow
 import android.widget.TextView
 import androidx.core.content.res.ResourcesCompat
+import androidx.recyclerview.widget.LinearLayoutManager
 import com.pan_american.android.OASystem
 import com.pan_american.android.R
 import com.pan_american.android.base.BaseFragment
 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.group_management.group_info.network.GetGroupCountryListRequest
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
 import com.pan_american.android.databinding.FragmentGroupInfoBaseBinding
 import com.pan_american.android.util.MoneyInputFilter
+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 GroupInfoBaseFragment : BaseFragment<FragmentGroupInfoBaseBinding>() {
 
@@ -25,6 +39,12 @@ class GroupInfoBaseFragment : BaseFragment<FragmentGroupInfoBaseBinding>() {
 
     private var opPercentageSubLevel = listOf<String>()
 
+    private val getGroupCountryListRequest = GetGroupCountryListRequest()
+
+    private var counrtyData = ArrayList<Selector>()
+
+    private val apiService = ServiceCreator.create<APIService>()
+
     override fun getViewBinding(
         inflater: LayoutInflater, container: ViewGroup?, bundle: Bundle?
     ) = FragmentGroupInfoBaseBinding.inflate(layoutInflater, container, false)
@@ -63,6 +83,7 @@ class GroupInfoBaseFragment : BaseFragment<FragmentGroupInfoBaseBinding>() {
             groupName.setText(OASystem.groupOperationRequest.teamName)
             clientName.setText(OASystem.groupOperationRequest.clientName)
             customerDepartment.setText(OASystem.groupOperationRequest.clientUnit)
+            city.text = OASystem.groupOperationRequest.cityName
             visitCountry.setText(OASystem.groupOperationRequest.visitCountry)
             visitDate.text = OASystem.groupOperationRequest.visitDate
             visitDays.setText("${OASystem.groupOperationRequest.visitDays}")
@@ -292,6 +313,16 @@ class GroupInfoBaseFragment : BaseFragment<FragmentGroupInfoBaseBinding>() {
             }
         }
 
+        binding.city.setOnClickListener {
+            getGroupCountryListRequest.apply {
+                pageIndex = 1
+                search = ""
+            }
+
+            counrtyData.clear()
+            getGroupCountryList(1)
+        }
+
         binding.customerDepartment.addTextChangedListener(object : TextWatcher {
             override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
 
@@ -626,4 +657,223 @@ class GroupInfoBaseFragment : BaseFragment<FragmentGroupInfoBaseBinding>() {
             binding.groupName.setText(String.format(resources.getString(R.string.group_name_format), binding.customerDepartment.text, binding.visitCountry.text, binding.visitDays.text))
         }
     }
+
+    private fun getGroupCountryList(type: Int) {
+        apiService.getGroupCountryDataSource(getGroupCountryListRequest)
+            .enqueue(object :
+                Callback<SelectorResponse> {
+                override fun onResponse(
+                    call: Call<SelectorResponse>,
+                    response: Response<SelectorResponse>
+                ) {
+                    val dataResponse = response.body()
+
+                    if (dataResponse != null) {
+                        if (dataResponse.code == 200) {
+
+                            for (item in dataResponse.data) {
+                                if (OASystem.entryAndExitLastChoiceCity.id != item.id) {
+                                    counrtyData.add(item)
+                                }
+                            }
+
+                            when (type) {
+                                1 -> {
+
+                                    val popView = View.inflate(
+                                        OASystem.context,
+                                        R.layout.popup_smart_refresh_selector,
+                                        null
+                                    )
+                                    popupWindow = PopupWindow(
+                                        popView,
+                                        ViewGroup.LayoutParams.MATCH_PARENT,
+                                        ViewGroup.LayoutParams.WRAP_CONTENT
+                                    )
+
+                                    showPopupWindow {
+                                        val searchView: LinearLayout =
+                                            popView.findViewById(R.id.search_view)
+                                        searchView.visibility = View.VISIBLE
+
+                                        val searchText: EditText =
+                                            popView.findViewById(R.id.search_text)
+
+                                        selector = popView.findViewById(R.id.selector_list)
+
+                                        selectorContainer =
+                                            popView.findViewById(R.id.selector_refresh_container)
+                                        selectorContainer.setEnableRefresh(true)
+                                        selectorContainer.setEnableLoadMore(true)
+
+                                        val layoutManager = LinearLayoutManager(OASystem.context)
+                                        selector.layoutManager = layoutManager
+
+                                        val adapter =
+                                            ListAdapter.Builder<Selector>()
+                                                .apply {
+                                                    setData(counrtyData)
+                                                    setLayoutId(R.layout.item_selector)
+                                                    addBindView { itemView, data ->
+                                                        itemView.findViewById<TextView>(R.id.selector_item_name)
+                                                            .apply {
+                                                                text = data.name
+
+                                                                if (OASystem.groupOperationRequest.cityId == data.id) {
+                                                                    setTextColor(
+                                                                        ResourcesCompat.getColor(
+                                                                            resources,
+                                                                            R.color.text_color_blue,
+                                                                            null
+                                                                        )
+                                                                    )
+                                                                } else {
+                                                                    setTextColor(
+                                                                        ResourcesCompat.getColor(
+                                                                            resources,
+                                                                            R.color.text_color,
+                                                                            null
+                                                                        )
+                                                                    )
+                                                                }
+                                                            }
+                                                    }
+                                                }.create()
+
+                                        selector.adapter = adapter
+
+                                        adapter.onRecyclerViewItemClick =
+                                            object :
+                                                ListAdapter.OnRecyclerViewItemClick<Selector> {
+                                                override fun onItemClick(position: Int) {
+                                                    counrtyData[position].apply {
+                                                        binding.city.text = name
+
+                                                        OASystem.groupOperationRequest.cityId = id
+                                                    }
+
+                                                    popupWindow.dismiss()
+                                                }
+                                            }
+
+                                        selectorContainer.setOnRefreshLoadMoreListener(object :
+                                            OnRefreshLoadMoreListener {
+                                            override fun onRefresh(p0: RefreshLayout) {
+                                                getGroupCountryListRequest.pageIndex = 1
+
+                                                selector.adapter!!.notifyItemRangeRemoved(
+                                                    0,
+                                                    counrtyData.size
+                                                )
+
+                                                counrtyData.clear()
+
+                                                getGroupCountryList(2)
+                                            }
+
+                                            override fun onLoadMore(p0: RefreshLayout) {
+                                                getGroupCountryListRequest.pageIndex += 1
+
+                                                getGroupCountryList(3)
+                                            }
+                                        })
+
+                                        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(editable: Editable?) {
+
+                                                adapter.notifyItemRangeRemoved(
+                                                    0,
+                                                    counrtyData.size
+                                                )
+
+                                                counrtyData.clear()
+
+                                                getGroupCountryListRequest.apply {
+                                                    pageIndex = 1
+                                                    search = editable.toString()
+                                                }
+
+                                                getGroupCountryList(2)
+                                            }
+                                        })
+
+                                        popupWindow.showAtLocation(
+                                            binding.root,
+                                            Gravity.BOTTOM,
+                                            0,
+                                            0
+                                        )
+                                    }
+
+                                    selectorContainer.setEnableLoadMore(
+                                        getGroupCountryListRequest.pageIndex < getTotalPage(
+                                            dataResponse.count
+                                        )
+                                    )
+                                    selector.adapter!!.notifyItemInserted(0)
+                                }
+
+                                2 -> {
+                                    selectorContainer.finishRefresh()
+                                    selectorContainer.setEnableLoadMore(
+                                        getGroupCountryListRequest.pageIndex < getTotalPage(
+                                            dataResponse.count
+                                        )
+                                    )
+                                    selector.adapter!!.notifyItemInserted(0)
+                                }
+
+                                3 -> {
+                                    selectorContainer.finishLoadMore()
+                                    selectorContainer.setEnableLoadMore(
+                                        getGroupCountryListRequest.pageIndex < getTotalPage(
+                                            dataResponse.count
+                                        )
+                                    )
+                                    selector.adapter!!.notifyItemInserted(counrtyData.size)
+                                }
+                            }
+
+                        } else {
+                            showMessage(dataResponse.msg)
+                        }
+                    }
+                }
+
+                override fun onFailure(
+                    p0: Call<SelectorResponse>,
+                    p1: Throwable
+                ) {
+                    showErrorInfo(R.string.base_resource_data_get_failed)
+                }
+            })
+    }
+
+    private fun getTotalPage(count: Int): Int {
+        var pageCount = count / 10
+
+        if (count % 10 > 0) {
+            pageCount += 1
+        }
+
+        return pageCount
+    }
 }

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

@@ -374,7 +374,7 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
             }
         }
 
-        if (OASystem.userInfo.depName == "市场部") {
+        if (OASystem.userInfo.depName == "市场部" || OASystem.userInfo.userId == 233) {
             binding.requireGather.visibility = View.VISIBLE
         }
 

+ 50 - 28
app/src/main/res/layout/fragment_entry_and_entry_fee_draft_total.xml

@@ -20,38 +20,30 @@
 
             <LinearLayout
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:background="@color/white"
+                android:layout_height="70dp"
                 android:orientation="horizontal"
-                tools:ignore="UselessLeaf">
+                android:background="@color/white">
 
-                <LinearLayout
-                    android:layout_width="match_parent"
+                <TextView
+                    android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_margin="@dimen/common_padding_large"
-                    android:orientation="horizontal">
-
-                    <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_gravity="center"
-                        android:text="@string/draft_name"
-                        android:textSize="@dimen/text_size_large" />
-
-                    <TextView
-                        android:id="@+id/draft_name"
-                        android:layout_width="0dp"
-                        android:layout_height="wrap_content"
-                        android:layout_marginStart="@dimen/common_padding"
-                        android:layout_weight="1"
-                        android:gravity="end"
-                        android:importantForAutofill="no"
-                        android:singleLine="true"
-                        android:textColor="@color/text_color"
-                        android:textSize="@dimen/text_size_large" />
-
-                </LinearLayout>
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_gravity="center"
+                    android:text="@string/draft_name"
+                    android:textSize="@dimen/text_size_large"
+                    android:textStyle="bold"/>
 
+                <TextView
+                    android:id="@+id/draft_name"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:gravity="end"
+                    android:layout_gravity="center_vertical"
+                    android:singleLine="true"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_large" />
             </LinearLayout>
 
             <View
@@ -59,6 +51,36 @@
                 android:layout_height="@dimen/line"
                 android:background="@color/line_color" />
 
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="70dp"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:orientation="horizontal"
+                android:background="@color/white">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_gravity="center"
+                    android:text="@string/province"
+                    android:textSize="@dimen/text_size_large"
+                    android:textStyle="bold"/>
+
+                <TextView
+                    android:id="@+id/province"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:gravity="end"
+                    android:layout_gravity="center_vertical"
+                    android:hint="@string/please_select"
+                    android:singleLine="true"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_large" />
+            </LinearLayout>
+
             <LinearLayout
                 android:id="@+id/in_board_fee"
                 android:layout_width="match_parent"

+ 34 - 0
app/src/main/res/layout/fragment_group_info_base.xml

@@ -243,6 +243,40 @@
                     android:textSize="@dimen/text_size_medium" />
             </LinearLayout>
 
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/city"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:id="@+id/city"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_select"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+            </LinearLayout>
+
             <View
                 android:layout_width="match_parent"
                 android:layout_height="@dimen/line"

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

@@ -1434,6 +1434,10 @@
 
     <string name="draft_document_generated">文档已生成, 点击确认跳转至浏览器下载\n\n草稿名称: %s\n\n文档类型: %s</string>
 
+    <string name="province_list_get_error">省份列表获取失败</string>
+
+    <string name="draft_province_update_error">草稿城市归属更新失败</string>
+
     <!-- 客户分布图 -->
     <string name="customer_distribution_map">客户分布图</string>