|
|
@@ -19,6 +19,9 @@ import com.grkj.data.model.dos.IsJobTicketLock
|
|
|
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.dos.WorkflowStep
|
|
|
+import com.grkj.data.model.local.TodoStepJoin
|
|
|
+import com.grkj.data.model.local.isMyTodo
|
|
|
import com.grkj.data.model.req.LockPointUpdateReq
|
|
|
import com.grkj.data.model.res.StepDetailRes
|
|
|
import com.grkj.data.model.res.TicketDetailRes
|
|
|
@@ -231,43 +234,183 @@ class JobTicketRepository @Inject constructor(
|
|
|
jobTicketDao.saveIsJobTicketStep(ticketStep)
|
|
|
}
|
|
|
|
|
|
- override fun getMyTodoList(
|
|
|
- current: Int,
|
|
|
- size: Int
|
|
|
- ): List<JobTicketManageVo> {
|
|
|
- val isAdmin = MainDomainData.roleKeys.orEmpty()
|
|
|
- .contains(RoleEnum.ADMIN.roleKey)
|
|
|
-
|
|
|
- // 普通用户要排除 "异常" 状态
|
|
|
- val exStatusList = CommonDictDataEnum.JOB_TICKET_STATUS
|
|
|
- .commonDictRes
|
|
|
- .filter { it.dictLabel == "异常" }
|
|
|
- .mapNotNull { it.dictValue }
|
|
|
- .ifEmpty { listOf("") } // 管理员也能传,但不会被用到
|
|
|
- return jobTicketDao.getMyTodoJob(
|
|
|
- isAdmin = isAdmin,
|
|
|
- exStatusList = exStatusList,
|
|
|
- userId = MainDomainData.userInfo?.userId ?: 0,
|
|
|
- size = size,
|
|
|
- offset = current * size
|
|
|
+ override fun getMyTodoList(): List<TodoStepJoin> {
|
|
|
+ val userId = MainDomainData.userInfo?.userId ?: return emptyList()
|
|
|
+ val userName = MainDomainData.userInfo?.userName ?: return emptyList()
|
|
|
+ //1.获取所有用户参与的作业票
|
|
|
+ val tickets = jobTicketDao.getTicketThatUserJoin(userId)
|
|
|
+ if (tickets.isEmpty()) return emptyList()
|
|
|
+ // 2. 获取票对应的流程步骤定义(模板)
|
|
|
+ val modeIdToSteps = workflowStepDao.getStepsByModes(tickets.map { it.modeId }.distinct())
|
|
|
+ .groupBy { it.modeId }
|
|
|
+ // 3. 获取作业票步骤实例
|
|
|
+ val stepInstances = jobTicketDao.getStepsByTicketIds(tickets.map { it.ticketId })
|
|
|
+ // 4. 获取钥匙记录(上锁/解锁 取/还钥匙逻辑)
|
|
|
+ val keyRecords = jobTicketDao.getKeysByTicketIds(tickets.map { it.ticketId })
|
|
|
+ // 5. 获取 ticket 所属分组
|
|
|
+ val groups = jobTicketDao.getGroupsByTicketIds(tickets.map { it.ticketId })
|
|
|
+ // 6. 构建待办项 TodoStepJoin
|
|
|
+ val todoList = assembleTodoStepJoins(
|
|
|
+ tickets, modeIdToSteps, stepInstances, keyRecords, groups, userId, userName
|
|
|
)
|
|
|
+ // 7. 当前用户真正需要处理的
|
|
|
+ return todoList.filter { it.isMyTodo(userId, userName) }
|
|
|
}
|
|
|
|
|
|
- override fun getMyToDoListJobCount(): Int {
|
|
|
- val isAdmin = MainDomainData.roleKeys.orEmpty()
|
|
|
- .contains(RoleEnum.ADMIN.roleKey)
|
|
|
+ /**
|
|
|
+ * 组装数据
|
|
|
+ */
|
|
|
+ private fun assembleTodoStepJoins(
|
|
|
+ tickets: List<IsJobTicket>,
|
|
|
+ modeSteps: Map<Long, List<WorkflowStep>>,
|
|
|
+ stepInstances: List<IsJobTicketStep>,
|
|
|
+ keyRecords: List<IsJobTicketKey>,
|
|
|
+ groups: List<IsJobTicketGroup>,
|
|
|
+ userId: Long,
|
|
|
+ userName: String
|
|
|
+ ): List<TodoStepJoin> {
|
|
|
+ val result = mutableListOf<TodoStepJoin>()
|
|
|
|
|
|
- // 普通用户要排除 "异常" 状态
|
|
|
- val exStatusList = CommonDictDataEnum.JOB_TICKET_STATUS
|
|
|
- .commonDictRes
|
|
|
- .filter { it.dictLabel == "异常" }
|
|
|
- .mapNotNull { it.dictValue }
|
|
|
- .ifEmpty { listOf("") } // 管理员也能传,但不会被用到
|
|
|
- return jobTicketDao.getMyTodoJobSize(
|
|
|
- isAdmin = isAdmin,
|
|
|
- exStatusList = exStatusList,
|
|
|
- userId = MainDomainData.userInfo?.userId ?: 0
|
|
|
- )
|
|
|
+ tickets.forEach { ticket ->
|
|
|
+ val ticketId = ticket.ticketId
|
|
|
+ val groupList = groups.filter { it.ticketId == ticketId }
|
|
|
+ val ticketSteps = stepInstances.filter { it.ticketId == ticketId }
|
|
|
+ val workflowSteps = modeSteps[ticket.modeId] ?: emptyList()
|
|
|
+
|
|
|
+ ticketSteps.forEach { step ->
|
|
|
+ val workflowStep =
|
|
|
+ workflowSteps.firstOrNull { it.stepId == step.workflowStepId } ?: return@forEach
|
|
|
+
|
|
|
+ when {
|
|
|
+ // 🔐 JTLOCKER 处理:上锁 or 解锁 ➜ 必须按 group 拆
|
|
|
+ workflowStep.enableLock || workflowStep.enableUnlock -> {
|
|
|
+ val type = if (workflowStep.enableLock) 0 else 1
|
|
|
+ val keys = keyRecords.filter {
|
|
|
+ it.ticketId == ticketId && it.ticketType == type && it.delFlag == "0"
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果 key 记录没有,说明尚未开始取钥匙,按 groupId 拆分一条占位待办
|
|
|
+ if (keys.isEmpty()) {
|
|
|
+ groupList.forEach { group ->
|
|
|
+ result += buildTodoStepJoin(
|
|
|
+ step,
|
|
|
+ ticket,
|
|
|
+ workflowStep,
|
|
|
+ group.id,
|
|
|
+ group.groupName,
|
|
|
+ null
|
|
|
+ )
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ keys.forEach { key ->
|
|
|
+ result += buildTodoStepJoin(
|
|
|
+ step,
|
|
|
+ ticket,
|
|
|
+ workflowStep,
|
|
|
+ key.groupId,
|
|
|
+ key
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 🤝 JTCOLOCKER / RELEASE_COLOCK(不拆 group) todo 目前不需要添加共锁
|
|
|
+ workflowStep.enableColock || workflowStep.enableReleaseColock -> {
|
|
|
+// result += buildTodoStepJoin(step, ticket, workflowStep, null, null)
|
|
|
+ }
|
|
|
+
|
|
|
+ // ✅ 步骤确认 / 结束作业(不拆 group)
|
|
|
+ workflowStep.enableEndJob || workflowStep.currentUserCanConfirm() -> {
|
|
|
+ result += buildTodoStepJoin(step, ticket, workflowStep, null, null)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 🚫 其他无效步骤忽略(或不在权限范围)
|
|
|
+ else -> {
|
|
|
+ // Do nothing
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return result
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建待办项 TodoStepJoin
|
|
|
+ */
|
|
|
+ private fun buildTodoStepJoin(
|
|
|
+ step: IsJobTicketStep,
|
|
|
+ ticket: IsJobTicket,
|
|
|
+ workflowStep: WorkflowStep,
|
|
|
+ groupId: Long?,
|
|
|
+ groupName: Long?,
|
|
|
+ key: IsJobTicketKey?
|
|
|
+ ): TodoStepJoin {
|
|
|
+ return TodoStepJoin(
|
|
|
+ stepId = step.stepId,
|
|
|
+ ticketId = ticket.ticketId,
|
|
|
+ stepIndex = step.stepIndex,
|
|
|
+ stepStatus = step.stepStatus,
|
|
|
+ workflowStepId = workflowStep.stepId,
|
|
|
+
|
|
|
+ ticketName = ticket.ticketName,
|
|
|
+ createBy = ticket.createBy,
|
|
|
+ ticketStartTime = ticket.ticketStartTime,
|
|
|
+
|
|
|
+ enableSetLocker = workflowStep.enableSetLocker,
|
|
|
+ enableSetColocker = workflowStep.enableSetColocker,
|
|
|
+ enableLock = workflowStep.enableLock,
|
|
|
+ enableColock = workflowStep.enableColock,
|
|
|
+ enableReleaseColock = workflowStep.enableReleaseColock,
|
|
|
+ enableUnlock = workflowStep.enableUnlock,
|
|
|
+ enableEndJob = workflowStep.enableEndJob,
|
|
|
+ confirmUser = workflowStep.confirmUser,
|
|
|
+ confirmRoleCode = workflowStep.confirmRoleCode,
|
|
|
+ stepTitle = workflowStep.stepTitle,
|
|
|
+ stepTitleShort = workflowStep.stepTitleShort,
|
|
|
+ stepDescription = workflowStep.stepDescription,
|
|
|
+
|
|
|
+ userRole = getUserRole(workflowStep),
|
|
|
+ jobStatus = ticket.ticketStatus,
|
|
|
+ keyStatus = getKeyStatusFromKey(key),
|
|
|
+ ).also {
|
|
|
+ // 将 groupId 写入(你如果实体字段没写,需要自己加上)
|
|
|
+ it.groupId = groupId
|
|
|
+ it.groupId = groupId
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据钥匙获取作业状态
|
|
|
+ */
|
|
|
+ private fun getKeyStatusFromKey(key: IsJobTicketKey?): String {
|
|
|
+ return when {
|
|
|
+ key == null -> "0"
|
|
|
+ key.giveBackTime != null -> "2" // 已还
|
|
|
+ key.collectTime != null -> "1" // 已取
|
|
|
+ else -> "0" // 未取
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据用户组获取角色
|
|
|
+ */
|
|
|
+ private fun getUserRole(step: WorkflowStep): String? {
|
|
|
+ return when {
|
|
|
+ step.enableLock || step.enableUnlock -> RoleEnum.JTLOCKER.roleKey
|
|
|
+ step.enableColock || step.enableReleaseColock -> RoleEnum.JTCOLOCKER.roleKey
|
|
|
+ else -> null
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun getMyToDoListJobCount(): Int {
|
|
|
+ return jobTicketDao.getMyTodoList(MainDomainData.userInfo?.userId ?: 0L).count {
|
|
|
+ it.isMyTodo(
|
|
|
+ MainDomainData.userInfo?.userId ?: 0L, MainDomainData.userInfo?.userName ?: ""
|
|
|
+ )
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
override fun updateCoincideToUnLock(ticketDetail: TicketDetailRes, groupId: Long) {
|
|
|
@@ -713,8 +856,8 @@ class JobTicketRepository @Inject constructor(
|
|
|
workflowSteps.find { it.stepId == ticketSteps.firstOrNull { it.stepStatus == "0" }?.workflowStepId }
|
|
|
val isJobTicketKey = BeanUtils.copyProperties(
|
|
|
isJobTicketKeys.firstOrNull {
|
|
|
- it.keyId == keyId && it.groupId == groupId && ((currentStep?.enableLock == true && it.ticketType == 0L) ||
|
|
|
- (currentStep?.enableUnlock == true && it.ticketType == 1L))
|
|
|
+ it.keyId == keyId && it.groupId == groupId && ((currentStep?.enableLock == true && it.ticketType == 0) ||
|
|
|
+ (currentStep?.enableUnlock == true && it.ticketType == 1))
|
|
|
},
|
|
|
IsJobTicketKey::class.java
|
|
|
)
|