소스 검색

工作票操作逻辑临时提交

Frankensteinly 11 달 전
부모
커밋
1b9ca55c13

+ 14 - 6
app/src/main/java/com/grkj/iscs/activity/TicketDetailActivity.kt

@@ -1,9 +1,14 @@
 package com.grkj.iscs.activity
 
+import com.google.gson.GsonBuilder
+import com.grkj.iscs.R
 import com.grkj.iscs.base.BaseMvpActivity
 import com.grkj.iscs.databinding.ActivityTicketDetailBinding
 import com.grkj.iscs.iview.ITicketDetailView
+import com.grkj.iscs.model.vo.ticket.TicketDetailRespVO
 import com.grkj.iscs.presenter.TicketDetailPresenter
+import com.grkj.iscs.util.SPUtils
+import com.grkj.iscs.util.ToastUtils
 
 /**
  * 作业票详情页
@@ -11,21 +16,24 @@ import com.grkj.iscs.presenter.TicketDetailPresenter
 class TicketDetailActivity :
     BaseMvpActivity<ITicketDetailView, TicketDetailPresenter, ActivityTicketDetailBinding>() {
 
+    private var ticketDetail: TicketDetailRespVO? = null
+
     override val viewBinding: ActivityTicketDetailBinding
         get() = ActivityTicketDetailBinding.inflate(layoutInflater)
 
     override fun initView() {
-        val ticketId = intent.getLongExtra("ticketId", -1)
-        if (ticketId == -1L) {
-            return
-        }
+        val ticketId = intent.getStringExtra("ticketId") ?: return
 
-        presenter?.getTicketDetail(ticketId) {
-            mBinding?.tvDetail?.text = it.toString()
+        presenter?.getTicketDetail(ticketId.toLong()) {
+            mBinding?.tvDetail?.text = GsonBuilder().setPrettyPrinting().create().toJson(it)
         }
 
         mBinding?.btnAction?.setOnClickListener {
+            presenter?.doAction(ticketDetail)
+        }
 
+        mBinding?.btnExit?.setOnClickListener {
+            finish()
         }
     }
 

+ 3 - 0
app/src/main/java/com/grkj/iscs/modbus/ModBusController.kt

@@ -477,6 +477,9 @@ object ModBusController {
      */
     fun getLocks(needLockCount: Int): MutableMap<Byte, MutableList<DockBean.LockBean>> {
         val map = mutableMapOf<Byte, MutableList<DockBean.LockBean>>()
+        if (needLockCount == 0) {
+            return map
+        }
         val lockDockList = dockList.filter { it.type == DOCK_TYPE_LOCK || it.type == DOCK_TYPE_PORTABLE }
 
         var provideCount = 0

+ 12 - 0
app/src/main/java/com/grkj/iscs/model/Constants.kt

@@ -4,6 +4,9 @@ object Constants {
     const val PERMISSION_REQUEST_CODE = 1
     const val BLE_LOCAL_NAME = "keyLock"
 
+    const val USER_TYPE_LOCKER = "0"                // 上锁人
+    const val USER_TYPE_COLOCKER = "1"              // 共锁人
+
     /**************************  角色  **************************/
     const val USER_ROLE_DRAWER = "jtdrawer"         // 作业管理员/开票人
     const val USER_ROLE_LOCKER = "jtlocker"         // 作业负责人/上锁人
@@ -17,4 +20,13 @@ object Constants {
     const val TICKET_STATUS_READY_TO_UNLOCK = "3"     // 待解锁
     const val TICKET_STATUS_UNLOCKED = "4"            // 已解锁
     const val TICKET_STATUS_FINISHED = "5"            // 已结束
+
+    /*************************  工作状态——上锁人包含0-5,共锁人包含0、4、5  *************************/
+
+    const val JOB_STATUS_NOT_STARTED = 0            // 未开始
+    const val JOB_STATUS_ACQUIRE_LOCK = 1           // 取锁具
+    const val JOB_STATUS_ACQUIRE_KEY = 2            // 取钥匙
+    const val JOB_STATUS_READY_TO_LOCK = 3          // 待上锁
+    const val JOB_STATUS_READY_TO_UNLOCK = 4        // 已上锁
+    const val JOB_STATUS_UNLOCKED = 5               // 已解锁
 }

+ 106 - 1
app/src/main/java/com/grkj/iscs/presenter/TicketDetailPresenter.kt

@@ -5,8 +5,19 @@ import com.grkj.iscs.R
 import com.grkj.iscs.base.BasePresenter
 import com.grkj.iscs.iview.ITicketDetailView
 import com.grkj.iscs.modbus.ModBusController
+import com.grkj.iscs.model.Constants.JOB_STATUS_ACQUIRE_KEY
+import com.grkj.iscs.model.Constants.JOB_STATUS_ACQUIRE_LOCK
+import com.grkj.iscs.model.Constants.JOB_STATUS_NOT_STARTED
+import com.grkj.iscs.model.Constants.JOB_STATUS_READY_TO_LOCK
+import com.grkj.iscs.model.Constants.JOB_STATUS_READY_TO_UNLOCK
+import com.grkj.iscs.model.Constants.JOB_STATUS_UNLOCKED
+import com.grkj.iscs.model.Constants.USER_TYPE_COLOCKER
+import com.grkj.iscs.model.Constants.USER_TYPE_LOCKER
 import com.grkj.iscs.model.vo.ticket.TicketDetailRespVO
+import com.grkj.iscs.model.vo.ticket.TicketEquipDetailRespVO
+import com.grkj.iscs.util.Executor
 import com.grkj.iscs.util.NetApi
+import com.grkj.iscs.util.SPUtils
 import com.grkj.iscs.util.ToastUtils
 
 class TicketDetailPresenter : BasePresenter<ITicketDetailView>() {
@@ -19,7 +30,9 @@ class TicketDetailPresenter : BasePresenter<ITicketDetailView>() {
             return
         }
         NetApi.getTicketDetail(ticketId) {
-            callBack.invoke(it)
+            Executor.runOnMain {
+                callBack.invoke(it)
+            }
         }
     }
 
@@ -42,4 +55,96 @@ class TicketDetailPresenter : BasePresenter<ITicketDetailView>() {
             }
         }
     }
+
+    fun doAction(vo: TicketDetailRespVO?) {
+        val loginUser = SPUtils.getLoginUser(mContext!!)
+        if (loginUser == null || loginUser.userId == 0L) {
+            ToastUtils.tip(R.string.please_login)
+            return
+        }
+
+        if (vo?.ticketId == null) {
+            return
+        }
+
+        val roleList = vo.jobTicketUserList?.filter { it.userId == loginUser.userId }
+
+        // 都判断,防止身兼数职
+        if (roleList?.any { it.userType == USER_TYPE_LOCKER } == true) {
+            NetApi.getTicketEquipDetail(vo.ticketId) {
+                if (it == null) {
+                    return@getTicketEquipDetail
+                }
+                doLockAction(loginUser.userId!!, vo, it)
+            }
+        }
+        if (roleList?.any { it.userType == USER_TYPE_COLOCKER } == true) {
+            NetApi.getTicketEquipDetail(vo.ticketId) {
+                if (it == null) {
+                    return@getTicketEquipDetail
+                }
+                doCoLockerAction(loginUser.userId!!, vo, it)
+            }
+        }
+    }
+
+    /**
+     * 上锁人操作
+     */
+    private fun doLockAction(userId: Long, ticketDetail: TicketDetailRespVO, equipDetail: TicketEquipDetailRespVO) {
+        val role = ticketDetail.jobTicketUserList?.find { it.userId == userId && it.userType == USER_TYPE_LOCKER }
+        if (role == null) {
+            return
+        }
+
+        when(role.jobStatus) {
+            JOB_STATUS_NOT_STARTED -> {
+                // TODO 取锁具、取钥匙
+                val needLockCount = equipDetail.ticketLockVOList?.filter { it.lockId == null }?.size ?: 0
+                BusinessManager.checkEquipCount(needLockCount) { keyPair, lockMap ->
+                    // 机柜锁具数量不够
+                    if (keyPair == null) {
+
+                    }
+                }
+
+            }
+            JOB_STATUS_ACQUIRE_LOCK -> {
+                // TODO
+            }
+            JOB_STATUS_ACQUIRE_KEY -> {
+                // TODO
+            }
+            JOB_STATUS_READY_TO_LOCK -> {
+                // TODO 不用做
+            }
+            JOB_STATUS_READY_TO_UNLOCK -> {
+                // TODO 弹框,由钥匙工作票自动更新
+            }
+            JOB_STATUS_UNLOCKED -> {
+                ToastUtils.tip(R.string.ticket_is_locker_part_finished)
+            }
+        }
+    }
+
+    /**
+     * 共锁人操作
+     */
+    private fun doCoLockerAction(userId: Long, ticketDetail: TicketDetailRespVO, equipDetail: TicketEquipDetailRespVO) {
+        val role = ticketDetail.jobTicketUserList?.find { it.userId == userId && it.userType == USER_TYPE_COLOCKER }
+        if (role == null) {
+            return
+        }
+        when(role.jobStatus) {
+            JOB_STATUS_NOT_STARTED -> {
+                // TODO 调用更新接口
+            }
+            JOB_STATUS_READY_TO_UNLOCK -> {
+                // TODO 调用更新接口
+            }
+            JOB_STATUS_UNLOCKED -> {
+                ToastUtils.tip(R.string.ticket_is_colocker_part_finished)
+            }
+        }
+    }
 }

+ 17 - 5
app/src/main/res/layout/activity_ticket_detail.xml

@@ -5,17 +5,29 @@
     android:id="@+id/main"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical"
+    android:orientation="horizontal"
     tools:context=".activity.TicketDetailActivity">
 
-    <TextView
-        android:id="@+id/tv_detail"
-        style="@style/CommonTextView"
-        android:textColor="@color/main_color" />
+    <androidx.core.widget.NestedScrollView
+        android:layout_width="320dp"
+        android:layout_height="match_parent"
+        android:overScrollMode="never">
+
+        <TextView
+            android:id="@+id/tv_detail"
+            android:layout_height="wrap_content"
+            android:layout_width="wrap_content"
+            android:textColor="@color/main_color" />
+    </androidx.core.widget.NestedScrollView>
 
     <Button
         android:id="@+id/btn_action"
         style="@style/CommonBtn"
         android:text="操作" />
 
+    <Button
+        android:id="@+id/btn_exit"
+        style="@style/CommonBtn"
+        android:text="@string/exit" />
+
 </LinearLayout>

+ 4 - 0
app/src/main/res/values/strings.xml

@@ -62,6 +62,10 @@
     <string name="key_is_not_enough">钥匙数量不足</string>
     <string name="get_key_info_fail">获取钥匙信息失败</string>
 
+    <string name="ticket_is_finished">工作票已完成</string>
+    <string name="ticket_is_locker_part_finished">工作票上锁人部分已完成</string>
+    <string name="ticket_is_colocker_part_finished">工作票共锁人部分已完成</string>
+
     <!--  演示页  -->
     <string name="presentation_select_sop">选择SOP</string>
     <string name="presentation_select_workshop">选择车间</string>