diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt index a4a509f..d77d955 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt @@ -17,6 +17,7 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_task_await.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -30,6 +31,7 @@ private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) @@ -75,6 +77,16 @@ .build().show() } } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } } override fun onResume() { @@ -168,6 +180,29 @@ item.orderId, item.sampleId ) } + + //收入 + viewHolder.setOnClickListener(R.id.receiveDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定将接收此任务?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.receiveDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } } } awaitTaskRecyclerView.adapter = detectionAdapter diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt index a4a509f..d77d955 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt @@ -17,6 +17,7 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_task_await.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -30,6 +31,7 @@ private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) @@ -75,6 +77,16 @@ .build().show() } } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } } override fun onResume() { @@ -168,6 +180,29 @@ item.orderId, item.sampleId ) } + + //收入 + viewHolder.setOnClickListener(R.id.receiveDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定将接收此任务?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.receiveDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } } } awaitTaskRecyclerView.adapter = detectionAdapter diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt index 6eef896..ecb72eb 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt @@ -1,18 +1,38 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_task_completed.* +import kotlinx.android.synthetic.main.include_empty_view.* class CompletedDetectionFragment : KotlinBaseFragment() { private val kTag = "CompletedDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +41,77 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + totalTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + totalTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042202) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "4", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + totalTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + totalTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "4", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_completed @@ -43,4 +123,58 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042202 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测完的样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_complete_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + } + } + totalTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt index a4a509f..d77d955 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt @@ -17,6 +17,7 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_task_await.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -30,6 +31,7 @@ private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) @@ -75,6 +77,16 @@ .build().show() } } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } } override fun onResume() { @@ -168,6 +180,29 @@ item.orderId, item.sampleId ) } + + //收入 + viewHolder.setOnClickListener(R.id.receiveDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定将接收此任务?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.receiveDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } } } awaitTaskRecyclerView.adapter = detectionAdapter diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt index 6eef896..ecb72eb 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt @@ -1,18 +1,38 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_task_completed.* +import kotlinx.android.synthetic.main.include_empty_view.* class CompletedDetectionFragment : KotlinBaseFragment() { private val kTag = "CompletedDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +41,77 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + totalTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + totalTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042202) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "4", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + totalTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + totalTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "4", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_completed @@ -43,4 +123,58 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042202 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测完的样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_complete_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + } + } + totalTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt index 6bf871f..07728b7 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt @@ -1,18 +1,40 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_task_under.* +import kotlinx.android.synthetic.main.include_empty_view.* class UnderDetectionFragment : KotlinBaseFragment() { private val kTag = "UnderDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +43,87 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + underTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + underTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042201) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() + } + } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "3", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + underTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + underTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "3", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_under @@ -43,4 +135,81 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042201 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测中样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_under_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + + //收入 + viewHolder.setOnClickListener(R.id.completeDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("此任务确定已完成?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.completeDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } + } + } + underTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt index a4a509f..d77d955 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt @@ -17,6 +17,7 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_task_await.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -30,6 +31,7 @@ private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) @@ -75,6 +77,16 @@ .build().show() } } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } } override fun onResume() { @@ -168,6 +180,29 @@ item.orderId, item.sampleId ) } + + //收入 + viewHolder.setOnClickListener(R.id.receiveDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定将接收此任务?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.receiveDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } } } awaitTaskRecyclerView.adapter = detectionAdapter diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt index 6eef896..ecb72eb 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt @@ -1,18 +1,38 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_task_completed.* +import kotlinx.android.synthetic.main.include_empty_view.* class CompletedDetectionFragment : KotlinBaseFragment() { private val kTag = "CompletedDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +41,77 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + totalTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + totalTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042202) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "4", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + totalTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + totalTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "4", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_completed @@ -43,4 +123,58 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042202 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测完的样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_complete_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + } + } + totalTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt index 6bf871f..07728b7 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt @@ -1,18 +1,40 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_task_under.* +import kotlinx.android.synthetic.main.include_empty_view.* class UnderDetectionFragment : KotlinBaseFragment() { private val kTag = "UnderDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +43,87 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + underTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + underTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042201) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() + } + } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "3", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + underTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + underTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "3", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_under @@ -43,4 +135,81 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042201 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测中样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_under_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + + //收入 + viewHolder.setOnClickListener(R.id.completeDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("此任务确定已完成?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.completeDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } + } + } + underTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a280712..e47639d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,12 @@ ): String /** + * 是否计量人员 + */ + @GET("/staff/isMeterStaff") + suspend fun isMeterStaff(@Header("token") token: String): String + + /** * 更新用户信息 */ @POST("/sys/mgr/update") @@ -560,6 +566,24 @@ ): String /** + * 收入待检测 + */ + @POST("/business/labExecutive/myExecutive/receive") + suspend fun receiveDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 完成检测中 + */ + @POST("/business/labExecutive/myExecutive/complete") + suspend fun completeDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取实时工作统计 */ @GET("/business/board/workStatistics") diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt index a4a509f..d77d955 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt @@ -17,6 +17,7 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_task_await.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -30,6 +31,7 @@ private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) @@ -75,6 +77,16 @@ .build().show() } } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } } override fun onResume() { @@ -168,6 +180,29 @@ item.orderId, item.sampleId ) } + + //收入 + viewHolder.setOnClickListener(R.id.receiveDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定将接收此任务?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.receiveDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } } } awaitTaskRecyclerView.adapter = detectionAdapter diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt index 6eef896..ecb72eb 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt @@ -1,18 +1,38 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_task_completed.* +import kotlinx.android.synthetic.main.include_empty_view.* class CompletedDetectionFragment : KotlinBaseFragment() { private val kTag = "CompletedDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +41,77 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + totalTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + totalTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042202) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "4", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + totalTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + totalTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "4", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_completed @@ -43,4 +123,58 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042202 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测完的样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_complete_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + } + } + totalTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt index 6bf871f..07728b7 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt @@ -1,18 +1,40 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_task_under.* +import kotlinx.android.synthetic.main.include_empty_view.* class UnderDetectionFragment : KotlinBaseFragment() { private val kTag = "UnderDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +43,87 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + underTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + underTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042201) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() + } + } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "3", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + underTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + underTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "3", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_under @@ -43,4 +135,81 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042201 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测中样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_under_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + + //收入 + viewHolder.setOnClickListener(R.id.completeDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("此任务确定已完成?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.completeDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } + } + } + underTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a280712..e47639d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,12 @@ ): String /** + * 是否计量人员 + */ + @GET("/staff/isMeterStaff") + suspend fun isMeterStaff(@Header("token") token: String): String + + /** * 更新用户信息 */ @POST("/sys/mgr/update") @@ -560,6 +566,24 @@ ): String /** + * 收入待检测 + */ + @POST("/business/labExecutive/myExecutive/receive") + suspend fun receiveDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 完成检测中 + */ + @POST("/business/labExecutive/myExecutive/complete") + suspend fun completeDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取实时工作统计 */ @GET("/business/board/workStatistics") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8c2a581..77834c6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -59,6 +59,13 @@ } /** + * 是否计量人员 + */ + suspend fun isMeterStaff(): String { + return api.isMeterStaff(AuthenticationHelper.token!!) + } + + /** * 更新用户信息 */ suspend fun updateUserInfo( @@ -1310,6 +1317,48 @@ } /** + * 收入待检测 + */ + suspend fun receiveDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.receiveDetection(AuthenticationHelper.token!!, requestBody) + } + + /** + * 收入待检测 + */ + suspend fun completeDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.completeDetection(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取实时工作统计 */ suspend fun getRealTimeWork(): String { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt index a4a509f..d77d955 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt @@ -17,6 +17,7 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_task_await.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -30,6 +31,7 @@ private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) @@ -75,6 +77,16 @@ .build().show() } } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } } override fun onResume() { @@ -168,6 +180,29 @@ item.orderId, item.sampleId ) } + + //收入 + viewHolder.setOnClickListener(R.id.receiveDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定将接收此任务?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.receiveDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } } } awaitTaskRecyclerView.adapter = detectionAdapter diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt index 6eef896..ecb72eb 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt @@ -1,18 +1,38 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_task_completed.* +import kotlinx.android.synthetic.main.include_empty_view.* class CompletedDetectionFragment : KotlinBaseFragment() { private val kTag = "CompletedDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +41,77 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + totalTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + totalTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042202) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "4", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + totalTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + totalTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "4", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_completed @@ -43,4 +123,58 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042202 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测完的样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_complete_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + } + } + totalTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt index 6bf871f..07728b7 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt @@ -1,18 +1,40 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_task_under.* +import kotlinx.android.synthetic.main.include_empty_view.* class UnderDetectionFragment : KotlinBaseFragment() { private val kTag = "UnderDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +43,87 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + underTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + underTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042201) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() + } + } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "3", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + underTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + underTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "3", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_under @@ -43,4 +135,81 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042201 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测中样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_under_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + + //收入 + viewHolder.setOnClickListener(R.id.completeDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("此任务确定已完成?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.completeDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } + } + } + underTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a280712..e47639d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,12 @@ ): String /** + * 是否计量人员 + */ + @GET("/staff/isMeterStaff") + suspend fun isMeterStaff(@Header("token") token: String): String + + /** * 更新用户信息 */ @POST("/sys/mgr/update") @@ -560,6 +566,24 @@ ): String /** + * 收入待检测 + */ + @POST("/business/labExecutive/myExecutive/receive") + suspend fun receiveDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 完成检测中 + */ + @POST("/business/labExecutive/myExecutive/complete") + suspend fun completeDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取实时工作统计 */ @GET("/business/board/workStatistics") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8c2a581..77834c6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -59,6 +59,13 @@ } /** + * 是否计量人员 + */ + suspend fun isMeterStaff(): String { + return api.isMeterStaff(AuthenticationHelper.token!!) + } + + /** * 更新用户信息 */ suspend fun updateUserInfo( @@ -1310,6 +1317,48 @@ } /** + * 收入待检测 + */ + suspend fun receiveDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.receiveDetection(AuthenticationHelper.token!!, requestBody) + } + + /** + * 收入待检测 + */ + suspend fun completeDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.completeDetection(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取实时工作统计 */ suspend fun getRealTimeWork(): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 3c1c585..cd22b8a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -42,51 +42,58 @@ val userId = it.data.id SaveKeyValues.putValue(LocaleConstant.USER_ID, userId) - fragmentPages.add(HomePageFragment(userId)) - //TODO 还需要根据角色判断 - fragmentPages.add(TaskPageFragment()) - fragmentPages.add(MinePageFragment()) - - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 - } - R.id.nav_task -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + //判断是否是计量人员 + userViewModel.isMeterStaff() + userViewModel.staffResult.observe(this) { isMeterStaff -> + fragmentPages.add(HomePageFragment(userId)) + if (isMeterStaff) { + fragmentPages.add(TaskPageFragment()) + } else { + //TODO 非计量人员 } - false + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_task -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt index a4a509f..d77d955 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt @@ -17,6 +17,7 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_task_await.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -30,6 +31,7 @@ private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) @@ -75,6 +77,16 @@ .build().show() } } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } } override fun onResume() { @@ -168,6 +180,29 @@ item.orderId, item.sampleId ) } + + //收入 + viewHolder.setOnClickListener(R.id.receiveDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定将接收此任务?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.receiveDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } } } awaitTaskRecyclerView.adapter = detectionAdapter diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt index 6eef896..ecb72eb 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt @@ -1,18 +1,38 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_task_completed.* +import kotlinx.android.synthetic.main.include_empty_view.* class CompletedDetectionFragment : KotlinBaseFragment() { private val kTag = "CompletedDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +41,77 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + totalTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + totalTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042202) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "4", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + totalTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + totalTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "4", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_completed @@ -43,4 +123,58 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042202 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测完的样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_complete_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + } + } + totalTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt index 6bf871f..07728b7 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt @@ -1,18 +1,40 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_task_under.* +import kotlinx.android.synthetic.main.include_empty_view.* class UnderDetectionFragment : KotlinBaseFragment() { private val kTag = "UnderDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +43,87 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + underTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + underTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042201) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() + } + } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "3", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + underTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + underTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "3", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_under @@ -43,4 +135,81 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042201 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测中样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_under_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + + //收入 + viewHolder.setOnClickListener(R.id.completeDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("此任务确定已完成?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.completeDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } + } + } + underTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a280712..e47639d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,12 @@ ): String /** + * 是否计量人员 + */ + @GET("/staff/isMeterStaff") + suspend fun isMeterStaff(@Header("token") token: String): String + + /** * 更新用户信息 */ @POST("/sys/mgr/update") @@ -560,6 +566,24 @@ ): String /** + * 收入待检测 + */ + @POST("/business/labExecutive/myExecutive/receive") + suspend fun receiveDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 完成检测中 + */ + @POST("/business/labExecutive/myExecutive/complete") + suspend fun completeDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取实时工作统计 */ @GET("/business/board/workStatistics") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8c2a581..77834c6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -59,6 +59,13 @@ } /** + * 是否计量人员 + */ + suspend fun isMeterStaff(): String { + return api.isMeterStaff(AuthenticationHelper.token!!) + } + + /** * 更新用户信息 */ suspend fun updateUserInfo( @@ -1310,6 +1317,48 @@ } /** + * 收入待检测 + */ + suspend fun receiveDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.receiveDetection(AuthenticationHelper.token!!, requestBody) + } + + /** + * 收入待检测 + */ + suspend fun completeDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.completeDetection(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取实时工作统计 */ suspend fun getRealTimeWork(): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 3c1c585..cd22b8a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -42,51 +42,58 @@ val userId = it.data.id SaveKeyValues.putValue(LocaleConstant.USER_ID, userId) - fragmentPages.add(HomePageFragment(userId)) - //TODO 还需要根据角色判断 - fragmentPages.add(TaskPageFragment()) - fragmentPages.add(MinePageFragment()) - - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 - } - R.id.nav_task -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + //判断是否是计量人员 + userViewModel.isMeterStaff() + userViewModel.staffResult.observe(this) { isMeterStaff -> + fragmentPages.add(HomePageFragment(userId)) + if (isMeterStaff) { + fragmentPages.add(TaskPageFragment()) + } else { + //TODO 非计量人员 } - false + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_task -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } } } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt index 0c80c62..442af3e 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt @@ -4,10 +4,7 @@ import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.extensions.toErrorMessage -import com.casic.xz.meterage.model.DetectionDetailModel -import com.casic.xz.meterage.model.DetectionListModel -import com.casic.xz.meterage.model.OutfieldDetectionDetailModel -import com.casic.xz.meterage.model.OutfieldDetectionListModel +import com.casic.xz.meterage.model.* import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -26,6 +23,7 @@ val outfieldDetectionDetail = MutableLiveData() val detectionList = MutableLiveData() val detectionDetail = MutableLiveData() + val receiveResult = MutableLiveData() fun getOutfieldDetectionList( approvalStatus: String, @@ -134,4 +132,42 @@ it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) + + fun receiveDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.receiveDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun completeDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.completeDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt index a4a509f..d77d955 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt @@ -17,6 +17,7 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_task_await.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -30,6 +31,7 @@ private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) @@ -75,6 +77,16 @@ .build().show() } } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } } override fun onResume() { @@ -168,6 +180,29 @@ item.orderId, item.sampleId ) } + + //收入 + viewHolder.setOnClickListener(R.id.receiveDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定将接收此任务?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.receiveDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } } } awaitTaskRecyclerView.adapter = detectionAdapter diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt index 6eef896..ecb72eb 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt @@ -1,18 +1,38 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_task_completed.* +import kotlinx.android.synthetic.main.include_empty_view.* class CompletedDetectionFragment : KotlinBaseFragment() { private val kTag = "CompletedDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +41,77 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + totalTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + totalTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042202) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "4", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + totalTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + totalTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "4", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_completed @@ -43,4 +123,58 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042202 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测完的样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_complete_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + } + } + totalTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt index 6bf871f..07728b7 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt @@ -1,18 +1,40 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_task_under.* +import kotlinx.android.synthetic.main.include_empty_view.* class UnderDetectionFragment : KotlinBaseFragment() { private val kTag = "UnderDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +43,87 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + underTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + underTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042201) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() + } + } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "3", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + underTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + underTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "3", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_under @@ -43,4 +135,81 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042201 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测中样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_under_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + + //收入 + viewHolder.setOnClickListener(R.id.completeDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("此任务确定已完成?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.completeDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } + } + } + underTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a280712..e47639d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,12 @@ ): String /** + * 是否计量人员 + */ + @GET("/staff/isMeterStaff") + suspend fun isMeterStaff(@Header("token") token: String): String + + /** * 更新用户信息 */ @POST("/sys/mgr/update") @@ -560,6 +566,24 @@ ): String /** + * 收入待检测 + */ + @POST("/business/labExecutive/myExecutive/receive") + suspend fun receiveDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 完成检测中 + */ + @POST("/business/labExecutive/myExecutive/complete") + suspend fun completeDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取实时工作统计 */ @GET("/business/board/workStatistics") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8c2a581..77834c6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -59,6 +59,13 @@ } /** + * 是否计量人员 + */ + suspend fun isMeterStaff(): String { + return api.isMeterStaff(AuthenticationHelper.token!!) + } + + /** * 更新用户信息 */ suspend fun updateUserInfo( @@ -1310,6 +1317,48 @@ } /** + * 收入待检测 + */ + suspend fun receiveDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.receiveDetection(AuthenticationHelper.token!!, requestBody) + } + + /** + * 收入待检测 + */ + suspend fun completeDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.completeDetection(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取实时工作统计 */ suspend fun getRealTimeWork(): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 3c1c585..cd22b8a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -42,51 +42,58 @@ val userId = it.data.id SaveKeyValues.putValue(LocaleConstant.USER_ID, userId) - fragmentPages.add(HomePageFragment(userId)) - //TODO 还需要根据角色判断 - fragmentPages.add(TaskPageFragment()) - fragmentPages.add(MinePageFragment()) - - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 - } - R.id.nav_task -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + //判断是否是计量人员 + userViewModel.isMeterStaff() + userViewModel.staffResult.observe(this) { isMeterStaff -> + fragmentPages.add(HomePageFragment(userId)) + if (isMeterStaff) { + fragmentPages.add(TaskPageFragment()) + } else { + //TODO 非计量人员 } - false + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_task -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } } } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt index 0c80c62..442af3e 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt @@ -4,10 +4,7 @@ import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.extensions.toErrorMessage -import com.casic.xz.meterage.model.DetectionDetailModel -import com.casic.xz.meterage.model.DetectionListModel -import com.casic.xz.meterage.model.OutfieldDetectionDetailModel -import com.casic.xz.meterage.model.OutfieldDetectionListModel +import com.casic.xz.meterage.model.* import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -26,6 +23,7 @@ val outfieldDetectionDetail = MutableLiveData() val detectionList = MutableLiveData() val detectionDetail = MutableLiveData() + val receiveResult = MutableLiveData() fun getOutfieldDetectionList( approvalStatus: String, @@ -134,4 +132,42 @@ it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) + + fun receiveDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.receiveDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun completeDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.completeDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index 1ed5f86..f88e1d9 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -14,6 +14,7 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState +import org.json.JSONObject /** * 用户相关 VM @@ -28,6 +29,7 @@ val changePwdResult = MutableLiveData() val outResult = MutableLiveData() val submitResult = MutableLiveData() + val staffResult = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -61,6 +63,18 @@ it.printStackTrace() }) + fun isMeterStaff() = launch({ + val response = RetrofitServiceManager.isMeterStaff() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + val isMeterStaff = JSONObject(response).getJSONObject("data").getInt("isMeterStaff") + staffResult.value = isMeterStaff == 1 + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + fun updateUserInfo( id: String, account: String, diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt index a4a509f..d77d955 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt @@ -17,6 +17,7 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_task_await.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -30,6 +31,7 @@ private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) @@ -75,6 +77,16 @@ .build().show() } } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } } override fun onResume() { @@ -168,6 +180,29 @@ item.orderId, item.sampleId ) } + + //收入 + viewHolder.setOnClickListener(R.id.receiveDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定将接收此任务?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.receiveDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } } } awaitTaskRecyclerView.adapter = detectionAdapter diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt index 6eef896..ecb72eb 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt @@ -1,18 +1,38 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_task_completed.* +import kotlinx.android.synthetic.main.include_empty_view.* class CompletedDetectionFragment : KotlinBaseFragment() { private val kTag = "CompletedDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +41,77 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + totalTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + totalTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042202) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "4", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + totalTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + totalTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "4", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_completed @@ -43,4 +123,58 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042202 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测完的样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_complete_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + } + } + totalTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt index 6bf871f..07728b7 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt @@ -1,18 +1,40 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_task_under.* +import kotlinx.android.synthetic.main.include_empty_view.* class UnderDetectionFragment : KotlinBaseFragment() { private val kTag = "UnderDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +43,87 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + underTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + underTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042201) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() + } + } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "3", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + underTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + underTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "3", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_under @@ -43,4 +135,81 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042201 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测中样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_under_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + + //收入 + viewHolder.setOnClickListener(R.id.completeDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("此任务确定已完成?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.completeDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } + } + } + underTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a280712..e47639d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,12 @@ ): String /** + * 是否计量人员 + */ + @GET("/staff/isMeterStaff") + suspend fun isMeterStaff(@Header("token") token: String): String + + /** * 更新用户信息 */ @POST("/sys/mgr/update") @@ -560,6 +566,24 @@ ): String /** + * 收入待检测 + */ + @POST("/business/labExecutive/myExecutive/receive") + suspend fun receiveDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 完成检测中 + */ + @POST("/business/labExecutive/myExecutive/complete") + suspend fun completeDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取实时工作统计 */ @GET("/business/board/workStatistics") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8c2a581..77834c6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -59,6 +59,13 @@ } /** + * 是否计量人员 + */ + suspend fun isMeterStaff(): String { + return api.isMeterStaff(AuthenticationHelper.token!!) + } + + /** * 更新用户信息 */ suspend fun updateUserInfo( @@ -1310,6 +1317,48 @@ } /** + * 收入待检测 + */ + suspend fun receiveDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.receiveDetection(AuthenticationHelper.token!!, requestBody) + } + + /** + * 收入待检测 + */ + suspend fun completeDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.completeDetection(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取实时工作统计 */ suspend fun getRealTimeWork(): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 3c1c585..cd22b8a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -42,51 +42,58 @@ val userId = it.data.id SaveKeyValues.putValue(LocaleConstant.USER_ID, userId) - fragmentPages.add(HomePageFragment(userId)) - //TODO 还需要根据角色判断 - fragmentPages.add(TaskPageFragment()) - fragmentPages.add(MinePageFragment()) - - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 - } - R.id.nav_task -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + //判断是否是计量人员 + userViewModel.isMeterStaff() + userViewModel.staffResult.observe(this) { isMeterStaff -> + fragmentPages.add(HomePageFragment(userId)) + if (isMeterStaff) { + fragmentPages.add(TaskPageFragment()) + } else { + //TODO 非计量人员 } - false + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_task -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } } } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt index 0c80c62..442af3e 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt @@ -4,10 +4,7 @@ import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.extensions.toErrorMessage -import com.casic.xz.meterage.model.DetectionDetailModel -import com.casic.xz.meterage.model.DetectionListModel -import com.casic.xz.meterage.model.OutfieldDetectionDetailModel -import com.casic.xz.meterage.model.OutfieldDetectionListModel +import com.casic.xz.meterage.model.* import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -26,6 +23,7 @@ val outfieldDetectionDetail = MutableLiveData() val detectionList = MutableLiveData() val detectionDetail = MutableLiveData() + val receiveResult = MutableLiveData() fun getOutfieldDetectionList( approvalStatus: String, @@ -134,4 +132,42 @@ it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) + + fun receiveDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.receiveDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun completeDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.completeDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index 1ed5f86..f88e1d9 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -14,6 +14,7 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState +import org.json.JSONObject /** * 用户相关 VM @@ -28,6 +29,7 @@ val changePwdResult = MutableLiveData() val outResult = MutableLiveData() val submitResult = MutableLiveData() + val staffResult = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -61,6 +63,18 @@ it.printStackTrace() }) + fun isMeterStaff() = launch({ + val response = RetrofitServiceManager.isMeterStaff() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + val isMeterStaff = JSONObject(response).getJSONObject("data").getInt("isMeterStaff") + staffResult.value = isMeterStaff == 1 + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + fun updateUserInfo( id: String, account: String, diff --git a/app/src/main/res/layout/fragment_task_completed.xml b/app/src/main/res/layout/fragment_task_completed.xml index cab9456..2b3a32d 100644 --- a/app/src/main/res/layout/fragment_task_completed.xml +++ b/app/src/main/res/layout/fragment_task_completed.xml @@ -3,11 +3,35 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/mainBackground" android:orientation="vertical"> - + + + android:layout_height="match_parent"> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt index a4a509f..d77d955 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt @@ -17,6 +17,7 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_task_await.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -30,6 +31,7 @@ private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) @@ -75,6 +77,16 @@ .build().show() } } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } } override fun onResume() { @@ -168,6 +180,29 @@ item.orderId, item.sampleId ) } + + //收入 + viewHolder.setOnClickListener(R.id.receiveDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定将接收此任务?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.receiveDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } } } awaitTaskRecyclerView.adapter = detectionAdapter diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt index 6eef896..ecb72eb 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt @@ -1,18 +1,38 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_task_completed.* +import kotlinx.android.synthetic.main.include_empty_view.* class CompletedDetectionFragment : KotlinBaseFragment() { private val kTag = "CompletedDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +41,77 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + totalTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + totalTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042202) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "4", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + totalTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + totalTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "4", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_completed @@ -43,4 +123,58 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042202 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测完的样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_complete_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + } + } + totalTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt index 6bf871f..07728b7 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt @@ -1,18 +1,40 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_task_under.* +import kotlinx.android.synthetic.main.include_empty_view.* class UnderDetectionFragment : KotlinBaseFragment() { private val kTag = "UnderDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +43,87 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + underTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + underTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042201) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() + } + } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "3", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + underTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + underTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "3", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_under @@ -43,4 +135,81 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042201 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测中样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_under_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + + //收入 + viewHolder.setOnClickListener(R.id.completeDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("此任务确定已完成?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.completeDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } + } + } + underTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a280712..e47639d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,12 @@ ): String /** + * 是否计量人员 + */ + @GET("/staff/isMeterStaff") + suspend fun isMeterStaff(@Header("token") token: String): String + + /** * 更新用户信息 */ @POST("/sys/mgr/update") @@ -560,6 +566,24 @@ ): String /** + * 收入待检测 + */ + @POST("/business/labExecutive/myExecutive/receive") + suspend fun receiveDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 完成检测中 + */ + @POST("/business/labExecutive/myExecutive/complete") + suspend fun completeDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取实时工作统计 */ @GET("/business/board/workStatistics") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8c2a581..77834c6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -59,6 +59,13 @@ } /** + * 是否计量人员 + */ + suspend fun isMeterStaff(): String { + return api.isMeterStaff(AuthenticationHelper.token!!) + } + + /** * 更新用户信息 */ suspend fun updateUserInfo( @@ -1310,6 +1317,48 @@ } /** + * 收入待检测 + */ + suspend fun receiveDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.receiveDetection(AuthenticationHelper.token!!, requestBody) + } + + /** + * 收入待检测 + */ + suspend fun completeDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.completeDetection(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取实时工作统计 */ suspend fun getRealTimeWork(): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 3c1c585..cd22b8a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -42,51 +42,58 @@ val userId = it.data.id SaveKeyValues.putValue(LocaleConstant.USER_ID, userId) - fragmentPages.add(HomePageFragment(userId)) - //TODO 还需要根据角色判断 - fragmentPages.add(TaskPageFragment()) - fragmentPages.add(MinePageFragment()) - - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 - } - R.id.nav_task -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + //判断是否是计量人员 + userViewModel.isMeterStaff() + userViewModel.staffResult.observe(this) { isMeterStaff -> + fragmentPages.add(HomePageFragment(userId)) + if (isMeterStaff) { + fragmentPages.add(TaskPageFragment()) + } else { + //TODO 非计量人员 } - false + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_task -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } } } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt index 0c80c62..442af3e 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt @@ -4,10 +4,7 @@ import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.extensions.toErrorMessage -import com.casic.xz.meterage.model.DetectionDetailModel -import com.casic.xz.meterage.model.DetectionListModel -import com.casic.xz.meterage.model.OutfieldDetectionDetailModel -import com.casic.xz.meterage.model.OutfieldDetectionListModel +import com.casic.xz.meterage.model.* import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -26,6 +23,7 @@ val outfieldDetectionDetail = MutableLiveData() val detectionList = MutableLiveData() val detectionDetail = MutableLiveData() + val receiveResult = MutableLiveData() fun getOutfieldDetectionList( approvalStatus: String, @@ -134,4 +132,42 @@ it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) + + fun receiveDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.receiveDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun completeDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.completeDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index 1ed5f86..f88e1d9 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -14,6 +14,7 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState +import org.json.JSONObject /** * 用户相关 VM @@ -28,6 +29,7 @@ val changePwdResult = MutableLiveData() val outResult = MutableLiveData() val submitResult = MutableLiveData() + val staffResult = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -61,6 +63,18 @@ it.printStackTrace() }) + fun isMeterStaff() = launch({ + val response = RetrofitServiceManager.isMeterStaff() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + val isMeterStaff = JSONObject(response).getJSONObject("data").getInt("isMeterStaff") + staffResult.value = isMeterStaff == 1 + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + fun updateUserInfo( id: String, account: String, diff --git a/app/src/main/res/layout/fragment_task_completed.xml b/app/src/main/res/layout/fragment_task_completed.xml index cab9456..2b3a32d 100644 --- a/app/src/main/res/layout/fragment_task_completed.xml +++ b/app/src/main/res/layout/fragment_task_completed.xml @@ -3,11 +3,35 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/mainBackground" android:orientation="vertical"> - + + + android:layout_height="match_parent"> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_task_under.xml b/app/src/main/res/layout/fragment_task_under.xml index d66f351..5f01550 100644 --- a/app/src/main/res/layout/fragment_task_under.xml +++ b/app/src/main/res/layout/fragment_task_under.xml @@ -1,13 +1,37 @@ + android:layout_height="match_parent" + android:background="@color/mainBackground" + android:orientation="vertical"> - + + + android:layout_height="match_parent"> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt index a4a509f..d77d955 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt @@ -17,6 +17,7 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_task_await.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -30,6 +31,7 @@ private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) @@ -75,6 +77,16 @@ .build().show() } } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } } override fun onResume() { @@ -168,6 +180,29 @@ item.orderId, item.sampleId ) } + + //收入 + viewHolder.setOnClickListener(R.id.receiveDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定将接收此任务?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.receiveDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } } } awaitTaskRecyclerView.adapter = detectionAdapter diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt index 6eef896..ecb72eb 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt @@ -1,18 +1,38 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_task_completed.* +import kotlinx.android.synthetic.main.include_empty_view.* class CompletedDetectionFragment : KotlinBaseFragment() { private val kTag = "CompletedDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +41,77 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + totalTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + totalTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042202) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "4", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + totalTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + totalTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "4", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_completed @@ -43,4 +123,58 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042202 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测完的样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_complete_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + } + } + totalTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt index 6bf871f..07728b7 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt @@ -1,18 +1,40 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_task_under.* +import kotlinx.android.synthetic.main.include_empty_view.* class UnderDetectionFragment : KotlinBaseFragment() { private val kTag = "UnderDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +43,87 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + underTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + underTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042201) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() + } + } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "3", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + underTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + underTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "3", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_under @@ -43,4 +135,81 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042201 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测中样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_under_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + + //收入 + viewHolder.setOnClickListener(R.id.completeDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("此任务确定已完成?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.completeDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } + } + } + underTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a280712..e47639d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,12 @@ ): String /** + * 是否计量人员 + */ + @GET("/staff/isMeterStaff") + suspend fun isMeterStaff(@Header("token") token: String): String + + /** * 更新用户信息 */ @POST("/sys/mgr/update") @@ -560,6 +566,24 @@ ): String /** + * 收入待检测 + */ + @POST("/business/labExecutive/myExecutive/receive") + suspend fun receiveDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 完成检测中 + */ + @POST("/business/labExecutive/myExecutive/complete") + suspend fun completeDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取实时工作统计 */ @GET("/business/board/workStatistics") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8c2a581..77834c6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -59,6 +59,13 @@ } /** + * 是否计量人员 + */ + suspend fun isMeterStaff(): String { + return api.isMeterStaff(AuthenticationHelper.token!!) + } + + /** * 更新用户信息 */ suspend fun updateUserInfo( @@ -1310,6 +1317,48 @@ } /** + * 收入待检测 + */ + suspend fun receiveDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.receiveDetection(AuthenticationHelper.token!!, requestBody) + } + + /** + * 收入待检测 + */ + suspend fun completeDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.completeDetection(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取实时工作统计 */ suspend fun getRealTimeWork(): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 3c1c585..cd22b8a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -42,51 +42,58 @@ val userId = it.data.id SaveKeyValues.putValue(LocaleConstant.USER_ID, userId) - fragmentPages.add(HomePageFragment(userId)) - //TODO 还需要根据角色判断 - fragmentPages.add(TaskPageFragment()) - fragmentPages.add(MinePageFragment()) - - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 - } - R.id.nav_task -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + //判断是否是计量人员 + userViewModel.isMeterStaff() + userViewModel.staffResult.observe(this) { isMeterStaff -> + fragmentPages.add(HomePageFragment(userId)) + if (isMeterStaff) { + fragmentPages.add(TaskPageFragment()) + } else { + //TODO 非计量人员 } - false + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_task -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } } } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt index 0c80c62..442af3e 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt @@ -4,10 +4,7 @@ import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.extensions.toErrorMessage -import com.casic.xz.meterage.model.DetectionDetailModel -import com.casic.xz.meterage.model.DetectionListModel -import com.casic.xz.meterage.model.OutfieldDetectionDetailModel -import com.casic.xz.meterage.model.OutfieldDetectionListModel +import com.casic.xz.meterage.model.* import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -26,6 +23,7 @@ val outfieldDetectionDetail = MutableLiveData() val detectionList = MutableLiveData() val detectionDetail = MutableLiveData() + val receiveResult = MutableLiveData() fun getOutfieldDetectionList( approvalStatus: String, @@ -134,4 +132,42 @@ it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) + + fun receiveDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.receiveDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun completeDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.completeDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index 1ed5f86..f88e1d9 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -14,6 +14,7 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState +import org.json.JSONObject /** * 用户相关 VM @@ -28,6 +29,7 @@ val changePwdResult = MutableLiveData() val outResult = MutableLiveData() val submitResult = MutableLiveData() + val staffResult = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -61,6 +63,18 @@ it.printStackTrace() }) + fun isMeterStaff() = launch({ + val response = RetrofitServiceManager.isMeterStaff() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + val isMeterStaff = JSONObject(response).getJSONObject("data").getInt("isMeterStaff") + staffResult.value = isMeterStaff == 1 + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + fun updateUserInfo( id: String, account: String, diff --git a/app/src/main/res/layout/fragment_task_completed.xml b/app/src/main/res/layout/fragment_task_completed.xml index cab9456..2b3a32d 100644 --- a/app/src/main/res/layout/fragment_task_completed.xml +++ b/app/src/main/res/layout/fragment_task_completed.xml @@ -3,11 +3,35 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/mainBackground" android:orientation="vertical"> - + + + android:layout_height="match_parent"> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_task_under.xml b/app/src/main/res/layout/fragment_task_under.xml index d66f351..5f01550 100644 --- a/app/src/main/res/layout/fragment_task_under.xml +++ b/app/src/main/res/layout/fragment_task_under.xml @@ -1,13 +1,37 @@ + android:layout_height="match_parent" + android:background="@color/mainBackground" + android:orientation="vertical"> - + + + android:layout_height="match_parent"> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_await_task_rv_l.xml b/app/src/main/res/layout/item_await_task_rv_l.xml index 474db28..a973100 100644 --- a/app/src/main/res/layout/item_await_task_rv_l.xml +++ b/app/src/main/res/layout/item_await_task_rv_l.xml @@ -40,6 +40,7 @@ android:textSize="@dimen/sp_12" /> + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +41,77 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + totalTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + totalTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042202) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "4", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + totalTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + totalTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "4", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_completed @@ -43,4 +123,58 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042202 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测完的样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_complete_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + } + } + totalTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt index 6bf871f..07728b7 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt @@ -1,18 +1,40 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_task_under.* +import kotlinx.android.synthetic.main.include_empty_view.* class UnderDetectionFragment : KotlinBaseFragment() { private val kTag = "UnderDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +43,87 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + underTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + underTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042201) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() + } + } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "3", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + underTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + underTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "3", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_under @@ -43,4 +135,81 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042201 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测中样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_under_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + + //收入 + viewHolder.setOnClickListener(R.id.completeDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("此任务确定已完成?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.completeDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } + } + } + underTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a280712..e47639d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,12 @@ ): String /** + * 是否计量人员 + */ + @GET("/staff/isMeterStaff") + suspend fun isMeterStaff(@Header("token") token: String): String + + /** * 更新用户信息 */ @POST("/sys/mgr/update") @@ -560,6 +566,24 @@ ): String /** + * 收入待检测 + */ + @POST("/business/labExecutive/myExecutive/receive") + suspend fun receiveDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 完成检测中 + */ + @POST("/business/labExecutive/myExecutive/complete") + suspend fun completeDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取实时工作统计 */ @GET("/business/board/workStatistics") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8c2a581..77834c6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -59,6 +59,13 @@ } /** + * 是否计量人员 + */ + suspend fun isMeterStaff(): String { + return api.isMeterStaff(AuthenticationHelper.token!!) + } + + /** * 更新用户信息 */ suspend fun updateUserInfo( @@ -1310,6 +1317,48 @@ } /** + * 收入待检测 + */ + suspend fun receiveDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.receiveDetection(AuthenticationHelper.token!!, requestBody) + } + + /** + * 收入待检测 + */ + suspend fun completeDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.completeDetection(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取实时工作统计 */ suspend fun getRealTimeWork(): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 3c1c585..cd22b8a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -42,51 +42,58 @@ val userId = it.data.id SaveKeyValues.putValue(LocaleConstant.USER_ID, userId) - fragmentPages.add(HomePageFragment(userId)) - //TODO 还需要根据角色判断 - fragmentPages.add(TaskPageFragment()) - fragmentPages.add(MinePageFragment()) - - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 - } - R.id.nav_task -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + //判断是否是计量人员 + userViewModel.isMeterStaff() + userViewModel.staffResult.observe(this) { isMeterStaff -> + fragmentPages.add(HomePageFragment(userId)) + if (isMeterStaff) { + fragmentPages.add(TaskPageFragment()) + } else { + //TODO 非计量人员 } - false + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_task -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } } } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt index 0c80c62..442af3e 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt @@ -4,10 +4,7 @@ import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.extensions.toErrorMessage -import com.casic.xz.meterage.model.DetectionDetailModel -import com.casic.xz.meterage.model.DetectionListModel -import com.casic.xz.meterage.model.OutfieldDetectionDetailModel -import com.casic.xz.meterage.model.OutfieldDetectionListModel +import com.casic.xz.meterage.model.* import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -26,6 +23,7 @@ val outfieldDetectionDetail = MutableLiveData() val detectionList = MutableLiveData() val detectionDetail = MutableLiveData() + val receiveResult = MutableLiveData() fun getOutfieldDetectionList( approvalStatus: String, @@ -134,4 +132,42 @@ it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) + + fun receiveDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.receiveDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun completeDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.completeDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index 1ed5f86..f88e1d9 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -14,6 +14,7 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState +import org.json.JSONObject /** * 用户相关 VM @@ -28,6 +29,7 @@ val changePwdResult = MutableLiveData() val outResult = MutableLiveData() val submitResult = MutableLiveData() + val staffResult = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -61,6 +63,18 @@ it.printStackTrace() }) + fun isMeterStaff() = launch({ + val response = RetrofitServiceManager.isMeterStaff() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + val isMeterStaff = JSONObject(response).getJSONObject("data").getInt("isMeterStaff") + staffResult.value = isMeterStaff == 1 + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + fun updateUserInfo( id: String, account: String, diff --git a/app/src/main/res/layout/fragment_task_completed.xml b/app/src/main/res/layout/fragment_task_completed.xml index cab9456..2b3a32d 100644 --- a/app/src/main/res/layout/fragment_task_completed.xml +++ b/app/src/main/res/layout/fragment_task_completed.xml @@ -3,11 +3,35 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/mainBackground" android:orientation="vertical"> - + + + android:layout_height="match_parent"> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_task_under.xml b/app/src/main/res/layout/fragment_task_under.xml index d66f351..5f01550 100644 --- a/app/src/main/res/layout/fragment_task_under.xml +++ b/app/src/main/res/layout/fragment_task_under.xml @@ -1,13 +1,37 @@ + android:layout_height="match_parent" + android:background="@color/mainBackground" + android:orientation="vertical"> - + + + android:layout_height="match_parent"> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_await_task_rv_l.xml b/app/src/main/res/layout/item_await_task_rv_l.xml index 474db28..a973100 100644 --- a/app/src/main/res/layout/item_await_task_rv_l.xml +++ b/app/src/main/res/layout/item_await_task_rv_l.xml @@ -40,6 +40,7 @@ android:textSize="@dimen/sp_12" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt index 93d783e..16deeb5 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/entrust/BasicInformationFragment.kt @@ -9,8 +9,10 @@ import com.casic.xz.meterage.extensions.formatToYearMonthDay import com.casic.xz.meterage.extensions.watchAttachFile import com.casic.xz.meterage.model.EntrustDetailModel +import com.casic.xz.meterage.utils.VerticalMarginItemDecoration import com.casic.xz.meterage.vm.ConfigViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_entrust_base_info.* class BasicInformationFragment(private val data: EntrustDetailModel.DataModel) : @@ -66,6 +68,9 @@ } //样品 + sampleRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(0, 5f.dp2px(requireContext())) + ) sampleRecyclerView.adapter = CustomerSampleAdapter( requireContext(), data.customerSampleInfoList ) diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt index a4a509f..d77d955 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/AwaitDetectionFragment.kt @@ -17,6 +17,7 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_task_await.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -30,6 +31,7 @@ private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) @@ -75,6 +77,16 @@ .build().show() } } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } } override fun onResume() { @@ -168,6 +180,29 @@ item.orderId, item.sampleId ) } + + //收入 + viewHolder.setOnClickListener(R.id.receiveDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定将接收此任务?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.receiveDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } } } awaitTaskRecyclerView.adapter = detectionAdapter diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt index 6eef896..ecb72eb 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/CompletedDetectionFragment.kt @@ -1,18 +1,38 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_task_completed.* +import kotlinx.android.synthetic.main.include_empty_view.* class CompletedDetectionFragment : KotlinBaseFragment() { private val kTag = "CompletedDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +41,77 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + totalTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + totalTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042202) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "4", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + totalTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + totalTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "4", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_completed @@ -43,4 +123,58 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042202 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测完的样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_complete_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + } + } + totalTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt index 6bf871f..07728b7 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/task/UnderDetectionFragment.kt @@ -1,18 +1,40 @@ package com.casic.xz.meterage.fragment.task +import android.os.Handler import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.formatToYearMonthDay +import com.casic.xz.meterage.extensions.isEarlierThenCurrent +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.fragment.TaskPageFragment +import com.casic.xz.meterage.model.DetectionListModel import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.DetectionViewModel +import com.casic.xz.meterage.widgets.MeasureProcessBottomSheet +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.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_task_under.* +import kotlinx.android.synthetic.main.include_empty_view.* class UnderDetectionFragment : KotlinBaseFragment() { private val kTag = "UnderDetectionFragment" private lateinit var detectionViewModel: DetectionViewModel + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var detectionAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) detectionViewModel = ViewModelProvider(this)[DetectionViewModel::class.java] detectionViewModel.detectionList.observe(this) { if (it.code == 200) { @@ -21,17 +43,87 @@ message.obj = it.data.total TaskPageFragment.weakReferenceHandler.sendMessage(message) + + //绑定列表 + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + underTaskLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + underTaskLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042201) + } + } + + detectionViewModel.detectionDetail.observe(this) { + if (it.code == 200) { + MeasureProcessBottomSheet.Builder() + .setContext(requireContext()) + .setMeasureProcess(it.data.measureProcessList) + .build().show() + } + } + + detectionViewModel.receiveResult.observe(this) { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + detectionAdapter.notifyItemRemoved(clickedPosition) + detectionAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) } } } override fun onResume() { super.onResume() - detectionViewModel.getDetectionListByState("", "", "", "", "3", "", "", "", "", "", 1) + pageIndex = 1 + getDetectionListByState() } override fun initEvent() { + underTaskLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getDetectionListByState() + } + underTaskLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getDetectionListByState() + } + } + + private fun getDetectionListByState() { + detectionViewModel.getDetectionListByState( + "", + "", + "", + "", + "3", + "", + "", + "", + "", + "", + pageIndex + ) } override fun initLayoutView(): Int = R.layout.fragment_task_under @@ -43,4 +135,81 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023042201 -> { + if (isRefresh || isLoadMore) { + detectionAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无检测中样品") { + pageIndex = 1 + getDetectionListByState() + } + } else { + emptyView!!.hide() + detectionAdapter = object : + NormalRecyclerAdapter( + R.layout.item_under_task_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: DetectionListModel.DataModel.RowsModel + ) { + if (item.requireOverTime.isEarlierThenCurrent()) { + viewHolder.setTextColor( + R.id.dateView, R.color.red.convertColor(requireContext()) + ) + } else { + viewHolder.setTextColor( + R.id.dateView, R.color.black.convertColor(requireContext()) + ) + } + + viewHolder.setText(R.id.sampleNameView, item.sampleName) + .setText(R.id.currentLibView, item.currentSegment) + .setText( + R.id.dateView, item.requireOverTime.formatToYearMonthDay() + ) + + //查看检定记录 + viewHolder.setOnClickListener(R.id.showProcessView) { + detectionViewModel.getDetectionDetail( + item.orderId, item.sampleId + ) + } + + //收入 + viewHolder.setOnClickListener(R.id.completeDetectionView) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("此任务确定已完成?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + detectionViewModel.completeDetection( + item.orderId, item.sampleId + ) + } + }).build().show() + } + } + } + underTaskRecyclerView.adapter = detectionAdapter + } + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a280712..e47639d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,12 @@ ): String /** + * 是否计量人员 + */ + @GET("/staff/isMeterStaff") + suspend fun isMeterStaff(@Header("token") token: String): String + + /** * 更新用户信息 */ @POST("/sys/mgr/update") @@ -560,6 +566,24 @@ ): String /** + * 收入待检测 + */ + @POST("/business/labExecutive/myExecutive/receive") + suspend fun receiveDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 完成检测中 + */ + @POST("/business/labExecutive/myExecutive/complete") + suspend fun completeDetection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取实时工作统计 */ @GET("/business/board/workStatistics") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8c2a581..77834c6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -59,6 +59,13 @@ } /** + * 是否计量人员 + */ + suspend fun isMeterStaff(): String { + return api.isMeterStaff(AuthenticationHelper.token!!) + } + + /** * 更新用户信息 */ suspend fun updateUserInfo( @@ -1310,6 +1317,48 @@ } /** + * 收入待检测 + */ + suspend fun receiveDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.receiveDetection(AuthenticationHelper.token!!, requestBody) + } + + /** + * 收入待检测 + */ + suspend fun completeDetection(orderId: String, sampleId: String): String { + //TODO 参数需要确认 + // [ + // { + // "orderId": "1646795440283561986", + // "sampleId": "1646795440585551873" + // } + // ] + + val param = JsonObject() + param.addProperty("orderId", orderId) + param.addProperty("sampleId", sampleId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.completeDetection(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取实时工作统计 */ suspend fun getRealTimeWork(): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 3c1c585..cd22b8a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -42,51 +42,58 @@ val userId = it.data.id SaveKeyValues.putValue(LocaleConstant.USER_ID, userId) - fragmentPages.add(HomePageFragment(userId)) - //TODO 还需要根据角色判断 - fragmentPages.add(TaskPageFragment()) - fragmentPages.add(MinePageFragment()) - - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 - } - R.id.nav_task -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + //判断是否是计量人员 + userViewModel.isMeterStaff() + userViewModel.staffResult.observe(this) { isMeterStaff -> + fragmentPages.add(HomePageFragment(userId)) + if (isMeterStaff) { + fragmentPages.add(TaskPageFragment()) + } else { + //TODO 非计量人员 } - false + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_task -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } } } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt index 0c80c62..442af3e 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DetectionViewModel.kt @@ -4,10 +4,7 @@ import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.extensions.toErrorMessage -import com.casic.xz.meterage.model.DetectionDetailModel -import com.casic.xz.meterage.model.DetectionListModel -import com.casic.xz.meterage.model.OutfieldDetectionDetailModel -import com.casic.xz.meterage.model.OutfieldDetectionListModel +import com.casic.xz.meterage.model.* import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -26,6 +23,7 @@ val outfieldDetectionDetail = MutableLiveData() val detectionList = MutableLiveData() val detectionDetail = MutableLiveData() + val receiveResult = MutableLiveData() fun getOutfieldDetectionList( approvalStatus: String, @@ -134,4 +132,42 @@ it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) + + fun receiveDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.receiveDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun completeDetection(orderId: String, sampleId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.completeDetection(orderId, sampleId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + receiveResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index 1ed5f86..f88e1d9 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -14,6 +14,7 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState +import org.json.JSONObject /** * 用户相关 VM @@ -28,6 +29,7 @@ val changePwdResult = MutableLiveData() val outResult = MutableLiveData() val submitResult = MutableLiveData() + val staffResult = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -61,6 +63,18 @@ it.printStackTrace() }) + fun isMeterStaff() = launch({ + val response = RetrofitServiceManager.isMeterStaff() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + val isMeterStaff = JSONObject(response).getJSONObject("data").getInt("isMeterStaff") + staffResult.value = isMeterStaff == 1 + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + fun updateUserInfo( id: String, account: String, diff --git a/app/src/main/res/layout/fragment_task_completed.xml b/app/src/main/res/layout/fragment_task_completed.xml index cab9456..2b3a32d 100644 --- a/app/src/main/res/layout/fragment_task_completed.xml +++ b/app/src/main/res/layout/fragment_task_completed.xml @@ -3,11 +3,35 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/mainBackground" android:orientation="vertical"> - + + + android:layout_height="match_parent"> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_task_under.xml b/app/src/main/res/layout/fragment_task_under.xml index d66f351..5f01550 100644 --- a/app/src/main/res/layout/fragment_task_under.xml +++ b/app/src/main/res/layout/fragment_task_under.xml @@ -1,13 +1,37 @@ + android:layout_height="match_parent" + android:background="@color/mainBackground" + android:orientation="vertical"> - + + + android:layout_height="match_parent"> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_await_task_rv_l.xml b/app/src/main/res/layout/item_await_task_rv_l.xml index 474db28..a973100 100644 --- a/app/src/main/res/layout/item_await_task_rv_l.xml +++ b/app/src/main/res/layout/item_await_task_rv_l.xml @@ -40,6 +40,7 @@ android:textSize="@dimen/sp_12" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_under_task_rv_l.xml b/app/src/main/res/layout/item_under_task_rv_l.xml new file mode 100644 index 0000000..f3d9a33 --- /dev/null +++ b/app/src/main/res/layout/item_under_task_rv_l.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file