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 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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ 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/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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ 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/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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + 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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + 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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_meterage_train.xml b/app/src/main/res/layout/activity_meterage_train.xml new file mode 100644 index 0000000..4420a96 --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ 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/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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_meterage_train.xml b/app/src/main/res/layout/activity_meterage_train.xml new file mode 100644 index 0000000..4420a96 --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_meterage_train_detail.xml b/app/src/main/res/layout/activity_meterage_train_detail.xml new file mode 100644 index 0000000..32af2ce --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train_detail.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ 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/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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_meterage_train.xml b/app/src/main/res/layout/activity_meterage_train.xml new file mode 100644 index 0000000..4420a96 --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_meterage_train_detail.xml b/app/src/main/res/layout/activity_meterage_train_detail.xml new file mode 100644 index 0000000..32af2ce --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train_detail.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability.xml b/app/src/main/res/layout/activity_search_capability.xml index 6ecd458..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_capability.xml +++ b/app/src/main/res/layout/activity_search_capability.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + + + + + + + + +) : 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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_meterage_train.xml b/app/src/main/res/layout/activity_meterage_train.xml new file mode 100644 index 0000000..4420a96 --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_meterage_train_detail.xml b/app/src/main/res/layout/activity_meterage_train_detail.xml new file mode 100644 index 0000000..32af2ce --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train_detail.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability.xml b/app/src/main/res/layout/activity_search_capability.xml index 6ecd458..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_capability.xml +++ b/app/src/main/res/layout/activity_search_capability.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + - - - - - - - - - - - - - + + + + + + + + +) : 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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_meterage_train.xml b/app/src/main/res/layout/activity_meterage_train.xml new file mode 100644 index 0000000..4420a96 --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_meterage_train_detail.xml b/app/src/main/res/layout/activity_meterage_train_detail.xml new file mode 100644 index 0000000..32af2ce --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train_detail.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability.xml b/app/src/main/res/layout/activity_search_capability.xml index 6ecd458..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_capability.xml +++ b/app/src/main/res/layout/activity_search_capability.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + - - - - - - - - - - - - - + + + + + + + + + \ 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/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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_meterage_train.xml b/app/src/main/res/layout/activity_meterage_train.xml new file mode 100644 index 0000000..4420a96 --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_meterage_train_detail.xml b/app/src/main/res/layout/activity_meterage_train_detail.xml new file mode 100644 index 0000000..32af2ce --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train_detail.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability.xml b/app/src/main/res/layout/activity_search_capability.xml index 6ecd458..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_capability.xml +++ b/app/src/main/res/layout/activity_search_capability.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + - - - - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_meterage_train_reasult.xml b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml new file mode 100644 index 0000000..8af0abd --- /dev/null +++ b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + \ 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/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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_meterage_train.xml b/app/src/main/res/layout/activity_meterage_train.xml new file mode 100644 index 0000000..4420a96 --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_meterage_train_detail.xml b/app/src/main/res/layout/activity_meterage_train_detail.xml new file mode 100644 index 0000000..32af2ce --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train_detail.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability.xml b/app/src/main/res/layout/activity_search_capability.xml index 6ecd458..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_capability.xml +++ b/app/src/main/res/layout/activity_search_capability.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + - - - - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_meterage_train_reasult.xml b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml new file mode 100644 index 0000000..8af0abd --- /dev/null +++ b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_standard_device.xml b/app/src/main/res/layout/activity_search_standard_device.xml index 78d1018..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_standard_device.xml +++ b/app/src/main/res/layout/activity_search_standard_device.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + + + + + + + + +) : 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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_meterage_train.xml b/app/src/main/res/layout/activity_meterage_train.xml new file mode 100644 index 0000000..4420a96 --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_meterage_train_detail.xml b/app/src/main/res/layout/activity_meterage_train_detail.xml new file mode 100644 index 0000000..32af2ce --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train_detail.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability.xml b/app/src/main/res/layout/activity_search_capability.xml index 6ecd458..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_capability.xml +++ b/app/src/main/res/layout/activity_search_capability.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + - - - - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_meterage_train_reasult.xml b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml new file mode 100644 index 0000000..8af0abd --- /dev/null +++ b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_standard_device.xml b/app/src/main/res/layout/activity_search_standard_device.xml index 78d1018..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_standard_device.xml +++ b/app/src/main/res/layout/activity_search_standard_device.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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/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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_meterage_train.xml b/app/src/main/res/layout/activity_meterage_train.xml new file mode 100644 index 0000000..4420a96 --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_meterage_train_detail.xml b/app/src/main/res/layout/activity_meterage_train_detail.xml new file mode 100644 index 0000000..32af2ce --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train_detail.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability.xml b/app/src/main/res/layout/activity_search_capability.xml index 6ecd458..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_capability.xml +++ b/app/src/main/res/layout/activity_search_capability.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + - - - - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_meterage_train_reasult.xml b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml new file mode 100644 index 0000000..8af0abd --- /dev/null +++ b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_standard_device.xml b/app/src/main/res/layout/activity_search_standard_device.xml index 78d1018..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_standard_device.xml +++ b/app/src/main/res/layout/activity_search_standard_device.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_train_students.xml b/app/src/main/res/layout/fragment_train_students.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_train_students.xml @@ -0,0 +1,6 @@ + + + + \ 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/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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_meterage_train.xml b/app/src/main/res/layout/activity_meterage_train.xml new file mode 100644 index 0000000..4420a96 --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_meterage_train_detail.xml b/app/src/main/res/layout/activity_meterage_train_detail.xml new file mode 100644 index 0000000..32af2ce --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train_detail.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability.xml b/app/src/main/res/layout/activity_search_capability.xml index 6ecd458..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_capability.xml +++ b/app/src/main/res/layout/activity_search_capability.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + - - - - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_meterage_train_reasult.xml b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml new file mode 100644 index 0000000..8af0abd --- /dev/null +++ b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_standard_device.xml b/app/src/main/res/layout/activity_search_standard_device.xml index 78d1018..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_standard_device.xml +++ b/app/src/main/res/layout/activity_search_standard_device.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_train_students.xml b/app/src/main/res/layout/fragment_train_students.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_train_students.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/include_search_input_title.xml b/app/src/main/res/layout/include_search_input_title.xml new file mode 100644 index 0000000..8d8b6d7 --- /dev/null +++ b/app/src/main/res/layout/include_search_input_title.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + \ 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/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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_meterage_train.xml b/app/src/main/res/layout/activity_meterage_train.xml new file mode 100644 index 0000000..4420a96 --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_meterage_train_detail.xml b/app/src/main/res/layout/activity_meterage_train_detail.xml new file mode 100644 index 0000000..32af2ce --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train_detail.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability.xml b/app/src/main/res/layout/activity_search_capability.xml index 6ecd458..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_capability.xml +++ b/app/src/main/res/layout/activity_search_capability.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + - - - - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_meterage_train_reasult.xml b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml new file mode 100644 index 0000000..8af0abd --- /dev/null +++ b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_standard_device.xml b/app/src/main/res/layout/activity_search_standard_device.xml index 78d1018..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_standard_device.xml +++ b/app/src/main/res/layout/activity_search_standard_device.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_train_students.xml b/app/src/main/res/layout/fragment_train_students.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_train_students.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/include_search_input_title.xml b/app/src/main/res/layout/include_search_input_title.xml new file mode 100644 index 0000000..8d8b6d7 --- /dev/null +++ b/app/src/main/res/layout/include_search_input_title.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_meterage_train_rv_l.xml b/app/src/main/res/layout/item_meterage_train_rv_l.xml new file mode 100644 index 0000000..24abc1b --- /dev/null +++ b/app/src/main/res/layout/item_meterage_train_rv_l.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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/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/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt new file mode 100644 index 0000000..cd46551 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchMeterageTrainResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +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.home.MeterageTrainDetailActivity +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.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_meterage_train_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchMeterageTrainResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + 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() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + 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(2023021002) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + trainLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getMeterageTrainList() + } + + trainLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getMeterageTrainList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_meterage_train_reasult + + override fun observeRequestState() { + meterageTrainViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getMeterageTrainList() + } + + //TODO 培训查询条件不确定 + private fun getMeterageTrainList() { + meterageTrainViewModel.getMeterageTrainList( + "", + "", + "", + "", + "", + "", + "", + "jlglpxjhsp", + arrayOf(), + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023021002 -> { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt index d9d73af..56633bb 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchStandardDeviceActivity.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_standard_device.* +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/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt new file mode 100644 index 0000000..138facb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -0,0 +1,80 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.MeterageTrainDetailModel +import com.casic.xz.meterage.model.MeterageTrainListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class MeterageTrainViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val meterageTrainResult = MutableLiveData() + val meterageTrainDetailResult = MutableLiveData() + + fun getMeterageTrainList( + createStartTime: String, + createEndTime: String, + deptId: String, + director: String, + effectiveCompany: String, + trainStartTime: String, + trainEndTime: String, + formId: String, + ids: Array, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainList( + createStartTime, + createEndTime, + deptId, + director, + effectiveCompany, + trainStartTime, + trainEndTime, + formId, + ids, + offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getMeterageTrainDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getMeterageTrainDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + meterageTrainDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..5c69239 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_doctor.xml b/app/src/main/res/drawable/ic_doctor.xml new file mode 100644 index 0000000..f6db056 --- /dev/null +++ b/app/src/main/res/drawable/ic_doctor.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_meterage_train.xml b/app/src/main/res/layout/activity_meterage_train.xml new file mode 100644 index 0000000..4420a96 --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_meterage_train_detail.xml b/app/src/main/res/layout/activity_meterage_train_detail.xml new file mode 100644 index 0000000..32af2ce --- /dev/null +++ b/app/src/main/res/layout/activity_meterage_train_detail.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability.xml b/app/src/main/res/layout/activity_search_capability.xml index 6ecd458..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_capability.xml +++ b/app/src/main/res/layout/activity_search_capability.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + - - - - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_meterage_train_reasult.xml b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml new file mode 100644 index 0000000..8af0abd --- /dev/null +++ b/app/src/main/res/layout/activity_search_meterage_train_reasult.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_standard_device.xml b/app/src/main/res/layout/activity_search_standard_device.xml index 78d1018..e8350cc 100644 --- a/app/src/main/res/layout/activity_search_standard_device.xml +++ b/app/src/main/res/layout/activity_search_standard_device.xml @@ -5,55 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_train_students.xml b/app/src/main/res/layout/fragment_train_students.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_train_students.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/include_search_input_title.xml b/app/src/main/res/layout/include_search_input_title.xml new file mode 100644 index 0000000..8d8b6d7 --- /dev/null +++ b/app/src/main/res/layout/include_search_input_title.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_meterage_train_rv_l.xml b/app/src/main/res/layout/item_meterage_train_rv_l.xml new file mode 100644 index 0000000..24abc1b --- /dev/null +++ b/app/src/main/res/layout/item_meterage_train_rv_l.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f7261b9..e155f22 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -14,4 +14,5 @@ #F7F7FA #E6E6E6 #E4E4E4 + #09BB07 \ No newline at end of file