diff --git a/app/build.gradle b/app/build.gradle index 970a491..b14dca1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -231,5 +231,10 @@ dependencies { implementation 'com.tencent:mmkv:1.3.9' // BRVAH https://github.com/CymChad/BaseRecyclerViewAdapterHelper/wiki implementation "io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4" + // 上拉刷新下拉加载:https://github.com/scwang90/SmartRefreshLayout + implementation 'io.github.scwang90:refresh-layout-kernel:2.0.6' //核心必须依赖 + implementation 'io.github.scwang90:refresh-header-material:2.0.6' //谷歌刷新头 +// implementation 'io.github.scwang90:refresh-header-classics:2.0.6' //经典刷新头 + implementation 'io.github.scwang90:refresh-footer-classics:2.0.6' //经典加载 } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bf806f6..d42ea38 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,6 +59,7 @@ android:name=".ui.MainActivity" android:exported="true" android:label="@string/app_name" + android:launchMode="singleTask" android:windowSoftInputMode="adjustResize|stateHidden" /> + + MaterialHeader(context) + } + // 设置全局的 Footer 构建器 + SmartRefreshLayout.setDefaultRefreshFooterCreator { context: Context?, _: RefreshLayout? -> + ClassicsFooter(context).setDrawableSize(20f) + } } private fun initDatabase() { diff --git a/app/src/main/java/com/project/survey/constants/Constants.kt b/app/src/main/java/com/project/survey/constants/Constants.kt index 8eca19b..494cd29 100644 --- a/app/src/main/java/com/project/survey/constants/Constants.kt +++ b/app/src/main/java/com/project/survey/constants/Constants.kt @@ -1,6 +1,7 @@ package com.project.survey.constants object Constants { + const val PAGE_SIZE = 30 } @@ -8,12 +9,14 @@ object SPConstants { const val TOKEN = "token" const val ACCOUNT = "account" const val MOBILE_PHONE = "mobilePhone" + const val PERSON_ID = "personId" const val RECENTLY_PROJECT = "recentlyProject" const val PROJECT_ID = "projectId" const val PROJECT_NAME = "projectName" + const val CURRENT_PROJECT = "currentProject" } -object EventConstants{ +object EventConstants { const val LOGIN_STATUS = "loginStatus" } \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/extend/ViewExt.kt b/app/src/main/java/com/project/survey/extend/ViewExt.kt index f7b947b..d8c33c6 100644 --- a/app/src/main/java/com/project/survey/extend/ViewExt.kt +++ b/app/src/main/java/com/project/survey/extend/ViewExt.kt @@ -1,6 +1,7 @@ package com.project.survey.extend import android.view.View +import com.scwang.smart.refresh.layout.SmartRefreshLayout /** @@ -24,4 +25,9 @@ fun View.isVisibleOrInvisible(visible: Boolean){ fun View.isVisibleOrGone(visible: Boolean){ this.visibility = if (visible) View.VISIBLE else View.GONE +} + +fun SmartRefreshLayout.smartDismiss() { + finishRefresh(0) + finishLoadMore(0) } \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/logic/repository/GlobalRepository.kt b/app/src/main/java/com/project/survey/logic/repository/GlobalRepository.kt new file mode 100644 index 0000000..12dff9e --- /dev/null +++ b/app/src/main/java/com/project/survey/logic/repository/GlobalRepository.kt @@ -0,0 +1,12 @@ +package com.project.survey.logic.repository + +import androidx.lifecycle.MutableLiveData +import com.project.survey.model.LoginBean +import com.project.survey.model.ProjectBean + +class GlobalRepository { + + val loginBean = MutableLiveData() + + val currentProject = MutableLiveData() +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/logic/viewmodel/BaseViewModel.kt b/app/src/main/java/com/project/survey/logic/viewmodel/BaseViewModel.kt index 1016066..06eca7e 100644 --- a/app/src/main/java/com/project/survey/logic/viewmodel/BaseViewModel.kt +++ b/app/src/main/java/com/project/survey/logic/viewmodel/BaseViewModel.kt @@ -7,6 +7,7 @@ import blankj.utilcode.util.LogUtils import com.project.survey.extend.toast import com.project.survey.logic.event.LiveBus import com.project.survey.logic.event.Message +import com.project.survey.logic.repository.GlobalRepository import com.project.survey.network.ERROR import com.project.survey.ui.login.LoginActivity import com.project.survey.util.ActivityNavUtil @@ -19,6 +20,8 @@ import retrofit2.HttpException open class BaseViewModel : ViewModel() { + val repo: GlobalRepository = GlobalRepository() + val msgEvent by lazy { LiveBus.getInstance().with(Message::class.java) } val errorResponse = MutableLiveData() diff --git a/app/src/main/java/com/project/survey/logic/viewmodel/ControlNetViewModel.kt b/app/src/main/java/com/project/survey/logic/viewmodel/ControlNetViewModel.kt index b30b7b3..c28a41f 100644 --- a/app/src/main/java/com/project/survey/logic/viewmodel/ControlNetViewModel.kt +++ b/app/src/main/java/com/project/survey/logic/viewmodel/ControlNetViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import com.project.survey.constants.SPConstants import com.project.survey.logic.bean.ListResult +import com.project.survey.logic.repository.GlobalRepository import com.project.survey.model.ApprovalBean import com.project.survey.model.ControlNetBean import com.project.survey.model.ControlNetCGBean @@ -23,15 +24,18 @@ class ControlNetViewModel : BaseViewModel() { /** * 获取专用控制网列表 */ - fun fetchSpecialControlNetList(j_query: String, page: Int = 1) { + fun fetchSpecialControlNetList(j_query: String, page: Int = 1, start: Int = 0) { launch { + val currentProject = + SPUtils.getParcelable(SPConstants.CURRENT_PROJECT, ProjectBean::class.java) val res = api.fetchSpecialControlNetList( - SPUtils.getString(SPConstants.PROJECT_ID) ?: "", + currentProject?.BD_XMXX_ID ?: "", "BD_KZW", "BD_KZW_ZY", j_query, - page + page, + start = start ) if (res.success) { _controlNetListResponse.postValue(res.data) @@ -46,14 +50,17 @@ class ControlNetViewModel : BaseViewModel() { /** * 获取专用控制网成果列表 */ - fun fetchSpecialControlNetCGList(j_query: String, page: Int = 1) { + fun fetchSpecialControlNetCGList(j_query: String, page: Int = 1, start: Int = 0) { launch { - var res = api.fetchSpecialControlNetCGList( - SPUtils.getString(SPConstants.PROJECT_ID) ?: "", + val currentProject = + SPUtils.getParcelable(SPConstants.CURRENT_PROJECT, ProjectBean::class.java) + val res = api.fetchSpecialControlNetCGList( + currentProject?.BD_XMXX_ID ?: "", "BD_KZWZBCG", "BD_KZWZBCG_ZY", j_query, - page + page, + start = start ) if (res.success) { _controlNetCGListResponse.postValue(res.data) @@ -64,14 +71,17 @@ class ControlNetViewModel : BaseViewModel() { /** * 获取首级控制网列表 */ - fun fetchFirstControlNetList(j_query: String, page: Int = 1) { + fun fetchFirstControlNetList(j_query: String, page: Int = 1, start: Int = 0) { launch { - var res = api.fetchSpecialControlNetCGList( - SPUtils.getString(SPConstants.PROJECT_ID) ?: "", + val currentProject = + SPUtils.getParcelable(SPConstants.CURRENT_PROJECT, ProjectBean::class.java) + val res = api.fetchSpecialControlNetCGList( + currentProject?.BD_XMXX_ID ?: "", "BD_KZWZBCG", "BD_KZWZBCG", j_query, - page + page, + start = start ) if (res.success) { _controlNetCGListResponse.postValue(res.data) diff --git a/app/src/main/java/com/project/survey/logic/viewmodel/LoginViewModel.kt b/app/src/main/java/com/project/survey/logic/viewmodel/LoginViewModel.kt index 1cdcedf..5e1e60b 100644 --- a/app/src/main/java/com/project/survey/logic/viewmodel/LoginViewModel.kt +++ b/app/src/main/java/com/project/survey/logic/viewmodel/LoginViewModel.kt @@ -7,10 +7,12 @@ import com.project.survey.constants.EventConstants import com.project.survey.constants.SPConstants import com.project.survey.model.LoginBean import com.project.survey.logic.event.Message +import com.project.survey.logic.repository.GlobalRepository import com.project.survey.network.RetrofitClient import com.project.survey.ui.MainActivity import com.project.survey.ui.login.LoginActivity import com.project.survey.ui.login.LoginInputCodeActivity +import com.project.survey.ui.project.ProjectListActivity import com.project.survey.util.SPUtils class LoginViewModel : BaseViewModel() { @@ -43,18 +45,23 @@ class LoginViewModel : BaseViewModel() { /** * 外部用户登录 */ - fun externalPersonLogin(account: String, password: String, code: String){ + fun externalPersonLogin(account: String, password: String, code: String) { launch { val res = api.externalPersonLogin(account, password, code) if (res.success) { // _externalPersonSMSCodeResponse.postValue(res.data) - SPUtils.put(SPConstants.TOKEN, res.data.token) SPUtils.put(SPConstants.ACCOUNT, account) + SPUtils.put(SPConstants.TOKEN, res.data.token) + SPUtils.put(SPConstants.PERSON_ID, res.data.personId) SPUtils.put(SPConstants.MOBILE_PHONE, res.data.mobilePhone) + msgEvent.postValue(Message(EventConstants.LOGIN_STATUS)) - MainActivity.start() +// MainActivity.start() + // 登录成功,进入工程列表页面 + ProjectListActivity.start() + ActivityUtils.finishActivity(LoginActivity::class.java) ActivityUtils.finishActivity(LoginInputCodeActivity::class.java) } diff --git a/app/src/main/java/com/project/survey/logic/viewmodel/MainViewModel.kt b/app/src/main/java/com/project/survey/logic/viewmodel/MainViewModel.kt new file mode 100644 index 0000000..191e6fd --- /dev/null +++ b/app/src/main/java/com/project/survey/logic/viewmodel/MainViewModel.kt @@ -0,0 +1,11 @@ +package com.project.survey.logic.viewmodel + +import com.project.survey.network.RetrofitClient + +class MainViewModel : BaseViewModel() { + + val api = RetrofitClient.createApiService() + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/logic/viewmodel/ProjectViewModel.kt b/app/src/main/java/com/project/survey/logic/viewmodel/ProjectViewModel.kt index a045a1b..b1b0889 100644 --- a/app/src/main/java/com/project/survey/logic/viewmodel/ProjectViewModel.kt +++ b/app/src/main/java/com/project/survey/logic/viewmodel/ProjectViewModel.kt @@ -2,9 +2,11 @@ package com.project.survey.logic.viewmodel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import com.project.survey.constants.SPConstants import com.project.survey.model.ApprovalBean import com.project.survey.model.ProjectBean import com.project.survey.network.RetrofitClient +import com.project.survey.util.SPUtils class ProjectViewModel : BaseViewModel() { @@ -18,9 +20,9 @@ class ProjectViewModel : BaseViewModel() { /** * 获取用户在工作的所以项目的信息 */ - fun getAllProjectIDByAccount(account: String) { + fun fetchProjectList() { launch { - val res = api.getAllProjectIDByAccount(account) + val res = api.fetchProjectList(SPUtils.getString(SPConstants.PERSON_ID) ?: "") if (res.success) { _projectResponse.postValue(res.data) } @@ -34,9 +36,11 @@ class ProjectViewModel : BaseViewModel() { /** * 获取流程审批列表 */ - fun fetchWorkTask(projectId: String, type: String, page: Int = 1) { + fun fetchWorkTask(type: String, page: Int = 1) { launch { - val res = api.fetchWorkTask(projectId, type, page) + val currentProject = + SPUtils.getParcelable(SPConstants.CURRENT_PROJECT, ProjectBean::class.java) + val res = api.fetchWorkTask(currentProject?.BD_XMXX_ID ?: "", type, page) if (res.success) { _workTaskListResponse.postValue(res.data.data.rows) } diff --git a/app/src/main/java/com/project/survey/model/LoginBean.kt b/app/src/main/java/com/project/survey/model/LoginBean.kt index fafbde5..06a5060 100644 --- a/app/src/main/java/com/project/survey/model/LoginBean.kt +++ b/app/src/main/java/com/project/survey/model/LoginBean.kt @@ -1,6 +1,14 @@ package com.project.survey.model +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize + +/** + * {"token":"a52e6940-34c9-4f93-8a60-5b13bf25693f","mobilePhone":"15903684576","personId":"fqwerfqergqwer"} + */ +@Parcelize data class LoginBean( val token: String, - val mobilePhone: String -) + val mobilePhone: String, + val personId: String +) : Parcelable diff --git a/app/src/main/java/com/project/survey/model/ProjectBean.kt b/app/src/main/java/com/project/survey/model/ProjectBean.kt index 5822a83..81c4b90 100644 --- a/app/src/main/java/com/project/survey/model/ProjectBean.kt +++ b/app/src/main/java/com/project/survey/model/ProjectBean.kt @@ -1,5 +1,8 @@ package com.project.survey.model +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize + //{ // "XMXX_PILENO": "20221111", // "XMXX_INDUSTRYTYPE": "水电工程", @@ -27,6 +30,7 @@ package com.project.survey.model // "SY_ORG_ID": null, // "XMXX_NAME": "测试项目" //} +@Parcelize data class ProjectBean( val XMXX_NAME: String, //项目名称 val XMXX_CODE: String, //项目编号 @@ -40,4 +44,4 @@ data class ProjectBean( val XMXX_FILE: String?, //项目图片 val XMXX_DESCRIPTION: String?, //项目图片 val BD_XMXX_ID: String?, -) \ No newline at end of file +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/network/Api.kt b/app/src/main/java/com/project/survey/network/Api.kt index 58433eb..d50d00d 100644 --- a/app/src/main/java/com/project/survey/network/Api.kt +++ b/app/src/main/java/com/project/survey/network/Api.kt @@ -1,7 +1,6 @@ package com.project.survey.network import com.project.survey.logic.bean.ListResult -import com.project.survey.model.ApprovalBean import com.project.survey.model.ApprovalResponse import com.project.survey.model.ControlNetBean import com.project.survey.model.ControlNetCGBean @@ -48,9 +47,9 @@ interface Api { /** * 获取用户可访问的所有项目的信息 */ - @GET("je/project/getAllProjectIDByAccount") - suspend fun getAllProjectIDByAccount( - @Query("account") account: String + @GET("je/project/getAllProjectIDByPersonId") + suspend fun fetchProjectList( + @Query("personId") personId: String ): HttpResult> // /** @@ -95,7 +94,8 @@ interface Api { @Field("funcCode") funcCode: String, @Field("j_query") j_query: String, @Field("page") page: Int, - @Field("limit") limit: Int = 30 + @Field("limit") limit: Int = 30, + @Field("start") start: Int = 0 ): HttpResult> /** @@ -110,6 +110,7 @@ interface Api { @Field("funcCode") funcCode: String, @Field("j_query") j_query: String = "", @Field("page") page: Int, - @Field("limit") limit: Int = 30 + @Field("limit") limit: Int = 30, + @Field("start") start: Int = 0 ): HttpResult> } \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/ui/MainActivity.kt b/app/src/main/java/com/project/survey/ui/MainActivity.kt index 6f91f26..747d8a1 100644 --- a/app/src/main/java/com/project/survey/ui/MainActivity.kt +++ b/app/src/main/java/com/project/survey/ui/MainActivity.kt @@ -1,7 +1,9 @@ package com.project.survey.ui +import androidx.activity.viewModels import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentPagerAdapter +import androidx.fragment.app.viewModels import androidx.viewpager.widget.ViewPager import blankj.utilcode.util.AppUtils import com.bingce.AppChannel @@ -11,12 +13,16 @@ import com.bingce.utils.RegisterUtil import com.bingce.utils.SdkUtils import com.flyco.tablayout.listener.OnTabSelectListener import com.project.survey.R +import com.project.survey.constants.SPConstants import com.project.survey.databinding.ActivityMainBinding +import com.project.survey.logic.viewmodel.MainViewModel +import com.project.survey.model.ProjectBean import com.project.survey.ui.base.BaseBindingActivity import com.project.survey.ui.home.HomeFragment import com.project.survey.ui.home.InstrumentFragment import com.project.survey.ui.home.MeFragment import com.project.survey.util.ActivityNavUtil +import com.project.survey.util.SPUtils /** * 主页 @@ -31,6 +37,8 @@ class MainActivity : BaseBindingActivity() { override fun getBinding(): ActivityMainBinding = ActivityMainBinding.inflate(layoutInflater) + private val viewModel: MainViewModel by viewModels() + override fun initView() { SdkUtils.verify( this, @@ -50,6 +58,7 @@ class MainActivity : BaseBindingActivity() { } override fun initData() { + } override fun initListener() { diff --git a/app/src/main/java/com/project/survey/ui/SplashActivity.kt b/app/src/main/java/com/project/survey/ui/SplashActivity.kt index 314cc0c..1d66284 100644 --- a/app/src/main/java/com/project/survey/ui/SplashActivity.kt +++ b/app/src/main/java/com/project/survey/ui/SplashActivity.kt @@ -1,9 +1,15 @@ package com.project.survey.ui +import androidx.activity.viewModels +import androidx.fragment.app.viewModels import com.project.survey.constants.SPConstants import com.project.survey.databinding.ActivitySplashBinding +import com.project.survey.logic.viewmodel.MainViewModel +import com.project.survey.model.LoginBean +import com.project.survey.model.ProjectBean import com.project.survey.ui.base.BaseBindingActivity import com.project.survey.ui.login.LoginActivity +import com.project.survey.ui.project.ProjectListActivity import com.project.survey.util.SPUtils /** @@ -13,6 +19,8 @@ class SplashActivity : BaseBindingActivity() { override fun getBinding(): ActivitySplashBinding = ActivitySplashBinding.inflate(layoutInflater) + private val viewModel: MainViewModel by viewModels() + override fun initView() { } @@ -21,7 +29,22 @@ class SplashActivity : BaseBindingActivity() { if (SPUtils.getString(SPConstants.TOKEN).isNullOrBlank()) { LoginActivity.start() } else { - MainActivity.start() + val currentProject = + SPUtils.getParcelable(SPConstants.CURRENT_PROJECT, ProjectBean::class.java) +// SPUtils.getParcelable(SPConstants.CURRENT_PROJECT, ProjectBean::class.java) +// ?.let { project -> +// viewModel.repo.currentProject.postValue(project) +// MainActivity.start() +// } ?: { +// //未选择工程 +// ProjectListActivity.start() +// } + if (currentProject == null) { + //未选择工程 + ProjectListActivity.start() + } else { + MainActivity.start() + } } finish() } diff --git a/app/src/main/java/com/project/survey/ui/approval/ApprovalActivity.kt b/app/src/main/java/com/project/survey/ui/approval/ApprovalActivity.kt index f0e6eb4..14cabd6 100644 --- a/app/src/main/java/com/project/survey/ui/approval/ApprovalActivity.kt +++ b/app/src/main/java/com/project/survey/ui/approval/ApprovalActivity.kt @@ -6,21 +6,22 @@ import com.bingce.surveyor.agentweb.AgentWebActivity import com.project.survey.BuildConfig import com.project.survey.R import com.project.survey.constants.SPConstants -import com.project.survey.ui.base.BaseBindingActivity import com.project.survey.databinding.ActivityApprovalBinding -import com.project.survey.extend.toast +import com.project.survey.extend.smartDismiss import com.project.survey.logic.viewmodel.ProjectViewModel import com.project.survey.ui.approval.adapter.ApprovalAdapter +import com.project.survey.ui.base.BaseBindingActivity import com.project.survey.util.ActivityNavUtil import com.project.survey.util.SPUtils import com.project.survey.util.param.Param -import com.project.survey.widget.LoadingDialog import com.project.survey.widget.decoration.TransparentDividerDecoration +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener /** * 待处理,已处理,已发起 */ -class ApprovalActivity : BaseBindingActivity() { +class ApprovalActivity : BaseBindingActivity(), OnRefreshLoadMoreListener { companion object { const val PI_PREAPPROV = "PI_PREAPPROV"//待处理 @@ -44,14 +45,17 @@ class ApprovalActivity : BaseBindingActivity() { private lateinit var type: String private val adapter by lazy { ApprovalAdapter() } + private var currentPage = 1 override fun initView() { - val title = when (type) { - PI_PREAPPROV -> "待处理" - PI_APPROVED -> "已处理" - else -> "已发起" - } - immersionToolbar(mBinding.ilToolBar.toolbar, title) + immersionToolbar( + mBinding.ilToolBar.toolbar, + when (type) { + PI_PREAPPROV -> "待处理" + PI_APPROVED -> "已处理" + else -> "已发起" + } + ) // val beginTransaction = supportFragmentManager.beginTransaction() // val fragemnt = when (type) { // PI_PREAPPROV -> ApprovalWaitFragment() @@ -64,6 +68,7 @@ class ApprovalActivity : BaseBindingActivity() { // beginTransaction.replace(R.id.container, fragemnt) // beginTransaction.commit() + mBinding.smartRefreshLayout.setOnRefreshLoadMoreListener(this) mBinding.recyclerView.addItemDecoration(TransparentDividerDecoration(this)) mBinding.recyclerView.adapter = adapter adapter.isStateViewEnable = true @@ -71,12 +76,29 @@ class ApprovalActivity : BaseBindingActivity() { } override fun initData() { - viewModel.errorResponse.observe(this){ + viewModel.errorResponse.observe(this) { + mBinding.smartRefreshLayout.smartDismiss() } viewModel.workTaskListResponse.observe(this) { - adapter.submitList(it, type) + mBinding.smartRefreshLayout.smartDismiss() + if (currentPage == 1) { + adapter.submitList(it, type) + if (it.isEmpty()) { + mBinding.smartRefreshLayout.finishLoadMoreWithNoMoreData() + adapter.setStateViewLayout(this, R.layout.layout_no_data) + } else { + currentPage++ + } + } else { + if (it.isEmpty()) { + mBinding.smartRefreshLayout.finishLoadMoreWithNoMoreData() + } else { + adapter.addAll(it) + currentPage++ + } + } } - viewModel.fetchWorkTask(SPUtils.getString(SPConstants.PROJECT_ID) ?: "", type) + // if (type == PI_PREAPPROV) { // viewModel.fetchWorkTask(SPUtils.getString(SPConstants.PROJECT_ID) ?: "", type) // } else if(type == PI_APPROVED) { @@ -86,11 +108,24 @@ class ApprovalActivity : BaseBindingActivity() { // } } + private fun fetchData() { + viewModel.fetchWorkTask(type) + } + + override fun onRefresh(refreshLayout: RefreshLayout) { + currentPage = 1 + fetchData() + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + fetchData() + } + override fun initListener() { adapter.setOnItemClickListener { _, _, position -> adapter.getItem(position)?.let { bean -> // http://10.190.183.37/app/micro/func/#/pages/func/form/{功能编码}/{流程ID}?authorization={登录token}&appId=2024-0926-1104-0165 - val token = SPUtils.getString(SPConstants.TOKEN)?:"" + val token = SPUtils.getString(SPConstants.TOKEN) ?: "" val url = BuildConfig.BASE_URL + "app/micro/func/#/pages/func/form/${bean.funcCode}/${bean.pkValue}?authorization=${token}&appId=2024-0926-1104-0165" AgentWebActivity.navigation2(this, Uri.parse(url)) diff --git a/app/src/main/java/com/project/survey/ui/controlnet/ControlNetFirstListActivity.kt b/app/src/main/java/com/project/survey/ui/controlnet/ControlNetFirstListActivity.kt index 1d4c611..6ba787d 100644 --- a/app/src/main/java/com/project/survey/ui/controlnet/ControlNetFirstListActivity.kt +++ b/app/src/main/java/com/project/survey/ui/controlnet/ControlNetFirstListActivity.kt @@ -1,24 +1,24 @@ package com.project.survey.ui.controlnet -import android.content.Context -import android.content.Intent import androidx.activity.viewModels import com.project.survey.R -import com.project.survey.adapter.ControlNetFirstListAdapter +import com.project.survey.constants.Constants import com.project.survey.databinding.ActivityControlNetListBinding +import com.project.survey.extend.smartDismiss import com.project.survey.logic.viewmodel.ControlNetViewModel -import com.project.survey.model.ControlNetListBean import com.project.survey.model.ControlNetVersionBean import com.project.survey.ui.base.BaseBindingActivity import com.project.survey.ui.controlnet.adapter.ControlNetFirstAdapter import com.project.survey.util.ActivityNavUtil import com.project.survey.widget.decoration.TransparentDividerDecoration +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener /** * 首级控制网列表 */ -class ControlNetFirstListActivity : BaseBindingActivity() { - +class ControlNetFirstListActivity : BaseBindingActivity(), + OnRefreshLoadMoreListener { companion object { fun start() { @@ -34,14 +34,18 @@ class ControlNetFirstListActivity : BaseBindingActivity() { +class ControlNetSpecialListActivity : BaseBindingActivity(), + OnRefreshLoadMoreListener { companion object { fun start() { @@ -30,11 +34,14 @@ class ControlNetSpecialListActivity : BaseBindingActivity + adapter.getItem(position)?.let { bean -> + ControlPointActivity.start() + } + } } private fun initVersion() { diff --git a/app/src/main/java/com/project/survey/ui/controlnet/ControlPointActivity.kt b/app/src/main/java/com/project/survey/ui/controlnet/ControlPointActivity.kt new file mode 100644 index 0000000..98d078a --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/controlnet/ControlPointActivity.kt @@ -0,0 +1,110 @@ +package com.project.survey.ui.controlnet + +import androidx.activity.viewModels +import com.project.survey.R +import com.project.survey.constants.SPConstants +import com.project.survey.databinding.ActivityControlNetListBinding +import com.project.survey.extend.smartDismiss +import com.project.survey.logic.viewmodel.ControlNetViewModel +import com.project.survey.model.ControlNetVersionBean +import com.project.survey.ui.base.BaseBindingActivity +import com.project.survey.ui.controlnet.adapter.ControlNetFirstAdapter +import com.project.survey.ui.controlnet.adapter.ControlNetSpecialAdapter +import com.project.survey.util.ActivityNavUtil +import com.project.survey.util.SPUtils +import com.project.survey.widget.decoration.TransparentDividerDecoration +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener + +/** + * 控制点详情 + */ +class ControlPointActivity : BaseBindingActivity(), + OnRefreshLoadMoreListener { + + companion object { + fun start() { + ActivityNavUtil.startActivity { } + } + } + + override fun getBinding(): ActivityControlNetListBinding = + ActivityControlNetListBinding.inflate(layoutInflater) + + private val viewModel: ControlNetViewModel by viewModels() + + private val adapter by lazy { ControlNetFirstAdapter() } + private var currentPage = 1 + private var start = 0 + + override fun initView() { + immersionToolbar(mBinding.ilToolBar.toolbar, "控制点详情") + + initVersion() + + mBinding.smartRefreshLayout.setOnRefreshLoadMoreListener(this) + mBinding.recyclerView.addItemDecoration(TransparentDividerDecoration(this)) + mBinding.recyclerView.adapter = adapter + adapter.isStateViewEnable = true + adapter.setStateViewLayout(this, R.layout.layout_no_data) + } + + override fun initData() { + viewModel.errorResponse.observe(this) { + mBinding.smartRefreshLayout.smartDismiss() + } + viewModel.controlNetCGListResponse.observe(this) { + mBinding.smartRefreshLayout.smartDismiss() + if (currentPage == 1) { + adapter.submitList(it.rows) + if (it.rows.isEmpty()) { + mBinding.smartRefreshLayout.finishLoadMoreWithNoMoreData() + adapter.setStateViewLayout(this, R.layout.layout_no_data) + } else { + currentPage++ + start += it.totalCount + } + } else { + if (it.rows.isEmpty()) { + mBinding.smartRefreshLayout.finishLoadMoreWithNoMoreData() + } else { + adapter.addAll(it.rows) + currentPage++ + start += it.totalCount + } + } + } + fetchData() + } + + private fun fetchData(){ + viewModel.fetchSpecialControlNetCGList("", currentPage, start) + } + + override fun onRefresh(refreshLayout: RefreshLayout) { + currentPage = 0 + start = 0 + fetchData() + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + fetchData() + } + + override fun initListener() { + + } + + private fun initVersion() { + val versionList = mutableListOf() + versionList.add(ControlNetVersionBean("版本一")) + versionList.add(ControlNetVersionBean("版本二")) + versionList.add(ControlNetVersionBean("版本三")) + + mBinding.ilSearch.spinner.setItems(versionList) + } + + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/ui/home/HomeFragment.kt b/app/src/main/java/com/project/survey/ui/home/HomeFragment.kt index 96a9217..d688f89 100644 --- a/app/src/main/java/com/project/survey/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/project/survey/ui/home/HomeFragment.kt @@ -2,9 +2,12 @@ package com.project.survey.ui.home import android.view.LayoutInflater import android.view.ViewGroup +import androidx.fragment.app.viewModels import com.project.survey.constants.SPConstants import com.project.survey.databinding.FragmentHomeBinding import com.project.survey.extend.setOnClickNoRepeatListener +import com.project.survey.logic.viewmodel.MainViewModel +import com.project.survey.model.ProjectBean import com.project.survey.ui.approval.ApprovalActivity import com.project.survey.ui.base.BaseBindingFragment import com.project.survey.ui.controlnet.ControlNetFirstListActivity @@ -22,11 +25,15 @@ class HomeFragment : BaseBindingFragment() { return FragmentHomeBinding.inflate(inflater, container, false) } + private val viewModel: MainViewModel by viewModels() + override fun initView() { - mBinding.tvProject.text = SPUtils.getString(SPConstants.PROJECT_NAME) } override fun initData() { + val currentProject = + SPUtils.getParcelable(SPConstants.CURRENT_PROJECT, ProjectBean::class.java) + mBinding.tvProject.text = currentProject?.XMXX_NAME // mBinding.itemToBeProcessed.setBadge(4) } diff --git a/app/src/main/java/com/project/survey/ui/home/InstrumentFragment.kt b/app/src/main/java/com/project/survey/ui/home/InstrumentFragment.kt index 874cdbb..ac2c2f9 100644 --- a/app/src/main/java/com/project/survey/ui/home/InstrumentFragment.kt +++ b/app/src/main/java/com/project/survey/ui/home/InstrumentFragment.kt @@ -3,6 +3,7 @@ package com.project.survey.ui.home import android.content.Intent import android.view.LayoutInflater import android.view.ViewGroup +import androidx.fragment.app.viewModels import blankj.utilcode.util.AppUtils import com.bingce.device.Device import com.bingce.device.enums.ConnectTypeEnum @@ -12,9 +13,12 @@ import com.bingce.device.ui.ConnectTSActivity import com.bingce.rtk.command.RTK import com.bingce.rtk.config.GnssConfigManager import com.project.survey.R +import com.project.survey.constants.SPConstants import com.project.survey.databinding.FragmentInstrumentBinding import com.project.survey.extend.setOnClickNoRepeatListener import com.project.survey.extend.toast +import com.project.survey.logic.viewmodel.MainViewModel +import com.project.survey.model.ProjectBean import com.project.survey.ui.base.BaseBindingFragment import com.project.survey.ui.instrument.basestationtranslation.RtkBaseCorrectActivity import com.project.survey.ui.instrument.coordinatesystem.BingCeCoordinateSystemActivity @@ -23,6 +27,7 @@ import com.project.survey.ui.instrument.mobilestationmode.base.RtkPointCorrectAc import com.project.survey.ui.instrument.satellitosis.SatelliteStatusActivity import com.project.survey.ui.instrument.setupstation.InstrumentSetFragmentSetupStationTypeUtils import com.project.survey.util.ActivityNavUtil +import com.project.survey.util.SPUtils /** * 仪器 @@ -34,12 +39,16 @@ class InstrumentFragment : BaseBindingFragment() { container: ViewGroup? ): FragmentInstrumentBinding = FragmentInstrumentBinding.inflate(inflater, container, false) + private val viewModel: MainViewModel by viewModels() + override fun initView() { } override fun initData() { -// mBinding.tvProject.text = "哈哈哈哈哈" + val currentProject = + SPUtils.getParcelable(SPConstants.CURRENT_PROJECT, ProjectBean::class.java) + mBinding.tvProject.text = currentProject?.XMXX_NAME } override fun initListener() { diff --git a/app/src/main/java/com/project/survey/ui/home/MeFragment.kt b/app/src/main/java/com/project/survey/ui/home/MeFragment.kt index 96ad11f..c29a972 100644 --- a/app/src/main/java/com/project/survey/ui/home/MeFragment.kt +++ b/app/src/main/java/com/project/survey/ui/home/MeFragment.kt @@ -13,11 +13,14 @@ import com.project.survey.databinding.FragmentMeBinding import com.project.survey.extend.setOnClickNoRepeatListener import com.project.survey.logic.event.Message import com.project.survey.logic.viewmodel.LoginViewModel +import com.project.survey.logic.viewmodel.MainViewModel +import com.project.survey.model.ProjectBean import com.project.survey.ui.MainActivity import com.project.survey.ui.base.BaseBindingFragment import com.project.survey.ui.login.LoginActivity import com.project.survey.ui.project.ProjectListActivity import com.project.survey.util.ActivityNavUtil +import com.project.survey.util.LogoutUtil import com.project.survey.util.SPUtils /** @@ -25,19 +28,20 @@ import com.project.survey.util.SPUtils */ class MeFragment : BaseBindingFragment() { - private val viewModel: LoginViewModel by viewModels() override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentMeBinding = FragmentMeBinding.inflate(inflater, container, false) + private val viewModel: MainViewModel by viewModels() + override fun initView() { } override fun initData() { + val currentProject = + SPUtils.getParcelable(SPConstants.CURRENT_PROJECT, ProjectBean::class.java) + mBinding.tvProject.text = currentProject?.XMXX_NAME mBinding.tvName.text = SPUtils.getString(SPConstants.ACCOUNT) -// viewModel.msgEvent.observe(this) { -// updateUIByData() -// } if (BuildConfig.DEBUG) { mBinding.tvVersion.text = BuildConfig.VERSION_NAME } @@ -58,9 +62,7 @@ class MeFragment : BaseBindingFragment() { .negativeText("取消") .positiveText("退出") .onPositive { _, _ -> - SPUtils.removeKey(SPConstants.TOKEN) - SPUtils.removeKey(SPConstants.ACCOUNT) - SPUtils.removeKey(SPConstants.MOBILE_PHONE) + LogoutUtil.clearSP() ActivityNavUtil.finishActivity() ActivityNavUtil.startActivity { } // viewModel.msgEvent.postValue(Message(EventConstants.LOGIN_STATUS)) diff --git a/app/src/main/java/com/project/survey/ui/login/LoginActivity.kt b/app/src/main/java/com/project/survey/ui/login/LoginActivity.kt index 863f754..59baccd 100644 --- a/app/src/main/java/com/project/survey/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/project/survey/ui/login/LoginActivity.kt @@ -77,7 +77,6 @@ class LoginActivity : BaseBindingActivity() { } if (isOutLogin) { // 外部账号登录 - viewModel.fetchExternalPersonSMSCode(account, password) } else { toast("开发中……") diff --git a/app/src/main/java/com/project/survey/ui/login/LoginInputCodeActivity.kt b/app/src/main/java/com/project/survey/ui/login/LoginInputCodeActivity.kt index b41d4d2..454df54 100644 --- a/app/src/main/java/com/project/survey/ui/login/LoginInputCodeActivity.kt +++ b/app/src/main/java/com/project/survey/ui/login/LoginInputCodeActivity.kt @@ -38,13 +38,13 @@ class LoginInputCodeActivity : BaseBindingActivity() { +class ProjectListActivity : BaseBindingActivity(), OnRefreshListener { companion object { fun start() { @@ -28,7 +37,7 @@ class ProjectListActivity : BaseBindingActivity() { private val adapter by lazy { ProjectListAdapter() } override fun initView() { - immersionToolbar(mBinding.ilToolBar.toolbar, "项目列表") + immersionToolbar(mBinding.toolbar, "项目列表") // ImmersionBar.with(this) // .statusBarDarkFont(true) // .titleBarMarginTop(mBinding.ilToolBar.toolbar) @@ -39,26 +48,46 @@ class ProjectListActivity : BaseBindingActivity() { // mBinding.ilToolBar.toolbar.setTitle("项目列表") // mBinding.ilToolBar.toolbar.setTitleTextColor(ContextCompat.getColor(this, R.color.text_color_main)) // initTabLayout() + // 搜索 + mBinding.searchWidget.setOnEditorSearchListener { + // 搜索 it + } + mBinding.smartRefreshLayout.setOnRefreshListener(this) mBinding.recyclerView.addItemDecoration(HorDividerDecoration(this)) mBinding.recyclerView.setAdapter(adapter) + adapter.isStateViewEnable = true + adapter.setStateViewLayout(this, R.layout.layout_no_data) } override fun initData() { + viewModel.errorResponse.observe(this) { + mBinding.smartRefreshLayout.smartDismiss() + } viewModel.projectResponse.observe(this) { + mBinding.smartRefreshLayout.smartDismiss() adapter.submitList(it) - // TODO 暂时将第一条设置为当前项目 - if (it.isNotEmpty()) { - SPUtils.put(SPConstants.PROJECT_ID, it[0].BD_XMXX_ID) - SPUtils.put(SPConstants.PROJECT_NAME, it[0].XMXX_NAME) - } } + fetchData() + } - viewModel.getAllProjectIDByAccount(SPUtils.getString(SPConstants.ACCOUNT) ?: "") + private fun fetchData() { + viewModel.fetchProjectList() } - override fun initListener() { + override fun onRefresh(refreshLayout: RefreshLayout) { + fetchData() + } + override fun initListener() { + adapter.setOnItemClickListener { _, _, position -> + adapter.getItem(position)?.let { bean -> + // 进入项目,设置当前项目 + SPUtils.put(SPConstants.CURRENT_PROJECT, bean) + MainActivity.start() + ActivityNavUtil.finishActivity() + } + } } // private fun initTabLayout() { @@ -91,8 +120,19 @@ class ProjectListActivity : BaseBindingActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == R.id.menu_activity_project_list_exit) { - finish() + MaterialDialog.Builder(this) + .title("确定退出吗?") + .negativeText("取消") + .positiveText("退出") + .onPositive { _, _ -> + LogoutUtil.clearSP() + ActivityNavUtil.startActivity { } + ActivityNavUtil.finishActivity() +// viewModel.msgEvent.postValue(Message(EventConstants.LOGIN_STATUS)) + } + .show() } return super.onOptionsItemSelected(item) } + } \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/ui/project/ProjectListFragment.kt b/app/src/main/java/com/project/survey/ui/project/ProjectListFragment.kt index 56d1832..c347a75 100644 --- a/app/src/main/java/com/project/survey/ui/project/ProjectListFragment.kt +++ b/app/src/main/java/com/project/survey/ui/project/ProjectListFragment.kt @@ -57,7 +57,7 @@ class ProjectListFragment : BaseBindingFragment() { } } - viewModel.getAllProjectIDByAccount(SPUtils.getString(SPConstants.ACCOUNT) ?: "") + viewModel.fetchProjectList() } override fun initListener() { diff --git a/app/src/main/java/com/project/survey/util/LogoutUtil.kt b/app/src/main/java/com/project/survey/util/LogoutUtil.kt new file mode 100644 index 0000000..d690542 --- /dev/null +++ b/app/src/main/java/com/project/survey/util/LogoutUtil.kt @@ -0,0 +1,13 @@ +package com.project.survey.util + +import com.project.survey.constants.SPConstants + +object LogoutUtil { + + fun clearSP(){ + SPUtils.removeKey(SPConstants.ACCOUNT) + SPUtils.removeKey(SPConstants.TOKEN) + SPUtils.removeKey(SPConstants.MOBILE_PHONE) + SPUtils.removeKey(SPConstants.PERSON_ID) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/widget/SearchWidget.kt b/app/src/main/java/com/project/survey/widget/SearchWidget.kt new file mode 100644 index 0000000..ad28d36 --- /dev/null +++ b/app/src/main/java/com/project/survey/widget/SearchWidget.kt @@ -0,0 +1,40 @@ +package com.project.survey.widget + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.inputmethod.EditorInfo +import androidx.appcompat.widget.LinearLayoutCompat +import com.project.survey.R +import com.project.survey.databinding.WidgetSearchBinding +import com.project.survey.databinding.WidgetSectionItemBinding +import com.project.survey.extend.isVisibleOrGone +import com.project.survey.extend.toast + +class SearchWidget @JvmOverloads constructor( + context: Context, + val attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayoutCompat(context, attrs, defStyleAttr) { + + private val binding: WidgetSearchBinding + + init { + binding = WidgetSearchBinding.inflate(LayoutInflater.from(context), this, true) + val typeArray = context.obtainStyledAttributes(attrs, R.styleable.SearchWidget) + + binding.etSearch.setHint(typeArray.getString(R.styleable.SearchWidget_sw_hint)) + + typeArray.recycle() + } + + + fun setOnEditorSearchListener(onSearch: (String) -> Unit) { + binding.etSearch.setOnEditorActionListener { textView, i, keyEvent -> + if (i == EditorInfo.IME_ACTION_SEARCH) { + onSearch(textView.text.toString()) + } + return@setOnEditorActionListener true + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_search.xml b/app/src/main/res/drawable/bg_search.xml index c3ea364..4c24d36 100644 --- a/app/src/main/res/drawable/bg_search.xml +++ b/app/src/main/res/drawable/bg_search.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_approval.xml b/app/src/main/res/layout/activity_approval.xml index 54f60ac..39b38af 100644 --- a/app/src/main/res/layout/activity_approval.xml +++ b/app/src/main/res/layout/activity_approval.xml @@ -16,12 +16,18 @@ - + android:layout_height="match_parent"> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_control_net_list.xml b/app/src/main/res/layout/activity_control_net_list.xml index e29b786..b767387 100644 --- a/app/src/main/res/layout/activity_control_net_list.xml +++ b/app/src/main/res/layout/activity_control_net_list.xml @@ -13,11 +13,17 @@ android:id="@+id/ilSearch" layout="@layout/item_search_control_net" /> - + android:layout_height="match_parent"> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_project_list.xml b/app/src/main/res/layout/activity_project_list.xml index 73d236d..98b9613 100644 --- a/app/src/main/res/layout/activity_project_list.xml +++ b/app/src/main/res/layout/activity_project_list.xml @@ -1,45 +1,63 @@ - + - + - + app:srlEnableLoadMore="false"> + + + - - - - - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_me.xml b/app/src/main/res/layout/fragment_me.xml index 99e6914..e2548fd 100644 --- a/app/src/main/res/layout/fragment_me.xml +++ b/app/src/main/res/layout/fragment_me.xml @@ -28,7 +28,7 @@ tools:text="请登录" /> + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/attr.xml b/app/src/main/res/values/attr.xml index 5b0a918..a3ea1d8 100644 --- a/app/src/main/res/values/attr.xml +++ b/app/src/main/res/values/attr.xml @@ -33,4 +33,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cd5c055..b9d0f0c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -39,8 +39,8 @@ 输入不符合要求! 输入不能为空! 请输入验证码 - 验证码已发送至%1$s的手机,如您已更换手机,请联系管理员。 - + + 验证码已发送至您的手机,如您已更换手机,请联系管理员。 验证码已发送至%1$s的手机,请输入6位数验证码。 身份验证 请输入账号。