Эх сурвалжийг харах

refactor(Data): 重构仓储层和逻辑层,引入Repository模式
- **新增Repository接口和实现**
- 为`Exception`、`Hardware`、`IsolationPoint`、`JobTicket`、`Role`、`Sop`、`SysMenu`、`Workflow`、`Workstation`等模块创建了Repository接口。
- 针对每个接口,提供了标准的本地实现 (e.g., `HardwareRepositoryImpl`) 和对应的网络实现 (e.g., `NetworkHardwareRepositoryImpl`)。网络实现目前为TODO状态。
- `RepositoryModule`根据`SERVER_ADDRESS`配置动态选择使用本地或网络实现。
- **重构逻辑层(Logic)**
- 原先直接依赖Dao的逻辑层 (e.g., `HardwareLogic`, `JobTicketLogic`, `UserLogic`, `SopLogic`, `ExceptionLogic`, `IsolationPointLogic`, `RoleLogic`, `SysMenuLogic`, `WorkflowLogic`, `WorkstationLogic`, `DataExportLogic`) 现在改为依赖对应的Repository接口。
- 移除了`IRfidTokenLogic`和`RfidTokenLogic`,相关功能已整合到`HardwareLogic`和`HardwareRepository`。
- 部分原先在Logic层中直接操作Dao的方法,调整为调用Repository对应的方法。
- `JobTicketRepositoryImpl`、`SopRepositoryImpl`、`HardwareRepositoryImpl`、`WorkstationRepositoryImpl`在构造时注入了其他必要的Repository,以处理跨模块的数据获取(例如,作业票导出时需要关联区域、流程、SOP信息)。
- **调整DAO和DI模块**
- `WorkflowStepDao`重命名为`WorkflowDao`,以更准确地反映其职责。
- `DatabaseModule`中相应调整了`provideWorkflowStepDao`的返回类型为`WorkflowDao`。
- `LogicManager`和`AppEntryPoint`中移除了对`IRfidTokenLogic`的引用。
- `LogicModule`中移除了`provideRfidTokenRepository`。
- **数据导出逻辑调整**
- `DataExportLogic`现在通过Repository获取数据进行导出,例如通过`hardwareRepository.getAllDataExportPointData()`获取点位导出数据。
- **具体方法调整示例**
- `HardwareLogic`中的`getKeyInfo`原调用`hardwareDao.getKeyInfoByRfid`,现改为`hardwareRepository.getKeyInfoByRfid`。
- `JobTicketLogic`中的`createJob`原调用`workflowStepDao.isUnlockBeforeLock`和`workflowStepDao.getStepsByMode`,现改为调用`workflowRepository`的对应方法。
- `WorkstationRepositoryImpl`在其`getWorkstationData`方法内部实现了树形结构的构建逻辑。
- `JobTicketRepositoryImpl`在其`getAllJobData`和`getAllLockedPointsExportData`方法中,注入并使用了`WorkstationRepository`、`WorkflowRepository`和`SopRepository`来组装导出VO所需的数据。
- `SopRepositoryImpl`在其`getDataExportSopData`方法中,注入并使用了`WorkstationRepository`和`WorkflowRepository`来组装导出VO所需的数据。
- `HardwareRepositoryImpl`在其`getAllDataExportPointData`方法中,注入并使用了`WorkstationRepository`来组装导出VO所需的数据。

周文健 1 сар өмнө
parent
commit
f9657ac68a
58 өөрчлөгдсөн 3718 нэмэгдсэн , 571 устгасан
  1. 0 2
      data/src/main/java/com/grkj/data/di/AppEntryPoint.kt
  2. 2 2
      data/src/main/java/com/grkj/data/di/DatabaseModule.kt
  3. 0 3
      data/src/main/java/com/grkj/data/di/LogicManager.kt
  4. 0 8
      data/src/main/java/com/grkj/data/di/LogicModule.kt
  5. 123 2
      data/src/main/java/com/grkj/data/di/RepositoryModule.kt
  6. 37 5
      data/src/main/java/com/grkj/data/domain/logic/IHardwareLogic.kt
  7. 10 0
      data/src/main/java/com/grkj/data/domain/logic/IIsolationPointLogic.kt
  8. 24 9
      data/src/main/java/com/grkj/data/domain/logic/IJobTicketLogic.kt
  9. 0 18
      data/src/main/java/com/grkj/data/domain/logic/IRfidTokenLogic.kt
  10. 31 0
      data/src/main/java/com/grkj/data/domain/logic/IRoleLogic.kt
  11. 0 5
      data/src/main/java/com/grkj/data/domain/logic/ISopLogic.kt
  12. 16 0
      data/src/main/java/com/grkj/data/domain/logic/ISysMenuLogic.kt
  13. 10 0
      data/src/main/java/com/grkj/data/domain/logic/IUserLogic.kt
  14. 16 16
      data/src/main/java/com/grkj/data/domain/logic/impl/DataExportLogic.kt
  15. 109 53
      data/src/main/java/com/grkj/data/domain/logic/impl/ExceptionLogic.kt
  16. 157 139
      data/src/main/java/com/grkj/data/domain/logic/impl/HardwareLogic.kt
  17. 25 17
      data/src/main/java/com/grkj/data/domain/logic/impl/IsolationPointLogic.kt
  18. 46 61
      data/src/main/java/com/grkj/data/domain/logic/impl/JobTicketLogic.kt
  19. 0 22
      data/src/main/java/com/grkj/data/domain/logic/impl/RfidTokenLogic.kt
  20. 48 21
      data/src/main/java/com/grkj/data/domain/logic/impl/RoleLogic.kt
  21. 27 43
      data/src/main/java/com/grkj/data/domain/logic/impl/SopLogic.kt
  22. 32 17
      data/src/main/java/com/grkj/data/domain/logic/impl/SysMenuLogic.kt
  23. 55 44
      data/src/main/java/com/grkj/data/domain/logic/impl/UserLogic.kt
  24. 18 18
      data/src/main/java/com/grkj/data/domain/logic/impl/WorkflowLogic.kt
  25. 17 54
      data/src/main/java/com/grkj/data/domain/logic/impl/WorkstationLogic.kt
  26. 1 7
      data/src/main/java/com/grkj/data/local/dao/HardwareDao.kt
  27. 1 1
      data/src/main/java/com/grkj/data/local/dao/WorkflowDao.kt
  28. 6 0
      data/src/main/java/com/grkj/data/local/dao/WorkstationDao.kt
  29. 2 2
      data/src/main/java/com/grkj/data/local/database/ISCSDatabase.kt
  30. 89 0
      data/src/main/java/com/grkj/data/repository/ExceptionRepository.kt
  31. 302 0
      data/src/main/java/com/grkj/data/repository/HardwareRepository.kt
  32. 59 0
      data/src/main/java/com/grkj/data/repository/IsolationPointRepository.kt
  33. 20 1
      data/src/main/java/com/grkj/data/repository/JobTicketRepository.kt
  34. 57 0
      data/src/main/java/com/grkj/data/repository/RoleRepository.kt
  35. 90 0
      data/src/main/java/com/grkj/data/repository/SopRepository.kt
  36. 38 0
      data/src/main/java/com/grkj/data/repository/SysMenuRepository.kt
  37. 66 0
      data/src/main/java/com/grkj/data/repository/WorkflowRepository.kt
  38. 52 0
      data/src/main/java/com/grkj/data/repository/WorkstationRepository.kt
  39. 58 0
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkExceptionRepositoryImpl.kt
  40. 373 0
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkHardwareRepositoryImpl.kt
  41. 65 0
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkIsolationPointRepositoryImpl.kt
  42. 16 0
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkJobTicketRepositoryImpl.kt
  43. 67 0
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkRoleRepositoryImpl.kt
  44. 107 0
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkSopRepository.kt
  45. 44 0
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkSysMenuRepositoryImpl.kt
  46. 2 0
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkUserRepositoryImpl.kt
  47. 83 0
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkWorkflowRepositoryImpl.kt
  48. 58 0
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkWorkstationRepositoryImpl.kt
  49. 99 0
      data/src/main/java/com/grkj/data/repository/impl/standard/ExceptionRepositoryImpl.kt
  50. 464 0
      data/src/main/java/com/grkj/data/repository/impl/standard/HardwareRepositoryImpl.kt
  51. 104 0
      data/src/main/java/com/grkj/data/repository/impl/standard/IsolationPointRepositoryImpl.kt
  52. 43 1
      data/src/main/java/com/grkj/data/repository/impl/standard/JobTicketRepositoryImpl.kt
  53. 90 0
      data/src/main/java/com/grkj/data/repository/impl/standard/RoleRepositoryImpl.kt
  54. 155 0
      data/src/main/java/com/grkj/data/repository/impl/standard/SopRepositoryImpl.kt
  55. 63 0
      data/src/main/java/com/grkj/data/repository/impl/standard/SysMenuRepositoryImpl.kt
  56. 2 0
      data/src/main/java/com/grkj/data/repository/impl/standard/UserRepositoryImpl.kt
  57. 125 0
      data/src/main/java/com/grkj/data/repository/impl/standard/WorkflowRepositoryImpl.kt
  58. 114 0
      data/src/main/java/com/grkj/data/repository/impl/standard/WorkstationRepositoryImpl.kt

+ 0 - 2
data/src/main/java/com/grkj/data/di/AppEntryPoint.kt

@@ -5,7 +5,6 @@ import com.grkj.data.domain.logic.IExceptionLogic
 import com.grkj.data.domain.logic.IHardwareLogic
 import com.grkj.data.domain.logic.IIsolationPointLogic
 import com.grkj.data.domain.logic.IJobTicketLogic
-import com.grkj.data.domain.logic.IRfidTokenLogic
 import com.grkj.data.domain.logic.IRoleLogic
 import com.grkj.data.domain.logic.ISopLogic
 import com.grkj.data.domain.logic.ISysMenuLogic
@@ -22,7 +21,6 @@ interface AppEntryPoint {
     fun hardwareLogic(): IHardwareLogic
     fun isolationPointLogic(): IIsolationPointLogic
     fun jobTicketLogic(): IJobTicketLogic
-    fun rfidTokenLogic(): IRfidTokenLogic
     fun roleLogic(): IRoleLogic
     fun sopLogic(): ISopLogic
     fun userLogic(): IUserLogic

+ 2 - 2
data/src/main/java/com/grkj/data/di/DatabaseModule.kt

@@ -9,7 +9,7 @@ import com.grkj.data.local.dao.RfidTokenDao
 import com.grkj.data.local.dao.RoleDao
 import com.grkj.data.local.dao.SysMenuDao
 import com.grkj.data.local.dao.UserDao
-import com.grkj.data.local.dao.WorkflowStepDao
+import com.grkj.data.local.dao.WorkflowDao
 import com.grkj.data.local.dao.WorkstationDao
 import com.grkj.data.local.database.ISCSDatabase
 import dagger.Module
@@ -65,7 +65,7 @@ object DatabaseModule {
         db.sysMenuDao()
 
     @Provides
-    fun provideWorkflowStepDao(db: ISCSDatabase): WorkflowStepDao = db.workflowStepDao()
+    fun provideWorkflowStepDao(db: ISCSDatabase): WorkflowDao = db.workflowStepDao()
 
     @Provides
     fun provideExceptionDao(db: ISCSDatabase): ExceptionDao = db.exceptionDao()

+ 0 - 3
data/src/main/java/com/grkj/data/di/LogicManager.kt

@@ -6,7 +6,6 @@ import com.grkj.data.domain.logic.IExceptionLogic
 import com.grkj.data.domain.logic.IHardwareLogic
 import com.grkj.data.domain.logic.IIsolationPointLogic
 import com.grkj.data.domain.logic.IJobTicketLogic
-import com.grkj.data.domain.logic.IRfidTokenLogic
 import com.grkj.data.domain.logic.IRoleLogic
 import com.grkj.data.domain.logic.ISopLogic
 import com.grkj.data.domain.logic.ISysMenuLogic
@@ -22,7 +21,6 @@ object LogicManager {
     lateinit var hardwareLogic: IHardwareLogic
     lateinit var isolationPointLogic: IIsolationPointLogic
     lateinit var jobTicketLogic: IJobTicketLogic
-    lateinit var rfidTokenLogic: IRfidTokenLogic
     lateinit var roleLogic: IRoleLogic
     lateinit var sopLogic: ISopLogic
     lateinit var userLogic: IUserLogic
@@ -37,7 +35,6 @@ object LogicManager {
         hardwareLogic = ep.hardwareLogic()
         isolationPointLogic = ep.isolationPointLogic()
         jobTicketLogic = ep.jobTicketLogic()
-        rfidTokenLogic = ep.rfidTokenLogic()
         roleLogic = ep.roleLogic()
         sopLogic = ep.sopLogic()
         userLogic = ep.userLogic()

+ 0 - 8
data/src/main/java/com/grkj/data/di/LogicModule.kt

@@ -5,7 +5,6 @@ import com.grkj.data.domain.logic.IExceptionLogic
 import com.grkj.data.domain.logic.IHardwareLogic
 import com.grkj.data.domain.logic.IIsolationPointLogic
 import com.grkj.data.domain.logic.IJobTicketLogic
-import com.grkj.data.domain.logic.IRfidTokenLogic
 import com.grkj.data.domain.logic.IRoleLogic
 import com.grkj.data.domain.logic.ISopLogic
 import com.grkj.data.domain.logic.ISysMenuLogic
@@ -17,7 +16,6 @@ import com.grkj.data.domain.logic.impl.ExceptionLogic
 import com.grkj.data.domain.logic.impl.HardwareLogic
 import com.grkj.data.domain.logic.impl.IsolationPointLogic
 import com.grkj.data.domain.logic.impl.JobTicketLogic
-import com.grkj.data.domain.logic.impl.RfidTokenLogic
 import com.grkj.data.domain.logic.impl.RoleLogic
 import com.grkj.data.domain.logic.impl.SopLogic
 import com.grkj.data.domain.logic.impl.SysMenuLogic
@@ -55,12 +53,6 @@ object LogicModule {
         standard: JobTicketLogic,
     ): IJobTicketLogic = standard
 
-    @Provides
-    @Singleton
-    fun provideRfidTokenRepository(
-        standard: RfidTokenLogic,
-    ): IRfidTokenLogic = standard
-
     @Provides
     @Singleton
     fun provideRoleRepository(

+ 123 - 2
data/src/main/java/com/grkj/data/di/RepositoryModule.kt

@@ -1,12 +1,42 @@
 package com.grkj.data.di
 
+// === 仓储接口 ===
+
+// === 标准实现(本地 Room/SQLite 等) ===
+
+// === 网络实现(与标准实现同名,前缀 Network) ===
+
 import com.grkj.data.data.MMKVConstants
+import com.grkj.data.repository.ExceptionRepository
+import com.grkj.data.repository.HardwareRepository
+import com.grkj.data.repository.IsolationPointRepository
 import com.grkj.data.repository.JobTicketRepository
+import com.grkj.data.repository.RoleRepository
+import com.grkj.data.repository.SopRepository
+import com.grkj.data.repository.SysMenuRepository
 import com.grkj.data.repository.UserRepository
+import com.grkj.data.repository.WorkflowRepository
+import com.grkj.data.repository.WorkstationRepository
+import com.grkj.data.repository.impl.network.NetworkExceptionRepositoryImpl
+import com.grkj.data.repository.impl.network.NetworkHardwareRepositoryImpl
+import com.grkj.data.repository.impl.network.NetworkIsolationPointRepositoryImpl
 import com.grkj.data.repository.impl.network.NetworkJobTicketRepositoryImpl
+import com.grkj.data.repository.impl.network.NetworkRoleRepositoryImpl
+import com.grkj.data.repository.impl.network.NetworkSopRepository
+import com.grkj.data.repository.impl.network.NetworkSysMenuRepositoryImpl
 import com.grkj.data.repository.impl.network.NetworkUserRepositoryImpl
+import com.grkj.data.repository.impl.network.NetworkWorkflowRepositoryImpl
+import com.grkj.data.repository.impl.network.NetworkWorkstationRepositoryImpl
+import com.grkj.data.repository.impl.standard.ExceptionRepositoryImpl
+import com.grkj.data.repository.impl.standard.HardwareRepositoryImpl
+import com.grkj.data.repository.impl.standard.IsolationPointRepositoryImpl
 import com.grkj.data.repository.impl.standard.JobTicketRepositoryImpl
+import com.grkj.data.repository.impl.standard.RoleRepositoryImpl
+import com.grkj.data.repository.impl.standard.SopRepositoryImpl
+import com.grkj.data.repository.impl.standard.SysMenuRepositoryImpl
 import com.grkj.data.repository.impl.standard.UserRepositoryImpl
+import com.grkj.data.repository.impl.standard.WorkflowRepositoryImpl
+import com.grkj.data.repository.impl.standard.WorkstationRepositoryImpl
 import com.sik.sikcore.extension.getMMKVData
 import dagger.Module
 import dagger.Provides
@@ -16,13 +46,18 @@ import javax.inject.Singleton
 
 /**
  * 仓储层注入器
+ *
+ * 约定:
+ * 1) 若配置了 SERVER_ADDRESS(非空),优先走 Network* 实现;否则回退到 *Impl(本地标准实现)。
+ * 2) 所有 Provider 返回的都是接口类型,调用方无需关心具体实现来源。
+ * 3) 该模块仅负责“实现选择”,不做业务判断。
  */
 @Module
 @InstallIn(SingletonComponent::class)
 object RepositoryModule {
 
     /**
-     * 用户仓储层注入
+     * 用户仓储(本地/网络二选一)
      */
     @Provides
     @Singleton
@@ -33,7 +68,7 @@ object RepositoryModule {
         if (MMKVConstants.SERVER_ADDRESS.getMMKVData("").isNotEmpty()) network else standard
 
     /**
-     * 作业票仓储层注入
+     * 作业票仓储(本地/网络二选一)
      */
     @Provides
     @Singleton
@@ -43,5 +78,91 @@ object RepositoryModule {
     ): JobTicketRepository =
         if (MMKVConstants.SERVER_ADDRESS.getMMKVData("").isNotEmpty()) network else standard
 
+    /**
+     * 异常仓储(本地/网络二选一)
+     */
+    @Provides
+    @Singleton
+    fun provideExceptionRepository(
+        standard: ExceptionRepositoryImpl,
+        network: NetworkExceptionRepositoryImpl
+    ): ExceptionRepository =
+        if (MMKVConstants.SERVER_ADDRESS.getMMKVData("").isNotEmpty()) network else standard
 
+    /**
+     * 硬件仓储(本地/网络二选一)
+     */
+    @Provides
+    @Singleton
+    fun provideHardwareRepository(
+        standard: HardwareRepositoryImpl,
+        network: NetworkHardwareRepositoryImpl
+    ): HardwareRepository =
+        if (MMKVConstants.SERVER_ADDRESS.getMMKVData("").isNotEmpty()) network else standard
+
+    /**
+     * 工作流仓储(本地/网络二选一)
+     */
+    @Provides
+    @Singleton
+    fun provideWorkflowRepository(
+        standard: WorkflowRepositoryImpl,
+        network: NetworkWorkflowRepositoryImpl
+    ): WorkflowRepository =
+        if (MMKVConstants.SERVER_ADDRESS.getMMKVData("").isNotEmpty()) network else standard
+
+    /**
+     * 隔离点仓储(本地/网络二选一)
+     */
+    @Provides
+    @Singleton
+    fun provideIsolationPointRepository(
+        standard: IsolationPointRepositoryImpl,
+        network: NetworkIsolationPointRepositoryImpl
+    ): IsolationPointRepository =
+        if (MMKVConstants.SERVER_ADDRESS.getMMKVData("").isNotEmpty()) network else standard
+
+    /**
+     * 工作站/区域仓储(本地/网络二选一)
+     */
+    @Provides
+    @Singleton
+    fun provideWorkstationRepository(
+        standard: WorkstationRepositoryImpl,
+        network: NetworkWorkstationRepositoryImpl
+    ): WorkstationRepository =
+        if (MMKVConstants.SERVER_ADDRESS.getMMKVData("").isNotEmpty()) network else standard
+
+    /**
+     * SOP 仓储(本地/网络二选一)
+     */
+    @Provides
+    @Singleton
+    fun provideSopRepository(
+        standard: SopRepositoryImpl,
+        network: NetworkSopRepository
+    ): SopRepository =
+        if (MMKVConstants.SERVER_ADDRESS.getMMKVData("").isNotEmpty()) network else standard
+
+    /**
+     * 系统菜单仓储(本地/网络二选一)
+     */
+    @Provides
+    @Singleton
+    fun provideSysMenuRepository(
+        standard: SysMenuRepositoryImpl,
+        network: NetworkSysMenuRepositoryImpl
+    ): SysMenuRepository =
+        if (MMKVConstants.SERVER_ADDRESS.getMMKVData("").isNotEmpty()) network else standard
+
+    /**
+     * 角色仓储(本地/网络二选一)
+     */
+    @Provides
+    @Singleton
+    fun provideRoleRepository(
+        standard: RoleRepositoryImpl,
+        network: NetworkRoleRepositoryImpl
+    ): RoleRepository =
+        if (MMKVConstants.SERVER_ADDRESS.getMMKVData("").isNotEmpty()) network else standard
 }

+ 37 - 5
data/src/main/java/com/grkj/data/domain/logic/IHardwareLogic.kt

@@ -23,6 +23,8 @@ import com.grkj.data.domain.vo.KeyManageFilterVo
 import com.grkj.data.domain.vo.LockManageFilterVo
 import com.grkj.data.domain.vo.PointToMapVo
 import com.grkj.data.domain.vo.RfidTokenManageFilterVo
+import com.grkj.data.local.dos.IsUserWorkstation
+import com.grkj.data.local.dos.IsWorkstation
 
 /**
  * 硬件相关业务层
@@ -355,11 +357,6 @@ interface IHardwareLogic {
      */
     fun getAllPointCount(overviewWorkstationId: Long?): Int
 
-    /**
-     * 获取所有导出点位
-     */
-    fun getAllDataExportPointData(): List<DataExportPointVo>
-
     /**
      * 获取所有硬件数量
      */
@@ -434,4 +431,39 @@ interface IHardwareLogic {
      * 获取所有rfid数据
      */
     fun getAllRfidData(): List<IsRfidToken>
+
+    /**
+     * 根据钥匙id获取钥匙数据
+     */
+    fun getKeyInfoById(keyId: Long): IsKey?
+
+    /**
+     * 根据挂锁id获取挂锁数据
+     */
+    fun getLockInfoById(lockId: Long): IsLock?
+
+    /**
+     * 根据用户id获取工卡数据
+     */
+    fun getIsJobCardByUserId(userId: Long): MutableList<IsJobCard>
+
+    /**
+     * 根据工卡rfid获取用户id
+     */
+    fun getUserIdByCardNfc(cardnfc: String): Long?
+
+    /**
+     * 获取所有区域数据
+     */
+    fun getAllWorkstation(): List<IsWorkstation>
+
+    /**
+     * 获取所有绑定区域数据
+     */
+    fun getAllUserWorkstations(): List<IsUserWorkstation>
+
+    /**
+     * 获取所有工卡数据
+     */
+    fun getAllJobCard(): List<IsJobCard>
 }

+ 10 - 0
data/src/main/java/com/grkj/data/domain/logic/IIsolationPointLogic.kt

@@ -54,4 +54,14 @@ interface IIsolationPointLogic {
      */
     fun updateRfidId(pointId: Long, rfidId: Long)
 
+    /**
+     * 根据点位nfc获取点位数据
+     */
+    fun getPointByPointNfc(pointNfc: String?): IsIsolationPoint?
+
+    /**
+     * 根据点位id获取rfidId
+     */
+    fun getRfidIdByPointIds(inUsePointIds: List<Long>): List<Long>
+
 }

+ 24 - 9
data/src/main/java/com/grkj/data/domain/logic/IJobTicketLogic.kt

@@ -20,6 +20,10 @@ import com.grkj.data.domain.vo.JobTicketGroupDataVo
 import com.grkj.data.domain.vo.JobTicketManageVo
 import com.grkj.data.domain.vo.JobUserVo
 import com.grkj.data.domain.vo.LockedPointVo
+import com.grkj.data.local.dos.IsJobTicketGroup
+import com.grkj.data.local.dos.IsJobTicketLock
+import com.grkj.data.local.dos.IsJobTicketPoints
+import com.grkj.data.local.dos.IsJobTicketUser
 
 /**
  * 作业票业务层
@@ -190,10 +194,6 @@ interface IJobTicketLogic {
      * 获取所有锁定中的点位
      */
     fun getAllLockedPointsData(): List<LockedPointVo>
-    /**
-     * 获取导出的所有锁定中的点位
-     */
-    fun getAllLockedPointsExportData(): List<DataExportLockedPointVo>
 
     /**
      * 获取所有使用中的点位
@@ -358,11 +358,6 @@ interface IJobTicketLogic {
      */
     fun checkKeyInUse(keyIds: List<Long>): Boolean
 
-    /**
-     * 获取所有作业数据
-     */
-    fun getAllJobData(): List<DataExportJobVo>
-
     /**
      * 检查异常作业
      */
@@ -372,4 +367,24 @@ interface IJobTicketLogic {
      * 取消作业异常
      */
     fun cancelJobTicketException(sourceDataId: Long)
+
+    /**
+     * 更新作业票挂锁数据
+     */
+    fun updateJobTicketLockData(isJobTicketLock: IsJobTicketLock)
+
+    /**
+     * 获取所有锁定中的点位数据
+     */
+    fun getAllLockedPointData(pointIds: List<Long>): List<IsJobTicketPoints>
+
+    /**
+     * 根据工作票获取作业用户数据
+     */
+    fun getJobTicketUsersByTicketId(ticketId: Long): List<IsJobTicketUser>
+
+    /**
+     * 根据作业票id获取分组数据
+     */
+    fun getJobTicketGroupsByTicketId(ticketId: Long): List<IsJobTicketGroup>
 }

+ 0 - 18
data/src/main/java/com/grkj/data/domain/logic/IRfidTokenLogic.kt

@@ -1,18 +0,0 @@
-package com.grkj.data.domain.logic
-
-import com.grkj.data.local.dos.IsRfidToken
-
-/**
- * RFID标签业务层
- */
-interface IRfidTokenLogic {
-    /**
-     * 获取rfid数据
-     */
-    fun getRfidData(): List<IsRfidToken>
-
-    /**
-     * 根据rfid获取数据
-     */
-    fun getRfidDataByRfid(rfid: String): IsRfidToken?
-}

+ 31 - 0
data/src/main/java/com/grkj/data/domain/logic/IRoleLogic.kt

@@ -5,6 +5,7 @@ import com.grkj.data.domain.vo.AddRoleDo
 import com.grkj.data.domain.vo.RoleManageFilterVo
 import com.grkj.data.domain.vo.RoleManageVo
 import com.grkj.data.domain.vo.UpdateRoleDo
+import com.grkj.data.local.dos.SysUserRole
 
 /**
  * 角色业务层
@@ -59,4 +60,34 @@ interface IRoleLogic {
      * 添加预设角色
      */
     fun addPresetRoleData(presetSysRole: List<SysRole>)
+
+    /**
+     * 根据用户id获取角色数据
+     */
+    fun getRoleDataByUserId(userId: Long): List<SysRole>
+
+    /**
+     * 获取所有角色数据
+     */
+    fun getAllRole(): List<SysRole>
+
+    /**
+     * 获取所有用户角色绑定数据
+     */
+    fun getAllUserRoles(): List<SysUserRole>
+
+    /**
+     * 根据用户id删除用户角色绑定
+     */
+    fun deleteUserRoleByUserIds(userIds: List<Long>)
+
+    /**
+     * 根据权限字符获取角色数据
+     */
+    fun getRoleDataByRoleKey(roleKey: String): Long?
+
+    /**
+     * 插入角色用户关联
+     */
+    fun insertUserRole(userRoleData: List<SysUserRole>)
 }

+ 0 - 5
data/src/main/java/com/grkj/data/domain/logic/ISopLogic.kt

@@ -104,9 +104,4 @@ interface ISopLogic {
      * 获取所有sop数据
      */
     fun getSopData(): List<IsSop>
-
-    /**
-     * 获取sop导出数据
-     */
-    fun getDataExportSopData(): List<DataExportSopVo>
 }

+ 16 - 0
data/src/main/java/com/grkj/data/domain/logic/ISysMenuLogic.kt

@@ -1,6 +1,7 @@
 package com.grkj.data.domain.logic
 
 import com.grkj.data.local.dos.SysMenu
+import com.grkj.data.local.dos.SysRoleMenu
 
 /**
  * 菜单业务层
@@ -20,4 +21,19 @@ interface ISysMenuLogic {
      * 根据角色id获取菜单数据
      */
     fun getSysMenusByRoleId(roleId: Long): List<SysMenu>
+
+    /**
+     * 插入角色菜单数据
+     */
+    fun insertRoleMenus(sysRoleMenu: MutableList<SysRoleMenu>)
+
+    /**
+     * 根据角色id删除角色菜单数据
+     */
+    fun deleteByRoleId(roleId: Long)
+
+    /**
+     * 根据角色id获取权限
+     */
+    fun getPermissionsByRoleIds(roleIds: List<Long>): MutableList<String?>
 }

+ 10 - 0
data/src/main/java/com/grkj/data/domain/logic/IUserLogic.kt

@@ -197,4 +197,14 @@ interface IUserLogic {
      * 删除不在列表中的指纹
      */
     fun deleteNoUseFingerprint(fingerprintData: List<String>, userId: Long)
+
+    /**
+     * 根据用户id查询用户数据
+     */
+    fun getUserInfoByUserId(userId: Long): SysUserDo?
+
+    /**
+     * 获取所有用户数据
+     */
+    fun getAllUserInfos(): List<SysUserDo>
 }

+ 16 - 16
data/src/main/java/com/grkj/data/domain/logic/impl/DataExportLogic.kt

@@ -4,13 +4,13 @@ import com.grkj.data.enums.DataExportTableEnum
 import com.grkj.data.enums.JobTicketStatusEnum
 import com.grkj.data.domain.logic.BaseLogic
 import com.grkj.data.domain.logic.IDataExportLogic
-import com.grkj.data.domain.logic.IHardwareLogic
-import com.grkj.data.domain.logic.IJobTicketLogic
-import com.grkj.data.domain.logic.IRoleLogic
-import com.grkj.data.domain.logic.ISopLogic
-import com.grkj.data.domain.logic.IWorkstationLogic
 import com.grkj.data.domain.vo.WorkstationManageVo
+import com.grkj.data.repository.HardwareRepository
+import com.grkj.data.repository.JobTicketRepository
+import com.grkj.data.repository.RoleRepository
+import com.grkj.data.repository.SopRepository
 import com.grkj.data.repository.UserRepository
+import com.grkj.data.repository.WorkstationRepository
 import com.grkj.data.utils.ExcelExporter
 import com.grkj.data.utils.ExportSheet
 import com.grkj.data.utils.FileStorageUtils
@@ -29,11 +29,11 @@ import javax.inject.Singleton
 @Singleton
 class DataExportLogic @Inject constructor(
     val userRepository: UserRepository,
-    val roleLogic: IRoleLogic,
-    val workstationLogic: IWorkstationLogic,
-    val hardwareLogic: IHardwareLogic,
-    val jobTicketLogic: IJobTicketLogic,
-    val sopLogic: ISopLogic
+    val roleRepository: RoleRepository,
+    val workstationRepository: WorkstationRepository,
+    val hardwareRepository: HardwareRepository,
+    val jobTicketRepository: JobTicketRepository,
+    val sopRepository: SopRepository
 ) : BaseLogic(), IDataExportLogic {
     /**
      * 导出文件位置
@@ -74,7 +74,7 @@ class DataExportLogic @Inject constructor(
                             }
                         ))
 
-                DataExportTableEnum.ROLE -> roleLogic.getRoleData()
+                DataExportTableEnum.ROLE -> roleRepository.getRoleData()
                     .toExportSheet(
                         skipIfEmpty = false,
                         valueMappers = mapOf(
@@ -86,12 +86,12 @@ class DataExportLogic @Inject constructor(
                         ))
 
                 DataExportTableEnum.WORKSTATION -> flattenWorkstations(
-                    workstationLogic.getWorkstationManageData(),
+                    workstationRepository.getWorkstationData(),
                     { it.sortedBy { it.orderNum } })
                     .toExportSheet(
                         skipIfEmpty = false)
 
-                DataExportTableEnum.POINT -> hardwareLogic.getAllDataExportPointData()
+                DataExportTableEnum.POINT -> hardwareRepository.getAllDataExportPointData()
                     .toExportSheet(
                         skipIfEmpty = false,
                         valueMappers = mapOf(
@@ -100,11 +100,11 @@ class DataExportLogic @Inject constructor(
                             }
                         ))
 
-                DataExportTableEnum.SOP -> sopLogic.getDataExportSopData()
+                DataExportTableEnum.SOP -> sopRepository.getDataExportSopData()
                     .toExportSheet(
                         skipIfEmpty = false)
 
-                DataExportTableEnum.JOB -> jobTicketLogic.getAllJobData()
+                DataExportTableEnum.JOB -> jobTicketRepository.getAllJobData()
                     .toExportSheet(
                         skipIfEmpty = false,
                         valueMappers = mapOf(
@@ -121,7 +121,7 @@ class DataExportLogic @Inject constructor(
                             }
                         ))
 
-                DataExportTableEnum.LOCKED_POINT -> jobTicketLogic.getAllLockedPointsExportData()
+                DataExportTableEnum.LOCKED_POINT -> jobTicketRepository.getAllLockedPointsExportData()
                     .toExportSheet(
                         skipIfEmpty = false,
                         valueMappers = mapOf(

+ 109 - 53
data/src/main/java/com/grkj/data/domain/logic/impl/ExceptionLogic.kt

@@ -1,16 +1,15 @@
 package com.grkj.data.domain.logic.impl
 
-import com.grkj.data.local.dao.ExceptionDao
-import com.grkj.data.local.dao.HardwareDao
-import com.grkj.data.local.dao.WorkflowStepDao
+import com.grkj.data.domain.logic.BaseLogic
+import com.grkj.data.domain.logic.IExceptionLogic
+import com.grkj.data.domain.vo.IsExceptionStandardVo
 import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.enums.JobTicketStatusEnum
 import com.grkj.data.local.dos.IsExceptionSourceStandard
 import com.grkj.data.local.dos.IsExceptionStandard
-import com.grkj.data.domain.vo.IsExceptionStandardVo
-import com.grkj.data.domain.logic.BaseLogic
-import com.grkj.data.domain.logic.IExceptionLogic
-import com.grkj.data.domain.logic.IJobTicketLogic
+import com.grkj.data.repository.ExceptionRepository
+import com.grkj.data.repository.HardwareRepository
+import com.grkj.data.repository.JobTicketRepository
 import com.grkj.shared.utils.i18n.I18nManager
 import com.sik.sikcore.data.BeanUtils
 import com.sik.sikcore.date.TimeUtils
@@ -23,52 +22,72 @@ import javax.inject.Singleton
  */
 @Singleton
 class ExceptionLogic @Inject constructor(
-    val exceptionDao: ExceptionDao,
-    val jobTicketLogic: IJobTicketLogic,
-    val hardwareDao: HardwareDao,
-    val workflowStepDao: WorkflowStepDao
+    val exceptionRepository: ExceptionRepository,
+    val jobTicketRepository: JobTicketRepository,
+    val hardwareRepository: HardwareRepository
 ) : BaseLogic(),
     IExceptionLogic {
 
     override fun cancelException(exceptionData: List<IsExceptionStandardVo>) {
         exceptionData.forEach {
             it.exceptionStatus =
-                CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find { I18nManager.t(it.dictLabel) ==  I18nManager.t("canceled") }?.dictValue?.toInt()
+                CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find {
+                    I18nManager.t(it.dictLabel) == I18nManager.t(
+                        "canceled"
+                    )
+                }?.dictValue?.toInt()
         }
         exceptionData.flatMap { it.sourceData }
             .forEach { exceptionSource ->
                 when (exceptionSource.sourceDataType) {
-                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("key") }?.dictValue?.toInt() -> {
-                        val keyInfo = hardwareDao.getKeyInfoById(exceptionSource.sourceDataId)
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find {
+                        I18nManager.t(it.dictLabel) == I18nManager.t(
+                            "key"
+                        )
+                    }?.dictValue?.toInt() -> {
+                        val keyInfo =
+                            hardwareRepository.getKeyInfoById(exceptionSource.sourceDataId)
                         keyInfo?.exStatus = null
                         keyInfo?.remark = null
                         keyInfo?.let {
-                            hardwareDao.updateKeyInfo(it)
+                            hardwareRepository.updateKeyInfo(it)
                         }
                     }
 
-                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("lock") }?.dictValue?.toInt() -> {
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find {
+                        I18nManager.t(it.dictLabel) == I18nManager.t(
+                            "lock"
+                        )
+                    }?.dictValue?.toInt() -> {
                         val lockInfo =
-                            hardwareDao.getLockInfoById(exceptionSource.sourceDataId)
+                            hardwareRepository.getLockInfoById(exceptionSource.sourceDataId)
                         lockInfo?.exStatus = null
                         lockInfo?.remark = null
                         lockInfo?.let {
-                            hardwareDao.updateLockInfo(it)
+                            hardwareRepository.updateLockInfo(it)
                         }
                     }
 
-                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("slot") }?.dictValue?.toInt() -> {
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find {
+                        I18nManager.t(it.dictLabel) == I18nManager.t(
+                            "slot"
+                        )
+                    }?.dictValue?.toInt() -> {
                         val slotsInfo =
-                            hardwareDao.getIsLockCabinetSlotBySlotId(exceptionSource.sourceDataId)
+                            hardwareRepository.getIsLockCabinetSlotBySlotId(exceptionSource.sourceDataId)
                         slotsInfo?.status = null
                         slotsInfo?.remark = null
                         slotsInfo?.let {
-                            hardwareDao.updateSlotsInfo(it)
+                            hardwareRepository.updateSlotsInfo(it)
                         }
                     }
 
-                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("job") }?.dictValue?.toInt() -> {
-                        jobTicketLogic.cancelJobTicketException(exceptionSource.sourceDataId)
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find {
+                        I18nManager.t(it.dictLabel) == I18nManager.t(
+                            "job"
+                        )
+                    }?.dictValue?.toInt() -> {
+                        jobTicketRepository.cancelJobTicketException(exceptionSource.sourceDataId)
                     }
                 }
             }
@@ -79,12 +98,12 @@ class ExceptionLogic @Inject constructor(
         }
         isExceptionData?.let {
             logger.info("已取消的异常:${it}")
-            exceptionDao.updateException(it)
+            exceptionRepository.updateException(it)
         }
     }
 
     override fun getExceptionData(): List<IsExceptionStandardVo> {
-        val exceptionData = exceptionDao.getExceptionData()
+        val exceptionData = exceptionRepository.getExceptionData()
         val result: List<IsExceptionStandardVo> = exceptionData.mapNotNull {
             BeanUtils.copyProperties(
                 it,
@@ -92,7 +111,7 @@ class ExceptionLogic @Inject constructor(
             )
         }
         result.forEach {
-            val sourceData = exceptionDao.getExceptionSourceDataByExceptionId(it.exceptionId)
+            val sourceData = exceptionRepository.getExceptionSourceDataByExceptionId(it.exceptionId)
             it.sourceData = sourceData
         }
         return result
@@ -101,49 +120,85 @@ class ExceptionLogic @Inject constructor(
     override fun handleException(exceptionData: List<IsExceptionStandardVo>) {
         exceptionData.forEach { exceptionDataItem ->
             exceptionDataItem.exceptionStatus =
-                CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("processed") }?.dictValue?.toInt()
+                CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find {
+                    I18nManager.t(it.dictLabel) == I18nManager.t(
+                        "processed"
+                    )
+                }?.dictValue?.toInt()
             exceptionDataItem.sourceData.forEach { exceptionSource ->
                 when (exceptionSource.sourceDataType) {
-                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("key") }?.dictValue?.toInt() -> {
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find {
+                        I18nManager.t(it.dictLabel) == I18nManager.t(
+                            "key"
+                        )
+                    }?.dictValue?.toInt() -> {
                         val keyInfo =
-                            hardwareDao.getKeyInfoById(exceptionSource.sourceDataId)
+                            hardwareRepository.getKeyInfoById(exceptionSource.sourceDataId)
                         keyInfo?.exStatus =
-                            CommonDictDataEnum.KEY_STATUS.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("abnormal") }?.dictValue
+                            CommonDictDataEnum.KEY_STATUS.commonDictRes.find {
+                                I18nManager.t(it.dictLabel) == I18nManager.t(
+                                    "abnormal"
+                                )
+                            }?.dictValue
                         keyInfo?.remark = exceptionSource.remark
                         keyInfo?.let {
-                            hardwareDao.updateKeyInfo(it)
+                            hardwareRepository.updateKeyInfo(it)
                         }
                     }
 
-                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("lock") }?.dictValue?.toInt() -> {
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find {
+                        I18nManager.t(it.dictLabel) == I18nManager.t(
+                            "lock"
+                        )
+                    }?.dictValue?.toInt() -> {
                         val lockInfo =
-                            hardwareDao.getLockInfoById(exceptionSource.sourceDataId)
+                            hardwareRepository.getLockInfoById(exceptionSource.sourceDataId)
                         lockInfo?.exStatus =
-                            CommonDictDataEnum.PADLOCK_STATUS.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("abnormal") }?.dictValue
+                            CommonDictDataEnum.PADLOCK_STATUS.commonDictRes.find {
+                                I18nManager.t(it.dictLabel) == I18nManager.t(
+                                    "abnormal"
+                                )
+                            }?.dictValue
                         lockInfo?.remark = exceptionSource.remark
                         lockInfo?.let {
-                            hardwareDao.updateLockInfo(it)
+                            hardwareRepository.updateLockInfo(it)
                         }
                     }
 
-                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("slot") }?.dictValue?.toInt() -> {
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find {
+                        I18nManager.t(it.dictLabel) == I18nManager.t(
+                            "slot"
+                        )
+                    }?.dictValue?.toInt() -> {
                         val slotsInfo =
-                            hardwareDao.getIsLockCabinetSlotBySlotId(exceptionSource.sourceDataId)
+                            hardwareRepository.getIsLockCabinetSlotBySlotId(exceptionSource.sourceDataId)
                         slotsInfo?.status =
-                            CommonDictDataEnum.SLOT_STATUS.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("abnormal") }?.dictValue
+                            CommonDictDataEnum.SLOT_STATUS.commonDictRes.find {
+                                I18nManager.t(it.dictLabel) == I18nManager.t(
+                                    "abnormal"
+                                )
+                            }?.dictValue
                         slotsInfo?.remark = exceptionSource.remark
                         slotsInfo?.let {
-                            hardwareDao.updateSlotsInfo(it)
+                            hardwareRepository.updateSlotsInfo(it)
                         }
                     }
 
-                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find {I18nManager.t(it.dictLabel) == I18nManager.t("job") }?.dictValue?.toInt() -> {
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find {
+                        I18nManager.t(it.dictLabel) == I18nManager.t(
+                            "job"
+                        )
+                    }?.dictValue?.toInt() -> {
                         val jobTicketData =
-                            jobTicketLogic.getTicketRawDataByTicketId(exceptionSource.sourceDataId)
+                            jobTicketRepository.getTicketRawDataByTicketId(exceptionSource.sourceDataId)
                         val jobTicketSteps =
-                            jobTicketLogic.getJobTicketStepDataByTicketId(exceptionSource.sourceDataId)
+                            jobTicketRepository.getJobTicketStepDataByTicketId(exceptionSource.sourceDataId)
                         jobTicketData?.exStatus =
-                            CommonDictDataEnum.JOB_TICKET_STATUS.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("abnormal") }?.dictValue?.toInt()
+                            CommonDictDataEnum.JOB_TICKET_STATUS.commonDictRes.find {
+                                I18nManager.t(
+                                    it.dictLabel
+                                ) == I18nManager.t("abnormal")
+                            }?.dictValue?.toInt()
                         jobTicketData?.remark = exceptionSource.remark
                         logger.info("异常处理作业票1:${exceptionDataItem.toJson()}")
                         logger.info(
@@ -157,11 +212,11 @@ class ExceptionLogic @Inject constructor(
                         )
                         jobTicketSteps.forEach {
                             it.stepStatus = "1"
-                            jobTicketLogic.updateTicketStepData(it)
+                            jobTicketRepository.updateTicketStepData(it)
                         }
                         jobTicketData?.ticketStatus = JobTicketStatusEnum.FINISHED.status
                         jobTicketData?.let {
-                            jobTicketLogic.updateTicketData(it)
+                            jobTicketRepository.updateTicketData(it)
                         }
                     }
                 }
@@ -175,31 +230,32 @@ class ExceptionLogic @Inject constructor(
         }
         isExceptionData?.let {
             logger.info("已处理的异常:${it}")
-            exceptionDao.updateException(it)
+            exceptionRepository.updateException(it)
         }
     }
 
     override fun getExceptionDataById(exceptionId: Long): IsExceptionStandardVo? {
-        val exceptionData = exceptionDao.getExceptionDataById(exceptionId)
+        val exceptionData = exceptionRepository.getExceptionDataById(exceptionId)
         val result = BeanUtils.copyProperties(exceptionData, IsExceptionStandardVo::class.java)
-        val exceptionSourceData = exceptionDao.getExceptionSourceDataByExceptionId(exceptionId)
+        val exceptionSourceData =
+            exceptionRepository.getExceptionSourceDataByExceptionId(exceptionId)
         result?.sourceData = exceptionSourceData
         return result
     }
 
     override fun reportException(exceptionData: IsExceptionStandard): Long {
-        return exceptionDao.reportException(exceptionData)
+        return exceptionRepository.reportException(exceptionData)
     }
 
     override fun saveExceptionSourceData(exceptionSourceData: IsExceptionSourceStandard) {
-        exceptionDao.saveExceptionSourceData(exceptionSourceData)
+        exceptionRepository.saveExceptionSourceData(exceptionSourceData)
     }
 
     override fun deleteExceptionBySourceIds(selectedTicketId: List<Long>) {
         val exceptionSourceStandards =
-            exceptionDao.getExceptionSourceDataBySourceDataIds(selectedTicketId)
-        exceptionDao.deleteExceptionByExceptionIds(exceptionSourceStandards.mapNotNull { it.exceptionId }
+            exceptionRepository.getExceptionSourceDataBySourceDataIds(selectedTicketId)
+        exceptionRepository.deleteExceptionByExceptionIds(exceptionSourceStandards.mapNotNull { it.exceptionId }
             .distinct())
-        exceptionDao.deleteExceptionSourceDataById(exceptionSourceStandards.mapNotNull { it.sourceId })
+        exceptionRepository.deleteExceptionSourceDataById(exceptionSourceStandards.mapNotNull { it.sourceId })
     }
 }

+ 157 - 139
data/src/main/java/com/grkj/data/domain/logic/impl/HardwareLogic.kt

@@ -1,23 +1,29 @@
 package com.grkj.data.domain.logic.impl
 
-import com.grkj.data.local.dao.HardwareDao
-import com.grkj.data.local.dao.IsolationPointDao
-import com.grkj.data.local.dao.JobTicketDao
-import com.grkj.data.local.dao.UserDao
 import com.grkj.data.data.MMKVConstants
 import com.grkj.data.data.MainDomainData
+import com.grkj.data.domain.logic.BaseLogic
+import com.grkj.data.domain.logic.IHardwareLogic
+import com.grkj.data.domain.vo.CardManageFilterVo
+import com.grkj.data.domain.vo.KeyManageFilterVo
+import com.grkj.data.domain.vo.LockManageFilterVo
+import com.grkj.data.domain.vo.PointToMapVo
+import com.grkj.data.domain.vo.RfidTokenManageFilterVo
+import com.grkj.data.entity.local.LockData
+import com.grkj.data.entity.local.PointData
 import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.enums.HardwareMode
+import com.grkj.data.local.dos.IsIsolationPoint
 import com.grkj.data.local.dos.IsJobCard
 import com.grkj.data.local.dos.IsJobTicketLock
 import com.grkj.data.local.dos.IsKey
 import com.grkj.data.local.dos.IsLock
 import com.grkj.data.local.dos.IsLockCabinet
 import com.grkj.data.local.dos.IsLockCabinetSlots
+import com.grkj.data.local.dos.IsMapPoint
 import com.grkj.data.local.dos.IsRfidToken
-import com.grkj.data.entity.local.LockData
-import com.grkj.data.entity.local.PointData
-import com.grkj.data.domain.logic.IHardwareLogic
+import com.grkj.data.local.dos.IsUserWorkstation
+import com.grkj.data.local.dos.IsWorkstation
 import com.grkj.data.net.req.LockPointUpdateReq
 import com.grkj.data.net.req.LockTakeUpdateReq
 import com.grkj.data.net.res.CabinetSlotsRecord
@@ -29,15 +35,11 @@ import com.grkj.data.net.res.KeyPageRes
 import com.grkj.data.net.res.LockInfoRes
 import com.grkj.data.net.res.LockPageItem
 import com.grkj.data.net.res.LockPageRes
-import com.grkj.data.domain.vo.CardManageFilterVo
-import com.grkj.data.domain.vo.KeyManageFilterVo
-import com.grkj.data.domain.vo.LockManageFilterVo
-import com.grkj.data.domain.vo.RfidTokenManageFilterVo
-import com.grkj.data.domain.logic.BaseLogic
-import com.grkj.data.local.dos.IsIsolationPoint
-import com.grkj.data.local.dos.IsMapPoint
-import com.grkj.data.domain.vo.DataExportPointVo
-import com.grkj.data.domain.vo.PointToMapVo
+import com.grkj.data.repository.HardwareRepository
+import com.grkj.data.repository.IsolationPointRepository
+import com.grkj.data.repository.JobTicketRepository
+import com.grkj.data.repository.UserRepository
+import com.grkj.data.repository.WorkstationRepository
 import com.grkj.shared.utils.i18n.I18nManager
 import com.sik.sikcore.data.BeanUtils
 import com.sik.sikcore.date.TimeUtils
@@ -51,11 +53,11 @@ import javax.inject.Singleton
  */
 @Singleton
 class HardwareLogic @Inject constructor(
-    val hardwareDao: HardwareDao,
-    val userDao: UserDao,
-    val isolationPointDao: IsolationPointDao,
-    val jobTicketDao: JobTicketDao,
-    val workstationLogic: WorkstationLogic
+    val hardwareRepository: HardwareRepository,
+    val userRepository: UserRepository,
+    val isolationPointRepository: IsolationPointRepository,
+    val jobTicketRepository: JobTicketRepository,
+    val workstationRepository: WorkstationRepository
 ) : BaseLogic(), IHardwareLogic {
     private val updateLock = Any()
 
@@ -73,7 +75,7 @@ class HardwareLogic @Inject constructor(
      * 获取锁信息
      */
     override fun getLockInfo(rfid: String): LockInfoRes? {
-        val isLock = hardwareDao.getLockInfoByRfid(rfid)
+        val isLock = hardwareRepository.getLockInfoByRfid(rfid)
         var lockInfoRes = BeanUtils.copyProperties(isLock, LockInfoRes::class.java)
         logger.info("lockInfo:${isLock},${lockInfoRes}")
         return lockInfoRes
@@ -93,7 +95,7 @@ class HardwareLogic @Inject constructor(
      * 获取钥匙信息
      */
     override fun getKeyInfo(rfid: String): KeyInfoRes? {
-        val isKey = hardwareDao.getKeyInfoByRfid(rfid)
+        val isKey = hardwareRepository.getKeyInfoByRfid(rfid)
         var keyInfoRes = BeanUtils.copyProperties(isKey, KeyInfoRes::class.java)
         logger.info("keyInfo:${isKey},${keyInfoRes}")
         return keyInfoRes
@@ -113,9 +115,9 @@ class HardwareLogic @Inject constructor(
         lockPointUpdateData.forEach { info ->
             val keyInfo = getKeyInfo(info.keyNfc ?: "")
             val lockInfo = getLockInfo(info.lockNfc ?: "")
-            val pointInfo = isolationPointDao.getPointByPointNfc(info.pointNfc)
+            val pointInfo = isolationPointRepository.getPointByPointNfc(info.pointNfc)
             if (info.target == 0) {
-                hardwareDao.updatePointLockData(
+                hardwareRepository.updatePointLockData(
                     info.ticketId ?: 0,
                     keyInfo?.keyId ?: 0,
                     lockInfo?.lockId ?: 0,
@@ -123,7 +125,7 @@ class HardwareLogic @Inject constructor(
                     (info.target ?: -1) + 1
                 )
             } else {
-                hardwareDao.updatePointUnLockData(
+                hardwareRepository.updatePointUnLockData(
                     info.ticketId ?: 0,
                     keyInfo?.keyId ?: 0,
                     lockInfo?.lockId ?: 0,
@@ -141,12 +143,14 @@ class HardwareLogic @Inject constructor(
         synchronized(updateLock) {
             lockTakeList.forEach { lockTakeInfo ->
                 lockTakeInfo.ticketId?.let { ticketId ->
-                    val isJobTicketPoints = jobTicketDao.getJobTicketPointsDataByTicketId(ticketId)
-                    val isJobTicketLock = jobTicketDao.getJobTicketLockDataByTicketId(ticketId)
-                        .filter {
-                            it.lockId !in isJobTicketPoints.filter { it.groupId == MainDomainData.deviceTakeTicketGroupBound[ticketId] }
-                                .mapNotNull { it.lockId }
-                        }
+                    val isJobTicketPoints =
+                        jobTicketRepository.getJobTicketPointsDataByTicketId(ticketId)
+                    val isJobTicketLock =
+                        jobTicketRepository.getJobTicketLockDataByTicketId(ticketId)
+                            .filter {
+                                it.lockId !in isJobTicketPoints.filter { it.groupId == MainDomainData.deviceTakeTicketGroupBound[ticketId] }
+                                    .mapNotNull { it.lockId }
+                            }
                     logger.info("作业票挂锁信息:${isJobTicketLock.toJson()}-${MainDomainData.deviceTakeTicketGroupBound[ticketId]}")
                     val emptyTicketLockInfo =
                         isJobTicketLock.firstOrNull { it.groupId == MainDomainData.deviceTakeTicketGroupBound[ticketId] }
@@ -163,7 +167,7 @@ class HardwareLogic @Inject constructor(
                                 IsJobTicketLock::class.java
                             )
                             isJobTicketLock?.let {
-                                jobTicketDao.updateJobTicketLockData(it)
+                                jobTicketRepository.updateJobTicketLockData(it)
                             }
                         }
                     }
@@ -174,12 +178,12 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun getPointIdByPointNfc(pointRfid: String?): Long {
-        return hardwareDao.getPointIdByPointNfc(pointRfid)
+        return hardwareRepository.getPointIdByPointNfc(pointRfid)
     }
 
     override fun getIsLockCabinetSlotsPage(callback: (CabinetSlotsRes?) -> Unit) {
         val allLockCabinetSlots =
-            hardwareDao.getAllLockCabinetSlots()
+            hardwareRepository.getAllLockCabinetSlots()
                 .mapNotNull { BeanUtils.copyProperties(it, CabinetSlotsRecord::class.java) }
         callback(
             CabinetSlotsRes(
@@ -192,7 +196,7 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun getIsLockPage(callback: (LockPageRes?) -> Unit) {
-        val allLockData = hardwareDao.getAllLockData().mapNotNull {
+        val allLockData = hardwareRepository.getAllLockData().mapNotNull {
             BeanUtils.copyProperties(
                 it,
                 LockPageItem::class.java
@@ -202,7 +206,7 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun getIsKeyPage(callback: (KeyPageRes?) -> Unit) {
-        val allKeyData = hardwareDao.getAllKeyData().mapNotNull {
+        val allKeyData = hardwareRepository.getAllKeyData().mapNotNull {
             BeanUtils.copyProperties(
                 it,
                 KeyPageItem::class.java
@@ -212,22 +216,50 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun getMapPointDataByPointIds(pointIds: List<Long>): List<IsMapPoint> {
-        return hardwareDao.getMapPointDataByPointIds(pointIds)
+        return hardwareRepository.getMapPointDataByPointIds(pointIds)
     }
 
     override fun updateMapPoint(pointToMapVo: PointToMapVo) {
-        val isMapPoint = hardwareDao.getMapPointDataByEntityId(pointToMapVo.pointId)
+        val isMapPoint = hardwareRepository.getMapPointDataByEntityId(pointToMapVo.pointId)
         isMapPoint.x = (pointToMapVo.x?.toInt()?.div(50)).toString()
         isMapPoint.y = (pointToMapVo.y?.toInt()?.div(50)).toString()
         isMapPoint.showInMap = pointToMapVo.showInMap
-        hardwareDao.updateMapPoint(isMapPoint)
-        val pointData = hardwareDao.getPointDataByPointId(pointToMapVo.pointId)
+        hardwareRepository.updateMapPoint(isMapPoint)
+        val pointData = hardwareRepository.getPointDataByPointId(pointToMapVo.pointId)
         pointData.pointSerialNumber = pointToMapVo.pointSerialNumber
-        hardwareDao.updatePointData(pointData)
+        hardwareRepository.updatePointData(pointData)
+    }
+
+    override fun getAllUserWorkstations(): List<IsUserWorkstation> {
+        return hardwareRepository.getAllUserWorkstations()
+    }
+
+    override fun getAllJobCard(): List<IsJobCard> {
+        return hardwareRepository.getAllJobCard()
+    }
+
+    override fun getAllWorkstation(): List<IsWorkstation> {
+        return workstationRepository.getAllWorkstation()
+    }
+
+    override fun getUserIdByCardNfc(cardnfc: String): Long? {
+        return hardwareRepository.getUserIdByCardNfc(cardnfc)
+    }
+
+    override fun getIsJobCardByUserId(userId: Long): MutableList<IsJobCard> {
+        return hardwareRepository.getIsJobCardByUserId(userId)
+    }
+
+    override fun getLockInfoById(lockId: Long): IsLock? {
+        return hardwareRepository.getLockInfoById(lockId)
+    }
+
+    override fun getKeyInfoById(keyId: Long): IsKey? {
+        return hardwareRepository.getKeyInfoById(keyId)
     }
 
     override fun saveLocksInfo(lockRfid: List<String>) {
-        val defaultLockCodeSize = hardwareDao.getLastLockId()
+        val defaultLockCodeSize = hardwareRepository.getLastLockId()
         val isLocks = lockRfid.mapIndexed { index, lockNfc ->
             val isLock = IsLock()
             isLock.lockCode = "LOCK_${defaultLockCodeSize + index + 1}"
@@ -240,20 +272,20 @@ class HardwareLogic @Inject constructor(
                 }?.dictValue
             isLock
         }
-        hardwareDao.addLocksInfo(isLocks)
+        hardwareRepository.addLocksInfo(isLocks)
         HardwareMode.getCurrentHardwareMode().removeNewHardwareLock(lockRfid)
     }
 
     override fun changeShowInMap(pointId: Long, showInMap: Boolean) {
-        hardwareDao.changeShowInMap(pointId, showInMap)
+        hardwareRepository.changeShowInMap(pointId, showInMap)
     }
 
     override fun removeCardBindByUserIds(userIds: List<Long>) {
-        hardwareDao.removeCardBindByUserIds(userIds)
+        hardwareRepository.removeCardBindByUserIds(userIds)
     }
 
     override fun removePointFromMap(pointId: Long) {
-        hardwareDao.deletePointFromMap(pointId)
+        hardwareRepository.deletePointFromMap(pointId)
     }
 
     override fun addPointToMap(pointToMapVo: PointToMapVo) {
@@ -262,22 +294,22 @@ class HardwareLogic @Inject constructor(
         isMapPoint.x = (pointToMapVo.x?.toInt()?.div(50)).toString()
         isMapPoint.y = (pointToMapVo.y?.toInt()?.div(50)).toString()
         isMapPoint.showInMap = pointToMapVo.showInMap
-        hardwareDao.insertMapPoint(isMapPoint)
-        val pointData = hardwareDao.getPointDataByPointId(pointToMapVo.pointId)
+        hardwareRepository.insertMapPoint(isMapPoint)
+        val pointData = hardwareRepository.getPointDataByPointId(pointToMapVo.pointId)
         pointData.pointSerialNumber = pointToMapVo.pointSerialNumber
-        hardwareDao.updatePointData(pointData)
+        hardwareRepository.updatePointData(pointData)
     }
 
     override fun getRfidDataByRfidId(rfidId: List<Long>): List<IsRfidToken> {
-        return hardwareDao.getRfidDataByRfidIds(rfidId)
+        return hardwareRepository.getRfidDataByRfidIds(rfidId)
     }
 
     override fun getPointDataByWorkstationId(workstationId: Long): List<IsIsolationPoint> {
-        return hardwareDao.getPointDataByWorkstationId(workstationId)
+        return hardwareRepository.getPointDataByWorkstationId(workstationId)
     }
 
     override fun getRfidIdByPointIds(inUsePointIds: List<Long>): List<Long> {
-        return isolationPointDao.getRfidIdByPointIds(inUsePointIds)
+        return isolationPointRepository.getRfidIdByPointIds(inUsePointIds)
     }
 
     override fun getDictData(
@@ -300,19 +332,19 @@ class HardwareLogic @Inject constructor(
                 }?.dictValue
             isJobCard
         }
-        hardwareDao.addCard(isJobCard)
+        hardwareRepository.addCard(isJobCard)
     }
 
     override fun deleteCardByUserIdAndCardCode(userId: Long, cardCode: String) {
-        hardwareDao.deleteCardByUserIdAndCardCode(userId, cardCode)
+        hardwareRepository.deleteCardByUserIdAndCardCode(userId, cardCode)
     }
 
     override fun getPointNfcDataByPointIds(pointIds: List<Long?>): List<PointData> {
-        return hardwareDao.getPointNfcDataByPointIds(pointIds)
+        return hardwareRepository.getPointNfcDataByPointIds(pointIds)
     }
 
     override fun getJobTicketPointLockNfcDataListByPointId(pointId: Long): List<LockData> {
-        return hardwareDao.getJobTicketPointLockNfcDataListByPointId(pointId)
+        return hardwareRepository.getJobTicketPointLockNfcDataListByPointId(pointId)
     }
 
     override fun addRfidTokenHardware(pointRfid: List<String>) {
@@ -328,12 +360,12 @@ class HardwareLogic @Inject constructor(
                 }?.dictValue
             isRfidToken
         }
-        hardwareDao.addRfidToken(isRfidToken)
+        hardwareRepository.addRfidToken(isRfidToken)
     }
 
     override fun saveKeyInfo(keyNfc: String, keyMacAddress: String) {
         val isKey = IsKey()
-        val defaultKeyCodeSize = hardwareDao.getLastKeyId()
+        val defaultKeyCodeSize = hardwareRepository.getLastKeyId()
         isKey.keyCode = "KEY_${defaultKeyCodeSize + 1}"
         isKey.keyNfc = keyNfc
         isKey.macAddress = keyMacAddress
@@ -343,12 +375,12 @@ class HardwareLogic @Inject constructor(
                     "normal"
                 )
             }?.dictValue
-        hardwareDao.addKeyInfo(isKey)
+        hardwareRepository.addKeyInfo(isKey)
     }
 
     override fun saveLockInfo(lockNfc: String) {
         val isLock = IsLock()
-        val defaultLockCodeSize = hardwareDao.getLastLockId()
+        val defaultLockCodeSize = hardwareRepository.getLastLockId()
         isLock.lockCode = "LOCK_${defaultLockCodeSize + 1}"
         isLock.lockNfc = lockNfc
         isLock.exStatus =
@@ -357,66 +389,66 @@ class HardwareLogic @Inject constructor(
                     "normal"
                 )
             }?.dictValue
-        hardwareDao.addLockInfo(isLock)
+        hardwareRepository.addLockInfo(isLock)
     }
 
     override fun clearKeyAndLock() {
-        hardwareDao.clearIsKey()
-        hardwareDao.clearIsLock()
+        hardwareRepository.clearIsKey()
+        hardwareRepository.clearIsLock()
     }
 
     override fun deleteKeyByKeyIds(keyIds: List<Long>) {
-        hardwareDao.deleteKeyByKeyIds(keyIds)
+        hardwareRepository.deleteKeyByKeyIds(keyIds)
     }
 
     override fun deleteLockByLockIds(lockIds: List<Long>) {
-        hardwareDao.deleteLockByLockIds(lockIds)
+        hardwareRepository.deleteLockByLockIds(lockIds)
     }
 
     override fun deleteCardByCardIds(cardIds: List<Long>) {
-        hardwareDao.deleteCardByCardIds(cardIds)
+        hardwareRepository.deleteCardByCardIds(cardIds)
     }
 
     override fun deleteRfidTokenByRfidTokenIds(rfidTokenIds: List<Long>) {
-        hardwareDao.deleteRfidTokenByRfidTokenIds(rfidTokenIds)
+        hardwareRepository.deleteRfidTokenByRfidTokenIds(rfidTokenIds)
     }
 
     override fun addKeyInfo(isKey: IsKey) {
-        hardwareDao.addKeyInfo(isKey)
+        hardwareRepository.addKeyInfo(isKey)
     }
 
     override fun addLockInfo(isLock: IsLock) {
-        hardwareDao.addLockInfo(isLock)
+        hardwareRepository.addLockInfo(isLock)
     }
 
     override fun addCardInfo(isJobCard: IsJobCard) {
-        hardwareDao.addCard(isJobCard)
+        hardwareRepository.addCard(isJobCard)
     }
 
     override fun addRfidTokenInfo(isRfidToken: IsRfidToken): Long {
-        return hardwareDao.addRfidToken(isRfidToken)
+        return hardwareRepository.addRfidToken(isRfidToken)
     }
 
     override fun getAllRfidData(): List<IsRfidToken> {
-        return hardwareDao.getAllRfidTokenData()
+        return hardwareRepository.getAllRfidTokenData()
     }
 
     override fun updateKeyInfo(isKey: IsKey) {
-        hardwareDao.updateKeyInfo(isKey)
+        hardwareRepository.updateKeyInfo(isKey)
     }
 
     override fun updateLockInfo(isLock: IsLock) {
-        hardwareDao.updateLockInfo(isLock)
+        hardwareRepository.updateLockInfo(isLock)
     }
 
     override fun updateCardInfo(isJobCard: IsJobCard) {
-        val localCardData = hardwareDao.getCardDataByRfid(isJobCard.cardNfc)
+        val localCardData = hardwareRepository.getCardDataByRfid(isJobCard.cardNfc)
         isJobCard.cardCode = localCardData?.cardCode ?: ""
-        hardwareDao.updateCardInfo(isJobCard)
+        hardwareRepository.updateCardInfo(isJobCard)
     }
 
     override fun updateRfidTokenInfo(isRfidToken: IsRfidToken) {
-        hardwareDao.updateRfidToken(isRfidToken)
+        hardwareRepository.updateRfidToken(isRfidToken)
     }
 
     override fun getKeyInfoPage(
@@ -424,7 +456,7 @@ class HardwareLogic @Inject constructor(
         size: Int,
         offset: Int
     ): List<IsKey> {
-        return hardwareDao.getKeyInfoPage(
+        return hardwareRepository.getKeyInfoPage(
             filterVo?.keyCode,
             filterVo?.keyNfc,
             filterVo?.macAddress,
@@ -435,7 +467,7 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun getAllKeyInfo(): List<IsKey> {
-        return hardwareDao.getAllKeyData()
+        return hardwareRepository.getAllKeyData()
     }
 
     override fun getLockInfoPage(
@@ -443,7 +475,7 @@ class HardwareLogic @Inject constructor(
         size: Int,
         offset: Int
     ): List<IsLock> {
-        return hardwareDao.getLockInfoPage(
+        return hardwareRepository.getLockInfoPage(
             filterVo?.lockCode,
             filterVo?.lockNfc,
             filterVo?.status?.let { if (it) 0 else 2 } ?: null,
@@ -457,7 +489,7 @@ class HardwareLogic @Inject constructor(
         size: Int,
         offset: Int
     ): List<IsJobCard> {
-        return hardwareDao.getCardInfoPage(
+        return hardwareRepository.getCardInfoPage(
             filterVo?.cardNfc,
             filterVo?.username,
             filterVo?.status?.let { if (it) 0 else 2 } ?: null,
@@ -471,7 +503,7 @@ class HardwareLogic @Inject constructor(
         size: Int,
         offset: Int
     ): List<IsRfidToken> {
-        return hardwareDao.getRfidTokenInfoPage(
+        return hardwareRepository.getRfidTokenInfoPage(
             filterVo?.rfidCode,
             filterVo?.rfid,
             filterVo?.status?.let { if (it) 0 else 2 } ?: null,
@@ -481,69 +513,69 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun deleteKeyTable() {
-        hardwareDao.deleteKeyTable()
+        hardwareRepository.deleteKeyTable()
     }
 
     override fun removeCardData() {
-        hardwareDao.removeCardData()
+        hardwareRepository.removeCardData()
     }
 
     override fun removeRfidTokenData() {
-        hardwareDao.removeRfidTokenData()
+        hardwareRepository.removeRfidTokenData()
     }
 
     override fun getLastCardId(): Int {
-        return hardwareDao.getLastCardId()
+        return hardwareRepository.getLastCardId()
     }
 
     override fun getLastRFIDId(): Int {
-        return hardwareDao.getLastRFIDId()
+        return hardwareRepository.getLastRFIDId()
     }
 
     override fun getLastKeyId(): Int {
-        return hardwareDao.getLastKeyId()
+        return hardwareRepository.getLastKeyId()
     }
 
     override fun getLastLockId(): Int {
-        return hardwareDao.getLastLockId()
+        return hardwareRepository.getLastLockId()
     }
 
     override fun getJobCardDataByUserId(userId: Long?): List<IsJobCard> {
         if (userId == null) {
             return mutableListOf()
         }
-        return hardwareDao.getIsJobCardByUserId(userId)
+        return hardwareRepository.getIsJobCardByUserId(userId)
     }
 
     override fun updateUserJobCard(rfidNo: String, userId: Long) {
-        val userJobCardData = hardwareDao.getIsJobCardByUserId(userId)
+        val userJobCardData = hardwareRepository.getIsJobCardByUserId(userId)
         if (userJobCardData.any { it.cardNfc == rfidNo }) {
             userJobCardData.filter { it.cardNfc != rfidNo }.forEach {
                 it.userId = null
                 it.userName = null
-                hardwareDao.updateCardInfo(it)
+                hardwareRepository.updateCardInfo(it)
             }
             logger.info("检测到用户工卡,清除其他工卡")
             return
-        }else{
+        } else {
             logger.info("检测到用户工卡,清除工卡")
             userJobCardData.forEach {
                 it.userId = null
                 it.userName = null
-                hardwareDao.updateCardInfo(it)
+                hardwareRepository.updateCardInfo(it)
             }
         }
-        var jobCardData = hardwareDao.getCardDataByRfid(rfidNo)
-        val sysUserDo = userDao.getUserInfoByUserId(userId)
+        var jobCardData = hardwareRepository.getCardDataByRfid(rfidNo)
+        val sysUserDo = userRepository.getUserInfoByUserId(userId)
         if (jobCardData != null) {
             logger.info("工卡存在,设置值")
             jobCardData.userId = userId
             jobCardData.userName = sysUserDo?.userName
-            hardwareDao.updateCardInfo(jobCardData)
+            hardwareRepository.updateCardInfo(jobCardData)
         } else {
             logger.info("没有检测到工卡,重新创建工卡")
             jobCardData = IsJobCard()
-            val defaultCardCodeSize = hardwareDao.getLastCardId()
+            val defaultCardCodeSize = hardwareRepository.getLastCardId()
             jobCardData.cardCode = "CARD_${defaultCardCodeSize + 1}"
             jobCardData.userId = userId
             jobCardData.cardNfc = rfidNo
@@ -554,12 +586,12 @@ class HardwareLogic @Inject constructor(
                         "normal"
                     )
                 }?.dictValue
-            hardwareDao.addCard(jobCardData)
+            hardwareRepository.addCard(jobCardData)
         }
     }
 
     override fun getExceptionKey(): List<IsKey> {
-        return hardwareDao.getAllKeyData()
+        return hardwareRepository.getAllKeyData()
             .filter {
                 it.exStatus == CommonDictDataEnum.KEY_STATUS.commonDictRes.find {
                     I18nManager.t(it.dictLabel) == I18nManager.t(
@@ -570,7 +602,7 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun getExceptionLock(): List<IsLock> {
-        return hardwareDao.getAllLockData()
+        return hardwareRepository.getAllLockData()
             .filter {
                 it.exStatus == CommonDictDataEnum.PADLOCK_STATUS.commonDictRes.find {
                     I18nManager.t(it.dictLabel) == I18nManager.t(
@@ -581,7 +613,7 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun getExceptionSlots(): List<IsLockCabinetSlots> {
-        return hardwareDao.getAllLockCabinetSlots()
+        return hardwareRepository.getAllLockCabinetSlots()
             .filter {
                 it.status == CommonDictDataEnum.SLOT_STATUS.commonDictRes.find {
                     I18nManager.t(it.dictLabel) == I18nManager.t(
@@ -592,7 +624,7 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun removeSlotsException(row: Int, col: Int) {
-        hardwareDao.removeSlotsException(
+        hardwareRepository.removeSlotsException(
             row,
             col,
             CommonDictDataEnum.SLOT_STATUS.commonDictRes.find {
@@ -604,24 +636,24 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun createCabinetData() {
-        hardwareDao.clearCabinetData()
+        hardwareRepository.clearCabinetData()
         val isLockCabinet = IsLockCabinet()
         isLockCabinet.cabinetCode = "CABINET_001"
         isLockCabinet.cabinetName = "锁柜1"
-        val lockCabinetId = hardwareDao.createCabinetData(isLockCabinet)
+        val lockCabinetId = hardwareRepository.createCabinetData(isLockCabinet)
         MMKVConstants.KEY_LOCK_CABINET_ID.saveMMKVData(lockCabinetId)
     }
 
     override fun saveCabinetSlots(isLockCabinetSlots: List<IsLockCabinetSlots>) {
-        hardwareDao.saveCabinetSlots(isLockCabinetSlots)
+        hardwareRepository.saveCabinetSlots(isLockCabinetSlots)
     }
 
     override fun clearCabinetSlots() {
-        hardwareDao.clearCabinetSlots()
+        hardwareRepository.clearCabinetSlots()
     }
 
     override fun tagSlotsException(row: Int, col: Int, remark: String) {
-        hardwareDao.tagSlotsException(
+        hardwareRepository.tagSlotsException(
             row,
             col,
             CommonDictDataEnum.SLOT_STATUS.commonDictRes.find {
@@ -634,7 +666,7 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun tagKeyException(rfid: String?, remark: String) {
-        hardwareDao.tagKeyException(
+        hardwareRepository.tagKeyException(
             rfid, remark,
             CommonDictDataEnum.KEY_STATUS.commonDictRes.find {
                 I18nManager.t(it.dictLabel) == I18nManager.t(
@@ -645,7 +677,7 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun tagLockException(rfid: String?, remark: String) {
-        hardwareDao.tagLockException(
+        hardwareRepository.tagLockException(
             rfid, remark,
             CommonDictDataEnum.KEY_STATUS.commonDictRes.find {
                 I18nManager.t(it.dictLabel) == I18nManager.t(
@@ -656,7 +688,7 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun removeKeyException(rfid: String?) {
-        hardwareDao.removeKeyException(
+        hardwareRepository.removeKeyException(
             rfid,
             CommonDictDataEnum.KEY_STATUS.commonDictRes.find {
                 I18nManager.t(it.dictLabel) == I18nManager.t(
@@ -667,7 +699,7 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun removeLockException(rfid: String?) {
-        hardwareDao.removeLockException(
+        hardwareRepository.removeLockException(
             rfid,
             CommonDictDataEnum.PADLOCK_STATUS.commonDictRes.find {
                 I18nManager.t(it.dictLabel) == I18nManager.t(
@@ -678,27 +710,27 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun getKeyInfoByKeyId(keyId: Long): IsKey? {
-        return hardwareDao.getKeyInfoById(keyId)
+        return hardwareRepository.getKeyInfoById(keyId)
     }
 
     override fun getLockInfoByLockId(lockId: Long): IsLock? {
-        return hardwareDao.getLockInfoById(lockId)
+        return hardwareRepository.getLockInfoById(lockId)
     }
 
     override fun getIsLockCabinetSlotBySlotId(slotId: Long): IsLockCabinetSlots? {
-        return hardwareDao.getIsLockCabinetSlotBySlotId(slotId)
+        return hardwareRepository.getIsLockCabinetSlotBySlotId(slotId)
     }
 
     override fun getAllSlotsData(): List<IsLockCabinetSlots> {
-        return hardwareDao.getAllLockCabinetSlots()
+        return hardwareRepository.getAllLockCabinetSlots()
     }
 
     override fun getAllLockInfo(): List<IsLock> {
-        return hardwareDao.getAllLockData()
+        return hardwareRepository.getAllLockData()
     }
 
     override fun updateSlotsInfo(slots: IsLockCabinetSlots) {
-        return hardwareDao.updateSlotsInfo(slots)
+        return hardwareRepository.updateSlotsInfo(slots)
     }
 
     override fun getAllHardwareCount(): Int {
@@ -720,35 +752,21 @@ class HardwareLogic @Inject constructor(
                     "normal"
                 )
             }?.dictValue
-        val keyData = hardwareDao.getAllKeyData()
-        val lockData = hardwareDao.getAllLockData()
-        val rfidTokenData = hardwareDao.getAllRfidTokenData()
+        val keyData = hardwareRepository.getAllKeyData()
+        val lockData = hardwareRepository.getAllLockData()
+        val rfidTokenData = hardwareRepository.getAllRfidTokenData()
         return keyData.count { it.exStatus == keyStatus } + lockData.count { it.exStatus == lockStatus } + rfidTokenData.count { it.status == rfidTokenStatus }
     }
 
     override fun getCardByCardRfid(cardRfid: String): IsJobCard? {
-        return hardwareDao.getCardDataByRfid(cardRfid)
+        return hardwareRepository.getCardDataByRfid(cardRfid)
     }
 
     override fun getRfidDataByRfid(rfid: String): IsRfidToken? {
-        return hardwareDao.getRfidDataByRfid(rfid)
+        return hardwareRepository.getRfidDataByRfid(rfid)
     }
 
     override fun getAllPointCount(overviewWorkstationId: Long?): Int {
-        return hardwareDao.getAllPointCount(overviewWorkstationId)
-    }
-
-    override fun getAllDataExportPointData(): List<DataExportPointVo> {
-        val allPointData = hardwareDao.getAllPointData()
-        val allDataExportPointVo = BeanUtils.copyList(allPointData, DataExportPointVo::class.java)
-        val allPointRfid = hardwareDao.getAllRfidTokenData()
-        val allWorkstation = workstationLogic.getWorkstationManageData()
-        allDataExportPointVo.forEach { point ->
-            point.pointFunction = point.remark.toString()
-            point.workstationName =
-                allWorkstation.find { it.workstationId == point.workstationId }?.workstationName.toString()
-            point.pointNfc = allPointRfid.find { it.rfidId == point.rfidId }?.rfid ?: ""
-        }
-        return allDataExportPointVo
+        return hardwareRepository.getAllPointCount(overviewWorkstationId)
     }
 }

+ 25 - 17
data/src/main/java/com/grkj/data/domain/logic/impl/IsolationPointLogic.kt

@@ -1,14 +1,14 @@
 package com.grkj.data.domain.logic.impl
 
-import com.grkj.data.local.dao.IsolationPointDao
-import com.grkj.data.local.dao.JobTicketDao
-import com.grkj.data.local.dos.IsIsolationPoint
+import com.grkj.data.domain.logic.BaseLogic
+import com.grkj.data.domain.logic.IIsolationPointLogic
 import com.grkj.data.domain.vo.AddPointManageVo
 import com.grkj.data.domain.vo.PointManageFilterVo
 import com.grkj.data.domain.vo.PointManageVo
 import com.grkj.data.domain.vo.UpdatePointManageVo
-import com.grkj.data.domain.logic.BaseLogic
-import com.grkj.data.domain.logic.IIsolationPointLogic
+import com.grkj.data.local.dos.IsIsolationPoint
+import com.grkj.data.repository.IsolationPointRepository
+import com.grkj.data.repository.JobTicketRepository
 import javax.inject.Inject
 import javax.inject.Singleton
 
@@ -17,13 +17,13 @@ import javax.inject.Singleton
  */
 @Singleton
 class IsolationPointLogic @Inject constructor(
-    val isolationPointDao: IsolationPointDao,
-    val jobTicketDao: JobTicketDao
+    val isolationPointRepository: IsolationPointRepository,
+    val jobTicketRepository: JobTicketRepository
 ) :
     BaseLogic(), IIsolationPointLogic {
 
     override fun deletePointByPointIds(pointIds: List<Long>) {
-        isolationPointDao.deletePointByPointIds(pointIds)
+        isolationPointRepository.deletePointByPointIds(pointIds)
     }
 
     override fun getPointManagerData(
@@ -31,7 +31,7 @@ class IsolationPointLogic @Inject constructor(
         current: Int,
         size: Int
     ): List<PointManageVo> {
-        return isolationPointDao.getPointManageData(
+        return isolationPointRepository.getPointManageData(
             filterData?.pointName,
             filterData?.pointFunction,
             filterData?.powerType,
@@ -42,10 +42,18 @@ class IsolationPointLogic @Inject constructor(
         )
     }
 
+    override fun getPointByPointNfc(pointNfc: String?): IsIsolationPoint? {
+        return isolationPointRepository.getPointByPointNfc(pointNfc)
+    }
+
+    override fun getRfidIdByPointIds(inUsePointIds: List<Long>): List<Long> {
+        return isolationPointRepository.getRfidIdByPointIds(inUsePointIds)
+    }
+
     override fun updateRfidId(pointId: Long, rfidId: Long) {
-        val isIsolationPoint = isolationPointDao.getPointById(pointId)
+        val isIsolationPoint = isolationPointRepository.getPointById(pointId)
         isIsolationPoint.rfidId = rfidId
-        isolationPointDao.updateIsolationPoint(isIsolationPoint)
+        isolationPointRepository.updateIsolationPoint(isIsolationPoint)
     }
 
     override fun addIsolationPoint(addPointManageVo: AddPointManageVo) {
@@ -55,7 +63,7 @@ class IsolationPointLogic @Inject constructor(
         isIsolationPoint.workstationId = addPointManageVo.workstationId
         isIsolationPoint.rfidId = addPointManageVo.rfidId
         isIsolationPoint.remark = addPointManageVo.pointFunction
-        isolationPointDao.addIsolationPoint(isIsolationPoint)
+        isolationPointRepository.addIsolationPoint(isIsolationPoint)
     }
 
     override fun updateIsolationPoint(updatePointManageVo: UpdatePointManageVo) {
@@ -66,20 +74,20 @@ class IsolationPointLogic @Inject constructor(
         isIsolationPoint.workstationId = updatePointManageVo.workstationId
         isIsolationPoint.rfidId = updatePointManageVo.rfidId
         isIsolationPoint.remark = updatePointManageVo.pointFunction
-        isolationPointDao.updateIsolationPoint(isIsolationPoint)
+        isolationPointRepository.updateIsolationPoint(isIsolationPoint)
     }
 
     override fun getAllPointManageDataWithWorkstationId(workstationId: Long): MutableList<PointManageVo> {
-        return isolationPointDao.getAllPointManageDataWithWorkstationId(workstationId)
+        return isolationPointRepository.getAllPointManageDataWithWorkstationId(workstationId)
             .filter { it.pointId !in getAllLockedPointManageDataWithWorkstationId(workstationId).map { it.pointId } }
             .toMutableList()
     }
 
     override fun getAllLockedPointManageDataWithWorkstationId(workstationId: Long): MutableList<PointManageVo> {
         val allPointManageData =
-            isolationPointDao.getAllPointManageDataWithWorkstationId(workstationId)
+            isolationPointRepository.getAllPointManageDataWithWorkstationId(workstationId)
         val allLockedPointData =
-            jobTicketDao.getAllLockedPointData(allPointManageData.map { it.pointId })
+            jobTicketRepository.getAllLockedPointData(allPointManageData.map { it.pointId })
         logger.info("上锁的非异常作业点位:${allLockedPointData}")
         val filterPointManageData =
             allPointManageData.filter { it.pointId in allLockedPointData.map { it.pointId } }
@@ -91,6 +99,6 @@ class IsolationPointLogic @Inject constructor(
     }
 
     override fun getPointByRfId(rfidId: Long): IsIsolationPoint? {
-        return isolationPointDao.getPointByRfidId(rfidId)
+        return isolationPointRepository.getPointByRfidId(rfidId)
     }
 }

+ 46 - 61
data/src/main/java/com/grkj/data/domain/logic/impl/JobTicketLogic.kt

@@ -1,10 +1,6 @@
 package com.grkj.data.domain.logic.impl
 
 import com.grkj.data.check_data.ICheckDataMode
-import com.grkj.data.local.dao.ExceptionDao
-import com.grkj.data.local.dao.HardwareDao
-import com.grkj.data.local.dao.IsolationPointDao
-import com.grkj.data.local.dao.WorkflowStepDao
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.enums.IsolationPointPowerTypeEnum
@@ -16,8 +12,6 @@ import com.grkj.data.enums.StepAction
 import com.grkj.data.enums.TodoStatusEnum
 import com.grkj.data.domain.logic.BaseLogic
 import com.grkj.data.domain.logic.IJobTicketLogic
-import com.grkj.data.domain.logic.ISopLogic
-import com.grkj.data.domain.logic.IWorkstationLogic
 import com.grkj.data.local.dos.IsJobTicket
 import com.grkj.data.local.dos.IsJobTicketGroup
 import com.grkj.data.local.dos.IsJobTicketKey
@@ -30,8 +24,6 @@ import com.grkj.data.entity.local.only
 import com.grkj.data.net.req.LockPointUpdateReq
 import com.grkj.data.net.res.StepDetailRes
 import com.grkj.data.net.res.TicketDetailRes
-import com.grkj.data.domain.vo.DataExportJobVo
-import com.grkj.data.domain.vo.DataExportLockedPointVo
 import com.grkj.data.domain.vo.IsJobTicketDataVo
 import com.grkj.data.domain.vo.IsJobTicketKeyDataVo
 import com.grkj.data.domain.vo.IsJobTicketLockDataVo
@@ -43,7 +35,12 @@ import com.grkj.data.domain.vo.JobTicketGroupDataVo
 import com.grkj.data.domain.vo.JobTicketManageVo
 import com.grkj.data.domain.vo.JobUserVo
 import com.grkj.data.domain.vo.LockedPointVo
+import com.grkj.data.repository.ExceptionRepository
+import com.grkj.data.repository.HardwareRepository
+import com.grkj.data.repository.IsolationPointRepository
 import com.grkj.data.repository.JobTicketRepository
+import com.grkj.data.repository.WorkflowRepository
+import com.grkj.data.repository.WorkstationRepository
 import com.grkj.shared.utils.i18n.I18nManager
 import com.sik.sikcore.data.BeanUtils
 import com.sik.sikcore.date.TimeUtils
@@ -56,12 +53,11 @@ import javax.inject.Singleton
 @Singleton
 class JobTicketLogic @Inject constructor(
     val jobTicketRepository: JobTicketRepository,
-    val hardwareDao: HardwareDao,
-    val isolationPointDao: IsolationPointDao,
-    val workflowStepDao: WorkflowStepDao,
-    val exceptionDao: ExceptionDao,
-    val sopLogic: ISopLogic,
-    val workstationLogic: IWorkstationLogic
+    val hardwareRepository: HardwareRepository,
+    val isolationPointRepository: IsolationPointRepository,
+    val workflowRepository: WorkflowRepository,
+    val exceptionRepository: ExceptionRepository,
+    val workstationRepository: WorkstationRepository
 ) : BaseLogic(), IJobTicketLogic {
     override fun createJob(
         selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
@@ -78,7 +74,7 @@ class JobTicketLogic @Inject constructor(
         isJobTicket.modeId = modeId
         isJobTicket.sopId = sopId
         val ticketId = jobTicketRepository.saveIsJobTicket(isJobTicket)
-        val isUnlockFirst = workflowStepDao.isUnlockBeforeLock(modeId)
+        val isUnlockFirst = workflowRepository.isUnlockBeforeLock(modeId)
         val ticketPoints = selectedPointsData.map {
             val isJobTicketGroup = IsJobTicketGroup()
             isJobTicketGroup.ticketId = ticketId
@@ -133,7 +129,7 @@ class JobTicketLogic @Inject constructor(
             }
         }
         jobTicketRepository.saveIsJobTicketLock(ticketLocks)
-        val workflowStepList = workflowStepDao.getStepsByMode(modeId)
+        val workflowStepList = workflowRepository.getStepsByMode(modeId)
         val ticketStep = mutableListOf<IsJobTicketStep>().apply {
             workflowStepList.forEach { workflowStep ->
                 val isJobTicketStep =
@@ -188,7 +184,7 @@ class JobTicketLogic @Inject constructor(
         isJobTicket.modeId = modeId
         isJobTicket.sopId = sopId
         val ticketId = jobTicketRepository.saveIsJobTicket(isJobTicket)
-        val isUnlockFirst = workflowStepDao.isUnlockBeforeLock(modeId)
+        val isUnlockFirst = workflowRepository.isUnlockBeforeLock(modeId)
         val ticketPoints = selectedPointsData.map {
             val isJobTicketGroup = IsJobTicketGroup()
             isJobTicketGroup.ticketId = ticketId
@@ -243,7 +239,7 @@ class JobTicketLogic @Inject constructor(
             }
         }
         jobTicketRepository.saveIsJobTicketLock(ticketLocks)
-        val workflowStepList = workflowStepDao.getStepsByMode(modeId)
+        val workflowStepList = workflowRepository.getStepsByMode(modeId)
         val ticketStep = mutableListOf<IsJobTicketStep>().apply {
             workflowStepList.forEach { workflowStep ->
                 val isJobTicketStep =
@@ -265,6 +261,22 @@ class JobTicketLogic @Inject constructor(
         jobTicketRepository.saveIsJobTicketStep(ticketStep)
     }
 
+    override fun getJobTicketGroupsByTicketId(ticketId: Long): List<IsJobTicketGroup> {
+        return jobTicketRepository.getJobTicketGroupsByTicketId(ticketId)
+    }
+
+    override fun getJobTicketUsersByTicketId(ticketId: Long): List<IsJobTicketUser> {
+        return jobTicketRepository.getJobTicketUsersByTicketId(ticketId)
+    }
+
+    override fun getAllLockedPointData(pointIds: List<Long>): List<IsJobTicketPoints> {
+        return jobTicketRepository.getAllLockedPointData(pointIds)
+    }
+
+    override fun updateJobTicketLockData(isJobTicketLock: IsJobTicketLock) {
+        jobTicketRepository.updateJobTicketLockData(isJobTicketLock)
+    }
+
     override fun cancelJobTicketException(sourceDataId: Long) {
         return jobTicketRepository.cancelJobTicketException(sourceDataId)
     }
@@ -284,7 +296,7 @@ class JobTicketLogic @Inject constructor(
     override fun checkExceptionJob() {
         val exceptionJob = jobTicketRepository.selectExceptionJob()
         for (ticket in exceptionJob) {
-            val exceptionStatus = exceptionDao.getJobExceptionStatus(ticket.ticketId)
+            val exceptionStatus = exceptionRepository.getJobExceptionStatus(ticket.ticketId)
             if (exceptionStatus == CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find {
                     I18nManager.t(
                         it.dictLabel
@@ -306,19 +318,6 @@ class JobTicketLogic @Inject constructor(
         return jobTicketRepository.getAllLockedPointsData()
     }
 
-    override fun getAllLockedPointsExportData(): List<DataExportLockedPointVo> {
-        val allLockedPointsData = jobTicketRepository.getAllLockedPointsData()
-        val allLockedPointsExportData =
-            BeanUtils.copyList(allLockedPointsData, DataExportLockedPointVo::class.java)
-        val allWorkstation = workstationLogic.getWorkstationManageData()
-        val allRfidData = hardwareDao.getAllRfidTokenData()
-        allLockedPointsExportData.forEach { point ->
-            allWorkstation.find { it.workstationId == point.workstationId }?.let {
-                point.workstationName = it.workstationName
-            }
-        }
-        return allLockedPointsExportData
-    }
 
     override fun checkSopHasJobInProgress(sopId: Long): Boolean {
         return jobTicketRepository.checkSopHasJobInProgress(sopId) > 1
@@ -740,7 +739,7 @@ class JobTicketLogic @Inject constructor(
             BeanUtils.copyList(ticketPointData, TicketDetailRes.JobTicketPointsVO::class.java)
         if (jobTicketPointDataList?.isEmpty() == false) {
             val pointIds = jobTicketPointDataList.mapNotNull { it?.pointId }
-            val pointDetailData = isolationPointDao.getPointDataListByPointIds(pointIds)
+            val pointDetailData = isolationPointRepository.getPointDataListByPointIds(pointIds)
             jobTicketPointDataList.filterNotNull().forEach { ticketPointData ->
                 val pointDetail = pointDetailData.find { it.pointId == ticketPointData.pointId }
                 pointDetail?.let {
@@ -1022,13 +1021,13 @@ class JobTicketLogic @Inject constructor(
                         callback(false, "挂锁nfc丢失", 500)
                         return
                     }
-                    val keyData = hardwareDao.getKeyDataByKeyRfid(updateReq.keyNfc)
+                    val keyData = hardwareRepository.getKeyInfoByRfid(updateReq.keyNfc)
                     if (keyData == null) {
                         callback(false, "钥匙信息丢失", 500)
                         return
                     }
 
-                    val pointId = hardwareDao.getPointIdByPointNfc(updateReq.pointNfc)
+                    val pointId = hardwareRepository.getPointIdByPointNfc(updateReq.pointNfc)
                     val isTicketPoint = isTicketPoints.firstOrNull { it.pointId == pointId }
                     if (isTicketPoint == null) {
                         callback(false, "隔离点信息丢失", 500)
@@ -1036,7 +1035,7 @@ class JobTicketLogic @Inject constructor(
                     }
 
                     if (isLock) {
-                        val lockData = hardwareDao.getLockDataByLockRfid(updateReq.lockNfc!!)
+                        val lockData = hardwareRepository.getLockInfoByRfid(updateReq.lockNfc!!)
                         if (lockData == null) {
                             callback(false, "挂锁信息丢失", 500)
                             return
@@ -1089,7 +1088,7 @@ class JobTicketLogic @Inject constructor(
         callback: (Boolean) -> Unit
     ) {
         val jobTicketData = jobTicketRepository.getTicketDataByTicketId(ticketId)
-        val keyData = hardwareDao.getKeyDataByKeyRfid(keyNfc)
+        val keyData = hardwareRepository.getKeyInfoByRfid(keyNfc)
         if (jobTicketData == null) {
             logger.info("作业信息不存在")
             callback(false)
@@ -1129,7 +1128,7 @@ class JobTicketLogic @Inject constructor(
     }
 
     override fun getUserIdByCardRfid(rfid: String): Long? {
-        return hardwareDao.getUserIdByCardRfid(rfid)
+        return hardwareRepository.getUserIdByCardNfc(rfid)
     }
 
     override fun updateKeyReturn(
@@ -1146,7 +1145,7 @@ class JobTicketLogic @Inject constructor(
             callback(false, "作业票不存在", 500)
             return
         }
-        val keyData = hardwareDao.getKeyDataByKeyRfid(keyNfc)
+        val keyData = hardwareRepository.getKeyInfoByRfid(keyNfc)
         logger.info("钥匙信息:${keyData}")
         val keyId = keyData?.keyId ?: -1
         if (keyId == -1L && !virtualKey) {
@@ -1157,7 +1156,7 @@ class JobTicketLogic @Inject constructor(
 
         val isJobTicketKeys = jobTicketRepository.getJobTicketKeyDataByTicketId(ticketId)
         logger.info("作业票钥匙信息:${isJobTicketKeys}")
-        val workflowSteps = workflowStepDao.getStepsByMode(jobTicketData.modeId!!)
+        val workflowSteps = workflowRepository.getStepsByMode(jobTicketData.modeId!!)
         val ticketSteps = jobTicketRepository.getJobTicketStepDataByTicketId(ticketId)
         val currentStep = ticketSteps.firstOrNull { it.stepStatus == "0" }
         val isJobTicketKey = BeanUtils.copyProperties(
@@ -1179,7 +1178,7 @@ class JobTicketLogic @Inject constructor(
     }
 
     override fun getExceptionIdByTicketId(ticketId: Long): Long {
-        return exceptionDao.getExceptionIdBySourceDataId(ticketId)
+        return exceptionRepository.getExceptionIdBySourceDataId(ticketId)
     }
 
     override fun getLockedPointsCount(realTimeDataZoneId: Long?, selectedWorkflowMode: Long?): Int {
@@ -1208,7 +1207,8 @@ class JobTicketLogic @Inject constructor(
 
         // 4. 取已完成的步骤(stepStatus == "1" 表示已做过)
         val doneStepIds =
-            jobTicketRepository.getJobTicketStepDataByTicketId(ticketId).filter { it.stepStatus == "1" }
+            jobTicketRepository.getJobTicketStepDataByTicketId(ticketId)
+                .filter { it.stepStatus == "1" }
                 .map { it.stepId }.toSet()
         logger.info("当前已经完成的步骤:${doneStepIds}")
         // 5. 判断“上锁”/“解锁”哪一步已执行过
@@ -1236,7 +1236,7 @@ class JobTicketLogic @Inject constructor(
         workstationId: Long,
         jobName: String
     ): Long {
-        val modeId = workflowStepDao.getWorkflowModes().find { it.modeName == "上锁" }?.modeId!!
+        val modeId = workflowRepository.getWorkflowModes().find { it.modeName == "上锁" }?.modeId!!
         val isJobTicket = IsJobTicket()
         isJobTicket.ticketName = "${jobName}-上锁"
         isJobTicket.workstationId = workstationId
@@ -1296,7 +1296,7 @@ class JobTicketLogic @Inject constructor(
             }
         }
         jobTicketRepository.saveIsJobTicketLock(ticketLocks)
-        val workflowStepList = workflowStepDao.getStepsByMode(modeId)
+        val workflowStepList = workflowRepository.getStepsByMode(modeId)
         val ticketStep = mutableListOf<IsJobTicketStep>().apply {
             workflowStepList.forEach { workflowStep ->
                 val isJobTicketStep =
@@ -1332,7 +1332,7 @@ class JobTicketLogic @Inject constructor(
         workstationId: Long,
         jobName: String
     ): Long {
-        val modeId = workflowStepDao.getWorkflowModes().find { it.modeName == "解锁" }?.modeId!!
+        val modeId = workflowRepository.getWorkflowModes().find { it.modeName == "解锁" }?.modeId!!
         val isJobTicket = IsJobTicket()
         isJobTicket.ticketName = "${jobName}-解锁"
         isJobTicket.workstationId = workstationId
@@ -1392,7 +1392,7 @@ class JobTicketLogic @Inject constructor(
             }
         }
         jobTicketRepository.saveIsJobTicketLock(ticketLocks)
-        val workflowStepList = workflowStepDao.getStepsByMode(modeId)
+        val workflowStepList = workflowRepository.getStepsByMode(modeId)
         val ticketStep = mutableListOf<IsJobTicketStep>().apply {
             workflowStepList.forEach { workflowStep ->
                 val isJobTicketStep =
@@ -1421,19 +1421,4 @@ class JobTicketLogic @Inject constructor(
         return jobTicketRepository.isUnLockBeforeLock(ticketId)
     }
 
-    override fun getAllJobData(): List<DataExportJobVo> {
-        val allJobData = jobTicketRepository.getAllJob()
-        val allDataExportJobVo = BeanUtils.copyList(allJobData, DataExportJobVo::class.java)
-        val allWorkstation = workstationLogic.getAllWorkstationData()
-        val allWorkflowMode = workflowStepDao.getWorkflowModes()
-        val allSop = sopLogic.getSopData()
-        allDataExportJobVo.forEach { ticket ->
-            ticket.workstationName =
-                allWorkstation.find { it.workstationId == ticket.workstationId }?.workstationName.toString()
-            ticket.modeName =
-                allWorkflowMode.find { it.modeId == ticket.modeId }?.modeName.toString()
-            ticket.sopName = allSop.find { it.sopId == ticket.sopId }?.sopName.toString()
-        }
-        return allDataExportJobVo
-    }
 }

+ 0 - 22
data/src/main/java/com/grkj/data/domain/logic/impl/RfidTokenLogic.kt

@@ -1,22 +0,0 @@
-package com.grkj.data.domain.logic.impl
-
-import com.grkj.data.local.dao.RfidTokenDao
-import com.grkj.data.local.dos.IsRfidToken
-import com.grkj.data.domain.logic.BaseLogic
-import com.grkj.data.domain.logic.IRfidTokenLogic
-import javax.inject.Inject
-import javax.inject.Singleton
-
-/**
- * RFID标签业务层实现
- */
-@Singleton
-class RfidTokenLogic @Inject constructor(val rfidTokenDao: RfidTokenDao): BaseLogic(), IRfidTokenLogic {
-    override fun getRfidData(): List<IsRfidToken> {
-        return rfidTokenDao.getRfidData()
-    }
-
-    override fun getRfidDataByRfid(rfid: String): IsRfidToken? {
-        return rfidTokenDao.getRfidDataByRfid(rfid)
-    }
-}

+ 48 - 21
data/src/main/java/com/grkj/data/domain/logic/impl/RoleLogic.kt

@@ -1,16 +1,16 @@
 package com.grkj.data.domain.logic.impl
 
-import com.grkj.data.local.dao.RoleDao
-import com.grkj.data.local.dao.SysMenuDao
-import com.grkj.data.local.dos.SysRole
-import com.grkj.data.local.dos.SysRoleMenu
-import com.grkj.data.local.dos.SysUserRole
+import com.grkj.data.domain.logic.BaseLogic
+import com.grkj.data.domain.logic.IRoleLogic
 import com.grkj.data.domain.vo.AddRoleDo
 import com.grkj.data.domain.vo.RoleManageFilterVo
 import com.grkj.data.domain.vo.RoleManageVo
 import com.grkj.data.domain.vo.UpdateRoleDo
-import com.grkj.data.domain.logic.BaseLogic
-import com.grkj.data.domain.logic.IRoleLogic
+import com.grkj.data.local.dos.SysRole
+import com.grkj.data.local.dos.SysRoleMenu
+import com.grkj.data.local.dos.SysUserRole
+import com.grkj.data.repository.RoleRepository
+import com.grkj.data.repository.SysMenuRepository
 import javax.inject.Inject
 import javax.inject.Singleton
 
@@ -18,12 +18,15 @@ import javax.inject.Singleton
  * 岗位业务层
  */
 @Singleton
-class RoleLogic @Inject constructor(val roleDao: RoleDao, val sysMenuDao: SysMenuDao) :
+class RoleLogic @Inject constructor(
+    val roleRepository: RoleRepository,
+    val sysMenuRepository: SysMenuRepository
+) :
     BaseLogic(),
     IRoleLogic {
 
     override fun getRoleData(): List<SysRole> {
-        return roleDao.getRoleData()
+        return roleRepository.getRoleData()
     }
 
     override fun addUserRoleData(userId: Long, roleIds: List<Long>) {
@@ -33,24 +36,48 @@ class RoleLogic @Inject constructor(val roleDao: RoleDao, val sysMenuDao: SysMen
             sysUserRole.roleId = roleId
             sysUserRole
         }
-        roleDao.insertUserRole(sysUserRoles)
+        roleRepository.insertUserRole(sysUserRoles)
 
     }
 
     override fun getUserIdsByRole(roleIds: List<Long>): List<Long> {
-        return roleDao.getUserIdsByRoleIds(roleIds)
+        return roleRepository.getUserIdsByRoleIds(roleIds)
+    }
+
+    override fun getAllRole(): List<SysRole> {
+        return roleRepository.getAllRole()
+    }
+
+    override fun getAllUserRoles(): List<SysUserRole> {
+        return roleRepository.getAllUserRoles()
+    }
+
+    override fun deleteUserRoleByUserIds(userIds: List<Long>) {
+        roleRepository.deleteUserRoleByUserIds(userIds)
+    }
+
+    override fun getRoleDataByRoleKey(roleKey: String): Long? {
+        return roleRepository.getRoleDataByRoleKey(roleKey)
+    }
+
+    override fun insertUserRole(userRoleData: List<SysUserRole>) {
+        roleRepository.insertUserRole(userRoleData)
+    }
+
+    override fun getRoleDataByUserId(userId: Long): List<SysRole> {
+        return roleRepository.getRoleDataByUserId(userId)
     }
 
     override fun addPresetRoleData(presetSysRole: List<SysRole>) {
-        roleDao.insertRoles(presetSysRole)
+        roleRepository.insertRoles(presetSysRole)
     }
 
     override fun deleteUserRoleByUserId(userIds: List<Long>) {
-        roleDao.deleteUserRoleByUserIds(userIds)
+        roleRepository.deleteUserRoleByUserIds(userIds)
     }
 
     override fun deleteRoleByRoleIds(roleIds: List<Long>) {
-        roleDao.deleteRoleByRoleIds(roleIds)
+        roleRepository.deleteRoleByRoleIds(roleIds)
     }
 
     override fun getRoleManagerData(
@@ -58,7 +85,7 @@ class RoleLogic @Inject constructor(val roleDao: RoleDao, val sysMenuDao: SysMen
         current: Int,
         size: Int
     ): List<RoleManageVo> {
-        return roleDao.getRoleManageData(
+        return roleRepository.getRoleManageData(
             roleManageFilterVo?.roleName,
             roleManageFilterVo?.permissionCharacters,
             roleManageFilterVo?.status?.let { if (it == true) "0" else "1" },
@@ -73,7 +100,7 @@ class RoleLogic @Inject constructor(val roleDao: RoleDao, val sysMenuDao: SysMen
         sysRole.roleKey = addRoleDo.roleKey
         sysRole.status = if (addRoleDo.status == true) "0" else "2"
         sysRole.dataScope = "1"
-        val roleId = roleDao.insertRole(sysRole)
+        val roleId = roleRepository.insertRole(sysRole)
         val sysRoleMenu = mutableListOf<SysRoleMenu>().apply {
             addRoleDo.menuData.forEach { data ->
                 val sysRoleMenu = SysRoleMenu()
@@ -82,7 +109,7 @@ class RoleLogic @Inject constructor(val roleDao: RoleDao, val sysMenuDao: SysMen
                 add(sysRoleMenu)
             }
         }
-        sysMenuDao.insertRoleMenus(sysRoleMenu)
+        sysMenuRepository.insertRoleMenus(sysRoleMenu)
     }
 
     override fun updateRoleData(updateRoleDo: UpdateRoleDo) {
@@ -92,8 +119,8 @@ class RoleLogic @Inject constructor(val roleDao: RoleDao, val sysMenuDao: SysMen
         sysRole.roleKey = updateRoleDo.roleKey
         sysRole.status = if (updateRoleDo.status == true) "0" else "2"
         sysRole.dataScope = "1"
-        val roleId = roleDao.insertRole(sysRole)
-        sysMenuDao.deleteByRoleId(updateRoleDo.roleId)
+        val roleId = roleRepository.insertRole(sysRole)
+        sysMenuRepository.deleteByRoleId(updateRoleDo.roleId)
         val sysRoleMenu = mutableListOf<SysRoleMenu>().apply {
             updateRoleDo.menuData.forEach { data ->
                 val sysRoleMenu = SysRoleMenu()
@@ -102,10 +129,10 @@ class RoleLogic @Inject constructor(val roleDao: RoleDao, val sysMenuDao: SysMen
                 add(sysRoleMenu)
             }
         }
-        sysMenuDao.insertRoleMenus(sysRoleMenu)
+        sysMenuRepository.insertRoleMenus(sysRoleMenu)
     }
 
     override fun getRoleByRoleKey(roleKey: String): Long? {
-        return roleDao.getRoleDataByRoleKey(roleKey)
+        return roleRepository.getRoleDataByRoleKey(roleKey)
     }
 }

+ 27 - 43
data/src/main/java/com/grkj/data/domain/logic/impl/SopLogic.kt

@@ -1,7 +1,5 @@
 package com.grkj.data.domain.logic.impl
 
-import com.grkj.data.local.dao.IsSopDao
-import com.grkj.data.local.dao.WorkflowStepDao
 import com.grkj.data.enums.RoleEnum
 import com.grkj.data.domain.logic.BaseLogic
 import com.grkj.data.domain.logic.ISopLogic
@@ -11,11 +9,12 @@ import com.grkj.data.local.dos.IsSopGroup
 import com.grkj.data.local.dos.IsSopPoints
 import com.grkj.data.local.dos.IsSopUser
 import com.grkj.data.local.dos.IsSopWorkflowStep
-import com.grkj.data.domain.vo.DataExportSopVo
 import com.grkj.data.domain.vo.JobPointVo
 import com.grkj.data.domain.vo.JobTicketGroupDataVo
 import com.grkj.data.domain.vo.JobUserVo
 import com.grkj.data.domain.vo.SopManageVo
+import com.grkj.data.repository.SopRepository
+import com.grkj.data.repository.WorkflowRepository
 import com.sik.sikcore.data.BeanUtils
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -25,9 +24,8 @@ import javax.inject.Singleton
  */
 @Singleton
 class SopLogic @Inject constructor(
-    val isSopDao: IsSopDao,
-    val workflowStepDao: WorkflowStepDao,
-    val workstationLogic: IWorkstationLogic
+    val sopRepository: SopRepository,
+    val workflowRepository: WorkflowRepository
 ) : BaseLogic(), ISopLogic {
 
     override fun saveSop(
@@ -41,8 +39,8 @@ class SopLogic @Inject constructor(
         isSop.sopName = sopName
         isSop.workstationId = workstationId
         isSop.modeId = workflowModeId
-        val sopId = isSopDao.saveSop(isSop)
-        val workflowStep = workflowStepDao.getStepsByMode(workflowModeId)
+        val sopId = sopRepository.saveSop(isSop)
+        val workflowStep = workflowRepository.getStepsByMode(workflowModeId)
         val isSopWorkflowStep = workflowStep.map {
             val isSopWorkflowStep =
                 BeanUtils.copyProperties(it, IsSopWorkflowStep::class.java) ?: IsSopWorkflowStep()
@@ -50,7 +48,7 @@ class SopLogic @Inject constructor(
             isSopWorkflowStep.stepIcon = it.stepIcon
             isSopWorkflowStep
         }
-        isSopDao.saveSopWorkflowStep(isSopWorkflowStep)
+        sopRepository.saveSopWorkflowStep(isSopWorkflowStep)
         return sopId
     }
 
@@ -67,45 +65,31 @@ class SopLogic @Inject constructor(
                 isSopPoint
             }
         }
-        isSopDao.saveSopPoints(isSopPoints.flatten())
-    }
-
-    override fun getDataExportSopData(): List<DataExportSopVo> {
-        val allSop = getSopData()
-        val allDataExportSopVo = BeanUtils.copyList(allSop, DataExportSopVo::class.java)
-        val allWorkstation = workstationLogic.getAllWorkstationData()
-        val allWorkflowMode = workflowStepDao.getWorkflowModes()
-        allDataExportSopVo.forEach { ticket ->
-            ticket.workstationName =
-                allWorkstation.find { it.workstationId == ticket.workstationId }?.workstationName.toString()
-            ticket.modeName =
-                allWorkflowMode.find { it.modeId == ticket.modeId }?.modeName.toString()
-        }
-        return allDataExportSopVo
+        sopRepository.saveSopPoints(isSopPoints.flatten())
     }
 
     override fun getSopData(): List<IsSop> {
-        return isSopDao.getSopData()
+        return sopRepository.getSopData()
     }
 
     override fun updateStep(isSopWorkflowStep: List<IsSopWorkflowStep>) {
-        isSopDao.updateStep(isSopWorkflowStep)
+        sopRepository.updateStep(isSopWorkflowStep)
     }
 
     override fun getSopWorkflowSteps(sopId: Long): List<IsSopWorkflowStep> {
-        return isSopDao.getSopWorkflowSteps(sopId)
+        return sopRepository.getSopWorkflowSteps(sopId)
     }
 
     override fun saveSopGroup(group: IsSopGroup): Long {
-        return isSopDao.saveSopGroup(group)
+        return sopRepository.saveSopGroup(group)
     }
 
     override fun deleteSopWorkflowStepBySopId(sopIds: List<Long>) {
-        return isSopDao.deleteSopWorkflowStepBySopId(sopIds)
+        return sopRepository.deleteSopWorkflowStepBySopId(sopIds)
     }
 
     override fun deleteSopGroupBySopId(sopIds: List<Long>) {
-        isSopDao.deleteSopGroupBySopId(sopIds)
+        sopRepository.deleteSopGroupBySopId(sopIds)
     }
 
     override fun saveSopUser(
@@ -132,42 +116,42 @@ class SopLogic @Inject constructor(
             isSopUser.sopId = sopId
             isSopUser
         }
-        isSopDao.saveSopUsers(isSopLockerUsers.flatten())
-        isSopDao.saveSopUsers(isSopColockerUsers)
+        sopRepository.saveSopUsers(isSopLockerUsers.flatten())
+        sopRepository.saveSopUsers(isSopColockerUsers)
     }
 
     override fun getSopDataByWorkstationId(workstationId: Long): List<SopManageVo> {
-        return isSopDao.getSopDataByWorkstationId(workstationId)
+        return sopRepository.getSopDataByWorkstationId(workstationId)
     }
 
     override fun getSopPointsBySopId(sopId: Long): List<JobPointVo> {
-        return isSopDao.getSopPointsBySopId(sopId)
+        return sopRepository.getSopPointsBySopId(sopId)
     }
 
     override fun getSopUsersBySopId(sopId: Long): List<JobUserVo> {
-        return isSopDao.getSopUsersBySopId(sopId)
+        return sopRepository.getSopUsersBySopId(sopId)
     }
 
     override fun deleteSopBySopId(sopIds: List<Long>) {
-        isSopDao.deleteSopBySopId(sopIds)
-        isSopDao.deleteSopPointsBySopId(sopIds)
-        isSopDao.deleteSopUsersBySopId(sopIds)
-        isSopDao.deleteSopGroupBySopId(sopIds)
+        sopRepository.deleteSopBySopId(sopIds)
+        sopRepository.deleteSopPointsBySopId(sopIds)
+        sopRepository.deleteSopUsersBySopId(sopIds)
+        sopRepository.deleteSopGroupBySopId(sopIds)
     }
 
     override fun getSopDataPage(current: Int, size: Int): List<SopManageVo> {
-        return isSopDao.getSopDataPage(size, current * size)
+        return sopRepository.getSopDataPage(size, current * size)
     }
 
     override fun getSopDataBySopId(sopId: Long): SopManageVo {
-        return isSopDao.getSopManageDataBySopId(sopId)
+        return sopRepository.getSopManageDataBySopId(sopId)
     }
 
     override fun deleteSopPointsBySopId(sopIds: List<Long>) {
-        isSopDao.deleteSopPointsBySopId(sopIds)
+        sopRepository.deleteSopPointsBySopId(sopIds)
     }
 
     override fun deleteSopUsersBySopId(sopIds: List<Long>) {
-        isSopDao.deleteSopUsersBySopId(sopIds)
+        sopRepository.deleteSopUsersBySopId(sopIds)
     }
 }

+ 32 - 17
data/src/main/java/com/grkj/data/domain/logic/impl/SysMenuLogic.kt

@@ -1,13 +1,13 @@
 package com.grkj.data.domain.logic.impl
 
-import com.grkj.data.local.dao.RoleDao
-import com.grkj.data.local.dao.SysMenuDao
+import com.grkj.data.domain.logic.BaseLogic
+import com.grkj.data.domain.logic.ISysMenuLogic
 import com.grkj.data.enums.RoleEnum
 import com.grkj.data.enums.RoleFunctionalPermissionsEnum
 import com.grkj.data.local.dos.SysMenu
 import com.grkj.data.local.dos.SysRoleMenu
-import com.grkj.data.domain.logic.BaseLogic
-import com.grkj.data.domain.logic.ISysMenuLogic
+import com.grkj.data.repository.RoleRepository
+import com.grkj.data.repository.SysMenuRepository
 import com.grkj.shared.utils.i18n.I18nManager
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -16,7 +16,10 @@ import javax.inject.Singleton
  * 菜单业务层实现
  */
 @Singleton
-class SysMenuLogic @Inject constructor(val sysMenuDao: SysMenuDao, val roleDao: RoleDao) :
+class SysMenuLogic @Inject constructor(
+    val sysMenuRepository: SysMenuRepository,
+    val roleRepository: RoleRepository
+) :
     BaseLogic(), ISysMenuLogic {
     override fun checkSysMenuAndRole() {
         // 找出所有顶层菜单(level == 0),依次递归插入/更新
@@ -25,8 +28,8 @@ class SysMenuLogic @Inject constructor(val sysMenuDao: SysMenuDao, val roleDao:
             .forEach { topEnum ->
                 processMenuEnumRecursive(topEnum, parentId = null)
             }
-        val sysMenuData = sysMenuDao.getAll()
-        roleDao.getRoleData().filter { it.roleKey in RoleEnum.values().map { it.roleKey } }
+        val sysMenuData = sysMenuRepository.getAll()
+        roleRepository.getRoleData().filter { it.roleKey in RoleEnum.values().map { it.roleKey } }
             .forEach { roleData ->
                 when (roleData.roleKey) {
                     //超管权限
@@ -41,7 +44,7 @@ class SysMenuLogic @Inject constructor(val sysMenuDao: SysMenuDao, val roleDao:
                                 }
                             }
                         }
-                        sysMenuDao.insertRoleMenus(roleMenuData)
+                        sysMenuRepository.insertRoleMenus(roleMenuData)
                     }
                     //作业管理员权限
                     RoleEnum.JTDRAWER.roleKey -> {
@@ -61,7 +64,7 @@ class SysMenuLogic @Inject constructor(val sysMenuDao: SysMenuDao, val roleDao:
                                 }
                             }
                         }
-                        sysMenuDao.insertRoleMenus(roleMenuData)
+                        sysMenuRepository.insertRoleMenus(roleMenuData)
                     }
                     //作业负责人权限
                     RoleEnum.JTLOCKER.roleKey -> {
@@ -81,7 +84,7 @@ class SysMenuLogic @Inject constructor(val sysMenuDao: SysMenuDao, val roleDao:
                                 }
                             }
                         }
-                        sysMenuDao.insertRoleMenus(roleMenuData)
+                        sysMenuRepository.insertRoleMenus(roleMenuData)
                     }
                     //作业参与人权限
                     RoleEnum.JTCOLOCKER.roleKey -> {
@@ -101,18 +104,30 @@ class SysMenuLogic @Inject constructor(val sysMenuDao: SysMenuDao, val roleDao:
                                 }
                             }
                         }
-                        sysMenuDao.insertRoleMenus(roleMenuData)
+                        sysMenuRepository.insertRoleMenus(roleMenuData)
                     }
                 }
             }
     }
 
     override fun getSysMenus(): List<SysMenu> {
-        return sysMenuDao.getAll()
+        return sysMenuRepository.getAll()
     }
 
     override fun getSysMenusByRoleId(roleId: Long): List<SysMenu> {
-        return sysMenuDao.getSysMenusByRoleId(roleId)
+        return sysMenuRepository.getSysMenusByRoleId(roleId)
+    }
+
+    override fun insertRoleMenus(sysRoleMenu: MutableList<SysRoleMenu>) {
+        sysMenuRepository.insertRoleMenus(sysRoleMenu)
+    }
+
+    override fun deleteByRoleId(roleId: Long) {
+        sysMenuRepository.deleteByRoleId(roleId)
+    }
+
+    override fun getPermissionsByRoleIds(roleIds: List<Long>): MutableList<String?> {
+        return sysMenuRepository.getPermissionsByRoleIds(roleIds)
     }
 
     /**
@@ -127,7 +142,7 @@ class SysMenuLogic @Inject constructor(val sysMenuDao: SysMenuDao, val roleDao:
         parentId: Long?
     ): SysMenu {
         // 1. 查找数据库里是否已存在相同 perms 的菜单
-        val existing: SysMenu? = sysMenuDao.findByPerms(menuEnum.functionalPermission)
+        val existing: SysMenu? = sysMenuRepository.findByPerms(menuEnum.functionalPermission)
 
         val currentMenu: SysMenu = if (existing == null) {
             // 不存在,构造一个新的实体并插入
@@ -140,10 +155,10 @@ class SysMenuLogic @Inject constructor(val sysMenuDao: SysMenuDao, val roleDao:
                 // 其它字段(path、component、isFrame、icon 等)可在此处赋值
                 // 例如:path = "/${menuEnum.functionalPermission.replace(":", "/")}"
             }
-            val newId: Long = sysMenuDao.insert(newMenu)
+            val newId: Long = sysMenuRepository.insert(newMenu)
             if (newId <= 0) {
                 // 如果 onConflict = IGNORE 导致插入被忽略(并发、重复等),则重新查询一次
-                sysMenuDao.findByPerms(menuEnum.functionalPermission)
+                sysMenuRepository.findByPerms(menuEnum.functionalPermission)
                     ?: throw IllegalStateException(
                         "插入 SysMenu(${menuEnum.functionalPermission}) 失败,且数据库中没有已存在记录"
                     )
@@ -156,7 +171,7 @@ class SysMenuLogic @Inject constructor(val sysMenuDao: SysMenuDao, val roleDao:
             // 已经存在,检查 parentId 是否需要更新
             if (existing.parentId != parentId) {
                 existing.parentId = parentId
-                sysMenuDao.update(existing)
+                sysMenuRepository.update(existing)
             }
             existing
         }

+ 55 - 44
data/src/main/java/com/grkj/data/domain/logic/impl/UserLogic.kt

@@ -1,8 +1,5 @@
 package com.grkj.data.domain.logic.impl
 
-import com.grkj.data.local.dao.HardwareDao
-import com.grkj.data.local.dao.RoleDao
-import com.grkj.data.local.dao.SysMenuDao
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.enums.LoginResultEnum
 import com.grkj.data.enums.RoleEnum
@@ -19,8 +16,13 @@ import com.grkj.data.domain.vo.UserManageVo
 import com.grkj.data.domain.vo.UserManageFilterVo
 import com.grkj.data.domain.logic.BaseLogic
 import com.grkj.data.domain.logic.IUserLogic
+import com.grkj.data.repository.HardwareRepository
 import com.grkj.data.repository.JobTicketRepository
+import com.grkj.data.repository.RoleRepository
+import com.grkj.data.repository.SysMenuRepository
 import com.grkj.data.repository.UserRepository
+import com.grkj.data.repository.WorkflowRepository
+import com.grkj.data.repository.WorkstationRepository
 import com.grkj.shared.utils.BCryptUtils
 import com.grkj.shared.utils.BiometricVerifier
 import com.grkj.shared.utils.i18n.I18nManager
@@ -41,9 +43,10 @@ import javax.inject.Singleton
 class UserLogic @Inject constructor(
     private val userRepository: UserRepository,
     private val jobTicketRepository: JobTicketRepository,
-    private val hardwareDao: HardwareDao,
-    private val roleDao: RoleDao,
-    private val sysMenuDao: SysMenuDao,
+    private val hardwareRepository: HardwareRepository,
+    private val workstationRepository: WorkstationRepository,
+    private val roleRepository: RoleRepository,
+    private val sysMenuRepository: SysMenuRepository,
 ) : BaseLogic(), IUserLogic {
 
     override fun loginWithAccount(
@@ -57,8 +60,8 @@ class UserLogic @Inject constructor(
         logger.info("密码是否匹配:${password},${sysUserDo.password},${matched}")
         if (matched) {
             MainDomainData.userInfo = sysUserDo
-            val userCardList = hardwareDao.getIsJobCardByUserId(sysUserDo.userId)
-            val roleDatas = roleDao.getRoleDataByUserId(sysUserDo.userId)
+            val userCardList = hardwareRepository.getIsJobCardByUserId(sysUserDo.userId)
+            val roleDatas = roleRepository.getRoleDataByUserId(sysUserDo.userId)
             val sysUserCharacteristicDos =
                 userRepository.getSysUserCharacteristicDo(sysUserDo.userId)
             val userBiometricDataVo =
@@ -70,7 +73,7 @@ class UserLogic @Inject constructor(
             MainDomainData.permissions =
                 if (sysUserDo.nickName == "罗成") RoleFunctionalPermissionsEnum.values()
                     .map { it.functionalPermission }.toMutableList() else
-                    sysMenuDao.getPermissionsByRoleIds(roleDatas.map { it.roleId })
+                    sysMenuRepository.getPermissionsByRoleIds(roleDatas.map { it.roleId })
             logger.info("用户信息:{}", MainDomainData.userInfo.toString())
             logger.info("用户角色:{}", MainDomainData.roleKeys)
             logger.info("用户权限:{}", MainDomainData.permissions)
@@ -80,15 +83,15 @@ class UserLogic @Inject constructor(
     }
 
     override fun loginWithCard(cardnfc: String): LoginResultEnum {
-        val userId = hardwareDao.getUserIdByCardNfc(cardnfc)?.toString()
+        val userId = hardwareRepository.getUserIdByCardNfc(cardnfc)?.toString()
         if (userId == null) {
             return LoginResultEnum.JOB_CARD_LOGIN_FAILED
         } else {
             val sysUserDo = userRepository.getUserInfoByUserId(userId.toLong())
             if (sysUserDo != null) {
                 MainDomainData.userInfo = sysUserDo
-                val userCardList = hardwareDao.getIsJobCardByUserId(sysUserDo.userId)
-                val roleDatas = roleDao.getRoleDataByUserId(sysUserDo.userId)
+                val userCardList = hardwareRepository.getIsJobCardByUserId(sysUserDo.userId)
+                val roleDatas = roleRepository.getRoleDataByUserId(sysUserDo.userId)
                 val sysUserCharacteristicDos =
                     userRepository.getSysUserCharacteristicDo(sysUserDo.userId)
                 val userBiometricDataVo =
@@ -97,7 +100,7 @@ class UserLogic @Inject constructor(
                 MainDomainData.userCardList = userCardList
                 MainDomainData.roleKeys = roleDatas.joinToString(",") { it.roleKey }
                 MainDomainData.permissions =
-                    sysMenuDao.getPermissionsByRoleIds(roleDatas.map { it.roleId })
+                    sysMenuRepository.getPermissionsByRoleIds(roleDatas.map { it.roleId })
                 logger.info("用户信息:{}", MainDomainData.userInfo.toString())
                 logger.info("用户角色:{}", MainDomainData.roleKeys)
                 logger.info("用户权限:{}", MainDomainData.permissions)
@@ -107,6 +110,14 @@ class UserLogic @Inject constructor(
         }
     }
 
+    override fun getAllUserInfos(): List<SysUserDo> {
+        return userRepository.getAllUserInfos()
+    }
+
+    override fun getUserInfoByUserId(userId: Long): SysUserDo? {
+        return userRepository.getUserInfoByUserId(userId)
+    }
+
     override fun deleteNoUseFingerprint(fingerprintData: List<String>, userId: Long) {
         userRepository.deleteNoUseFingerprint(fingerprintData, userId)
     }
@@ -140,7 +151,7 @@ class UserLogic @Inject constructor(
     }
 
     override fun checkCard(cardNo: String): LoginResultEnum {
-        val userId = hardwareDao.getUserIdByCardNfc(cardNo)?.toString()
+        val userId = hardwareRepository.getUserIdByCardNfc(cardNo)?.toString()
         if (userId == null) {
             return LoginResultEnum.JOB_CARD_LOGIN_FAILED
         } else {
@@ -179,13 +190,13 @@ class UserLogic @Inject constructor(
                 if (sysUserDo != null) {
                     // —— 缓存域数据 —— //
                     MainDomainData.userInfo = sysUserDo
-                    MainDomainData.userCardList = hardwareDao.getIsJobCardByUserId(sysUserDo.userId)
+                    MainDomainData.userCardList = hardwareRepository.getIsJobCardByUserId(sysUserDo.userId)
                     MainDomainData.roleKeys =
-                        roleDao.getRoleDataByUserId(sysUserDo.userId)
+                        roleRepository.getRoleDataByUserId(sysUserDo.userId)
                             .joinToString(",") { it.roleKey }
                     MainDomainData.permissions =
-                        sysMenuDao.getPermissionsByRoleIds(
-                            roleDao.getRoleDataByUserId(sysUserDo.userId).map { it.roleId }
+                        sysMenuRepository.getPermissionsByRoleIds(
+                            roleRepository.getRoleDataByUserId(sysUserDo.userId).map { it.roleId }
                         )
                     val sysUserCharacteristicDos =
                         userRepository.getSysUserCharacteristicDo(sysUserDo.userId)
@@ -249,8 +260,8 @@ class UserLogic @Inject constructor(
             val sysUserDo = userRepository.getUserInfoByUserId(userId.toLong())
             if (sysUserDo != null) {
                 MainDomainData.userInfo = sysUserDo
-                val userCardList = hardwareDao.getIsJobCardByUserId(sysUserDo.userId)
-                val roleDatas = roleDao.getRoleDataByUserId(sysUserDo.userId)
+                val userCardList = hardwareRepository.getIsJobCardByUserId(sysUserDo.userId)
+                val roleDatas = roleRepository.getRoleDataByUserId(sysUserDo.userId)
                 val sysUserCharacteristicDos =
                     userRepository.getSysUserCharacteristicDo(sysUserDo.userId)
                 val userBiometricDataVo =
@@ -259,7 +270,7 @@ class UserLogic @Inject constructor(
                 MainDomainData.userCardList = userCardList
                 MainDomainData.roleKeys = roleDatas.joinToString(",") { it.roleKey }
                 MainDomainData.permissions =
-                    sysMenuDao.getPermissionsByRoleIds(roleDatas.map { it.roleId })
+                    sysMenuRepository.getPermissionsByRoleIds(roleDatas.map { it.roleId })
                 logger.info("用户信息:{}", MainDomainData.userInfo.toString())
                 logger.info("用户角色:{}", MainDomainData.roleKeys)
                 logger.info("用户权限:{}", MainDomainData.permissions)
@@ -306,14 +317,14 @@ class UserLogic @Inject constructor(
         //1.根据分页获取用户信息
         val sysUserDos = userRepository.getUserInfoPage(size, current * size)
         //2.获取所有区域信息和绑定信息
-        val workstationDos = hardwareDao.getAllWorkstation()
-        val userWorkstationDos = hardwareDao.getAllUserWorkstations()
+        val workstationDos = workstationRepository.getAllWorkstation()
+        val userWorkstationDos = hardwareRepository.getAllUserWorkstations()
         //3.获取所有角色信息和用户角色关联信息
-        val roleDos = roleDao.getAllRole()
-        val userRoleDos = roleDao.getAllUserRoles()
+        val roleDos = roleRepository.getAllRole()
+        val userRoleDos = roleRepository.getAllUserRoles()
         val userCharacteristicDos = userRepository.getAllUserCharacteristic()
         //4.获取所有卡片数据
-        val jobCardDos = hardwareDao.getAllJobCard()
+        val jobCardDos = hardwareRepository.getAllJobCard()
         val userManageVos = BeanUtils.copyList(sysUserDos, UserManageVo::class.java)
         userManageVos.forEach { user ->
             val userRoles = roleDos.filter {
@@ -367,13 +378,13 @@ class UserLogic @Inject constructor(
         //1.根据用户id获取用户数据
         val sysUserDos = userRepository.getUserInfosByUserIds(userIds)
         //2.获取所有区域信息和绑定信息
-        val workstationDos = hardwareDao.getAllWorkstation()
-        val userWorkstationDos = hardwareDao.getAllUserWorkstations()
+        val workstationDos = workstationRepository.getAllWorkstation()
+        val userWorkstationDos = hardwareRepository.getAllUserWorkstations()
         //3.获取所有角色信息和用户角色关联信息
-        val roleDos = roleDao.getAllRole()
-        val userRoleDos = roleDao.getAllUserRoles()
+        val roleDos = roleRepository.getAllRole()
+        val userRoleDos = roleRepository.getAllUserRoles()
         //4.获取所有卡片数据
-        val jobCardDos = hardwareDao.getAllJobCard()
+        val jobCardDos = hardwareRepository.getAllJobCard()
         //5.根据作业票id获取用户数据
         val jobTicketUsers = jobTicketRepository.getJobTicketUsersByTicketId(ticketId)
         val needJobTicketUser =
@@ -405,14 +416,14 @@ class UserLogic @Inject constructor(
         //1.获取用户信息
         val sysUserDos = userRepository.getAllUserInfos()
         //2.获取所有区域信息和绑定信息
-        val workstationDos = hardwareDao.getAllWorkstation()
-        val userWorkstationDos = hardwareDao.getAllUserWorkstations()
+        val workstationDos = workstationRepository.getAllWorkstation()
+        val userWorkstationDos = hardwareRepository.getAllUserWorkstations()
         //3.获取所有角色信息和用户角色关联信息
-        val roleDos = roleDao.getAllRole()
-        val userRoleDos = roleDao.getAllUserRoles()
+        val roleDos = roleRepository.getAllRole()
+        val userRoleDos = roleRepository.getAllUserRoles()
         val userCharacteristicDos = userRepository.getAllUserCharacteristic()
         //4.获取所有卡片数据
-        val jobCardDos = hardwareDao.getAllJobCard()
+        val jobCardDos = hardwareRepository.getAllJobCard()
         val userManageVos = BeanUtils.copyList(sysUserDos, UserManageVo::class.java)
         userManageVos.forEach { user ->
             val userRoles = roleDos.filter {
@@ -470,7 +481,7 @@ class UserLogic @Inject constructor(
     override fun removeAdminUser() {
         val adminUserIds = userRepository.getUserIdsByRoleKey(RoleEnum.ADMIN.roleKey)
         userRepository.deleteUserByIds(adminUserIds)
-        roleDao.deleteUserRoleByUserIds(adminUserIds)
+        roleRepository.deleteUserRoleByUserIds(adminUserIds)
     }
 
     override fun addAdminUser(username: String, password: String) {
@@ -480,13 +491,13 @@ class UserLogic @Inject constructor(
         sysUserDo.password = BCryptUtils.encryptPassword(password)
         sysUserDo.status = "0"
         val userId = userRepository.insert(sysUserDo)
-        val roleId = roleDao.getRoleDataByRoleKey(RoleEnum.ADMIN.roleKey)
+        val roleId = roleRepository.getRoleDataByRoleKey(RoleEnum.ADMIN.roleKey)
         logger.info("超管角色id:$roleId")
         logger.info("用户id:$userId")
         val userRole = SysUserRole()
         userRole.userId = userId
         userRole.roleId = roleId ?: 0
-        roleDao.insertUserRole(listOf(userRole))
+        roleRepository.insertUserRole(listOf(userRole))
     }
 
     override fun getAllUsers(): List<SysUserDo> {
@@ -495,8 +506,8 @@ class UserLogic @Inject constructor(
 
     override fun getAllUsersWithRole(): List<SysUserVo> {
         val sysUserDos = userRepository.getAllUserInfos()
-        val roleDatas = roleDao.getAllRole()
-        val userRoleDatas = roleDao.getAllUserRoles()
+        val roleDatas = roleRepository.getAllRole()
+        val userRoleDatas = roleRepository.getAllUserRoles()
         val userVos = BeanUtils.copyList(sysUserDos, SysUserVo::class.java)
         userVos.forEach { user ->
             val userRoles = roleDatas.filter {
@@ -553,8 +564,8 @@ class UserLogic @Inject constructor(
             val sysUserDo = userRepository.getUserInfoByUserId(userId)
             if (sysUserDo != null) {
                 MainDomainData.userInfo = sysUserDo
-                val userCardList = hardwareDao.getIsJobCardByUserId(sysUserDo.userId)
-                val roleDatas = roleDao.getRoleDataByUserId(sysUserDo.userId)
+                val userCardList = hardwareRepository.getIsJobCardByUserId(sysUserDo.userId)
+                val roleDatas = roleRepository.getRoleDataByUserId(sysUserDo.userId)
                 val sysUserCharacteristicDos =
                     userRepository.getSysUserCharacteristicDo(sysUserDo.userId)
                 val userBiometricDataVo =
@@ -563,7 +574,7 @@ class UserLogic @Inject constructor(
                 MainDomainData.userCardList = userCardList
                 MainDomainData.roleKeys = roleDatas.joinToString(",") { it.roleKey }
                 MainDomainData.permissions =
-                    sysMenuDao.getPermissionsByRoleIds(roleDatas.map { it.roleId })
+                    sysMenuRepository.getPermissionsByRoleIds(roleDatas.map { it.roleId })
                 logger.info("用户信息:{}", MainDomainData.userInfo.toString())
                 logger.info("用户角色:{}", MainDomainData.roleKeys)
                 logger.info("用户权限:{}", MainDomainData.permissions)

+ 18 - 18
data/src/main/java/com/grkj/data/domain/logic/impl/WorkflowLogic.kt

@@ -1,10 +1,10 @@
 package com.grkj.data.domain.logic.impl
 
-import com.grkj.data.local.dao.WorkflowStepDao
 import com.grkj.data.local.dos.WorkflowMode
 import com.grkj.data.local.dos.WorkflowStep
 import com.grkj.data.domain.logic.BaseLogic
 import com.grkj.data.domain.logic.IWorkflowLogic
+import com.grkj.data.repository.WorkflowRepository
 import javax.inject.Inject
 import javax.inject.Singleton
 
@@ -12,41 +12,41 @@ import javax.inject.Singleton
  * 工作流业务层事件
  */
 @Singleton
-class WorkflowLogic @Inject constructor(val workflowStepDao: WorkflowStepDao) :
+class WorkflowLogic @Inject constructor(val workflowRepository: WorkflowRepository) :
     BaseLogic(), IWorkflowLogic {
-    override fun insertStep(step: WorkflowStep): Long = workflowStepDao.insertStep(step)
+    override fun insertStep(step: WorkflowStep): Long = workflowRepository.insertStep(step)
 
-    override fun updateStep(step: WorkflowStep) = workflowStepDao.updateStep(step)
+    override fun updateStep(step: WorkflowStep) = workflowRepository.updateStep(step)
 
-    override fun deleteStep(step: WorkflowStep) = workflowStepDao.deleteStep(step)
+    override fun deleteStep(step: WorkflowStep) = workflowRepository.deleteStep(step)
 
     override fun getStepsByMode(modeId: Long): List<WorkflowStep> =
-        workflowStepDao.getStepsByMode(modeId)
+        workflowRepository.getStepsByMode(modeId)
 
     override fun getWorkflowModeByModeId(modeId: Long): WorkflowMode? =
-        workflowStepDao.getWorkflowModeByModeId(modeId)
+        workflowRepository.getWorkflowModeByModeId(modeId)
 
     override fun updateWorkflowMode(workflowMode: WorkflowMode?): Boolean {
         return workflowMode?.let {
-            workflowStepDao.updateWorkflowMode(it)
+            workflowRepository.updateWorkflowMode(it)
             true
         } ?: false
     }
 
     override fun insertWorkflowMode(workflowMode: WorkflowMode): Long {
-        return workflowStepDao.insertWorkflowMode(workflowMode)
+        return workflowRepository.insertWorkflowMode(workflowMode)
     }
 
     override fun insertSteps(workflowSteps: List<WorkflowStep>) {
-        workflowStepDao.insertSteps(workflowSteps)
+        workflowRepository.insertSteps(workflowSteps)
     }
 
     override fun addPresetWorkflowMode(presetWorkflowMode: List<WorkflowMode>) {
-        workflowStepDao.insertWorkflowModes(presetWorkflowMode)
+        workflowRepository.insertWorkflowModes(presetWorkflowMode)
     }
 
     override fun addPresetWorkflowStep(presetWorkflowStep: List<WorkflowStep>) {
-        workflowStepDao.insertPresetSteps(presetWorkflowStep)
+        workflowRepository.insertPresetSteps(presetWorkflowStep)
     }
 
     override fun checkPresetWorkflowStepIcon() {
@@ -83,16 +83,16 @@ class WorkflowLogic @Inject constructor(val workflowStepDao: WorkflowStepDao) :
     }
 
     override fun updateWorkflowModeDeleted(workflowModeId: List<Long>, deleted: Boolean) {
-        workflowStepDao.updateWorkflowModeDeleted(workflowModeId, deleted)
+        workflowRepository.updateWorkflowModeDeleted(workflowModeId, deleted)
     }
 
-    override fun getNextStepIndex(modeId: Long): Int = workflowStepDao.getNextStepIndex(modeId)
+    override fun getNextStepIndex(modeId: Long): Int = workflowRepository.getNextStepIndex(modeId)
 
-    override fun getStepById(id: Long): WorkflowStep? = workflowStepDao.getStepById(id)
+    override fun getStepById(id: Long): WorkflowStep? = workflowRepository.getStepById(id)
     override fun isUnlockBeforeLock(modeId: Long): Boolean {
-        return workflowStepDao.isUnlockBeforeLock(modeId)
+        return workflowRepository.isUnlockBeforeLock(modeId)
     }
 
-    override fun getWorkflowModes(): List<WorkflowMode> = workflowStepDao.getWorkflowModes()
-    override fun getAllWorkflowModes(): List<WorkflowMode> = workflowStepDao.getAllWorkflowModes()
+    override fun getWorkflowModes(): List<WorkflowMode> = workflowRepository.getWorkflowModes()
+    override fun getAllWorkflowModes(): List<WorkflowMode> = workflowRepository.getAllWorkflowModes()
 }

+ 17 - 54
data/src/main/java/com/grkj/data/domain/logic/impl/WorkstationLogic.kt

@@ -1,11 +1,11 @@
 package com.grkj.data.domain.logic.impl
 
-import com.grkj.data.local.dao.WorkstationDao
-import com.grkj.data.local.dos.IsUserWorkstation
-import com.grkj.data.local.dos.IsWorkstation
-import com.grkj.data.domain.vo.WorkstationManageVo
 import com.grkj.data.domain.logic.BaseLogic
 import com.grkj.data.domain.logic.IWorkstationLogic
+import com.grkj.data.domain.vo.WorkstationManageVo
+import com.grkj.data.local.dos.IsUserWorkstation
+import com.grkj.data.local.dos.IsWorkstation
+import com.grkj.data.repository.WorkstationRepository
 import javax.inject.Inject
 import javax.inject.Singleton
 
@@ -13,7 +13,7 @@ import javax.inject.Singleton
  * 岗位业务层
  */
 @Singleton
-class WorkstationLogic @Inject constructor(val workstationDao: WorkstationDao) :
+class WorkstationLogic @Inject constructor(val workstationRepository: WorkstationRepository) :
     BaseLogic(), IWorkstationLogic {
 
     override fun addUserWorkstationData(userId: Long, workstationIds: List<Long>) {
@@ -23,29 +23,27 @@ class WorkstationLogic @Inject constructor(val workstationDao: WorkstationDao) :
             isUserWorkstation.workstationId = workstationId
             isUserWorkstation
         }
-        workstationDao.insertUserWorkstation(isUserWorkstation)
+        workstationRepository.insertUserWorkstation(isUserWorkstation)
     }
 
     override fun deleteUserWorkstationByUserIds(userIds: List<Long>) {
-        workstationDao.deleteUserWorkstationByUserIds(userIds)
+        workstationRepository.deleteUserWorkstationByUserIds(userIds)
     }
 
     override fun updateWorkstation(workstationId: Long, workstationName: String) {
-        workstationDao.updateWorkstationNameByWorkstationId(workstationId, workstationName)
+        workstationRepository.updateWorkstationNameByWorkstationId(workstationId, workstationName)
     }
 
     override fun getAllWorkstationData(): List<IsWorkstation> {
-        return workstationDao.getWorkstationData()
+        return workstationRepository.getAllWorkstation()
     }
 
     override fun getWorkstationManageData(): List<WorkstationManageVo> {
-        return buildTree(workstationDao.getWorkstationData())
+        return workstationRepository.getWorkstationData()
     }
 
     override fun insertWorkstation(
-        workstationManageVo: WorkstationManageVo?,
-        orderNum: Int,
-        workstationName: String
+        workstationManageVo: WorkstationManageVo?, orderNum: Int, workstationName: String
     ): Long {
         val isWorkstation = IsWorkstation()
         isWorkstation.workstationName = workstationName
@@ -55,58 +53,23 @@ class WorkstationLogic @Inject constructor(val workstationDao: WorkstationDao) :
         } ?: "0"
 
         isWorkstation.orderNum = orderNum
-        val workstationId = workstationDao.insertWorkstation(isWorkstation)
+        val workstationId = workstationRepository.insertWorkstation(isWorkstation)
         return workstationId
     }
 
     override fun getWorkstationDataByParentIdAndWorkstationName(
-        parentId: Long,
-        workstationName: String
+        parentId: Long, workstationName: String
     ): IsWorkstation? {
-        return workstationDao.getWorkstationDataByParentIdAndWorkstationName(
-            parentId,
-            workstationName
+        return workstationRepository.getWorkstationDataByParentIdAndWorkstationName(
+            parentId, workstationName
         )
     }
 
     override fun deleteWorkstationByWorkstationId(workstationId: Long) {
-        workstationDao.deleteWorkstationByWorkstationId(workstationId)
+        workstationRepository.deleteWorkstationByWorkstationId(workstationId)
     }
 
     override fun updateWorkstationOrderNumById(workstationId: Long, orderNum: Int?) {
-        workstationDao.updateWorkstationOrderNumById(workstationId, orderNum)
-    }
-
-    private fun buildTree(all: List<IsWorkstation>): List<WorkstationManageVo> {
-        // 1) 映射到 VO 并按 id 建立索引
-        val map = all.map { db ->
-            WorkstationManageVo().apply {
-                workstationId = db.workstationId
-                workstationName = db.workstationName
-                parentId = db.parentId
-                ancestors = db.ancestors
-                orderNum = db.orderNum
-            }
-        }.associateBy { it.workstationId }
-            .toMutableMap()
-
-        // 2) 把每个节点挂到它的 parent.children
-        val roots = mutableListOf<WorkstationManageVo>()
-        map.values.forEach { node ->
-            if (node.parentId == null || node.parentId == 0L) {
-                roots += node
-            } else {
-                node.parentWorkstationName = map[node.parentId]?.workstationName ?: ""
-                map[node.parentId]?.children?.add(node)
-            }
-        }
-
-        // 3) (可选)给每个同级按照 orderNum 排个序
-        fun sortRec(nodes: MutableList<WorkstationManageVo>) {
-            nodes.sortBy { it.orderNum ?: 0 }
-            nodes.forEach { sortRec(it.children) }
-        }
-        sortRec(roots)
-        return roots
+        workstationRepository.updateWorkstationOrderNumById(workstationId, orderNum)
     }
 }

+ 1 - 7
data/src/main/java/com/grkj/data/local/dao/HardwareDao.kt

@@ -29,7 +29,7 @@ interface HardwareDao {
      * 根据工卡nfc查询用户id
      */
     @Query("select user_id from is_job_card where card_nfc = :cardNfc and del_flag = 0")
-    fun getUserIdByCardNfc(cardNfc: String): Int?
+    fun getUserIdByCardNfc(cardNfc: String): Long?
 
     /**
      * 添加卡片
@@ -515,12 +515,6 @@ interface HardwareDao {
     @Query("select * from is_rfid_token where rfid = :rfid")
     fun getRfidDataByRfid(rfid: String): IsRfidToken?
 
-    /**
-     * 获取所有区域信息
-     */
-    @Query("select * from is_workstation where del_flag = 0")
-    fun getAllWorkstation(): List<IsWorkstation>
-
     /**
      * 获取所有区域信息
      */

+ 1 - 1
data/src/main/java/com/grkj/data/local/dao/WorkflowStepDao.kt → data/src/main/java/com/grkj/data/local/dao/WorkflowDao.kt

@@ -13,7 +13,7 @@ import com.grkj.data.local.dos.WorkflowStep
  * 工作流步骤表 DAO
  */
 @Dao
-interface WorkflowStepDao {
+interface WorkflowDao {
     @Insert
     fun insertStep(step: WorkflowStep): Long
 

+ 6 - 0
data/src/main/java/com/grkj/data/local/dao/WorkstationDao.kt

@@ -67,4 +67,10 @@ interface WorkstationDao {
      */
     @Query("update is_workstation set workstation_name = :workstationName where workstation_id = :workstationId")
     fun updateWorkstationNameByWorkstationId(workstationId: Long, workstationName: String)
+
+    /**
+     * 获取所有区域信息
+     */
+    @Query("select * from is_workstation where del_flag = 0")
+    fun getAllWorkstation(): List<IsWorkstation>
 }

+ 2 - 2
data/src/main/java/com/grkj/data/local/database/ISCSDatabase.kt

@@ -17,7 +17,7 @@ import com.grkj.data.local.dao.RfidTokenDao
 import com.grkj.data.local.dao.RoleDao
 import com.grkj.data.local.dao.SysMenuDao
 import com.grkj.data.local.dao.UserDao
-import com.grkj.data.local.dao.WorkflowStepDao
+import com.grkj.data.local.dao.WorkflowDao
 import com.grkj.data.local.dao.WorkstationDao
 import com.grkj.data.local.dos.*
 import com.grkj.shared.config.AESConfig
@@ -64,7 +64,7 @@ abstract class ISCSDatabase : RoomDatabase() {
     abstract fun isSopDao(): IsSopDao
     abstract fun jobTicketDao(): JobTicketDao
     abstract fun sysMenuDao(): SysMenuDao
-    abstract fun workflowStepDao(): WorkflowStepDao
+    abstract fun workflowStepDao(): WorkflowDao
     abstract fun exceptionDao(): ExceptionDao
 
     companion object {

+ 89 - 0
data/src/main/java/com/grkj/data/repository/ExceptionRepository.kt

@@ -0,0 +1,89 @@
+package com.grkj.data.repository
+
+import com.grkj.data.local.dos.IsExceptionSourceStandard
+import com.grkj.data.local.dos.IsExceptionStandard
+
+/**
+ * 异常仓储接口(薄封装,专注“数据访问”,不写业务判断)
+ *
+ * 设计约束:
+ * - 全部为同步方法(非 suspend);调用方需在合适线程执行(如 LiveData(IO))。
+ * - 方法命名与 DAO 基本对齐,便于把 Logic 中的 dao 调用替换为 repository 调用。
+ * - 返回值直接使用持久层实体(IsExceptionStandard / IsExceptionSourceStandard),
+ *   业务模型转换留在 Logic 层完成。
+ */
+interface ExceptionRepository {
+
+    /**
+     * 批量更新异常记录(REPLACE 语义)。
+     * @param exceptionData 异常实体列表
+     */
+    fun updateException(exceptionData: List<IsExceptionStandard>)
+
+    /**
+     * 查询所有异常记录,按状态排序。
+     * @return 异常实体列表
+     */
+    fun getExceptionData(): List<IsExceptionStandard>
+
+    /**
+     * 按主键查询异常。
+     * @param exceptionId 异常ID
+     * @return 找到返回实体,否则 null
+     */
+    fun getExceptionDataById(exceptionId: Long): IsExceptionStandard?
+
+    /**
+     * 上报(插入/替换)异常。
+     * @param exceptionStandard 异常实体
+     * @return 新插入或替换后的主键ID
+     */
+    fun reportException(exceptionStandard: IsExceptionStandard): Long
+
+    /**
+     * 保存异常来源数据(插入/替换)。
+     * @param exceptionSourceData 异常来源实体
+     */
+    fun saveExceptionSourceData(exceptionSourceData: IsExceptionSourceStandard)
+
+    /**
+     * 根据来源数据ID批量查询异常来源记录。
+     * @param sourceDataIds 来源数据ID列表
+     * @return 异常来源实体列表
+     */
+    fun getExceptionSourceDataBySourceDataIds(sourceDataIds: List<Long>): List<IsExceptionSourceStandard>
+
+    /**
+     * 按异常ID批量删除异常记录。
+     * @param exceptionIds 异常ID列表
+     */
+    fun deleteExceptionByExceptionIds(exceptionIds: List<Long>)
+
+    /**
+     * 按来源主键ID批量删除异常来源记录。
+     * @param sourceIds 来源记录主键ID列表
+     */
+    fun deleteExceptionSourceDataById(sourceIds: List<Long>)
+
+    /**
+     * 按异常ID查询其所有来源记录。
+     * @param exceptionId 异常ID
+     * @return 异常来源列表
+     */
+    fun getExceptionSourceDataByExceptionId(exceptionId: Long): List<IsExceptionSourceStandard>
+
+    /**
+     * 通过“来源数据ID”反查所属的异常ID(常用于去重或关联处理)。
+     * @param exceptionSourceDataId 来源数据ID
+     * @return 异常ID
+     */
+    fun getExceptionIdBySourceDataId(exceptionSourceDataId: Long): Long
+
+    /**
+     * 根据来源数据ID(如作业票ID)判断是否存在异常,返回异常状态码。
+     * 具体状态语义由上层业务解释。
+     * @param ticketId 来源数据ID
+     * @return 状态码
+     */
+    fun getJobExceptionStatus(ticketId: Long): Int
+}

+ 302 - 0
data/src/main/java/com/grkj/data/repository/HardwareRepository.kt

@@ -0,0 +1,302 @@
+package com.grkj.data.repository
+
+import com.grkj.data.config.ISCSConfig
+import com.grkj.data.domain.vo.DataExportPointVo
+import com.grkj.data.entity.local.LockData
+import com.grkj.data.entity.local.PointData
+import com.grkj.data.local.dos.IsIsolationPoint
+import com.grkj.data.local.dos.IsJobCard
+import com.grkj.data.local.dos.IsKey
+import com.grkj.data.local.dos.IsLock
+import com.grkj.data.local.dos.IsLockCabinet
+import com.grkj.data.local.dos.IsLockCabinetSlots
+import com.grkj.data.local.dos.IsMapPoint
+import com.grkj.data.local.dos.IsRfidToken
+import com.grkj.data.local.dos.IsUserWorkstation
+import com.grkj.data.local.dos.IsWorkstation
+
+/**
+ * 硬件仓储接口(薄层、同步方法):封装对 HardwareDao 的直接访问。
+ *
+ * 设计约束:
+ * 1) 全同步:不使用 suspend,线程切换由调用方负责(建议在 IO 线程调用)。
+ * 2) 仅数据访问:不做任何业务判断/状态推导/字典映射,这些留在 Logic。
+ * 3) 方法基本与 DAO 对齐,保证从 Logic 的最小替换成本(hardwareDao -> hardwareRepository)。
+ */
+interface HardwareRepository {
+
+    /** 根据锁 RFID 获取锁信息 */
+    fun getLockInfoByRfid(rfid: String): IsLock?
+
+    /** 根据钥匙 RFID 获取钥匙信息 */
+    fun getKeyInfoByRfid(rfid: String): IsKey?
+
+    /** 更新点位“上锁”状态 */
+    fun updatePointLockData(
+        ticketId: Long,
+        keyId: Long,
+        lockId: Long,
+        pointId: Long,
+        status: Int
+    )
+
+    /** 更新点位“解锁”状态 */
+    fun updatePointUnLockData(
+        ticketId: Long,
+        keyId: Long,
+        lockId: Long,
+        pointId: Long,
+        status: Int
+    )
+
+    /** 获取所有挂锁数据 */
+    fun getAllLockData(): List<IsLock>
+
+    /** 获取所有钥匙数据 */
+    fun getAllKeyData(): List<IsKey>
+
+    /** 获取所有锁柜仓位数据 */
+    fun getAllLockCabinetSlots(): List<IsLockCabinetSlots>
+
+    /** 根据点位 id 列表查询地图点位数据 */
+    fun getMapPointDataByPointIds(pointIds: List<Long>): List<IsMapPoint>
+
+    /** 根据点位 id 查询地图点位数据 */
+    fun getMapPointDataByEntityId(pointId: Long): IsMapPoint
+
+    /** 更新地图点位数据 */
+    fun updateMapPoint(mapPoint: IsMapPoint)
+
+    /** 根据点位 id 查询点位数据 */
+    fun getPointDataByPointId(pointId: Long): IsIsolationPoint
+
+    /** 更新点位数据 */
+    fun updatePointData(pointData: IsIsolationPoint)
+
+    /** 批量录入挂锁 */
+    fun addLocksInfo(locks: List<IsLock>)
+
+    /** 修改地图点位是否显示 */
+    fun changeShowInMap(pointId: Long, showInMap: Boolean)
+
+    /** 解除一批用户与工卡绑定 */
+    fun removeCardBindByUserIds(userIds: List<Long>)
+
+    /** 从地图移除点位 */
+    fun deletePointFromMap(pointId: Long)
+
+    /** 在地图插入点位 */
+    fun insertMapPoint(pointToMapVo: IsMapPoint)
+
+    /** 根据 rfidId 列表查询 RFID 数据 */
+    fun getRfidDataByRfidIds(rfidId: List<Long>): List<IsRfidToken>
+
+    /** 根据区域 id 获取点位数据(支持是否包含子孙区域,默认取配置值) */
+    fun getPointDataByWorkstationId(
+        workstationId: Long,
+        includeDescendants: Int = ISCSConfig.includeDescendants
+    ): List<IsIsolationPoint>
+
+    /** 新增工卡(单条) */
+    fun addCard(isJobCard: IsJobCard)
+
+    /** 新增工卡(批量) */
+    fun addCard(isJobCard: List<IsJobCard>)
+
+    /** 按用户 id + 卡片码删除工卡 */
+    fun deleteCardByUserIdAndCardCode(userId: Long, cardCode: String)
+
+    /** 根据点位 id 列表查询点位 RFID 映射数据 */
+    fun getPointNfcDataByPointIds(pointIds: List<Long?>): List<PointData>
+
+    /** 根据点位 id 查询当前作业票的锁信息(仅进行中票据) */
+    fun getJobTicketPointLockNfcDataListByPointId(pointId: Long): List<LockData>
+
+    /** 批量新增 RFID Token */
+    fun addRfidToken(isRfidToken: List<IsRfidToken>)
+
+    /** 新增单条 RFID Token(返回主键 id) */
+    fun addRfidToken(isRfidToken: IsRfidToken): Long
+
+    /** 新增钥匙信息 */
+    fun addKeyInfo(isKey: IsKey)
+
+    /** 新增挂锁信息 */
+    fun addLockInfo(isLock: IsLock)
+
+    /** 清空钥匙表 */
+    fun clearIsKey()
+
+    /** 清空挂锁表 */
+    fun clearIsLock()
+
+    /** 按 id 批量删除钥匙 */
+    fun deleteKeyByKeyIds(keyIds: List<Long>)
+
+    /** 按 id 批量删除挂锁 */
+    fun deleteLockByLockIds(lockIds: List<Long>)
+
+    /** 按 id 批量删除工卡 */
+    fun deleteCardByCardIds(cardIds: List<Long>)
+
+    /** 按 id 批量删除 RFID Token */
+    fun deleteRfidTokenByRfidTokenIds(rfidTokenIds: List<Long>)
+
+    /** 获取全部 RFID Token */
+    fun getAllRfidTokenData(): List<IsRfidToken>
+
+    /** 更新钥匙信息 */
+    fun updateKeyInfo(isKey: IsKey)
+
+    /** 更新挂锁信息 */
+    fun updateLockInfo(isLock: IsLock)
+
+    /** 更新工卡信息 */
+    fun updateCardInfo(isJobCard: IsJobCard)
+
+    /** 更新 RFID Token 信息 */
+    fun updateRfidToken(rfidToken: IsRfidToken)
+
+    /** 钥匙分页 */
+    fun getKeyInfoPage(
+        keyCode: String?,
+        keyNfc: String?,
+        keyMacAddress: String?,
+        exStatus: Int?,
+        size: Int,
+        offset: Int
+    ): List<IsKey>
+
+    /** 挂锁分页 */
+    fun getLockInfoPage(
+        lockCode: String?,
+        lockNfc: String?,
+        exStatus: Int?,
+        size: Int,
+        offset: Int
+    ): List<IsLock>
+
+    /** 工卡分页(带用户昵称过滤) */
+    fun getCardInfoPage(
+        cardNfc: String?,
+        nickname: String?,
+        exStatus: Int?,
+        size: Int,
+        offset: Int
+    ): List<IsJobCard>
+
+    /** RFID Token 分页 */
+    fun getRfidTokenInfoPage(
+        rfidTokenCode: String?,
+        rfid: String?,
+        status: Int?,
+        size: Int,
+        offset: Int
+    ): List<IsRfidToken>
+
+    /** 删除钥匙表(truncate) */
+    fun deleteKeyTable()
+
+    /** 删除工卡表(truncate) */
+    fun removeCardData()
+
+    /** 删除 RFID Token 表(truncate) */
+    fun removeRfidTokenData()
+
+    /** 获取自增主键(卡片)当前序号 */
+    fun getLastCardId(): Int
+
+    /** 获取自增主键(RFID)当前序号 */
+    fun getLastRFIDId(): Int
+
+    /** 获取自增主键(钥匙)当前序号 */
+    fun getLastKeyId(): Int
+
+    /** 获取自增主键(挂锁)当前序号 */
+    fun getLastLockId(): Int
+
+    /** 根据用户 id 获取工卡数据 */
+    fun getIsJobCardByUserId(userId: Long): MutableList<IsJobCard>
+
+    /** 根据卡片 RFID 获取工卡数据 */
+    fun getCardDataByRfid(rfidNo: String): IsJobCard?
+
+    /** 根据钥匙 id 获取钥匙信息 */
+    fun getKeyInfoById(keyId: Long): IsKey?
+
+    /** 根据挂锁 id 获取挂锁信息 */
+    fun getLockInfoById(lockId: Long): IsLock?
+
+    /** 根据仓位 id 获取仓位数据 */
+    fun getIsLockCabinetSlotBySlotId(slotId: Long): IsLockCabinetSlots?
+
+    /** 更新仓位信息 */
+    fun updateSlotsInfo(slots: IsLockCabinetSlots)
+
+    /** 统计点位数量(区域可选是否含子孙区域) */
+    fun getAllPointCount(
+        workstationId: Long?,
+        includeDescendants: Int = ISCSConfig.includeDescendants
+    ): Int
+
+    /** 获取所有点位数据 */
+    fun getAllPointData(): List<IsIsolationPoint>
+
+    /** 根据 RFID 字符串获取单条 RFID 数据 */
+    fun getRfidDataByRfid(rfid: String): IsRfidToken?
+
+    /** 清空锁柜表 */
+    fun clearCabinetData()
+
+    /** 新增锁柜(返回主键 id) */
+    fun createCabinetData(isLockCabinet: IsLockCabinet): Long
+
+    /** 批量新增仓位 */
+    fun saveCabinetSlots(slots: List<IsLockCabinetSlots>)
+
+    /** 清空仓位表 */
+    fun clearCabinetSlots()
+
+    /** 解除仓位异常 */
+    fun removeSlotsException(row: Int, col: Int, dictValue: String?)
+
+    /** 标记仓位异常 */
+    fun tagSlotsException(row: Int, col: Int, dictValue: String?, remark: String)
+
+    /** 标记钥匙异常 */
+    fun tagKeyException(rfid: String?, remark: String, exStatus: String?)
+
+    /** 标记挂锁异常 */
+    fun tagLockException(rfid: String?, remark: String, exStatus: String?)
+
+    /** 移除钥匙异常 */
+    fun removeKeyException(rfid: String?, exStatus: String?)
+
+    /** 移除挂锁异常 */
+    fun removeLockException(rfid: String?, exStatus: String?)
+
+    /**
+     * 根据点位 RFID 获取点位 id
+     */
+    fun getPointIdByPointNfc(pointRfid: String?): Long
+
+    /**
+     * 根据工卡 RFID 获取用户 id
+     */
+    fun getUserIdByCardNfc(cardnfc: String): Long?
+
+    /**
+     * 获取所有工作站
+      */
+    fun getAllUserWorkstations(): List<IsUserWorkstation>
+
+    /**
+     * 获取所有工卡数据
+     */
+    fun getAllJobCard(): List<IsJobCard>
+
+    /**
+     * 获取所有导出点位
+     */
+    fun getAllDataExportPointData(): List<DataExportPointVo>
+}

+ 59 - 0
data/src/main/java/com/grkj/data/repository/IsolationPointRepository.kt

@@ -0,0 +1,59 @@
+package com.grkj.data.repository
+
+import com.grkj.data.config.ISCSConfig
+import com.grkj.data.local.dos.IsIsolationPoint
+import com.grkj.data.domain.vo.PointDetailVO
+import com.grkj.data.domain.vo.PointManageVo
+
+/**
+ * 隔离点仓储接口(薄封装,直连 DAO;仅数据访问,不做业务判断)。
+ *
+ * 约束:
+ * 1) 全部为同步方法(非 suspend),调用方需在合适线程(建议 IO)执行;
+ * 2) 方法命名/签名与底层 DAO 保持一致,便于从 Logic 做最小替换(dao -> repository);
+ * 3) 直接返回持久层实体/VO;任何业务组装或过滤留在 Logic 层。
+ */
+interface IsolationPointRepository {
+
+    /** 新增隔离点(REPLACE 语义由 DAO 定义) */
+    fun addIsolationPoint(isolationPoint: IsIsolationPoint)
+
+    /** 更新隔离点 */
+    fun updateIsolationPoint(isolationPoint: IsIsolationPoint)
+
+    /** 分页查询隔离点管理数据(可按名称/功能/电源类型/区域/RFID 过滤) */
+    fun getPointManageData(
+        pointName: String?,
+        pointFunction: String?,
+        powerType: String?,
+        workstation: Long?,
+        rfidTag: String?,
+        size: Int,
+        offset: Int,
+        includeDescendants: Int = ISCSConfig.includeDescendants
+    ): List<PointManageVo>
+
+    /** 根据隔离点 id 批量删除 */
+    fun deletePointByPointIds(pointIds: List<Long>)
+
+    /** 按区域(可选含子孙)获取全部隔离点管理数据 */
+    fun getAllPointManageDataWithWorkstationId(
+        workstationId: Long,
+        includeDescendants: Int = ISCSConfig.includeDescendants
+    ): MutableList<PointManageVo>
+
+    /** 通过点位 NFC 字符串获取隔离点实体 */
+    fun getPointByPointNfc(pointNfc: String?): IsIsolationPoint?
+
+    /** 根据一组点位 id 查询点位详情(含 point_nfc) */
+    fun getPointDataListByPointIds(pointIds: List<Long>): List<PointDetailVO>
+
+    /** 通过 rfidId 获取隔离点实体(若不存在返回 null) */
+    fun getPointByRfidId(rfidId: Long): IsIsolationPoint?
+
+    /** 根据点位 id 列表获取其 rfidId 列表 */
+    fun getRfidIdByPointIds(inUsePointIds: List<Long>): List<Long>
+
+    /** 按点位 id 获取隔离点实体(找不到会抛异常,保持与 DAO 一致) */
+    fun getPointById(pointId: Long): IsIsolationPoint
+}

+ 20 - 1
data/src/main/java/com/grkj/data/repository/JobTicketRepository.kt

@@ -340,6 +340,13 @@ interface JobTicketRepository {
      */
     fun updateJobTicketLockData(ticketId: Long, lockId: Long, lockStatus: String)
 
+    /**
+     * 更新:updateJobTicketLockData(四参;Logic 用)
+     *
+     * @param isJobTicketLock 见 Dao 同名方法
+     */
+    fun updateJobTicketLockData(isJobTicketLock: IsJobTicketLock)
+
     /**
      * 更新:updateJobTicketPointData(四参;Logic 用)
      *
@@ -520,7 +527,11 @@ interface JobTicketRepository {
      * @param ticketId 见 Dao 同名方法
      * @return 见 Dao 同名方法返回
      */
-    fun getVirtualLockConflictPoint(pointId: Long?, lockId: Long?, ticketId: Long): List<IsJobTicketPoints>
+    fun getVirtualLockConflictPoint(
+        pointId: Long?,
+        lockId: Long?,
+        ticketId: Long
+    ): List<IsJobTicketPoints>
 
     /**
      * 开始:startJob(精简重载,Logic 用)
@@ -577,4 +588,12 @@ interface JobTicketRepository {
      * 更新作业步骤
      */
     fun updateTicketStepData(step: IsJobTicketStep)
+    /**
+     * 获取所有作业数据
+     */
+    fun getAllJobData(): List<DataExportJobVo>
+    /**
+     * 获取导出的所有锁定中的点位
+     */
+    fun getAllLockedPointsExportData(): List<DataExportLockedPointVo>
 }

+ 57 - 0
data/src/main/java/com/grkj/data/repository/RoleRepository.kt

@@ -0,0 +1,57 @@
+package com.grkj.data.repository
+
+import com.grkj.data.local.dos.SysRole
+import com.grkj.data.local.dos.SysUserRole
+import com.grkj.data.domain.vo.RoleManageVo
+
+/**
+ * 角色仓储接口(薄封装:数据访问直连 DAO;不写业务判断)
+ *
+ * 约束:
+ * 1) 全为同步方法(非 suspend),线程切换由调用方掌控(建议 IO 线程);
+ * 2) 方法签名与 RoleDao 保持一致,便于最小成本替换(dao -> repository)。
+ */
+interface RoleRepository {
+
+    /** 获取角色数据(del_flag=0) */
+    fun getRoleData(): List<SysRole>
+
+    /** 批量插入用户-角色关联(REPLACE 语义) */
+    fun insertUserRole(sysUserRole: List<SysUserRole>)
+
+    /** 根据用户 ID 批量删除用户-角色关联 */
+    fun deleteUserRoleByUserIds(userIds: List<Long>)
+
+    /** 根据角色 ID 批量删除角色 */
+    fun deleteRoleByRoleIds(roleIds: List<Long>)
+
+    /** 角色管理分页查询(支持名称、权限字符、状态过滤) */
+    fun getRoleManageData(
+        roleName: String?,
+        permissionCharacters: String?,
+        status: String?,
+        size: Int,
+        offset: Int
+    ): List<RoleManageVo>
+
+    /** 插入/更新单个角色,返回主键 ID */
+    fun insertRole(role: SysRole): Long
+
+    /** 根据用户 ID 查询角色集合 */
+    fun getRoleDataByUserId(userId: Long): List<SysRole>
+
+    /** 根据角色 key 查询角色 ID */
+    fun getRoleDataByRoleKey(roleKey: String): Long?
+
+    /** 根据角色 ID 集合查询绑定的用户 ID 集合 */
+    fun getUserIdsByRoleIds(roleIds: List<Long>): List<Long>
+
+    /** 获取所有角色(del_flag=0) */
+    fun getAllRole(): List<SysRole>
+
+    /** 获取所有用户-角色关联 */
+    fun getAllUserRoles(): List<SysUserRole>
+
+    /** 批量插入预设角色(REPLACE 语义) */
+    fun insertRoles(presetSysRole: List<SysRole>)
+}

+ 90 - 0
data/src/main/java/com/grkj/data/repository/SopRepository.kt

@@ -0,0 +1,90 @@
+package com.grkj.data.repository
+
+import com.grkj.data.config.ISCSConfig
+import com.grkj.data.domain.vo.DataExportSopVo
+import com.grkj.data.local.dos.IsSop
+import com.grkj.data.local.dos.IsSopGroup
+import com.grkj.data.local.dos.IsSopPoints
+import com.grkj.data.local.dos.IsSopUser
+import com.grkj.data.local.dos.IsSopWorkflowStep
+import com.grkj.data.domain.vo.JobPointVo
+import com.grkj.data.domain.vo.JobUserVo
+import com.grkj.data.domain.vo.SopManageVo
+
+/**
+ * SOP 仓储接口(薄封装:仅做数据访问,不做业务判断)。
+ *
+ * 设计约束:
+ * 1) 全部为同步方法(非 suspend),线程切换由调用方控制(建议 IO 线程)。
+ * 2) 方法与 DAO 基本等价,对上层 Logic 保持最小替换成本(dao -> repository)。
+ * 3) 直接返回持久层实体/VO;任何业务组装留在 Logic 层。
+ */
+interface SopRepository {
+
+    /** 保存(插入/替换)SOP,返回主键 ID */
+    fun saveSop(isSop: IsSop): Long
+
+    /** 批量保存 SOP 点位 */
+    fun saveSopPoints(isSopPoints: List<IsSopPoints>)
+
+    /** 批量保存 SOP 用户 */
+    fun saveSopUsers(isSopUsers: List<IsSopUser>)
+
+    /** 按岗位 ID 获取 SOP 列表(可选是否包含子孙区域) */
+    fun getSopDataByWorkstationId(
+        workstationId: Long,
+        includeDescendants: Int = ISCSConfig.includeDescendants
+    ): List<SopManageVo>
+
+    /** 按 SOP ID 获取 SOP 点位明细 */
+    fun getSopPointsBySopId(sopId: Long): List<JobPointVo>
+
+    /** 按 SOP ID 获取 SOP 用户列表 */
+    fun getSopUsersBySopId(sopId: Long): List<JobUserVo>
+
+    /** 按 SOP ID 获取 SOP 原始实体 */
+    fun getSopDataBySopId(sopId: Long): IsSop
+
+    /** SOP 管理分页(size, offset) */
+    fun getSopDataPage(size: Int, offset: Int): List<SopManageVo>
+
+    /** 按 SOP ID 获取 SOP 管理视图 */
+    fun getSopManageDataBySopId(sopId: Long): SopManageVo
+
+    /** 保存 SOP 分组,返回主键 ID */
+    fun saveSopGroup(group: IsSopGroup): Long
+
+    /** 按 SOP ID 批量删除 SOP */
+    fun deleteSopBySopId(sopIds: List<Long>)
+
+    /** 按 SOP ID 批量删除 SOP 点位 */
+    fun deleteSopPointsBySopId(sopIds: List<Long>)
+
+    /** 按 SOP ID 批量删除 SOP 用户 */
+    fun deleteSopUsersBySopId(sopIds: List<Long>)
+
+    /** 按 SOP ID 批量删除 SOP 分组 */
+    fun deleteSopGroupBySopId(sopIds: List<Long>)
+
+    /** 批量保存 SOP 对应的流程步骤 */
+    fun saveSopWorkflowStep(sopWorkflowStep: List<IsSopWorkflowStep>)
+
+    /** 按 SOP ID 获取流程步骤列表 */
+    fun getSopWorkflowSteps(sopId: Long): List<IsSopWorkflowStep>
+
+    /** 批量更新流程步骤 */
+    fun updateStep(sopWorkflowStep: List<IsSopWorkflowStep>)
+
+    /** 获取所有(未删除)SOP 实体 */
+    fun getSopData(): List<IsSop>
+
+    /**
+     * 获取sop导出数据
+     */
+    fun getDataExportSopData(): List<DataExportSopVo>
+
+    /**
+     * 删除sop流程步骤
+     */
+    fun deleteSopWorkflowStepBySopId(sopIds: List<Long>)
+}

+ 38 - 0
data/src/main/java/com/grkj/data/repository/SysMenuRepository.kt

@@ -0,0 +1,38 @@
+package com.grkj.data.repository
+
+import com.grkj.data.local.dos.SysMenu
+import com.grkj.data.local.dos.SysRoleMenu
+
+/**
+ * 系统菜单仓储接口(薄封装:数据访问;不含业务判断)
+ *
+ * 约束:
+ * 1) 全同步方法(非 suspend),线程切换由调用方负责(建议 IO 线程);
+ * 2) 方法签名与 SysMenuDao 对齐,便于最小替换(dao -> repository)。
+ */
+interface SysMenuRepository {
+
+    /** 根据 perms 唯一键查询菜单 */
+    fun findByPerms(perms: String): SysMenu?
+
+    /** 插入菜单(IGNORE 冲突策略),返回主键 ID(失败可为 0L) */
+    fun insert(menu: SysMenu): Long
+
+    /** 更新菜单 */
+    fun update(menu: SysMenu)
+
+    /** 查询所有菜单 */
+    fun getAll(): List<SysMenu>
+
+    /** 批量插入角色-菜单关联(REPLACE 语义) */
+    fun insertRoleMenus(sysRoleMenus: MutableList<SysRoleMenu>)
+
+    /** 根据角色 ID 列表查询权限标识(去重) */
+    fun getPermissionsByRoleIds(roleIds: List<Long>): MutableList<String?>
+
+    /** 按角色 ID 删除其全部菜单关联 */
+    fun deleteByRoleId(roleId: Long)
+
+    /** 根据角色 ID 查询菜单列表 */
+    fun getSysMenusByRoleId(roleId: Long): List<SysMenu>
+}

+ 66 - 0
data/src/main/java/com/grkj/data/repository/WorkflowRepository.kt

@@ -0,0 +1,66 @@
+package com.grkj.data.repository
+
+import com.grkj.data.local.dos.WorkflowMode
+import com.grkj.data.local.dos.WorkflowStep
+
+/**
+ * 工作流仓储接口(薄封装,仅做数据访问,不做业务判断)。
+ *
+ * 约束与约定:
+ * 1) 全部为同步方法(非 suspend),调用方需在合适线程(建议 IO)执行;
+ * 2) 方法命名与底层 DAO 基本一致,确保从 Logic 层最小成本替换(dao -> repository);
+ * 3) 直接返回持久层实体(WorkflowMode / WorkflowStep),模型转换留在上层。
+ */
+interface WorkflowRepository {
+
+    /** 新增单个步骤,返回自增主键 */
+    fun insertStep(step: WorkflowStep): Long
+
+    /** 更新单个步骤 */
+    fun updateStep(step: WorkflowStep)
+
+    /** 删除单个步骤 */
+    fun deleteStep(step: WorkflowStep)
+
+    /** 获取指定模式下的全部步骤(升序) */
+    fun getStepsByMode(modeId: Long): List<WorkflowStep>
+
+    /** 根据多个模式 id 获取步骤列表 */
+    fun getStepsByModes(modeIds: List<Long>): List<WorkflowStep>
+
+    /** 获取下一个可用步骤序号(MAX(step_index)+1) */
+    fun getNextStepIndex(modeId: Long): Int
+
+    /** 按步骤 id 查询步骤 */
+    fun getStepById(id: Long): WorkflowStep?
+
+    /** 判定“解锁”是否在“上锁”之前(同一模式) */
+    fun isUnlockBeforeLock(modeId: Long): Boolean
+
+    /** 获取开启的流程模式(deleted=0 且 status=1) */
+    fun getWorkflowModes(): List<WorkflowMode>
+
+    /** 获取所有未删除的流程模式(deleted=0) */
+    fun getAllWorkflowModes(): List<WorkflowMode>
+
+    /** 按模式 id 查询流程模式 */
+    fun getWorkflowModeByModeId(modeId: Long): WorkflowMode?
+
+    /** 更新流程模式(REPLACE 语义由 DAO 层定义) */
+    fun updateWorkflowMode(workflowMode: WorkflowMode)
+
+    /** 逻辑删除/恢复流程模式 */
+    fun updateWorkflowModeDeleted(workflowModeId: List<Long>, deleted: Boolean)
+
+    /** 新增流程模式,返回主键 */
+    fun insertWorkflowMode(workflowMode: WorkflowMode): Long
+
+    /** 批量新增步骤 */
+    fun insertSteps(step: List<WorkflowStep>)
+
+    /** 批量新增预设步骤 */
+    fun insertPresetSteps(presetWorkflowStep: List<WorkflowStep>)
+
+    /** 批量新增预设流程模式 */
+    fun insertWorkflowModes(presetWorkflowMode: List<WorkflowMode>)
+}

+ 52 - 0
data/src/main/java/com/grkj/data/repository/WorkstationRepository.kt

@@ -0,0 +1,52 @@
+package com.grkj.data.repository
+
+import com.grkj.data.domain.vo.WorkstationManageVo
+import com.grkj.data.local.dos.IsUserWorkstation
+import com.grkj.data.local.dos.IsWorkstation
+import com.sik.sikcore.date.TimeUtils
+
+/**
+ * 岗位仓储接口(薄封装:只做数据访问,不做业务判断)。
+ *
+ * 设计约束:
+ * 1) 全部为同步方法(非 suspend);线程调度由调用方控制(建议 IO 线程)。
+ * 2) 方法签名与底层 DAO 保持一致,便于最小成本替换(dao -> repository)。
+ * 3) 直接返回/接收持久层实体(IsWorkstation / IsUserWorkstation),模型转换放在上层逻辑。
+ */
+interface WorkstationRepository {
+
+    /** 获取岗位数据(del_flag=0) */
+    fun getWorkstationData(): List<WorkstationManageVo>
+
+    /** 批量新增用户-岗位关联 */
+    fun insertUserWorkstation(workstation: List<IsUserWorkstation>)
+
+    /** 根据用户 id 批量删除用户-岗位关联 */
+    fun deleteUserWorkstationByUserIds(userIds: List<Long>)
+
+    /** 新增岗位,返回自增主键 */
+    fun insertWorkstation(workstation: IsWorkstation): Long
+
+    /** 根据岗位 id 删除岗位 */
+    fun deleteWorkstationByWorkstationId(workstationId: Long)
+
+    /**
+     * 根据岗位 id 更新排序号
+     * @param workstationId 岗位ID
+     * @param orderNum 排序号(可空)
+     * @param updateTime 更新时间字符串(通常由底层默认给当前时间;保留入参以便必要时覆写)
+     */
+    fun updateWorkstationOrderNumById(workstationId: Long, orderNum: Int?, updateTime: String = TimeUtils.nowString(
+        TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT))
+
+    /** 根据父 id 与岗位名称查询单条岗位 */
+    fun getWorkstationDataByParentIdAndWorkstationName(parentId: Long, workstationName: String): IsWorkstation?
+
+    /** 根据岗位 id 更新岗位名称 */
+    fun updateWorkstationNameByWorkstationId(workstationId: Long, workstationName: String)
+
+    /**
+     * 获取所有区域
+     */
+    fun getAllWorkstation(): List<IsWorkstation>
+}

+ 58 - 0
data/src/main/java/com/grkj/data/repository/impl/network/NetworkExceptionRepositoryImpl.kt

@@ -0,0 +1,58 @@
+package com.grkj.data.repository.impl.network
+
+import com.grkj.data.local.dos.IsExceptionSourceStandard
+import com.grkj.data.local.dos.IsExceptionStandard
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.ExceptionRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+/**
+ * 网络异常仓储
+ */
+@Singleton
+class NetworkExceptionRepositoryImpl @Inject constructor(): BaseRepository(), ExceptionRepository {
+    override fun updateException(exceptionData: List<IsExceptionStandard>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getExceptionData(): List<IsExceptionStandard> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getExceptionDataById(exceptionId: Long): IsExceptionStandard? {
+        TODO("Not yet implemented")
+    }
+
+    override fun reportException(exceptionStandard: IsExceptionStandard): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun saveExceptionSourceData(exceptionSourceData: IsExceptionSourceStandard) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getExceptionSourceDataBySourceDataIds(sourceDataIds: List<Long>): List<IsExceptionSourceStandard> {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteExceptionByExceptionIds(exceptionIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteExceptionSourceDataById(sourceIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getExceptionSourceDataByExceptionId(exceptionId: Long): List<IsExceptionSourceStandard> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getExceptionIdBySourceDataId(exceptionSourceDataId: Long): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun getJobExceptionStatus(ticketId: Long): Int {
+        TODO("Not yet implemented")
+    }
+}

+ 373 - 0
data/src/main/java/com/grkj/data/repository/impl/network/NetworkHardwareRepositoryImpl.kt

@@ -0,0 +1,373 @@
+package com.grkj.data.repository.impl.network
+
+import com.grkj.data.domain.vo.DataExportPointVo
+import com.grkj.data.entity.local.LockData
+import com.grkj.data.entity.local.PointData
+import com.grkj.data.local.dos.IsIsolationPoint
+import com.grkj.data.local.dos.IsJobCard
+import com.grkj.data.local.dos.IsKey
+import com.grkj.data.local.dos.IsLock
+import com.grkj.data.local.dos.IsLockCabinet
+import com.grkj.data.local.dos.IsLockCabinetSlots
+import com.grkj.data.local.dos.IsMapPoint
+import com.grkj.data.local.dos.IsRfidToken
+import com.grkj.data.local.dos.IsUserWorkstation
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.HardwareRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class NetworkHardwareRepositoryImpl @Inject constructor(): BaseRepository(), HardwareRepository {
+    override fun getLockInfoByRfid(rfid: String): IsLock? {
+        TODO("Not yet implemented")
+    }
+
+    override fun getKeyInfoByRfid(rfid: String): IsKey? {
+        TODO("Not yet implemented")
+    }
+
+    override fun updatePointLockData(
+        ticketId: Long,
+        keyId: Long,
+        lockId: Long,
+        pointId: Long,
+        status: Int
+    ) {
+        TODO("Not yet implemented")
+    }
+
+    override fun updatePointUnLockData(
+        ticketId: Long,
+        keyId: Long,
+        lockId: Long,
+        pointId: Long,
+        status: Int
+    ) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllLockData(): List<IsLock> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllKeyData(): List<IsKey> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllLockCabinetSlots(): List<IsLockCabinetSlots> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getMapPointDataByPointIds(pointIds: List<Long>): List<IsMapPoint> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getMapPointDataByEntityId(pointId: Long): IsMapPoint {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateMapPoint(mapPoint: IsMapPoint) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPointDataByPointId(pointId: Long): IsIsolationPoint {
+        TODO("Not yet implemented")
+    }
+
+    override fun updatePointData(pointData: IsIsolationPoint) {
+        TODO("Not yet implemented")
+    }
+
+    override fun addLocksInfo(locks: List<IsLock>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun changeShowInMap(pointId: Long, showInMap: Boolean) {
+        TODO("Not yet implemented")
+    }
+
+    override fun removeCardBindByUserIds(userIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deletePointFromMap(pointId: Long) {
+        TODO("Not yet implemented")
+    }
+
+    override fun insertMapPoint(pointToMapVo: IsMapPoint) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getRfidDataByRfidIds(rfidId: List<Long>): List<IsRfidToken> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPointDataByWorkstationId(
+        workstationId: Long,
+        includeDescendants: Int
+    ): List<IsIsolationPoint> {
+        TODO("Not yet implemented")
+    }
+
+    override fun addCard(isJobCard: IsJobCard) {
+        TODO("Not yet implemented")
+    }
+
+    override fun addCard(isJobCard: List<IsJobCard>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteCardByUserIdAndCardCode(userId: Long, cardCode: String) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPointNfcDataByPointIds(pointIds: List<Long?>): List<PointData> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getJobTicketPointLockNfcDataListByPointId(pointId: Long): List<LockData> {
+        TODO("Not yet implemented")
+    }
+
+    override fun addRfidToken(isRfidToken: List<IsRfidToken>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun addRfidToken(isRfidToken: IsRfidToken): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun addKeyInfo(isKey: IsKey) {
+        TODO("Not yet implemented")
+    }
+
+    override fun addLockInfo(isLock: IsLock) {
+        TODO("Not yet implemented")
+    }
+
+    override fun clearIsKey() {
+        TODO("Not yet implemented")
+    }
+
+    override fun clearIsLock() {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteKeyByKeyIds(keyIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteLockByLockIds(lockIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteCardByCardIds(cardIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteRfidTokenByRfidTokenIds(rfidTokenIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllRfidTokenData(): List<IsRfidToken> {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateKeyInfo(isKey: IsKey) {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateLockInfo(isLock: IsLock) {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateCardInfo(isJobCard: IsJobCard) {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateRfidToken(rfidToken: IsRfidToken) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getKeyInfoPage(
+        keyCode: String?,
+        keyNfc: String?,
+        keyMacAddress: String?,
+        exStatus: Int?,
+        size: Int,
+        offset: Int
+    ): List<IsKey> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getLockInfoPage(
+        lockCode: String?,
+        lockNfc: String?,
+        exStatus: Int?,
+        size: Int,
+        offset: Int
+    ): List<IsLock> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCardInfoPage(
+        cardNfc: String?,
+        nickname: String?,
+        exStatus: Int?,
+        size: Int,
+        offset: Int
+    ): List<IsJobCard> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getRfidTokenInfoPage(
+        rfidTokenCode: String?,
+        rfid: String?,
+        status: Int?,
+        size: Int,
+        offset: Int
+    ): List<IsRfidToken> {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteKeyTable() {
+        TODO("Not yet implemented")
+    }
+
+    override fun removeCardData() {
+        TODO("Not yet implemented")
+    }
+
+    override fun removeRfidTokenData() {
+        TODO("Not yet implemented")
+    }
+
+    override fun getLastCardId(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getLastRFIDId(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getLastKeyId(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getLastLockId(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getIsJobCardByUserId(userId: Long): MutableList<IsJobCard> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCardDataByRfid(rfidNo: String): IsJobCard? {
+        TODO("Not yet implemented")
+    }
+
+    override fun getKeyInfoById(keyId: Long): IsKey? {
+        TODO("Not yet implemented")
+    }
+
+    override fun getLockInfoById(lockId: Long): IsLock? {
+        TODO("Not yet implemented")
+    }
+
+    override fun getIsLockCabinetSlotBySlotId(slotId: Long): IsLockCabinetSlots? {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateSlotsInfo(slots: IsLockCabinetSlots) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllPointCount(
+        workstationId: Long?,
+        includeDescendants: Int
+    ): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllPointData(): List<IsIsolationPoint> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getRfidDataByRfid(rfid: String): IsRfidToken? {
+        TODO("Not yet implemented")
+    }
+
+    override fun clearCabinetData() {
+        TODO("Not yet implemented")
+    }
+
+    override fun createCabinetData(isLockCabinet: IsLockCabinet): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun saveCabinetSlots(slots: List<IsLockCabinetSlots>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun clearCabinetSlots() {
+        TODO("Not yet implemented")
+    }
+
+    override fun removeSlotsException(row: Int, col: Int, dictValue: String?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun tagSlotsException(
+        row: Int,
+        col: Int,
+        dictValue: String?,
+        remark: String
+    ) {
+        TODO("Not yet implemented")
+    }
+
+    override fun tagKeyException(
+        rfid: String?,
+        remark: String,
+        exStatus: String?
+    ) {
+        TODO("Not yet implemented")
+    }
+
+    override fun tagLockException(
+        rfid: String?,
+        remark: String,
+        exStatus: String?
+    ) {
+        TODO("Not yet implemented")
+    }
+
+    override fun removeKeyException(rfid: String?, exStatus: String?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun removeLockException(rfid: String?, exStatus: String?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPointIdByPointNfc(pointRfid: String?): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun getUserIdByCardNfc(cardnfc: String): Long? {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllUserWorkstations(): List<IsUserWorkstation> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllJobCard(): List<IsJobCard> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllDataExportPointData(): List<DataExportPointVo> {
+        TODO("Not yet implemented")
+    }
+}

+ 65 - 0
data/src/main/java/com/grkj/data/repository/impl/network/NetworkIsolationPointRepositoryImpl.kt

@@ -0,0 +1,65 @@
+package com.grkj.data.repository.impl.network
+
+import com.grkj.data.domain.vo.PointDetailVO
+import com.grkj.data.domain.vo.PointManageVo
+import com.grkj.data.local.dos.IsIsolationPoint
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.HardwareRepository
+import com.grkj.data.repository.IsolationPointRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class NetworkIsolationPointRepositoryImpl @Inject constructor(): BaseRepository(), IsolationPointRepository {
+    override fun addIsolationPoint(isolationPoint: IsIsolationPoint) {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateIsolationPoint(isolationPoint: IsIsolationPoint) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPointManageData(
+        pointName: String?,
+        pointFunction: String?,
+        powerType: String?,
+        workstation: Long?,
+        rfidTag: String?,
+        size: Int,
+        offset: Int,
+        includeDescendants: Int
+    ): List<PointManageVo> {
+        TODO("Not yet implemented")
+    }
+
+    override fun deletePointByPointIds(pointIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllPointManageDataWithWorkstationId(
+        workstationId: Long,
+        includeDescendants: Int
+    ): MutableList<PointManageVo> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPointByPointNfc(pointNfc: String?): IsIsolationPoint? {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPointDataListByPointIds(pointIds: List<Long>): List<PointDetailVO> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPointByRfidId(rfidId: Long): IsIsolationPoint? {
+        TODO("Not yet implemented")
+    }
+
+    override fun getRfidIdByPointIds(inUsePointIds: List<Long>): List<Long> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPointById(pointId: Long): IsIsolationPoint {
+        TODO("Not yet implemented")
+    }
+}

+ 16 - 0
data/src/main/java/com/grkj/data/repository/impl/network/NetworkJobTicketRepositoryImpl.kt

@@ -1,5 +1,7 @@
 package com.grkj.data.repository.impl.network
 
+import com.grkj.data.domain.vo.DataExportJobVo
+import com.grkj.data.domain.vo.DataExportLockedPointVo
 import com.grkj.data.domain.vo.IsJobTicketDataVo
 import com.grkj.data.domain.vo.IsJobTicketKeyDataVo
 import com.grkj.data.domain.vo.IsJobTicketLockDataVo
@@ -21,10 +23,12 @@ import com.grkj.data.local.dos.IsJobTicketUser
 import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.JobTicketRepository
 import javax.inject.Inject
+import javax.inject.Singleton
 
 /**
  * 网络作业票仓储
  */
+@Singleton
 class NetworkJobTicketRepositoryImpl @Inject constructor() : BaseRepository(), JobTicketRepository {
     override fun getJobTicketUsersByTicketId(ticketId: Long): List<IsJobTicketUser> {
         TODO("Not yet implemented")
@@ -268,6 +272,14 @@ class NetworkJobTicketRepositoryImpl @Inject constructor() : BaseRepository(), J
         TODO("Not yet implemented")
     }
 
+    override fun getAllJobData(): List<DataExportJobVo> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllLockedPointsExportData(): List<DataExportLockedPointVo> {
+        TODO("Not yet implemented")
+    }
+
     override fun updateTicketStepStatus(stepId: Long, status: String) {
         TODO("Not yet implemented")
     }
@@ -328,6 +340,10 @@ class NetworkJobTicketRepositoryImpl @Inject constructor() : BaseRepository(), J
         TODO("Not yet implemented")
     }
 
+    override fun updateJobTicketLockData(isJobTicketLock: IsJobTicketLock) {
+        TODO("Not yet implemented")
+    }
+
     override fun saveIsJobTicketUser(isJobTicketUsers: List<IsJobTicketUser>) {
         TODO("Not yet implemented")
     }

+ 67 - 0
data/src/main/java/com/grkj/data/repository/impl/network/NetworkRoleRepositoryImpl.kt

@@ -0,0 +1,67 @@
+package com.grkj.data.repository.impl.network
+
+import com.grkj.data.domain.vo.RoleManageVo
+import com.grkj.data.local.dos.SysRole
+import com.grkj.data.local.dos.SysUserRole
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.HardwareRepository
+import com.grkj.data.repository.RoleRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class NetworkRoleRepositoryImpl @Inject constructor(): BaseRepository(), RoleRepository {
+    override fun getRoleData(): List<SysRole> {
+        TODO("Not yet implemented")
+    }
+
+    override fun insertUserRole(sysUserRole: List<SysUserRole>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteUserRoleByUserIds(userIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteRoleByRoleIds(roleIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getRoleManageData(
+        roleName: String?,
+        permissionCharacters: String?,
+        status: String?,
+        size: Int,
+        offset: Int
+    ): List<RoleManageVo> {
+        TODO("Not yet implemented")
+    }
+
+    override fun insertRole(role: SysRole): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun getRoleDataByUserId(userId: Long): List<SysRole> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getRoleDataByRoleKey(roleKey: String): Long? {
+        TODO("Not yet implemented")
+    }
+
+    override fun getUserIdsByRoleIds(roleIds: List<Long>): List<Long> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllRole(): List<SysRole> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllUserRoles(): List<SysUserRole> {
+        TODO("Not yet implemented")
+    }
+
+    override fun insertRoles(presetSysRole: List<SysRole>) {
+        TODO("Not yet implemented")
+    }
+}

+ 107 - 0
data/src/main/java/com/grkj/data/repository/impl/network/NetworkSopRepository.kt

@@ -0,0 +1,107 @@
+package com.grkj.data.repository.impl.network
+
+import com.grkj.data.domain.vo.DataExportSopVo
+import com.grkj.data.domain.vo.JobPointVo
+import com.grkj.data.domain.vo.JobUserVo
+import com.grkj.data.domain.vo.SopManageVo
+import com.grkj.data.local.dos.IsSop
+import com.grkj.data.local.dos.IsSopGroup
+import com.grkj.data.local.dos.IsSopPoints
+import com.grkj.data.local.dos.IsSopUser
+import com.grkj.data.local.dos.IsSopWorkflowStep
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.SopRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+/**
+ * SOP网络仓储
+ */
+@Singleton
+class NetworkSopRepository @Inject constructor(): BaseRepository(), SopRepository {
+    override fun saveSop(isSop: IsSop): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun saveSopPoints(isSopPoints: List<IsSopPoints>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun saveSopUsers(isSopUsers: List<IsSopUser>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getSopDataByWorkstationId(
+        workstationId: Long,
+        includeDescendants: Int
+    ): List<SopManageVo> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getSopPointsBySopId(sopId: Long): List<JobPointVo> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getSopUsersBySopId(sopId: Long): List<JobUserVo> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getSopDataBySopId(sopId: Long): IsSop {
+        TODO("Not yet implemented")
+    }
+
+    override fun getSopDataPage(
+        size: Int,
+        offset: Int
+    ): List<SopManageVo> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getSopManageDataBySopId(sopId: Long): SopManageVo {
+        TODO("Not yet implemented")
+    }
+
+    override fun saveSopGroup(group: IsSopGroup): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteSopBySopId(sopIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteSopPointsBySopId(sopIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteSopUsersBySopId(sopIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteSopGroupBySopId(sopIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun saveSopWorkflowStep(sopWorkflowStep: List<IsSopWorkflowStep>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getSopWorkflowSteps(sopId: Long): List<IsSopWorkflowStep> {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateStep(sopWorkflowStep: List<IsSopWorkflowStep>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getSopData(): List<IsSop> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getDataExportSopData(): List<DataExportSopVo> {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteSopWorkflowStepBySopId(sopIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+}

+ 44 - 0
data/src/main/java/com/grkj/data/repository/impl/network/NetworkSysMenuRepositoryImpl.kt

@@ -0,0 +1,44 @@
+package com.grkj.data.repository.impl.network
+
+import com.grkj.data.local.dos.SysMenu
+import com.grkj.data.local.dos.SysRoleMenu
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.HardwareRepository
+import com.grkj.data.repository.SysMenuRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class NetworkSysMenuRepositoryImpl @Inject constructor(): BaseRepository(), SysMenuRepository {
+    override fun findByPerms(perms: String): SysMenu? {
+        TODO("Not yet implemented")
+    }
+
+    override fun insert(menu: SysMenu): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun update(menu: SysMenu) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAll(): List<SysMenu> {
+        TODO("Not yet implemented")
+    }
+
+    override fun insertRoleMenus(sysRoleMenus: MutableList<SysRoleMenu>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPermissionsByRoleIds(roleIds: List<Long>): MutableList<String?> {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteByRoleId(roleId: Long) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getSysMenusByRoleId(roleId: Long): List<SysMenu> {
+        TODO("Not yet implemented")
+    }
+}

+ 2 - 0
data/src/main/java/com/grkj/data/repository/impl/network/NetworkUserRepositoryImpl.kt

@@ -5,10 +5,12 @@ import com.grkj.data.local.dos.SysUserDo
 import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.UserRepository
 import javax.inject.Inject
+import javax.inject.Singleton
 
 /**
  * 网络用户仓储层实现
  */
+@Singleton
 class NetworkUserRepositoryImpl @Inject constructor() : BaseRepository(), UserRepository {
     override fun getUserInfoByUsername(username: String): SysUserDo? {
         TODO("Not yet implemented")

+ 83 - 0
data/src/main/java/com/grkj/data/repository/impl/network/NetworkWorkflowRepositoryImpl.kt

@@ -0,0 +1,83 @@
+package com.grkj.data.repository.impl.network
+
+import com.grkj.data.local.dos.WorkflowMode
+import com.grkj.data.local.dos.WorkflowStep
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.HardwareRepository
+import com.grkj.data.repository.WorkflowRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class NetworkWorkflowRepositoryImpl @Inject constructor(): BaseRepository(), WorkflowRepository {
+    override fun insertStep(step: WorkflowStep): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateStep(step: WorkflowStep) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteStep(step: WorkflowStep) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getStepsByMode(modeId: Long): List<WorkflowStep> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getStepsByModes(modeIds: List<Long>): List<WorkflowStep> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getNextStepIndex(modeId: Long): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getStepById(id: Long): WorkflowStep? {
+        TODO("Not yet implemented")
+    }
+
+    override fun isUnlockBeforeLock(modeId: Long): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun getWorkflowModes(): List<WorkflowMode> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllWorkflowModes(): List<WorkflowMode> {
+        TODO("Not yet implemented")
+    }
+
+    override fun getWorkflowModeByModeId(modeId: Long): WorkflowMode? {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateWorkflowMode(workflowMode: WorkflowMode) {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateWorkflowModeDeleted(
+        workflowModeId: List<Long>,
+        deleted: Boolean
+    ) {
+        TODO("Not yet implemented")
+    }
+
+    override fun insertWorkflowMode(workflowMode: WorkflowMode): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun insertSteps(step: List<WorkflowStep>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun insertPresetSteps(presetWorkflowStep: List<WorkflowStep>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun insertWorkflowModes(presetWorkflowMode: List<WorkflowMode>) {
+        TODO("Not yet implemented")
+    }
+}

+ 58 - 0
data/src/main/java/com/grkj/data/repository/impl/network/NetworkWorkstationRepositoryImpl.kt

@@ -0,0 +1,58 @@
+package com.grkj.data.repository.impl.network
+
+import com.grkj.data.domain.vo.WorkstationManageVo
+import com.grkj.data.local.dos.IsUserWorkstation
+import com.grkj.data.local.dos.IsWorkstation
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.WorkstationRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class NetworkWorkstationRepositoryImpl @Inject constructor(): BaseRepository(), WorkstationRepository {
+    override fun getWorkstationData(): List<WorkstationManageVo> {
+        TODO("Not yet implemented")
+    }
+
+    override fun insertUserWorkstation(workstation: List<IsUserWorkstation>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteUserWorkstationByUserIds(userIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun insertWorkstation(workstation: IsWorkstation): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteWorkstationByWorkstationId(workstationId: Long) {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateWorkstationOrderNumById(
+        workstationId: Long,
+        orderNum: Int?,
+        updateTime: String
+    ) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getWorkstationDataByParentIdAndWorkstationName(
+        parentId: Long,
+        workstationName: String
+    ): IsWorkstation? {
+        TODO("Not yet implemented")
+    }
+
+    override fun updateWorkstationNameByWorkstationId(
+        workstationId: Long,
+        workstationName: String
+    ) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAllWorkstation(): List<IsWorkstation> {
+        TODO("Not yet implemented")
+    }
+}

+ 99 - 0
data/src/main/java/com/grkj/data/repository/impl/standard/ExceptionRepositoryImpl.kt

@@ -0,0 +1,99 @@
+package com.grkj.data.repository.impl.standard
+
+import com.grkj.data.local.dao.ExceptionDao
+import com.grkj.data.local.dos.IsExceptionSourceStandard
+import com.grkj.data.local.dos.IsExceptionStandard
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.ExceptionRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+/**
+ * 异常仓储实现(本地 Room 直连):
+ * - 不包含任何业务逻辑或状态推导;
+ * - 同步方法直调 DAO,线程调度由调用方负责(建议在 IO 线程调用)。
+ */
+@Singleton
+class ExceptionRepositoryImpl @Inject constructor(
+    private val exceptionDao: ExceptionDao
+) : BaseRepository(),ExceptionRepository {
+
+    /**
+     * 批量更新异常记录(REPLACE 语义)。
+     */
+    override fun updateException(exceptionData: List<IsExceptionStandard>) {
+        exceptionDao.updateException(exceptionData)
+    }
+
+    /**
+     * 查询全部异常记录。
+     */
+    override fun getExceptionData(): List<IsExceptionStandard> {
+        return exceptionDao.getExceptionData()
+    }
+
+    /**
+     * 主键查询单条异常。
+     */
+    override fun getExceptionDataById(exceptionId: Long): IsExceptionStandard? {
+        return exceptionDao.getExceptionDataById(exceptionId)
+    }
+
+    /**
+     * 上报(插入/替换)异常。
+     */
+    override fun reportException(exceptionStandard: IsExceptionStandard): Long {
+        return exceptionDao.reportException(exceptionStandard)
+    }
+
+    /**
+     * 保存异常来源数据(插入/替换)。
+     */
+    override fun saveExceptionSourceData(exceptionSourceData: IsExceptionSourceStandard) {
+        exceptionDao.saveExceptionSourceData(exceptionSourceData)
+    }
+
+    /**
+     * 批量查询异常来源(按来源数据ID)。
+     */
+    override fun getExceptionSourceDataBySourceDataIds(
+        sourceDataIds: List<Long>
+    ): List<IsExceptionSourceStandard> {
+        return exceptionDao.getExceptionSourceDataBySourceDataIds(sourceDataIds)
+    }
+
+    /**
+     * 按异常ID批量删除异常记录。
+     */
+    override fun deleteExceptionByExceptionIds(exceptionIds: List<Long>) {
+        exceptionDao.deleteExceptionByExceptionIds(exceptionIds)
+    }
+
+    /**
+     * 按来源主键ID批量删除异常来源记录。
+     */
+    override fun deleteExceptionSourceDataById(sourceIds: List<Long>) {
+        exceptionDao.deleteExceptionSourceDataById(sourceIds)
+    }
+
+    /**
+     * 查询某异常的全部来源记录。
+     */
+    override fun getExceptionSourceDataByExceptionId(exceptionId: Long): List<IsExceptionSourceStandard> {
+        return exceptionDao.getExceptionSourceDataByExceptionId(exceptionId)
+    }
+
+    /**
+     * 通过“来源数据ID”反查异常ID。
+     */
+    override fun getExceptionIdBySourceDataId(exceptionSourceDataId: Long): Long {
+        return exceptionDao.getExceptionIdBySourceDataId(exceptionSourceDataId)
+    }
+
+    /**
+     * 根据来源数据ID(如作业票ID)判断是否存在异常(返回状态码)。
+     */
+    override fun getJobExceptionStatus(ticketId: Long): Int {
+        return exceptionDao.getJobExceptionStatus(ticketId)
+    }
+}

+ 464 - 0
data/src/main/java/com/grkj/data/repository/impl/standard/HardwareRepositoryImpl.kt

@@ -0,0 +1,464 @@
+package com.grkj.data.repository.impl.standard
+
+import com.grkj.data.domain.vo.DataExportPointVo
+import com.grkj.data.entity.local.LockData
+import com.grkj.data.entity.local.PointData
+import com.grkj.data.local.dao.HardwareDao
+import com.grkj.data.local.dao.WorkstationDao
+import com.grkj.data.local.dos.IsIsolationPoint
+import com.grkj.data.local.dos.IsJobCard
+import com.grkj.data.local.dos.IsKey
+import com.grkj.data.local.dos.IsLock
+import com.grkj.data.local.dos.IsLockCabinet
+import com.grkj.data.local.dos.IsLockCabinetSlots
+import com.grkj.data.local.dos.IsMapPoint
+import com.grkj.data.local.dos.IsRfidToken
+import com.grkj.data.local.dos.IsUserWorkstation
+import com.grkj.data.local.dos.IsWorkstation
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.HardwareRepository
+import com.grkj.data.repository.WorkstationRepository
+import com.sik.sikcore.data.BeanUtils
+import javax.inject.Inject
+import javax.inject.Singleton
+
+/**
+ * 硬件仓储实现:直连 HardwareDao 的同步薄封装。
+ *
+ * 关键约束:
+ * 1) 同步方法,不切线程;请在调用处(如 LiveData 的 IO dispatcher)保证不阻塞主线程。
+ * 2) 仅做数据访问与入参透传,不做状态判断、字典选择、模型拼装等业务性工作。
+ * 3) 继承 BaseRepository,提供 logger 以便必要的调试与问题排查。
+ */
+@Singleton
+class HardwareRepositoryImpl @Inject constructor(
+    private val hardwareDao: HardwareDao,
+    private val workstationRepository: WorkstationRepository
+) : BaseRepository(), HardwareRepository {
+
+    override fun getLockInfoByRfid(rfid: String): IsLock? {
+        logger.debug("getLockInfoByRfid: rfid={}", rfid)
+        return hardwareDao.getLockInfoByRfid(rfid)
+    }
+
+    override fun getKeyInfoByRfid(rfid: String): IsKey? {
+        logger.debug("getKeyInfoByRfid: rfid={}", rfid)
+        return hardwareDao.getKeyInfoByRfid(rfid)
+    }
+
+    override fun updatePointLockData(
+        ticketId: Long,
+        keyId: Long,
+        lockId: Long,
+        pointId: Long,
+        status: Int
+    ) {
+        logger.debug(
+            "updatePointLockData: ticketId={}, keyId={}, lockId={}, pointId={}, status={}",
+            ticketId, keyId, lockId, pointId, status
+        )
+        hardwareDao.updatePointLockData(ticketId, keyId, lockId, pointId, status)
+    }
+
+    override fun updatePointUnLockData(
+        ticketId: Long,
+        keyId: Long,
+        lockId: Long,
+        pointId: Long,
+        status: Int
+    ) {
+        logger.debug(
+            "updatePointUnLockData: ticketId={}, keyId={}, lockId={}, pointId={}, status={}",
+            ticketId, keyId, lockId, pointId, status
+        )
+        hardwareDao.updatePointUnLockData(ticketId, keyId, lockId, pointId, status)
+    }
+
+    override fun getAllLockData(): List<IsLock> {
+        logger.debug("getAllLockData")
+        return hardwareDao.getAllLockData()
+    }
+
+    override fun getAllKeyData(): List<IsKey> {
+        logger.debug("getAllKeyData")
+        return hardwareDao.getAllKeyData()
+    }
+
+    override fun getAllLockCabinetSlots(): List<IsLockCabinetSlots> {
+        logger.debug("getAllLockCabinetSlots")
+        return hardwareDao.getAllLockCabinetSlots()
+    }
+
+    override fun getMapPointDataByPointIds(pointIds: List<Long>): List<IsMapPoint> {
+        logger.debug("getMapPointDataByPointIds: size={}", pointIds.size)
+        return hardwareDao.getMapPointDataByPointIds(pointIds)
+    }
+
+    override fun getMapPointDataByEntityId(pointId: Long): IsMapPoint {
+        logger.debug("getMapPointDataByEntityId: pointId={}", pointId)
+        return hardwareDao.getMapPointDataByEntityId(pointId)
+    }
+
+    override fun updateMapPoint(mapPoint: IsMapPoint) {
+        logger.debug("updateMapPoint: entityId={}", mapPoint.entityId)
+        hardwareDao.updateMapPoint(mapPoint)
+    }
+
+    override fun getPointDataByPointId(pointId: Long): IsIsolationPoint {
+        logger.debug("getPointDataByPointId: pointId={}", pointId)
+        return hardwareDao.getPointDataByPointId(pointId)
+    }
+
+    override fun updatePointData(pointData: IsIsolationPoint) {
+        logger.debug("updatePointData: pointId={}", pointData.pointId)
+        hardwareDao.updatePointData(pointData)
+    }
+
+    override fun addLocksInfo(locks: List<IsLock>) {
+        logger.debug("addLocksInfo: size={}", locks.size)
+        hardwareDao.addLocksInfo(locks)
+    }
+
+    override fun changeShowInMap(pointId: Long, showInMap: Boolean) {
+        logger.debug("changeShowInMap: pointId={}, showInMap={}", pointId, showInMap)
+        hardwareDao.changeShowInMap(pointId, showInMap)
+    }
+
+    override fun removeCardBindByUserIds(userIds: List<Long>) {
+        logger.debug("removeCardBindByUserIds: size={}", userIds.size)
+        hardwareDao.removeCardBindByUserIds(userIds)
+    }
+
+    override fun deletePointFromMap(pointId: Long) {
+        logger.debug("deletePointFromMap: pointId={}", pointId)
+        hardwareDao.deletePointFromMap(pointId)
+    }
+
+    override fun insertMapPoint(pointToMapVo: IsMapPoint) {
+        logger.debug("insertMapPoint: entityId={}", pointToMapVo.entityId)
+        hardwareDao.insertMapPoint(pointToMapVo)
+    }
+
+    override fun getRfidDataByRfidIds(rfidId: List<Long>): List<IsRfidToken> {
+        logger.debug("getRfidDataByRfidIds: size={}", rfidId.size)
+        return hardwareDao.getRfidDataByRfidIds(rfidId)
+    }
+
+    override fun getPointDataByWorkstationId(
+        workstationId: Long,
+        includeDescendants: Int
+    ): List<IsIsolationPoint> {
+        logger.debug(
+            "getPointDataByWorkstationId: workstationId={}, includeDescendants={}",
+            workstationId, includeDescendants
+        )
+        return hardwareDao.getPointDataByWorkstationId(workstationId, includeDescendants)
+    }
+
+    override fun addCard(isJobCard: IsJobCard) {
+        logger.debug("addCard: single")
+        hardwareDao.addCard(isJobCard)
+    }
+
+    override fun addCard(isJobCard: List<IsJobCard>) {
+        logger.debug("addCard: batch size={}", isJobCard.size)
+        hardwareDao.addCard(isJobCard)
+    }
+
+    override fun deleteCardByUserIdAndCardCode(userId: Long, cardCode: String) {
+        logger.debug("deleteCardByUserIdAndCardCode: userId={}, cardCode={}", userId, cardCode)
+        hardwareDao.deleteCardByUserIdAndCardCode(userId, cardCode)
+    }
+
+    override fun getPointNfcDataByPointIds(pointIds: List<Long?>): List<PointData> {
+        logger.debug("getPointNfcDataByPointIds: size={}", pointIds.size)
+        return hardwareDao.getPointNfcDataByPointIds(pointIds)
+    }
+
+    override fun getJobTicketPointLockNfcDataListByPointId(pointId: Long): List<LockData> {
+        logger.debug("getJobTicketPointLockNfcDataListByPointId: pointId={}", pointId)
+        return hardwareDao.getJobTicketPointLockNfcDataListByPointId(pointId)
+    }
+
+    override fun addRfidToken(isRfidToken: List<IsRfidToken>) {
+        logger.debug("addRfidToken: batch size={}", isRfidToken.size)
+        hardwareDao.addRfidToken(isRfidToken)
+    }
+
+    override fun addRfidToken(isRfidToken: IsRfidToken): Long {
+        logger.debug("addRfidToken: single")
+        return hardwareDao.addRfidToken(isRfidToken)
+    }
+
+    override fun addKeyInfo(isKey: IsKey) {
+        logger.debug("addKeyInfo: keyCode={}", isKey.keyCode)
+        hardwareDao.addKeyInfo(isKey)
+    }
+
+    override fun addLockInfo(isLock: IsLock) {
+        logger.debug("addLockInfo: lockCode={}", isLock.lockCode)
+        hardwareDao.addLockInfo(isLock)
+    }
+
+    override fun clearIsKey() {
+        logger.debug("clearIsKey")
+        hardwareDao.clearIsKey()
+    }
+
+    override fun getAllUserWorkstations(): List<IsUserWorkstation> {
+        logger.debug("getAllUserWorkstations")
+        return hardwareDao.getAllUserWorkstations()
+    }
+
+    override fun getAllJobCard(): List<IsJobCard> {
+        logger.debug("getAllJobCard")
+        return hardwareDao.getAllJobCard()
+    }
+
+    override fun getAllDataExportPointData(): List<DataExportPointVo> {
+        val allPointData = hardwareDao.getAllPointData()
+        val allDataExportPointVo = BeanUtils.copyList(allPointData, DataExportPointVo::class.java)
+        val allPointRfid = hardwareDao.getAllRfidTokenData()
+        val allWorkstation = workstationRepository.getWorkstationData()
+        allDataExportPointVo.forEach { point ->
+            point.pointFunction = point.remark.toString()
+            point.workstationName =
+                allWorkstation.find { it.workstationId == point.workstationId }?.workstationName.toString()
+            point.pointNfc = allPointRfid.find { it.rfidId == point.rfidId }?.rfid ?: ""
+        }
+        return allDataExportPointVo
+    }
+
+    override fun getUserIdByCardNfc(cardnfc: String): Long? {
+        logger.debug("getUserIdByCardNfc: cardnfc={}", cardnfc)
+        return hardwareDao.getUserIdByCardNfc(cardnfc)
+    }
+
+    override fun clearIsLock() {
+        logger.debug("clearIsLock")
+        hardwareDao.clearIsLock()
+    }
+
+    override fun getPointIdByPointNfc(pointRfid: String?): Long {
+        logger.debug("getPointIdByPointNfc: pointRfid={}", pointRfid)
+        return hardwareDao.getPointIdByPointNfc(pointRfid)
+    }
+
+    override fun deleteKeyByKeyIds(keyIds: List<Long>) {
+        logger.debug("deleteKeyByKeyIds: size={}", keyIds.size)
+        hardwareDao.deleteKeyByKeyIds(keyIds)
+    }
+
+    override fun deleteLockByLockIds(lockIds: List<Long>) {
+        logger.debug("deleteLockByLockIds: size={}", lockIds.size)
+        hardwareDao.deleteLockByLockIds(lockIds)
+    }
+
+    override fun deleteCardByCardIds(cardIds: List<Long>) {
+        logger.debug("deleteCardByCardIds: size={}", cardIds.size)
+        hardwareDao.deleteCardByCardIds(cardIds)
+    }
+
+    override fun deleteRfidTokenByRfidTokenIds(rfidTokenIds: List<Long>) {
+        logger.debug("deleteRfidTokenByRfidTokenIds: size={}", rfidTokenIds.size)
+        hardwareDao.deleteRfidTokenByRfidTokenIds(rfidTokenIds)
+    }
+
+    override fun getAllRfidTokenData(): List<IsRfidToken> {
+        logger.debug("getAllRfidTokenData")
+        return hardwareDao.getAllRfidTokenData()
+    }
+
+    override fun updateKeyInfo(isKey: IsKey) {
+        logger.debug("updateKeyInfo: keyId={}", isKey.keyId)
+        hardwareDao.updateKeyInfo(isKey)
+    }
+
+    override fun updateLockInfo(isLock: IsLock) {
+        logger.debug("updateLockInfo: lockId={}", isLock.lockId)
+        hardwareDao.updateLockInfo(isLock)
+    }
+
+    override fun updateCardInfo(isJobCard: IsJobCard) {
+        logger.debug("updateCardInfo: cardId={}", isJobCard.cardId)
+        hardwareDao.updateCardInfo(isJobCard)
+    }
+
+    override fun updateRfidToken(rfidToken: IsRfidToken) {
+        logger.debug("updateRfidToken: rfidId={}", rfidToken.rfidId)
+        hardwareDao.updateRfidToken(rfidToken)
+    }
+
+    override fun getKeyInfoPage(
+        keyCode: String?,
+        keyNfc: String?,
+        keyMacAddress: String?,
+        exStatus: Int?,
+        size: Int,
+        offset: Int
+    ): List<IsKey> {
+        logger.debug("getKeyInfoPage: size={}, offset={}", size, offset)
+        return hardwareDao.getKeyInfoPage(keyCode, keyNfc, keyMacAddress, exStatus, size, offset)
+    }
+
+    override fun getLockInfoPage(
+        lockCode: String?, lockNfc: String?, exStatus: Int?, size: Int, offset: Int
+    ): List<IsLock> {
+        logger.debug("getLockInfoPage: size={}, offset={}", size, offset)
+        return hardwareDao.getLockInfoPage(lockCode, lockNfc, exStatus, size, offset)
+    }
+
+    override fun getCardInfoPage(
+        cardNfc: String?, nickname: String?, exStatus: Int?, size: Int, offset: Int
+    ): List<IsJobCard> {
+        logger.debug("getCardInfoPage: size={}, offset={}", size, offset)
+        return hardwareDao.getCardInfoPage(cardNfc, nickname, exStatus, size, offset)
+    }
+
+    override fun getRfidTokenInfoPage(
+        rfidTokenCode: String?, rfid: String?, status: Int?, size: Int, offset: Int
+    ): List<IsRfidToken> {
+        logger.debug("getRfidTokenInfoPage: size={}, offset={}", size, offset)
+        return hardwareDao.getRfidTokenInfoPage(rfidTokenCode, rfid, status, size, offset)
+    }
+
+    override fun deleteKeyTable() {
+        logger.debug("deleteKeyTable")
+        hardwareDao.deleteKeyTable()
+    }
+
+    override fun removeCardData() {
+        logger.debug("removeCardData")
+        hardwareDao.removeCardData()
+    }
+
+    override fun removeRfidTokenData() {
+        logger.debug("removeRfidTokenData")
+        hardwareDao.removeRfidTokenData()
+    }
+
+    override fun getLastCardId(): Int {
+        logger.debug("getLastCardId")
+        return hardwareDao.getLastCardId()
+    }
+
+    override fun getLastRFIDId(): Int {
+        logger.debug("getLastRFIDId")
+        return hardwareDao.getLastRFIDId()
+    }
+
+    override fun getLastKeyId(): Int {
+        logger.debug("getLastKeyId")
+        return hardwareDao.getLastKeyId()
+    }
+
+    override fun getLastLockId(): Int {
+        logger.debug("getLastLockId")
+        return hardwareDao.getLastLockId()
+    }
+
+    override fun getIsJobCardByUserId(userId: Long): MutableList<IsJobCard> {
+        logger.debug("getIsJobCardByUserId: userId={}", userId)
+        return hardwareDao.getIsJobCardByUserId(userId)
+    }
+
+    override fun getCardDataByRfid(rfidNo: String): IsJobCard? {
+        logger.debug("getCardDataByRfid: rfidNo={}", rfidNo)
+        return hardwareDao.getCardDataByRfid(rfidNo)
+    }
+
+    override fun getKeyInfoById(keyId: Long): IsKey? {
+        logger.debug("getKeyInfoById: keyId={}", keyId)
+        return hardwareDao.getKeyInfoById(keyId)
+    }
+
+    override fun getLockInfoById(lockId: Long): IsLock? {
+        logger.debug("getLockInfoById: lockId={}", lockId)
+        return hardwareDao.getLockInfoById(lockId)
+    }
+
+    override fun getIsLockCabinetSlotBySlotId(slotId: Long): IsLockCabinetSlots? {
+        logger.debug("getIsLockCabinetSlotBySlotId: slotId={}", slotId)
+        return hardwareDao.getIsLockCabinetSlotBySlotId(slotId)
+    }
+
+    override fun updateSlotsInfo(slots: IsLockCabinetSlots) {
+        logger.debug("updateSlotsInfo: slotId={}", slots.slotId)
+        hardwareDao.updateSlotsInfo(slots)
+    }
+
+    override fun getAllPointCount(workstationId: Long?, includeDescendants: Int): Int {
+        logger.debug(
+            "getAllPointCount: workstationId={}, includeDescendants={}",
+            workstationId,
+            includeDescendants
+        )
+        return hardwareDao.getAllPointCount(workstationId, includeDescendants)
+    }
+
+    override fun getAllPointData(): List<IsIsolationPoint> {
+        logger.debug("getAllPointData")
+        return hardwareDao.getAllPointData()
+    }
+
+    override fun getRfidDataByRfid(rfid: String): IsRfidToken? {
+        logger.debug("getRfidDataByRfid: rfid={}", rfid)
+        return hardwareDao.getRfidDataByRfid(rfid)
+    }
+
+    override fun clearCabinetData() {
+        logger.debug("clearCabinetData")
+        hardwareDao.clearCabinetData()
+    }
+
+    override fun createCabinetData(isLockCabinet: IsLockCabinet): Long {
+        logger.debug("createCabinetData: cabinetCode={}", isLockCabinet.cabinetCode)
+        return hardwareDao.createCabinetData(isLockCabinet)
+    }
+
+    override fun saveCabinetSlots(slots: List<IsLockCabinetSlots>) {
+        logger.debug("saveCabinetSlots: size={}", slots.size)
+        hardwareDao.saveCabinetSlots(slots)
+    }
+
+    override fun clearCabinetSlots() {
+        logger.debug("clearCabinetSlots")
+        hardwareDao.clearCabinetSlots()
+    }
+
+    override fun removeSlotsException(row: Int, col: Int, dictValue: String?) {
+        logger.debug("removeSlotsException: row={}, col={}, dictValue={}", row, col, dictValue)
+        hardwareDao.removeSlotsException(row, col, dictValue)
+    }
+
+    override fun tagSlotsException(row: Int, col: Int, dictValue: String?, remark: String) {
+        logger.debug(
+            "tagSlotsException: row={}, col={}, dictValue={}, remark={}",
+            row,
+            col,
+            dictValue,
+            remark
+        )
+        hardwareDao.tagSlotsException(row, col, dictValue, remark)
+    }
+
+    override fun tagKeyException(rfid: String?, remark: String, exStatus: String?) {
+        logger.debug("tagKeyException: rfid={}, remark={}, exStatus={}", rfid, remark, exStatus)
+        hardwareDao.tagKeyException(rfid, remark, exStatus)
+    }
+
+    override fun tagLockException(rfid: String?, remark: String, exStatus: String?) {
+        logger.debug("tagLockException: rfid={}, remark={}, exStatus={}", rfid, remark, exStatus)
+        hardwareDao.tagLockException(rfid, remark, exStatus)
+    }
+
+    override fun removeKeyException(rfid: String?, exStatus: String?) {
+        logger.debug("removeKeyException: rfid={}, exStatus={}", rfid, exStatus)
+        hardwareDao.removeKeyException(rfid, exStatus)
+    }
+
+    override fun removeLockException(rfid: String?, exStatus: String?) {
+        logger.debug("removeLockException: rfid={}, exStatus={}", rfid, exStatus)
+        hardwareDao.removeLockException(rfid, exStatus)
+    }
+}

+ 104 - 0
data/src/main/java/com/grkj/data/repository/impl/standard/IsolationPointRepositoryImpl.kt

@@ -0,0 +1,104 @@
+package com.grkj.data.repository.impl.standard
+
+import com.grkj.data.local.dao.IsolationPointDao
+import com.grkj.data.local.dos.IsIsolationPoint
+import com.grkj.data.domain.vo.PointDetailVO
+import com.grkj.data.domain.vo.PointManageVo
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.IsolationPointRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+/**
+ * 隔离点仓储实现:直连 IsolationPointDao 的同步薄封装。
+ *
+ * 关键点:
+ * - 不包含任何业务分支或跨表逻辑,仅做数据访问与参数透传;
+ * - 同步方法,不切线程;请在调用侧(如 LiveData 的 IO dispatcher)确保不阻塞主线程;
+ * - 继承 BaseRepository,提供统一 logger,便于调试与问题排查。
+ */
+@Singleton
+class IsolationPointRepositoryImpl @Inject constructor(
+    private val isolationPointDao: IsolationPointDao
+) : BaseRepository(), IsolationPointRepository {
+
+    /** 新增隔离点 */
+    override fun addIsolationPoint(isolationPoint: IsIsolationPoint) {
+        logger.debug("addIsolationPoint: pointName={}", isolationPoint.pointName)
+        isolationPointDao.addIsolationPoint(isolationPoint)
+    }
+
+    /** 更新隔离点 */
+    override fun updateIsolationPoint(isolationPoint: IsIsolationPoint) {
+        logger.debug("updateIsolationPoint: pointId={}", isolationPoint.pointId)
+        isolationPointDao.updateIsolationPoint(isolationPoint)
+    }
+
+    /** 分页查询管理数据 */
+    override fun getPointManageData(
+        pointName: String?,
+        pointFunction: String?,
+        powerType: String?,
+        workstation: Long?,
+        rfidTag: String?,
+        size: Int,
+        offset: Int,
+        includeDescendants: Int
+    ): List<PointManageVo> {
+        logger.debug(
+            "getPointManageData: size={}, offset={}, workstation={}, includeDescendants={}",
+            size, offset, workstation, includeDescendants
+        )
+        return isolationPointDao.getPointManageData(
+            pointName, pointFunction, powerType, workstation, rfidTag, size, offset, includeDescendants
+        )
+    }
+
+    /** 批量删除 */
+    override fun deletePointByPointIds(pointIds: List<Long>) {
+        logger.debug("deletePointByPointIds: size={}", pointIds.size)
+        isolationPointDao.deletePointByPointIds(pointIds)
+    }
+
+    /** 按区域获取全部管理数据(可含子孙) */
+    override fun getAllPointManageDataWithWorkstationId(
+        workstationId: Long,
+        includeDescendants: Int
+    ): MutableList<PointManageVo> {
+        logger.debug(
+            "getAllPointManageDataWithWorkstationId: workstationId={}, includeDescendants={}",
+            workstationId, includeDescendants
+        )
+        return isolationPointDao.getAllPointManageDataWithWorkstationId(workstationId, includeDescendants)
+    }
+
+    /** 通过点位 NFC 获取隔离点 */
+    override fun getPointByPointNfc(pointNfc: String?): IsIsolationPoint? {
+        logger.debug("getPointByPointNfc: nfc={}", pointNfc)
+        return isolationPointDao.getPointByPointNfc(pointNfc)
+    }
+
+    /** 批量查询点位详情(含 point_nfc) */
+    override fun getPointDataListByPointIds(pointIds: List<Long>): List<PointDetailVO> {
+        logger.debug("getPointDataListByPointIds: size={}", pointIds.size)
+        return isolationPointDao.getPointDataListByPointIds(pointIds)
+    }
+
+    /** 通过 rfidId 查询隔离点 */
+    override fun getPointByRfidId(rfidId: Long): IsIsolationPoint? {
+        logger.debug("getPointByRfidId: rfidId={}", rfidId)
+        return isolationPointDao.getPointByRfidId(rfidId)
+    }
+
+    /** 根据一组点位 id 获取对应 rfidId 列表 */
+    override fun getRfidIdByPointIds(inUsePointIds: List<Long>): List<Long> {
+        logger.debug("getRfidIdByPointIds: size={}", inUsePointIds.size)
+        return isolationPointDao.getRfidIdByPointIds(inUsePointIds)
+    }
+
+    /** 主键查询隔离点 */
+    override fun getPointById(pointId: Long): IsIsolationPoint {
+        logger.debug("getPointById: pointId={}", pointId)
+        return isolationPointDao.getPointById(pointId)
+    }
+}

+ 43 - 1
data/src/main/java/com/grkj/data/repository/impl/standard/JobTicketRepositoryImpl.kt

@@ -4,15 +4,24 @@ import com.grkj.data.domain.vo.*
 import com.grkj.data.local.dao.JobTicketDao
 import com.grkj.data.local.dos.*
 import com.grkj.data.repository.JobTicketRepository
+import com.grkj.data.repository.SopRepository
+import com.grkj.data.repository.WorkflowRepository
+import com.grkj.data.repository.WorkstationRepository
+import com.sik.sikcore.data.BeanUtils
 import javax.inject.Inject
+import javax.inject.Singleton
 
 /**
  * 作业票仓储实现:
  * - 直接转发到 JobTicketDao
  * - 接口中精简重载的方法,缺省参数由 Dao 的默认值处理
  */
+@Singleton
 class JobTicketRepositoryImpl @Inject constructor(
-    private val jobTicketDao: JobTicketDao
+    private val jobTicketDao: JobTicketDao,
+    private val workstationRepository: WorkstationRepository,
+    private val workflowRepository: WorkflowRepository,
+    private val sopRepository: SopRepository
 ) : JobTicketRepository {
 
     /** 保存:saveIsJobTicket */
@@ -187,6 +196,39 @@ class JobTicketRepositoryImpl @Inject constructor(
     override fun updateJobTicketLockData(ticketId: Long, lockId: Long, lockStatus: String) =
         jobTicketDao.updateJobTicketLockData(ticketId, lockId, lockStatus)
 
+    override fun updateJobTicketLockData(isJobTicketLock: IsJobTicketLock) {
+        jobTicketDao.updateJobTicketLockData(isJobTicketLock)
+    }
+
+    override fun getAllJobData(): List<DataExportJobVo> {
+        val allJobData = jobTicketDao.getAllJob()
+        val allDataExportJobVo = BeanUtils.copyList(allJobData, DataExportJobVo::class.java)
+        val allWorkstation = workstationRepository.getWorkstationData()
+        val allWorkflowMode = workflowRepository.getWorkflowModes()
+        val allSop = sopRepository.getSopData()
+        allDataExportJobVo.forEach { ticket ->
+            ticket.workstationName =
+                allWorkstation.find { it.workstationId == ticket.workstationId }?.workstationName.toString()
+            ticket.modeName =
+                allWorkflowMode.find { it.modeId == ticket.modeId }?.modeName.toString()
+            ticket.sopName = allSop.find { it.sopId == ticket.sopId }?.sopName.toString()
+        }
+        return allDataExportJobVo
+    }
+
+    override fun getAllLockedPointsExportData(): List<DataExportLockedPointVo> {
+        val allLockedPointsData = jobTicketDao.getAllLockedPointsData()
+        val allLockedPointsExportData =
+            BeanUtils.copyList(allLockedPointsData, DataExportLockedPointVo::class.java)
+        val allWorkstation = workstationRepository.getWorkstationData()
+        allLockedPointsExportData.forEach { point ->
+            allWorkstation.find { it.workstationId == point.workstationId }?.let {
+                point.workstationName = it.workstationName
+            }
+        }
+        return allLockedPointsExportData
+    }
+
     /** 更新:updateJobTicketPointData(四参;Logic 用) */
     override fun updateJobTicketPointData(
         unLockedByKeyId: Long,

+ 90 - 0
data/src/main/java/com/grkj/data/repository/impl/standard/RoleRepositoryImpl.kt

@@ -0,0 +1,90 @@
+package com.grkj.data.repository.impl.standard
+
+import com.grkj.data.local.dao.RoleDao
+import com.grkj.data.local.dos.SysRole
+import com.grkj.data.local.dos.SysUserRole
+import com.grkj.data.domain.vo.RoleManageVo
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.RoleRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+/**
+ * 角色仓储实现:直连 RoleDao 的同步薄封装。
+ *
+ * 特性:
+ * - 不包含业务逻辑或状态推导,仅透传入参并返回持久层实体;
+ * - 同步方法,不做线程切换;请在调用侧确保运行于 IO 线程;
+ * - 继承 BaseRepository,提供统一 logger,便于调试排障。
+ */
+@Singleton
+class RoleRepositoryImpl @Inject constructor(
+    private val roleDao: RoleDao
+) : BaseRepository(), RoleRepository {
+
+    override fun getRoleData(): List<SysRole> {
+        logger.debug("getRoleData")
+        return roleDao.getRoleData()
+    }
+
+    override fun insertUserRole(sysUserRole: List<SysUserRole>) {
+        logger.debug("insertUserRole: size={}", sysUserRole.size)
+        roleDao.insertUserRole(sysUserRole)
+    }
+
+    override fun deleteUserRoleByUserIds(userIds: List<Long>) {
+        logger.debug("deleteUserRoleByUserIds: size={}", userIds.size)
+        roleDao.deleteUserRoleByUserIds(userIds)
+    }
+
+    override fun deleteRoleByRoleIds(roleIds: List<Long>) {
+        logger.debug("deleteRoleByRoleIds: size={}", roleIds.size)
+        roleDao.deleteRoleByRoleIds(roleIds)
+    }
+
+    override fun getRoleManageData(
+        roleName: String?,
+        permissionCharacters: String?,
+        status: String?,
+        size: Int,
+        offset: Int
+    ): List<RoleManageVo> {
+        logger.debug("getRoleManageData: size={}, offset={}", size, offset)
+        return roleDao.getRoleManageData(roleName, permissionCharacters, status, size, offset)
+    }
+
+    override fun insertRole(role: SysRole): Long {
+        logger.debug("insertRole: roleKey={}", role.roleKey)
+        return roleDao.insertRole(role)
+    }
+
+    override fun getRoleDataByUserId(userId: Long): List<SysRole> {
+        logger.debug("getRoleDataByUserId: userId={}", userId)
+        return roleDao.getRoleDataByUserId(userId)
+    }
+
+    override fun getRoleDataByRoleKey(roleKey: String): Long? {
+        logger.debug("getRoleDataByRoleKey: roleKey={}", roleKey)
+        return roleDao.getRoleDataByRoleKey(roleKey)
+    }
+
+    override fun getUserIdsByRoleIds(roleIds: List<Long>): List<Long> {
+        logger.debug("getUserIdsByRoleIds: size={}", roleIds.size)
+        return roleDao.getUserIdsByRoleIds(roleIds)
+    }
+
+    override fun getAllRole(): List<SysRole> {
+        logger.debug("getAllRole")
+        return roleDao.getAllRole()
+    }
+
+    override fun getAllUserRoles(): List<SysUserRole> {
+        logger.debug("getAllUserRoles")
+        return roleDao.getAllUserRoles()
+    }
+
+    override fun insertRoles(presetSysRole: List<SysRole>) {
+        logger.debug("insertRoles: size={}", presetSysRole.size)
+        roleDao.insertRoles(presetSysRole)
+    }
+}

+ 155 - 0
data/src/main/java/com/grkj/data/repository/impl/standard/SopRepositoryImpl.kt

@@ -0,0 +1,155 @@
+package com.grkj.data.repository.impl.standard
+
+import com.grkj.data.domain.vo.DataExportSopVo
+import com.grkj.data.local.dao.IsSopDao
+import com.grkj.data.local.dos.IsSop
+import com.grkj.data.local.dos.IsSopGroup
+import com.grkj.data.local.dos.IsSopPoints
+import com.grkj.data.local.dos.IsSopUser
+import com.grkj.data.local.dos.IsSopWorkflowStep
+import com.grkj.data.domain.vo.JobPointVo
+import com.grkj.data.domain.vo.JobUserVo
+import com.grkj.data.domain.vo.SopManageVo
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.SopRepository
+import com.grkj.data.repository.WorkflowRepository
+import com.grkj.data.repository.WorkstationRepository
+import com.sik.sikcore.data.BeanUtils
+import javax.inject.Inject
+import javax.inject.Singleton
+
+/**
+ * SOP 仓储实现:直连 IsSopDao 的同步薄封装。
+ *
+ * 特性:
+ * - 不包含任何业务分支/跨逻辑依赖;仅负责数据访问与参数透传;
+ * - 同步方法,不做线程切换;请在调用侧确保运行于 IO 线程;
+ * - 继承 BaseRepository,统一提供 logger 便于调试排障。
+ */
+@Singleton
+class SopRepositoryImpl @Inject constructor(
+    private val isSopDao: IsSopDao,
+    private val workstationRepository: WorkstationRepository,
+    private val workflowRepository: WorkflowRepository,
+) : BaseRepository(), SopRepository {
+
+    override fun saveSop(isSop: IsSop): Long {
+        logger.debug(
+            "saveSop: sopName={}, workstationId={}, modeId={}",
+            isSop.sopName,
+            isSop.workstationId,
+            isSop.modeId
+        )
+        return isSopDao.saveSop(isSop)
+    }
+
+    override fun saveSopPoints(isSopPoints: List<IsSopPoints>) {
+        logger.debug("saveSopPoints: size={}", isSopPoints.size)
+        isSopDao.saveSopPoints(isSopPoints)
+    }
+
+    override fun saveSopUsers(isSopUsers: List<IsSopUser>) {
+        logger.debug("saveSopUsers: size={}", isSopUsers.size)
+        isSopDao.saveSopUsers(isSopUsers)
+    }
+
+    override fun getSopDataByWorkstationId(
+        workstationId: Long,
+        includeDescendants: Int
+    ): List<SopManageVo> {
+        logger.debug(
+            "getSopDataByWorkstationId: workstationId={}, includeDescendants={}",
+            workstationId,
+            includeDescendants
+        )
+        return isSopDao.getSopDataByWorkstationId(workstationId, includeDescendants)
+    }
+
+    override fun getSopPointsBySopId(sopId: Long): List<JobPointVo> {
+        logger.debug("getSopPointsBySopId: sopId={}", sopId)
+        return isSopDao.getSopPointsBySopId(sopId)
+    }
+
+    override fun getSopUsersBySopId(sopId: Long): List<JobUserVo> {
+        logger.debug("getSopUsersBySopId: sopId={}", sopId)
+        return isSopDao.getSopUsersBySopId(sopId)
+    }
+
+    override fun deleteSopWorkflowStepBySopId(sopIds: List<Long>) {
+        isSopDao.deleteSopWorkflowStepBySopId(sopIds)
+    }
+
+    override fun getSopDataBySopId(sopId: Long): IsSop {
+        logger.debug("getSopDataBySopId: sopId={}", sopId)
+        return isSopDao.getSopDataBySopId(sopId)
+    }
+
+    override fun getDataExportSopData(): List<DataExportSopVo> {
+        val allSop = getSopData()
+        val allDataExportSopVo = BeanUtils.copyList(allSop, DataExportSopVo::class.java)
+        val allWorkstation = workstationRepository.getWorkstationData()
+        val allWorkflowMode = workflowRepository.getWorkflowModes()
+        allDataExportSopVo.forEach { ticket ->
+            ticket.workstationName =
+                allWorkstation.find { it.workstationId == ticket.workstationId }?.workstationName.toString()
+            ticket.modeName =
+                allWorkflowMode.find { it.modeId == ticket.modeId }?.modeName.toString()
+        }
+        return allDataExportSopVo
+    }
+
+    override fun getSopDataPage(size: Int, offset: Int): List<SopManageVo> {
+        logger.debug("getSopDataPage: size={}, offset={}", size, offset)
+        return isSopDao.getSopDataPage(size, offset)
+    }
+
+    override fun getSopManageDataBySopId(sopId: Long): SopManageVo {
+        logger.debug("getSopManageDataBySopId: sopId={}", sopId)
+        return isSopDao.getSopManageDataBySopId(sopId)
+    }
+
+    override fun saveSopGroup(group: IsSopGroup): Long {
+        logger.debug("saveSopGroup: sopId={}", group.sopId)
+        return isSopDao.saveSopGroup(group)
+    }
+
+    override fun deleteSopBySopId(sopIds: List<Long>) {
+        logger.debug("deleteSopBySopId: size={}", sopIds.size)
+        isSopDao.deleteSopBySopId(sopIds)
+    }
+
+    override fun deleteSopPointsBySopId(sopIds: List<Long>) {
+        logger.debug("deleteSopPointsBySopId: size={}", sopIds.size)
+        isSopDao.deleteSopPointsBySopId(sopIds)
+    }
+
+    override fun deleteSopUsersBySopId(sopIds: List<Long>) {
+        logger.debug("deleteSopUsersBySopId: size={}", sopIds.size)
+        isSopDao.deleteSopUsersBySopId(sopIds)
+    }
+
+    override fun deleteSopGroupBySopId(sopIds: List<Long>) {
+        logger.debug("deleteSopGroupBySopId: size={}", sopIds.size)
+        isSopDao.deleteSopGroupBySopId(sopIds)
+    }
+
+    override fun saveSopWorkflowStep(sopWorkflowStep: List<IsSopWorkflowStep>) {
+        logger.debug("saveSopWorkflowStep: size={}", sopWorkflowStep.size)
+        isSopDao.saveSopWorkflowStep(sopWorkflowStep)
+    }
+
+    override fun getSopWorkflowSteps(sopId: Long): List<IsSopWorkflowStep> {
+        logger.debug("getSopWorkflowSteps: sopId={}", sopId)
+        return isSopDao.getSopWorkflowSteps(sopId)
+    }
+
+    override fun updateStep(sopWorkflowStep: List<IsSopWorkflowStep>) {
+        logger.debug("updateStep: size={}", sopWorkflowStep.size)
+        isSopDao.updateStep(sopWorkflowStep)
+    }
+
+    override fun getSopData(): List<IsSop> {
+        logger.debug("getSopData")
+        return isSopDao.getSopData()
+    }
+}

+ 63 - 0
data/src/main/java/com/grkj/data/repository/impl/standard/SysMenuRepositoryImpl.kt

@@ -0,0 +1,63 @@
+package com.grkj.data.repository.impl.standard
+
+import com.grkj.data.local.dao.SysMenuDao
+import com.grkj.data.local.dos.SysMenu
+import com.grkj.data.local.dos.SysRoleMenu
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.SysMenuRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+/**
+ * 系统菜单仓储实现:直连 SysMenuDao 的同步薄封装。
+ *
+ * 特性:
+ * - 仅负责数据访问,入参与返回值均为持久层实体;
+ * - 同步方法,不做线程切换;请在调用处确保运行于 IO 线程;
+ * - 继承 BaseRepository,提供统一 logger。
+ */
+@Singleton
+class SysMenuRepositoryImpl @Inject constructor(
+    private val sysMenuDao: SysMenuDao
+) : BaseRepository(), SysMenuRepository {
+
+    override fun findByPerms(perms: String): SysMenu? {
+        logger.debug("findByPerms: perms={}", perms)
+        return sysMenuDao.findByPerms(perms)
+    }
+
+    override fun insert(menu: SysMenu): Long {
+        logger.debug("insert: perms={}", menu.perms)
+        return sysMenuDao.insert(menu)
+    }
+
+    override fun update(menu: SysMenu) {
+        logger.debug("update: menuId={}", menu.menuId)
+        sysMenuDao.update(menu)
+    }
+
+    override fun getAll(): List<SysMenu> {
+        logger.debug("getAll")
+        return sysMenuDao.getAll()
+    }
+
+    override fun insertRoleMenus(sysRoleMenus: MutableList<SysRoleMenu>) {
+        logger.debug("insertRoleMenus: size={}", sysRoleMenus.size)
+        sysMenuDao.insertRoleMenus(sysRoleMenus)
+    }
+
+    override fun getPermissionsByRoleIds(roleIds: List<Long>): MutableList<String?> {
+        logger.debug("getPermissionsByRoleIds: size={}", roleIds.size)
+        return sysMenuDao.getPermissionsByRoleIds(roleIds)
+    }
+
+    override fun deleteByRoleId(roleId: Long) {
+        logger.debug("deleteByRoleId: roleId={}", roleId)
+        sysMenuDao.deleteByRoleId(roleId)
+    }
+
+    override fun getSysMenusByRoleId(roleId: Long): List<SysMenu> {
+        logger.debug("getSysMenusByRoleId: roleId={}", roleId)
+        return sysMenuDao.getSysMenusByRoleId(roleId)
+    }
+}

+ 2 - 0
data/src/main/java/com/grkj/data/repository/impl/standard/UserRepositoryImpl.kt

@@ -6,10 +6,12 @@ import com.grkj.data.local.dos.SysUserDo
 import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.UserRepository
 import javax.inject.Inject
+import javax.inject.Singleton
 
 /**
  * 用户仓储层实现
  */
+@Singleton
 class UserRepositoryImpl @Inject constructor(
     val userDao: UserDao
 ) : BaseRepository(), UserRepository {

+ 125 - 0
data/src/main/java/com/grkj/data/repository/impl/standard/WorkflowRepositoryImpl.kt

@@ -0,0 +1,125 @@
+package com.grkj.data.repository.impl.standard
+
+import com.grkj.data.local.dao.WorkflowDao
+import com.grkj.data.local.dos.WorkflowMode
+import com.grkj.data.local.dos.WorkflowStep
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.WorkflowRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+/**
+ * 工作流仓储实现:直连 WorkflowDao 的同步薄封装。
+ *
+ * 关键点:
+ * - 不包含任何业务分支/状态推导,仅负责数据访问与参数透传;
+ * - 同步方法,不做线程切换;请在调用侧保障运行于 IO 线程;
+ * - 继承 BaseRepository,统一提供 logger 便于排障。
+ */
+@Singleton
+class WorkflowRepositoryImpl @Inject constructor(
+    private val workflowDao: WorkflowDao
+) : BaseRepository(), WorkflowRepository {
+
+    /** 新增单个步骤,返回自增主键 */
+    override fun insertStep(step: WorkflowStep): Long {
+        logger.debug("insertStep: modeId={}, stepIndex={}", step.modeId, step.stepIndex)
+        return workflowDao.insertStep(step)
+    }
+
+    /** 更新单个步骤 */
+    override fun updateStep(step: WorkflowStep) {
+        logger.debug("updateStep: stepId={}", step.stepId)
+        workflowDao.updateStep(step)
+    }
+
+    /** 删除单个步骤 */
+    override fun deleteStep(step: WorkflowStep) {
+        logger.debug("deleteStep: stepId={}", step.stepId)
+        workflowDao.deleteStep(step)
+    }
+
+    /** 获取指定模式下的全部步骤(升序) */
+    override fun getStepsByMode(modeId: Long): List<WorkflowStep> {
+        logger.debug("getStepsByMode: modeId={}", modeId)
+        return workflowDao.getStepsByMode(modeId)
+    }
+
+    /** 根据多个模式 id 获取步骤列表 */
+    override fun getStepsByModes(modeIds: List<Long>): List<WorkflowStep> {
+        logger.debug("getStepsByModes: size={}", modeIds.size)
+        return workflowDao.getStepsByModes(modeIds)
+    }
+
+    /** 获取下一个可用步骤序号(MAX(step_index)+1) */
+    override fun getNextStepIndex(modeId: Long): Int {
+        logger.debug("getNextStepIndex: modeId={}", modeId)
+        return workflowDao.getNextStepIndex(modeId)
+    }
+
+    /** 按步骤 id 查询步骤 */
+    override fun getStepById(id: Long): WorkflowStep? {
+        logger.debug("getStepById: id={}", id)
+        return workflowDao.getStepById(id)
+    }
+
+    /** 判定“解锁”是否在“上锁”之前(同一模式) */
+    override fun isUnlockBeforeLock(modeId: Long): Boolean {
+        logger.debug("isUnlockBeforeLock: modeId={}", modeId)
+        return workflowDao.isUnlockBeforeLock(modeId)
+    }
+
+    /** 获取开启的流程模式(deleted=0 且 status=1) */
+    override fun getWorkflowModes(): List<WorkflowMode> {
+        logger.debug("getWorkflowModes")
+        return workflowDao.getWorkflowModes()
+    }
+
+    /** 获取所有未删除的流程模式(deleted=0) */
+    override fun getAllWorkflowModes(): List<WorkflowMode> {
+        logger.debug("getAllWorkflowModes")
+        return workflowDao.getAllWorkflowModes()
+    }
+
+    /** 按模式 id 查询流程模式 */
+    override fun getWorkflowModeByModeId(modeId: Long): WorkflowMode? {
+        logger.debug("getWorkflowModeByModeId: modeId={}", modeId)
+        return workflowDao.getWorkflowModeByModeId(modeId)
+    }
+
+    /** 更新流程模式 */
+    override fun updateWorkflowMode(workflowMode: WorkflowMode) {
+        logger.debug("updateWorkflowMode: modeId={}", workflowMode.modeId)
+        workflowDao.updateWorkflowMode(workflowMode)
+    }
+
+    /** 逻辑删除/恢复流程模式 */
+    override fun updateWorkflowModeDeleted(workflowModeId: List<Long>, deleted: Boolean) {
+        logger.debug("updateWorkflowModeDeleted: size={}, deleted={}", workflowModeId.size, deleted)
+        workflowDao.updateWorkflowModeDeleted(workflowModeId, deleted)
+    }
+
+    /** 新增流程模式,返回主键 */
+    override fun insertWorkflowMode(workflowMode: WorkflowMode): Long {
+        logger.debug("insertWorkflowMode: modeName={}", workflowMode.modeName)
+        return workflowDao.insertWorkflowMode(workflowMode)
+    }
+
+    /** 批量新增步骤 */
+    override fun insertSteps(step: List<WorkflowStep>) {
+        logger.debug("insertSteps: size={}", step.size)
+        workflowDao.insertSteps(step)
+    }
+
+    /** 批量新增预设步骤 */
+    override fun insertPresetSteps(presetWorkflowStep: List<WorkflowStep>) {
+        logger.debug("insertPresetSteps: size={}", presetWorkflowStep.size)
+        workflowDao.insertPresetSteps(presetWorkflowStep)
+    }
+
+    /** 批量新增预设流程模式 */
+    override fun insertWorkflowModes(presetWorkflowMode: List<WorkflowMode>) {
+        logger.debug("insertWorkflowModes: size={}", presetWorkflowMode.size)
+        workflowDao.insertWorkflowModes(presetWorkflowMode)
+    }
+}

+ 114 - 0
data/src/main/java/com/grkj/data/repository/impl/standard/WorkstationRepositoryImpl.kt

@@ -0,0 +1,114 @@
+package com.grkj.data.repository.impl.standard
+
+import com.grkj.data.domain.vo.WorkstationManageVo
+import com.grkj.data.local.dao.WorkstationDao
+import com.grkj.data.local.dos.IsUserWorkstation
+import com.grkj.data.local.dos.IsWorkstation
+import com.grkj.data.repository.BaseRepository
+import com.grkj.data.repository.WorkstationRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+/**
+ * 岗位仓储实现:直连 WorkstationDao 的同步薄封装。
+ *
+ * 特性与约定:
+ * - 不包含任何业务分支与树形组装,纯数据访问;业务放在 Logic(例如 buildTree)。
+ * - 方法为同步调用,不做线程切换;请在调用侧保障运行于 IO 线程。
+ * - 继承 BaseRepository,统一提供 logger 便于定位问题。
+ */
+@Singleton
+class WorkstationRepositoryImpl @Inject constructor(
+    private val workstationDao: WorkstationDao
+) : BaseRepository(), WorkstationRepository {
+
+    /** 获取岗位数据(del_flag=0) */
+    override fun getWorkstationData(): List<WorkstationManageVo> {
+        logger.debug("getWorkstationData")
+        return buildTree(workstationDao.getWorkstationData())
+    }
+
+    /** 批量新增用户-岗位关联 */
+    override fun insertUserWorkstation(workstation: List<IsUserWorkstation>) {
+        logger.debug("insertUserWorkstation: size={}", workstation.size)
+        workstationDao.insertUserWorkstation(workstation)
+    }
+
+    /** 根据用户 id 批量删除用户-岗位关联 */
+    override fun deleteUserWorkstationByUserIds(userIds: List<Long>) {
+        logger.debug("deleteUserWorkstationByUserIds: size={}", userIds.size)
+        workstationDao.deleteUserWorkstationByUserIds(userIds)
+    }
+
+    /** 新增岗位,返回自增主键 */
+    override fun insertWorkstation(workstation: IsWorkstation): Long {
+        logger.debug("insertWorkstation: name={}", workstation.workstationName)
+        return workstationDao.insertWorkstation(workstation)
+    }
+
+    override fun getAllWorkstation(): List<IsWorkstation> {
+        logger.debug("getAllWorkstation")
+        return workstationDao.getAllWorkstation()
+    }
+
+    /** 根据岗位 id 删除岗位 */
+    override fun deleteWorkstationByWorkstationId(workstationId: Long) {
+        logger.debug("deleteWorkstationByWorkstationId: id={}", workstationId)
+        workstationDao.deleteWorkstationByWorkstationId(workstationId)
+    }
+
+    /**
+     * 根据岗位 id 更新排序号
+     * 默认将 updateTime 置为当前时间字符串,保持与 DAO 默认逻辑一致。
+     */
+    override fun updateWorkstationOrderNumById(workstationId: Long, orderNum: Int?, updateTime: String) {
+        logger.debug("updateWorkstationOrderNumById: id={}, orderNum={}, updateTime={}", workstationId, orderNum, updateTime)
+        workstationDao.updateWorkstationOrderNumById(workstationId, orderNum, updateTime)
+    }
+
+    /** 根据父 id 与岗位名称查询单条岗位 */
+    override fun getWorkstationDataByParentIdAndWorkstationName(
+        parentId: Long,
+        workstationName: String
+    ): IsWorkstation? {
+        logger.debug("getWorkstationDataByParentIdAndWorkstationName: parentId={}, name={}", parentId, workstationName)
+        return workstationDao.getWorkstationDataByParentIdAndWorkstationName(parentId, workstationName)
+    }
+
+    /** 根据岗位 id 更新岗位名称 */
+    override fun updateWorkstationNameByWorkstationId(workstationId: Long, workstationName: String) {
+        logger.debug("updateWorkstationNameByWorkstationId: id={}, name={}", workstationId, workstationName)
+        workstationDao.updateWorkstationNameByWorkstationId(workstationId, workstationName)
+    }
+    private fun buildTree(all: List<IsWorkstation>): List<WorkstationManageVo> {
+        // 1) 映射到 VO 并按 id 建立索引
+        val map = all.map { db ->
+            WorkstationManageVo().apply {
+                workstationId = db.workstationId
+                workstationName = db.workstationName
+                parentId = db.parentId
+                ancestors = db.ancestors
+                orderNum = db.orderNum
+            }
+        }.associateBy { it.workstationId }.toMutableMap()
+
+        // 2) 把每个节点挂到它的 parent.children
+        val roots = mutableListOf<WorkstationManageVo>()
+        map.values.forEach { node ->
+            if (node.parentId == null || node.parentId == 0L) {
+                roots += node
+            } else {
+                node.parentWorkstationName = map[node.parentId]?.workstationName ?: ""
+                map[node.parentId]?.children?.add(node)
+            }
+        }
+
+        // 3) (可选)给每个同级按照 orderNum 排个序
+        fun sortRec(nodes: MutableList<WorkstationManageVo>) {
+            nodes.sortBy { it.orderNum ?: 0 }
+            nodes.forEach { sortRec(it.children) }
+        }
+        sortRec(roots)
+        return roots
+    }
+}