Преглед на файлове

refactor(模式校验):
- 步骤模式校验 完成
- 人员模式校验 完成
- 进度模式校验 完成
- 模式切换 完成

(cherry picked from commit 11d3c09dc0619d597f89f696492c6bf506fe0274)

周文健 преди 6 месеца
родител
ревизия
726d3c04e7
променени са 23 файла, в които са добавени 539 реда и са изтрити 95 реда
  1. 2 0
      app/build.gradle
  2. 0 1
      app/src/main/AndroidManifest.xml
  3. 7 3
      app/src/main/java/com/grkj/iscs/BusinessManager.kt
  4. 3 1
      app/src/main/java/com/grkj/iscs/MyApplication.kt
  5. 24 0
      app/src/main/java/com/grkj/iscs/util/SPUtils.kt
  6. 3 0
      app/src/main/java/com/grkj/iscs/view/activity/LoginActivity.kt
  7. 30 1
      app/src/main/java/com/grkj/iscs/view/dialog/TipDialog.kt
  8. 90 9
      app/src/main/java/com/grkj/iscs/view/fragment/JobProgressFragment.kt
  9. 49 10
      app/src/main/java/com/grkj/iscs/view/fragment/StepFragment.kt
  10. 45 24
      app/src/main/java/com/grkj/iscs/view/fragment/TechnologySopFragment.kt
  11. 43 21
      app/src/main/java/com/grkj/iscs/view/fragment/WorkerFragment.kt
  12. 35 0
      app/src/main/java/com/grkj/iscs/view/presenter/JobProgressPresenter.kt
  13. 14 1
      app/src/main/java/com/grkj/iscs/view/presenter/StepPresenter.kt
  14. 7 0
      app/src/main/java/com/grkj/iscs/view/presenter/WorkerPresenter.kt
  15. 42 0
      app/src/main/java/com/grkj/iscs/view/step_mode/IStepMode.kt
  16. 33 2
      app/src/main/java/com/grkj/iscs/view/step_mode/StepMode1.kt
  17. 61 14
      app/src/main/java/com/grkj/iscs/view/step_mode/StepMode2.kt
  18. 11 1
      app/src/main/java/com/grkj/iscs/view/widget/CustomMarkLayer.kt
  19. 1 0
      app/src/main/res/layout/dialog_tip.xml
  20. 13 3
      app/src/main/res/values-en/strings.xml
  21. 12 2
      app/src/main/res/values-zh/strings.xml
  22. 2 0
      app/src/main/res/values/colors.xml
  23. 12 2
      app/src/main/res/values/strings.xml

+ 2 - 0
app/build.gradle

@@ -127,4 +127,6 @@ dependencies {
     implementation 'com.google.mlkit:face-detection:16.1.5'
 
     implementation 'io.github.razerdp:BasePopup:3.2.1'
+
+    implementation 'com.github.SilverIceKey.SIKExtension:SIKCore:1.1.39'
 }

+ 0 - 1
app/src/main/AndroidManifest.xml

@@ -54,7 +54,6 @@
             android:name=".view.activity.LoginActivity"
             android:exported="true"
             android:launchMode="singleTask" >
-
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 

+ 7 - 3
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -76,6 +76,8 @@ object BusinessManager {
     // 消息总线
     val mEventBus = MutableLiveData<MsgEvent>()
 
+    @JvmStatic
+    @Volatile
     // 已连接的蓝牙钥匙集合
     var deviceList: MutableList<BleBean> = mutableListOf()
 
@@ -1597,7 +1599,7 @@ object BusinessManager {
     /**
      * 处理虚拟钥匙归还,如果作业的全部点位已经上锁更新钥匙的状态使用
      */
-    fun handleVirtualKeyReturn(taskCode: Long, keyNfc: String,done: () -> Unit) {
+    fun handleVirtualKeyReturn(taskCode: Long, keyNfc: String, done: () -> Unit) {
         // 上报钥匙归还
         NetApi.updateKeyReturn(taskCode, keyNfc, MyApplication.instance!!.serialNo()) { isSuccess ->
             if (!isSuccess) {
@@ -1605,7 +1607,7 @@ object BusinessManager {
                     MyApplication.instance!!,
                     UpdateKeyReturnBO(taskCode, keyNfc)
                 )
-            }else{
+            } else {
                 done()
                 sendEventMsg(
                     MsgEvent(
@@ -1893,13 +1895,15 @@ object BusinessManager {
             }
         }
 
-        val returnList = SPUtils.getUpdateKeyReturn(context).filter { it.keyNfc.isNotEmpty() }.toMutableList()
+        val returnList =
+            SPUtils.getUpdateKeyReturn(context).filter { it.keyNfc.isNotEmpty() }.toMutableList()
         if (returnList.isEmpty()) {
             return
         }
         val itemsToRemove = returnList.toList()
         var count = 0
         itemsToRemove.forEach { itData ->
+            SPUtils.returnKey(itData.ticketId)
             NetApi.updateKeyReturn(
                 itData.ticketId, itData.keyNfc, context.serialNo()
             ) { isSuccess ->

+ 3 - 1
app/src/main/java/com/grkj/iscs/MyApplication.kt

@@ -7,7 +7,6 @@ import com.grkj.iscs.ble.BleUtil
 import com.grkj.iscs.extentions.serialNo
 import com.grkj.iscs.model.Token
 import com.grkj.iscs.util.ArcSoftUtil
-import com.grkj.iscs.util.CrashUtil
 import com.grkj.iscs.util.Executor
 import com.grkj.iscs.util.FileUtil
 import com.grkj.iscs.util.FileUtil.LOG_DIR
@@ -16,6 +15,7 @@ import com.grkj.iscs.util.NetApi
 import com.grkj.iscs.util.NetHttpManager
 import com.grkj.iscs.util.SPUtils
 import com.grkj.iscs.util.log.LogUtil
+import com.sik.sikcore.SIKCore
 
 class MyApplication : Application() {
 
@@ -36,6 +36,8 @@ class MyApplication : Application() {
         BusinessManager.initMsgEventBus()
         ArcSoftUtil.checkActiveStatus(this)
 
+        SIKCore.init(this)
+
         NetApi.logout()
         SPUtils.clearLoginUser(this)
         Token.clear(this)

+ 24 - 0
app/src/main/java/com/grkj/iscs/util/SPUtils.kt

@@ -10,6 +10,9 @@ import com.grkj.iscs.model.vo.system.SystemAttributePageRespVO
 import com.grkj.iscs.model.vo.ticket.LockPointUpdateReqVO
 import com.grkj.iscs.model.vo.user.UserInfoRespVO
 import com.grkj.iscs.util.log.LogUtil
+import com.sik.sikcore.extension.getMMKVData
+import com.sik.sikcore.extension.saveMMKVData
+import com.tencent.mmkv.MMKV
 
 object SPUtils {
 
@@ -243,4 +246,25 @@ object SPUtils {
         }
         return spUrl
     }
+
+    /**
+     * 取出钥匙
+     */
+    fun takeKey(ticketId: Long) {
+        "${ticketId}_TakeKey".saveMMKVData(true)
+    }
+
+    /**
+     * 作业是否已经取过钥匙
+     */
+    fun isKeyTake(ticketId: Long): Boolean {
+        return "${ticketId}_TakeKey".getMMKVData(false)
+    }
+
+    /**
+     * 归还钥匙
+     */
+    fun returnKey(ticketId: Long) {
+        MMKV.defaultMMKV().remove("${ticketId}_TakeKey")
+    }
 }

+ 3 - 0
app/src/main/java/com/grkj/iscs/view/activity/LoginActivity.kt

@@ -21,6 +21,8 @@ import com.grkj.iscs.view.dialog.LoginDialog
 import com.grkj.iscs.view.dialog.UrlConfigDialog
 import com.grkj.iscs.view.iview.ILoginView
 import com.grkj.iscs.view.presenter.LoginPresenter
+import com.sik.sikcore.SIKCore
+import com.tencent.mmkv.MMKV
 import com.zhy.adapter.recyclerview.CommonAdapter
 import com.zhy.adapter.recyclerview.base.ViewHolder
 
@@ -33,6 +35,7 @@ class LoginActivity : BaseMvpActivity<ILoginView, LoginPresenter, ActivityLoginB
         get() = ActivityLoginBinding.inflate(layoutInflater)
 
     override fun initView() {
+        MMKV.initialize(SIKCore.getApplication())
         mBinding?.tvVersion?.text = "v${AppUtils.getPkgVerName(this)}"
 
         mBinding?.tvVersion?.setOnClickListener {

+ 30 - 1
app/src/main/java/com/grkj/iscs/view/dialog/TipDialog.kt

@@ -2,6 +2,7 @@ package com.grkj.iscs.view.dialog
 
 import android.content.Context
 import android.view.View
+import androidx.core.content.ContextCompat
 import com.grkj.iscs.R
 import com.grkj.iscs.view.base.BaseDialog
 import com.grkj.iscs.databinding.DialogTipBinding
@@ -21,6 +22,7 @@ class TipDialog(ctx: Context) : BaseDialog<DialogTipBinding>(ctx) {
     companion object {
         const val TYPE_CONFIRM = 0
         const val TYPE_ALL = 1
+        const val TYPE_HINT = 2
     }
 
     override val viewBinding: DialogTipBinding
@@ -45,9 +47,35 @@ class TipDialog(ctx: Context) : BaseDialog<DialogTipBinding>(ctx) {
     fun setType(type: Int) {
         when (type) {
             TYPE_CONFIRM -> {
+                mBinding?.tvTitle?.text = context.getString(R.string.action_confirm)
+                mBinding?.tvTitle?.setBackgroundColor(
+                    ContextCompat.getColor(
+                        context,
+                        R.color.main_color
+                    )
+                )
                 mBinding?.btnCancel?.visibility = View.GONE
             }
+
+            TYPE_HINT -> {
+                mBinding?.tvTitle?.text = context.getString(R.string.action_hint)
+                mBinding?.tvTitle?.setBackgroundColor(
+                    ContextCompat.getColor(
+                        context,
+                        R.color.tip_dialog_hint_color
+                    )
+                )
+                mBinding?.btnCancel?.visibility = View.GONE
+            }
+
             TYPE_ALL -> {
+                mBinding?.tvTitle?.text = context.getString(R.string.action_confirm)
+                mBinding?.tvTitle?.setBackgroundColor(
+                    ContextCompat.getColor(
+                        context,
+                        R.color.main_color
+                    )
+                )
                 mBinding?.btnCancel?.visibility = View.VISIBLE
             }
         }
@@ -67,7 +95,8 @@ class TipDialog(ctx: Context) : BaseDialog<DialogTipBinding>(ctx) {
             schedule(object : TimerTask() {
                 override fun run() {
                     Executor.runOnMain {
-                        mBinding?.btnCancel?.text = context.getString(R.string.cancel_countdown, countSeconds)
+                        mBinding?.btnCancel?.text =
+                            context.getString(R.string.cancel_countdown, countSeconds)
                         if (countSeconds == 0) {
                             dismiss()
                             cancelListener?.invoke()

+ 90 - 9
app/src/main/java/com/grkj/iscs/view/fragment/JobProgressFragment.kt

@@ -14,6 +14,7 @@ import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_UPDATE_TICKET_PR
 import com.grkj.iscs.model.eventmsg.UpdateTicketProgressMsg
 import com.grkj.iscs.model.vo.ticket.TicketDetailMonitorRespVO
 import com.grkj.iscs.model.vo.ticket.TicketDetailRespVO
+import com.grkj.iscs.util.SPUtils
 import com.grkj.iscs.util.ToastUtils
 import com.grkj.iscs.util.log.LogUtil
 import com.grkj.iscs.view.base.BaseMvpFragment
@@ -90,7 +91,10 @@ class JobProgressFragment(val goBack: () -> Unit) :
                     position: Int
                 ) {
                     holder.setText(R.id.tv_name, user.userName)
-                    holder.setVisible(R.id.iv_ready_to_lock, mStep >= 6)
+                    holder.setVisible(
+                        R.id.iv_ready_to_lock,
+                        presenter?.needShowReadyToLock(requireContext(), mPointList, mStep) == true
+                    )
                     holder.setVisible(R.id.iv_locked, user.jobStatus!! >= 4)
                     holder.setVisible(R.id.iv_unlocked, user.jobStatus >= 5)
                 }
@@ -98,11 +102,44 @@ class JobProgressFragment(val goBack: () -> Unit) :
 
         mBinding?.cbAction?.debounce(2000) {
             if (mStep == 4) {
-                BusinessManager.sendLoadingEventMsg(getString(R.string.system_is_processing))
-                presenter?.handleLockProcess(mPageChangeBO?.ticketId!!)
+                if (SPUtils.isKeyTake(mPageChangeBO?.ticketId!!)) {
+                    if (mTipDialog == null) {
+                        mTipDialog = TipDialog(requireContext())
+                    }
+                    mTipDialog?.setTip(getString(R.string.take_one_more_key_hint))
+                    mTipDialog?.setType(TipDialog.TYPE_HINT)
+                    mTipDialog?.setConfirmListener {
+                        BusinessManager.sendLoadingEventMsg(getString(R.string.system_is_processing))
+                        presenter?.handleLockProcess(mPageChangeBO?.ticketId!!)
+                    }
+                    mTipDialog?.showCancelCountdown(10)
+                } else {
+                    BusinessManager.sendLoadingEventMsg(getString(R.string.system_is_processing))
+                    presenter?.handleLockProcess(mPageChangeBO?.ticketId!!)
+                    SPUtils.takeKey(mPageChangeBO?.ticketId!!)
+                }
             } else if (mStep == 7) {
-                BusinessManager.sendLoadingEventMsg(getString(R.string.system_is_processing))
-                presenter?.handleUnlockProcess(mPageChangeBO?.ticketId!!)
+                val checkResult = presenter?.checkUnlock(requireContext(), mUserList)
+                if (checkResult?.isEmpty() == true) {
+                    if (SPUtils.isKeyTake(mPageChangeBO?.ticketId!!)) {
+                        if (mTipDialog == null) {
+                            mTipDialog = TipDialog(requireContext())
+                        }
+                        mTipDialog?.setTip(getString(R.string.take_one_more_key_hint))
+                        mTipDialog?.setType(TipDialog.TYPE_HINT)
+                        mTipDialog?.setConfirmListener {
+                            BusinessManager.sendLoadingEventMsg(getString(R.string.system_is_processing))
+                            presenter?.handleUnlockProcess(mPageChangeBO?.ticketId!!)
+                        }
+                        mTipDialog?.showCancelCountdown(10)
+                    } else {
+                        BusinessManager.sendLoadingEventMsg(getString(R.string.system_is_processing))
+                        presenter?.handleUnlockProcess(mPageChangeBO?.ticketId!!)
+                        SPUtils.takeKey(mPageChangeBO?.ticketId!!)
+                    }
+                } else {
+                    ToastUtils.tip(checkResult)
+                }
             }
         }
 
@@ -176,21 +213,65 @@ class JobProgressFragment(val goBack: () -> Unit) :
                 }
                 val jobStatus = mUserList.find { itUser -> itUser.userId == it.userId }?.jobStatus
                 if (jobStatus == null || jobStatus >= 5) {
+                    val errorStr = if (jobStatus == null) {
+                        getString(R.string.user_not_found)
+                    } else {
+                        getString(R.string.user_already_unlock)
+                    }
+                    ToastUtils.tip(errorStr)
                     return@getCardInfoByNfc
                 }
 
                 //刷卡处理共锁的位置调整步骤主要在这块
-                if (mStep == 6) {
-                    if (jobStatus < 4) {
+                if (presenter?.canHandleColockerLock(
+                        requireContext(),
+                        mStep
+                    ) == true
+                ) {
+                    if (presenter?.canHandleColockerUnlock(
+                            requireContext(),
+                            mStep
+                        ) == true && jobStatus == 4
+                    ) {
+                        mTipDialog?.setTip(getString(R.string.confirm_to_uncolock, it.nickName))
+                        mTipDialog?.setConfirmListener {
+                            presenter?.updateColockerStatus(
+                                mPageChangeBO?.ticketId!!,
+                                cardNo,
+                                "5"
+                            ) {
+                                refreshPage(mPageChangeBO!!)
+                            }
+                        }
+                        mTipDialog?.showCancelCountdown(10)
+                    } else if (jobStatus < 4) {
                         mTipDialog?.setTip(getString(R.string.confirm_to_colock, it.nickName))
+                        mTipDialog?.setConfirmListener {
+                            presenter?.updateColockerStatus(
+                                mPageChangeBO?.ticketId!!,
+                                cardNo,
+                                "4"
+                            ) {
+                                refreshPage(mPageChangeBO!!)
+                            }
+                        }
+                        mTipDialog?.showCancelCountdown(10)
                     } else {
+                        ToastUtils.tip(getString(R.string.current_colocker_already_locked))
+                        return@getCardInfoByNfc
+                    }
+                } else if (presenter?.canHandleColockerUnlock(requireContext(), mStep) == true) {
+                    if (jobStatus == 4) {
                         mTipDialog?.setTip(getString(R.string.confirm_to_uncolock, it.nickName))
+                    } else {
+                        ToastUtils.tip(getString(R.string.current_colocker_already_unlocked))
+                        return@getCardInfoByNfc
                     }
                     mTipDialog?.setConfirmListener {
                         presenter?.updateColockerStatus(
                             mPageChangeBO?.ticketId!!,
                             cardNo,
-                            if (jobStatus < 4) "4" else "5"
+                            "5"
                         ) {
                             refreshPage(mPageChangeBO!!)
                         }
@@ -231,7 +312,7 @@ class JobProgressFragment(val goBack: () -> Unit) :
             }
 
             7 -> {
-                if (presenter?.showGoToUnlock(requireContext(),mPointList,mUserList) == true) {
+                if (presenter?.showGoToUnlock(requireContext(), mPointList, mUserList) == true) {
                     mBinding?.cbAction?.visibility = View.VISIBLE
                     mBinding?.cbAction?.setIcon(R.mipmap.ticket_unlocked)
                     mBinding?.cbAction?.setText(getString(R.string.go_unlocking))

+ 49 - 10
app/src/main/java/com/grkj/iscs/view/fragment/StepFragment.kt

@@ -3,12 +3,16 @@ package com.grkj.iscs.view.fragment
 import android.graphics.PointF
 import android.view.View
 import android.widget.ImageView
+import androidx.lifecycle.Observer
 import com.bumptech.glide.Glide
 import com.google.android.material.card.MaterialCardView
 import com.grkj.iscs.BusinessManager
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentStepBinding
 import com.grkj.iscs.model.bo.PageChangeBO
+import com.grkj.iscs.model.eventmsg.MsgEvent
+import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_UPDATE_TICKET_PROGRESS
+import com.grkj.iscs.model.eventmsg.UpdateTicketProgressMsg
 import com.grkj.iscs.model.vo.machinery.MachineryDetailRespVO
 import com.grkj.iscs.model.vo.ticket.LotoMapRespVO
 import com.grkj.iscs.model.vo.ticket.StepDetailRespVO
@@ -42,6 +46,7 @@ class StepFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> Uni
     private val mStationList = mutableListOf<CustomStationLayer.IsolationPoint>()
     private var mMapPicWidth = 1
     private var mTicketDetailData: TicketDetailRespVO? = null
+    private lateinit var observer: Observer<MsgEvent>
     private var mCanHandle: Boolean? = null // 是否可以操作,创建人、上锁人至少符合一个才可操作
 
     override val viewBinding: FragmentStepBinding
@@ -146,8 +151,20 @@ class StepFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> Uni
                 )
             }
         }
-
         initMap()
+
+        observer = Observer { newData ->
+            if (newData.code != MSG_EVENT_UPDATE_TICKET_PROGRESS) {
+                return@Observer
+            }
+            LogUtil.i("Update progress msg, isVisible : $isVisible")
+            if (!isVisible) {
+                return@Observer
+            }
+            val ticketId = (newData.data as UpdateTicketProgressMsg).ticketId
+            LogUtil.i("Update progress msg, ticketId : $ticketId")
+            refreshPage(mChangePage!!)
+        }
     }
 
     private fun initMap() {
@@ -284,7 +301,7 @@ class StepFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> Uni
         if (mStep == 0) return
         when (step) {
             3 -> {
-                if (presenter?.canModifyColocker(requireContext(), step) == true) {
+                if (presenter?.canModifyColocker(requireContext(), step) == false) {
                     ToastUtils.tip(R.string.current_step_can_not_be_process)
                     return
                 }
@@ -320,7 +337,7 @@ class StepFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> Uni
     private fun updateStep(step: Int) {
         val canContinue =
             presenter?.checkCanContinue(requireContext(), step, mTicketDetailData) ?: ""
-        if (canContinue.isEmpty() == true
+        if (canContinue.isEmpty()
         ) {
             val str = when (step) {
                 4 -> getString(R.string.action_confirm_shut_down)
@@ -331,6 +348,7 @@ class StepFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> Uni
                 else -> ""
             }
             mTipDialog.setTip(str)
+            mTipDialog.setType(TipDialog.TYPE_ALL)
             mTipDialog.setConfirmListener {
                 BusinessManager.sendLoadingEventMsg(getString(R.string.is_processing_please_wait))
                 when (step) {
@@ -339,13 +357,19 @@ class StepFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> Uni
                             presenter?.updateStep(mStepList[3].stepDetail?.stepId!!, "1") {
                                 BusinessManager.sendLoadingEventMsg(null, false)
                                 refreshPage(mChangePage!!)
-                                // 自动跳转
-                                changePage(
-                                    PageChangeBO(
-                                        2, mChangePage?.workstationId, mChangePage?.ticketId,
-                                        mChangePage?.machineryId, mChangePage?.machineryName
+                                if (presenter?.jumpJobProgressPageCheck(
+                                        requireContext(),
+                                        step
+                                    ) == true
+                                ) {
+                                    // 自动跳转
+                                    changePage(
+                                        PageChangeBO(
+                                            2, mChangePage?.workstationId, mChangePage?.ticketId,
+                                            mChangePage?.machineryId, mChangePage?.machineryName
+                                        )
                                     )
-                                )
+                                }
                             }
                         }
                     }
@@ -356,7 +380,11 @@ class StepFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> Uni
                             "1"
                         ) {
                             refreshPage(mChangePage!!)
-                            if (step == 6 || step == 7) {
+                            if (presenter?.jumpJobProgressPageCheck(
+                                    requireContext(),
+                                    step
+                                ) == true
+                            ) {
                                 // 自动跳转
                                 changePage(
                                     PageChangeBO(
@@ -370,7 +398,18 @@ class StepFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> Uni
                 }
             }
         } else {
+            mTipDialog.setType(TipDialog.TYPE_HINT)
             mTipDialog.setTip(canContinue)
+            mTipDialog.setConfirmListener {
+                presenter?.tipToJobProgressPageCheck(requireContext(), mStep) {
+                    changePage(
+                        PageChangeBO(
+                            2, mChangePage?.workstationId, mChangePage?.ticketId,
+                            mChangePage?.machineryId, mChangePage?.machineryName
+                        )
+                    )
+                }
+            }
         }
         mTipDialog.show()
     }

+ 45 - 24
app/src/main/java/com/grkj/iscs/view/fragment/TechnologySopFragment.kt

@@ -28,6 +28,7 @@ class TechnologySopFragment(val changePage: (PageChangeBO) -> Unit) :
     private val mMachineryList = mutableListOf<MachineryPageRespVO.Record>()
     private var mMachineryIdx = -1
     private var mSopTypeIdx = -1
+    private var mWorkStationId = -1L
 
     override val viewBinding: FragmentTechnologySopBinding
         get() = FragmentTechnologySopBinding.inflate(layoutInflater)
@@ -38,10 +39,15 @@ class TechnologySopFragment(val changePage: (PageChangeBO) -> Unit) :
             R.layout.item_rv_technology_sop,
             mMachineryList
         ) {
-            override fun convert(holder: ViewHolder, data: MachineryPageRespVO.Record?, parPos: Int) {
+            override fun convert(
+                holder: ViewHolder,
+                data: MachineryPageRespVO.Record?,
+                parPos: Int
+            ) {
                 holder.getView<LinearLayout>(R.id.root).isSelected = parPos == mMachineryIdx
                 holder.setText(R.id.tv_name, data?.machineryName)
-                Glide.with(this@TechnologySopFragment).load(data?.machineryImg).into(holder.getView(R.id.iv_pic))
+                Glide.with(this@TechnologySopFragment).load(data?.machineryImg)
+                    .into(holder.getView(R.id.iv_pic))
                 holder.setOnClickListener(R.id.root) {
                     if (mMachineryIdx != parPos) {
                         mSopTypeIdx = -1
@@ -52,35 +58,48 @@ class TechnologySopFragment(val changePage: (PageChangeBO) -> Unit) :
                 }
 
                 val recyclerView = holder.getView<RecyclerView>(R.id.rv_type)
-                recyclerView.adapter = object : CommonAdapter<MachineryPageRespVO.Record.SysDictData>(
-                    requireActivity(),
-                    R.layout.item_rv_technology_sop_type,
-                    data?.sysDictDatas ?: mutableListOf()
-                ) {
-                    override fun convert(holder: ViewHolder, type: MachineryPageRespVO.Record.SysDictData?, childPos: Int) {
-                        holder.getView<LinearLayout>(R.id.root).isSelected = (childPos == mSopTypeIdx && parPos == mMachineryIdx)
-                        type?.dictLabel?.let {
-                            holder.setText(R.id.tv_name, it)
-                        }
-                        mSopTypeList.find { it.type.toString() == type?.dictValue }?.icon?.let { icon ->
-                            holder.getView<ImageView>(R.id.iv_type).setImageResource(icon)
-                        }
-                        holder.setOnClickListener(R.id.root) {
-                            mMachineryIdx = parPos
-                            mSopTypeIdx = childPos
-                            mBinding?.rvTechnology?.adapter?.notifyDataSetChanged()
-                            refreshSelected()
-                            notifyDataSetChanged()
+                recyclerView.adapter =
+                    object : CommonAdapter<MachineryPageRespVO.Record.SysDictData>(
+                        requireActivity(),
+                        R.layout.item_rv_technology_sop_type,
+                        data?.sysDictDatas ?: mutableListOf()
+                    ) {
+                        override fun convert(
+                            holder: ViewHolder,
+                            type: MachineryPageRespVO.Record.SysDictData?,
+                            childPos: Int
+                        ) {
+                            holder.getView<LinearLayout>(R.id.root).isSelected =
+                                (childPos == mSopTypeIdx && parPos == mMachineryIdx)
+                            type?.dictLabel?.let {
+                                holder.setText(R.id.tv_name, it)
+                            }
+                            mSopTypeList.find { it.type.toString() == type?.dictValue }?.icon?.let { icon ->
+                                holder.getView<ImageView>(R.id.iv_type).setImageResource(icon)
+                            }
+                            holder.setOnClickListener(R.id.root) {
+                                mMachineryIdx = parPos
+                                mSopTypeIdx = childPos
+                                mBinding?.rvTechnology?.adapter?.notifyDataSetChanged()
+                                refreshSelected()
+                                notifyDataSetChanged()
+                            }
                         }
                     }
-                }
             }
         }
 
         mBinding?.cbStart?.setOnClickListener {
             presenter?.createTicket(mMachineryIdx, mSopTypeIdx, mMachineryList) {
                 it?.let {
-                    changePage(PageChangeBO(2, ticketId = it, machineryId = mMachineryList[mMachineryIdx].machineryId))
+                    changePage(
+                        PageChangeBO(
+                            2,
+                            workstationId = mWorkStationId,
+                            ticketId = it,
+                            machineryId = mMachineryList[mMachineryIdx].machineryId
+                        )
+                    )
                     BusinessManager.sendLoadingEventMsg(null, false)
                 }
             }
@@ -89,6 +108,7 @@ class TechnologySopFragment(val changePage: (PageChangeBO) -> Unit) :
 
     override fun refreshPage(pageChangeBO: PageChangeBO) {
         LogUtil.i("$pageChangeBO")
+        mWorkStationId = pageChangeBO.workstationId ?: -1L
         mBinding?.tvTitle?.text = pageChangeBO.machineryName
         presenter?.getMachineryPage(pageChangeBO.workstationId!!) {
             mMachineryList.clear()
@@ -113,7 +133,8 @@ class TechnologySopFragment(val changePage: (PageChangeBO) -> Unit) :
         } else {
             "-${mMachineryList[mMachineryIdx].sysDictDatas?.get(mSopTypeIdx)?.dictLabel}"
         }
-        mBinding?.tvSelected?.text = getString(R.string.current_sop, "${mBinding?.tvTitle?.text}$sopName$sopTypeName")
+        mBinding?.tvSelected?.text =
+            getString(R.string.current_sop, "${mBinding?.tvTitle?.text}$sopName$sopTypeName")
     }
 
     override fun initPresenter(): TechnologySopPresenter {

+ 43 - 21
app/src/main/java/com/grkj/iscs/view/fragment/WorkerFragment.kt

@@ -72,6 +72,10 @@ class WorkerFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> U
                     holder.setText(R.id.tv_name, data.userName)
                     holder.setOnClickListener(R.id.root) {
                         if (presenter?.colockerCanRemove(requireContext(), data, mStep) == true) {
+                            if (mColockerSelectedShowList.size == 1) {
+                                ToastUtils.tip(getString(R.string.keep_at_least_one_colocker))
+                                return@setOnClickListener
+                            }
                             // 共锁人取消
                             mSelectedList.removeIf { it.userId == data.userId }
                             mColockerSelectedShowList.removeIf { it.userId == data.userId }
@@ -79,6 +83,8 @@ class WorkerFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> U
                             mBinding?.rvColockerInside?.adapter?.notifyDataSetChanged()
                             mBinding?.rvColockerOutside?.adapter?.notifyDataSetChanged()
                             isColockerChanged = true
+                        } else {
+                            ToastUtils.tip(getString(R.string.can_not_remove_current_colocker))
                         }
                     }
                 }
@@ -147,24 +153,36 @@ class WorkerFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> U
                                 mStep
                             ) == true
                         ) {
+                            val addUser = TicketUserReqVO(
+                                user.userId!!,
+                                user.nickName!!,
+                                "0",
+                                USER_ROLE_COLOCKER,
+                                ticketUserVOList.find { ticketUser -> ticketUser.userId == user.userId }?.jobStatus
+                            )
                             // 内部共锁人选择
-                            if (mSelectedList.any { it.userId == user.userId }) {
+                            if (mSelectedList.any { it.userId == user.userId } &&
+                                presenter?.colockerCanRemove(
+                                    requireContext(),
+                                    addUser,
+                                    mStep
+                                ) == true
+                            ) {
+                                if (mColockerSelectedShowList.size == 1) {
+                                    ToastUtils.tip(getString(R.string.keep_at_least_one_colocker))
+                                    return@setOnClickListener
+                                }
                                 mSelectedList.removeIf { it.userId == user.userId }
                                 mColockerSelectedShowList.removeIf { it.userId == user.userId }
                             } else {
-                                val addUser = TicketUserReqVO(
-                                    user.userId!!,
-                                    user.nickName!!,
-                                    "0",
-                                    USER_ROLE_COLOCKER,
-                                    ticketUserVOList.find { ticketUser -> ticketUser.userId == user.userId }?.jobStatus
-                                )
                                 mSelectedList.add(addUser)
                                 mColockerSelectedShowList.add(addUser)
                             }
                             mBinding?.rvColockerSelected?.adapter?.notifyDataSetChanged()
                             mBinding?.rvColockerInside?.adapter?.notifyDataSetChanged()
                             isColockerChanged = true
+                        } else {
+                            ToastUtils.tip(getString(R.string.current_step_not_allowed_to_add_colocker))
                         }
                     }
                 }
@@ -187,24 +205,32 @@ class WorkerFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> U
                                 mStep
                             ) == true
                         ) {
+                            val addUser = TicketUserReqVO(
+                                user.userId!!,
+                                user.nickName!!,
+                                "1",
+                                USER_ROLE_COLOCKER,
+                                ticketUserVOList.find { ticketUser -> ticketUser.userId == user.userId }?.jobStatus
+                            )
                             // 外部共锁人选择
-                            if (mSelectedList.any { it.userId == user.userId }) {
+                            if (mSelectedList.any { it.userId == user.userId } &&
+                                presenter?.colockerCanRemove(
+                                    requireContext(),
+                                    addUser,
+                                    mStep
+                                ) == true
+                            ) {
                                 mSelectedList.removeIf { it.userId == user.userId }
                                 mColockerSelectedShowList.removeIf { it.userId == user.userId }
                             } else {
-                                val addUser = TicketUserReqVO(
-                                    user.userId!!,
-                                    user.nickName!!,
-                                    "1",
-                                    USER_ROLE_COLOCKER,
-                                    ticketUserVOList.find { ticketUser -> ticketUser.userId == user.userId }?.jobStatus
-                                )
                                 mSelectedList.add(addUser)
                                 mColockerSelectedShowList.add(addUser)
                             }
                             mBinding?.rvColockerSelected?.adapter?.notifyDataSetChanged()
                             mBinding?.rvColockerOutside?.adapter?.notifyDataSetChanged()
                             isColockerChanged = true
+                        } else {
+                            ToastUtils.tip(getString(R.string.current_step_not_allowed_to_add_colocker))
                         }
                     }
                 }
@@ -227,10 +253,6 @@ class WorkerFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> U
         mLockerList.clear()
         mColockerInsideList.clear()
         mColockerOutsideList.clear()
-        mBinding?.rvColockerSelected?.adapter?.notifyDataSetChanged()
-        mBinding?.rvLockerList?.adapter?.notifyDataSetChanged()
-        mBinding?.rvColockerInside?.adapter?.notifyDataSetChanged()
-        mBinding?.rvColockerOutside?.adapter?.notifyDataSetChanged()
 
         mBinding?.llLocker?.visibility = View.VISIBLE
         mBinding?.llColockerInside?.visibility = View.GONE
@@ -367,7 +389,7 @@ class WorkerFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> U
                 ToastUtils.tip(R.string.can_not_change_locker)
                 return false
             }
-            if (mStep >= 6) {
+            if (presenter?.canChangeColocker(requireContext(), mStep) == false) {
                 ToastUtils.tip(R.string.can_not_change_colocker)
                 return false
             }

+ 35 - 0
app/src/main/java/com/grkj/iscs/view/presenter/JobProgressPresenter.kt

@@ -325,4 +325,39 @@ class JobProgressPresenter : BasePresenter<IJobProgressView>() {
     ): Boolean {
         return IStepMode.getStepMode(context)?.showGoToUnlock(mPointList, mUserList) == true
     }
+
+    /**
+     * 是否需要显示待共锁
+     */
+    fun needShowReadyToLock(
+        context: Context,
+        mPointList: MutableList<TicketDetailMonitorRespVO.IsJobTicketPointsVO>,
+        mStep: Int
+    ): Boolean {
+        return IStepMode.getStepMode(context)?.needShowReadyToLock(mPointList, mStep) == true
+    }
+
+    /**
+     * 是否共锁人可以上锁
+     */
+    fun canHandleColockerLock(context: Context, mStep: Int): Boolean {
+        return IStepMode.getStepMode(context)?.canHandleColockerLock(mStep) == true
+    }
+
+    /**
+     * 是否共锁人可以解锁
+     */
+    fun canHandleColockerUnlock(context: Context, mStep: Int): Boolean {
+        return IStepMode.getStepMode(context)?.canHandleColockerUnlock(mStep) == true
+    }
+
+    /**
+     * 检查是否满足解锁条件
+     */
+    fun checkUnlock(
+        context: Context,
+        mUserList: MutableList<TicketDetailMonitorRespVO.IsJobTicketUser>
+    ): String? {
+        return IStepMode.getStepMode(context)?.checkUnlock(mUserList)
+    }
 }

+ 14 - 1
app/src/main/java/com/grkj/iscs/view/presenter/StepPresenter.kt

@@ -9,7 +9,6 @@ import com.grkj.iscs.model.vo.ticket.StepDetailRespVO
 import com.grkj.iscs.model.vo.ticket.TicketDetailRespVO
 import com.grkj.iscs.util.Executor
 import com.grkj.iscs.util.NetApi
-import com.grkj.iscs.util.SPUtils
 import com.grkj.iscs.util.ToastUtils
 import com.grkj.iscs.view.base.BasePresenter
 import com.grkj.iscs.view.iview.IStepView
@@ -106,4 +105,18 @@ class StepPresenter : BasePresenter<IStepView>() {
     ): String {
         return IStepMode.getStepMode(context)?.checkCanContinue(step, mTicketDetailData) ?: ""
     }
+
+    /**
+     * 检查是否自动跳转到作业进度页面
+     */
+    fun jumpJobProgressPageCheck(context: Context, step: Int): Boolean {
+        return IStepMode.getStepMode(context)?.jumpJobProgressPageCheck(step) == true
+    }
+
+    /**
+     * 检查弹窗是否需要进入进度页面
+     */
+    fun tipToJobProgressPageCheck(context: Context,mStep: Int, checked: () -> Unit) {
+        IStepMode.getStepMode(context)?.tipToJobProgressPageCheck(mStep,checked)
+    }
 }

+ 7 - 0
app/src/main/java/com/grkj/iscs/view/presenter/WorkerPresenter.kt

@@ -107,4 +107,11 @@ class WorkerPresenter : BasePresenter<IWorkerView>() {
     ) {
         IStepMode.getStepMode(context)?.checkStepJump(mStep, stepDetailList,jumpSuccess)
     }
+
+    /**
+     * 是否可以更换共锁人
+     */
+    fun canChangeColocker(context: Context, mStep: Int): Boolean {
+        return IStepMode.getStepMode(context)?.canChangeColocker(mStep) == true
+    }
 }

+ 42 - 0
app/src/main/java/com/grkj/iscs/view/step_mode/IStepMode.kt

@@ -19,6 +19,7 @@ interface IStepMode {
 
     /**
      * 是否可以移除共锁人
+     * step 正确步骤需要+1
      */
     fun colockerCanRemove(data: TicketUserReqVO, step: Int): Boolean
 
@@ -40,16 +41,19 @@ interface IStepMode {
 
     /**
      * 内部共锁人是否可以添加
+     * step 正确步骤需要+1
      */
     fun colockerInsideCanAdd(user: UserListRespVO.Row, mStep: Int): Boolean
 
     /**
      * 外部共锁人是否可以添加
+     * step 正确步骤需要+1
      */
     fun colockerOutsideCanAdd(user: UserListRespVO.Row, mStep: Int): Boolean
 
     /**
      * 根据步骤检查是否需要跳转
+     * step 正确步骤需要+1
      */
     fun checkStepJump(
         mStep: Int,
@@ -57,6 +61,44 @@ interface IStepMode {
         jumpSuccess: () -> Unit
     )
 
+    /**
+     * 检查是否自动跳转到进度界面
+     */
+    fun jumpJobProgressPageCheck(step: Int): Boolean
+
+    /**
+     * 是否需要显示待共锁
+     */
+    fun needShowReadyToLock(
+        mPointList: MutableList<TicketDetailMonitorRespVO.IsJobTicketPointsVO>,
+        mStep: Int
+    ): Boolean
+
+    /**
+     * 是否可以处理共锁人上锁
+     */
+    fun canHandleColockerLock(mStep: Int): Boolean
+
+    /**
+     * 是否共锁人可以解锁
+     */
+    fun canHandleColockerUnlock(mStep: Int): Boolean
+
+    /**
+     * 是否满足解锁条件
+     */
+    fun checkUnlock(mUserList: MutableList<TicketDetailMonitorRespVO.IsJobTicketUser>): String
+
+    /**
+     * 是否可以更换共锁人
+     */
+    fun canChangeColocker(mStep: Int): Boolean
+
+    /**
+     * 检查提示弹窗是否进入进度详情界面
+     */
+    fun tipToJobProgressPageCheck(mStep: Int, checked: () -> Unit)
+
     companion object {
         /**
          * 根据存储的模式获取模式

+ 33 - 2
app/src/main/java/com/grkj/iscs/view/step_mode/StepMode1.kt

@@ -1,18 +1,18 @@
 package com.grkj.iscs.view.step_mode
 
-import android.content.Context
 import com.grkj.iscs.model.vo.ticket.StepDetailRespVO
 import com.grkj.iscs.model.vo.ticket.TicketDetailMonitorRespVO
 import com.grkj.iscs.model.vo.ticket.TicketDetailRespVO
 import com.grkj.iscs.model.vo.ticket.TicketUserReqVO
 import com.grkj.iscs.model.vo.user.UserListRespVO
+import com.grkj.iscs.util.log.LogUtil
 
 /**
  * 模式1
  */
 class StepMode1 : IStepMode {
     override fun canModifyColocker(step: Int): Boolean {
-        return step > 5
+        return step <= 5
     }
 
     override fun colockerCanRemove(data: TicketUserReqVO, step: Int): Boolean {
@@ -50,4 +50,35 @@ class StepMode1 : IStepMode {
     ) {
         jumpSuccess()
     }
+
+    override fun jumpJobProgressPageCheck(step: Int): Boolean {
+        return step == 4 || step == 6 || step == 7
+    }
+
+    override fun needShowReadyToLock(
+        mPointList: MutableList<TicketDetailMonitorRespVO.IsJobTicketPointsVO>,
+        mStep: Int
+    ): Boolean {
+        return mStep >= 6
+    }
+
+    override fun canHandleColockerLock(mStep: Int): Boolean {
+        return mStep == 6
+    }
+
+    override fun canHandleColockerUnlock(mStep: Int): Boolean {
+        return mStep == 6
+    }
+
+    override fun checkUnlock(mUserList: MutableList<TicketDetailMonitorRespVO.IsJobTicketUser>): String {
+        return ""
+    }
+
+    override fun canChangeColocker(mStep: Int): Boolean {
+        return mStep < 6
+    }
+
+    override fun tipToJobProgressPageCheck(mStep: Int, checked: () -> Unit) {
+        LogUtil.i("模式1不进入")
+    }
 }

+ 61 - 14
app/src/main/java/com/grkj/iscs/view/step_mode/StepMode2.kt

@@ -3,6 +3,7 @@ package com.grkj.iscs.view.step_mode
 import androidx.core.content.ContextCompat
 import com.grkj.iscs.MyApplication
 import com.grkj.iscs.R
+import com.grkj.iscs.model.Constants
 import com.grkj.iscs.model.vo.ticket.StepDetailRespVO
 import com.grkj.iscs.model.vo.ticket.TicketDetailMonitorRespVO
 import com.grkj.iscs.model.vo.ticket.TicketDetailRespVO
@@ -17,7 +18,7 @@ class StepMode2 : IStepMode {
     }
 
     override fun colockerCanRemove(data: TicketUserReqVO, step: Int): Boolean {
-        return when (step) {
+        return when (step + 1) {
             3, 4 -> {
                 true
             }
@@ -36,24 +37,26 @@ class StepMode2 : IStepMode {
 
     override fun checkCanContinue(step: Int, mTicketDetailData: TicketDetailRespVO?): String {
         return when (step) {
-            6 -> {
-                if (mTicketDetailData?.ticketUserVOList?.all { it.jobStatus!! >= 4 } == true) {
+            5 -> {
+                if (mTicketDetailData?.ticketUserVOList?.filter { it.userRole == Constants.USER_ROLE_COLOCKER }
+                        ?.all { it.jobStatus!! >= 4 } == true) {
                     ""
                 } else {
                     ContextCompat.getString(
                         MyApplication.instance?.applicationContext!!,
-                        R.string.please_wait_all_colocker_locked
+                        R.string.please_done_lock_action_and_colock_action
                     )
                 }
             }
 
             8 -> {
-                if (mTicketDetailData?.ticketUserVOList?.all { it.jobStatus!! == 5 } == true && mTicketDetailData.ticketPointsVOList?.all { it.pointStatus == "2" } == true) {
+                if (mTicketDetailData?.ticketUserVOList?.filter { it.userRole == Constants.USER_ROLE_COLOCKER }
+                        ?.all { it.jobStatus!! == 5 } == true && mTicketDetailData.ticketPointsVOList?.all { it.pointStatus == "2" } == true) {
                     ""
                 } else {
                     ContextCompat.getString(
                         MyApplication.instance?.applicationContext!!,
-                        R.string.please_wait_all_colocker_and_points_unlocked
+                        R.string.please_done_all_unlock_action
                     )
                 }
             }
@@ -70,7 +73,7 @@ class StepMode2 : IStepMode {
     }
 
     override fun colockerInsideCanAdd(user: UserListRespVO.Row, mStep: Int): Boolean {
-        return when (mStep) {
+        return when (mStep + 1) {
             3, 4, 5, 6, 7 -> {
                 true
             }
@@ -80,7 +83,7 @@ class StepMode2 : IStepMode {
     }
 
     override fun colockerOutsideCanAdd(user: UserListRespVO.Row, mStep: Int): Boolean {
-        return when (mStep) {
+        return when (mStep + 1) {
             3, 4, 5, 6, 7 -> {
                 true
             }
@@ -94,23 +97,67 @@ class StepMode2 : IStepMode {
         stepDetailList: MutableList<StepDetailRespVO>,
         jumpSuccess: () -> Unit
     ) {
-        if (mStep < 8) {
+        if (mStep + 1 < 8) {
             //循环将前面的步骤状态重置,直到第五步
-            fun stepBack(step: Int) {
-                if (step > 5) {
+            fun stepBack(step: Int, onSuccess: () -> Unit) {
+                //因为step从0开始,所以要减一
+                if (step > 4) {
                     stepDetailList.find { it.stepIndex == step }?.stepId?.let {
                         NetApi.updateStep(it, "0") { success ->
                             if (success) {
-                                stepBack(step - 1)
+                                stepBack(step - 1, onSuccess)
                             } else {
                                 LogUtil.i("重置步骤 ${step} 失败")
                             }
                         }
                     }
+                } else {
+                    onSuccess()
                 }
             }
-            stepBack(mStep)
-            jumpSuccess()
+            stepBack(mStep) {
+                jumpSuccess()
+            }
+        }
+    }
+
+    override fun jumpJobProgressPageCheck(step: Int): Boolean {
+        return step == 4 || step == 7
+    }
+
+    override fun needShowReadyToLock(
+        mPointList: MutableList<TicketDetailMonitorRespVO.IsJobTicketPointsVO>,
+        mStep: Int
+    ): Boolean {
+        return (mStep >= 4 && mPointList.all { it.pointStatus == "1" }) || mStep >= 6
+    }
+
+    override fun canHandleColockerLock(mStep: Int): Boolean {
+        return mStep == 4 || mStep == 5
+    }
+
+    override fun canHandleColockerUnlock(mStep: Int): Boolean {
+        return mStep == 7
+    }
+
+    override fun checkUnlock(mUserList: MutableList<TicketDetailMonitorRespVO.IsJobTicketUser>): String {
+        return if (mUserList.all { it.jobStatus!! >= 5 } == true) {
+            ""
+        } else {
+            ContextCompat.getString(
+                MyApplication.instance?.applicationContext!!,
+                R.string.please_wait_all_colocker_unlocked
+            )
+        }
+    }
+
+    override fun canChangeColocker(mStep: Int): Boolean {
+        return mStep < 7
+    }
+
+    override fun tipToJobProgressPageCheck(mStep: Int, checked: () -> Unit) {
+        if (mStep == 4 || mStep == 7) {
+            checked()
         }
     }
 }

+ 11 - 1
app/src/main/java/com/grkj/iscs/view/widget/CustomMarkLayer.kt

@@ -4,8 +4,10 @@ import android.graphics.Canvas
 import android.graphics.Color
 import android.graphics.Matrix
 import android.graphics.Paint
+import android.os.Handler
 import android.util.Pair
 import android.view.MotionEvent
+import com.grkj.iscs.util.log.LogUtil
 import com.grkj.iscs.view.fragment.WorkshopFragment.CustomPoint
 import com.onlylemi.mapview.library.MapView
 import com.onlylemi.mapview.library.layer.MapBaseLayer
@@ -27,6 +29,7 @@ class CustomMarkLayer @JvmOverloads constructor(
     private var currentDegree = 0f
     private var mBitmapSize = 60    // 默认图标大小
     private var isClickIcon: Boolean = false
+    private var isFirst: Boolean = true
 
     init {
         num = -1
@@ -141,6 +144,8 @@ class CustomMarkLayer @JvmOverloads constructor(
         this.currentZoom = currentZoom
         currentDegree = 360 - currentRotateDegrees
         if (isVisible) {
+            LogUtil.i("Map Size: ${mapView.width},${mapView.height}")
+            LogUtil.i("Canvas Size: ${canvas.width},${canvas.height}")
             canvas.save()
             if (pointList.isNotEmpty()) {
                 pointList.forEach { point ->
@@ -201,7 +206,8 @@ class CustomMarkLayer @JvmOverloads constructor(
                             )
 
                             // 计算序号背景的位置和大小
-                            val numberText = if (point.ticketList.size > 3 && j == list.size - 1) "${j + 1}+" else (j + 1).toString()
+                            val numberText =
+                                if (point.ticketList.size > 3 && j == list.size - 1) "${j + 1}+" else (j + 1).toString()
                             val numberWidth = paint.measureText(numberText)
                             val numberHeight = paint.fontMetrics.descent - paint.fontMetrics.ascent
                             val numberRectLeft = ticketX + mBitmapSize / 2 - radiusMark / 4.0f * 3
@@ -238,6 +244,10 @@ class CustomMarkLayer @JvmOverloads constructor(
 
             canvas.restore()
         }
+        if (isFirst) {
+            isFirst = false
+            mapView.postInvalidateDelayed(80)
+        }
     }
 
     private fun rotatePoint(

+ 1 - 0
app/src/main/res/layout/dialog_tip.xml

@@ -10,6 +10,7 @@
         android:layout_height="@dimen/dialog_tip_height">
 
         <TextView
+            android:id="@+id/tv_title"
             style="@style/CommonTextView"
             android:layout_width="match_parent"
             android:background="@color/main_color"

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

@@ -8,7 +8,7 @@
     <string name="common_net_timeout">Network request timeout, please check your network connection and try again!</string>
 
     <string name="title_bar_current_work_ticket_num">Current permits: %d</string>
-    <string name="home_page">Home</string>                                                                          
+    <string name="home_page">Home</string>
 
     <string name="enter_system">Enter System</string>
 
@@ -314,10 +314,20 @@
     <string name="ticket_processing">operation in progress</string>
     <string name="has_no_point_can_unlock">has no point can unlock</string>
     <string name="all_point_already_locked">all point already locked</string>
-    <string name="please_wait_all_colocker_locked">please wait all colocker locked</string>
-    <string name="please_wait_all_colocker_and_points_unlocked">please wait all colocker and points unlocked</string>
+    <string name="please_done_lock_action_and_colock_action">please done lock action and colock action</string>
+    <string name="please_done_all_unlock_action">please done all unlock action</string>
     <string name="step_mode_select">select step mode</string>
     <string name="mode_one">mode 1</string>
     <string name="mode_two">mode 2</string>
     <string name="step_mode_change_success">step mode change success</string>
+    <string name="user_not_found">user not found</string>
+    <string name="user_already_unlock">user already unlock</string>
+    <string name="please_wait_all_colocker_unlocked">please wait all colocker unlocked</string>
+    <string name="current_colocker_already_locked">current colocker already locked</string>
+    <string name="current_colocker_already_unlocked">current colocker already unlocked</string>
+    <string name="can_not_remove_current_colocker">can not remove current colocker</string>
+    <string name="current_step_not_allowed_to_add_colocker">current step not allowed to add colocker</string>
+    <string name="keep_at_least_one_colocker">keep at least one colocker</string>
+    <string name="action_hint">action hint</string>
+    <string name="take_one_more_key_hint">I have already taken out the key, would you like to take out another one</string>
 </resources>

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

@@ -314,10 +314,20 @@
     <string name="ticket_processing">进行中的作业</string>
     <string name="has_no_point_can_unlock">暂无隔离点可以解锁</string>
     <string name="all_point_already_locked">所有隔离点已上锁</string>
-    <string name="please_wait_all_colocker_locked">请等待所有共锁人上锁</string>
-    <string name="please_wait_all_colocker_and_points_unlocked">请等待所有共锁人和隔离点解锁</string>
+    <string name="please_done_lock_action_and_colock_action">请完成上锁和共锁操作</string>
+    <string name="please_done_all_unlock_action">请完成所有解锁操作</string>
     <string name="step_mode_select">选择流程模式</string>
     <string name="mode_one">模式1</string>
     <string name="mode_two">模式2</string>
     <string name="step_mode_change_success">流程模式切换成功</string>
+    <string name="user_not_found">当前用户不存在</string>
+    <string name="user_already_unlock">用户已解锁</string>
+    <string name="please_wait_all_colocker_unlocked">请等待所有共锁人完成解锁</string>
+    <string name="current_colocker_already_locked">当前共锁人已上锁</string>
+    <string name="current_colocker_already_unlocked">当前共锁人已解锁</string>
+    <string name="can_not_remove_current_colocker">无法移除当前共锁人</string>
+    <string name="current_step_not_allowed_to_add_colocker">当前步骤不允许添加共锁人</string>
+    <string name="keep_at_least_one_colocker">至少保留一位共锁人</string>
+    <string name="action_hint">操作提醒</string>
+    <string name="take_one_more_key_hint">已有钥匙取出,是否再取一个</string>
 </resources>

+ 2 - 0
app/src/main/res/values/colors.xml

@@ -32,6 +32,8 @@
     <color name="lock_status_locked">#CCFF0000</color>
     <color name="point_text_bg">#70b26f</color>
 
+    <color name="tip_dialog_hint_color">#E55765</color>
+
     <color name="item_rv_step_bg_done">#1d7153</color>
     <color name="item_rv_step_bg_doing">#838a53</color>
     <color name="item_rv_step_bg_ready">#B3FFFFFF</color>

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

@@ -314,10 +314,20 @@
     <string name="ticket_processing">进行中的作业</string>
     <string name="has_no_point_can_unlock">暂无隔离点可以解锁</string>
     <string name="all_point_already_locked">所有隔离点已上锁</string>
-    <string name="please_wait_all_colocker_locked">请等待所有共锁人上锁</string>
-    <string name="please_wait_all_colocker_and_points_unlocked">请等待所有共锁人和隔离点解锁</string>
+    <string name="please_done_lock_action_and_colock_action">请完成上锁和共锁操作</string>
+    <string name="please_done_all_unlock_action">请完成所有解锁操作</string>
     <string name="step_mode_select">选择流程模式</string>
     <string name="mode_one">模式1</string>
     <string name="mode_two">模式2</string>
     <string name="step_mode_change_success">流程模式切换成功</string>
+    <string name="user_not_found">当前用户不存在</string>
+    <string name="user_already_unlock">用户已解锁</string>
+    <string name="please_wait_all_colocker_unlocked">请等待所有共锁人完成解锁</string>
+    <string name="current_colocker_already_locked">当前共锁人已上锁</string>
+    <string name="current_colocker_already_unlocked">当前共锁人已解锁</string>
+    <string name="can_not_remove_current_colocker">无法移除当前共锁人</string>
+    <string name="current_step_not_allowed_to_add_colocker">当前步骤不允许添加共锁人</string>
+    <string name="keep_at_least_one_colocker">至少保留一位共锁人</string>
+    <string name="action_hint">操作提醒</string>
+    <string name="take_one_more_key_hint">已有钥匙取出,是否再取一个</string>
 </resources>