|
@@ -12,6 +12,7 @@ import com.grkj.data.enums.IsolationPointPowerTypeEnum
|
|
|
import com.grkj.data.enums.JobTicketStatusEnum
|
|
import com.grkj.data.enums.JobTicketStatusEnum
|
|
|
import com.grkj.data.enums.NextJobPrompt
|
|
import com.grkj.data.enums.NextJobPrompt
|
|
|
import com.grkj.data.enums.RoleEnum
|
|
import com.grkj.data.enums.RoleEnum
|
|
|
|
|
+import com.grkj.data.enums.StepAction
|
|
|
import com.grkj.data.model.dos.IsJobTicket
|
|
import com.grkj.data.model.dos.IsJobTicket
|
|
|
import com.grkj.data.model.dos.IsJobTicketGroup
|
|
import com.grkj.data.model.dos.IsJobTicketGroup
|
|
|
import com.grkj.data.model.dos.IsJobTicketKey
|
|
import com.grkj.data.model.dos.IsJobTicketKey
|
|
@@ -22,6 +23,7 @@ import com.grkj.data.model.dos.IsJobTicketUser
|
|
|
import com.grkj.data.model.dos.WorkflowStep
|
|
import com.grkj.data.model.dos.WorkflowStep
|
|
|
import com.grkj.data.model.local.TodoStepJoin
|
|
import com.grkj.data.model.local.TodoStepJoin
|
|
|
import com.grkj.data.model.local.isMyTodo
|
|
import com.grkj.data.model.local.isMyTodo
|
|
|
|
|
+import com.grkj.data.model.local.only
|
|
|
import com.grkj.data.model.req.LockPointUpdateReq
|
|
import com.grkj.data.model.req.LockPointUpdateReq
|
|
|
import com.grkj.data.model.res.StepDetailRes
|
|
import com.grkj.data.model.res.StepDetailRes
|
|
|
import com.grkj.data.model.res.TicketDetailRes
|
|
import com.grkj.data.model.res.TicketDetailRes
|
|
@@ -246,9 +248,6 @@ class JobTicketRepository @Inject constructor(
|
|
|
//1.获取所有用户参与的作业票
|
|
//1.获取所有用户参与的作业票
|
|
|
val tickets = jobTicketDao.getTicketThatUserJoin(userId)
|
|
val tickets = jobTicketDao.getTicketThatUserJoin(userId)
|
|
|
if (tickets.isEmpty()) return emptyList()
|
|
if (tickets.isEmpty()) return emptyList()
|
|
|
- // 2. 获取票对应的流程步骤定义(模板)
|
|
|
|
|
- val modeIdToSteps = workflowStepDao.getStepsByModes(tickets.map { it.modeId }.distinct())
|
|
|
|
|
- .groupBy { it.modeId }
|
|
|
|
|
// 3. 获取作业票步骤实例
|
|
// 3. 获取作业票步骤实例
|
|
|
val stepInstances = jobTicketDao.getStepsByTicketIds(tickets.map { it.ticketId })
|
|
val stepInstances = jobTicketDao.getStepsByTicketIds(tickets.map { it.ticketId })
|
|
|
// 4. 获取钥匙记录(上锁/解锁 取/还钥匙逻辑)
|
|
// 4. 获取钥匙记录(上锁/解锁 取/还钥匙逻辑)
|
|
@@ -264,7 +263,6 @@ class JobTicketRepository @Inject constructor(
|
|
|
// 8. 构建待办项 TodoStepJoin
|
|
// 8. 构建待办项 TodoStepJoin
|
|
|
val todoList = assembleTodoStepJoins(
|
|
val todoList = assembleTodoStepJoins(
|
|
|
tickets,
|
|
tickets,
|
|
|
- modeIdToSteps,
|
|
|
|
|
stepInstances,
|
|
stepInstances,
|
|
|
keyRecords,
|
|
keyRecords,
|
|
|
groups,
|
|
groups,
|
|
@@ -282,7 +280,6 @@ class JobTicketRepository @Inject constructor(
|
|
|
*/
|
|
*/
|
|
|
private fun assembleTodoStepJoins(
|
|
private fun assembleTodoStepJoins(
|
|
|
tickets: List<IsJobTicket>,
|
|
tickets: List<IsJobTicket>,
|
|
|
- modeSteps: Map<Long, List<WorkflowStep>>,
|
|
|
|
|
stepInstances: List<IsJobTicketStep>,
|
|
stepInstances: List<IsJobTicketStep>,
|
|
|
keyRecords: List<IsJobTicketKey>,
|
|
keyRecords: List<IsJobTicketKey>,
|
|
|
groups: List<IsJobTicketGroup>,
|
|
groups: List<IsJobTicketGroup>,
|
|
@@ -299,112 +296,69 @@ class JobTicketRepository @Inject constructor(
|
|
|
val lockerList = lockers.filter { it.ticketId == ticketId }
|
|
val lockerList = lockers.filter { it.ticketId == ticketId }
|
|
|
val colockerList = colockers.filter { it.ticketId == ticketId }
|
|
val colockerList = colockers.filter { it.ticketId == ticketId }
|
|
|
val ticketSteps = stepInstances.filter { it.ticketId == ticketId }
|
|
val ticketSteps = stepInstances.filter { it.ticketId == ticketId }
|
|
|
- val workflowSteps = modeSteps[ticket.modeId] ?: emptyList()
|
|
|
|
|
- val previousStepJoin: MutableList<TodoStepJoin> = mutableListOf()
|
|
|
|
|
|
|
+ .sortedBy { it.stepIndex }
|
|
|
val currentStepId =
|
|
val currentStepId =
|
|
|
ticketSteps.filter { isJobTicketStep -> isJobTicketStep.stepStatus == "0" }
|
|
ticketSteps.filter { isJobTicketStep -> isJobTicketStep.stepStatus == "0" }
|
|
|
.minByOrNull { isJobTicketStep -> isJobTicketStep.stepIndex }?.stepId
|
|
.minByOrNull { isJobTicketStep -> isJobTicketStep.stepIndex }?.stepId
|
|
|
- ticketSteps.sortedBy { it.stepIndex }.forEach { step ->
|
|
|
|
|
- when {
|
|
|
|
|
- // 🔐 JTLOCKER 处理:上锁 or 解锁 ➜ 必须按 group 拆
|
|
|
|
|
- step.enableLock || step.enableUnlock -> {
|
|
|
|
|
- val type = if (step.enableLock) 0 else 1
|
|
|
|
|
- val keys = keyRecords.filter {
|
|
|
|
|
- it.ticketId == ticketId && it.ticketType == type && it.delFlag == "0"
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ val previousStepJoin: MutableList<TodoStepJoin> = mutableListOf()
|
|
|
|
|
+ ticketSteps.sortedBy { it.stepIndex }.forEach { stepDef ->
|
|
|
|
|
|
|
|
- // 如果 key 记录没有,说明尚未开始取钥匙,按 groupId 拆分一条占位待办
|
|
|
|
|
- if (keys.isEmpty()) {
|
|
|
|
|
- val groupStepJoin = groupList.map {
|
|
|
|
|
- buildTodoStepJoin(
|
|
|
|
|
- step,
|
|
|
|
|
- ticket,
|
|
|
|
|
- step,
|
|
|
|
|
- lockerList,
|
|
|
|
|
- colockerList,
|
|
|
|
|
- it.id,
|
|
|
|
|
- it.groupName,
|
|
|
|
|
- null
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
- groupStepJoin.forEach {
|
|
|
|
|
- if (!previousStepJoin.isEmpty()) {
|
|
|
|
|
- it.previousTodoStepJoin = previousStepJoin.toList()
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- result += groupStepJoin
|
|
|
|
|
- if (currentStepId == step.stepId) {
|
|
|
|
|
- previousStepJoin.addAll(groupStepJoin)
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- val keysStepJoin = keys.map { key ->
|
|
|
|
|
- buildTodoStepJoin(
|
|
|
|
|
- step,
|
|
|
|
|
- ticket,
|
|
|
|
|
- step,
|
|
|
|
|
- lockerList,
|
|
|
|
|
- colockerList,
|
|
|
|
|
- key.groupId,
|
|
|
|
|
- groupList.find { group -> group.id == key.groupId }?.groupName,
|
|
|
|
|
- key
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
- keysStepJoin.forEach {
|
|
|
|
|
- if (!previousStepJoin.isEmpty()) {
|
|
|
|
|
- it.previousTodoStepJoin = previousStepJoin.toList()
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- result += keysStepJoin
|
|
|
|
|
- if (currentStepId == step.stepId) {
|
|
|
|
|
- previousStepJoin.addAll(keysStepJoin)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ val stepJoins = mutableListOf<TodoStepJoin>() // 本 step 产生的所有 Todo
|
|
|
|
|
|
|
|
- // 🤝 JTCOLOCKER / RELEASE_COLOCK(不拆 group)
|
|
|
|
|
- step.enableColock || step.enableReleaseColock -> {
|
|
|
|
|
- val temp =
|
|
|
|
|
- buildTodoStepJoin(
|
|
|
|
|
- step,
|
|
|
|
|
- ticket,
|
|
|
|
|
- step,
|
|
|
|
|
- lockerList,
|
|
|
|
|
- colockerList,
|
|
|
|
|
- null,
|
|
|
|
|
- "",
|
|
|
|
|
- null
|
|
|
|
|
- )
|
|
|
|
|
- if (!previousStepJoin.isEmpty()) {
|
|
|
|
|
- temp.previousTodoStepJoin = previousStepJoin.toList()
|
|
|
|
|
- }
|
|
|
|
|
- previousStepJoin.clear()
|
|
|
|
|
- result += temp
|
|
|
|
|
- if (currentStepId == step.stepId) {
|
|
|
|
|
- previousStepJoin.add(temp)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ /** 工具:给待办挂上前置链并收集 **/
|
|
|
|
|
+ fun collect(join: TodoStepJoin) {
|
|
|
|
|
+ if (previousStepJoin.isNotEmpty()) join.previousTodoStepJoin = previousStepJoin.toList()
|
|
|
|
|
+ stepJoins += join
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- // 除了特殊的剩下的都是步骤确认
|
|
|
|
|
- else -> {
|
|
|
|
|
- val temp = buildTodoStepJoin(
|
|
|
|
|
- step,
|
|
|
|
|
- ticket,
|
|
|
|
|
- step,
|
|
|
|
|
- lockerList,
|
|
|
|
|
- colockerList,
|
|
|
|
|
- null,
|
|
|
|
|
- "",
|
|
|
|
|
- null
|
|
|
|
|
- )
|
|
|
|
|
- if (!previousStepJoin.isEmpty()) {
|
|
|
|
|
- temp.previousTodoStepJoin = previousStepJoin.toList()
|
|
|
|
|
|
|
+ /* 1️⃣ Lock / Unlock(按 group 拆) */
|
|
|
|
|
+ if (stepDef.enableLock || stepDef.enableUnlock) {
|
|
|
|
|
+ val type = if (stepDef.enableLock) 0 else 1
|
|
|
|
|
+ val keys = keyRecords.filter { it.ticketId == ticketId && it.ticketType == type && it.delFlag == "0" }
|
|
|
|
|
+
|
|
|
|
|
+ val lockJoins = if (keys.isEmpty()) {
|
|
|
|
|
+ // 没取钥匙 → 每个 group 生成一条占位
|
|
|
|
|
+ groupList.map { g ->
|
|
|
|
|
+ buildTodoStepJoin(stepDef, ticket, stepDef, lockerList, colockerList,
|
|
|
|
|
+ g.id, g.groupName, null).only(if (stepDef.enableLock) StepAction.LOCK else StepAction.UNLOCK)
|
|
|
}
|
|
}
|
|
|
- previousStepJoin.clear()
|
|
|
|
|
- result += temp
|
|
|
|
|
- if (currentStepId == step.stepId) {
|
|
|
|
|
- previousStepJoin.add(temp)
|
|
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 有钥匙记录
|
|
|
|
|
+ keys.map { k ->
|
|
|
|
|
+ buildTodoStepJoin(stepDef, ticket, stepDef, lockerList, colockerList,
|
|
|
|
|
+ k.groupId, groupList.firstOrNull { it.id == k.groupId }?.groupName, k).only(if (stepDef.enableLock) StepAction.LOCK else StepAction.UNLOCK) // ⚠️
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ lockJoins.forEach(::collect)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /* 2️⃣ Colock / Release(不拆 group) */
|
|
|
|
|
+ if (stepDef.enableColock || stepDef.enableReleaseColock) {
|
|
|
|
|
+ collect(
|
|
|
|
|
+ buildTodoStepJoin(stepDef, ticket, stepDef, lockerList, colockerList,
|
|
|
|
|
+ null, "", null).only(
|
|
|
|
|
+ if (stepDef.enableColock)
|
|
|
|
|
+ StepAction.COLOCK
|
|
|
|
|
+ else
|
|
|
|
|
+ StepAction.RELEASE_COLOCK
|
|
|
|
|
+ ) // ⚠️
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /* 3️⃣ 普通确认 / End‑Job */
|
|
|
|
|
+ val needConfirm = !stepDef.hasAnyHardwareOperationFunction() || stepDef.enableEndJob
|
|
|
|
|
+ if (needConfirm) {
|
|
|
|
|
+ val action = if (stepDef.enableEndJob) StepAction.END_JOB else StepAction.CONFIRM
|
|
|
|
|
+ collect(
|
|
|
|
|
+ buildTodoStepJoin(stepDef, ticket, stepDef, lockerList, colockerList,
|
|
|
|
|
+ null, "", null).only(action) // ⚠️
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /* ⭐ 将本 step 的 Todo 归档,并维护前置链 ⭐ */
|
|
|
|
|
+ result += stepJoins
|
|
|
|
|
+ if (currentStepId == stepDef.stepId) {
|
|
|
|
|
+ previousStepJoin.addAll(stepJoins)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|