json_rpc_ex_interceptor.dart 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. import 'package:fis_jsonrpc/rpc.dart';
  2. import 'package:flutter_easyloading/flutter_easyloading.dart';
  3. import 'package:get/get.dart';
  4. import 'package:vitalapp/architecture/app_parameters.dart';
  5. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  6. import 'package:vitalapp/components/dialog_confirm.dart';
  7. import 'package:vitalapp/managers/interfaces/account.dart';
  8. import 'package:vitalapp/store/store.dart';
  9. import 'package:fis_common/logger/logger.dart';
  10. class JsonRpcExInterceptor extends JsonRpcInterceptor {
  11. static final _reloginNeededCodes = [1, 2, 3, 9013];
  12. static bool _isDisplayingAlertRelogin = false;
  13. String get serverGateway => AppParameters.data.serverGateway;
  14. ///是否本地工作站(若为True,则需等待Server启动后再结束Splash Page)
  15. bool get isLocalStation => AppParameters.data.isLocalStation;
  16. @override
  17. Future<JsonRpcNetworkException> onHttpRequestError(
  18. JsonRpcNetworkException error) async {
  19. logger.e("JsonRpcExInterceptor-HttpRequestError", error);
  20. if (!isLocalStation && error.data != "EchoAsync") {
  21. PromptBox.toast("网络请求错误");
  22. }
  23. return super.onHttpRequestError(error);
  24. }
  25. @override
  26. Future<JsonRpcServerError> onResponseError(JsonRpcServerError error) async {
  27. if (error.code == null) {
  28. return error;
  29. }
  30. final code = error.code!;
  31. try {
  32. EasyLoading.dismiss(animation: false);
  33. //已在其他设备登录
  34. if (_reloginNeededCodes.contains(code)) {
  35. if (_isDisplayingAlertRelogin) {
  36. return error;
  37. }
  38. if (Store.user.isLogOn && !_isDisplayingAlertRelogin) {
  39. _isDisplayingAlertRelogin = true;
  40. await _alertRelogin(code);
  41. _isDisplayingAlertRelogin = false;
  42. }
  43. return error;
  44. }
  45. if (error.code != null && error.code != 1 && error.code != 2) {
  46. String? text;
  47. if (code == -1) {
  48. text = errorCodes['errorCodeUN'];
  49. } else {
  50. text = errorCodes['errorCode${error.code}'];
  51. }
  52. logger.e(text ?? '');
  53. PromptBox.toast(text ?? "Unknown RPC Exception");
  54. }
  55. } catch (e) {
  56. // PromptBox.toast("${i18nBook.errorCodes.errorCodeUN.t}[$errorCode]");
  57. logger.e('JsonRpcExInterceptor onResponseError', e);
  58. }
  59. return error;
  60. }
  61. Future<void> _alertRelogin(int code) async {
  62. // 先自动登出账号,防止未点确认就中止进程
  63. final result = await Get.find<IAccountManager>().logout();
  64. logger.i('JsonRpcExInterceptor logout:$result');
  65. PromptBox.dismiss(); // 清除toast提示
  66. final message = errorCodes["errorCode$code"]!;
  67. await DialogConfirm.show(
  68. message: message,
  69. disableCancel: true,
  70. );
  71. Get.offAllNamed("/login");
  72. }
  73. /// 翻译错误码
  74. static String translateErrorCode(int code) {
  75. if (code < 0) {
  76. return customErrorCodes["errorCode$code"] ?? "未知错误";
  77. }
  78. final message = errorCodes["errorCode$code"] ?? "未知错误";
  79. return message;
  80. }
  81. static final customErrorCodes = {
  82. "errorCode-1": "未知错误",
  83. "errorCode-1001": "网络异常",
  84. "errorCode-1002": "请求超时",
  85. };
  86. static final errorCodes = {
  87. "errorCodeUN": "未知错误",
  88. "errorCode0": "操作成功",
  89. "errorCode1": "登录已过期,请重新登录",
  90. "errorCode2": "登录信息已过期,请重新登录",
  91. "errorCode3": "登录信息过旧,请重新登录",
  92. "errorCode4": "用户IP在黑名单,禁止访问",
  93. "errorCode5": "您尚无权限操作,请联系医院负责人",
  94. "errorCode6": "上传检查图像失败,文件地址为空",
  95. "errorCode7": "上传文件失败,文件名为空",
  96. "errorCode8": "查询错误,查询信息不完善",
  97. "errorCode9": "查询错误,查询信息不完善",
  98. "errorCode10": "系统异常错误",
  99. "errorCode11": "验证码为空",
  100. "errorCode12": "验证码已过期",
  101. "errorCode13": "错误的验证码",
  102. "errorCode14": "不支持的Http请求方式",
  103. "errorCode15": "下载失败",
  104. "errorCode16": "下载失败,文件不存在",
  105. "errorCode17": "上传文件失败,文件内容为空",
  106. "errorCode18": "接口文档错误,文件不存在",
  107. "errorCode19": "上传文件失败,错误的文件格式",
  108. "errorCode800": "会诊不存在或已结束",
  109. "errorCode802": "申请已被处理,请勿重复操作",
  110. "errorCode805": "会诊不存在",
  111. "errorCode806": "设备不在线",
  112. "errorCode807": "专家不在线",
  113. "errorCode809": "专家正忙",
  114. "errorCode811": "会诊已取消",
  115. "errorCode812": "会诊已超时",
  116. "errorCode813": "会诊参与人员不存在",
  117. "errorCode816": "居民已存在,请勿重复添加",
  118. "errorCode824": "预约记录不存在",
  119. "errorCode825": "会诊医院不匹配",
  120. "errorCode827": "保存会诊记录失败",
  121. "errorCode830": "保存会诊发起人失败",
  122. "errorCode831": "申请方不在线",
  123. "errorCode832": "不是会诊发起方",
  124. "errorCode833": "会诊已结束",
  125. "errorCode834": "预约记录未审批",
  126. "errorCode835": "会诊不在进行中",
  127. "errorCode838": "急诊编号生成失败",
  128. "errorCode844": "邀请方不在线",
  129. "errorCode845": "邀请方忙线中",
  130. "errorCode847": "急诊专家为空",
  131. "errorCode851": "已在其他设备加入会诊",
  132. "errorCode852": "申请方正忙",
  133. "errorCode853": "急诊设备不存在",
  134. "errorCode854": "急诊设备未绑定",
  135. "errorCode858": "急诊设备未找到",
  136. "errorCode859": "急诊专家未找到",
  137. "errorCode860": "设备未开启直播",
  138. "errorCode861": "当前设备正在会诊或者急诊中",
  139. "errorCode2000": "未查找到设备",
  140. "errorCode2001": "该设备已被绑定,请勿重复添加",
  141. "errorCode2002": "添加或迁移设备到医院,未填写设备编码",
  142. "errorCode2003": "该设备已被绑定,请勿重复添加",
  143. "errorCode2004": "设备未绑定医院",
  144. "errorCode2005": "未选择下发设备",
  145. "errorCode2006": "AI应用code为空",
  146. "errorCode2007": "设备连接云服务失败",
  147. "errorCode2008": "设备连接云服务失败",
  148. "errorCode2009": "设备连接云服务失败",
  149. "errorCode2010": "设备连接云服务失败",
  150. "errorCode2011": "设备连接云服务失败",
  151. "errorCode2012": "未选择下发设备",
  152. "errorCode2013": "设备编码为空",
  153. "errorCode2014": "移除失败",
  154. "errorCode2015": "未查找到设备",
  155. "errorCode2016": "未填写设备名称",
  156. "errorCode2017": "设备连接云服务失败",
  157. "errorCode2018": "设备连接云服务失败",
  158. "errorCode2026": "该设备已经绑定过其他医院!请联系管理员解绑。",
  159. "errorCode2032": "用户未加入医院",
  160. "errorCode2033": "该设备归属其他科室,暂时无法添加",
  161. "errorCode2037": "设备描述不能为空",
  162. "errorCode3000": "管理端医院不能选择自己的子级医院作为父级医院",
  163. "errorCode3001": "管理员密码为空",
  164. "errorCode3002": "管理员未找到",
  165. "errorCode3003": "名称必传",
  166. "errorCode3004": "管理员Code必传",
  167. "errorCode3005": "管理员名称已存在",
  168. "errorCode3006": "管理员查询类型有误",
  169. "errorCode3007": "管理员Code未找到",
  170. "errorCode3008": "医院管理员删除失败",
  171. "errorCode3009": "用户code必传",
  172. "errorCode3010": "密码必传",
  173. "errorCode3011": "角色必传",
  174. "errorCode3012": "角色不存在",
  175. "errorCode3013": "没有选择医院则无法选择角色",
  176. "errorCode3014": "认证记录Code必传",
  177. "errorCode3015": "唯一码必传",
  178. "errorCode3016": "唯一码重复",
  179. "errorCode3017": "权限未找到",
  180. "errorCode3018": "选择自身作为上级",
  181. "errorCode3019": "权限必传",
  182. "errorCode3020": "角色未找到",
  183. "errorCode3021": "超级管理员角色不可操作",
  184. "errorCode3022": "设备未找到",
  185. "errorCode3023": "设备Code必传",
  186. "errorCode3024": "设备类型必传",
  187. "errorCode3025": "设备类型不能重复",
  188. "errorCode3026": "设备类型已绑定设备",
  189. "errorCode3027": "上级医院不存在",
  190. "errorCode3028": "医院不存在",
  191. "errorCode3029": "虚拟医院不能操作",
  192. "errorCode3030": "用户未找到",
  193. "errorCode3031": "词库Code或词条名称为空",
  194. "errorCode3032": "编辑词条失败",
  195. "errorCode3033": "词库Code或词条Code为空",
  196. "errorCode3034": "结论或描述为空",
  197. "errorCode3035": "编辑词条内容失败",
  198. "errorCode3036": "词条Code或父级Code为空",
  199. "errorCode3037": "Json格式不正确",
  200. "errorCode3038": "版本号格式不正确",
  201. "errorCode3039": "名称不可删除",
  202. "errorCode3040": "手机号不可删除",
  203. "errorCode3041": "基础信息不可删除",
  204. "errorCode3042": "密码错误",
  205. "errorCode3043": "Code为空",
  206. "errorCode3045": "已经是最新版本",
  207. "errorCode3047": "未配置模板",
  208. "errorCode3050": "词条库名称重复,请重新输入",
  209. "errorCode3051": "模版名称重复",
  210. "errorCode3999": "系统错误",
  211. "errorCode4000": "导出失败,请先选择需导出的居民",
  212. "errorCode4001": "您尚无权限操作",
  213. "errorCode4002": "检查已结束,无法继续操作",
  214. "errorCode4003": "转诊失败,系统不支持转诊给申请人",
  215. "errorCode4004": "该转诊已超时",
  216. "errorCode4005": "存在尚未结束的扫查,请先结束扫查再操作",
  217. "errorCode4006": "不支持转诊至该医院",
  218. "errorCode4007": "本医院中未找到该居民",
  219. "errorCode4008": "本医院中不存在该设备",
  220. "errorCode4009": "该关联操作不属于同一设备,请先检查要关联的操作设备是否一致",
  221. "errorCode4010": "请先同意再继续",
  222. "errorCode4011": "转诊居民需转为已登记状态",
  223. "errorCode4012": "性别填写有误",
  224. "errorCode4013": "设备未绑定医院",
  225. "errorCode4014": "居民code不存在",
  226. "errorCode4015": "检查code不存在",
  227. "errorCode4016": "检查code不存在",
  228. "errorCode4017": "设备中不存在该检查",
  229. "errorCode4018": "请先完善个人信息再操作",
  230. "errorCode4019": "检查code不存在",
  231. "errorCode4020": "未完成扫查,请先扫查再操作",
  232. "errorCode4021": "操作失败,转诊单已被执行其他操作",
  233. "errorCode4022": "开始时间不能晚于结束时间",
  234. "errorCode4023": "请先完善个人信息再操作",
  235. "errorCode4024": "转诊code不存在",
  236. "errorCode4025": "病例信息未修改,请修改完再进行保存",
  237. "errorCode4026": "检查code不存在",
  238. "errorCode4027": "孕龄未填写",
  239. "errorCode4028": "该检查无图像信息",
  240. "errorCode4029": "扫查应用为空",
  241. "errorCode4030": "扫查应用类别为空",
  242. "errorCode4031": "未选择测量模式",
  243. "errorCode4032": "查询必填",
  244. "errorCode4033": "请填写注释内容",
  245. "errorCode4034": "请先选择并设置测量项",
  246. "errorCode4035": "请设置测量样式",
  247. "errorCode4036": "未设置服务对象",
  248. "errorCode4037": "检查code不存在",
  249. "errorCode4038": "分页查找转诊居民检查列表,不在一家医院",
  250. "errorCode4039": "未选择起止时间",
  251. "errorCode4040": "计算方式传值有误",
  252. "errorCode4041": "服务对象错误",
  253. "errorCode4042": "登记状态错误",
  254. "errorCode4043": "无效版本号",
  255. "errorCode4044": "当前版本不支持",
  256. "errorCode4045": "用户不存在",
  257. "errorCode4046": "居民code不能为空",
  258. "errorCode4049": "无权操作此转诊单",
  259. "errorCode4050": "该居民下无检查记录",
  260. "errorCode4056": "未找到可导出的数据",
  261. "errorCode5000": "检查code不存在",
  262. "errorCode5001": "检查记录不存在",
  263. "errorCode5002": "报告模板内容为空",
  264. "errorCode5003": "请先填写报告",
  265. "errorCode5004": "请填写手机号",
  266. "errorCode5005": "报告编码不能为空",
  267. "errorCode5006": "未设置报告分享地址",
  268. "errorCode5007": "未设置报告分享地址",
  269. "errorCode5008": "未配置短信模板",
  270. "errorCode5009": "分享失败",
  271. "errorCode5010": "请填写分享邮箱",
  272. "errorCode5011": "报告模板code不存在",
  273. "errorCode5012": "消息地址为空",
  274. "errorCode5014": "创建报告失败",
  275. "errorCode5015": "转诊居民不存在",
  276. "errorCode5016": "转诊居民未受理",
  277. "errorCode5017": "已有同名注释",
  278. "errorCode6000": "手机号码不正确",
  279. "errorCode6001": "请填写居民姓名",
  280. "errorCode6002": "请填写手机号",
  281. "errorCode6003": "居民姓名限制20个字",
  282. "errorCode6004": "请填写正确的手机号",
  283. "errorCode6005": "用户不存在",
  284. "errorCode6006": "居民已存在,请勿重复添加",
  285. "errorCode6007": "您尚无权限操作,请联系医院负责人",
  286. "errorCode6008": "请先完善个人信息再操作",
  287. "errorCode6009": "用户不存在",
  288. "errorCode6010": "不支持申请的角色",
  289. "errorCode6011": "请完善申请信息",
  290. "errorCode6012": "请完善申请信息",
  291. "errorCode6013": "您尚无权限操作,请联系医院负责人",
  292. "errorCode6014": "请先完善个人信息再操作",
  293. "errorCode6015": "请上传头像",
  294. "errorCode6016": "不支持申请的角色",
  295. "errorCode6017": "请填写医院名称",
  296. "errorCode6018": "医院code不存在",
  297. "errorCode6019": "岗位code不存在",
  298. "errorCode6020": "请输入岗位名称",
  299. "errorCode6021": "适用科室编码不存在",
  300. "errorCode6022": "职称code不存在",
  301. "errorCode6023": "请输入职称",
  302. "errorCode6024": "错误的邮箱格式",
  303. "errorCode6025": "请填写登录密码",
  304. "errorCode6026": "账号不存在",
  305. "errorCode6027": "用户不存在",
  306. "errorCode6028": "请输入邮箱",
  307. "errorCode6029": "未注册的用户",
  308. "errorCode6030": "请输入手机号",
  309. "errorCode6031": "未注册的用户",
  310. "errorCode6032": "手机号不存在",
  311. "errorCode6033": "邮箱不存在",
  312. "errorCode6034": "验证码错误",
  313. "errorCode6035": "修改密码,当前操作人",
  314. "errorCode6036": "请输入正确的密码",
  315. "errorCode6037": "该账号尚未注册",
  316. "errorCode6038": "请输入密码",
  317. "errorCode6039": "错误的地区信息",
  318. "errorCode6040": "未设置地区信息",
  319. "errorCode6041": "当前版本不支持",
  320. "errorCode6042": "用户不存在",
  321. "errorCode6043": "该用户已认证",
  322. "errorCode6044": "账号已存在,请直接登录",
  323. "errorCode6045": "账号已存在,请直接登录",
  324. "errorCode6046": "账号已存在,请直接登录",
  325. "errorCode6047": "手机号已绑定其他账号!",
  326. "errorCode6048": "该邮箱已绑定用户",
  327. "errorCode6049": "账号不能为空",
  328. "errorCode6050": "账号格式不符合规则",
  329. "errorCode6051": "请输入正确的验证码",
  330. "errorCode6053": "原密码不正确",
  331. "errorCode6055": "职位名称重复,请重新输入",
  332. "errorCode6056": "科室名称重复,请重新输入",
  333. "errorCode6057": "头像图片地址不合法",
  334. "errorCode6058": "昵称太长",
  335. "errorCode6062": "账号已锁定,次日即可自动解锁",
  336. "errorCode6064": "用户密码与历史密码重复,请重新输入",
  337. "errorCode6066": "语音识别错误",
  338. "errorCode6070": "超过最大用户数量限制",
  339. "errorCode6071": "超过最大设备数量限制",
  340. "errorCode6072": "服务器已经被禁用",
  341. "errorCode6077": "未设置所属医院",
  342. "errorCode6078": "对接医院不能是上级医院",
  343. "errorCode7001": "课程编码为空",
  344. "errorCode7002": "老师编码为空",
  345. "errorCode7003": "老师信息未找到",
  346. "errorCode7004": "课程未找到",
  347. "errorCode7005": "已审核状态不能删除课程",
  348. "errorCode7006": "已审核状态不能更新课程",
  349. "errorCode7009": "最大人数不能为0",
  350. "errorCode7010": "用户组名称为空",
  351. "errorCode7013": "班级学员列表为空",
  352. "errorCode7014": "用户组编码为空",
  353. "errorCode7015": "视频名称为空",
  354. "errorCode7016": "视频地址为空",
  355. "errorCode7017": "视频编码为空",
  356. "errorCode7019": "直播老师不存在",
  357. "errorCode7021": "课程正在直播中",
  358. "errorCode7022": "老师不在线",
  359. "errorCode7023": "学生不在线",
  360. "errorCode7024": "课程未审核",
  361. "errorCode7025": "试卷未找到",
  362. "errorCode7026": "试卷编码未空",
  363. "errorCode7027": "学生答题数据未找到",
  364. "errorCode7029": "直播课程未找到",
  365. "errorCode7030": "课程不在直播中",
  366. "errorCode7031": "课程已结束",
  367. "errorCode7032": "课程DB处理错误",
  368. "errorCode7040": "学生未支付",
  369. "errorCode7044": "报告已提交,请勿重复提交",
  370. "errorCode7046": "更新包已存在,请更改或删除更新包名",
  371. "errorCode7050": "编码不能为空",
  372. "errorCode7052": "描述过长",
  373. "errorCode7056": "当前设备已被占用",
  374. "errorCode7058": "用户已经在其他设备使用远程连接",
  375. "errorCode7059": "学生编码为空",
  376. "errorCode7063": "专辑名称为空",
  377. "errorCode7064": "无法作为学员加入自己创建的班级",
  378. "errorCode7065": "用户组名称不能重复",
  379. "errorCode7067": "没有超声机分享入口",
  380. "errorCode7076": "学生已在班级中",
  381. "errorCode7077": "用户所属机构和设备所属机构不在同一组织下",
  382. "errorCode7079": "设备不支持",
  383. "errorCode8001": "登记重复,请确认登记信息是否正确",
  384. "errorCode9001": "当前账号未设置团队,无法保存数据",
  385. "errorCode9011": "当前版本为最新版本",
  386. "errorCode9013": "当前账号已在其他设备登录",
  387. "errorCode9008": "当前账号未设置团队的主治医生,无法保存数据",
  388. };
  389. }