Explorar el Código

refactor(更新)
- 快捷入口数量增加
- 异常作业、作业执行的锁定人显示
- 作业执行的步骤提示闪烁

周文健 hace 10 meses
padre
commit
0faffdb26a

+ 8 - 0
app/src/main/java/com/grkj/iscs/features/main/activity/MainActivity.kt

@@ -23,6 +23,7 @@ import com.grkj.ui_base.base.BaseActivity
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
 import com.grkj.shared.utils.extension.toByteArrays
 import com.grkj.shared.utils.extension.toHexStrings
+import com.grkj.ui_base.utils.event.FlashTipEvent
 import com.grkj.ui_base.utils.event.RFIDCardReadEvent
 import com.sik.sikcore.extension.file
 import com.sik.sikimage.ImageConvertUtils
@@ -130,6 +131,13 @@ class MainActivity() : BaseActivity<ActivityMainBinding>() {
             EventConstants.EVENT_LOGOUT -> {
                 logout()
             }
+
+            EventConstants.EVENT_FLASH_TIP_CODE -> {
+                (event.data as FlashTipEvent).apply {
+                    binding.flashTipTv.isVisible = isShow
+                    binding.flashTipTv.text = msg
+                }
+            }
         }
     }
 

+ 4 - 4
app/src/main/java/com/grkj/iscs/features/main/dialog/QuickEntranceConfigDialog.kt

@@ -81,10 +81,10 @@ class QuickEntranceConfigDialog(private val saved: () -> Unit) :
         binding = DialogQuickEntranceConfigBinding.bind(contentView)
         ActivityScreenShotImageView.hideContentView = true
         selectedQuickEntranceConfig = quickEntranceList.onEach {
-            it.itemOrientationDrag = ItemOrientation.HORIZONTAL
+            it.itemOrientationDrag = ItemOrientation.ALL
         }
         binding.selectedRvList.apply {
-            linear(orientation = LinearLayout.HORIZONTAL)
+            layoutManager = FlexboxLayoutManager(context)
         }.setup {
             addType<QuickEntranceMenuItemEntity>(R.layout.item_quick_entrance_config)
             itemTouchHelper = ItemTouchHelper(object : DefaultItemTouchCallback() {
@@ -134,11 +134,11 @@ class QuickEntranceConfigDialog(private val saved: () -> Unit) :
         itemBinding.remove.isVisible = !showAdd
         itemBinding.root.setDebouncedClickListener {
             if (showAdd) {
-                if (selectedQuickEntranceConfig.size == 5) {
+                if (selectedQuickEntranceConfig.size == 8) {
                     PopTip.build().tip(R.string.quick_entrance_most_set_tip)
                     return@setDebouncedClickListener
                 }
-                item.itemOrientationDrag = ItemOrientation.HORIZONTAL
+                item.itemOrientationDrag = ItemOrientation.ALL
                 selectedQuickEntranceConfig.add(item)
             } else {
                 item.itemOrientationDrag = ItemOrientation.NONE

+ 4 - 4
app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionJobFragment.kt

@@ -373,14 +373,14 @@ class ExceptionJobFragment : BaseFragment<FragmentExceptionJobBinding>() {
         if (item.pointStatus == "1") {
             itemBinding.lockStatusLayout.setBackgroundResource(R.drawable.bg_btn_job_execute_go_locking)
             itemBinding.lockStatusIv.setImageResource(R.drawable.icon_ticket_lock)
-            itemBinding.lockStatusTv.text =
-                requireContext().getText(com.grkj.ui_base.R.string.has_locked)
         } else if (item.pointStatus == "2") {
             itemBinding.lockStatusLayout.setBackgroundResource(R.drawable.bg_btn_job_execute_go_unlocking)
             itemBinding.lockStatusIv.setImageResource(R.drawable.icon_ticket_unlock)
-            itemBinding.lockStatusTv.text =
-                requireContext().getText(com.grkj.ui_base.R.string.unlocked)
+        } else {
+            itemBinding.lockStatusLayout.background = null
+            itemBinding.lockStatusIv.isVisible = false
         }
+        itemBinding.lockStatusTv.text = item.lockerName
     }
 
     override fun initData() {

+ 15 - 9
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt

@@ -36,6 +36,7 @@ import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.iscs.features.main.dialog.CheckFaceDialog
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.event.FlashTipEvent
 import com.grkj.ui_base.utils.event.RFIDCardReadEvent
 import com.grkj.ui_base.utils.event.UiEvent
 import com.grkj.ui_base.utils.extension.tip
@@ -91,7 +92,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             }
         }
         binding.toLock.setDebouncedClickListener {
-            if (viewModel.groupInfo.isEmpty()){
+            if (viewModel.groupInfo.isEmpty()) {
                 showToast(CommonUtils.getStr(R.string.not_group_can_lock).toString())
                 return@setDebouncedClickListener
             }
@@ -110,7 +111,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                 .show(requireActivity())
         }
         binding.toUnlock.setDebouncedClickListener {
-            if (viewModel.groupInfo.isEmpty()){
+            if (viewModel.groupInfo.isEmpty()) {
                 showToast(CommonUtils.getStr(R.string.not_group_can_unlock).toString())
                 return@setDebouncedClickListener
             }
@@ -417,14 +418,14 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         if (item.pointStatus == "1") {
             itemBinding.lockStatusLayout.setBackgroundResource(R.drawable.bg_btn_job_execute_go_locking)
             itemBinding.lockStatusIv.setImageResource(R.drawable.icon_ticket_lock)
-            itemBinding.lockStatusTv.text =
-                requireContext().getText(com.grkj.ui_base.R.string.has_locked)
         } else if (item.pointStatus == "2") {
             itemBinding.lockStatusLayout.setBackgroundResource(R.drawable.bg_btn_job_execute_go_unlocking)
             itemBinding.lockStatusIv.setImageResource(R.drawable.icon_ticket_unlock)
-            itemBinding.lockStatusTv.text =
-                requireContext().getText(com.grkj.ui_base.R.string.unlocked)
+        } else {
+            itemBinding.lockStatusLayout.background = null
+            itemBinding.lockStatusIv.isVisible = false
         }
+        itemBinding.lockStatusTv.text = item.lockerName
     }
 
     override fun onEvent(event: EventBean<Any>) {
@@ -545,6 +546,11 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         }
     }
 
+    override fun onPause() {
+        super.onPause()
+        FlashTipEvent.sendFlashTipEvent()
+    }
+
     /**
      * 检查当前步骤要显示的界面
      */
@@ -553,14 +559,14 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         binding.toUnlock.isVisible = false
         binding.cancelJob.isVisible = false
         binding.finishJob.isVisible = false
-        binding.stepTipTv.isVisible = viewModel.needShowTip()
-        binding.stepTipTv.text = viewModel.getCurrentStepTip()
+        FlashTipEvent.sendFlashTipEvent(viewModel.getCurrentStepTip())
         binding.lockInfo.text =
             "${viewModel.ticketPoints.size}/${viewModel.ticketPoints.count { it.pointStatus?.toInt() ?: 0 >= 1 }}/${viewModel.ticketPoints.count { it.pointStatus == "2" }}"
         binding.colockInfo.text =
             "${viewModel.ticketUser.filter { it.userRole == RoleEnum.JTCOLOCKER.roleKey }.size}/${viewModel.ticketUser.count { it.userRole == RoleEnum.JTCOLOCKER.roleKey && it.jobStatus?.toInt() ?: 0 >= 1 }}/${viewModel.ticketUser.count { it.userRole == RoleEnum.JTCOLOCKER.roleKey && it.jobStatus == "2" }}"
         viewModel.groupInfo = viewModel.ticketPoints.groupBy { it.groupId to it.groupName }.filter {
-            val currentWorkflowStep = viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }
+            val currentWorkflowStep =
+                viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }
             if (currentWorkflowStep?.enableLock == true) {
                 logger.info("当前步骤上锁:${it.value.all { it.pointStatus == "0" }}")
                 it.value.all { it.pointStatus == "0" }

+ 5 - 0
app/src/main/res/drawable/bg_main_color_tip.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/main_color" />
+    <corners android:radius="@dimen/common_radius" />
+</shape>

+ 14 - 0
app/src/main/res/layout-land/activity_main.xml

@@ -62,6 +62,20 @@
                         android:textSize="@dimen/home_nickname_text_size" />
                 </LinearLayout>
             </LinearLayout>
+
+
+            <com.grkj.ui_base.widget.FlashingTipTextView
+                android:id="@+id/flash_tip_tv"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@drawable/bg_main_color_tip"
+                android:drawableLeft="@mipmap/tip"
+                android:drawablePadding="@dimen/common_spacing"
+                android:gravity="center_vertical"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:textColor="@color/white"
+                android:textSize="@dimen/common_btn_text_size"
+                android:visibility="gone" />
         </FrameLayout>
 
         <View

+ 0 - 13
app/src/main/res/layout-land/fragment_job_execute.xml

@@ -167,19 +167,6 @@
                     </RelativeLayout>
                 </LinearLayout>
 
-                <TextView
-                    android:id="@+id/step_tip_tv"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing_2x"
-                    android:layout_marginTop="@dimen/common_spacing"
-                    android:drawableLeft="@mipmap/tip"
-                    android:drawablePadding="@dimen/common_spacing"
-                    android:gravity="center_vertical"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size"
-                    android:visibility="gone" />
-
                 <LinearLayout
                     android:id="@+id/data_layout"
                     android:layout_width="match_parent"

+ 13 - 1
app/src/main/res/layout/activity_main.xml

@@ -22,6 +22,7 @@
                 android:layout_gravity="center_vertical"
                 android:src="@mipmap/icon_logo" />
 
+
             <LinearLayout
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
@@ -61,9 +62,20 @@
                         android:textColor="@color/white"
                         android:textSize="@dimen/home_nickname_text_size" />
                 </LinearLayout>
-
             </LinearLayout>
 
+            <com.grkj.ui_base.widget.FlashingTipTextView
+                android:id="@+id/flash_tip_tv"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@drawable/bg_main_color_tip"
+                android:drawableLeft="@mipmap/tip"
+                android:drawablePadding="@dimen/common_spacing"
+                android:gravity="center_vertical"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:textColor="@color/white"
+                android:visibility="gone"
+                android:textSize="@dimen/common_btn_text_size" />
 
         </FrameLayout>
 

+ 0 - 13
app/src/main/res/layout/fragment_job_execute.xml

@@ -172,19 +172,6 @@
                     </RelativeLayout>
                 </LinearLayout>
 
-                <TextView
-                    android:id="@+id/step_tip_tv"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing_2x"
-                    android:layout_marginTop="@dimen/common_spacing"
-                    android:drawableLeft="@mipmap/tip"
-                    android:drawablePadding="@dimen/common_spacing"
-                    android:gravity="center_vertical"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size"
-                    android:visibility="gone" />
-
                 <LinearLayout
                     android:id="@+id/data_layout"
                     android:layout_width="match_parent"

+ 2 - 2
app/src/main/res/values-en/strings.xml

@@ -477,8 +477,8 @@
     <string name="select_group_tip">Click on the blank area of the group to select</string>
     <string name="quick_entrance_title">Quick access configuration</string>
     <string name="check_new_key_need_register">Detected a new key, is it registered</string>
-    <string name="selected_quick_entrance">The configured shortcut entrance</string>
+    <string name="selected_quick_entrance">Configurable shortcut entrances (up to 8 shortcut entrances can be added)</string>
     <string name="all_quick_entrance">All Quick Entrances</string>
-    <string name="quick_entrance_most_set_tip">Up to 5 quick entry points can be set</string>
+    <string name="quick_entrance_most_set_tip">Up to 8 quick entry points can be set</string>
 
 </resources>

+ 2 - 2
app/src/main/res/values-zh/strings.xml

@@ -477,8 +477,8 @@
     <string name="select_group_tip">点击分组空白区域进行选中</string>
     <string name="quick_entrance_title">快捷入口配置</string>
     <string name="check_new_key_need_register">检测到新钥匙,是否注册</string>
-    <string name="selected_quick_entrance">已配置的快捷入口</string>
+    <string name="selected_quick_entrance">已配置的快捷入口(最多添加8个快捷入口)</string>
     <string name="all_quick_entrance">所有快捷入口</string>
-    <string name="quick_entrance_most_set_tip">快捷入口最多设置5个</string>
+    <string name="quick_entrance_most_set_tip">快捷入口最多设置8个</string>
 
 </resources>

+ 2 - 2
app/src/main/res/values/strings.xml

@@ -480,8 +480,8 @@
     <string name="select_group_tip">点击分组空白区域选中</string>
     <string name="quick_entrance_title">快捷入口配置</string>
     <string name="check_new_key_need_register">检测到新钥匙,是否注册</string>
-    <string name="selected_quick_entrance">已配置的快捷入口</string>
+    <string name="selected_quick_entrance">已配置的快捷入口(最多添加8个快捷入口)</string>
     <string name="all_quick_entrance">所有快捷入口</string>
-    <string name="quick_entrance_most_set_tip">快捷入口最多设置5个</string>
+    <string name="quick_entrance_most_set_tip">快捷入口最多设置8个</string>
 
 </resources>

+ 4 - 1
data/src/main/java/com/grkj/data/dao/JobTicketDao.kt

@@ -262,10 +262,13 @@ interface JobTicketDao {
             select ijtp.*, 
             iip.point_name as pointName, 
             ijtg.group_name as groupName,
-            iip.remark as pointFunction 
+            iip.remark as pointFunction,
+            su.nick_name as lockerName
             from is_job_ticket_points ijtp 
             left join is_isolation_point iip on ijtp.point_id = iip.point_id 
             left join is_job_ticket_group ijtg on ijtg.id = ijtp.group_id 
+            left join is_job_ticket_user ijtu on ijtu.group_id = ijtp.group_id
+            left join sys_user su on su.user_id = ijtu.user_id
             where ijtp.ticket_id = :ticketId
         """
     )

+ 5 - 0
data/src/main/java/com/grkj/data/data/EventConstants.kt

@@ -56,6 +56,11 @@ object EventConstants {
      */
     const val EVENT_RESTART_APP = 100_000_010
 
+    /**
+     * 闪烁提醒
+     */
+    const val EVENT_FLASH_TIP_CODE: Int = 100_000_011
+
     //---------------------------作业票------------------------
     const val EVENT_GET_TICKET_STATUS: Int = 100_001_001
 

+ 1 - 0
data/src/main/java/com/grkj/data/model/vo/IsJobTicketPointsDataVo.kt

@@ -9,4 +9,5 @@ class IsJobTicketPointsDataVo : IsJobTicketPoints() {
     var pointName: String? = ""
     var pointFunction: String? = ""
     var groupName: String? = ""
+    var lockerName: String? = ""
 }

+ 23 - 0
ui-base/src/main/java/com/grkj/ui_base/utils/event/FlashTipEvent.kt

@@ -0,0 +1,23 @@
+package com.grkj.ui_base.utils.event
+
+import com.grkj.shared.model.EventBean
+import com.grkj.data.data.EventConstants
+
+/**
+ * 闪烁提醒事件
+ */
+class FlashTipEvent(val msg: String? = null, val isShow: Boolean = false) {
+    companion object {
+        /**
+         * 发送闪烁提醒事件
+         */
+        @JvmStatic
+        fun sendFlashTipEvent(msg: String? = null, isShow: Boolean = !msg.isNullOrEmpty()) {
+            val loadingEventBean = EventBean<FlashTipEvent>(
+                EventConstants.EVENT_LOADING_CODE,
+                FlashTipEvent(msg, isShow)
+            )
+            EventHelper.sendEvent(loadingEventBean)
+        }
+    }
+}

+ 67 - 0
ui-base/src/main/java/com/grkj/ui_base/widget/FlashingTipTextView.kt

@@ -0,0 +1,67 @@
+package com.grkj.ui_base.widget
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.animation.AlphaAnimation
+import android.view.animation.Animation
+import androidx.appcompat.widget.AppCompatTextView
+
+class FlashingTipTextView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : AppCompatTextView(context, attrs, defStyleAttr) {
+
+    private var flashDuration: Long = 1000L  // 单次闪烁时长
+    private var totalDuration: Long = -1     // 总持续时长,-1 表示无限
+    private var repeat = true                // 是否循环闪烁
+    private var flashing = false
+    private var flashAnimation: AlphaAnimation? = null
+
+    init {
+        // 自动 post 启动动画
+        post {
+            startFlashing()
+        }
+    }
+
+    private fun setupAnimation() {
+        flashAnimation = AlphaAnimation(1.0f, 0.3f).apply {
+            duration = flashDuration
+            repeatMode = Animation.REVERSE
+            repeatCount = if (repeat) Animation.INFINITE else 1
+            setAnimationListener(object : Animation.AnimationListener {
+                override fun onAnimationStart(animation: Animation) {}
+                override fun onAnimationEnd(animation: Animation) {
+                    flashing = false
+                }
+
+                override fun onAnimationRepeat(animation: Animation) {}
+            })
+        }
+    }
+
+    fun startFlashing(
+        durationPerCycle: Long = 1000L,
+        totalDuration: Long = -1L,
+        repeat: Boolean = true
+    ) {
+        if (flashing) return
+        this.flashDuration = durationPerCycle
+        this.totalDuration = totalDuration
+        this.repeat = repeat
+
+        setupAnimation()
+        startAnimation(flashAnimation)
+        flashing = true
+
+        if (totalDuration > 0) {
+            postDelayed({ stopFlashing() }, totalDuration)
+        }
+    }
+
+    fun stopFlashing() {
+        clearAnimation()
+        flashing = false
+    }
+
+    fun isFlashing(): Boolean = flashing
+}