diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java index 56fc20d..24da65b 100644 --- a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java +++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java @@ -168,10 +168,13 @@ private String isDel; private String name; private String planId; + private String planName; + private String planNo; private String remark; private String signTime; private String staffId; private String technologyJob; + private String trainTime; private String updateTime; public String getCompany() { @@ -230,6 +233,22 @@ this.planId = planId; } + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanNo() { + return planNo; + } + + public void setPlanNo(String planNo) { + this.planNo = planNo; + } + public String getRemark() { return remark; } @@ -262,6 +281,14 @@ this.technologyJob = technologyJob; } + public String getTrainTime() { + return trainTime; + } + + public void setTrainTime(String trainTime) { + this.trainTime = trainTime; + } + public String getUpdateTime() { return updateTime; } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java index 56fc20d..24da65b 100644 --- a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java +++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java @@ -168,10 +168,13 @@ private String isDel; private String name; private String planId; + private String planName; + private String planNo; private String remark; private String signTime; private String staffId; private String technologyJob; + private String trainTime; private String updateTime; public String getCompany() { @@ -230,6 +233,22 @@ this.planId = planId; } + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanNo() { + return planNo; + } + + public void setPlanNo(String planNo) { + this.planNo = planNo; + } + public String getRemark() { return remark; } @@ -262,6 +281,14 @@ this.technologyJob = technologyJob; } + public String getTrainTime() { + return trainTime; + } + + public void setTrainTime(String trainTime) { + this.trainTime = trainTime; + } + public String getUpdateTime() { return updateTime; } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt new file mode 100644 index 0000000..2345bbe --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt @@ -0,0 +1,26 @@ +package com.casic.xz.meterage.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.xz.meterage.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_QRCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.themeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.themeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("培训签到二维码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setIsOnlyCenter(true) //是否只识别框中内容(默认为全屏识别) + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java index 56fc20d..24da65b 100644 --- a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java +++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java @@ -168,10 +168,13 @@ private String isDel; private String name; private String planId; + private String planName; + private String planNo; private String remark; private String signTime; private String staffId; private String technologyJob; + private String trainTime; private String updateTime; public String getCompany() { @@ -230,6 +233,22 @@ this.planId = planId; } + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanNo() { + return planNo; + } + + public void setPlanNo(String planNo) { + this.planNo = planNo; + } + public String getRemark() { return remark; } @@ -262,6 +281,14 @@ this.technologyJob = technologyJob; } + public String getTrainTime() { + return trainTime; + } + + public void setTrainTime(String trainTime) { + this.trainTime = trainTime; + } + public String getUpdateTime() { return updateTime; } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt new file mode 100644 index 0000000..2345bbe --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt @@ -0,0 +1,26 @@ +package com.casic.xz.meterage.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.xz.meterage.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_QRCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.themeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.themeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("培训签到二维码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setIsOnlyCenter(true) //是否只识别框中内容(默认为全屏识别) + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ 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 cb6dcfc..3b8b208 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 @@ -146,6 +146,15 @@ ): String /** + * 培训签到 + */ + @POST("/meter/train/plan/signIn") + suspend fun signIn( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取客户列表 */ @POST("/customer/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java index 56fc20d..24da65b 100644 --- a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java +++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java @@ -168,10 +168,13 @@ private String isDel; private String name; private String planId; + private String planName; + private String planNo; private String remark; private String signTime; private String staffId; private String technologyJob; + private String trainTime; private String updateTime; public String getCompany() { @@ -230,6 +233,22 @@ this.planId = planId; } + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanNo() { + return planNo; + } + + public void setPlanNo(String planNo) { + this.planNo = planNo; + } + public String getRemark() { return remark; } @@ -262,6 +281,14 @@ this.technologyJob = technologyJob; } + public String getTrainTime() { + return trainTime; + } + + public void setTrainTime(String trainTime) { + this.trainTime = trainTime; + } + public String getUpdateTime() { return updateTime; } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt new file mode 100644 index 0000000..2345bbe --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt @@ -0,0 +1,26 @@ +package com.casic.xz.meterage.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.xz.meterage.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_QRCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.themeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.themeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("培训签到二维码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setIsOnlyCenter(true) //是否只识别框中内容(默认为全屏识别) + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ 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 cb6dcfc..3b8b208 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 @@ -146,6 +146,15 @@ ): String /** + * 培训签到 + */ + @POST("/meter/train/plan/signIn") + suspend fun signIn( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取客户列表 */ @POST("/customer/listPage") 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 97a351f..086ba97 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 @@ -324,6 +324,19 @@ } /** + * 培训签到 + */ + suspend fun signIn(staffId: String, planId: String): String { + val param = JsonObject() + param.addProperty("staffId", staffId) + param.addProperty("planId", planId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.signIn(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取客户列表 */ suspend fun getCustomerList( diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java index 56fc20d..24da65b 100644 --- a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java +++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java @@ -168,10 +168,13 @@ private String isDel; private String name; private String planId; + private String planName; + private String planNo; private String remark; private String signTime; private String staffId; private String technologyJob; + private String trainTime; private String updateTime; public String getCompany() { @@ -230,6 +233,22 @@ this.planId = planId; } + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanNo() { + return planNo; + } + + public void setPlanNo(String planNo) { + this.planNo = planNo; + } + public String getRemark() { return remark; } @@ -262,6 +281,14 @@ this.technologyJob = technologyJob; } + public String getTrainTime() { + return trainTime; + } + + public void setTrainTime(String trainTime) { + this.trainTime = trainTime; + } + public String getUpdateTime() { return updateTime; } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt new file mode 100644 index 0000000..2345bbe --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt @@ -0,0 +1,26 @@ +package com.casic.xz.meterage.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.xz.meterage.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_QRCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.themeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.themeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("培训签到二维码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setIsOnlyCenter(true) //是否只识别框中内容(默认为全屏识别) + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ 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 cb6dcfc..3b8b208 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 @@ -146,6 +146,15 @@ ): String /** + * 培训签到 + */ + @POST("/meter/train/plan/signIn") + suspend fun signIn( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取客户列表 */ @POST("/customer/listPage") 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 97a351f..086ba97 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 @@ -324,6 +324,19 @@ } /** + * 培训签到 + */ + suspend fun signIn(staffId: String, planId: String): String { + val param = JsonObject() + param.addProperty("staffId", staffId) + param.addProperty("planId", planId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.signIn(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取客户列表 */ suspend fun getCustomerList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt index 711c3a3..512537a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt @@ -171,7 +171,7 @@ .setText(R.id.speakerNameView, item.director) val codeBitmap = QRUtils.getInstance().createQRCode( - item.planNo, 100f.dp2px(context), 100f.dp2px(context) + item.id, 100f.dp2px(context), 100f.dp2px(context) ) viewHolder.setImageResource(R.id.qrCodeView, codeBitmap) } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java index 56fc20d..24da65b 100644 --- a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java +++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java @@ -168,10 +168,13 @@ private String isDel; private String name; private String planId; + private String planName; + private String planNo; private String remark; private String signTime; private String staffId; private String technologyJob; + private String trainTime; private String updateTime; public String getCompany() { @@ -230,6 +233,22 @@ this.planId = planId; } + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanNo() { + return planNo; + } + + public void setPlanNo(String planNo) { + this.planNo = planNo; + } + public String getRemark() { return remark; } @@ -262,6 +281,14 @@ this.technologyJob = technologyJob; } + public String getTrainTime() { + return trainTime; + } + + public void setTrainTime(String trainTime) { + this.trainTime = trainTime; + } + public String getUpdateTime() { return updateTime; } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt new file mode 100644 index 0000000..2345bbe --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt @@ -0,0 +1,26 @@ +package com.casic.xz.meterage.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.xz.meterage.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_QRCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.themeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.themeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("培训签到二维码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setIsOnlyCenter(true) //是否只识别框中内容(默认为全屏识别) + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ 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 cb6dcfc..3b8b208 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 @@ -146,6 +146,15 @@ ): String /** + * 培训签到 + */ + @POST("/meter/train/plan/signIn") + suspend fun signIn( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取客户列表 */ @POST("/customer/listPage") 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 97a351f..086ba97 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 @@ -324,6 +324,19 @@ } /** + * 培训签到 + */ + suspend fun signIn(staffId: String, planId: String): String { + val param = JsonObject() + param.addProperty("staffId", staffId) + param.addProperty("planId", planId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.signIn(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取客户列表 */ suspend fun getCustomerList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt index 711c3a3..512537a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt @@ -171,7 +171,7 @@ .setText(R.id.speakerNameView, item.director) val codeBitmap = QRUtils.getInstance().createQRCode( - item.planNo, 100f.dp2px(context), 100f.dp2px(context) + item.id, 100f.dp2px(context), 100f.dp2px(context) ) viewHolder.setImageResource(R.id.qrCodeView, codeBitmap) } diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt index 9d5e287..9694c5c 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt @@ -31,7 +31,7 @@ fragmentPages.add(BasicInformationFragment(trainId)) if (data.roleTips.contains("administrator")) { - fragmentPages.add(StudentsFragment()) + fragmentPages.add(StudentsFragment(trainId)) } val devicePageTitles = arrayOf("基础信息", "培训学员") diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java index 56fc20d..24da65b 100644 --- a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java +++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java @@ -168,10 +168,13 @@ private String isDel; private String name; private String planId; + private String planName; + private String planNo; private String remark; private String signTime; private String staffId; private String technologyJob; + private String trainTime; private String updateTime; public String getCompany() { @@ -230,6 +233,22 @@ this.planId = planId; } + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanNo() { + return planNo; + } + + public void setPlanNo(String planNo) { + this.planNo = planNo; + } + public String getRemark() { return remark; } @@ -262,6 +281,14 @@ this.technologyJob = technologyJob; } + public String getTrainTime() { + return trainTime; + } + + public void setTrainTime(String trainTime) { + this.trainTime = trainTime; + } + public String getUpdateTime() { return updateTime; } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt new file mode 100644 index 0000000..2345bbe --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt @@ -0,0 +1,26 @@ +package com.casic.xz.meterage.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.xz.meterage.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_QRCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.themeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.themeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("培训签到二维码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setIsOnlyCenter(true) //是否只识别框中内容(默认为全屏识别) + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ 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 cb6dcfc..3b8b208 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 @@ -146,6 +146,15 @@ ): String /** + * 培训签到 + */ + @POST("/meter/train/plan/signIn") + suspend fun signIn( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取客户列表 */ @POST("/customer/listPage") 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 97a351f..086ba97 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 @@ -324,6 +324,19 @@ } /** + * 培训签到 + */ + suspend fun signIn(staffId: String, planId: String): String { + val param = JsonObject() + param.addProperty("staffId", staffId) + param.addProperty("planId", planId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.signIn(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取客户列表 */ suspend fun getCustomerList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt index 711c3a3..512537a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt @@ -171,7 +171,7 @@ .setText(R.id.speakerNameView, item.director) val codeBitmap = QRUtils.getInstance().createQRCode( - item.planNo, 100f.dp2px(context), 100f.dp2px(context) + item.id, 100f.dp2px(context), 100f.dp2px(context) ) viewHolder.setImageResource(R.id.qrCodeView, codeBitmap) } diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt index 9d5e287..9694c5c 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt @@ -31,7 +31,7 @@ fragmentPages.add(BasicInformationFragment(trainId)) if (data.roleTips.contains("administrator")) { - fragmentPages.add(StudentsFragment()) + fragmentPages.add(StudentsFragment(trainId)) } val devicePageTitles = arrayOf("基础信息", "培训学员") diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index a76a083..e0f37ee 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -4,6 +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.ActionResultModel import com.casic.xz.meterage.model.MeterageTrainDetailModel import com.casic.xz.meterage.model.MeterageTrainListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager @@ -22,6 +23,7 @@ private val gson by lazy { Gson() } val meterageTrainList = MutableLiveData() val meterageTrainDetail = MutableLiveData() + val signInResult = MutableLiveData() fun getMeterageTrainList( createStartTime: String, @@ -80,4 +82,22 @@ loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) }) + + fun signIn(staffId: String, planId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.signIn(staffId, planId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + signInResult.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()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java index 56fc20d..24da65b 100644 --- a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java +++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java @@ -168,10 +168,13 @@ private String isDel; private String name; private String planId; + private String planName; + private String planNo; private String remark; private String signTime; private String staffId; private String technologyJob; + private String trainTime; private String updateTime; public String getCompany() { @@ -230,6 +233,22 @@ this.planId = planId; } + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanNo() { + return planNo; + } + + public void setPlanNo(String planNo) { + this.planNo = planNo; + } + public String getRemark() { return remark; } @@ -262,6 +281,14 @@ this.technologyJob = technologyJob; } + public String getTrainTime() { + return trainTime; + } + + public void setTrainTime(String trainTime) { + this.trainTime = trainTime; + } + public String getUpdateTime() { return updateTime; } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt new file mode 100644 index 0000000..2345bbe --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt @@ -0,0 +1,26 @@ +package com.casic.xz.meterage.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.xz.meterage.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_QRCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.themeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.themeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("培训签到二维码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setIsOnlyCenter(true) //是否只识别框中内容(默认为全屏识别) + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ 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 cb6dcfc..3b8b208 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 @@ -146,6 +146,15 @@ ): String /** + * 培训签到 + */ + @POST("/meter/train/plan/signIn") + suspend fun signIn( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取客户列表 */ @POST("/customer/listPage") 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 97a351f..086ba97 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 @@ -324,6 +324,19 @@ } /** + * 培训签到 + */ + suspend fun signIn(staffId: String, planId: String): String { + val param = JsonObject() + param.addProperty("staffId", staffId) + param.addProperty("planId", planId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.signIn(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取客户列表 */ suspend fun getCustomerList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt index 711c3a3..512537a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt @@ -171,7 +171,7 @@ .setText(R.id.speakerNameView, item.director) val codeBitmap = QRUtils.getInstance().createQRCode( - item.planNo, 100f.dp2px(context), 100f.dp2px(context) + item.id, 100f.dp2px(context), 100f.dp2px(context) ) viewHolder.setImageResource(R.id.qrCodeView, codeBitmap) } diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt index 9d5e287..9694c5c 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt @@ -31,7 +31,7 @@ fragmentPages.add(BasicInformationFragment(trainId)) if (data.roleTips.contains("administrator")) { - fragmentPages.add(StudentsFragment()) + fragmentPages.add(StudentsFragment(trainId)) } val devicePageTitles = arrayOf("基础信息", "培训学员") diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index a76a083..e0f37ee 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -4,6 +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.ActionResultModel import com.casic.xz.meterage.model.MeterageTrainDetailModel import com.casic.xz.meterage.model.MeterageTrainListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager @@ -22,6 +23,7 @@ private val gson by lazy { Gson() } val meterageTrainList = MutableLiveData() val meterageTrainDetail = MutableLiveData() + val signInResult = MutableLiveData() fun getMeterageTrainList( createStartTime: String, @@ -80,4 +82,22 @@ loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) }) + + fun signIn(staffId: String, planId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.signIn(staffId, planId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + signInResult.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()) + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..037e077 --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java index 56fc20d..24da65b 100644 --- a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java +++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java @@ -168,10 +168,13 @@ private String isDel; private String name; private String planId; + private String planName; + private String planNo; private String remark; private String signTime; private String staffId; private String technologyJob; + private String trainTime; private String updateTime; public String getCompany() { @@ -230,6 +233,22 @@ this.planId = planId; } + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanNo() { + return planNo; + } + + public void setPlanNo(String planNo) { + this.planNo = planNo; + } + public String getRemark() { return remark; } @@ -262,6 +281,14 @@ this.technologyJob = technologyJob; } + public String getTrainTime() { + return trainTime; + } + + public void setTrainTime(String trainTime) { + this.trainTime = trainTime; + } + public String getUpdateTime() { return updateTime; } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt new file mode 100644 index 0000000..2345bbe --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt @@ -0,0 +1,26 @@ +package com.casic.xz.meterage.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.xz.meterage.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_QRCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.themeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.themeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("培训签到二维码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setIsOnlyCenter(true) //是否只识别框中内容(默认为全屏识别) + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ 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 cb6dcfc..3b8b208 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 @@ -146,6 +146,15 @@ ): String /** + * 培训签到 + */ + @POST("/meter/train/plan/signIn") + suspend fun signIn( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取客户列表 */ @POST("/customer/listPage") 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 97a351f..086ba97 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 @@ -324,6 +324,19 @@ } /** + * 培训签到 + */ + suspend fun signIn(staffId: String, planId: String): String { + val param = JsonObject() + param.addProperty("staffId", staffId) + param.addProperty("planId", planId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.signIn(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取客户列表 */ suspend fun getCustomerList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt index 711c3a3..512537a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt @@ -171,7 +171,7 @@ .setText(R.id.speakerNameView, item.director) val codeBitmap = QRUtils.getInstance().createQRCode( - item.planNo, 100f.dp2px(context), 100f.dp2px(context) + item.id, 100f.dp2px(context), 100f.dp2px(context) ) viewHolder.setImageResource(R.id.qrCodeView, codeBitmap) } diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt index 9d5e287..9694c5c 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt @@ -31,7 +31,7 @@ fragmentPages.add(BasicInformationFragment(trainId)) if (data.roleTips.contains("administrator")) { - fragmentPages.add(StudentsFragment()) + fragmentPages.add(StudentsFragment(trainId)) } val devicePageTitles = arrayOf("基础信息", "培训学员") diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index a76a083..e0f37ee 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -4,6 +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.ActionResultModel import com.casic.xz.meterage.model.MeterageTrainDetailModel import com.casic.xz.meterage.model.MeterageTrainListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager @@ -22,6 +23,7 @@ private val gson by lazy { Gson() } val meterageTrainList = MutableLiveData() val meterageTrainDetail = MutableLiveData() + val signInResult = MutableLiveData() fun getMeterageTrainList( createStartTime: String, @@ -80,4 +82,22 @@ loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) }) + + fun signIn(staffId: String, planId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.signIn(staffId, planId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + signInResult.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()) + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..037e077 --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index c71c1fc..14badb1 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -46,6 +46,7 @@ + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java index 56fc20d..24da65b 100644 --- a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java +++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java @@ -168,10 +168,13 @@ private String isDel; private String name; private String planId; + private String planName; + private String planNo; private String remark; private String signTime; private String staffId; private String technologyJob; + private String trainTime; private String updateTime; public String getCompany() { @@ -230,6 +233,22 @@ this.planId = planId; } + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanNo() { + return planNo; + } + + public void setPlanNo(String planNo) { + this.planNo = planNo; + } + public String getRemark() { return remark; } @@ -262,6 +281,14 @@ this.technologyJob = technologyJob; } + public String getTrainTime() { + return trainTime; + } + + public void setTrainTime(String trainTime) { + this.trainTime = trainTime; + } + public String getUpdateTime() { return updateTime; } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt new file mode 100644 index 0000000..2345bbe --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt @@ -0,0 +1,26 @@ +package com.casic.xz.meterage.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.xz.meterage.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_QRCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.themeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.themeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("培训签到二维码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setIsOnlyCenter(true) //是否只识别框中内容(默认为全屏识别) + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ 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 cb6dcfc..3b8b208 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 @@ -146,6 +146,15 @@ ): String /** + * 培训签到 + */ + @POST("/meter/train/plan/signIn") + suspend fun signIn( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取客户列表 */ @POST("/customer/listPage") 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 97a351f..086ba97 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 @@ -324,6 +324,19 @@ } /** + * 培训签到 + */ + suspend fun signIn(staffId: String, planId: String): String { + val param = JsonObject() + param.addProperty("staffId", staffId) + param.addProperty("planId", planId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.signIn(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取客户列表 */ suspend fun getCustomerList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt index 711c3a3..512537a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt @@ -171,7 +171,7 @@ .setText(R.id.speakerNameView, item.director) val codeBitmap = QRUtils.getInstance().createQRCode( - item.planNo, 100f.dp2px(context), 100f.dp2px(context) + item.id, 100f.dp2px(context), 100f.dp2px(context) ) viewHolder.setImageResource(R.id.qrCodeView, codeBitmap) } diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt index 9d5e287..9694c5c 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt @@ -31,7 +31,7 @@ fragmentPages.add(BasicInformationFragment(trainId)) if (data.roleTips.contains("administrator")) { - fragmentPages.add(StudentsFragment()) + fragmentPages.add(StudentsFragment(trainId)) } val devicePageTitles = arrayOf("基础信息", "培训学员") diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index a76a083..e0f37ee 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -4,6 +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.ActionResultModel import com.casic.xz.meterage.model.MeterageTrainDetailModel import com.casic.xz.meterage.model.MeterageTrainListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager @@ -22,6 +23,7 @@ private val gson by lazy { Gson() } val meterageTrainList = MutableLiveData() val meterageTrainDetail = MutableLiveData() + val signInResult = MutableLiveData() fun getMeterageTrainList( createStartTime: String, @@ -80,4 +82,22 @@ loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) }) + + fun signIn(staffId: String, planId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.signIn(staffId, planId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + signInResult.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()) + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..037e077 --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index c71c1fc..14badb1 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -46,6 +46,7 @@ - + android:background="@drawable/avatar_border_circle"> + + + + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java index 56fc20d..24da65b 100644 --- a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java +++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java @@ -168,10 +168,13 @@ private String isDel; private String name; private String planId; + private String planName; + private String planNo; private String remark; private String signTime; private String staffId; private String technologyJob; + private String trainTime; private String updateTime; public String getCompany() { @@ -230,6 +233,22 @@ this.planId = planId; } + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanNo() { + return planNo; + } + + public void setPlanNo(String planNo) { + this.planNo = planNo; + } + public String getRemark() { return remark; } @@ -262,6 +281,14 @@ this.technologyJob = technologyJob; } + public String getTrainTime() { + return trainTime; + } + + public void setTrainTime(String trainTime) { + this.trainTime = trainTime; + } + public String getUpdateTime() { return updateTime; } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt new file mode 100644 index 0000000..2345bbe --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt @@ -0,0 +1,26 @@ +package com.casic.xz.meterage.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.xz.meterage.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_QRCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.themeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.themeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("培训签到二维码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setIsOnlyCenter(true) //是否只识别框中内容(默认为全屏识别) + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ 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 cb6dcfc..3b8b208 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 @@ -146,6 +146,15 @@ ): String /** + * 培训签到 + */ + @POST("/meter/train/plan/signIn") + suspend fun signIn( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取客户列表 */ @POST("/customer/listPage") 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 97a351f..086ba97 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 @@ -324,6 +324,19 @@ } /** + * 培训签到 + */ + suspend fun signIn(staffId: String, planId: String): String { + val param = JsonObject() + param.addProperty("staffId", staffId) + param.addProperty("planId", planId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.signIn(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取客户列表 */ suspend fun getCustomerList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt index 711c3a3..512537a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt @@ -171,7 +171,7 @@ .setText(R.id.speakerNameView, item.director) val codeBitmap = QRUtils.getInstance().createQRCode( - item.planNo, 100f.dp2px(context), 100f.dp2px(context) + item.id, 100f.dp2px(context), 100f.dp2px(context) ) viewHolder.setImageResource(R.id.qrCodeView, codeBitmap) } diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt index 9d5e287..9694c5c 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt @@ -31,7 +31,7 @@ fragmentPages.add(BasicInformationFragment(trainId)) if (data.roleTips.contains("administrator")) { - fragmentPages.add(StudentsFragment()) + fragmentPages.add(StudentsFragment(trainId)) } val devicePageTitles = arrayOf("基础信息", "培训学员") diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index a76a083..e0f37ee 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -4,6 +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.ActionResultModel import com.casic.xz.meterage.model.MeterageTrainDetailModel import com.casic.xz.meterage.model.MeterageTrainListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager @@ -22,6 +23,7 @@ private val gson by lazy { Gson() } val meterageTrainList = MutableLiveData() val meterageTrainDetail = MutableLiveData() + val signInResult = MutableLiveData() fun getMeterageTrainList( createStartTime: String, @@ -80,4 +82,22 @@ loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) }) + + fun signIn(staffId: String, planId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.signIn(staffId, planId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + signInResult.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()) + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..037e077 --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index c71c1fc..14badb1 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -46,6 +46,7 @@ - + android:background="@drawable/avatar_border_circle"> + + + - + android:background="@color/white" + android:orientation="vertical"> - \ No newline at end of file + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index e27dac3..4d81d07 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -3,18 +3,29 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* import java.util.* @@ -22,8 +33,13 @@ class HomePageFragment : KotlinBaseFragment() { private val timer = object : Timer() {} - private var currentIndex = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var userData: UserInfoModel.DataModel + private var currentIndex = 0 + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) + } override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } @@ -38,6 +54,21 @@ true } + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + userData = it.data + } + } + + meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + meterageTrainViewModel.signInResult.observe(this) { + if (it.code == 200) { + "签到成功".show(requireContext()) + } + } + val noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.getNoticeList("", "", "", "", "", 1) noticeViewModel.noticeList.observe(this) { @@ -105,6 +136,16 @@ } override fun initEvent() { + scanCodeView.setOnClickListener { + qrManager.startScan(requireActivity()) { result -> + if (result.content.isDigitsOnly()) { + meterageTrainViewModel.signIn(userData.id, result.content) + } else { + "签到二维码错误,请重新扫描".show(requireContext()) + } + } + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } @@ -113,7 +154,12 @@ override fun initLayoutView(): Int = R.layout.fragment_home override fun observeRequestState() { - + meterageTrainViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "签到中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 81ddf4f..65145ce 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -3,7 +3,10 @@ import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.combineFilePath import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel @@ -22,15 +25,23 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val data = it.data - userNameView.text = data.name - userUnitView.text = data.deptName + val user = it.data + userNameView.text = user.name + userUnitView.text = user.deptName -// Glide.with(requireContext()) -// .load(R.mipmap.default_avatar) -// .apply(RequestOptions.circleCropTransform()) -// .placeholder(R.mipmap.load_image_error) -// .into(userAvatarView) + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .asBitmap() + .load(user.avatar.combineFilePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .asBitmap() + .load(R.mipmap.default_avatar) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt index f7797a0..5921a35 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt @@ -10,12 +10,12 @@ class BasicInformationFragment(private val id: String) : KotlinBaseFragment() { - private lateinit var meterageTrainViewModel: MeterageTrainViewModel + private lateinit var trainViewModel: MeterageTrainViewModel override fun initData() { - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] - meterageTrainViewModel.getMeterageTrainDetail(id) - meterageTrainViewModel.meterageTrainDetail.observe(this) { + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { if (it.code == 200) { val data = it.data!! @@ -42,7 +42,7 @@ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information override fun observeRequestState() { - meterageTrainViewModel.loadState.observe(this) { + trainViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") else -> LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt index 8eb4755..1d9c203 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt @@ -1,12 +1,39 @@ package com.casic.xz.meterage.fragment.train +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.vm.MeterageTrainViewModel +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.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_train_students.* +import kotlinx.android.synthetic.main.include_empty_view.* -class StudentsFragment : KotlinBaseFragment() { +class StudentsFragment(private val id: String) : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var trainViewModel: MeterageTrainViewModel + private lateinit var studentsAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = + ArrayList() override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + trainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] + trainViewModel.getMeterageTrainDetail(id) + trainViewModel.meterageTrainDetail.observe(this) { + if (it.code == 200) { + if (it.code == 200) { + dataBeans = it.data?.trainStaffList!! + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + } } override fun initEvent() { @@ -22,4 +49,35 @@ override fun setupTopBarLayout() { } + + private val callback = Handler.Callback { + when (it.what) { + 2023030801 -> { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("暂无学员签到") { + trainViewModel.getMeterageTrainDetail(id) + } + } else { + emptyView!!.hide() + studentsAdapter = object : + NormalRecyclerAdapter( + R.layout.item_train_student_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: MeterageTrainDetailModel.DataModel.TrainStaffListModel + ) { + viewHolder.setText(R.id.studentNameView, item.name) + .setText(R.id.studentJobView, item.technologyJob) + .setText(R.id.studentLabView, "单位:${item.company}") + .setText(R.id.signInTimeView, "签到时间:${item.signTime}") + } + } + studentsRecyclerView.adapter = studentsAdapter + } + } + } + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java index 56fc20d..24da65b 100644 --- a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java +++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java @@ -168,10 +168,13 @@ private String isDel; private String name; private String planId; + private String planName; + private String planNo; private String remark; private String signTime; private String staffId; private String technologyJob; + private String trainTime; private String updateTime; public String getCompany() { @@ -230,6 +233,22 @@ this.planId = planId; } + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanNo() { + return planNo; + } + + public void setPlanNo(String planNo) { + this.planNo = planNo; + } + public String getRemark() { return remark; } @@ -262,6 +281,14 @@ this.technologyJob = technologyJob; } + public String getTrainTime() { + return trainTime; + } + + public void setTrainTime(String trainTime) { + this.trainTime = trainTime; + } + public String getUpdateTime() { return updateTime; } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt new file mode 100644 index 0000000..2345bbe --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/QrConfigCreator.kt @@ -0,0 +1,26 @@ +package com.casic.xz.meterage.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.xz.meterage.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_QRCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.themeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.themeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("培训签到二维码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setIsOnlyCenter(true) //是否只识别框中内容(默认为全屏识别) + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ 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 cb6dcfc..3b8b208 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 @@ -146,6 +146,15 @@ ): String /** + * 培训签到 + */ + @POST("/meter/train/plan/signIn") + suspend fun signIn( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取客户列表 */ @POST("/customer/listPage") 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 97a351f..086ba97 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 @@ -324,6 +324,19 @@ } /** + * 培训签到 + */ + suspend fun signIn(staffId: String, planId: String): String { + val param = JsonObject() + param.addProperty("staffId", staffId) + param.addProperty("planId", planId) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.signIn(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取客户列表 */ suspend fun getCustomerList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt index 711c3a3..512537a 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt @@ -171,7 +171,7 @@ .setText(R.id.speakerNameView, item.director) val codeBitmap = QRUtils.getInstance().createQRCode( - item.planNo, 100f.dp2px(context), 100f.dp2px(context) + item.id, 100f.dp2px(context), 100f.dp2px(context) ) viewHolder.setImageResource(R.id.qrCodeView, codeBitmap) } diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt index 9d5e287..9694c5c 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt @@ -31,7 +31,7 @@ fragmentPages.add(BasicInformationFragment(trainId)) if (data.roleTips.contains("administrator")) { - fragmentPages.add(StudentsFragment()) + fragmentPages.add(StudentsFragment(trainId)) } val devicePageTitles = arrayOf("基础信息", "培训学员") diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index a76a083..e0f37ee 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -4,6 +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.ActionResultModel import com.casic.xz.meterage.model.MeterageTrainDetailModel import com.casic.xz.meterage.model.MeterageTrainListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager @@ -22,6 +23,7 @@ private val gson by lazy { Gson() } val meterageTrainList = MutableLiveData() val meterageTrainDetail = MutableLiveData() + val signInResult = MutableLiveData() fun getMeterageTrainList( createStartTime: String, @@ -80,4 +82,22 @@ loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) }) + + fun signIn(staffId: String, planId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.signIn(staffId, planId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + signInResult.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()) + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..037e077 --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index c71c1fc..14badb1 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -46,6 +46,7 @@ - + android:background="@drawable/avatar_border_circle"> + + + - + android:background="@color/white" + android:orientation="vertical"> - \ No newline at end of file + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_train_student_rv_l.xml b/app/src/main/res/layout/item_train_student_rv_l.xml new file mode 100644 index 0000000..20ecc97 --- /dev/null +++ b/app/src/main/res/layout/item_train_student_rv_l.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + +