ApiRepository.kt 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. package http.client
  2. import com.blankj.utilcode.util.LogUtils
  3. import http.client.factory.RetrofitFactory
  4. import http.exception.NetException
  5. import http.vo.request.*
  6. import http.vo.response.*
  7. import io.reactivex.rxjava3.core.Observable
  8. import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
  9. import io.reactivex.rxjava3.schedulers.Schedulers
  10. import xn.xxp.room.bean.LabConfig
  11. import xn.xxp.room.bean.NoticeSummary
  12. import java.io.File
  13. import java.lang.StringBuilder
  14. object ApiRepository {
  15. private val mLibClient by lazy {
  16. RetrofitFactory().createLabClient()
  17. }
  18. /**
  19. * 登录获取token
  20. */
  21. // fun authOneLogin(param: AccessTokenReq): Observable<Boolean> {
  22. // return mLibClient.authOneLogin(param).schedulers()
  23. // }
  24. /**
  25. * 查询APK版本
  26. *
  27. * @param param 设备版本信息
  28. */
  29. fun apkVersion(param: ApkInfoReq): Observable<ApkInfoResp> {
  30. return mLibClient.apkVersion(param).schedulers()
  31. }
  32. /**
  33. * 实验室信息
  34. *
  35. * @param id 设备唯一编码
  36. */
  37. fun laboratoryInfo(id: String): Observable<LaboratoryVo> {
  38. return mLibClient.laboratoryInfo(id).schedulers()
  39. }
  40. /**
  41. * 危险源信息
  42. *
  43. * @param param 实验室Id、分页信息
  44. */
  45. fun hazardlist(param: HazardReq): Observable<List<LabHazardVo>> {
  46. return mLibClient.hazardlist(param).schedulers()
  47. }
  48. /**
  49. * 签到验证(进入)
  50. *
  51. * @param eBoard 是否为电子信息牌
  52. * @param subId 实验室id
  53. * @param username 学生卡编号/人员id
  54. */
  55. fun signInCheck(eBoard: Boolean, subId: String, username: String): Observable<SignInCheckResp> {
  56. return mLibClient.signInCheck(eBoard, subId, username).schedulers()
  57. }
  58. /**
  59. * 签到提交-人脸验证
  60. */
  61. fun signInFace(code: String, faceFeature: SignInReq? = null): Observable<String> {
  62. return mLibClient.signInFace(code, faceFeature).schedulers()
  63. }
  64. /**
  65. * 签到-安全准入检测三合一
  66. *
  67. * @param patrolSign 是否为巡查签到
  68. */
  69. fun checkInAll(patrolSign: Boolean, param: CheckInAllReq): Observable<Boolean> {
  70. return mLibClient.checkInAll(patrolSign, param).schedulers()
  71. }
  72. /**
  73. * 签到提交
  74. */
  75. fun signIn(id: String): Observable<Boolean> {
  76. return mLibClient.signIn(id).schedulers()
  77. }
  78. /**
  79. * 签到提交-有跳过安全准入检测时使用
  80. */
  81. fun signInJump(id: String, code: String): Observable<Boolean> {
  82. return mLibClient.signInJump(id, code).schedulers()
  83. }
  84. /**
  85. * 签到提交
  86. * @param jumpSafetyCheck 是否跳过安全检查
  87. * @param code 查询人员状态返回的code
  88. * @param id 人脸比对成功后返回的id
  89. */
  90. fun signIn(jumpSafetyCheck: Boolean, code: String, id: String): Observable<Boolean> {
  91. return if (jumpSafetyCheck) {
  92. signInJump(id, code)
  93. } else {
  94. signIn(id)
  95. }
  96. }
  97. /**
  98. * 签到验证(离开)
  99. *
  100. * @param eBoard 是否为电子信息牌
  101. * @param subId 实验室id
  102. * @param username 学生卡编号/人员id
  103. */
  104. fun signOutCheck(
  105. eBoard: Boolean,
  106. subId: String,
  107. username: String
  108. ): Observable<SignInCheckResp> {
  109. return mLibClient.signOutCheck(eBoard, subId, username).schedulers()
  110. }
  111. /**
  112. * 离开提交
  113. */
  114. fun signOut(code: String): Observable<Boolean> {
  115. return mLibClient.signOut(code).schedulers()
  116. }
  117. /**
  118. * 获取实验室一体机可控制设备
  119. *
  120. * @param subId 实验室id
  121. */
  122. fun controllerList(subId: String): Observable<List<LotDeviceVo>> {
  123. return mLibClient.controllerList(subId).schedulers()
  124. }
  125. /**
  126. * 控制设备
  127. *
  128. * @param param 设备编号、命令
  129. */
  130. fun sendControllerCMD(param: ControllerCMD): Observable<Boolean> {
  131. return mLibClient.sendControllerCMD(param).schedulers()
  132. }
  133. /**
  134. * 实验室测点功能列表(首页-左侧看板)
  135. *
  136. * @param subId 实验室id
  137. */
  138. fun functionList(subId: String): Observable<List<LabBulletinBoardVo>> {
  139. return mLibClient.functionList(subId).schedulers()
  140. }
  141. /**
  142. * 实验室预警测点
  143. *
  144. * @param subId 实验室id
  145. */
  146. fun warnList(subId: String): Observable<List<LabWarnVo>> {
  147. return mLibClient.warnList(subId).schedulers()
  148. }
  149. /**
  150. * 人脸比对
  151. */
  152. fun faceCompare(param: FaceCompareReq): Observable<Boolean> {
  153. return mLibClient.faceCompare(param).schedulers()
  154. }
  155. /**
  156. * 心跳
  157. *
  158. * @param num 设备唯一编码
  159. */
  160. fun heartbeat(num: String): Observable<Boolean> {
  161. return mLibClient.heartbeat(num).schedulers()
  162. }
  163. /**
  164. * 查询实验室安全制度列表
  165. *
  166. * @param type 1:学校制度 2:学院制度 3: 中心制度
  167. */
  168. fun safeBookList(type: String): Observable<List<SafeBook>> {
  169. return mLibClient.safeBookList(type).schedulers()
  170. }
  171. /**
  172. * 获取实验室安全制度详细信息
  173. */
  174. fun safeBookDetail(id: String): Observable<SafeBook> {
  175. return mLibClient.safeBookDetail(id).schedulers()
  176. }
  177. /**
  178. * 一体机查询危化品
  179. */
  180. fun hazardBookList(): Observable<List<HazardBook>> {
  181. return mLibClient.hazardBookList().schedulers()
  182. }
  183. /**
  184. * 一体机查询危化品
  185. */
  186. fun hazardBookList(id: String): Observable<List<HazardBook>> {
  187. return mLibClient.hazardBookList(id).schedulers()
  188. }
  189. /**
  190. * 获取危化品安全技术说明书详细信息
  191. */
  192. fun hazardBookDetail(id: String): Observable<HazardBook> {
  193. return mLibClient.hazardBookDetail(id).schedulers()
  194. }
  195. /**
  196. * 实验室文化图
  197. */
  198. fun bannerImages(param: BannerImageReq): Observable<List<BannerImageBean>> {
  199. return mLibClient.bannerImages(param).schedulers()
  200. }
  201. /**
  202. * 文字转语音
  203. */
  204. fun textParseVideo(text: String): Observable<SpeakInfo> {
  205. return mLibClient.textParseVideo(text).schedulers()
  206. }
  207. /**
  208. * 物联控制权限验证
  209. */
  210. fun lotInCheck(subId: String, username: String): Observable<String> {
  211. return mLibClient.lotInCheck(subId, username).schedulers()
  212. }
  213. /**
  214. * 查询实验室配置
  215. */
  216. fun queryLabConfig(deviceNum: String): Observable<LabConfig> {
  217. return mLibClient.queryLabConfig(deviceNum).schedulers()
  218. }
  219. fun laboratoryInfo(openEBoard: Boolean, id: String): Observable<LaboratoryVo> {
  220. return if (openEBoard) laboratoryInfoEBoard(id) else laboratoryInfo(id)
  221. }
  222. fun laboratoryInfoEBoard(labId: String): Observable<LaboratoryVo> {
  223. val observable1 = mLibClient.homeTopInfo(labId)
  224. val observable2 = mLibClient.homeMiddleInfo(labId)
  225. return Observable.zip(observable1, observable2, { top, middle ->
  226. LaboratoryVo().apply {
  227. subId = labId
  228. rectangleLogo = top.circularLogo
  229. subName = top.subjectName
  230. dangerColor = middle.filedColor
  231. dangerName = middle.typeName
  232. dangerLevel = middle.levelName
  233. address = middle.subjectName
  234. deptName = middle.deptName
  235. qrCodeUrl = middle.qrCodeUrl
  236. adminName = middle.adminName
  237. adminPhone = middle.adminPhone
  238. adminUserDesc = "${middle.adminName ?: ""} | ${middle.adminPhone ?: ""}"
  239. safeUserDesc = middle.safeUserVoList?.fold("") { acc, safeUserVo ->
  240. "$acc ${safeUserVo.safeUserName ?: ""} | ${safeUserVo.safeUserPhone ?: ""}"
  241. }
  242. buildName = middle.buildName
  243. room = middle.room
  244. safetyLiaisonName = middle.safetyLiaisonName
  245. safetyLiaisonPhone = middle.safetyLiaisonPhone
  246. // 责任单位、实验室负责人
  247. val safePersons = mutableListOf(
  248. LaboratoryVo.SafePersonInfo("责任单位:", middle.deptName),
  249. LaboratoryVo.SafePersonInfo(
  250. "实验室负责人:",
  251. middle.adminName,
  252. middle.adminPhone
  253. ),
  254. )
  255. // 安全责任人
  256. safePersonList = middle.safeUserVoList?.mapTo(safePersons) { item ->
  257. LaboratoryVo.SafePersonInfo(
  258. "安全责任人:",
  259. item.safeUserName,
  260. item.safeUserPhone
  261. )
  262. } ?: safePersons
  263. val specialList = middle.brandInfoSubjectVos?.filter { it.isSpecial == "1" }
  264. specialClassify = specialList?.flatMap { it.classifyList }?.let { list ->
  265. mutableListOf<String>().apply {
  266. for (i in list.indices step 3) {
  267. val builder = StringBuilder()
  268. builder.append(list[i])
  269. if (i + 1 < list.size) builder.append(" ").append(list[i + 1])
  270. if (i + 2 < list.size) builder.append(" ").append(list[i + 2])
  271. add(builder.toString())
  272. }
  273. }
  274. }
  275. specialClassify2 = specialList?.map { it.classifyList }
  276. safeClassifyList = middle.brandInfoSubjectVos?.filter { it.isSpecial != "1" }
  277. inCheck = middle.inCheck
  278. inspectInCheck = middle.inspectInCheck
  279. outCheck = middle.outCheck
  280. }
  281. }).schedulers()
  282. }
  283. /**
  284. * 查询首页右侧人员信息
  285. */
  286. fun homeRightInfo(labId: String): Observable<HomeRightResp> {
  287. return mLibClient.homeRightInfo(labId).schedulers()
  288. }
  289. /**
  290. * 实验室介绍
  291. */
  292. fun labIntro(labId: String): Observable<String> {
  293. return mLibClient.labIntro(labId).schedulers()
  294. }
  295. /**
  296. * 查询值班人员列表
  297. */
  298. fun dutyUserList(labId: String, startTime: String): Observable<DutyPersonVo> {
  299. return mLibClient.dutyUserList(labId, startTime).schedulers()
  300. }
  301. /**
  302. * 查询实验人员列表
  303. */
  304. fun signUserList(labId: String): Observable<List<LabPersonVo>> {
  305. return mLibClient.signUserList(labId).schedulers()
  306. }
  307. /**
  308. * 查询准入人员列表
  309. */
  310. fun securityUserList(
  311. labId: String,
  312. pageNumber: Int,
  313. pageSize: Int
  314. ): Observable<List<LabPersonVo>> {
  315. return mLibClient.securityUserList(labId, pageNumber, pageSize).schedulers()
  316. }
  317. /**
  318. * 查询巡查人员列表
  319. */
  320. fun inspectUserList(labId: String, startTime: String): Observable<DutyPersonVo> {
  321. return mLibClient.inspectUserList(labId, startTime).schedulers()
  322. }
  323. /**
  324. * 查询值班人员/巡查人员
  325. * @param type 1-值班人员 2-巡查人员
  326. */
  327. fun queryDutyPerson(type: Int, labId: String, startTime: String): Observable<DutyPersonVo> {
  328. return if (1 == type) dutyUserList(labId, startTime) else inspectUserList(labId, startTime)
  329. }
  330. /**
  331. * 查询实验人员/准入人员
  332. * @param type 1-实验人员 2-准入人员
  333. */
  334. fun queryAccessPerson(
  335. type: Int,
  336. labId: String,
  337. pageNumber: Int,
  338. pageSize: Int
  339. ): Observable<List<LabPersonVo>> {
  340. return if (1 == type) signUserList(labId) else securityUserList(labId, pageNumber, pageSize)
  341. }
  342. /**
  343. * 视频监控
  344. */
  345. fun cameraBySubjectId(
  346. labId: String,
  347. userId: String,
  348. username: String,
  349. source: Int
  350. ): Observable<List<MonitorVo>> {
  351. return mLibClient.cameraBySubjectId(labId, userId, username, source).schedulers()
  352. }
  353. /**
  354. * 获取准入人员的指纹信息列表
  355. */
  356. fun getFingerList(labId: String): Observable<List<UserFingerVo>> {
  357. return mLibClient.getFingerList(labId).schedulers()
  358. }
  359. /**
  360. * 根据用户查询指纹列表
  361. */
  362. fun getFingerByUserId(labId: String, userId: String): Observable<List<UserFingerVo>> {
  363. return mLibClient.getFingerByUserId(labId, userId).schedulers()
  364. }
  365. /**
  366. * 指纹录入
  367. */
  368. fun addUserFinger(param: UserFingerVo): Observable<Boolean> {
  369. return mLibClient.addUserFinger(param).schedulers()
  370. }
  371. /**
  372. * 删除指纹
  373. */
  374. fun deleteFingerById(id: String): Observable<Boolean> {
  375. return mLibClient.deleteFingerById(id).schedulers()
  376. }
  377. /**
  378. * 获取人像特征值
  379. */
  380. fun faceFeature(file: File): Observable<String> {
  381. return mLibClient.faceFeature(file).schedulers()
  382. }
  383. /**
  384. * 人脸识别
  385. */
  386. fun authFace(file: File, labId: String): Observable<UserVo> {
  387. return mLibClient.faceFeature(file)
  388. .flatMap {
  389. val faceAuthReq =
  390. AuthFaceReq(it, labId)
  391. mLibClient.multiFaceDetection(faceAuthReq)
  392. }.schedulers()
  393. }
  394. /**
  395. * 刷卡验证
  396. */
  397. fun authCard(labId: String, cardNum: String): Observable<UserVo> {
  398. return mLibClient.cardValidate(labId, cardNum).schedulers()
  399. }
  400. /**
  401. * 密码验证
  402. */
  403. fun authPassword(param: AuthPwdReq): Observable<UserVo> {
  404. return mLibClient.pwdValidate(param).schedulers()
  405. }
  406. /**
  407. * 签到人像比对
  408. */
  409. fun signFaceMatching(file: File, code: String): Observable<String> {
  410. return mLibClient.faceFeature(file)
  411. .flatMap { feature ->
  412. val param = SignInReq()
  413. param.data = feature.toByteArray()
  414. mLibClient.signInFace(code, param)
  415. }.schedulers()
  416. }
  417. /**
  418. * 离开人像比对
  419. */
  420. fun leaveFaceMatching(file: File, userId: String): Observable<Boolean> {
  421. return mLibClient.faceFeature(file)
  422. .flatMap { feature ->
  423. val param = FaceCompareReq()
  424. param.data = feature.toByteArray()
  425. param.userId = userId
  426. mLibClient.faceCompare(param)
  427. }.schedulers()
  428. }
  429. /**
  430. * 校园卡是否能开启门禁
  431. */
  432. fun getCardIsOpen(labId: String, cardNum: String): Observable<UserVo> {
  433. return mLibClient.getCardIsOpen(labId, cardNum).schedulers()
  434. }
  435. /**
  436. * 巡查签到
  437. */
  438. fun signInWithPatrol(param: PatrolSignInReq): Observable<Boolean> {
  439. return mLibClient.signInWithPatrol(param).schedulers()
  440. }
  441. /**
  442. * 巡查签退
  443. */
  444. fun signOutWithPatrol(param: PatrolSignOutReq): Observable<Boolean> {
  445. return mLibClient.signOutWithPatrol(param.labId, param.userId).schedulers()
  446. }
  447. /**
  448. * 巡查签退/准入签退判断
  449. * true-巡查 false-准入
  450. */
  451. fun isSignInType(labId: String, userId: String): Observable<Boolean> {
  452. return mLibClient.isSignInType(labId, userId).schedulers()
  453. }
  454. /**
  455. * 准入签到:跳过人脸,传空数据即可
  456. *
  457. * @param code 查询人员状态返回的code
  458. *
  459. */
  460. fun jumpFaceSignIn(code: String): Observable<Boolean> {
  461. return mLibClient.signInFace(code, SignInReq())
  462. .flatMap { id ->
  463. mLibClient.signInJump(id, code)
  464. }.schedulers()
  465. }
  466. /**
  467. * 信息牌准入签到,前置检测
  468. */
  469. fun accessSignCheck(param: CommonSignInReq): Observable<SignFaceVo> {
  470. return mLibClient.signInCheck(true, param.labId, param.userId)
  471. .flatMap { response ->
  472. if (!response.state) {
  473. val message =
  474. if (response.message.isNullOrEmpty()) "核验失败,请联系管理员!" else response.message[0]
  475. throw NetException("500", message)
  476. }
  477. mLibClient.signInFace(response.code, SignInReq())
  478. .map { SignFaceVo(it, response.code) }
  479. }.schedulers()
  480. }
  481. /**
  482. * 巡查签到、准入签到(无AI检查) 通用接口
  483. *
  484. * 一、巡查签到
  485. * #signInCheckWithPatrol labId userId
  486. * #signInWithPatrol num userId
  487. *
  488. * 二、准入签到(无AI检查)
  489. * #signInCheck(true, labId, userId)
  490. * #jumpFaceSignIn(code)
  491. *
  492. * @param signType 1-准入签到 2-巡查签到 3-大仪签到
  493. */
  494. fun commonSignIn(signType: Int, param: CommonSignInReq): Observable<Boolean> {
  495. return if (2 == signType) {
  496. mLibClient.signInCheckWithPatrol(param.labId, param.userId)
  497. .flatMap {
  498. val reqParam = PatrolSignInReq().apply {
  499. num = param.num
  500. userId = param.userId
  501. subjectId = param.labId
  502. }
  503. mLibClient.signInWithPatrol(reqParam)
  504. }.schedulers()
  505. } else {
  506. mLibClient.signInCheck(true, param.labId, param.userId)
  507. .flatMap { response ->
  508. if (!response.state) {
  509. val message =
  510. if (response.message.isNullOrEmpty()) "核验失败,请联系管理员!" else response.message[0]
  511. throw NetException("500", message)
  512. }
  513. mLibClient.signInFace(response.code, SignInReq())
  514. .map { SignFaceVo(it, response.code) }
  515. }.flatMap { face ->
  516. mLibClient.signInJump(face.id, face.code)
  517. }.schedulers()
  518. }
  519. }
  520. /**
  521. * 巡查签退、准入签退(无离开检查项) 通用接口
  522. *
  523. * 一、巡查签退
  524. * #signOutWithPatrol labId userId
  525. *
  526. * 二、准入签退(无离开检查项)
  527. * #signOutCheck(true, labId, userId)
  528. * #signOut(code)
  529. *
  530. * @param signType 1-准入签到 2-巡查签到
  531. */
  532. fun commonLeave(signType: Int, labId: String, userId: String): Observable<Boolean> {
  533. return if (2 == signType) {
  534. mLibClient.signOutWithPatrol(labId, userId).schedulers()
  535. } else {
  536. mLibClient.signOutCheck(true, labId, userId)
  537. .flatMap { response ->
  538. if (!response.state) {
  539. val message =
  540. if (response.message.isNullOrEmpty()) "核验失败,请联系管理员!" else response.message[0]
  541. throw NetException("500", message)
  542. }
  543. mLibClient.signOut(response.code)
  544. }.schedulers()
  545. }
  546. }
  547. /**
  548. * 巡查签到,前置检测
  549. */
  550. fun patrolSignCheck(param: CommonSignInReq): Observable<Boolean> {
  551. return mLibClient.signInCheckWithPatrol(param.labId, param.userId).schedulers()
  552. }
  553. /**
  554. * 滚动消息列表
  555. */
  556. fun newMsgGroup(param: NoticeReq): Observable<List<NoticeSummary>> {
  557. return mLibClient.newMsgGroup(param).schedulers()
  558. }
  559. }
  560. fun <T : Any> Observable<T>.schedulers(): Observable<T> {
  561. return this.subscribeOn(Schedulers.io())
  562. .observeOn(AndroidSchedulers.mainThread())
  563. }