controller.dart 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:get/get.dart';
  4. import 'package:vitalapp/architecture/defines.dart';
  5. import 'package:vitalapp/architecture/network_connectivity.dart';
  6. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  7. import 'package:vitalapp/global.dart';
  8. import 'package:vitalapp/helper/goto_helper.dart';
  9. import 'package:vitalapp/managers/interfaces/account.dart';
  10. import 'package:vitalapp/pages/controllers/home_nav_mixin.dart';
  11. import 'package:vitalapp/pages/home/models/menu.dart';
  12. import 'package:vitalapp/store/store.dart';
  13. import 'state.dart';
  14. class HomeController extends FControllerBase with HomeNavMixin {
  15. /// 仅支持在线模式的菜单路由
  16. static final _onlineOnlyMenuRouteNames = <String>[
  17. "/contract/package_list",
  18. "/check/form",
  19. ];
  20. static Widget _buildImgIcon(String assetName) {
  21. return ClipRect(
  22. child: SizedBox(
  23. height: 34,
  24. child: Image.asset(
  25. "assets/images/home/$assetName",
  26. width: 46,
  27. height: 46,
  28. fit: BoxFit.fitWidth,
  29. ),
  30. ),
  31. );
  32. }
  33. final state = HomeState();
  34. /// 当前选中路由
  35. int currentIndex = -1;
  36. List<HomeMenuItem> homeMenuItems = [
  37. HomeMenuItem(
  38. key: 'ZY',
  39. title: "主页",
  40. routeName: "/dashboard",
  41. iconData: Icons.home_outlined,
  42. ),
  43. HomeMenuItem(
  44. key: 'XJDA',
  45. title: "新建档案",
  46. routeName: "/patient/create",
  47. // TODO: 图addHealthRecord.png 不太合适,先层叠这样显示
  48. iconWidget: _PatientAddIconProxyWidget(
  49. baseIcon: _buildImgIcon('healthRecord.png'),
  50. ),
  51. ),
  52. HomeMenuItem(
  53. key: 'JKDA',
  54. title: "健康档案",
  55. routeName: "/patient/detail",
  56. iconWidget: _buildImgIcon('healthRecord.png'),
  57. ),
  58. HomeMenuItem(
  59. key: 'JMLB',
  60. title: "居民列表",
  61. routeName: "/patient/list",
  62. iconWidget: _buildImgIcon('patientList.png'),
  63. ),
  64. HomeMenuItem(
  65. key: 'YSQY',
  66. title: "医生签约",
  67. routeName: "/contract/package_list",
  68. iconWidget: _buildImgIcon('doctorSigning.png'),
  69. ),
  70. HomeMenuItem(
  71. key: 'JKTJ',
  72. title: "健康体检",
  73. routeName: "/check/form",
  74. iconWidget: _buildImgIcon('healthCheckup.png'),
  75. ),
  76. HomeMenuItem(
  77. key: 'RQSF',
  78. title: "人群随访",
  79. routeName: "/check/follow_up",
  80. iconWidget: _buildImgIcon('populationFollowUp.png'),
  81. ),
  82. HomeMenuItem(
  83. key: 'JKJC',
  84. title: "健康检测",
  85. routeName: "/medical",
  86. iconWidget: _buildImgIcon('diagnosisDisplay.png'),
  87. isSelected: true,
  88. ),
  89. HomeMenuItem(
  90. title: "中医体质",
  91. routeName: "/TraditionalChineseMedicineConstitution",
  92. key: "TZBS",
  93. iconWidget: _buildImgIcon("medicineConstitution.png"),
  94. isSelected: true,
  95. ),
  96. HomeMenuItem(
  97. key: 'SZZX',
  98. title: "设置中心",
  99. routeName: "/settings",
  100. iconData: Icons.settings,
  101. ),
  102. ];
  103. /// 登出
  104. Future<void> logOut() async {
  105. final result = await Get.find<IAccountManager>().logout();
  106. if (result) {
  107. Get.offAllNamed("/login");
  108. }
  109. }
  110. Future<void> changeMedical() async {
  111. try {
  112. Get.offAllNamed("/medical", id: 1001);
  113. } catch (e) {}
  114. }
  115. void onlineChanged(_, bool isOnline) {
  116. state.isOnline = isOnline;
  117. }
  118. @override
  119. void onInit() {
  120. initMenus();
  121. super.onInit();
  122. }
  123. initAddListener() {
  124. netChecker.onlineChangedEvent.addListener(onlineChanged);
  125. }
  126. netCheckerRemoveListener() {
  127. netChecker.onlineChangedEvent.removeListener(onlineChanged);
  128. }
  129. /// 切换活动菜单
  130. void switchActiveMenu(HomeMenuItem data) async {
  131. if (!kIsOnline) {
  132. // 无网络时,根据仅在线支持的菜单名单判断,进行阻断和提示
  133. if (_onlineOnlyMenuRouteNames.contains(data.routeName)) {
  134. PromptBox.toast("请检查网络连接");
  135. return;
  136. }
  137. }
  138. if (state.currentSelectMenu != data.routeName) {
  139. switchNavByName(data.routeName);
  140. }
  141. }
  142. void switchNavByName(String name, [Map? patientInfo]) {
  143. state.currentSelectMenu = name;
  144. NavGotoHelper.goto(name, patientInfo);
  145. }
  146. void initMenus() {
  147. state.menuItems = [
  148. // HomeMenuItem(
  149. // key: 'ZY',
  150. // title: "主页",
  151. // routeName: "/dashboard",
  152. // iconData: Icons.home_outlined,
  153. // isSelected: true,
  154. // ),
  155. HomeMenuItem(
  156. key: 'XJDA',
  157. title: "新建档案",
  158. routeName: "/patient/create",
  159. // TODO: 图addHealthRecord.png 不太合适,先层叠这样显示
  160. iconWidget: _PatientAddIconProxyWidget(
  161. baseIcon: _buildImgIcon('healthRecord.png'),
  162. ),
  163. ),
  164. HomeMenuItem(
  165. key: 'JMLB',
  166. title: "居民列表",
  167. routeName: "/patient/list",
  168. iconWidget: _buildImgIcon('patientList.png'),
  169. ),
  170. HomeMenuItem(
  171. key: 'JKJC',
  172. title: "健康检测",
  173. routeName: "/medical",
  174. iconWidget: _buildImgIcon('diagnosisDisplay.png'),
  175. isSelected: true,
  176. ),
  177. // HomeMenuItem(
  178. // title: "中医体质",
  179. // routeName: "/TraditionalChineseMedicineConstitution",
  180. // key: "TZBS",
  181. // iconWidget: _buildImgIcon("medicineConstitution.png"),
  182. // isSelected: true,
  183. // ),
  184. HomeMenuItem(
  185. key: 'SZZX',
  186. title: "设置中心",
  187. routeName: "/settings",
  188. iconData: Icons.settings,
  189. ),
  190. ];
  191. }
  192. void updateMenus() {
  193. if (Store.user.menuPermissionList?.isNotEmpty ?? false) {
  194. List<HomeMenuItem> menuItems = [];
  195. Store.user.menuPermissionList?.forEach((element) {
  196. for (var item in homeMenuItems) {
  197. if (item.key == element.code) {
  198. menuItems.add(item);
  199. }
  200. }
  201. });
  202. // menuItems.add(homeMenuItems.firstWhere((x) => x.key == "ZYTZ"));
  203. state.menuItems = menuItems;
  204. } else {
  205. // state.menuItems = homeMenuItems;
  206. state.menuItems = [
  207. // HomeMenuItem(
  208. // key: 'ZY',
  209. // title: "主页",
  210. // routeName: "/dashboard",
  211. // iconData: Icons.home_outlined,
  212. // isSelected: true,
  213. // ),
  214. HomeMenuItem(
  215. key: 'XJDA',
  216. title: "新建档案",
  217. routeName: "/patient/create",
  218. // TODO: 图addHealthRecord.png 不太合适,先层叠这样显示
  219. iconWidget: _PatientAddIconProxyWidget(
  220. baseIcon: _buildImgIcon('healthRecord.png'),
  221. ),
  222. ),
  223. HomeMenuItem(
  224. key: 'JMLB',
  225. title: "居民列表",
  226. routeName: "/patient/list",
  227. iconWidget: _buildImgIcon('patientList.png'),
  228. ),
  229. HomeMenuItem(
  230. key: 'JKDA',
  231. title: "健康档案",
  232. routeName: "/patient/detail",
  233. iconWidget: _buildImgIcon('healthRecord.png'),
  234. ),
  235. HomeMenuItem(
  236. key: 'JKJC',
  237. title: "健康检测",
  238. routeName: "/medical",
  239. iconWidget: _buildImgIcon('diagnosisDisplay.png'),
  240. ),
  241. HomeMenuItem(
  242. key: 'SZZX',
  243. title: "设置中心",
  244. routeName: "/settings",
  245. iconData: Icons.settings,
  246. ),
  247. ];
  248. }
  249. }
  250. }
  251. class _PatientAddIconProxyWidget extends StatelessWidget {
  252. final Widget baseIcon;
  253. const _PatientAddIconProxyWidget({
  254. Key? key,
  255. required this.baseIcon,
  256. }) : super(key: key);
  257. @override
  258. Widget build(BuildContext context) {
  259. return Stack(
  260. children: [
  261. baseIcon,
  262. const Positioned(
  263. right: 0,
  264. top: 0,
  265. child: Icon(
  266. Icons.add,
  267. size: 16,
  268. color: Colors.white,
  269. ),
  270. )
  271. ],
  272. );
  273. }
  274. }