diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8eb4755
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.xz.meterage.fragment.train
+
+import com.casic.xz.meterage.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class StudentsFragment : KotlinBaseFragment() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_students
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8eb4755
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.xz.meterage.fragment.train
+
+import com.casic.xz.meterage.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class StudentsFragment : KotlinBaseFragment() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_students
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ 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
new file mode 100644
index 0000000..56fc20d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java
@@ -0,0 +1,274 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainDetailModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String planName;
+ private String planNo;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private List trainStaffList;
+ private String trainTime;
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ 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;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public List getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(List trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public static class TrainStaffListModel {
+ private String company;
+ private String createTime;
+ private String examResult;
+ private String id;
+ private String isDel;
+ private String name;
+ private String planId;
+ private String remark;
+ private String signTime;
+ private String staffId;
+ private String technologyJob;
+ private String updateTime;
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getExamResult() {
+ return examResult;
+ }
+
+ public void setExamResult(String examResult) {
+ this.examResult = examResult;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(String isDel) {
+ this.isDel = isDel;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPlanId() {
+ return planId;
+ }
+
+ public void setPlanId(String planId) {
+ this.planId = planId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getSignTime() {
+ return signTime;
+ }
+
+ public void setSignTime(String signTime) {
+ this.signTime = signTime;
+ }
+
+ public String getStaffId() {
+ return staffId;
+ }
+
+ public void setStaffId(String staffId) {
+ this.staffId = staffId;
+ }
+
+ public String getTechnologyJob() {
+ return technologyJob;
+ }
+
+ public void setTechnologyJob(String technologyJob) {
+ this.technologyJob = technologyJob;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8eb4755
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.xz.meterage.fragment.train
+
+import com.casic.xz.meterage.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class StudentsFragment : KotlinBaseFragment() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_students
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ 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
new file mode 100644
index 0000000..56fc20d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java
@@ -0,0 +1,274 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainDetailModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String planName;
+ private String planNo;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private List trainStaffList;
+ private String trainTime;
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ 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;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public List getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(List trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public static class TrainStaffListModel {
+ private String company;
+ private String createTime;
+ private String examResult;
+ private String id;
+ private String isDel;
+ private String name;
+ private String planId;
+ private String remark;
+ private String signTime;
+ private String staffId;
+ private String technologyJob;
+ private String updateTime;
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getExamResult() {
+ return examResult;
+ }
+
+ public void setExamResult(String examResult) {
+ this.examResult = examResult;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(String isDel) {
+ this.isDel = isDel;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPlanId() {
+ return planId;
+ }
+
+ public void setPlanId(String planId) {
+ this.planId = planId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getSignTime() {
+ return signTime;
+ }
+
+ public void setSignTime(String signTime) {
+ this.signTime = signTime;
+ }
+
+ public String getStaffId() {
+ return staffId;
+ }
+
+ public void setStaffId(String staffId) {
+ this.staffId = staffId;
+ }
+
+ public String getTechnologyJob() {
+ return technologyJob;
+ }
+
+ public void setTechnologyJob(String technologyJob) {
+ this.technologyJob = technologyJob;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
new file mode 100644
index 0000000..a99d1d0
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
@@ -0,0 +1,256 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainListModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private List rows;
+ private int total;
+
+ public List getRows() {
+ return rows;
+ }
+
+ public void setRows(List rows) {
+ this.rows = rows;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public void setTotal(int total) {
+ this.total = total;
+ }
+
+ public static class RowsModel {
+ private String approvalStatus;
+ private String approvalStatusName;
+ private String createTime;
+ private String createUserId;
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String id;
+ private int isDel;
+ private String planName;
+ private String planNo;
+ private String processId;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private String trainStaffList;
+ private String trainTime;
+ private String updateTime;
+
+ public String getApprovalStatus() {
+ return approvalStatus;
+ }
+
+ public void setApprovalStatus(String approvalStatus) {
+ this.approvalStatus = approvalStatus;
+ }
+
+ public String getApprovalStatusName() {
+ return approvalStatusName;
+ }
+
+ public void setApprovalStatusName(String approvalStatusName) {
+ this.approvalStatusName = approvalStatusName;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public int getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(int isDel) {
+ this.isDel = isDel;
+ }
+
+ 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 getProcessId() {
+ return processId;
+ }
+
+ public void setProcessId(String processId) {
+ this.processId = processId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public String getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(String trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8eb4755
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.xz.meterage.fragment.train
+
+import com.casic.xz.meterage.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class StudentsFragment : KotlinBaseFragment() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_students
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ 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
new file mode 100644
index 0000000..56fc20d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java
@@ -0,0 +1,274 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainDetailModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String planName;
+ private String planNo;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private List trainStaffList;
+ private String trainTime;
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ 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;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public List getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(List trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public static class TrainStaffListModel {
+ private String company;
+ private String createTime;
+ private String examResult;
+ private String id;
+ private String isDel;
+ private String name;
+ private String planId;
+ private String remark;
+ private String signTime;
+ private String staffId;
+ private String technologyJob;
+ private String updateTime;
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getExamResult() {
+ return examResult;
+ }
+
+ public void setExamResult(String examResult) {
+ this.examResult = examResult;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(String isDel) {
+ this.isDel = isDel;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPlanId() {
+ return planId;
+ }
+
+ public void setPlanId(String planId) {
+ this.planId = planId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getSignTime() {
+ return signTime;
+ }
+
+ public void setSignTime(String signTime) {
+ this.signTime = signTime;
+ }
+
+ public String getStaffId() {
+ return staffId;
+ }
+
+ public void setStaffId(String staffId) {
+ this.staffId = staffId;
+ }
+
+ public String getTechnologyJob() {
+ return technologyJob;
+ }
+
+ public void setTechnologyJob(String technologyJob) {
+ this.technologyJob = technologyJob;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
new file mode 100644
index 0000000..a99d1d0
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
@@ -0,0 +1,256 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainListModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private List rows;
+ private int total;
+
+ public List getRows() {
+ return rows;
+ }
+
+ public void setRows(List rows) {
+ this.rows = rows;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public void setTotal(int total) {
+ this.total = total;
+ }
+
+ public static class RowsModel {
+ private String approvalStatus;
+ private String approvalStatusName;
+ private String createTime;
+ private String createUserId;
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String id;
+ private int isDel;
+ private String planName;
+ private String planNo;
+ private String processId;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private String trainStaffList;
+ private String trainTime;
+ private String updateTime;
+
+ public String getApprovalStatus() {
+ return approvalStatus;
+ }
+
+ public void setApprovalStatus(String approvalStatus) {
+ this.approvalStatus = approvalStatus;
+ }
+
+ public String getApprovalStatusName() {
+ return approvalStatusName;
+ }
+
+ public void setApprovalStatusName(String approvalStatusName) {
+ this.approvalStatusName = approvalStatusName;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public int getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(int isDel) {
+ this.isDel = isDel;
+ }
+
+ 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 getProcessId() {
+ return processId;
+ }
+
+ public void setProcessId(String processId) {
+ this.processId = processId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public String getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(String trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
index c7a99a0..443d6dd 100644
--- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
@@ -12,7 +12,8 @@
val USER_PERMISSIONS = arrayOf(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE,
- Manifest.permission.WRITE_EXTERNAL_STORAGE
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.CAMERA
)
val HOME_FUNC_OPERATE = arrayOf(
"仪器设备", "标准装置", "证书报告", "委托需求", "访客", "标准规范", "能力列表", "计量培训",
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8eb4755
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.xz.meterage.fragment.train
+
+import com.casic.xz.meterage.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class StudentsFragment : KotlinBaseFragment() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_students
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ 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
new file mode 100644
index 0000000..56fc20d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java
@@ -0,0 +1,274 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainDetailModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String planName;
+ private String planNo;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private List trainStaffList;
+ private String trainTime;
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ 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;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public List getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(List trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public static class TrainStaffListModel {
+ private String company;
+ private String createTime;
+ private String examResult;
+ private String id;
+ private String isDel;
+ private String name;
+ private String planId;
+ private String remark;
+ private String signTime;
+ private String staffId;
+ private String technologyJob;
+ private String updateTime;
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getExamResult() {
+ return examResult;
+ }
+
+ public void setExamResult(String examResult) {
+ this.examResult = examResult;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(String isDel) {
+ this.isDel = isDel;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPlanId() {
+ return planId;
+ }
+
+ public void setPlanId(String planId) {
+ this.planId = planId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getSignTime() {
+ return signTime;
+ }
+
+ public void setSignTime(String signTime) {
+ this.signTime = signTime;
+ }
+
+ public String getStaffId() {
+ return staffId;
+ }
+
+ public void setStaffId(String staffId) {
+ this.staffId = staffId;
+ }
+
+ public String getTechnologyJob() {
+ return technologyJob;
+ }
+
+ public void setTechnologyJob(String technologyJob) {
+ this.technologyJob = technologyJob;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
new file mode 100644
index 0000000..a99d1d0
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
@@ -0,0 +1,256 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainListModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private List rows;
+ private int total;
+
+ public List getRows() {
+ return rows;
+ }
+
+ public void setRows(List rows) {
+ this.rows = rows;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public void setTotal(int total) {
+ this.total = total;
+ }
+
+ public static class RowsModel {
+ private String approvalStatus;
+ private String approvalStatusName;
+ private String createTime;
+ private String createUserId;
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String id;
+ private int isDel;
+ private String planName;
+ private String planNo;
+ private String processId;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private String trainStaffList;
+ private String trainTime;
+ private String updateTime;
+
+ public String getApprovalStatus() {
+ return approvalStatus;
+ }
+
+ public void setApprovalStatus(String approvalStatus) {
+ this.approvalStatus = approvalStatus;
+ }
+
+ public String getApprovalStatusName() {
+ return approvalStatusName;
+ }
+
+ public void setApprovalStatusName(String approvalStatusName) {
+ this.approvalStatusName = approvalStatusName;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public int getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(int isDel) {
+ this.isDel = isDel;
+ }
+
+ 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 getProcessId() {
+ return processId;
+ }
+
+ public void setProcessId(String processId) {
+ this.processId = processId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public String getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(String trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
index c7a99a0..443d6dd 100644
--- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
@@ -12,7 +12,8 @@
val USER_PERMISSIONS = arrayOf(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE,
- Manifest.permission.WRITE_EXTERNAL_STORAGE
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.CAMERA
)
val HOME_FUNC_OPERATE = arrayOf(
"仪器设备", "标准装置", "证书报告", "委托需求", "访客", "标准规范", "能力列表", "计量培训",
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 75f6c2b..3b8cb14 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
@@ -95,4 +95,24 @@
@Header("token") token: String,
@Body requestBody: RequestBody
): String
+
+ /**
+ * 获取培训计划列表
+ */
+ @POST("/meter/train/plan/listPage")
+ suspend fun getMeterageTrainList(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody,
+ @QueryMap limit: Map,
+ @QueryMap offset: Map
+ ): String
+
+ /**
+ * 获取培训计划详情
+ */
+ @POST("/meter/train/plan/detail")
+ suspend fun getMeterageTrainDetail(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8eb4755
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.xz.meterage.fragment.train
+
+import com.casic.xz.meterage.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class StudentsFragment : KotlinBaseFragment() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_students
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ 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
new file mode 100644
index 0000000..56fc20d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java
@@ -0,0 +1,274 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainDetailModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String planName;
+ private String planNo;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private List trainStaffList;
+ private String trainTime;
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ 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;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public List getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(List trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public static class TrainStaffListModel {
+ private String company;
+ private String createTime;
+ private String examResult;
+ private String id;
+ private String isDel;
+ private String name;
+ private String planId;
+ private String remark;
+ private String signTime;
+ private String staffId;
+ private String technologyJob;
+ private String updateTime;
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getExamResult() {
+ return examResult;
+ }
+
+ public void setExamResult(String examResult) {
+ this.examResult = examResult;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(String isDel) {
+ this.isDel = isDel;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPlanId() {
+ return planId;
+ }
+
+ public void setPlanId(String planId) {
+ this.planId = planId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getSignTime() {
+ return signTime;
+ }
+
+ public void setSignTime(String signTime) {
+ this.signTime = signTime;
+ }
+
+ public String getStaffId() {
+ return staffId;
+ }
+
+ public void setStaffId(String staffId) {
+ this.staffId = staffId;
+ }
+
+ public String getTechnologyJob() {
+ return technologyJob;
+ }
+
+ public void setTechnologyJob(String technologyJob) {
+ this.technologyJob = technologyJob;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
new file mode 100644
index 0000000..a99d1d0
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
@@ -0,0 +1,256 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainListModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private List rows;
+ private int total;
+
+ public List getRows() {
+ return rows;
+ }
+
+ public void setRows(List rows) {
+ this.rows = rows;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public void setTotal(int total) {
+ this.total = total;
+ }
+
+ public static class RowsModel {
+ private String approvalStatus;
+ private String approvalStatusName;
+ private String createTime;
+ private String createUserId;
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String id;
+ private int isDel;
+ private String planName;
+ private String planNo;
+ private String processId;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private String trainStaffList;
+ private String trainTime;
+ private String updateTime;
+
+ public String getApprovalStatus() {
+ return approvalStatus;
+ }
+
+ public void setApprovalStatus(String approvalStatus) {
+ this.approvalStatus = approvalStatus;
+ }
+
+ public String getApprovalStatusName() {
+ return approvalStatusName;
+ }
+
+ public void setApprovalStatusName(String approvalStatusName) {
+ this.approvalStatusName = approvalStatusName;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public int getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(int isDel) {
+ this.isDel = isDel;
+ }
+
+ 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 getProcessId() {
+ return processId;
+ }
+
+ public void setProcessId(String processId) {
+ this.processId = processId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public String getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(String trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
index c7a99a0..443d6dd 100644
--- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
@@ -12,7 +12,8 @@
val USER_PERMISSIONS = arrayOf(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE,
- Manifest.permission.WRITE_EXTERNAL_STORAGE
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.CAMERA
)
val HOME_FUNC_OPERATE = arrayOf(
"仪器设备", "标准装置", "证书报告", "委托需求", "访客", "标准规范", "能力列表", "计量培训",
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 75f6c2b..3b8cb14 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
@@ -95,4 +95,24 @@
@Header("token") token: String,
@Body requestBody: RequestBody
): String
+
+ /**
+ * 获取培训计划列表
+ */
+ @POST("/meter/train/plan/listPage")
+ suspend fun getMeterageTrainList(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody,
+ @QueryMap limit: Map,
+ @QueryMap offset: Map
+ ): String
+
+ /**
+ * 获取培训计划详情
+ */
+ @POST("/meter/train/plan/detail")
+ suspend fun getMeterageTrainDetail(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
}
\ No newline at end of file
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 27e91ca..3f7d42f 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
@@ -233,4 +233,59 @@
)
return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody)
}
+
+ /**
+ * 获取培训计划列表
+ */
+ suspend fun getMeterageTrainList(
+ createStartTime: String,
+ createEndTime: String,
+ deptId: String,
+ director: String,
+ effectiveCompany: String,
+ trainStartTime: String,
+ trainEndTime: String,
+ formId: String,
+ ids: Array,
+ offset: Int
+ ): String {
+ val paramObject = JSONObject()
+ paramObject.put("createStartTime", createStartTime)
+ paramObject.put("createEndTime", createEndTime)
+ paramObject.put("deptId", deptId)
+ paramObject.put("director", director)
+ paramObject.put("effectiveCompany", effectiveCompany)
+ paramObject.put("trainStartTime", trainStartTime)
+ paramObject.put("trainEndTime", trainEndTime)
+ paramObject.put("formId", formId)
+
+ val jsonArray = JSONArray()
+ ids.forEach {
+ jsonArray.put(it)
+ }
+ paramObject.put("ids", jsonArray)
+
+ val requestBody = paramObject.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ val limitMap = HashMap()
+ limitMap["limit"] = LocaleConstant.PAGE_LIMIT
+
+ val offsetMap = HashMap()
+ offsetMap["offset"] = offset
+ return api.getMeterageTrainList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap)
+ }
+
+ /**
+ * 获取培训计划详情
+ */
+ suspend fun getMeterageTrainDetail(id: String): String {
+ val paramObject = JSONObject()
+ paramObject.put("id", id)
+ val requestBody = paramObject.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.getMeterageTrainDetail(AuthenticationHelper.token!!, requestBody)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8eb4755
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.xz.meterage.fragment.train
+
+import com.casic.xz.meterage.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class StudentsFragment : KotlinBaseFragment() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_students
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ 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
new file mode 100644
index 0000000..56fc20d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java
@@ -0,0 +1,274 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainDetailModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String planName;
+ private String planNo;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private List trainStaffList;
+ private String trainTime;
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ 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;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public List getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(List trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public static class TrainStaffListModel {
+ private String company;
+ private String createTime;
+ private String examResult;
+ private String id;
+ private String isDel;
+ private String name;
+ private String planId;
+ private String remark;
+ private String signTime;
+ private String staffId;
+ private String technologyJob;
+ private String updateTime;
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getExamResult() {
+ return examResult;
+ }
+
+ public void setExamResult(String examResult) {
+ this.examResult = examResult;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(String isDel) {
+ this.isDel = isDel;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPlanId() {
+ return planId;
+ }
+
+ public void setPlanId(String planId) {
+ this.planId = planId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getSignTime() {
+ return signTime;
+ }
+
+ public void setSignTime(String signTime) {
+ this.signTime = signTime;
+ }
+
+ public String getStaffId() {
+ return staffId;
+ }
+
+ public void setStaffId(String staffId) {
+ this.staffId = staffId;
+ }
+
+ public String getTechnologyJob() {
+ return technologyJob;
+ }
+
+ public void setTechnologyJob(String technologyJob) {
+ this.technologyJob = technologyJob;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
new file mode 100644
index 0000000..a99d1d0
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
@@ -0,0 +1,256 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainListModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private List rows;
+ private int total;
+
+ public List getRows() {
+ return rows;
+ }
+
+ public void setRows(List rows) {
+ this.rows = rows;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public void setTotal(int total) {
+ this.total = total;
+ }
+
+ public static class RowsModel {
+ private String approvalStatus;
+ private String approvalStatusName;
+ private String createTime;
+ private String createUserId;
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String id;
+ private int isDel;
+ private String planName;
+ private String planNo;
+ private String processId;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private String trainStaffList;
+ private String trainTime;
+ private String updateTime;
+
+ public String getApprovalStatus() {
+ return approvalStatus;
+ }
+
+ public void setApprovalStatus(String approvalStatus) {
+ this.approvalStatus = approvalStatus;
+ }
+
+ public String getApprovalStatusName() {
+ return approvalStatusName;
+ }
+
+ public void setApprovalStatusName(String approvalStatusName) {
+ this.approvalStatusName = approvalStatusName;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public int getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(int isDel) {
+ this.isDel = isDel;
+ }
+
+ 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 getProcessId() {
+ return processId;
+ }
+
+ public void setProcessId(String processId) {
+ this.processId = processId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public String getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(String trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
index c7a99a0..443d6dd 100644
--- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
@@ -12,7 +12,8 @@
val USER_PERMISSIONS = arrayOf(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE,
- Manifest.permission.WRITE_EXTERNAL_STORAGE
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.CAMERA
)
val HOME_FUNC_OPERATE = arrayOf(
"仪器设备", "标准装置", "证书报告", "委托需求", "访客", "标准规范", "能力列表", "计量培训",
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 75f6c2b..3b8cb14 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
@@ -95,4 +95,24 @@
@Header("token") token: String,
@Body requestBody: RequestBody
): String
+
+ /**
+ * 获取培训计划列表
+ */
+ @POST("/meter/train/plan/listPage")
+ suspend fun getMeterageTrainList(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody,
+ @QueryMap limit: Map,
+ @QueryMap offset: Map
+ ): String
+
+ /**
+ * 获取培训计划详情
+ */
+ @POST("/meter/train/plan/detail")
+ suspend fun getMeterageTrainDetail(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
}
\ No newline at end of file
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 27e91ca..3f7d42f 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
@@ -233,4 +233,59 @@
)
return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody)
}
+
+ /**
+ * 获取培训计划列表
+ */
+ suspend fun getMeterageTrainList(
+ createStartTime: String,
+ createEndTime: String,
+ deptId: String,
+ director: String,
+ effectiveCompany: String,
+ trainStartTime: String,
+ trainEndTime: String,
+ formId: String,
+ ids: Array,
+ offset: Int
+ ): String {
+ val paramObject = JSONObject()
+ paramObject.put("createStartTime", createStartTime)
+ paramObject.put("createEndTime", createEndTime)
+ paramObject.put("deptId", deptId)
+ paramObject.put("director", director)
+ paramObject.put("effectiveCompany", effectiveCompany)
+ paramObject.put("trainStartTime", trainStartTime)
+ paramObject.put("trainEndTime", trainEndTime)
+ paramObject.put("formId", formId)
+
+ val jsonArray = JSONArray()
+ ids.forEach {
+ jsonArray.put(it)
+ }
+ paramObject.put("ids", jsonArray)
+
+ val requestBody = paramObject.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ val limitMap = HashMap()
+ limitMap["limit"] = LocaleConstant.PAGE_LIMIT
+
+ val offsetMap = HashMap()
+ offsetMap["offset"] = offset
+ return api.getMeterageTrainList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap)
+ }
+
+ /**
+ * 获取培训计划详情
+ */
+ suspend fun getMeterageTrainDetail(id: String): String {
+ val paramObject = JSONObject()
+ paramObject.put("id", id)
+ val requestBody = paramObject.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.getMeterageTrainDetail(AuthenticationHelper.token!!, requestBody)
+ }
}
\ No newline at end of file
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
new file mode 100644
index 0000000..0f45e25
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt
@@ -0,0 +1,149 @@
+package com.casic.xz.meterage.view.home
+
+import android.os.Handler
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.adapter.MeterageTrainListAdapter
+import com.casic.xz.meterage.extensions.initLayoutImmersionBar
+import com.casic.xz.meterage.extensions.showEmptyPage
+import com.casic.xz.meterage.model.MeterageTrainListModel
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.view.search.SearchMeterageTrainActivity
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.activity_meterage_train.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import kotlinx.android.synthetic.main.include_search_title.*
+
+class MeterageTrainActivity : KotlinBaseActivity() {
+
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+ private lateinit var meterageTrainListAdapter: MeterageTrainListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initData() {
+ weakReferenceHandler = WeakReferenceHandler(callback)
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.meterageTrainResult.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows!!
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows
+ trainLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows.size == 0) {
+ "到底了,别拉了".show(this)
+ }
+ dataBeans.addAll(dataRows)
+ trainLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2023021001)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+ rightOperateView.setOnClickListener {
+ navigatePageTo()
+ }
+
+ trainLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+
+ trainLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ getMeterageTrainList()
+ }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_meterage_train
+
+ override fun onResume() {
+ super.onResume()
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ private fun getMeterageTrainList() {
+ meterageTrainViewModel.getMeterageTrainList(
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "jlglpxjhsp",
+ arrayOf(),
+ pageIndex
+ )
+ }
+
+ private val callback = Handler.Callback {
+ when (it.what) {
+ 2023021001 -> {
+ if (isRefresh || isLoadMore) {
+ meterageTrainListAdapter.notifyDataSetChanged()
+ } else {
+ if (dataBeans.size == 0) {
+ emptyView!!.showEmptyPage("无培训计划") {
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+ } else {
+ emptyView!!.hide()
+ meterageTrainListAdapter = MeterageTrainListAdapter(this, dataBeans)
+ trainRecyclerView.adapter = meterageTrainListAdapter
+ meterageTrainListAdapter.setOnItemClickListener(object :
+ MeterageTrainListAdapter.OnItemClickListener {
+ override fun onItemClicked(position: Int) {
+ val rowsModel = dataBeans[position]
+ navigatePageTo(rowsModel.id)
+ }
+ })
+ }
+ }
+ }
+ }
+ true
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
+ titleView.text = "计量培训"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8eb4755
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.xz.meterage.fragment.train
+
+import com.casic.xz.meterage.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class StudentsFragment : KotlinBaseFragment() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_students
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ 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
new file mode 100644
index 0000000..56fc20d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java
@@ -0,0 +1,274 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainDetailModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String planName;
+ private String planNo;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private List trainStaffList;
+ private String trainTime;
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ 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;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public List getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(List trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public static class TrainStaffListModel {
+ private String company;
+ private String createTime;
+ private String examResult;
+ private String id;
+ private String isDel;
+ private String name;
+ private String planId;
+ private String remark;
+ private String signTime;
+ private String staffId;
+ private String technologyJob;
+ private String updateTime;
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getExamResult() {
+ return examResult;
+ }
+
+ public void setExamResult(String examResult) {
+ this.examResult = examResult;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(String isDel) {
+ this.isDel = isDel;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPlanId() {
+ return planId;
+ }
+
+ public void setPlanId(String planId) {
+ this.planId = planId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getSignTime() {
+ return signTime;
+ }
+
+ public void setSignTime(String signTime) {
+ this.signTime = signTime;
+ }
+
+ public String getStaffId() {
+ return staffId;
+ }
+
+ public void setStaffId(String staffId) {
+ this.staffId = staffId;
+ }
+
+ public String getTechnologyJob() {
+ return technologyJob;
+ }
+
+ public void setTechnologyJob(String technologyJob) {
+ this.technologyJob = technologyJob;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
new file mode 100644
index 0000000..a99d1d0
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
@@ -0,0 +1,256 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainListModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private List rows;
+ private int total;
+
+ public List getRows() {
+ return rows;
+ }
+
+ public void setRows(List rows) {
+ this.rows = rows;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public void setTotal(int total) {
+ this.total = total;
+ }
+
+ public static class RowsModel {
+ private String approvalStatus;
+ private String approvalStatusName;
+ private String createTime;
+ private String createUserId;
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String id;
+ private int isDel;
+ private String planName;
+ private String planNo;
+ private String processId;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private String trainStaffList;
+ private String trainTime;
+ private String updateTime;
+
+ public String getApprovalStatus() {
+ return approvalStatus;
+ }
+
+ public void setApprovalStatus(String approvalStatus) {
+ this.approvalStatus = approvalStatus;
+ }
+
+ public String getApprovalStatusName() {
+ return approvalStatusName;
+ }
+
+ public void setApprovalStatusName(String approvalStatusName) {
+ this.approvalStatusName = approvalStatusName;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public int getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(int isDel) {
+ this.isDel = isDel;
+ }
+
+ 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 getProcessId() {
+ return processId;
+ }
+
+ public void setProcessId(String processId) {
+ this.processId = processId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public String getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(String trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
index c7a99a0..443d6dd 100644
--- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
@@ -12,7 +12,8 @@
val USER_PERMISSIONS = arrayOf(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE,
- Manifest.permission.WRITE_EXTERNAL_STORAGE
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.CAMERA
)
val HOME_FUNC_OPERATE = arrayOf(
"仪器设备", "标准装置", "证书报告", "委托需求", "访客", "标准规范", "能力列表", "计量培训",
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 75f6c2b..3b8cb14 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
@@ -95,4 +95,24 @@
@Header("token") token: String,
@Body requestBody: RequestBody
): String
+
+ /**
+ * 获取培训计划列表
+ */
+ @POST("/meter/train/plan/listPage")
+ suspend fun getMeterageTrainList(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody,
+ @QueryMap limit: Map,
+ @QueryMap offset: Map
+ ): String
+
+ /**
+ * 获取培训计划详情
+ */
+ @POST("/meter/train/plan/detail")
+ suspend fun getMeterageTrainDetail(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
}
\ No newline at end of file
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 27e91ca..3f7d42f 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
@@ -233,4 +233,59 @@
)
return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody)
}
+
+ /**
+ * 获取培训计划列表
+ */
+ suspend fun getMeterageTrainList(
+ createStartTime: String,
+ createEndTime: String,
+ deptId: String,
+ director: String,
+ effectiveCompany: String,
+ trainStartTime: String,
+ trainEndTime: String,
+ formId: String,
+ ids: Array,
+ offset: Int
+ ): String {
+ val paramObject = JSONObject()
+ paramObject.put("createStartTime", createStartTime)
+ paramObject.put("createEndTime", createEndTime)
+ paramObject.put("deptId", deptId)
+ paramObject.put("director", director)
+ paramObject.put("effectiveCompany", effectiveCompany)
+ paramObject.put("trainStartTime", trainStartTime)
+ paramObject.put("trainEndTime", trainEndTime)
+ paramObject.put("formId", formId)
+
+ val jsonArray = JSONArray()
+ ids.forEach {
+ jsonArray.put(it)
+ }
+ paramObject.put("ids", jsonArray)
+
+ val requestBody = paramObject.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ val limitMap = HashMap()
+ limitMap["limit"] = LocaleConstant.PAGE_LIMIT
+
+ val offsetMap = HashMap()
+ offsetMap["offset"] = offset
+ return api.getMeterageTrainList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap)
+ }
+
+ /**
+ * 获取培训计划详情
+ */
+ suspend fun getMeterageTrainDetail(id: String): String {
+ val paramObject = JSONObject()
+ paramObject.put("id", id)
+ val requestBody = paramObject.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.getMeterageTrainDetail(AuthenticationHelper.token!!, requestBody)
+ }
}
\ No newline at end of file
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
new file mode 100644
index 0000000..0f45e25
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt
@@ -0,0 +1,149 @@
+package com.casic.xz.meterage.view.home
+
+import android.os.Handler
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.adapter.MeterageTrainListAdapter
+import com.casic.xz.meterage.extensions.initLayoutImmersionBar
+import com.casic.xz.meterage.extensions.showEmptyPage
+import com.casic.xz.meterage.model.MeterageTrainListModel
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.view.search.SearchMeterageTrainActivity
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.activity_meterage_train.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import kotlinx.android.synthetic.main.include_search_title.*
+
+class MeterageTrainActivity : KotlinBaseActivity() {
+
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+ private lateinit var meterageTrainListAdapter: MeterageTrainListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initData() {
+ weakReferenceHandler = WeakReferenceHandler(callback)
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.meterageTrainResult.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows!!
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows
+ trainLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows.size == 0) {
+ "到底了,别拉了".show(this)
+ }
+ dataBeans.addAll(dataRows)
+ trainLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2023021001)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+ rightOperateView.setOnClickListener {
+ navigatePageTo()
+ }
+
+ trainLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+
+ trainLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ getMeterageTrainList()
+ }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_meterage_train
+
+ override fun onResume() {
+ super.onResume()
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ private fun getMeterageTrainList() {
+ meterageTrainViewModel.getMeterageTrainList(
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "jlglpxjhsp",
+ arrayOf(),
+ pageIndex
+ )
+ }
+
+ private val callback = Handler.Callback {
+ when (it.what) {
+ 2023021001 -> {
+ if (isRefresh || isLoadMore) {
+ meterageTrainListAdapter.notifyDataSetChanged()
+ } else {
+ if (dataBeans.size == 0) {
+ emptyView!!.showEmptyPage("无培训计划") {
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+ } else {
+ emptyView!!.hide()
+ meterageTrainListAdapter = MeterageTrainListAdapter(this, dataBeans)
+ trainRecyclerView.adapter = meterageTrainListAdapter
+ meterageTrainListAdapter.setOnItemClickListener(object :
+ MeterageTrainListAdapter.OnItemClickListener {
+ override fun onItemClicked(position: Int) {
+ val rowsModel = dataBeans[position]
+ navigatePageTo(rowsModel.id)
+ }
+ })
+ }
+ }
+ }
+ }
+ true
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
+ titleView.text = "计量培训"
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..441379d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.xz.meterage.view.home
+
+import androidx.fragment.app.Fragment
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.adapter.SubViewPagerAdapter
+import com.casic.xz.meterage.extensions.initLayoutImmersionBar
+import com.casic.xz.meterage.fragment.train.BasicInformationFragment
+import com.casic.xz.meterage.fragment.train.StudentsFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.utils.Constant
+import kotlinx.android.synthetic.main.activity_meterage_train_detail.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MeterageTrainDetailActivity : KotlinBaseActivity() {
+
+ private var fragmentPages: ArrayList = ArrayList()
+
+ override fun initData() {
+ val trainId = intent.getStringExtra(Constant.INTENT_PARAM)!!
+
+ fragmentPages.add(BasicInformationFragment(trainId))
+ fragmentPages.add(StudentsFragment())
+
+ val devicePageTitles = arrayOf("基础信息", "培训学员")
+ trainViewPager.adapter = SubViewPagerAdapter(
+ supportFragmentManager, fragmentPages, devicePageTitles
+ )
+ trainViewPager.offscreenPageLimit = fragmentPages.size
+ //绑定
+ topTabLayout.setupWithViewPager(trainViewPager)
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_meterage_train_detail
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
+ titleView.text = "计量培训"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8eb4755
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.xz.meterage.fragment.train
+
+import com.casic.xz.meterage.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class StudentsFragment : KotlinBaseFragment() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_students
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ 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
new file mode 100644
index 0000000..56fc20d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java
@@ -0,0 +1,274 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainDetailModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String planName;
+ private String planNo;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private List trainStaffList;
+ private String trainTime;
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ 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;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public List getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(List trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public static class TrainStaffListModel {
+ private String company;
+ private String createTime;
+ private String examResult;
+ private String id;
+ private String isDel;
+ private String name;
+ private String planId;
+ private String remark;
+ private String signTime;
+ private String staffId;
+ private String technologyJob;
+ private String updateTime;
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getExamResult() {
+ return examResult;
+ }
+
+ public void setExamResult(String examResult) {
+ this.examResult = examResult;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(String isDel) {
+ this.isDel = isDel;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPlanId() {
+ return planId;
+ }
+
+ public void setPlanId(String planId) {
+ this.planId = planId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getSignTime() {
+ return signTime;
+ }
+
+ public void setSignTime(String signTime) {
+ this.signTime = signTime;
+ }
+
+ public String getStaffId() {
+ return staffId;
+ }
+
+ public void setStaffId(String staffId) {
+ this.staffId = staffId;
+ }
+
+ public String getTechnologyJob() {
+ return technologyJob;
+ }
+
+ public void setTechnologyJob(String technologyJob) {
+ this.technologyJob = technologyJob;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
new file mode 100644
index 0000000..a99d1d0
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
@@ -0,0 +1,256 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainListModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private List rows;
+ private int total;
+
+ public List getRows() {
+ return rows;
+ }
+
+ public void setRows(List rows) {
+ this.rows = rows;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public void setTotal(int total) {
+ this.total = total;
+ }
+
+ public static class RowsModel {
+ private String approvalStatus;
+ private String approvalStatusName;
+ private String createTime;
+ private String createUserId;
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String id;
+ private int isDel;
+ private String planName;
+ private String planNo;
+ private String processId;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private String trainStaffList;
+ private String trainTime;
+ private String updateTime;
+
+ public String getApprovalStatus() {
+ return approvalStatus;
+ }
+
+ public void setApprovalStatus(String approvalStatus) {
+ this.approvalStatus = approvalStatus;
+ }
+
+ public String getApprovalStatusName() {
+ return approvalStatusName;
+ }
+
+ public void setApprovalStatusName(String approvalStatusName) {
+ this.approvalStatusName = approvalStatusName;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public int getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(int isDel) {
+ this.isDel = isDel;
+ }
+
+ 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 getProcessId() {
+ return processId;
+ }
+
+ public void setProcessId(String processId) {
+ this.processId = processId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public String getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(String trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
index c7a99a0..443d6dd 100644
--- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
@@ -12,7 +12,8 @@
val USER_PERMISSIONS = arrayOf(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE,
- Manifest.permission.WRITE_EXTERNAL_STORAGE
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.CAMERA
)
val HOME_FUNC_OPERATE = arrayOf(
"仪器设备", "标准装置", "证书报告", "委托需求", "访客", "标准规范", "能力列表", "计量培训",
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 75f6c2b..3b8cb14 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
@@ -95,4 +95,24 @@
@Header("token") token: String,
@Body requestBody: RequestBody
): String
+
+ /**
+ * 获取培训计划列表
+ */
+ @POST("/meter/train/plan/listPage")
+ suspend fun getMeterageTrainList(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody,
+ @QueryMap limit: Map,
+ @QueryMap offset: Map
+ ): String
+
+ /**
+ * 获取培训计划详情
+ */
+ @POST("/meter/train/plan/detail")
+ suspend fun getMeterageTrainDetail(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
}
\ No newline at end of file
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 27e91ca..3f7d42f 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
@@ -233,4 +233,59 @@
)
return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody)
}
+
+ /**
+ * 获取培训计划列表
+ */
+ suspend fun getMeterageTrainList(
+ createStartTime: String,
+ createEndTime: String,
+ deptId: String,
+ director: String,
+ effectiveCompany: String,
+ trainStartTime: String,
+ trainEndTime: String,
+ formId: String,
+ ids: Array,
+ offset: Int
+ ): String {
+ val paramObject = JSONObject()
+ paramObject.put("createStartTime", createStartTime)
+ paramObject.put("createEndTime", createEndTime)
+ paramObject.put("deptId", deptId)
+ paramObject.put("director", director)
+ paramObject.put("effectiveCompany", effectiveCompany)
+ paramObject.put("trainStartTime", trainStartTime)
+ paramObject.put("trainEndTime", trainEndTime)
+ paramObject.put("formId", formId)
+
+ val jsonArray = JSONArray()
+ ids.forEach {
+ jsonArray.put(it)
+ }
+ paramObject.put("ids", jsonArray)
+
+ val requestBody = paramObject.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ val limitMap = HashMap()
+ limitMap["limit"] = LocaleConstant.PAGE_LIMIT
+
+ val offsetMap = HashMap()
+ offsetMap["offset"] = offset
+ return api.getMeterageTrainList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap)
+ }
+
+ /**
+ * 获取培训计划详情
+ */
+ suspend fun getMeterageTrainDetail(id: String): String {
+ val paramObject = JSONObject()
+ paramObject.put("id", id)
+ val requestBody = paramObject.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.getMeterageTrainDetail(AuthenticationHelper.token!!, requestBody)
+ }
}
\ No newline at end of file
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
new file mode 100644
index 0000000..0f45e25
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt
@@ -0,0 +1,149 @@
+package com.casic.xz.meterage.view.home
+
+import android.os.Handler
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.adapter.MeterageTrainListAdapter
+import com.casic.xz.meterage.extensions.initLayoutImmersionBar
+import com.casic.xz.meterage.extensions.showEmptyPage
+import com.casic.xz.meterage.model.MeterageTrainListModel
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.view.search.SearchMeterageTrainActivity
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.activity_meterage_train.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import kotlinx.android.synthetic.main.include_search_title.*
+
+class MeterageTrainActivity : KotlinBaseActivity() {
+
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+ private lateinit var meterageTrainListAdapter: MeterageTrainListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initData() {
+ weakReferenceHandler = WeakReferenceHandler(callback)
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.meterageTrainResult.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows!!
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows
+ trainLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows.size == 0) {
+ "到底了,别拉了".show(this)
+ }
+ dataBeans.addAll(dataRows)
+ trainLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2023021001)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+ rightOperateView.setOnClickListener {
+ navigatePageTo()
+ }
+
+ trainLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+
+ trainLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ getMeterageTrainList()
+ }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_meterage_train
+
+ override fun onResume() {
+ super.onResume()
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ private fun getMeterageTrainList() {
+ meterageTrainViewModel.getMeterageTrainList(
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "jlglpxjhsp",
+ arrayOf(),
+ pageIndex
+ )
+ }
+
+ private val callback = Handler.Callback {
+ when (it.what) {
+ 2023021001 -> {
+ if (isRefresh || isLoadMore) {
+ meterageTrainListAdapter.notifyDataSetChanged()
+ } else {
+ if (dataBeans.size == 0) {
+ emptyView!!.showEmptyPage("无培训计划") {
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+ } else {
+ emptyView!!.hide()
+ meterageTrainListAdapter = MeterageTrainListAdapter(this, dataBeans)
+ trainRecyclerView.adapter = meterageTrainListAdapter
+ meterageTrainListAdapter.setOnItemClickListener(object :
+ MeterageTrainListAdapter.OnItemClickListener {
+ override fun onItemClicked(position: Int) {
+ val rowsModel = dataBeans[position]
+ navigatePageTo(rowsModel.id)
+ }
+ })
+ }
+ }
+ }
+ }
+ true
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
+ titleView.text = "计量培训"
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..441379d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.xz.meterage.view.home
+
+import androidx.fragment.app.Fragment
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.adapter.SubViewPagerAdapter
+import com.casic.xz.meterage.extensions.initLayoutImmersionBar
+import com.casic.xz.meterage.fragment.train.BasicInformationFragment
+import com.casic.xz.meterage.fragment.train.StudentsFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.utils.Constant
+import kotlinx.android.synthetic.main.activity_meterage_train_detail.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MeterageTrainDetailActivity : KotlinBaseActivity() {
+
+ private var fragmentPages: ArrayList = ArrayList()
+
+ override fun initData() {
+ val trainId = intent.getStringExtra(Constant.INTENT_PARAM)!!
+
+ fragmentPages.add(BasicInformationFragment(trainId))
+ fragmentPages.add(StudentsFragment())
+
+ val devicePageTitles = arrayOf("基础信息", "培训学员")
+ trainViewPager.adapter = SubViewPagerAdapter(
+ supportFragmentManager, fragmentPages, devicePageTitles
+ )
+ trainViewPager.offscreenPageLimit = fragmentPages.size
+ //绑定
+ topTabLayout.setupWithViewPager(trainViewPager)
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_meterage_train_detail
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
+ titleView.text = "计量培训"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt
index 9242993..e5cd6be 100644
--- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt
+++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt
@@ -6,6 +6,7 @@
import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.activity_search_capability.*
+import kotlinx.android.synthetic.main.include_search_input_title.*
/**
* 搜索能力
@@ -32,6 +33,7 @@
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
initLayoutImmersionBar(rootView)
+ inputView.hint = "查询价格名称、编号"
}
override fun onResume() {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8eb4755
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.xz.meterage.fragment.train
+
+import com.casic.xz.meterage.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class StudentsFragment : KotlinBaseFragment() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_students
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ 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
new file mode 100644
index 0000000..56fc20d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java
@@ -0,0 +1,274 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainDetailModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String planName;
+ private String planNo;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private List trainStaffList;
+ private String trainTime;
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ 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;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public List getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(List trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public static class TrainStaffListModel {
+ private String company;
+ private String createTime;
+ private String examResult;
+ private String id;
+ private String isDel;
+ private String name;
+ private String planId;
+ private String remark;
+ private String signTime;
+ private String staffId;
+ private String technologyJob;
+ private String updateTime;
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getExamResult() {
+ return examResult;
+ }
+
+ public void setExamResult(String examResult) {
+ this.examResult = examResult;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(String isDel) {
+ this.isDel = isDel;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPlanId() {
+ return planId;
+ }
+
+ public void setPlanId(String planId) {
+ this.planId = planId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getSignTime() {
+ return signTime;
+ }
+
+ public void setSignTime(String signTime) {
+ this.signTime = signTime;
+ }
+
+ public String getStaffId() {
+ return staffId;
+ }
+
+ public void setStaffId(String staffId) {
+ this.staffId = staffId;
+ }
+
+ public String getTechnologyJob() {
+ return technologyJob;
+ }
+
+ public void setTechnologyJob(String technologyJob) {
+ this.technologyJob = technologyJob;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
new file mode 100644
index 0000000..a99d1d0
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
@@ -0,0 +1,256 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainListModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private List rows;
+ private int total;
+
+ public List getRows() {
+ return rows;
+ }
+
+ public void setRows(List rows) {
+ this.rows = rows;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public void setTotal(int total) {
+ this.total = total;
+ }
+
+ public static class RowsModel {
+ private String approvalStatus;
+ private String approvalStatusName;
+ private String createTime;
+ private String createUserId;
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String id;
+ private int isDel;
+ private String planName;
+ private String planNo;
+ private String processId;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private String trainStaffList;
+ private String trainTime;
+ private String updateTime;
+
+ public String getApprovalStatus() {
+ return approvalStatus;
+ }
+
+ public void setApprovalStatus(String approvalStatus) {
+ this.approvalStatus = approvalStatus;
+ }
+
+ public String getApprovalStatusName() {
+ return approvalStatusName;
+ }
+
+ public void setApprovalStatusName(String approvalStatusName) {
+ this.approvalStatusName = approvalStatusName;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public int getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(int isDel) {
+ this.isDel = isDel;
+ }
+
+ 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 getProcessId() {
+ return processId;
+ }
+
+ public void setProcessId(String processId) {
+ this.processId = processId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public String getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(String trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
index c7a99a0..443d6dd 100644
--- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
@@ -12,7 +12,8 @@
val USER_PERMISSIONS = arrayOf(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE,
- Manifest.permission.WRITE_EXTERNAL_STORAGE
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.CAMERA
)
val HOME_FUNC_OPERATE = arrayOf(
"仪器设备", "标准装置", "证书报告", "委托需求", "访客", "标准规范", "能力列表", "计量培训",
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 75f6c2b..3b8cb14 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
@@ -95,4 +95,24 @@
@Header("token") token: String,
@Body requestBody: RequestBody
): String
+
+ /**
+ * 获取培训计划列表
+ */
+ @POST("/meter/train/plan/listPage")
+ suspend fun getMeterageTrainList(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody,
+ @QueryMap limit: Map,
+ @QueryMap offset: Map
+ ): String
+
+ /**
+ * 获取培训计划详情
+ */
+ @POST("/meter/train/plan/detail")
+ suspend fun getMeterageTrainDetail(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
}
\ No newline at end of file
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 27e91ca..3f7d42f 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
@@ -233,4 +233,59 @@
)
return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody)
}
+
+ /**
+ * 获取培训计划列表
+ */
+ suspend fun getMeterageTrainList(
+ createStartTime: String,
+ createEndTime: String,
+ deptId: String,
+ director: String,
+ effectiveCompany: String,
+ trainStartTime: String,
+ trainEndTime: String,
+ formId: String,
+ ids: Array,
+ offset: Int
+ ): String {
+ val paramObject = JSONObject()
+ paramObject.put("createStartTime", createStartTime)
+ paramObject.put("createEndTime", createEndTime)
+ paramObject.put("deptId", deptId)
+ paramObject.put("director", director)
+ paramObject.put("effectiveCompany", effectiveCompany)
+ paramObject.put("trainStartTime", trainStartTime)
+ paramObject.put("trainEndTime", trainEndTime)
+ paramObject.put("formId", formId)
+
+ val jsonArray = JSONArray()
+ ids.forEach {
+ jsonArray.put(it)
+ }
+ paramObject.put("ids", jsonArray)
+
+ val requestBody = paramObject.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ val limitMap = HashMap()
+ limitMap["limit"] = LocaleConstant.PAGE_LIMIT
+
+ val offsetMap = HashMap()
+ offsetMap["offset"] = offset
+ return api.getMeterageTrainList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap)
+ }
+
+ /**
+ * 获取培训计划详情
+ */
+ suspend fun getMeterageTrainDetail(id: String): String {
+ val paramObject = JSONObject()
+ paramObject.put("id", id)
+ val requestBody = paramObject.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.getMeterageTrainDetail(AuthenticationHelper.token!!, requestBody)
+ }
}
\ No newline at end of file
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
new file mode 100644
index 0000000..0f45e25
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt
@@ -0,0 +1,149 @@
+package com.casic.xz.meterage.view.home
+
+import android.os.Handler
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.adapter.MeterageTrainListAdapter
+import com.casic.xz.meterage.extensions.initLayoutImmersionBar
+import com.casic.xz.meterage.extensions.showEmptyPage
+import com.casic.xz.meterage.model.MeterageTrainListModel
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.view.search.SearchMeterageTrainActivity
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.activity_meterage_train.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import kotlinx.android.synthetic.main.include_search_title.*
+
+class MeterageTrainActivity : KotlinBaseActivity() {
+
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+ private lateinit var meterageTrainListAdapter: MeterageTrainListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initData() {
+ weakReferenceHandler = WeakReferenceHandler(callback)
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.meterageTrainResult.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows!!
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows
+ trainLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows.size == 0) {
+ "到底了,别拉了".show(this)
+ }
+ dataBeans.addAll(dataRows)
+ trainLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2023021001)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+ rightOperateView.setOnClickListener {
+ navigatePageTo()
+ }
+
+ trainLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+
+ trainLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ getMeterageTrainList()
+ }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_meterage_train
+
+ override fun onResume() {
+ super.onResume()
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ private fun getMeterageTrainList() {
+ meterageTrainViewModel.getMeterageTrainList(
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "jlglpxjhsp",
+ arrayOf(),
+ pageIndex
+ )
+ }
+
+ private val callback = Handler.Callback {
+ when (it.what) {
+ 2023021001 -> {
+ if (isRefresh || isLoadMore) {
+ meterageTrainListAdapter.notifyDataSetChanged()
+ } else {
+ if (dataBeans.size == 0) {
+ emptyView!!.showEmptyPage("无培训计划") {
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+ } else {
+ emptyView!!.hide()
+ meterageTrainListAdapter = MeterageTrainListAdapter(this, dataBeans)
+ trainRecyclerView.adapter = meterageTrainListAdapter
+ meterageTrainListAdapter.setOnItemClickListener(object :
+ MeterageTrainListAdapter.OnItemClickListener {
+ override fun onItemClicked(position: Int) {
+ val rowsModel = dataBeans[position]
+ navigatePageTo(rowsModel.id)
+ }
+ })
+ }
+ }
+ }
+ }
+ true
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
+ titleView.text = "计量培训"
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..441379d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.xz.meterage.view.home
+
+import androidx.fragment.app.Fragment
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.adapter.SubViewPagerAdapter
+import com.casic.xz.meterage.extensions.initLayoutImmersionBar
+import com.casic.xz.meterage.fragment.train.BasicInformationFragment
+import com.casic.xz.meterage.fragment.train.StudentsFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.utils.Constant
+import kotlinx.android.synthetic.main.activity_meterage_train_detail.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MeterageTrainDetailActivity : KotlinBaseActivity() {
+
+ private var fragmentPages: ArrayList = ArrayList()
+
+ override fun initData() {
+ val trainId = intent.getStringExtra(Constant.INTENT_PARAM)!!
+
+ fragmentPages.add(BasicInformationFragment(trainId))
+ fragmentPages.add(StudentsFragment())
+
+ val devicePageTitles = arrayOf("基础信息", "培训学员")
+ trainViewPager.adapter = SubViewPagerAdapter(
+ supportFragmentManager, fragmentPages, devicePageTitles
+ )
+ trainViewPager.offscreenPageLimit = fragmentPages.size
+ //绑定
+ topTabLayout.setupWithViewPager(trainViewPager)
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_meterage_train_detail
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
+ titleView.text = "计量培训"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt
index 9242993..e5cd6be 100644
--- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt
+++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt
@@ -6,6 +6,7 @@
import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.activity_search_capability.*
+import kotlinx.android.synthetic.main.include_search_input_title.*
/**
* 搜索能力
@@ -32,6 +33,7 @@
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
initLayoutImmersionBar(rootView)
+ inputView.hint = "查询价格名称、编号"
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt
index e645c7c..f5c98d6 100644
--- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt
+++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt
@@ -6,6 +6,7 @@
import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.activity_search_equipment.*
+import kotlinx.android.synthetic.main.include_search_input_title.*
/**
* 搜索仪器设备
@@ -32,6 +33,7 @@
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
initLayoutImmersionBar(rootView)
+ inputView.hint = "查询设备名称、编号"
}
override fun onResume() {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8eb4755
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.xz.meterage.fragment.train
+
+import com.casic.xz.meterage.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class StudentsFragment : KotlinBaseFragment() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_students
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ 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
new file mode 100644
index 0000000..56fc20d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java
@@ -0,0 +1,274 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainDetailModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String planName;
+ private String planNo;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private List trainStaffList;
+ private String trainTime;
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ 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;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public List getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(List trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public static class TrainStaffListModel {
+ private String company;
+ private String createTime;
+ private String examResult;
+ private String id;
+ private String isDel;
+ private String name;
+ private String planId;
+ private String remark;
+ private String signTime;
+ private String staffId;
+ private String technologyJob;
+ private String updateTime;
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getExamResult() {
+ return examResult;
+ }
+
+ public void setExamResult(String examResult) {
+ this.examResult = examResult;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(String isDel) {
+ this.isDel = isDel;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPlanId() {
+ return planId;
+ }
+
+ public void setPlanId(String planId) {
+ this.planId = planId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getSignTime() {
+ return signTime;
+ }
+
+ public void setSignTime(String signTime) {
+ this.signTime = signTime;
+ }
+
+ public String getStaffId() {
+ return staffId;
+ }
+
+ public void setStaffId(String staffId) {
+ this.staffId = staffId;
+ }
+
+ public String getTechnologyJob() {
+ return technologyJob;
+ }
+
+ public void setTechnologyJob(String technologyJob) {
+ this.technologyJob = technologyJob;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
new file mode 100644
index 0000000..a99d1d0
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainListModel.java
@@ -0,0 +1,256 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainListModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private List rows;
+ private int total;
+
+ public List getRows() {
+ return rows;
+ }
+
+ public void setRows(List rows) {
+ this.rows = rows;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public void setTotal(int total) {
+ this.total = total;
+ }
+
+ public static class RowsModel {
+ private String approvalStatus;
+ private String approvalStatusName;
+ private String createTime;
+ private String createUserId;
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String id;
+ private int isDel;
+ private String planName;
+ private String planNo;
+ private String processId;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private String trainStaffList;
+ private String trainTime;
+ private String updateTime;
+
+ public String getApprovalStatus() {
+ return approvalStatus;
+ }
+
+ public void setApprovalStatus(String approvalStatus) {
+ this.approvalStatus = approvalStatus;
+ }
+
+ public String getApprovalStatusName() {
+ return approvalStatusName;
+ }
+
+ public void setApprovalStatusName(String approvalStatusName) {
+ this.approvalStatusName = approvalStatusName;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public int getIsDel() {
+ return isDel;
+ }
+
+ public void setIsDel(int isDel) {
+ this.isDel = isDel;
+ }
+
+ 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 getProcessId() {
+ return processId;
+ }
+
+ public void setProcessId(String processId) {
+ this.processId = processId;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public String getTrainStaffList() {
+ return trainStaffList;
+ }
+
+ public void setTrainStaffList(String trainStaffList) {
+ this.trainStaffList = trainStaffList;
+ }
+
+ public String getTrainTime() {
+ return trainTime;
+ }
+
+ public void setTrainTime(String trainTime) {
+ this.trainTime = trainTime;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
index c7a99a0..443d6dd 100644
--- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt
@@ -12,7 +12,8 @@
val USER_PERMISSIONS = arrayOf(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE,
- Manifest.permission.WRITE_EXTERNAL_STORAGE
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.CAMERA
)
val HOME_FUNC_OPERATE = arrayOf(
"仪器设备", "标准装置", "证书报告", "委托需求", "访客", "标准规范", "能力列表", "计量培训",
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 75f6c2b..3b8cb14 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
@@ -95,4 +95,24 @@
@Header("token") token: String,
@Body requestBody: RequestBody
): String
+
+ /**
+ * 获取培训计划列表
+ */
+ @POST("/meter/train/plan/listPage")
+ suspend fun getMeterageTrainList(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody,
+ @QueryMap limit: Map,
+ @QueryMap offset: Map
+ ): String
+
+ /**
+ * 获取培训计划详情
+ */
+ @POST("/meter/train/plan/detail")
+ suspend fun getMeterageTrainDetail(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
}
\ No newline at end of file
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 27e91ca..3f7d42f 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
@@ -233,4 +233,59 @@
)
return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody)
}
+
+ /**
+ * 获取培训计划列表
+ */
+ suspend fun getMeterageTrainList(
+ createStartTime: String,
+ createEndTime: String,
+ deptId: String,
+ director: String,
+ effectiveCompany: String,
+ trainStartTime: String,
+ trainEndTime: String,
+ formId: String,
+ ids: Array,
+ offset: Int
+ ): String {
+ val paramObject = JSONObject()
+ paramObject.put("createStartTime", createStartTime)
+ paramObject.put("createEndTime", createEndTime)
+ paramObject.put("deptId", deptId)
+ paramObject.put("director", director)
+ paramObject.put("effectiveCompany", effectiveCompany)
+ paramObject.put("trainStartTime", trainStartTime)
+ paramObject.put("trainEndTime", trainEndTime)
+ paramObject.put("formId", formId)
+
+ val jsonArray = JSONArray()
+ ids.forEach {
+ jsonArray.put(it)
+ }
+ paramObject.put("ids", jsonArray)
+
+ val requestBody = paramObject.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ val limitMap = HashMap()
+ limitMap["limit"] = LocaleConstant.PAGE_LIMIT
+
+ val offsetMap = HashMap()
+ offsetMap["offset"] = offset
+ return api.getMeterageTrainList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap)
+ }
+
+ /**
+ * 获取培训计划详情
+ */
+ suspend fun getMeterageTrainDetail(id: String): String {
+ val paramObject = JSONObject()
+ paramObject.put("id", id)
+ val requestBody = paramObject.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.getMeterageTrainDetail(AuthenticationHelper.token!!, requestBody)
+ }
}
\ No newline at end of file
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
new file mode 100644
index 0000000..0f45e25
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainActivity.kt
@@ -0,0 +1,149 @@
+package com.casic.xz.meterage.view.home
+
+import android.os.Handler
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.adapter.MeterageTrainListAdapter
+import com.casic.xz.meterage.extensions.initLayoutImmersionBar
+import com.casic.xz.meterage.extensions.showEmptyPage
+import com.casic.xz.meterage.model.MeterageTrainListModel
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.view.search.SearchMeterageTrainActivity
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.activity_meterage_train.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import kotlinx.android.synthetic.main.include_search_title.*
+
+class MeterageTrainActivity : KotlinBaseActivity() {
+
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+ private lateinit var meterageTrainListAdapter: MeterageTrainListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initData() {
+ weakReferenceHandler = WeakReferenceHandler(callback)
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.meterageTrainResult.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows!!
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows
+ trainLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows.size == 0) {
+ "到底了,别拉了".show(this)
+ }
+ dataBeans.addAll(dataRows)
+ trainLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2023021001)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+ rightOperateView.setOnClickListener {
+ navigatePageTo()
+ }
+
+ trainLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+
+ trainLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ getMeterageTrainList()
+ }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_meterage_train
+
+ override fun onResume() {
+ super.onResume()
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ private fun getMeterageTrainList() {
+ meterageTrainViewModel.getMeterageTrainList(
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "jlglpxjhsp",
+ arrayOf(),
+ pageIndex
+ )
+ }
+
+ private val callback = Handler.Callback {
+ when (it.what) {
+ 2023021001 -> {
+ if (isRefresh || isLoadMore) {
+ meterageTrainListAdapter.notifyDataSetChanged()
+ } else {
+ if (dataBeans.size == 0) {
+ emptyView!!.showEmptyPage("无培训计划") {
+ pageIndex = 1
+ getMeterageTrainList()
+ }
+ } else {
+ emptyView!!.hide()
+ meterageTrainListAdapter = MeterageTrainListAdapter(this, dataBeans)
+ trainRecyclerView.adapter = meterageTrainListAdapter
+ meterageTrainListAdapter.setOnItemClickListener(object :
+ MeterageTrainListAdapter.OnItemClickListener {
+ override fun onItemClicked(position: Int) {
+ val rowsModel = dataBeans[position]
+ navigatePageTo(rowsModel.id)
+ }
+ })
+ }
+ }
+ }
+ }
+ true
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
+ titleView.text = "计量培训"
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..441379d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/view/home/MeterageTrainDetailActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.xz.meterage.view.home
+
+import androidx.fragment.app.Fragment
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.adapter.SubViewPagerAdapter
+import com.casic.xz.meterage.extensions.initLayoutImmersionBar
+import com.casic.xz.meterage.fragment.train.BasicInformationFragment
+import com.casic.xz.meterage.fragment.train.StudentsFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.utils.Constant
+import kotlinx.android.synthetic.main.activity_meterage_train_detail.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MeterageTrainDetailActivity : KotlinBaseActivity() {
+
+ private var fragmentPages: ArrayList = ArrayList()
+
+ override fun initData() {
+ val trainId = intent.getStringExtra(Constant.INTENT_PARAM)!!
+
+ fragmentPages.add(BasicInformationFragment(trainId))
+ fragmentPages.add(StudentsFragment())
+
+ val devicePageTitles = arrayOf("基础信息", "培训学员")
+ trainViewPager.adapter = SubViewPagerAdapter(
+ supportFragmentManager, fragmentPages, devicePageTitles
+ )
+ trainViewPager.offscreenPageLimit = fragmentPages.size
+ //绑定
+ topTabLayout.setupWithViewPager(trainViewPager)
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_meterage_train_detail
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
+ titleView.text = "计量培训"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt
index 9242993..e5cd6be 100644
--- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt
+++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt
@@ -6,6 +6,7 @@
import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.activity_search_capability.*
+import kotlinx.android.synthetic.main.include_search_input_title.*
/**
* 搜索能力
@@ -32,6 +33,7 @@
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
initLayoutImmersionBar(rootView)
+ inputView.hint = "查询价格名称、编号"
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt
index e645c7c..f5c98d6 100644
--- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt
+++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt
@@ -6,6 +6,7 @@
import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.activity_search_equipment.*
+import kotlinx.android.synthetic.main.include_search_input_title.*
/**
* 搜索仪器设备
@@ -32,6 +33,7 @@
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
initLayoutImmersionBar(rootView)
+ inputView.hint = "查询设备名称、编号"
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainActivity.kt
new file mode 100644
index 0000000..d58c9eb
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainActivity.kt
@@ -0,0 +1,43 @@
+package com.casic.xz.meterage.view.search
+
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.extensions.initLayoutImmersionBar
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_search_meterage_train.*
+import kotlinx.android.synthetic.main.include_search_input_title.*
+
+/**
+ * 搜索计量培训
+ * */
+class SearchMeterageTrainActivity : KotlinBaseActivity() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+ searchTextView.setOnClickListener {
+ navigatePageTo(inputView.text.toString())
+ }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_search_meterage_train
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
+ inputView.hint = "查询培训名称、编号"
+ }
+
+ override fun onResume() {
+ super.onResume()
+ //TODO 流式布局显示查询记录Tag?
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78b3de2..61bd7aa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,9 +9,12 @@
+
+
+
+
+
+
+
+) : RecyclerView.Adapter() {
+
+ private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
+
+ override fun getItemCount(): Int = dataRows.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder(
+ layoutInflater.inflate(R.layout.item_meterage_train_rv_l, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ //绑定数据
+ val rowsBean = dataRows[position]
+ holder.trainTitleView.text = rowsBean.planName
+ //根据创建时间和计划培训时间判断培训状态
+ when {
+ rowsBean.createTime.isEarlier(rowsBean.trainTime) -> {
+ holder.trainStateView.text = "未进行"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.BLUE)
+ }
+ rowsBean.trainTime.isLater() -> {
+ holder.trainStateView.text = "已结束"
+ holder.trainStateView.backgroundTintList = ColorStateList.valueOf(Color.GRAY)
+ }
+ else -> {
+ holder.trainStateView.text = "培训中"
+ holder.trainStateView.backgroundTintList =
+ ColorStateList.valueOf(R.color.green.convertColor(context))
+ }
+ }
+ holder.trainDescView.text = rowsBean.trainContent
+ holder.trainHourView.text = "${rowsBean.trainHour}课时"
+
+ val codeBitmap = QRUtils.getInstance().createQRCode(
+ rowsBean.processId, 100f.dp2px(context), 100f.dp2px(context)
+ )
+ holder.qrCodeView.setImageBitmap(codeBitmap)
+ holder.trainTimeView.text = rowsBean.trainTime
+ holder.speakerNameView.text = rowsBean.director
+
+ //绑定事件
+ holder.itemView.setOnClickListener {
+ listener?.onItemClicked(position)
+ }
+ }
+
+ inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ var trainTitleView: TextView = view.findViewById(R.id.trainTitleView)
+ var trainStateView: QMUIRoundButton = view.findViewById(R.id.trainStateView)
+ var trainDescView: TextView = view.findViewById(R.id.trainDescView)
+ var trainHourView: QMUIRoundButton = view.findViewById(R.id.trainHourView)
+ var qrCodeView: ImageView = view.findViewById(R.id.qrCodeView)
+ var trainTimeView: TextView = view.findViewById(R.id.trainTimeView)
+ var speakerNameView: TextView = view.findViewById(R.id.speakerNameView)
+ }
+
+ private var listener: OnItemClickListener? = null
+
+ interface OnItemClickListener {
+ fun onItemClicked(position: Int)
+ }
+
+ fun setOnItemClickListener(onClickListener: OnItemClickListener?) {
+ this.listener = onClickListener
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
index 2c48c06..492a239 100644
--- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
+++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt
@@ -20,6 +20,7 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.extensions.createCompressImageDir
+import com.pengxh.kt.lite.extensions.dateToTimestamp
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
@@ -128,6 +129,18 @@
return "$defaultValue/static/${this.replace("\\", "/")}"
}
+fun String.isEarlier(time: String): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = time.dateToTimestamp()
+ return (t2 - t1) > 0
+}
+
+fun String.isLater(): Boolean {
+ val t1 = this.dateToTimestamp()
+ val t2 = System.currentTimeMillis()
+ return (t2 - t1) > 0
+}
+
fun String.compressImage(context: Context, listener: OnImageCompressListener) {
Luban.with(context)
.load(this)
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 cdc9762..761da02 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
@@ -7,6 +7,7 @@
import com.casic.xz.meterage.utils.LocaleConstant
import com.casic.xz.meterage.view.home.CapabilityActivity
import com.casic.xz.meterage.view.home.EquipmentActivity
+import com.casic.xz.meterage.view.home.MeterageTrainActivity
import com.casic.xz.meterage.view.home.StandardDeviceActivity
import com.casic.xz.meterage.view.notice.NoticeListActivity
import com.casic.xz.meterage.vm.NoticeViewModel
@@ -47,7 +48,7 @@
// "访客" -> requireContext().navigatePageTo()
// "标准规范" -> requireContext().navigatePageTo()
"能力列表" -> requireContext().navigatePageTo()
-// "计量培训" -> requireContext().navigatePageTo()
+ "计量培训" -> requireContext().navigatePageTo()
// "合同发票" -> requireContext().navigatePageTo()
// "业务统计" -> requireContext().navigatePageTo()
// "客户列表" -> requireContext().navigatePageTo()
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
new file mode 100644
index 0000000..73f927c
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/BasicInformationFragment.kt
@@ -0,0 +1,56 @@
+package com.casic.xz.meterage.fragment.train
+
+import androidx.lifecycle.ViewModelProvider
+import com.casic.xz.meterage.R
+import com.casic.xz.meterage.utils.LoadingDialogHub
+import com.casic.xz.meterage.vm.MeterageTrainViewModel
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.vm.LoadState
+import kotlinx.android.synthetic.main.fragment_train_basic_information.*
+
+class BasicInformationFragment(private val id: String) : KotlinBaseFragment() {
+
+ private lateinit var meterageTrainViewModel: MeterageTrainViewModel
+
+ override fun initData() {
+ meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java]
+ meterageTrainViewModel.getMeterageTrainDetail(id)
+ meterageTrainViewModel.meterageTrainDetailResult.observe(this, {
+ if (it.code == 200) {
+ val data = it.data!!
+
+ planCodeView.text = data.planNo
+ planNameView.text = data.planName
+ traineeView.text = data.trainPerson
+ countView.text = data.trainNumber
+ timeView.text = data.trainTime
+ hoursView.text = data.trainHour
+ deptView.text = data.deptName
+ workUnitView.text = data.effectiveCompany
+ directorView.text = data.director
+ locationView.text = data.trainAddress
+ contentView.text = data.trainContent
+ remarkView.text = data.remark
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_basic_information
+
+ override fun observeRequestState() {
+ meterageTrainViewModel.loadState.observe(this, {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...")
+ else -> LoadingDialogHub.dismiss()
+ }
+ })
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8eb4755
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/fragment/train/StudentsFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.xz.meterage.fragment.train
+
+import com.casic.xz.meterage.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class StudentsFragment : KotlinBaseFragment() {
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_train_students
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ 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
new file mode 100644
index 0000000..56fc20d
--- /dev/null
+++ b/app/src/main/java/com/casic/xz/meterage/model/MeterageTrainDetailModel.java
@@ -0,0 +1,274 @@
+package com.casic.xz.meterage.model;
+
+import java.util.List;
+
+public class MeterageTrainDetailModel {
+
+ private int code;
+ private DataModel data;
+ private String message;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public DataModel getData() {
+ return data;
+ }
+
+ public void setData(DataModel data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public static class DataModel {
+ private String deptId;
+ private String deptName;
+ private String director;
+ private String effectiveCompany;
+ private String planName;
+ private String planNo;
+ private String remark;
+ private String trainAddress;
+ private String trainContent;
+ private String trainHour;
+ private String trainNumber;
+ private String trainPerson;
+ private List trainStaffList;
+ private String trainTime;
+
+ public String getDeptId() {
+ return deptId;
+ }
+
+ public void setDeptId(String deptId) {
+ this.deptId = deptId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getEffectiveCompany() {
+ return effectiveCompany;
+ }
+
+ public void setEffectiveCompany(String effectiveCompany) {
+ this.effectiveCompany = effectiveCompany;
+ }
+
+ 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;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTrainAddress() {
+ return trainAddress;
+ }
+
+ public void setTrainAddress(String trainAddress) {
+ this.trainAddress = trainAddress;
+ }
+
+ public String getTrainContent() {
+ return trainContent;
+ }
+
+ public void setTrainContent(String trainContent) {
+ this.trainContent = trainContent;
+ }
+
+ public String getTrainHour() {
+ return trainHour;
+ }
+
+ public void setTrainHour(String trainHour) {
+ this.trainHour = trainHour;
+ }
+
+ public String getTrainNumber() {
+ return trainNumber;
+ }
+
+ public void setTrainNumber(String trainNumber) {
+ this.trainNumber = trainNumber;
+ }
+
+ public String getTrainPerson() {
+ return trainPerson;
+ }
+
+ public void setTrainPerson(String trainPerson) {
+ this.trainPerson = trainPerson;
+ }
+
+ public List