diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt index e9a9850..b3586f5 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt @@ -11,8 +11,8 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.RouteOnMap import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show @@ -26,7 +26,7 @@ KotlinBaseActivity() { private lateinit var jobId: String - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var wellViewModel: WellViewModel private lateinit var operationViewModel: OperationViewModel private val context: Context = this@OrderNotProcessedDetailActivity @@ -45,12 +45,12 @@ override fun initOnCreate(savedInstanceState: Bundle?) { this.jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -154,7 +154,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt index e9a9850..b3586f5 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt @@ -11,8 +11,8 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.RouteOnMap import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show @@ -26,7 +26,7 @@ KotlinBaseActivity() { private lateinit var jobId: String - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var wellViewModel: WellViewModel private lateinit var operationViewModel: OperationViewModel private val context: Context = this@OrderNotProcessedDetailActivity @@ -45,12 +45,12 @@ override fun initOnCreate(savedInstanceState: Bundle?) { this.jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -154,7 +154,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt index c5c9e3c..bc34d09 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt @@ -17,8 +17,8 @@ import com.casic.app.smartwell.model.OrderStatusModel import com.casic.app.smartwell.utils.LocaleConstant import com.casic.app.smartwell.vm.AlarmViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -33,7 +33,7 @@ private lateinit var userViewModel: UserViewModel private lateinit var alarmViewModel: AlarmViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var inflater: LayoutInflater private lateinit var contentTypeAdapter: TagAdapter private lateinit var orderStatusAdapter: TagAdapter @@ -112,8 +112,8 @@ } //工单状态 - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getOrderStatus() + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getOrderStatus() /** * 章丘项目只有一/二级报警 * */ @@ -141,7 +141,7 @@ this.alarmLevel = levelMaps[position]["value"].toString() true } - workOrderViewModel.orderStatusModel.observe(this) { + orderViewModel.orderStatusModel.observe(this) { if (it.code == 200) { //构造一个默认值 val bean = OrderStatusModel.DataBean() diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt index e9a9850..b3586f5 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt @@ -11,8 +11,8 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.RouteOnMap import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show @@ -26,7 +26,7 @@ KotlinBaseActivity() { private lateinit var jobId: String - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var wellViewModel: WellViewModel private lateinit var operationViewModel: OperationViewModel private val context: Context = this@OrderNotProcessedDetailActivity @@ -45,12 +45,12 @@ override fun initOnCreate(savedInstanceState: Bundle?) { this.jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -154,7 +154,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt index c5c9e3c..bc34d09 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt @@ -17,8 +17,8 @@ import com.casic.app.smartwell.model.OrderStatusModel import com.casic.app.smartwell.utils.LocaleConstant import com.casic.app.smartwell.vm.AlarmViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -33,7 +33,7 @@ private lateinit var userViewModel: UserViewModel private lateinit var alarmViewModel: AlarmViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var inflater: LayoutInflater private lateinit var contentTypeAdapter: TagAdapter private lateinit var orderStatusAdapter: TagAdapter @@ -112,8 +112,8 @@ } //工单状态 - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getOrderStatus() + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getOrderStatus() /** * 章丘项目只有一/二级报警 * */ @@ -141,7 +141,7 @@ this.alarmLevel = levelMaps[position]["value"].toString() true } - workOrderViewModel.orderStatusModel.observe(this) { + orderViewModel.orderStatusModel.observe(this) { if (it.code == 200) { //构造一个默认值 val bean = OrderStatusModel.DataBean() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt index 83f7f19..683effc 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.app.smartwell.R @@ -11,8 +12,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.SearchResultModel import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.SearchOrderViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -24,11 +24,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class SearchResultActivity : KotlinBaseActivity() { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var searchOrderViewModel: SearchOrderViewModel +class SearchResultActivity : KotlinBaseActivity(), Handler.Callback { + + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var args: ArrayList private lateinit var searchResultAdapter: SearchResultAdapter private val context = this@SearchResultActivity @@ -52,13 +52,11 @@ override fun initOnCreate(savedInstanceState: Bundle?) { args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - weakReferenceHandler = WeakReferenceHandler(callback) - searchOrderViewModel = ViewModelProvider(this)[SearchOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] getSearchResult() - searchOrderViewModel.listModel.observe(this) { + orderViewModel.searchResult.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -85,7 +83,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -104,7 +102,7 @@ } override fun observeRequestState() { - searchOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -144,13 +142,13 @@ } private fun getSearchResult() { - searchOrderViewModel.getSearchResult( + orderViewModel.getSearchResult( args[0], args[1], args[2], args[3], args[4], args[5], args[6], pageIndex ) } - private val callback = Handler.Callback { - if (it.what == 2022040101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -224,11 +222,11 @@ "工单编号异常,无法查看工单流转记录".show(context) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt index e9a9850..b3586f5 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt @@ -11,8 +11,8 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.RouteOnMap import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show @@ -26,7 +26,7 @@ KotlinBaseActivity() { private lateinit var jobId: String - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var wellViewModel: WellViewModel private lateinit var operationViewModel: OperationViewModel private val context: Context = this@OrderNotProcessedDetailActivity @@ -45,12 +45,12 @@ override fun initOnCreate(savedInstanceState: Bundle?) { this.jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -154,7 +154,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt index c5c9e3c..bc34d09 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt @@ -17,8 +17,8 @@ import com.casic.app.smartwell.model.OrderStatusModel import com.casic.app.smartwell.utils.LocaleConstant import com.casic.app.smartwell.vm.AlarmViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -33,7 +33,7 @@ private lateinit var userViewModel: UserViewModel private lateinit var alarmViewModel: AlarmViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var inflater: LayoutInflater private lateinit var contentTypeAdapter: TagAdapter private lateinit var orderStatusAdapter: TagAdapter @@ -112,8 +112,8 @@ } //工单状态 - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getOrderStatus() + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getOrderStatus() /** * 章丘项目只有一/二级报警 * */ @@ -141,7 +141,7 @@ this.alarmLevel = levelMaps[position]["value"].toString() true } - workOrderViewModel.orderStatusModel.observe(this) { + orderViewModel.orderStatusModel.observe(this) { if (it.code == 200) { //构造一个默认值 val bean = OrderStatusModel.DataBean() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt index 83f7f19..683effc 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.app.smartwell.R @@ -11,8 +12,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.SearchResultModel import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.SearchOrderViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -24,11 +24,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class SearchResultActivity : KotlinBaseActivity() { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var searchOrderViewModel: SearchOrderViewModel +class SearchResultActivity : KotlinBaseActivity(), Handler.Callback { + + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var args: ArrayList private lateinit var searchResultAdapter: SearchResultAdapter private val context = this@SearchResultActivity @@ -52,13 +52,11 @@ override fun initOnCreate(savedInstanceState: Bundle?) { args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - weakReferenceHandler = WeakReferenceHandler(callback) - searchOrderViewModel = ViewModelProvider(this)[SearchOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] getSearchResult() - searchOrderViewModel.listModel.observe(this) { + orderViewModel.searchResult.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -85,7 +83,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -104,7 +102,7 @@ } override fun observeRequestState() { - searchOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -144,13 +142,13 @@ } private fun getSearchResult() { - searchOrderViewModel.getSearchResult( + orderViewModel.getSearchResult( args[0], args[1], args[2], args[3], args[4], args[5], args[6], pageIndex ) } - private val callback = Handler.Callback { - if (it.what == 2022040101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -224,11 +222,11 @@ "工单编号异常,无法查看工单流转记录".show(context) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt index 95f44ea..7e3fd0c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -22,12 +22,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class UnDeployWellActivity : KotlinBaseActivity() { +class UnDeployWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@UnDeployWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var unDeployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -40,11 +39,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +119,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage("", "", "", "0", pageIndex) + wellViewModel.getWellListByPage("", "", "", "0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -197,6 +194,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt index e9a9850..b3586f5 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt @@ -11,8 +11,8 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.RouteOnMap import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show @@ -26,7 +26,7 @@ KotlinBaseActivity() { private lateinit var jobId: String - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var wellViewModel: WellViewModel private lateinit var operationViewModel: OperationViewModel private val context: Context = this@OrderNotProcessedDetailActivity @@ -45,12 +45,12 @@ override fun initOnCreate(savedInstanceState: Bundle?) { this.jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -154,7 +154,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt index c5c9e3c..bc34d09 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt @@ -17,8 +17,8 @@ import com.casic.app.smartwell.model.OrderStatusModel import com.casic.app.smartwell.utils.LocaleConstant import com.casic.app.smartwell.vm.AlarmViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -33,7 +33,7 @@ private lateinit var userViewModel: UserViewModel private lateinit var alarmViewModel: AlarmViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var inflater: LayoutInflater private lateinit var contentTypeAdapter: TagAdapter private lateinit var orderStatusAdapter: TagAdapter @@ -112,8 +112,8 @@ } //工单状态 - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getOrderStatus() + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getOrderStatus() /** * 章丘项目只有一/二级报警 * */ @@ -141,7 +141,7 @@ this.alarmLevel = levelMaps[position]["value"].toString() true } - workOrderViewModel.orderStatusModel.observe(this) { + orderViewModel.orderStatusModel.observe(this) { if (it.code == 200) { //构造一个默认值 val bean = OrderStatusModel.DataBean() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt index 83f7f19..683effc 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.app.smartwell.R @@ -11,8 +12,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.SearchResultModel import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.SearchOrderViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -24,11 +24,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class SearchResultActivity : KotlinBaseActivity() { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var searchOrderViewModel: SearchOrderViewModel +class SearchResultActivity : KotlinBaseActivity(), Handler.Callback { + + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var args: ArrayList private lateinit var searchResultAdapter: SearchResultAdapter private val context = this@SearchResultActivity @@ -52,13 +52,11 @@ override fun initOnCreate(savedInstanceState: Bundle?) { args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - weakReferenceHandler = WeakReferenceHandler(callback) - searchOrderViewModel = ViewModelProvider(this)[SearchOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] getSearchResult() - searchOrderViewModel.listModel.observe(this) { + orderViewModel.searchResult.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -85,7 +83,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -104,7 +102,7 @@ } override fun observeRequestState() { - searchOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -144,13 +142,13 @@ } private fun getSearchResult() { - searchOrderViewModel.getSearchResult( + orderViewModel.getSearchResult( args[0], args[1], args[2], args[3], args[4], args[5], args[6], pageIndex ) } - private val callback = Handler.Callback { - if (it.what == 2022040101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -224,11 +222,11 @@ "工单编号异常,无法查看工单流转记录".show(context) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt index 95f44ea..7e3fd0c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -22,12 +22,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class UnDeployWellActivity : KotlinBaseActivity() { +class UnDeployWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@UnDeployWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var unDeployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -40,11 +39,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +119,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage("", "", "", "0", pageIndex) + wellViewModel.getWellListByPage("", "", "", "0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -197,6 +194,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt index 561a7fa..b04283d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -25,14 +25,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class WellManagementActivity : KotlinBaseActivity() { +class WellManagementActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellListAdapter: NormalRecyclerAdapter private val context = this@WellManagementActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -54,8 +53,6 @@ easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -69,7 +66,7 @@ } getWellList() - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -143,11 +140,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) + wellViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032501) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032501) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -216,6 +213,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt index e9a9850..b3586f5 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt @@ -11,8 +11,8 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.RouteOnMap import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show @@ -26,7 +26,7 @@ KotlinBaseActivity() { private lateinit var jobId: String - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var wellViewModel: WellViewModel private lateinit var operationViewModel: OperationViewModel private val context: Context = this@OrderNotProcessedDetailActivity @@ -45,12 +45,12 @@ override fun initOnCreate(savedInstanceState: Bundle?) { this.jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -154,7 +154,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt index c5c9e3c..bc34d09 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt @@ -17,8 +17,8 @@ import com.casic.app.smartwell.model.OrderStatusModel import com.casic.app.smartwell.utils.LocaleConstant import com.casic.app.smartwell.vm.AlarmViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -33,7 +33,7 @@ private lateinit var userViewModel: UserViewModel private lateinit var alarmViewModel: AlarmViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var inflater: LayoutInflater private lateinit var contentTypeAdapter: TagAdapter private lateinit var orderStatusAdapter: TagAdapter @@ -112,8 +112,8 @@ } //工单状态 - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getOrderStatus() + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getOrderStatus() /** * 章丘项目只有一/二级报警 * */ @@ -141,7 +141,7 @@ this.alarmLevel = levelMaps[position]["value"].toString() true } - workOrderViewModel.orderStatusModel.observe(this) { + orderViewModel.orderStatusModel.observe(this) { if (it.code == 200) { //构造一个默认值 val bean = OrderStatusModel.DataBean() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt index 83f7f19..683effc 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.app.smartwell.R @@ -11,8 +12,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.SearchResultModel import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.SearchOrderViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -24,11 +24,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class SearchResultActivity : KotlinBaseActivity() { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var searchOrderViewModel: SearchOrderViewModel +class SearchResultActivity : KotlinBaseActivity(), Handler.Callback { + + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var args: ArrayList private lateinit var searchResultAdapter: SearchResultAdapter private val context = this@SearchResultActivity @@ -52,13 +52,11 @@ override fun initOnCreate(savedInstanceState: Bundle?) { args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - weakReferenceHandler = WeakReferenceHandler(callback) - searchOrderViewModel = ViewModelProvider(this)[SearchOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] getSearchResult() - searchOrderViewModel.listModel.observe(this) { + orderViewModel.searchResult.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -85,7 +83,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -104,7 +102,7 @@ } override fun observeRequestState() { - searchOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -144,13 +142,13 @@ } private fun getSearchResult() { - searchOrderViewModel.getSearchResult( + orderViewModel.getSearchResult( args[0], args[1], args[2], args[3], args[4], args[5], args[6], pageIndex ) } - private val callback = Handler.Callback { - if (it.what == 2022040101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -224,11 +222,11 @@ "工单编号异常,无法查看工单流转记录".show(context) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt index 95f44ea..7e3fd0c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -22,12 +22,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class UnDeployWellActivity : KotlinBaseActivity() { +class UnDeployWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@UnDeployWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var unDeployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -40,11 +39,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +119,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage("", "", "", "0", pageIndex) + wellViewModel.getWellListByPage("", "", "", "0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -197,6 +194,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt index 561a7fa..b04283d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -25,14 +25,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class WellManagementActivity : KotlinBaseActivity() { +class WellManagementActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellListAdapter: NormalRecyclerAdapter private val context = this@WellManagementActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -54,8 +53,6 @@ easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -69,7 +66,7 @@ } getWellList() - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -143,11 +140,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) + wellViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032501) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032501) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -216,6 +213,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt index d90490c..989994d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -27,14 +27,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class WellOperationActivity : KotlinBaseActivity() { +class WellOperationActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellOperationAdapter: NormalRecyclerAdapter private val context = this@WellOperationActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -56,9 +55,7 @@ override fun initOnCreate(savedInstanceState: Bundle?) { easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -71,7 +68,7 @@ } } - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -175,7 +172,7 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage( + wellViewModel.getWellListByPage( keywords = keywords, wellType = wellType, deptid = "", @@ -184,8 +181,8 @@ ) } - private val callback = Handler.Callback { - if (it.what == 2022032801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -297,6 +294,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt index e9a9850..b3586f5 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt @@ -11,8 +11,8 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.RouteOnMap import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show @@ -26,7 +26,7 @@ KotlinBaseActivity() { private lateinit var jobId: String - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var wellViewModel: WellViewModel private lateinit var operationViewModel: OperationViewModel private val context: Context = this@OrderNotProcessedDetailActivity @@ -45,12 +45,12 @@ override fun initOnCreate(savedInstanceState: Bundle?) { this.jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -154,7 +154,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt index c5c9e3c..bc34d09 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt @@ -17,8 +17,8 @@ import com.casic.app.smartwell.model.OrderStatusModel import com.casic.app.smartwell.utils.LocaleConstant import com.casic.app.smartwell.vm.AlarmViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -33,7 +33,7 @@ private lateinit var userViewModel: UserViewModel private lateinit var alarmViewModel: AlarmViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var inflater: LayoutInflater private lateinit var contentTypeAdapter: TagAdapter private lateinit var orderStatusAdapter: TagAdapter @@ -112,8 +112,8 @@ } //工单状态 - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getOrderStatus() + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getOrderStatus() /** * 章丘项目只有一/二级报警 * */ @@ -141,7 +141,7 @@ this.alarmLevel = levelMaps[position]["value"].toString() true } - workOrderViewModel.orderStatusModel.observe(this) { + orderViewModel.orderStatusModel.observe(this) { if (it.code == 200) { //构造一个默认值 val bean = OrderStatusModel.DataBean() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt index 83f7f19..683effc 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.app.smartwell.R @@ -11,8 +12,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.SearchResultModel import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.SearchOrderViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -24,11 +24,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class SearchResultActivity : KotlinBaseActivity() { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var searchOrderViewModel: SearchOrderViewModel +class SearchResultActivity : KotlinBaseActivity(), Handler.Callback { + + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var args: ArrayList private lateinit var searchResultAdapter: SearchResultAdapter private val context = this@SearchResultActivity @@ -52,13 +52,11 @@ override fun initOnCreate(savedInstanceState: Bundle?) { args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - weakReferenceHandler = WeakReferenceHandler(callback) - searchOrderViewModel = ViewModelProvider(this)[SearchOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] getSearchResult() - searchOrderViewModel.listModel.observe(this) { + orderViewModel.searchResult.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -85,7 +83,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -104,7 +102,7 @@ } override fun observeRequestState() { - searchOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -144,13 +142,13 @@ } private fun getSearchResult() { - searchOrderViewModel.getSearchResult( + orderViewModel.getSearchResult( args[0], args[1], args[2], args[3], args[4], args[5], args[6], pageIndex ) } - private val callback = Handler.Callback { - if (it.what == 2022040101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -224,11 +222,11 @@ "工单编号异常,无法查看工单流转记录".show(context) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt index 95f44ea..7e3fd0c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -22,12 +22,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class UnDeployWellActivity : KotlinBaseActivity() { +class UnDeployWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@UnDeployWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var unDeployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -40,11 +39,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +119,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage("", "", "", "0", pageIndex) + wellViewModel.getWellListByPage("", "", "", "0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -197,6 +194,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt index 561a7fa..b04283d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -25,14 +25,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class WellManagementActivity : KotlinBaseActivity() { +class WellManagementActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellListAdapter: NormalRecyclerAdapter private val context = this@WellManagementActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -54,8 +53,6 @@ easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -69,7 +66,7 @@ } getWellList() - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -143,11 +140,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) + wellViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032501) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032501) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -216,6 +213,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt index d90490c..989994d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -27,14 +27,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class WellOperationActivity : KotlinBaseActivity() { +class WellOperationActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellOperationAdapter: NormalRecyclerAdapter private val context = this@WellOperationActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -56,9 +55,7 @@ override fun initOnCreate(savedInstanceState: Bundle?) { easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -71,7 +68,7 @@ } } - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -175,7 +172,7 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage( + wellViewModel.getWellListByPage( keywords = keywords, wellType = wellType, deptid = "", @@ -184,8 +181,8 @@ ) } - private val callback = Handler.Callback { - if (it.what == 2022032801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -297,6 +294,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt new file mode 100644 index 0000000..4cb26b7 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.extensions.separateResponseCode +import com.casic.app.smartwell.model.OrderDetailModel +import com.casic.app.smartwell.model.OrderListModel +import com.casic.app.smartwell.model.OrderStatusModel +import com.casic.app.smartwell.model.SearchResultModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.utils.LoadState +import org.json.JSONObject + +class OrderViewModel : BaseViewModel(){ + + private val gson by lazy { Gson() } + val searchResult = MutableLiveData() + val orderList = MutableLiveData() + val resultModel = MutableLiveData>() + val orderStatusModel = MutableLiveData() + val detailModel = MutableLiveData() + + fun getSearchResult( + keywords: String, + alarmContent: String, + alarmLevel: String, + jobStatus: String, + deptId: String, + beginTime: String, + endTime: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, deptId, beginTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + searchResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getWorkOrderListByState(jobStatus: String, page: Int) = launch({ + val response = RetrofitServiceManager.getWorkOrderList(jobStatus, page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getNotAcceptOderList(page: Int) = launch({ + val response = RetrofitServiceManager.getNotAcceptOderList(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getNotHandleOderList(page: Int) = launch({ + val response = RetrofitServiceManager.getNotHandleOderList(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun countWorkOrderByState() = launch({ + val response = RetrofitServiceManager.countWorkOrderByState() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + val map = HashMap(4) + + val jsonObject = JSONObject(response) + val data = jsonObject.getJSONObject("data") + map["beforeGet"] = data.getString("beforeGet") + map["beforeConfirm"] = data.getString("beforeConfirm") + map["inHandle"] = data.getString("inHandle") + map["over"] = data.getString("over") + resultModel.value = map + } + }, { + it.printStackTrace() + }) + + fun getOrderStatus() = launch({ + val response = RetrofitServiceManager.getOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt index e9a9850..b3586f5 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt @@ -11,8 +11,8 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.RouteOnMap import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show @@ -26,7 +26,7 @@ KotlinBaseActivity() { private lateinit var jobId: String - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var wellViewModel: WellViewModel private lateinit var operationViewModel: OperationViewModel private val context: Context = this@OrderNotProcessedDetailActivity @@ -45,12 +45,12 @@ override fun initOnCreate(savedInstanceState: Bundle?) { this.jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -154,7 +154,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt index c5c9e3c..bc34d09 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt @@ -17,8 +17,8 @@ import com.casic.app.smartwell.model.OrderStatusModel import com.casic.app.smartwell.utils.LocaleConstant import com.casic.app.smartwell.vm.AlarmViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -33,7 +33,7 @@ private lateinit var userViewModel: UserViewModel private lateinit var alarmViewModel: AlarmViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var inflater: LayoutInflater private lateinit var contentTypeAdapter: TagAdapter private lateinit var orderStatusAdapter: TagAdapter @@ -112,8 +112,8 @@ } //工单状态 - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getOrderStatus() + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getOrderStatus() /** * 章丘项目只有一/二级报警 * */ @@ -141,7 +141,7 @@ this.alarmLevel = levelMaps[position]["value"].toString() true } - workOrderViewModel.orderStatusModel.observe(this) { + orderViewModel.orderStatusModel.observe(this) { if (it.code == 200) { //构造一个默认值 val bean = OrderStatusModel.DataBean() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt index 83f7f19..683effc 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.app.smartwell.R @@ -11,8 +12,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.SearchResultModel import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.SearchOrderViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -24,11 +24,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class SearchResultActivity : KotlinBaseActivity() { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var searchOrderViewModel: SearchOrderViewModel +class SearchResultActivity : KotlinBaseActivity(), Handler.Callback { + + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var args: ArrayList private lateinit var searchResultAdapter: SearchResultAdapter private val context = this@SearchResultActivity @@ -52,13 +52,11 @@ override fun initOnCreate(savedInstanceState: Bundle?) { args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - weakReferenceHandler = WeakReferenceHandler(callback) - searchOrderViewModel = ViewModelProvider(this)[SearchOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] getSearchResult() - searchOrderViewModel.listModel.observe(this) { + orderViewModel.searchResult.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -85,7 +83,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -104,7 +102,7 @@ } override fun observeRequestState() { - searchOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -144,13 +142,13 @@ } private fun getSearchResult() { - searchOrderViewModel.getSearchResult( + orderViewModel.getSearchResult( args[0], args[1], args[2], args[3], args[4], args[5], args[6], pageIndex ) } - private val callback = Handler.Callback { - if (it.what == 2022040101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -224,11 +222,11 @@ "工单编号异常,无法查看工单流转记录".show(context) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt index 95f44ea..7e3fd0c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -22,12 +22,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class UnDeployWellActivity : KotlinBaseActivity() { +class UnDeployWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@UnDeployWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var unDeployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -40,11 +39,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +119,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage("", "", "", "0", pageIndex) + wellViewModel.getWellListByPage("", "", "", "0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -197,6 +194,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt index 561a7fa..b04283d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -25,14 +25,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class WellManagementActivity : KotlinBaseActivity() { +class WellManagementActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellListAdapter: NormalRecyclerAdapter private val context = this@WellManagementActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -54,8 +53,6 @@ easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -69,7 +66,7 @@ } getWellList() - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -143,11 +140,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) + wellViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032501) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032501) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -216,6 +213,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt index d90490c..989994d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -27,14 +27,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class WellOperationActivity : KotlinBaseActivity() { +class WellOperationActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellOperationAdapter: NormalRecyclerAdapter private val context = this@WellOperationActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -56,9 +55,7 @@ override fun initOnCreate(savedInstanceState: Bundle?) { easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -71,7 +68,7 @@ } } - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -175,7 +172,7 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage( + wellViewModel.getWellListByPage( keywords = keywords, wellType = wellType, deptid = "", @@ -184,8 +181,8 @@ ) } - private val callback = Handler.Callback { - if (it.what == 2022032801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -297,6 +294,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt new file mode 100644 index 0000000..4cb26b7 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.extensions.separateResponseCode +import com.casic.app.smartwell.model.OrderDetailModel +import com.casic.app.smartwell.model.OrderListModel +import com.casic.app.smartwell.model.OrderStatusModel +import com.casic.app.smartwell.model.SearchResultModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.utils.LoadState +import org.json.JSONObject + +class OrderViewModel : BaseViewModel(){ + + private val gson by lazy { Gson() } + val searchResult = MutableLiveData() + val orderList = MutableLiveData() + val resultModel = MutableLiveData>() + val orderStatusModel = MutableLiveData() + val detailModel = MutableLiveData() + + fun getSearchResult( + keywords: String, + alarmContent: String, + alarmLevel: String, + jobStatus: String, + deptId: String, + beginTime: String, + endTime: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, deptId, beginTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + searchResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getWorkOrderListByState(jobStatus: String, page: Int) = launch({ + val response = RetrofitServiceManager.getWorkOrderList(jobStatus, page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getNotAcceptOderList(page: Int) = launch({ + val response = RetrofitServiceManager.getNotAcceptOderList(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getNotHandleOderList(page: Int) = launch({ + val response = RetrofitServiceManager.getNotHandleOderList(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun countWorkOrderByState() = launch({ + val response = RetrofitServiceManager.countWorkOrderByState() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + val map = HashMap(4) + + val jsonObject = JSONObject(response) + val data = jsonObject.getJSONObject("data") + map["beforeGet"] = data.getString("beforeGet") + map["beforeConfirm"] = data.getString("beforeConfirm") + map["inHandle"] = data.getString("inHandle") + map["over"] = data.getString("over") + resultModel.value = map + } + }, { + it.printStackTrace() + }) + + fun getOrderStatus() = launch({ + val response = RetrofitServiceManager.getOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt deleted file mode 100644 index 1c5a8f2..0000000 --- a/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.app.smartwell.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.app.smartwell.extensions.separateResponseCode -import com.casic.app.smartwell.model.SearchResultModel -import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.utils.LoadState - -class SearchOrderViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val listModel = MutableLiveData() - - fun getSearchResult( - keywords: String, - alarmContent: String, - alarmLevel: String, - jobStatus: String, - deptId: String, - beginTime: String, - endTime: String, - offset: Int - ) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getSearchResult( - keywords, alarmContent, alarmLevel, jobStatus, deptId, beginTime, endTime, offset - ) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - listModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt index e9a9850..b3586f5 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt @@ -11,8 +11,8 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.RouteOnMap import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show @@ -26,7 +26,7 @@ KotlinBaseActivity() { private lateinit var jobId: String - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var wellViewModel: WellViewModel private lateinit var operationViewModel: OperationViewModel private val context: Context = this@OrderNotProcessedDetailActivity @@ -45,12 +45,12 @@ override fun initOnCreate(savedInstanceState: Bundle?) { this.jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -154,7 +154,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt index c5c9e3c..bc34d09 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt @@ -17,8 +17,8 @@ import com.casic.app.smartwell.model.OrderStatusModel import com.casic.app.smartwell.utils.LocaleConstant import com.casic.app.smartwell.vm.AlarmViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -33,7 +33,7 @@ private lateinit var userViewModel: UserViewModel private lateinit var alarmViewModel: AlarmViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var inflater: LayoutInflater private lateinit var contentTypeAdapter: TagAdapter private lateinit var orderStatusAdapter: TagAdapter @@ -112,8 +112,8 @@ } //工单状态 - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getOrderStatus() + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getOrderStatus() /** * 章丘项目只有一/二级报警 * */ @@ -141,7 +141,7 @@ this.alarmLevel = levelMaps[position]["value"].toString() true } - workOrderViewModel.orderStatusModel.observe(this) { + orderViewModel.orderStatusModel.observe(this) { if (it.code == 200) { //构造一个默认值 val bean = OrderStatusModel.DataBean() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt index 83f7f19..683effc 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.app.smartwell.R @@ -11,8 +12,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.SearchResultModel import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.SearchOrderViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -24,11 +24,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class SearchResultActivity : KotlinBaseActivity() { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var searchOrderViewModel: SearchOrderViewModel +class SearchResultActivity : KotlinBaseActivity(), Handler.Callback { + + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var args: ArrayList private lateinit var searchResultAdapter: SearchResultAdapter private val context = this@SearchResultActivity @@ -52,13 +52,11 @@ override fun initOnCreate(savedInstanceState: Bundle?) { args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - weakReferenceHandler = WeakReferenceHandler(callback) - searchOrderViewModel = ViewModelProvider(this)[SearchOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] getSearchResult() - searchOrderViewModel.listModel.observe(this) { + orderViewModel.searchResult.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -85,7 +83,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -104,7 +102,7 @@ } override fun observeRequestState() { - searchOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -144,13 +142,13 @@ } private fun getSearchResult() { - searchOrderViewModel.getSearchResult( + orderViewModel.getSearchResult( args[0], args[1], args[2], args[3], args[4], args[5], args[6], pageIndex ) } - private val callback = Handler.Callback { - if (it.what == 2022040101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -224,11 +222,11 @@ "工单编号异常,无法查看工单流转记录".show(context) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt index 95f44ea..7e3fd0c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -22,12 +22,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class UnDeployWellActivity : KotlinBaseActivity() { +class UnDeployWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@UnDeployWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var unDeployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -40,11 +39,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +119,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage("", "", "", "0", pageIndex) + wellViewModel.getWellListByPage("", "", "", "0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -197,6 +194,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt index 561a7fa..b04283d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -25,14 +25,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class WellManagementActivity : KotlinBaseActivity() { +class WellManagementActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellListAdapter: NormalRecyclerAdapter private val context = this@WellManagementActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -54,8 +53,6 @@ easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -69,7 +66,7 @@ } getWellList() - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -143,11 +140,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) + wellViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032501) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032501) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -216,6 +213,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt index d90490c..989994d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -27,14 +27,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class WellOperationActivity : KotlinBaseActivity() { +class WellOperationActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellOperationAdapter: NormalRecyclerAdapter private val context = this@WellOperationActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -56,9 +55,7 @@ override fun initOnCreate(savedInstanceState: Bundle?) { easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -71,7 +68,7 @@ } } - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -175,7 +172,7 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage( + wellViewModel.getWellListByPage( keywords = keywords, wellType = wellType, deptid = "", @@ -184,8 +181,8 @@ ) } - private val callback = Handler.Callback { - if (it.what == 2022032801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -297,6 +294,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt new file mode 100644 index 0000000..4cb26b7 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.extensions.separateResponseCode +import com.casic.app.smartwell.model.OrderDetailModel +import com.casic.app.smartwell.model.OrderListModel +import com.casic.app.smartwell.model.OrderStatusModel +import com.casic.app.smartwell.model.SearchResultModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.utils.LoadState +import org.json.JSONObject + +class OrderViewModel : BaseViewModel(){ + + private val gson by lazy { Gson() } + val searchResult = MutableLiveData() + val orderList = MutableLiveData() + val resultModel = MutableLiveData>() + val orderStatusModel = MutableLiveData() + val detailModel = MutableLiveData() + + fun getSearchResult( + keywords: String, + alarmContent: String, + alarmLevel: String, + jobStatus: String, + deptId: String, + beginTime: String, + endTime: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, deptId, beginTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + searchResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getWorkOrderListByState(jobStatus: String, page: Int) = launch({ + val response = RetrofitServiceManager.getWorkOrderList(jobStatus, page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getNotAcceptOderList(page: Int) = launch({ + val response = RetrofitServiceManager.getNotAcceptOderList(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getNotHandleOderList(page: Int) = launch({ + val response = RetrofitServiceManager.getNotHandleOderList(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun countWorkOrderByState() = launch({ + val response = RetrofitServiceManager.countWorkOrderByState() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + val map = HashMap(4) + + val jsonObject = JSONObject(response) + val data = jsonObject.getJSONObject("data") + map["beforeGet"] = data.getString("beforeGet") + map["beforeConfirm"] = data.getString("beforeConfirm") + map["inHandle"] = data.getString("inHandle") + map["over"] = data.getString("over") + resultModel.value = map + } + }, { + it.printStackTrace() + }) + + fun getOrderStatus() = launch({ + val response = RetrofitServiceManager.getOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt deleted file mode 100644 index 1c5a8f2..0000000 --- a/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.app.smartwell.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.app.smartwell.extensions.separateResponseCode -import com.casic.app.smartwell.model.SearchResultModel -import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.utils.LoadState - -class SearchOrderViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val listModel = MutableLiveData() - - fun getSearchResult( - keywords: String, - alarmContent: String, - alarmLevel: String, - jobStatus: String, - deptId: String, - beginTime: String, - endTime: String, - offset: Int - ) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getSearchResult( - keywords, alarmContent, alarmLevel, jobStatus, deptId, beginTime, endTime, offset - ) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - listModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellListViewModel.kt deleted file mode 100644 index 3b8cac5..0000000 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellListViewModel.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.app.smartwell.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.app.smartwell.base.BaseApplication -import com.casic.app.smartwell.extensions.separateResponseCode -import com.casic.app.smartwell.extensions.toErrorMessage -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.model.WellListModel -import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show - -class WellListViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val listModel = MutableLiveData() - val totalWellModel = MutableLiveData() - - fun getWellListByPage( - keywords: String, wellType: String, deptid: String, bfzt: String, page: Int - ) = launch({ - val response = RetrofitServiceManager.getWellListByPage( - keywords, wellType, deptid, bfzt, page - ) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - listModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - }, { - it.printStackTrace() - }) - - fun getWellList() = launch({ - val response = RetrofitServiceManager.getWellList() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - totalWellModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.get()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt index e9a9850..b3586f5 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt @@ -11,8 +11,8 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.RouteOnMap import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show @@ -26,7 +26,7 @@ KotlinBaseActivity() { private lateinit var jobId: String - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var wellViewModel: WellViewModel private lateinit var operationViewModel: OperationViewModel private val context: Context = this@OrderNotProcessedDetailActivity @@ -45,12 +45,12 @@ override fun initOnCreate(savedInstanceState: Bundle?) { this.jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -154,7 +154,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt index c5c9e3c..bc34d09 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt @@ -17,8 +17,8 @@ import com.casic.app.smartwell.model.OrderStatusModel import com.casic.app.smartwell.utils.LocaleConstant import com.casic.app.smartwell.vm.AlarmViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -33,7 +33,7 @@ private lateinit var userViewModel: UserViewModel private lateinit var alarmViewModel: AlarmViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var inflater: LayoutInflater private lateinit var contentTypeAdapter: TagAdapter private lateinit var orderStatusAdapter: TagAdapter @@ -112,8 +112,8 @@ } //工单状态 - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getOrderStatus() + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getOrderStatus() /** * 章丘项目只有一/二级报警 * */ @@ -141,7 +141,7 @@ this.alarmLevel = levelMaps[position]["value"].toString() true } - workOrderViewModel.orderStatusModel.observe(this) { + orderViewModel.orderStatusModel.observe(this) { if (it.code == 200) { //构造一个默认值 val bean = OrderStatusModel.DataBean() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt index 83f7f19..683effc 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.app.smartwell.R @@ -11,8 +12,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.SearchResultModel import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.SearchOrderViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -24,11 +24,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class SearchResultActivity : KotlinBaseActivity() { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var searchOrderViewModel: SearchOrderViewModel +class SearchResultActivity : KotlinBaseActivity(), Handler.Callback { + + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var args: ArrayList private lateinit var searchResultAdapter: SearchResultAdapter private val context = this@SearchResultActivity @@ -52,13 +52,11 @@ override fun initOnCreate(savedInstanceState: Bundle?) { args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - weakReferenceHandler = WeakReferenceHandler(callback) - searchOrderViewModel = ViewModelProvider(this)[SearchOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] getSearchResult() - searchOrderViewModel.listModel.observe(this) { + orderViewModel.searchResult.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -85,7 +83,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -104,7 +102,7 @@ } override fun observeRequestState() { - searchOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -144,13 +142,13 @@ } private fun getSearchResult() { - searchOrderViewModel.getSearchResult( + orderViewModel.getSearchResult( args[0], args[1], args[2], args[3], args[4], args[5], args[6], pageIndex ) } - private val callback = Handler.Callback { - if (it.what == 2022040101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -224,11 +222,11 @@ "工单编号异常,无法查看工单流转记录".show(context) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt index 95f44ea..7e3fd0c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -22,12 +22,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class UnDeployWellActivity : KotlinBaseActivity() { +class UnDeployWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@UnDeployWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var unDeployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -40,11 +39,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +119,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage("", "", "", "0", pageIndex) + wellViewModel.getWellListByPage("", "", "", "0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -197,6 +194,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt index 561a7fa..b04283d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -25,14 +25,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class WellManagementActivity : KotlinBaseActivity() { +class WellManagementActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellListAdapter: NormalRecyclerAdapter private val context = this@WellManagementActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -54,8 +53,6 @@ easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -69,7 +66,7 @@ } getWellList() - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -143,11 +140,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) + wellViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032501) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032501) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -216,6 +213,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt index d90490c..989994d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -27,14 +27,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class WellOperationActivity : KotlinBaseActivity() { +class WellOperationActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellOperationAdapter: NormalRecyclerAdapter private val context = this@WellOperationActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -56,9 +55,7 @@ override fun initOnCreate(savedInstanceState: Bundle?) { easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -71,7 +68,7 @@ } } - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -175,7 +172,7 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage( + wellViewModel.getWellListByPage( keywords = keywords, wellType = wellType, deptid = "", @@ -184,8 +181,8 @@ ) } - private val callback = Handler.Callback { - if (it.what == 2022032801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -297,6 +294,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt new file mode 100644 index 0000000..4cb26b7 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.extensions.separateResponseCode +import com.casic.app.smartwell.model.OrderDetailModel +import com.casic.app.smartwell.model.OrderListModel +import com.casic.app.smartwell.model.OrderStatusModel +import com.casic.app.smartwell.model.SearchResultModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.utils.LoadState +import org.json.JSONObject + +class OrderViewModel : BaseViewModel(){ + + private val gson by lazy { Gson() } + val searchResult = MutableLiveData() + val orderList = MutableLiveData() + val resultModel = MutableLiveData>() + val orderStatusModel = MutableLiveData() + val detailModel = MutableLiveData() + + fun getSearchResult( + keywords: String, + alarmContent: String, + alarmLevel: String, + jobStatus: String, + deptId: String, + beginTime: String, + endTime: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, deptId, beginTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + searchResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getWorkOrderListByState(jobStatus: String, page: Int) = launch({ + val response = RetrofitServiceManager.getWorkOrderList(jobStatus, page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getNotAcceptOderList(page: Int) = launch({ + val response = RetrofitServiceManager.getNotAcceptOderList(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getNotHandleOderList(page: Int) = launch({ + val response = RetrofitServiceManager.getNotHandleOderList(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun countWorkOrderByState() = launch({ + val response = RetrofitServiceManager.countWorkOrderByState() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + val map = HashMap(4) + + val jsonObject = JSONObject(response) + val data = jsonObject.getJSONObject("data") + map["beforeGet"] = data.getString("beforeGet") + map["beforeConfirm"] = data.getString("beforeConfirm") + map["inHandle"] = data.getString("inHandle") + map["over"] = data.getString("over") + resultModel.value = map + } + }, { + it.printStackTrace() + }) + + fun getOrderStatus() = launch({ + val response = RetrofitServiceManager.getOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt deleted file mode 100644 index 1c5a8f2..0000000 --- a/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.app.smartwell.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.app.smartwell.extensions.separateResponseCode -import com.casic.app.smartwell.model.SearchResultModel -import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.utils.LoadState - -class SearchOrderViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val listModel = MutableLiveData() - - fun getSearchResult( - keywords: String, - alarmContent: String, - alarmLevel: String, - jobStatus: String, - deptId: String, - beginTime: String, - endTime: String, - offset: Int - ) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getSearchResult( - keywords, alarmContent, alarmLevel, jobStatus, deptId, beginTime, endTime, offset - ) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - listModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellListViewModel.kt deleted file mode 100644 index 3b8cac5..0000000 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellListViewModel.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.app.smartwell.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.app.smartwell.base.BaseApplication -import com.casic.app.smartwell.extensions.separateResponseCode -import com.casic.app.smartwell.extensions.toErrorMessage -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.model.WellListModel -import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show - -class WellListViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val listModel = MutableLiveData() - val totalWellModel = MutableLiveData() - - fun getWellListByPage( - keywords: String, wellType: String, deptid: String, bfzt: String, page: Int - ) = launch({ - val response = RetrofitServiceManager.getWellListByPage( - keywords, wellType, deptid, bfzt, page - ) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - listModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - }, { - it.printStackTrace() - }) - - fun getWellList() = launch({ - val response = RetrofitServiceManager.getWellList() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - totalWellModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.get()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellViewModel.kt index 8c0316f..3d41e9b 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellViewModel.kt @@ -3,9 +3,12 @@ import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseApplication import com.casic.app.smartwell.extensions.separateResponseCode +import com.casic.app.smartwell.extensions.toErrorMessage import com.casic.app.smartwell.model.AuthorDeptModel import com.casic.app.smartwell.model.CommonResultModel +import com.casic.app.smartwell.model.MapWellListModel import com.casic.app.smartwell.model.WellDetailModel +import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellMonitorModel import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -24,6 +27,8 @@ val wellDetailModel = MutableLiveData() val commonResultModel = MutableLiveData() val monitorModel = MutableLiveData() + val listModel = MutableLiveData() + val totalWellModel = MutableLiveData() fun countWellByState() = launch({ val response = RetrofitServiceManager.countWellByState() @@ -113,4 +118,34 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun getWellListByPage( + keywords: String, wellType: String, deptid: String, bfzt: String, page: Int + ) = launch({ + val response = RetrofitServiceManager.getWellListByPage( + keywords, wellType, deptid, bfzt, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getWellList() = launch({ + val response = RetrofitServiceManager.getWellList() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + totalWellModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt index e9a9850..b3586f5 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt @@ -11,8 +11,8 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.RouteOnMap import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show @@ -26,7 +26,7 @@ KotlinBaseActivity() { private lateinit var jobId: String - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var wellViewModel: WellViewModel private lateinit var operationViewModel: OperationViewModel private val context: Context = this@OrderNotProcessedDetailActivity @@ -45,12 +45,12 @@ override fun initOnCreate(savedInstanceState: Bundle?) { this.jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -154,7 +154,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt index c5c9e3c..bc34d09 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt @@ -17,8 +17,8 @@ import com.casic.app.smartwell.model.OrderStatusModel import com.casic.app.smartwell.utils.LocaleConstant import com.casic.app.smartwell.vm.AlarmViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -33,7 +33,7 @@ private lateinit var userViewModel: UserViewModel private lateinit var alarmViewModel: AlarmViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var inflater: LayoutInflater private lateinit var contentTypeAdapter: TagAdapter private lateinit var orderStatusAdapter: TagAdapter @@ -112,8 +112,8 @@ } //工单状态 - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getOrderStatus() + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getOrderStatus() /** * 章丘项目只有一/二级报警 * */ @@ -141,7 +141,7 @@ this.alarmLevel = levelMaps[position]["value"].toString() true } - workOrderViewModel.orderStatusModel.observe(this) { + orderViewModel.orderStatusModel.observe(this) { if (it.code == 200) { //构造一个默认值 val bean = OrderStatusModel.DataBean() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt index 83f7f19..683effc 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.app.smartwell.R @@ -11,8 +12,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.SearchResultModel import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.SearchOrderViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -24,11 +24,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class SearchResultActivity : KotlinBaseActivity() { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var searchOrderViewModel: SearchOrderViewModel +class SearchResultActivity : KotlinBaseActivity(), Handler.Callback { + + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var args: ArrayList private lateinit var searchResultAdapter: SearchResultAdapter private val context = this@SearchResultActivity @@ -52,13 +52,11 @@ override fun initOnCreate(savedInstanceState: Bundle?) { args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - weakReferenceHandler = WeakReferenceHandler(callback) - searchOrderViewModel = ViewModelProvider(this)[SearchOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] getSearchResult() - searchOrderViewModel.listModel.observe(this) { + orderViewModel.searchResult.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -85,7 +83,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -104,7 +102,7 @@ } override fun observeRequestState() { - searchOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -144,13 +142,13 @@ } private fun getSearchResult() { - searchOrderViewModel.getSearchResult( + orderViewModel.getSearchResult( args[0], args[1], args[2], args[3], args[4], args[5], args[6], pageIndex ) } - private val callback = Handler.Callback { - if (it.what == 2022040101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -224,11 +222,11 @@ "工单编号异常,无法查看工单流转记录".show(context) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt index 95f44ea..7e3fd0c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -22,12 +22,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class UnDeployWellActivity : KotlinBaseActivity() { +class UnDeployWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@UnDeployWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var unDeployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -40,11 +39,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +119,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage("", "", "", "0", pageIndex) + wellViewModel.getWellListByPage("", "", "", "0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -197,6 +194,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt index 561a7fa..b04283d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -25,14 +25,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class WellManagementActivity : KotlinBaseActivity() { +class WellManagementActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellListAdapter: NormalRecyclerAdapter private val context = this@WellManagementActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -54,8 +53,6 @@ easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -69,7 +66,7 @@ } getWellList() - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -143,11 +140,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) + wellViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032501) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032501) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -216,6 +213,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt index d90490c..989994d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -27,14 +27,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class WellOperationActivity : KotlinBaseActivity() { +class WellOperationActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellOperationAdapter: NormalRecyclerAdapter private val context = this@WellOperationActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -56,9 +55,7 @@ override fun initOnCreate(savedInstanceState: Bundle?) { easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -71,7 +68,7 @@ } } - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -175,7 +172,7 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage( + wellViewModel.getWellListByPage( keywords = keywords, wellType = wellType, deptid = "", @@ -184,8 +181,8 @@ ) } - private val callback = Handler.Callback { - if (it.what == 2022032801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -297,6 +294,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt new file mode 100644 index 0000000..4cb26b7 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.extensions.separateResponseCode +import com.casic.app.smartwell.model.OrderDetailModel +import com.casic.app.smartwell.model.OrderListModel +import com.casic.app.smartwell.model.OrderStatusModel +import com.casic.app.smartwell.model.SearchResultModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.utils.LoadState +import org.json.JSONObject + +class OrderViewModel : BaseViewModel(){ + + private val gson by lazy { Gson() } + val searchResult = MutableLiveData() + val orderList = MutableLiveData() + val resultModel = MutableLiveData>() + val orderStatusModel = MutableLiveData() + val detailModel = MutableLiveData() + + fun getSearchResult( + keywords: String, + alarmContent: String, + alarmLevel: String, + jobStatus: String, + deptId: String, + beginTime: String, + endTime: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, deptId, beginTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + searchResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getWorkOrderListByState(jobStatus: String, page: Int) = launch({ + val response = RetrofitServiceManager.getWorkOrderList(jobStatus, page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getNotAcceptOderList(page: Int) = launch({ + val response = RetrofitServiceManager.getNotAcceptOderList(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getNotHandleOderList(page: Int) = launch({ + val response = RetrofitServiceManager.getNotHandleOderList(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun countWorkOrderByState() = launch({ + val response = RetrofitServiceManager.countWorkOrderByState() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + val map = HashMap(4) + + val jsonObject = JSONObject(response) + val data = jsonObject.getJSONObject("data") + map["beforeGet"] = data.getString("beforeGet") + map["beforeConfirm"] = data.getString("beforeConfirm") + map["inHandle"] = data.getString("inHandle") + map["over"] = data.getString("over") + resultModel.value = map + } + }, { + it.printStackTrace() + }) + + fun getOrderStatus() = launch({ + val response = RetrofitServiceManager.getOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt deleted file mode 100644 index 1c5a8f2..0000000 --- a/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.app.smartwell.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.app.smartwell.extensions.separateResponseCode -import com.casic.app.smartwell.model.SearchResultModel -import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.utils.LoadState - -class SearchOrderViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val listModel = MutableLiveData() - - fun getSearchResult( - keywords: String, - alarmContent: String, - alarmLevel: String, - jobStatus: String, - deptId: String, - beginTime: String, - endTime: String, - offset: Int - ) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getSearchResult( - keywords, alarmContent, alarmLevel, jobStatus, deptId, beginTime, endTime, offset - ) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - listModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellListViewModel.kt deleted file mode 100644 index 3b8cac5..0000000 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellListViewModel.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.app.smartwell.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.app.smartwell.base.BaseApplication -import com.casic.app.smartwell.extensions.separateResponseCode -import com.casic.app.smartwell.extensions.toErrorMessage -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.model.WellListModel -import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show - -class WellListViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val listModel = MutableLiveData() - val totalWellModel = MutableLiveData() - - fun getWellListByPage( - keywords: String, wellType: String, deptid: String, bfzt: String, page: Int - ) = launch({ - val response = RetrofitServiceManager.getWellListByPage( - keywords, wellType, deptid, bfzt, page - ) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - listModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - }, { - it.printStackTrace() - }) - - fun getWellList() = launch({ - val response = RetrofitServiceManager.getWellList() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - totalWellModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.get()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellViewModel.kt index 8c0316f..3d41e9b 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellViewModel.kt @@ -3,9 +3,12 @@ import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseApplication import com.casic.app.smartwell.extensions.separateResponseCode +import com.casic.app.smartwell.extensions.toErrorMessage import com.casic.app.smartwell.model.AuthorDeptModel import com.casic.app.smartwell.model.CommonResultModel +import com.casic.app.smartwell.model.MapWellListModel import com.casic.app.smartwell.model.WellDetailModel +import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellMonitorModel import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -24,6 +27,8 @@ val wellDetailModel = MutableLiveData() val commonResultModel = MutableLiveData() val monitorModel = MutableLiveData() + val listModel = MutableLiveData() + val totalWellModel = MutableLiveData() fun countWellByState() = launch({ val response = RetrofitServiceManager.countWellByState() @@ -113,4 +118,34 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun getWellListByPage( + keywords: String, wellType: String, deptid: String, bfzt: String, page: Int + ) = launch({ + val response = RetrofitServiceManager.getWellListByPage( + keywords, wellType, deptid, bfzt, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getWellList() = launch({ + val response = RetrofitServiceManager.getWellList() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + totalWellModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt deleted file mode 100644 index 4afc690..0000000 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.casic.app.smartwell.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.app.smartwell.extensions.separateResponseCode -import com.casic.app.smartwell.model.OrderListModel -import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch - -class WorkOrderListViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val resultModel = MutableLiveData() - - fun getWorkOrderListByState(jobStatus: String, page: Int) = launch({ - val response = RetrofitServiceManager.getWorkOrderList(jobStatus, page) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - resultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - }, { - it.printStackTrace() - }) - - fun getNotAcceptOderList(page: Int) = launch({ - val response = RetrofitServiceManager.getNotAcceptOderList(page) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - resultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - }, { - it.printStackTrace() - }) - - fun getNotHandleOderList(page: Int) = launch({ - val response = RetrofitServiceManager.getNotHandleOderList(page) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - resultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt deleted file mode 100644 index 49e22c4..0000000 --- a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageFragment.kt +++ /dev/null @@ -1,407 +0,0 @@ -package com.casic.app.smartwell.fragment - -import android.graphics.Point -import android.os.Bundle -import android.os.CountDownTimer -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.AMap -import com.amap.api.maps.AMapOptions -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter -import com.amap.api.maps.model.BitmapDescriptorFactory -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.LatLng -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MarkerOptions -import com.casic.app.smartwell.R -import com.casic.app.smartwell.databinding.FragmentHomeBinding -import com.casic.app.smartwell.extensions.initImmersionBar -import com.casic.app.smartwell.extensions.valueToType -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.utils.LocaleConstant -import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.view.DeployedWellActivity -import com.casic.app.smartwell.view.OvertimeOrderActivity -import com.casic.app.smartwell.view.UnDeployWellActivity -import com.casic.app.smartwell.view.WellManagementActivity -import com.casic.app.smartwell.view.WellOperationActivity -import com.casic.app.smartwell.vm.WellListViewModel -import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter -import com.pengxh.kt.lite.adapter.ViewHolder -import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.widget.EasyPopupWindow -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog - -class HomePageFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, - AMap.OnInfoWindowClickListener { - - private val kTag = "HomePageFragment" - private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } - private lateinit var wellViewModel: WellViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel - private lateinit var wellListViewModel: WellListViewModel - private lateinit var aMap: AMap - - /** - * 所有的marker - */ - private var allMarkerOptions: MutableList = ArrayList() - - /** - * 视野内的marker - */ - private var markerOptionsInView: MutableList = ArrayList() - - /** - * 自定义Marker弹出框 - * */ - private lateinit var v: View - - /** - * 所有窨井列表信息集合 - * */ - private var wellModels: MutableList = ArrayList() - - override fun initViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentHomeBinding { - return FragmentHomeBinding.inflate(inflater, container, false) - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, R.color.mainThemeColor) - binding.titleView.text = "首页" - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - val menuItems = ArrayList() - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] - ) - ) - menuItems.add( - EasyPopupWindow.MenuItem( - LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] - ) - ) - easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - - //初始化vm - wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - - //获取所有窨井数据 - httpCountDownTimer.start() - LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") - //获取所有窨井数据 - wellListViewModel.getWellList() - wellListViewModel.totalWellModel.observe(viewLifecycleOwner) { - if (it.code == 200) { - val latitudeList: MutableList = ArrayList() - val longitudeList: MutableList = ArrayList() - it.data?.forEach { well -> - val lat = well.latGaode.toString() - val lng = well.lngGaode.toString() - if (lat.isNotBlank() && lng.isNotBlank()) { - //返回true代表当前位置在大陆、港澳地区,反之不在 - val latitude = lat.toDouble() - val longitude = lng.toDouble() - if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { - //缓存所有设备详情,点击Marker时候需要 - wellModels.add(well) - //分别缓存经、纬度 - latitudeList.add(latitude) - longitudeList.add(longitude) - //将所有设备信息转化缓存为Marker点 - allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(well.wellTypeName) - .snippet(well.wellName) - ) - } - } - } - -// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// if (aMapLocation != null) { -// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// } -// } -// }, false) - //计算所有点的中心点位置 - val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) - //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) - val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 1500, null) - } - } - - //地图初始化 - initMap(savedInstanceState) - - //获取窨井监控数据 - wellViewModel.countResultModel.observe(viewLifecycleOwner) { - binding.deployedWellView.text = it["bfWell"] - binding.unDeployedWellView.text = it["cfWell"] - binding.allWellDataView.text = it["total"] - } - - //获取工单数据 - workOrderViewModel.resultModel.observe(viewLifecycleOwner) { - if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || - it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 - ) { - binding.todoDataView.textSize = 36f - binding.undeterminedDataView.textSize = 36f - binding.inHandleDataView.textSize = 36f - binding.completedDataView.textSize = 36f - } - binding.todoDataView.text = it["beforeGet"] - binding.undeterminedDataView.text = it["beforeConfirm"] - binding.inHandleDataView.text = it["inHandle"] - binding.completedDataView.text = it["over"] - } - - //首页功能块 - val homeRecycleAdapter = object : NormalRecyclerAdapter( - R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() - ) { - override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { - viewHolder - .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) - .setText(R.id.textView, item) - } - } - binding.homeRecyclerView.adapter = homeRecycleAdapter - homeRecycleAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: String) { - when (position) { - 0 -> requireContext().navigatePageTo() - 1 -> requireContext().navigatePageTo() - 2 -> requireContext().navigatePageTo() - } - } - }) - } - - private fun initMap(savedInstanceState: Bundle?) { - binding.mapView.onCreate(savedInstanceState) - aMap = binding.mapView.map - aMap.mapType = AMap.MAP_TYPE_NORMAL - val uiSettings = aMap.uiSettings - uiSettings.isCompassEnabled = true - uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER - uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 - - // 地图加载成功监听 - aMap.addOnMapLoadedListener(this) - // 地图缩放监听 - aMap.addOnCameraChangeListener(this) - // marker 点击事件监听 - aMap.addOnMarkerClickListener(this) - // 点击marker弹出自定义popup - aMap.setInfoWindowAdapter(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) - } - - override fun initEvent() { - binding.rightOptionView.setOnClickListener { - val x = binding.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) - } - - //撤防点位 - binding.unDeployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //布防点位 - binding.deployedLayout.setOnClickListener { - requireContext().navigatePageTo() - } - - //所有点位 - binding.allWellLayout.setOnClickListener { - requireContext().navigatePageTo() - } - } - - override fun observeRequestState() { - - } - - override fun onMapLoaded() { - //地图加载成功之后显示聚合点数据 - initClustersMarkers() - } - - override fun onCameraChange(p0: CameraPosition?) { - - } - - /** - * http请求计时器 - * */ - private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { - override fun onFinish() { - "请求服务器超时,请退出后重试".show(requireContext()) - LoadingDialogHub.dismiss() - } - - override fun onTick(millisUntilFinished: Long) { - - } - } - - //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker - override fun onCameraChangeFinish(p0: CameraPosition?) { - //地图缩放之后显示聚合点数据 - LoadingDialogHub.dismiss() - httpCountDownTimer.cancel() - initClustersMarkers() - } - - private fun initClustersMarkers() { - val proj = aMap.projection - val dm = resources.displayMetrics - var screenLocation: Point - markerOptionsInView.clear() - // 获取在当前视野内的marker - allMarkerOptions.forEach { - screenLocation = proj.toScreenLocation(it.position) - if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { - it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) - markerOptionsInView.add(it) - } - } - markerOptionsInView.forEach { - aMap.addMarker(it) - } - } - - override fun onMarkerClick(marker: Marker?): Boolean { - v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) - - //显示闸井信息 - marker?.showInfoWindow() - return true - } - - override fun getInfoWindow(marker: Marker?): View { - //反射得到popup里面的控件对象 - val wellNameView = v.findViewById(R.id.wellNameView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val wellTypeView = v.findViewById(R.id.wellTypeView) - val wellStateView = v.findViewById(R.id.wellStateView) - val deepView = v.findViewById(R.id.deepView) - val locationView = v.findViewById(R.id.locationView) - - //绑定数据 - val clickedLatLng = marker?.position!! - wellModels.forEach { well -> - if (clickedLatLng.latitude == well.latGaode!!.toDouble() - && clickedLatLng.longitude == well.lngGaode!!.toDouble() - ) { - wellNameView.text = String.format("点位名称: ${well.wellName}") - wellCodeView.text = String.format("点位编号: ${well.wellCode}") - wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") - val bfztName = if (well.bfzt == "1") { - "已布防" - } else { - "已撤防" - } - wellStateView.text = String.format("布/撤防状态: $bfztName") - deepView.text = String.format("点位深度: ${well.deep}m") - locationView.text = String.format("详细位置: ${well.position}") - } - } - return v - } - - /** - * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 - * */ - override fun getInfoContents(p0: Marker?): View? = null - - override fun onInfoWindowClick(p0: Marker?) { - p0?.apply { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val lat = position.latitude.toString() - val lng = position.longitude.toString() - if (lat.isBlank() || lng.isBlank()) { - "点位经纬度异常,无法开启导航".show(requireContext()) - return - } - RouteOnMap.startNavigation( - requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) - ) - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - /***以下是地图生命周期管理************************************************************************/ - override fun onResume() { - super.onResume() - binding.mapView.onResume() - //每次页面切换都需要重新刷新不同状态的窨井数量 - wellViewModel.countWellByState() - workOrderViewModel.countWorkOrderByState() - } - - override fun onPause() { - super.onPause() - binding.mapView.onPause() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - binding.mapView.onSaveInstanceState(outState) - } - - override fun onDestroy() { - super.onDestroy() - binding.mapView.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt new file mode 100644 index 0000000..96df110 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageHaveClusterFragment.kt @@ -0,0 +1,407 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位带聚合效果 + * */ +class HomePageHaveClusterFragment : KotlinBaseFragment(), AMap.OnMapLoadedListener, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { + + private val kTag = "HaveClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions() + .position(LatLng(latitude, longitude)) + .title(well.wellTypeName) + .snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || + it["inHandle"]!!.length > 4 || it["over"]!!.length > 4 + ) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder + .setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() + && clickedLatLng.longitude == well.lngGaode!!.toDouble() + ) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt new file mode 100644 index 0000000..a54d213 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/fragment/HomePageNoClusterFragment.kt @@ -0,0 +1,395 @@ +package com.casic.app.smartwell.fragment + +import android.graphics.Point +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.databinding.FragmentHomeBinding +import com.casic.app.smartwell.extensions.initImmersionBar +import com.casic.app.smartwell.extensions.valueToType +import com.casic.app.smartwell.model.MapWellListModel +import com.casic.app.smartwell.utils.LocaleConstant +import com.casic.app.smartwell.utils.RouteOnMap +import com.casic.app.smartwell.view.DeployedWellActivity +import com.casic.app.smartwell.view.OvertimeOrderActivity +import com.casic.app.smartwell.view.UnDeployWellActivity +import com.casic.app.smartwell.view.WellManagementActivity +import com.casic.app.smartwell.view.WellOperationActivity +import com.casic.app.smartwell.vm.OrderViewModel +import com.casic.app.smartwell.vm.WellViewModel +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.widget.EasyPopupWindow +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog + +/** + * 地图点位不带聚合效果 + * */ +class HomePageNoClusterFragment : KotlinBaseFragment(), + AMap.OnMapLoadedListener, AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, + AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener { + + private val kTag = "NoClusterFragment" + private val easyPopupWindow by lazy { EasyPopupWindow(requireContext()) } + private lateinit var wellViewModel: WellViewModel + private lateinit var orderViewModel: OrderViewModel + private lateinit var aMap: AMap + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() + + /** + * 自定义Marker弹出框 + * */ + private lateinit var v: View + + /** + * 所有窨井列表信息集合 + * */ + private var wellModels: MutableList = ArrayList() + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, R.color.mainThemeColor) + binding.titleView.text = "首页" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + val menuItems = ArrayList() + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[0], LocaleConstant.POPUP_TITLES[0] + ) + ) + menuItems.add( + EasyPopupWindow.MenuItem( + LocaleConstant.POPUP_IMAGES[1], LocaleConstant.POPUP_TITLES[1] + ) + ) + easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + + //初始化vm + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + + //获取所有窨井数据 + httpCountDownTimer.start() + LoadingDialogHub.show(requireActivity(), "数据加载中,请稍后...") + //获取所有窨井数据 + wellViewModel.getWellList() + wellViewModel.totalWellModel.observe(this) { + if (it.code == 200) { + val latitudeList: MutableList = ArrayList() + val longitudeList: MutableList = ArrayList() + it.data?.forEach { well -> + val lat = well.latGaode.toString() + val lng = well.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + //缓存所有设备详情,点击Marker时候需要 + wellModels.add(well) + //分别缓存经、纬度 + latitudeList.add(latitude) + longitudeList.add(longitude) + //将所有设备信息转化缓存为Marker点 + allMarkerOptions.add( + MarkerOptions().position(LatLng(latitude, longitude)) + .title(well.wellTypeName).snippet(well.wellName) + ) + } + } + } + +// LocationHelper.obtainCurrentLocation(requireContext(), object : ILocationListener { +// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { +// if (aMapLocation != null) { +// val centerLatLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) +// //移动到指定经纬度 +// val cameraPosition = CameraPosition(centerLatLng, 12f, 0f, 0f) +// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) +// aMap.animateCamera(cameraUpdate, 1500, null) +// } +// } +// }, false) + //计算所有点的中心点位置 + val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) + //移动到指定经纬度 + val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 1500, null) + } + } + + //地图初始化 + initMap(savedInstanceState) + + //获取窨井监控数据 + wellViewModel.countResultModel.observe(this) { + binding.deployedWellView.text = it["bfWell"] + binding.unDeployedWellView.text = it["cfWell"] + binding.allWellDataView.text = it["total"] + } + + //获取工单数据 + orderViewModel.resultModel.observe(this) { + if (it["beforeGet"]!!.length > 4 || it["beforeConfirm"]!!.length > 4 || it["inHandle"]!!.length > 4 || it["over"]!!.length > 4) { + binding.todoDataView.textSize = 36f + binding.undeterminedDataView.textSize = 36f + binding.inHandleDataView.textSize = 36f + binding.completedDataView.textSize = 36f + } + binding.todoDataView.text = it["beforeGet"] + binding.undeterminedDataView.text = it["beforeConfirm"] + binding.inHandleDataView.text = it["inHandle"] + binding.completedDataView.text = it["over"] + } + + //首页功能块 + val homeRecycleAdapter = object : NormalRecyclerAdapter( + R.layout.item_home_page_rv, LocaleConstant.HOME_ITEMS.toMutableList() + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, LocaleConstant.HOME_ICONS[position]) + .setText(R.id.textView, item) + } + } + binding.homeRecyclerView.adapter = homeRecycleAdapter + homeRecycleAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: String) { + when (position) { + 0 -> requireContext().navigatePageTo() + 1 -> requireContext().navigatePageTo() + 2 -> requireContext().navigatePageTo() + } + } + }) + } + + private fun initMap(savedInstanceState: Bundle?) { + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + + // 地图加载成功监听 + aMap.addOnMapLoadedListener(this) + // 地图缩放监听 + aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) + } + + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + val x = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + //撤防点位 + binding.unDeployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //布防点位 + binding.deployedLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + //所有点位 + binding.allWellLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + override fun observeRequestState() { + + } + + override fun onMapLoaded() { + //地图加载成功之后显示聚合点数据 + initClustersMarkers() + } + + override fun onCameraChange(p0: CameraPosition?) { + + } + + /** + * http请求计时器 + * */ + private val httpCountDownTimer = object : CountDownTimer(15 * 1000, 1000) { + override fun onFinish() { + "请求服务器超时,请退出后重试".show(requireContext()) + LoadingDialogHub.dismiss() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker + override fun onCameraChangeFinish(p0: CameraPosition?) { + //地图缩放之后显示聚合点数据 + LoadingDialogHub.dismiss() + httpCountDownTimer.cancel() + initClustersMarkers() + } + + private fun initClustersMarkers() { + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + it.icon(BitmapDescriptorFactory.fromBitmap(BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap)) + markerOptionsInView.add(it) + } + } + markerOptionsInView.forEach { + aMap.addMarker(it) + } + } + + override fun onMarkerClick(marker: Marker?): Boolean { + v = LayoutInflater.from(requireContext()).inflate(R.layout.popup_map_info, null) + + //显示闸井信息 + marker?.showInfoWindow() + return true + } + + override fun getInfoWindow(marker: Marker?): View { + //反射得到popup里面的控件对象 + val wellNameView = v.findViewById(R.id.wellNameView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val wellTypeView = v.findViewById(R.id.wellTypeView) + val wellStateView = v.findViewById(R.id.wellStateView) + val deepView = v.findViewById(R.id.deepView) + val locationView = v.findViewById(R.id.locationView) + + //绑定数据 + val clickedLatLng = marker?.position!! + wellModels.forEach { well -> + if (clickedLatLng.latitude == well.latGaode!!.toDouble() && clickedLatLng.longitude == well.lngGaode!!.toDouble()) { + wellNameView.text = String.format("点位名称: ${well.wellName}") + wellCodeView.text = String.format("点位编号: ${well.wellCode}") + wellTypeView.text = String.format("点位类型: ${well.wellType.valueToType()}") + val bfztName = if (well.bfzt == "1") { + "已布防" + } else { + "已撤防" + } + wellStateView.text = String.format("布/撤防状态: $bfztName") + deepView.text = String.format("点位深度: ${well.deep}m") + locationView.text = String.format("详细位置: ${well.position}") + } + } + return v + } + + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + + override fun onInfoWindowClick(p0: Marker?) { + p0?.apply { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val lat = position.latitude.toString() + val lng = position.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "点位经纬度异常,无法开启导航".show(requireContext()) + return + } + RouteOnMap.startNavigation( + requireContext(), snippet, LatLng(lat.toDouble(), lng.toDouble()) + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + binding.mapView.onResume() + //每次页面切换都需要重新刷新不同状态的窨井数量 + wellViewModel.countWellByState() + orderViewModel.countWorkOrderByState() + } + + override fun onPause() { + super.onPause() + binding.mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + binding.mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt index 257cad1..7b890ac 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/NoticePageFragment.kt @@ -3,6 +3,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,9 +29,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class NoticePageFragment : KotlinBaseFragment() { +class NoticePageFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var noticeDataAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 0 // 本地数据库分页从0开始 @@ -59,7 +60,6 @@ ) userId = userDataModel.id.toString() } - weakReferenceHandler = WeakReferenceHandler(callback) } override fun onResume() { @@ -111,8 +111,8 @@ } } - private val callback = Handler.Callback { - if (it.what == 2022070401) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022070401) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有任何报警通知") { pageIndex = 0 @@ -180,7 +180,7 @@ binding.noticeRecyclerView.adapter = noticeDataAdapter } } - true + return true } //TODO Test diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt index 82f07c3..f6f5f89 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderCompletedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderCompletedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderCompletedFragment : KotlinBaseFragment() { +class OrderCompletedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var completedAdapter: OrderCompletedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +42,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +71,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +114,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("3", pageIndex) + orderViewModel.getWorkOrderListByState("3", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您还没有处理完成过任何工单") { pageIndex = 1 @@ -147,11 +145,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt index ea0bc05..db77028 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderInHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,8 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -19,11 +19,10 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderInHandleFragment : KotlinBaseFragment() { +class OrderInHandleFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var inHandleAdapter: OrderInHandleAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,11 +41,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -73,7 +70,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -116,11 +113,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("2", pageIndex) + orderViewModel.getWorkOrderListByState("2", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033002) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033002) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -147,11 +144,11 @@ "工单编号异常,无法查看工单流转记录".show(requireContext()) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt index e33a022..c392fba 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,17 +11,18 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotConfirmedDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class OrderNotConfirmedFragment : KotlinBaseFragment() { +class OrderNotConfirmedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -39,9 +41,8 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -98,11 +99,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("1", pageIndex) + orderViewModel.getWorkOrderListByState("1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022033001) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022033001) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您确认的工单") { pageIndex = 1 @@ -125,6 +126,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt index 95563a1..4711be9 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OrderNotProcessedFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -21,10 +22,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class OrderNotProcessedFragment : KotlinBaseFragment() { +class OrderNotProcessedFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -45,11 +47,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +123,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getWorkOrderListByState("0", pageIndex) + orderViewModel.getWorkOrderListByState("0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032901) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032901) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("没有需要您处理的工单") { pageIndex = 1 @@ -175,6 +176,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt index 99cf746..1cc5c72 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotAcceptFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -11,7 +12,7 @@ import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderNotProcessedDetailActivity import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,10 +25,11 @@ /** * 超时未接单和待处理一样,可以共用布局和adapter * */ -class OvertimeNotAcceptFragment : KotlinBaseFragment() { +class OvertimeNotAcceptFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var notProcessedAdapter: OrderNotProcessedAdapter private var dataBeans: MutableList = ArrayList() @@ -48,11 +50,10 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -125,11 +126,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotAcceptOderList(page = pageIndex) + orderViewModel.getNotAcceptOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040601) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040601) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("您没有超时未处理的工单") { pageIndex = 1 @@ -178,6 +179,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt index feb5c8c..2fcb189 100644 --- a/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/fragment/OvertimeNotHandleFragment.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -10,7 +11,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.OrderListModel import com.casic.app.smartwell.view.OrderInHandleDetailActivity -import com.casic.app.smartwell.vm.WorkOrderListViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.navigatePageTo @@ -20,10 +21,11 @@ /** * 超时未处理和待确认一样,可以共用布局和adapter * */ -class OvertimeNotHandleFragment : KotlinBaseFragment() { +class OvertimeNotHandleFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workOrderListViewModel: WorkOrderListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var notConfirmedAdapter: OrderNotConfirmedAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -42,10 +44,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderListViewModel = ViewModelProvider(this)[WorkOrderListViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] - workOrderListViewModel.resultModel.observe(this) { + orderViewModel.orderList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -102,11 +103,11 @@ } private fun getWorkOrderList() { - workOrderListViewModel.getNotHandleOderList(page = pageIndex) + orderViewModel.getNotHandleOderList(page = pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022040801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage("真不错,您已经处理完所有工单") { pageIndex = 1 @@ -129,6 +130,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt index 23577c6..06d3d2b 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/LocaleConstant.kt @@ -29,7 +29,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val RADIUS_SIZE = 10 //相距多少米才聚合,单位:米 + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val PUSH_REGISTER = 2022082901 diff --git a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt index f782ab9..6d7d85c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/DeployedWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -23,12 +23,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class DeployedWellActivity : KotlinBaseActivity() { +class DeployedWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@DeployedWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -41,11 +40,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -124,11 +121,11 @@ } private fun getWellListByPage() { - wellListViewModel.getWellListByPage("", "", "", "1", pageIndex) + wellViewModel.getWellListByPage("", "", "", "1", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030102) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030102) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -219,6 +216,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt index e8a6614..9270fa1 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/MainActivity.kt @@ -10,7 +10,7 @@ import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.ViewPagerAdapter import com.casic.app.smartwell.databinding.ActivityMainBinding -import com.casic.app.smartwell.fragment.HomePageFragment +import com.casic.app.smartwell.fragment.HomePageNoClusterFragment import com.casic.app.smartwell.fragment.MinePageFragment import com.casic.app.smartwell.fragment.NoticePageFragment import com.casic.app.smartwell.fragment.OrderListFragment @@ -34,7 +34,8 @@ private lateinit var pushViewModel: PushViewModel init { - fragmentPages.add(HomePageFragment()) + fragmentPages.add(HomePageNoClusterFragment()) +// fragmentPages.add(HomePageHaveClusterFragment()) fragmentPages.add(OrderListFragment()) fragmentPages.add(NoticePageFragment()) fragmentPages.add(MinePageFragment()) diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt index 000ac5c..0a22f67 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderCompletedDetailActivity.kt @@ -9,7 +9,7 @@ import com.casic.app.smartwell.extensions.combineImagePath import com.casic.app.smartwell.extensions.initImmersionBar import com.casic.app.smartwell.extensions.toChinese -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor @@ -22,7 +22,7 @@ class OrderCompletedDetailActivity : KotlinBaseActivity() { - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private val context: Context = this@OrderCompletedDetailActivity override fun initViewBinding(): ActivityOrderCompletedDetailBinding { @@ -39,9 +39,9 @@ override fun initOnCreate(savedInstanceState: Bundle?) { val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -146,7 +146,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 9cc10c7..bda6697 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,16 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity() { +class OrderInHandleDetailActivity : KotlinBaseActivity(), + Handler.Callback { private val kTag = "OrderInHandleDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private val context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -70,18 +72,17 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter val jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!//初始化图片九宫格 - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -303,7 +304,7 @@ } override fun observeRequestState() { - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -456,11 +457,11 @@ .build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062901) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062901) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 9a7fac4..8a0017b 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.os.CountDownTimer import android.os.Handler +import android.os.Message import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -20,9 +21,9 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.GlideLoadEngine import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UploadImageViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.casic.app.smartwell.widgets.SingleChoiceDialog import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector @@ -44,15 +45,15 @@ import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity() { + KotlinBaseActivity(), Handler.Callback { private val kTag = "OrderNotConfirmedDetailActivity" - private lateinit var workOrderViewModel: WorkOrderViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var needHandle: String private val context: Context = this@OrderNotConfirmedDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 @@ -76,14 +77,13 @@ imageAdapter = EditableImageAdapter(this, 3, 13) binding.addImageRecyclerView.adapter = imageAdapter - weakReferenceHandler = WeakReferenceHandler(callback) - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -255,7 +255,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -399,11 +399,11 @@ }).build().show() } - private val callback = Handler.Callback { - if (it.what == 2022062902) { - analyticalSelectResults(it.obj as LocalMedia) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022062902) { + analyticalSelectResults(msg.obj as LocalMedia) } - true + return true } private fun analyticalSelectResults(result: LocalMedia) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt index e9a9850..b3586f5 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotProcessedDetailActivity.kt @@ -11,8 +11,8 @@ import com.casic.app.smartwell.extensions.toChinese import com.casic.app.smartwell.utils.RouteOnMap import com.casic.app.smartwell.vm.OperationViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.WellViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show @@ -26,7 +26,7 @@ KotlinBaseActivity() { private lateinit var jobId: String - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var wellViewModel: WellViewModel private lateinit var operationViewModel: OperationViewModel private val context: Context = this@OrderNotProcessedDetailActivity @@ -45,12 +45,12 @@ override fun initOnCreate(savedInstanceState: Bundle?) { this.jobId = intent.getStringExtra(Constant.INTENT_PARAM)!! - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - workOrderViewModel.getWorkOrderDetail(jobId) - workOrderViewModel.detailModel.observe(this) { + orderViewModel.getWorkOrderDetail(jobId) + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] binding.orderBaseInclude.alarmContentView.text = orderDetail.alarmContentName @@ -154,7 +154,7 @@ override fun observeRequestState() { //数据加载状态处理 - workOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt index c5c9e3c..bc34d09 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchOrderActivity.kt @@ -17,8 +17,8 @@ import com.casic.app.smartwell.model.OrderStatusModel import com.casic.app.smartwell.utils.LocaleConstant import com.casic.app.smartwell.vm.AlarmViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.vm.UserViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -33,7 +33,7 @@ private lateinit var userViewModel: UserViewModel private lateinit var alarmViewModel: AlarmViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var orderViewModel: OrderViewModel private lateinit var inflater: LayoutInflater private lateinit var contentTypeAdapter: TagAdapter private lateinit var orderStatusAdapter: TagAdapter @@ -112,8 +112,8 @@ } //工单状态 - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] - workOrderViewModel.getOrderStatus() + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] + orderViewModel.getOrderStatus() /** * 章丘项目只有一/二级报警 * */ @@ -141,7 +141,7 @@ this.alarmLevel = levelMaps[position]["value"].toString() true } - workOrderViewModel.orderStatusModel.observe(this) { + orderViewModel.orderStatusModel.observe(this) { if (it.code == 200) { //构造一个默认值 val bean = OrderStatusModel.DataBean() diff --git a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt index 83f7f19..683effc 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/SearchResultActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.app.smartwell.R @@ -11,8 +12,7 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.SearchResultModel import com.casic.app.smartwell.vm.OperationViewModel -import com.casic.app.smartwell.vm.SearchOrderViewModel -import com.casic.app.smartwell.vm.WorkOrderViewModel +import com.casic.app.smartwell.vm.OrderViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets @@ -24,11 +24,11 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class SearchResultActivity : KotlinBaseActivity() { - private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var searchOrderViewModel: SearchOrderViewModel +class SearchResultActivity : KotlinBaseActivity(), Handler.Callback { + + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private lateinit var orderViewModel: OrderViewModel private lateinit var operationViewModel: OperationViewModel - private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var args: ArrayList private lateinit var searchResultAdapter: SearchResultAdapter private val context = this@SearchResultActivity @@ -52,13 +52,11 @@ override fun initOnCreate(savedInstanceState: Bundle?) { args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - weakReferenceHandler = WeakReferenceHandler(callback) - searchOrderViewModel = ViewModelProvider(this)[SearchOrderViewModel::class.java] + orderViewModel = ViewModelProvider(this)[OrderViewModel::class.java] operationViewModel = ViewModelProvider(this)[OperationViewModel::class.java] - workOrderViewModel = ViewModelProvider(this)[WorkOrderViewModel::class.java] getSearchResult() - searchOrderViewModel.listModel.observe(this) { + orderViewModel.searchResult.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -85,7 +83,7 @@ } } - workOrderViewModel.detailModel.observe(this) { + orderViewModel.detailModel.observe(this) { if (it.code == 200) { val orderDetail = it.data!![0] val orderFlow = orderDetail.flow!! @@ -104,7 +102,7 @@ } override fun observeRequestState() { - searchOrderViewModel.loadState.observe(this) { + orderViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后") else -> LoadingDialogHub.dismiss() @@ -144,13 +142,13 @@ } private fun getSearchResult() { - searchOrderViewModel.getSearchResult( + orderViewModel.getSearchResult( args[0], args[1], args[2], args[3], args[4], args[5], args[6], pageIndex ) } - private val callback = Handler.Callback { - if (it.what == 2022040101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022040101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -224,11 +222,11 @@ "工单编号异常,无法查看工单流转记录".show(context) return } - workOrderViewModel.getWorkOrderDetail(jobId) + orderViewModel.getWorkOrderDetail(jobId) } }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt index 95f44ea..7e3fd0c 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/UnDeployWellActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -12,7 +13,6 @@ import com.casic.app.smartwell.extensions.showEmptyPage import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -22,12 +22,11 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler -class UnDeployWellActivity : KotlinBaseActivity() { +class UnDeployWellActivity : KotlinBaseActivity(), Handler.Callback { private val context: Context = this@UnDeployWellActivity - private lateinit var wellListViewModel: WellListViewModel + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private lateinit var wellViewModel: WellViewModel - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var unDeployAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -40,11 +39,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -122,11 +119,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage("", "", "", "0", pageIndex) + wellViewModel.getWellListByPage("", "", "", "0", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2023030101) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023030101) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { pageIndex = 1 @@ -197,6 +194,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt index 561a7fa..b04283d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellManagementActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -25,14 +25,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler -class WellManagementActivity : KotlinBaseActivity() { +class WellManagementActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellListAdapter: NormalRecyclerAdapter private val context = this@WellManagementActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -54,8 +53,6 @@ easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -69,7 +66,7 @@ } getWellList() - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -143,11 +140,11 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) + wellViewModel.getWellListByPage(keywords, wellType, "", "", pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022032501) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032501) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -216,6 +213,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt index d90490c..989994d 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/WellOperationActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -13,7 +14,6 @@ import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellTypeModel import com.casic.app.smartwell.utils.RouteOnMap -import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WellViewModel import com.casic.app.smartwell.widgets.WellTypePopupWindow import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -27,14 +27,13 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -class WellOperationActivity : KotlinBaseActivity() { +class WellOperationActivity : KotlinBaseActivity(), Handler.Callback { private lateinit var wellViewModel: WellViewModel - private lateinit var wellListViewModel: WellListViewModel private lateinit var easyPopupWindow: WellTypePopupWindow - private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var wellOperationAdapter: NormalRecyclerAdapter private val context = this@WellOperationActivity + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private var items: MutableList = ArrayList() private var wellTypeModel = WellTypeModel("", "") private var dataBeans: MutableList = ArrayList() @@ -56,9 +55,7 @@ override fun initOnCreate(savedInstanceState: Bundle?) { easyPopupWindow = WellTypePopupWindow(this) easyPopupWindow.setBackgroundDrawable(null) - weakReferenceHandler = WeakReferenceHandler(callback) wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] - wellListViewModel = ViewModelProvider(this)[WellListViewModel::class.java] wellViewModel.getWellType() wellViewModel.wellTypeModel.observe(this) { @@ -71,7 +68,7 @@ } } - wellListViewModel.listModel.observe(this) { + wellViewModel.listModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -175,7 +172,7 @@ } private fun getWellList() { - wellListViewModel.getWellListByPage( + wellViewModel.getWellListByPage( keywords = keywords, wellType = wellType, deptid = "", @@ -184,8 +181,8 @@ ) } - private val callback = Handler.Callback { - if (it.what == 2022032801) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022032801) { if (dataBeans.size == 0) { binding.emptyInclude.emptyView.showEmptyPage { keywords = "" @@ -297,6 +294,6 @@ }) } } - true + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt new file mode 100644 index 0000000..4cb26b7 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderViewModel.kt @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.extensions.separateResponseCode +import com.casic.app.smartwell.model.OrderDetailModel +import com.casic.app.smartwell.model.OrderListModel +import com.casic.app.smartwell.model.OrderStatusModel +import com.casic.app.smartwell.model.SearchResultModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.utils.LoadState +import org.json.JSONObject + +class OrderViewModel : BaseViewModel(){ + + private val gson by lazy { Gson() } + val searchResult = MutableLiveData() + val orderList = MutableLiveData() + val resultModel = MutableLiveData>() + val orderStatusModel = MutableLiveData() + val detailModel = MutableLiveData() + + fun getSearchResult( + keywords: String, + alarmContent: String, + alarmLevel: String, + jobStatus: String, + deptId: String, + beginTime: String, + endTime: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, deptId, beginTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + searchResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getWorkOrderListByState(jobStatus: String, page: Int) = launch({ + val response = RetrofitServiceManager.getWorkOrderList(jobStatus, page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getNotAcceptOderList(page: Int) = launch({ + val response = RetrofitServiceManager.getNotAcceptOderList(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getNotHandleOderList(page: Int) = launch({ + val response = RetrofitServiceManager.getNotHandleOderList(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderList.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun countWorkOrderByState() = launch({ + val response = RetrofitServiceManager.countWorkOrderByState() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + val map = HashMap(4) + + val jsonObject = JSONObject(response) + val data = jsonObject.getJSONObject("data") + map["beforeGet"] = data.getString("beforeGet") + map["beforeConfirm"] = data.getString("beforeConfirm") + map["inHandle"] = data.getString("inHandle") + map["over"] = data.getString("over") + resultModel.value = map + } + }, { + it.printStackTrace() + }) + + fun getOrderStatus() = launch({ + val response = RetrofitServiceManager.getOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt deleted file mode 100644 index 1c5a8f2..0000000 --- a/app/src/main/java/com/casic/app/smartwell/vm/SearchOrderViewModel.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.app.smartwell.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.app.smartwell.extensions.separateResponseCode -import com.casic.app.smartwell.model.SearchResultModel -import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.utils.LoadState - -class SearchOrderViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val listModel = MutableLiveData() - - fun getSearchResult( - keywords: String, - alarmContent: String, - alarmLevel: String, - jobStatus: String, - deptId: String, - beginTime: String, - endTime: String, - offset: Int - ) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getSearchResult( - keywords, alarmContent, alarmLevel, jobStatus, deptId, beginTime, endTime, offset - ) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - listModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellListViewModel.kt deleted file mode 100644 index 3b8cac5..0000000 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellListViewModel.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.app.smartwell.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.app.smartwell.base.BaseApplication -import com.casic.app.smartwell.extensions.separateResponseCode -import com.casic.app.smartwell.extensions.toErrorMessage -import com.casic.app.smartwell.model.MapWellListModel -import com.casic.app.smartwell.model.WellListModel -import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show - -class WellListViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val listModel = MutableLiveData() - val totalWellModel = MutableLiveData() - - fun getWellListByPage( - keywords: String, wellType: String, deptid: String, bfzt: String, page: Int - ) = launch({ - val response = RetrofitServiceManager.getWellListByPage( - keywords, wellType, deptid, bfzt, page - ) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - listModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - }, { - it.printStackTrace() - }) - - fun getWellList() = launch({ - val response = RetrofitServiceManager.getWellList() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - totalWellModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.get()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellViewModel.kt index 8c0316f..3d41e9b 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellViewModel.kt @@ -3,9 +3,12 @@ import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseApplication import com.casic.app.smartwell.extensions.separateResponseCode +import com.casic.app.smartwell.extensions.toErrorMessage import com.casic.app.smartwell.model.AuthorDeptModel import com.casic.app.smartwell.model.CommonResultModel +import com.casic.app.smartwell.model.MapWellListModel import com.casic.app.smartwell.model.WellDetailModel +import com.casic.app.smartwell.model.WellListModel import com.casic.app.smartwell.model.WellMonitorModel import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -24,6 +27,8 @@ val wellDetailModel = MutableLiveData() val commonResultModel = MutableLiveData() val monitorModel = MutableLiveData() + val listModel = MutableLiveData() + val totalWellModel = MutableLiveData() fun countWellByState() = launch({ val response = RetrofitServiceManager.countWellByState() @@ -113,4 +118,34 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun getWellListByPage( + keywords: String, wellType: String, deptid: String, bfzt: String, page: Int + ) = launch({ + val response = RetrofitServiceManager.getWellListByPage( + keywords, wellType, deptid, bfzt, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun getWellList() = launch({ + val response = RetrofitServiceManager.getWellList() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + totalWellModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt deleted file mode 100644 index 4afc690..0000000 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.casic.app.smartwell.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.app.smartwell.extensions.separateResponseCode -import com.casic.app.smartwell.model.OrderListModel -import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch - -class WorkOrderListViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val resultModel = MutableLiveData() - - fun getWorkOrderListByState(jobStatus: String, page: Int) = launch({ - val response = RetrofitServiceManager.getWorkOrderList(jobStatus, page) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - resultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - }, { - it.printStackTrace() - }) - - fun getNotAcceptOderList(page: Int) = launch({ - val response = RetrofitServiceManager.getNotAcceptOderList(page) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - resultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - }, { - it.printStackTrace() - }) - - fun getNotHandleOderList(page: Int) = launch({ - val response = RetrofitServiceManager.getNotHandleOderList(page) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - resultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt deleted file mode 100644 index cf8a4ff..0000000 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.casic.app.smartwell.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.app.smartwell.extensions.separateResponseCode -import com.casic.app.smartwell.model.OrderDetailModel -import com.casic.app.smartwell.model.OrderStatusModel -import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.utils.LoadState -import org.json.JSONObject - -class WorkOrderViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val resultModel = MutableLiveData>() - val orderStatusModel = MutableLiveData() - val detailModel = MutableLiveData() - - fun countWorkOrderByState() = launch({ - val response = RetrofitServiceManager.countWorkOrderByState() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - val map = HashMap(4) - - val jsonObject = JSONObject(response) - val data = jsonObject.getJSONObject("data") - map["beforeGet"] = data.getString("beforeGet") - map["beforeConfirm"] = data.getString("beforeConfirm") - map["inHandle"] = data.getString("inHandle") - map["over"] = data.getString("over") - resultModel.value = map - } - }, { - it.printStackTrace() - }) - - fun getOrderStatus() = launch({ - val response = RetrofitServiceManager.getOrderStatus() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - orderStatusModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - }, { - it.printStackTrace() - }) - - fun getWorkOrderDetail(id: String) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getWorkOrderDetail(id) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - detailModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) -} \ No newline at end of file