Przeglądaj źródła

refactor(更新)
- 作业详情完成

周文健 5 miesięcy temu
rodzic
commit
04d1cb50ea

BIN
app/src/main/assets/data.db


+ 0 - 1
app/src/main/java/com/grkj/iscs/common/DataTransferConstants.kt

@@ -42,5 +42,4 @@ object DataTransferConstants {
      * SOP作业需要再携带SopId
      */
     const val KEY_JOB_TICKET_ID = "key_job_ticket_id"
-    const val KEY_EDIT_SOP_JOB_SOP_ID = "key_edit_sop_job_sop_id"
 }

+ 3 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectMemberFragment.kt

@@ -101,7 +101,9 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
             } else {
                 item.isSelected = true
                 if (isLockerSelect) {
-                    selectedLockerData.onEach { it.isSelected = false }.clear()
+                    viewModel.userData.filter { it.userId in selectedLockerData.map { it.userId } }
+                        .forEach { it.isSelected = false }
+                    selectedLockerData.clear()
                     selectedLockerData.add(item)
                 } else {
                     selectedColockerData.add(item)

+ 49 - 134
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt

@@ -3,6 +3,7 @@ package com.grkj.iscs.features.main.fragment.job_manage
 import android.widget.LinearLayout
 import androidx.core.view.isVisible
 import androidx.lifecycle.ViewModelProvider
+import androidx.navigation.NavOptions
 import com.drake.brv.BindingAdapter
 import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
@@ -14,7 +15,7 @@ import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
-import com.grkj.iscs.databinding.FragmentCreateJobBinding
+import com.grkj.iscs.databinding.FragmentEditJobBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
@@ -27,17 +28,11 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
-import com.sik.sikcore.thread.ThreadUtils
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.async
-import kotlinx.coroutines.withContext
-import kotlin.coroutines.resume
-import kotlin.coroutines.suspendCoroutine
 
 /**
  * 编辑作业
  */
-class EditJobFragment : BaseFragment<FragmentCreateJobBinding>() {
+class EditJobFragment : BaseFragment<FragmentEditJobBinding>() {
     private val viewModel: JobViewModel by lazy { ViewModelProvider(this)[JobViewModel::class] }
     private var selectedLockMode: String? = null
     private var selectedWorkstationId: Long? = null
@@ -46,7 +41,7 @@ class EditJobFragment : BaseFragment<FragmentCreateJobBinding>() {
     private var selectedColockerData: List<UserManageVo> = mutableListOf()
     private lateinit var textDropDownDialog: TextDropDownDialog
     override fun getLayoutId(): Int {
-        return R.layout.fragment_create_job
+        return R.layout.fragment_edit_job
     }
 
     override fun initView() {
@@ -62,6 +57,20 @@ class EditJobFragment : BaseFragment<FragmentCreateJobBinding>() {
                     navController.popBackStack()
                 })
         }
+        binding.startJob.setDebouncedClickListener {
+            if (checkData()) {
+                TipDialog.show(
+                    title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_hint).toString(),
+                    msg = CommonUtils.getStr(R.string.start_job_check).toString(),
+                    dialogType = TipDialog.DialogType.INFO,
+                    countDownTime = 10,
+                    onConfirmClick = {
+                        viewModel.startJob().observe(this) {
+                            navController.navigate(R.id.action_editJobFragment_to_jobExecuteFragment)
+                        }
+                    })
+            }
+        }
         binding.cancel.setDebouncedClickListener {
             TipDialog.show(
                 title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_hint).toString(),
@@ -83,16 +92,7 @@ class EditJobFragment : BaseFragment<FragmentCreateJobBinding>() {
                     dialogType = TipDialog.DialogType.INFO,
                     countDownTime = 10,
                     onConfirmClick = {
-                        ThreadUtils.runOnIO {
-                            val sopId = if (binding.saveSop.isChecked) {
-                                async { saveSop() }
-                            } else {
-                                null
-                            }
-                            withContext(Dispatchers.Main) {
-                                saveJob(sopId?.await())
-                            }
-                        }
+                        saveJob(null)
                     })
             }
         }
@@ -102,72 +102,6 @@ class EditJobFragment : BaseFragment<FragmentCreateJobBinding>() {
         binding.lockModeTv.setOnClickListener {
             setLockModeData()
         }
-        binding.noSelectedPointLayout.setDebouncedClickListener {
-            if (selectedWorkstationId == null) {
-                PopTip.tip(R.string.please_select_job_workstation)
-                return@setDebouncedClickListener
-            }
-            GlobalDataTempStore.getInstance()
-                .saveData(
-                    DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID,
-                    selectedWorkstationId!!
-                )
-            GlobalDataTempStore.getInstance()
-                .saveData(DataTransferConstants.KEY_SELECTED_POINT_DATA, selectedPointData)
-            GlobalDataTempStore.getInstance()
-                .saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
-                    CommonUtils.getStr(R.string.create_job_title).toString()
-                )
-            GlobalDataTempStore.getInstance()
-                .saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
-                    R.mipmap.icon_data_manage_menu_point_manage
-                )
-            navController.navigate(R.id.action_createJobFragment_to_selectPointFragment)
-        }
-        binding.noSelectedMemberLayout.setDebouncedClickListener {
-            if (selectedWorkstationId == null) {
-                PopTip.tip(R.string.please_select_job_workstation)
-                return@setDebouncedClickListener
-            }
-            if (selectedLockMode == null) {
-                PopTip.tip(R.string.please_select_lock_mode)
-                return@setDebouncedClickListener
-            }
-            GlobalDataTempStore.getInstance().saveData(
-                DataTransferConstants.KEY_CAN_SELECT_COLOCKER, selectedLockMode?.contains(
-                    LockStepEnum.COLOCK.type.toString()
-                ) == true
-            )
-            GlobalDataTempStore.getInstance()
-                .saveData(
-                    DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID,
-                    selectedWorkstationId!!
-                )
-            GlobalDataTempStore.getInstance()
-                .saveData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA, selectedLockerData)
-            GlobalDataTempStore.getInstance()
-                .saveData(
-                    DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA,
-                    selectedColockerData
-                )
-            GlobalDataTempStore.getInstance().saveData(
-                DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA,
-                selectedColockerData
-            )
-            GlobalDataTempStore.getInstance()
-                .saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
-                    CommonUtils.getStr(R.string.create_job_title).toString()
-                )
-            GlobalDataTempStore.getInstance()
-                .saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
-                    R.mipmap.icon_data_manage_menu_point_manage
-                )
-            navController.navigate(R.id.action_createJobFragment_to_selectMemberFragment)
-        }
         binding.selectPointTv.setDebouncedClickListener {
             if (selectedWorkstationId == null) {
                 PopTip.tip(R.string.please_select_job_workstation)
@@ -190,7 +124,7 @@ class EditJobFragment : BaseFragment<FragmentCreateJobBinding>() {
                     DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
                     R.mipmap.icon_data_manage_menu_point_manage
                 )
-            navController.navigate(R.id.action_createJobFragment_to_selectPointFragment)
+            navController.navigate(R.id.action_editJobFragment_to_selectPointFragment)
         }
         binding.selectMemberTv.setDebouncedClickListener {
             if (selectedWorkstationId == null) {
@@ -221,14 +155,14 @@ class EditJobFragment : BaseFragment<FragmentCreateJobBinding>() {
             GlobalDataTempStore.getInstance()
                 .saveData(
                     DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
-                    CommonUtils.getStr(R.string.create_job_title).toString()
+                    CommonUtils.getStr(R.string.edit_job_title).toString()
                 )
             GlobalDataTempStore.getInstance()
                 .saveData(
                     DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
                     R.mipmap.icon_data_manage_menu_point_manage
                 )
-            navController.navigate(R.id.action_createJobFragment_to_selectMemberFragment)
+            navController.navigate(R.id.action_editJobFragment_to_selectMemberFragment)
         }
         binding.pointRv.grid(6).setup {
             addType<PointManageVo>(R.layout.item_select_point)
@@ -244,39 +178,19 @@ class EditJobFragment : BaseFragment<FragmentCreateJobBinding>() {
         }
     }
 
-    /**
-     * 保存sop
-     */
-    private suspend fun saveSop(): Long {
-        val sopId = suspendCoroutine<Long> { cont ->
-            ThreadUtils.runOnMain {
-                viewModel.saveSop(
-                    selectedPointData,
-                    selectedLockerData,
-                    selectedColockerData,
-                    selectedLockMode,
-                    selectedWorkstationId!!,
-                    binding.jobNameEt.text.toString()
-                ).observe(this@EditJobFragment) {
-                    cont.resume(it)
-                }
-            }
-        }
-        return sopId
-    }
-
     /**
      * 保存作业
      */
     private fun saveJob(sopId: Long?) {
-        viewModel.createJob(
+        viewModel.saveJob(
             selectedPointData,
             selectedLockerData,
             selectedColockerData,
             selectedLockMode,
             sopId,
             selectedWorkstationId!!,
-            binding.jobNameEt.text.toString()
+            binding.jobNameEt.text.toString(),
+            viewModel.jobTicketData?.ticketId ?: 0
         ).observe(this) {
             if (it) {
                 TipDialog.show(
@@ -284,12 +198,6 @@ class EditJobFragment : BaseFragment<FragmentCreateJobBinding>() {
                     msg = CommonUtils.getStr(R.string.job_create_succeed).toString(),
                     dialogType = TipDialog.DialogType.SUCCESS,
                     countDownTime = 10,
-                    onConfirmClick = {
-                        clearData()
-                    },
-                    onCancelClick = {
-                        clearData()
-                    }
                 )
             } else {
                 TipDialog.show(
@@ -303,20 +211,6 @@ class EditJobFragment : BaseFragment<FragmentCreateJobBinding>() {
         }
     }
 
-    private fun clearData() {
-        binding.jobNameEt.setText("")
-        selectedLockerData = listOf()
-        selectedColockerData = listOf()
-        selectedPointData = listOf()
-        selectedLockMode = null
-        selectedWorkstationId = null
-        binding.saveSop.isChecked = false
-        binding.lockModeTv.text = ""
-        binding.workstationTv.text = ""
-        binding.noSelectedMemberLayout.isVisible = true
-        binding.noSelectedPointLayout.isVisible = true
-    }
-
     /**
      * 检查数据
      */
@@ -365,6 +259,30 @@ class EditJobFragment : BaseFragment<FragmentCreateJobBinding>() {
         itemBinding.pointIcon.setImageResource(R.mipmap.icon_data_manage_menu_point_manage)
     }
 
+    override fun initData() {
+        super.initData()
+        val ticketId = GlobalDataTempStore.getInstance()
+            .getData(DataTransferConstants.KEY_JOB_TICKET_ID) as Long
+        viewModel.getJobData(ticketId).observe(this) {
+            binding.workstationTv.text =
+                viewModel.workstationData.find { it.workstationId == viewModel.jobTicketData?.workstationId }?.workstationName
+            selectedWorkstationId = viewModel.jobTicketData?.workstationId
+            selectedLockMode = viewModel.jobTicketData?.lockMode
+            binding.lockModeTv.text =
+                LockModeEnum.values().find { it.getLockModeType() == selectedLockMode }
+                    ?.getLockModeStr()
+            binding.jobNameEt.setText(viewModel.jobTicketData?.ticketName)
+            selectedPointData = viewModel.jobPointsData
+            selectedLockerData = viewModel.jobLockerData
+            selectedColockerData = viewModel.jobColockerData
+            binding.pointRv.models = viewModel.jobPointsData
+            binding.lockerName.text = viewModel.jobLockerData.first().nickName
+            binding.colockerRv.models = viewModel.jobColockerData
+            binding.selectColockerLayout.isVisible =
+                selectedLockMode?.contains(LockStepEnum.COLOCK.type.toString()) == true
+        }
+    }
+
     override fun onResume() {
         super.onResume()
         if (GlobalDataTempStore.getInstance()
@@ -390,9 +308,6 @@ class EditJobFragment : BaseFragment<FragmentCreateJobBinding>() {
                 .getData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
                 ?.let { return@let it as List<PointManageVo> } ?: listOf()
         }
-        binding.noSelectedMemberLayout.isVisible =
-            selectedColockerData.isEmpty() && selectedLockerData.isEmpty()
-        binding.noSelectedPointLayout.isVisible = selectedPointData.isEmpty()
         if (selectedColockerData.isNotEmpty()) {
             binding.colockerRv.models = selectedColockerData
         }

+ 2 - 8
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopJobFragment.kt

@@ -67,11 +67,7 @@ class EditSopJobFragment : BaseFragment<FragmentEditSopJobBinding>() {
                     countDownTime = 10,
                     onConfirmClick = {
                         viewModel.startJob().observe(this) {
-                            navController.navigate(
-                                R.id.action_editSopJobFragment_to_jobExecuteFragment,
-                                NavOptions.Builder()
-                                    .setPopUpTo(R.id.editSopJobFragment, true).build()
-                            )
+                            navController.navigate(R.id.action_editSopJobFragment_to_jobExecuteFragment)
                         }
                     })
             }
@@ -243,9 +239,7 @@ class EditSopJobFragment : BaseFragment<FragmentEditSopJobBinding>() {
         super.initData()
         val ticketId = GlobalDataTempStore.getInstance()
             .getData(DataTransferConstants.KEY_JOB_TICKET_ID) as Long
-        val sopId = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_EDIT_SOP_JOB_SOP_ID) as Long
-        viewModel.getSopJobData(ticketId, sopId).observe(this) {
+        viewModel.getSopJobData(ticketId).observe(this) {
             selectedWorkstationId = viewModel.jobTicketData?.workstationId
             selectedSopId = viewModel.jobTicketData?.sopId
             selectedSop = viewModel.sopData.find { it.sopId == viewModel.jobTicketData?.sopId }

+ 0 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobManageFragment.kt

@@ -120,8 +120,6 @@ class JobManageFragment : BaseFragment<FragmentJobManageBinding>() {
                 .saveData(DataTransferConstants.KEY_JOB_TICKET_ID, item.ticketId)
             if (item.ticketStatus == JobTicketStatusEnums.NOT_START.status) {
                 if (item.sopId != null) {
-                    GlobalDataTempStore.getInstance()
-                        .saveData(DataTransferConstants.KEY_EDIT_SOP_JOB_SOP_ID, item.sopId ?: 0)
                     navController.navigate(R.id.action_jobManageFragment_to_editSopJobFragment)
                 } else {
                     navController.navigate(R.id.action_jobManageFragment_to_editJobFragment)

+ 66 - 2
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobViewModel.kt

@@ -2,12 +2,15 @@ package com.grkj.iscs.features.main.viewmodel.job_manage
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
+import com.grkj.data.enums.RoleEnums
 import com.grkj.data.model.dos.IsWorkstation
+import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.data.repository.ISopRepository
 import com.grkj.data.repository.IWorkstationRepository
+import com.grkj.data.repository.impl.IsolationPointRepository
 import com.grkj.data.repository.impl.JobTicketRepository
 import com.grkj.data.repository.impl.SopRepository
 import com.grkj.data.repository.impl.WorkstationRepository
@@ -22,6 +25,10 @@ class JobViewModel : BaseViewModel() {
     private val sopRepository: ISopRepository by lazy { SopRepository.instance }
     private val jobTicketRepository: IJobTicketRepository by lazy { JobTicketRepository.instance }
     var workstationData: List<IsWorkstation> = listOf()
+    var jobTicketData: JobTicketManageVo? = null
+    var jobPointsData: List<PointManageVo> = mutableListOf()
+    var jobLockerData: List<UserManageVo> = mutableListOf()
+    var jobColockerData: List<UserManageVo> = mutableListOf()
 
     /**
      * 初始化岗位数据
@@ -34,7 +41,7 @@ class JobViewModel : BaseViewModel() {
     }
 
     /**
-     * 保存sop
+     * 保存作业
      */
     fun saveSop(
         selectedPointsData: List<PointManageVo>,
@@ -46,7 +53,7 @@ class JobViewModel : BaseViewModel() {
         sopId: Long = 0
     ): LiveData<Long> {
         return liveData(Dispatchers.IO) {
-            val sopId = sopRepository.saveSop(sopId,sopName, workstationId, lockMode)
+            val sopId = sopRepository.saveSop(sopId, sopName, workstationId, lockMode)
             sopRepository.saveSopPoint(selectedPointsData, sopId)
             sopRepository.saveSopUser(selectedLockerData, selectedColockerData, sopId)
             emit(sopId)
@@ -78,4 +85,61 @@ class JobViewModel : BaseViewModel() {
             emit(true)
         }
     }
+
+    /**
+     * 保存作业
+     */
+    fun saveJob(
+        selectedPoints: List<PointManageVo>,
+        selectedLockerData: List<UserManageVo>,
+        selectedColockerData: List<UserManageVo>,
+        lockMode: String?,
+        sopId: Long?,
+        workstationId: Long,
+        jobName: String,
+        ticketId: Long
+    ): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            jobTicketRepository.saveJob(
+                selectedPoints,
+                selectedLockerData,
+                selectedColockerData,
+                lockMode,
+                sopId,
+                workstationId,
+                jobName,
+                ticketId
+            )
+            emit(true)
+        }
+    }
+
+    /**
+     * 开始作业
+     */
+    fun startJob(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            jobTicketRepository.startJob(jobTicketData?.ticketId)
+            emit(true)
+        }
+    }
+
+    /**
+     * 获取作业数据
+     */
+    fun getJobData(ticketId: Long): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            jobTicketData = jobTicketRepository.getTicketDataByTicketId(ticketId)
+            workstationData = workstationRepository.getWorkStationData()
+            jobPointsData =
+                jobTicketRepository.getTicketPointsByTicketId(ticketId)
+            val tempJobTicketUserId = jobTicketRepository.getTicketUsersByTicketId(ticketId)
+            jobLockerData =
+                tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnums.JTLOCKER.roleKey) }
+            jobColockerData =
+                tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnums.JTCOLOCKER.roleKey) }
+            emit(true)
+        }
+    }
+
 }

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopJobViewModel.kt

@@ -132,7 +132,7 @@ class SopJobViewModel : BaseViewModel() {
     /**
      * 获取SOP作业详情
      */
-    fun getSopJobData(ticketId: Long, sopId: Long): LiveData<Boolean> {
+    fun getSopJobData(ticketId: Long): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             jobTicketData = jobTicketRepository.getTicketDataByTicketId(ticketId)
             workstationData = workstationRepository.getWorkStationData()
@@ -141,7 +141,7 @@ class SopJobViewModel : BaseViewModel() {
             sopLockerData = sopJobUsers.filter { it.roleKeys.contains(RoleEnums.JTLOCKER.roleKey) }
             sopColockerData =
                 sopJobUsers.filter { it.roleKeys.contains(RoleEnums.JTCOLOCKER.roleKey) }
-            sopPoints = sopRepository.getSopPointsBySopId(sopId)
+            sopPoints = jobTicketRepository.getTicketPointsByTicketId(ticketId)
             emit(true)
         }
     }

+ 392 - 0
app/src/main/res/layout/fragment_edit_job.xml

@@ -0,0 +1,392 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="20dp"
+        android:background="@drawable/home_card_bg"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/title_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingHorizontal="10dp"
+            android:paddingVertical="5dp">
+
+            <ImageView
+                android:layout_width="20dp"
+                android:layout_height="20dp"
+                android:src="@mipmap/icon_data_manage_menu_user_manage" />
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:layout_weight="1"
+                android:text="@string/edit_job_title"
+                android:textColor="@color/black"
+                android:textSize="24sp" />
+
+            <TextView
+                android:id="@+id/start_job"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:backgroundTint="@color/color_1daeff"
+                android:paddingHorizontal="20dp"
+                android:text="@string/start_the_job"
+                android:textColor="@color/white"
+                android:textSize="20sp" />
+
+            <TextView
+                android:id="@+id/back"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/back"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@color/black" />
+
+        <LinearLayout
+            android:id="@+id/base_info_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginHorizontal="20dp"
+            android:layout_marginTop="20dp"
+            android:layout_marginBottom="10dp"
+            android:background="@drawable/home_card_bg"
+            android:gravity="center_vertical"
+            android:orientation="vertical">
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:layout_weight="1"
+                android:text="@string/base_info_title"
+                android:textColor="@color/black"
+                android:textSize="24sp" />
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:background="@color/black" />
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/job_workstation"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <TextView
+                    android:id="@+id/workstation_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:drawableRight="@drawable/icon_drop_down"
+                    android:hint="@string/please_select_job_workstation"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/lock_mode"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <TextView
+                    android:id="@+id/lock_mode_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:drawableRight="@drawable/icon_drop_down"
+                    android:hint="@string/please_select_lock_mode"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:layout_marginBottom="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/create_job_name"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <EditText
+                    android:id="@+id/job_name_et"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:hint="@string/please_input_job_name"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/point_info_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginHorizontal="20dp"
+            android:layout_marginVertical="10dp"
+            android:background="@drawable/home_card_bg"
+            android:gravity="center_vertical"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:layout_weight="1"
+                    android:text="@string/point_info_title"
+                    android:textColor="@color/black"
+                    android:textSize="24sp" />
+
+                <TextView
+                    android:id="@+id/select_point_tv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:layout_marginRight="10dp"
+                    android:background="@drawable/common_dialog_btn"
+                    android:paddingHorizontal="20dp"
+                    android:text="@string/select"
+                    android:textColor="@color/black"
+                    android:textSize="20sp" />
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:background="@color/black" />
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/point_rv"
+                android:layout_width="match_parent"
+                android:layout_height="240dp"
+                android:paddingBottom="10dp" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/member_info_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginHorizontal="20dp"
+            android:layout_marginVertical="10dp"
+            android:background="@drawable/home_card_bg"
+            android:gravity="center_vertical"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:layout_weight="1"
+                    android:text="@string/member_info_title"
+                    android:textColor="@color/black"
+                    android:textSize="24sp" />
+
+                <TextView
+                    android:id="@+id/select_member_tv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:layout_marginRight="10dp"
+                    android:background="@drawable/common_dialog_btn"
+                    android:paddingHorizontal="20dp"
+                    android:text="@string/select"
+                    android:textColor="@color/black"
+                    android:textSize="20sp" />
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:background="@color/black" />
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:gravity="center"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:background="@drawable/home_card_bg"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:gravity="center"
+                        android:paddingHorizontal="20dp"
+                        android:paddingVertical="10dp"
+                        android:text="@string/locker"
+                        android:textColor="@color/black"
+                        android:textSize="24sp" />
+
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="1dp"
+                        android:background="@color/black" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:gravity="center"
+                        android:orientation="vertical"
+                        android:paddingBottom="10dp">
+
+                        <ImageView
+                            android:layout_width="50dp"
+                            android:layout_height="50dp"
+                            android:layout_marginTop="10dp"
+                            android:src="@mipmap/icon_data_manage_menu_user_manage"
+                            android:tint="@color/black" />
+
+                        <TextView
+                            android:id="@+id/locker_name"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:gravity="center"
+                            android:textColor="@color/black"
+                            android:textSize="20sp" />
+                    </LinearLayout>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/select_colocker_layout"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center"
+                        android:paddingHorizontal="20dp"
+                        android:paddingVertical="10dp"
+                        android:text="@string/colocker"
+                        android:textColor="@color/black"
+                        android:textSize="24sp" />
+
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="1dp"
+                        android:background="@color/black" />
+
+                    <androidx.recyclerview.widget.RecyclerView
+                        android:id="@+id/colocker_rv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent" />
+                </LinearLayout>
+
+            </LinearLayout>
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:padding="10dp">
+
+            <View
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1" />
+
+            <TextView
+                android:id="@+id/confirm"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/confirm"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+            <TextView
+                android:id="@+id/cancel"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/cancel"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+    </LinearLayout>
+</layout>

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

@@ -146,4 +146,5 @@
     <string name="start_job_check">Are you sure to start job?</string>
     <string name="sop_job_save_succeed">SOP job save succeed</string>
     <string name="sop_job_save_failed">SOP job save failed</string>
+    <string name="edit_job_title">Job detail</string>
 </resources>

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

@@ -146,4 +146,5 @@
     <string name="start_job_check">确认开始执行作业吗?</string>
     <string name="sop_job_save_succeed">SOP作业保存成功</string>
     <string name="sop_job_save_failed">SOP作业保存失败</string>
+    <string name="edit_job_title">作业详情</string>
 </resources>

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

@@ -145,4 +145,5 @@
     <string name="start_job_check">确认开始执行作业吗?</string>
     <string name="sop_job_save_succeed">SOP作业保存成功</string>
     <string name="sop_job_save_failed">SOP作业保存失败</string>
+    <string name="edit_job_title">作业详情</string>
 </resources>

+ 22 - 0
data/src/main/java/com/grkj/data/dao/JobTicketDao.kt

@@ -13,6 +13,7 @@ import com.grkj.data.model.dos.IsJobTicketPoints
 import com.grkj.data.model.dos.IsJobTicketStep
 import com.grkj.data.model.dos.IsJobTicketUser
 import com.grkj.data.model.vo.JobTicketManageVo
+import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 
 /**
@@ -101,6 +102,7 @@ interface JobTicketDao {
         ticket_name as ticketName,
         ticket_status as ticketStatus,
         workstation_id as workstationId,
+        lock_mode as lockMode,
         sop_id as sopId
         from is_job_ticket
         limit :size offset :offset
@@ -156,10 +158,30 @@ interface JobTicketDao {
         ticket_name as ticketName,
         ticket_status as ticketStatus,
         workstation_id as workstationId,
+        lock_mode as lockMode,
         sop_id as sopId
         from is_job_ticket
         where ticket_id = :ticketId
     """)
     fun getTicketDataByTicketId(ticketId: Long): JobTicketManageVo?
 
+    /**
+     * 根据作业id获取点位id
+     */
+    @Query(
+        """
+        select iip.point_id as pointId,
+        iip.point_name as pointName,
+        iip.remark as pointFunction,
+        iw.workstation_name as workstationName,
+        irt.rfid as rfidToken
+        from is_job_ticket_points ijtp
+        left join  is_isolation_point iip on ijtp.point_id = iip.point_id
+        left join is_rfid_token irt on iip.rfid_id = irt.rfid_id
+        left join is_workstation iw on iip.workstation_id=iw.workstation_id
+        WHERE ijtp.ticket_id = :ticketId
+    """
+    )
+    fun getTicketPointsByTicketId(ticketId: Long): List<PointManageVo>
+
 }

+ 3 - 0
data/src/main/java/com/grkj/data/model/dos/IsJobTicket.kt

@@ -20,6 +20,9 @@ class IsJobTicket : BaseBean() {
     @ColumnInfo("ticket_name")
     var ticketName: String = ""
 
+    @ColumnInfo("lock_mode")
+    var lockMode: String? = null
+
     @ColumnInfo("workshop_id")
     var workshopId: Long? = null
 

+ 0 - 3
data/src/main/java/com/grkj/data/model/dos/IsJobTicketStep.kt

@@ -22,9 +22,6 @@ class IsJobTicketStep : BaseBean() {
     @ColumnInfo("step_status")
     var stepStatus: String = "0"
 
-    @ColumnInfo("step_type")
-    var stepType: String? = null
-
     @ColumnInfo("step_content")
     var stepContent: String? = null
 

+ 2 - 0
data/src/main/java/com/grkj/data/model/vo/JobTicketManageVo.kt

@@ -12,6 +12,8 @@ class JobTicketManageVo {
 
     var ticketStatus: String = "0"
 
+    var lockMode: String? = null
+
     var workstationId: Long = 0
 
     var sopId: Long? = null

+ 6 - 1
data/src/main/java/com/grkj/data/repository/IJobTicketRepository.kt

@@ -62,7 +62,12 @@ interface IJobTicketRepository {
     fun getTicketUsersByTicketId(ticketId: Long): List<UserManageVo>
 
     /**
-     * 根据作业id获取作业信息
+     * 根据作业id获取作业信息
      */
     fun getTicketDataByTicketId(ticketId: Long): JobTicketManageVo?
+
+    /**
+     * 根据作业id获取点位数据
+     */
+    fun getTicketPointsByTicketId(ticketId: Long): List<PointManageVo>
 }

+ 21 - 8
data/src/main/java/com/grkj/data/repository/impl/JobTicketRepository.kt

@@ -34,6 +34,7 @@ class JobTicketRepository : IJobTicketRepository {
         val isJobTicket = IsJobTicket()
         isJobTicket.ticketName = jobName
         isJobTicket.workstationId = workstationId
+        isJobTicket.lockMode = lockMode
         isJobTicket.sopId = sopId
         val ticketId = jobTicketDao.saveIsJobTicket(isJobTicket)
         val ticketPoints = selectedSopPoints.map {
@@ -44,15 +45,24 @@ class JobTicketRepository : IJobTicketRepository {
             isJobTicketPoint
         }
         val ticketPointIds = jobTicketDao.saveIsJobTicketPoints(ticketPoints)
-        val ticketUsers = (selectedLockerData + selectedColockerData).map {
+        val ticketLockerUsers = selectedLockerData.map {
+            val isJobticketUser = IsJobTicketUser()
+            isJobticketUser.userId = it.userId
+            isJobticketUser.ticketId = ticketId
+            isJobticketUser.userName = it.userName
+            isJobticketUser.userRole = RoleEnums.JTLOCKER.roleKey
+            isJobticketUser
+        }
+        val ticketColockerUsers = selectedColockerData.map {
             val isJobticketUser = IsJobTicketUser()
             isJobticketUser.userId = it.userId
             isJobticketUser.ticketId = ticketId
             isJobticketUser.userName = it.userName
-            isJobticketUser.userRole = it.roleKeys.joinToString(",")
+            isJobticketUser.userRole = RoleEnums.JTCOLOCKER.roleKey
             isJobticketUser
         }
-        jobTicketDao.saveIsJobTicketUser(ticketUsers)
+        jobTicketDao.saveIsJobTicketUser(ticketLockerUsers)
+        jobTicketDao.saveIsJobTicketUser(ticketColockerUsers)
         val ticketKeys = mutableListOf<IsJobTicketKey>().apply {
             ticketPointIds.forEach {
                 val isJobTicketKey = IsJobTicketKey()
@@ -74,7 +84,6 @@ class JobTicketRepository : IJobTicketRepository {
             lockMode?.split(",")?.forEachIndexed { index, stepType ->
                 val isJobTicketStep = IsJobTicketStep()
                 isJobTicketStep.ticketId = ticketId
-                isJobTicketStep.stepType = stepType
                 isJobTicketStep.stepIndex = index
                 isJobTicketStep.stepContent =
                     LockStepEnum.values().find { it.type == stepType.toInt() }?.description
@@ -105,6 +114,7 @@ class JobTicketRepository : IJobTicketRepository {
         isJobTicket.ticketId = ticketId
         isJobTicket.ticketName = jobName
         isJobTicket.workstationId = workstationId
+        isJobTicket.lockMode = lockMode
         isJobTicket.sopId = sopId
         val ticketId = jobTicketDao.saveIsJobTicket(isJobTicket)
         val ticketPoints = selectedSopPoints.map {
@@ -131,7 +141,6 @@ class JobTicketRepository : IJobTicketRepository {
             isJobticketUser.userRole = RoleEnums.JTCOLOCKER.roleKey
             isJobticketUser
         }
-
         jobTicketDao.saveIsJobTicketUser(ticketLockerUsers)
         jobTicketDao.saveIsJobTicketUser(ticketColockerUsers)
         val ticketKeys = mutableListOf<IsJobTicketKey>().apply {
@@ -152,11 +161,10 @@ class JobTicketRepository : IJobTicketRepository {
         }
         jobTicketDao.saveIsJobTicketLock(ticketLocks)
         val ticketStep = mutableListOf<IsJobTicketStep>().apply {
-            lockMode?.split(",")?.forEachIndexed { index, stepType ->
+            lockMode?.split(",")?.forEach { stepType ->
                 val isJobTicketStep = IsJobTicketStep()
                 isJobTicketStep.ticketId = ticketId
-                isJobTicketStep.stepType = stepType
-                isJobTicketStep.stepIndex = index
+                isJobTicketStep.stepIndex = stepType.toInt()
                 isJobTicketStep.stepContent =
                     LockStepEnum.values().find { it.type == stepType.toInt() }?.description
                 isJobTicketStep.androidStepContent =
@@ -201,6 +209,11 @@ class JobTicketRepository : IJobTicketRepository {
     override fun getTicketDataByTicketId(ticketId: Long): JobTicketManageVo? {
         return jobTicketDao.getTicketDataByTicketId(ticketId)
     }
+
+    override fun getTicketPointsByTicketId(ticketId: Long): List<PointManageVo> {
+        return jobTicketDao.getTicketPointsByTicketId(ticketId)
+    }
+
     companion object {
         /**
          * 单例