|
@@ -1,13 +1,324 @@
|
|
|
+import 'package:fis_i18n/i18n.dart';
|
|
|
+import 'package:fis_jsonrpc/rpc.dart';
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
|
-/// TODO 测试用到的
|
|
|
-class name extends StatelessWidget {
|
|
|
- const name({Key? key}) : super(key: key);
|
|
|
+// import 'package:flyinsono/pages/remedical/consultation/controller.dart';
|
|
|
+/// 带数据回调
|
|
|
+typedef void ValueCallback<T>(T value);
|
|
|
+
|
|
|
+/// 所有图片的入口
|
|
|
+class ImageStatus extends StatelessWidget {
|
|
|
+ /// 图片类型
|
|
|
+ final RemedicalFileDataTypeEnum fileDataType;
|
|
|
+
|
|
|
+ /// 图片地址
|
|
|
+ final TerminalImageDTO terminalImage;
|
|
|
+
|
|
|
+ /// AI 良恶性
|
|
|
+ final DiagnosisConclusionEnum? diagnosisConclusion;
|
|
|
+
|
|
|
+ /// 是否是测量页面
|
|
|
+ final bool? isMeasure;
|
|
|
+
|
|
|
+ /// 改变图片地址
|
|
|
+ final VoidCallback? onChangeImage;
|
|
|
+
|
|
|
+ /// AI测量的器官
|
|
|
+ final List<DiagnosisOrganEnum>? diagnosisOrgans;
|
|
|
+
|
|
|
+ /// 打开测量页面的方法
|
|
|
+ final ValueCallback? onOpenMeasure;
|
|
|
+
|
|
|
+ ImageStatus({
|
|
|
+ Key? key,
|
|
|
+ required this.fileDataType,
|
|
|
+ required this.terminalImage,
|
|
|
+ this.diagnosisConclusion = DiagnosisConclusionEnum.NotRequired,
|
|
|
+ this.diagnosisOrgans = const [DiagnosisOrganEnum.Null],
|
|
|
+ this.isMeasure = false,
|
|
|
+ this.onChangeImage,
|
|
|
+ this.onOpenMeasure,
|
|
|
+ }) : super(key: key);
|
|
|
|
|
|
@override
|
|
|
Widget build(BuildContext context) {
|
|
|
- return Container(
|
|
|
- child: Text('sssddd'),
|
|
|
+ Map<
|
|
|
+ Enum,
|
|
|
+ Widget Function(
|
|
|
+ TerminalImageDTO imageUrlMap,
|
|
|
+ )> buildItem = {
|
|
|
+ RemedicalFileDataTypeEnum.Image: (
|
|
|
+ imageUrlMap,
|
|
|
+ ) =>
|
|
|
+ _buildImageCard(
|
|
|
+ imageUrlMap,
|
|
|
+ ),
|
|
|
+ RemedicalFileDataTypeEnum.ThirdVidSingle: (
|
|
|
+ imageUrlMap,
|
|
|
+ ) =>
|
|
|
+ _buildImageCard(
|
|
|
+ imageUrlMap,
|
|
|
+ ),
|
|
|
+ RemedicalFileDataTypeEnum.ThirdVidMovie: (
|
|
|
+ imageUrlMap,
|
|
|
+ ) =>
|
|
|
+ _buildVidMovieCard(
|
|
|
+ imageUrlMap,
|
|
|
+ ),
|
|
|
+ RemedicalFileDataTypeEnum.VinnoVidSingle: (
|
|
|
+ imageUrlMap,
|
|
|
+ ) =>
|
|
|
+ _buildImageCard(
|
|
|
+ imageUrlMap,
|
|
|
+ ),
|
|
|
+ RemedicalFileDataTypeEnum.VinnoVidMovie: (
|
|
|
+ imageUrlMap,
|
|
|
+ ) =>
|
|
|
+ _buildVidMovieCard(
|
|
|
+ imageUrlMap,
|
|
|
+ ),
|
|
|
+ };
|
|
|
+ return buildItem[fileDataType]!(terminalImage);
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget _buildVidMovieCard(
|
|
|
+ TerminalImageDTO imageUrlMap,
|
|
|
+ ) {
|
|
|
+ return Listener(
|
|
|
+ child: Container(
|
|
|
+ width: 190,
|
|
|
+ height: 160,
|
|
|
+ color: Colors.black,
|
|
|
+ child: Stack(
|
|
|
+ children: [
|
|
|
+ Center(
|
|
|
+ child: Image.network(
|
|
|
+ imageUrlMap.previewUrl!,
|
|
|
+ errorBuilder: ((context, error, stackTrace) {
|
|
|
+ return Container(
|
|
|
+ child: Text('error'),
|
|
|
+ );
|
|
|
+ }),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ Positioned(
|
|
|
+ bottom: 5,
|
|
|
+ left: 5,
|
|
|
+ child: _buildAIDiagnosticOrgans(),
|
|
|
+ ),
|
|
|
+ InkWell(
|
|
|
+ onTap: () {
|
|
|
+ !isMeasure!
|
|
|
+ ? onOpenMeasure!.call(imageUrlMap.imageUrl!)
|
|
|
+ : onChangeImage!.call();
|
|
|
+ },
|
|
|
+ child: Center(
|
|
|
+ child: Container(
|
|
|
+ child: Icon(
|
|
|
+ Icons.play_circle_outline_rounded,
|
|
|
+ color: Colors.white,
|
|
|
+ size: 50,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ Positioned(
|
|
|
+ bottom: 5,
|
|
|
+ right: 5,
|
|
|
+ child: Tooltip(
|
|
|
+ textStyle: TextStyle(
|
|
|
+ fontSize: 16,
|
|
|
+ color: Colors.white,
|
|
|
+ ),
|
|
|
+ message: _buildAIText(diagnosisConclusion!),
|
|
|
+ child: Text(
|
|
|
+ 'AI',
|
|
|
+ style: TextStyle(
|
|
|
+ color: _buildAITextColor(
|
|
|
+ diagnosisConclusion!,
|
|
|
+ ),
|
|
|
+ fontSize: 20,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ),
|
|
|
);
|
|
|
}
|
|
|
+
|
|
|
+ Widget _buildImageCard(
|
|
|
+ TerminalImageDTO imageUrlMap,
|
|
|
+ ) {
|
|
|
+ return Listener(
|
|
|
+ child: InkWell(
|
|
|
+ onTap: () {
|
|
|
+ !isMeasure!
|
|
|
+ ? onOpenMeasure!.call(imageUrlMap.imageUrl!)
|
|
|
+ : onChangeImage!.call();
|
|
|
+ },
|
|
|
+ child: Container(
|
|
|
+ width: 190,
|
|
|
+ height: 160,
|
|
|
+ color: Colors.black,
|
|
|
+ child: Stack(
|
|
|
+ children: [
|
|
|
+ Center(
|
|
|
+ child: Image.network(
|
|
|
+ imageUrlMap.previewUrl!,
|
|
|
+ errorBuilder: ((context, error, stackTrace) {
|
|
|
+ return Container(
|
|
|
+ child: Text('error'),
|
|
|
+ );
|
|
|
+ }),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ Positioned(
|
|
|
+ bottom: 5,
|
|
|
+ left: 5,
|
|
|
+ child: _buildAIDiagnosticOrgans(),
|
|
|
+ ),
|
|
|
+ Positioned(
|
|
|
+ bottom: 5,
|
|
|
+ right: 5,
|
|
|
+ child: Tooltip(
|
|
|
+ textStyle: TextStyle(
|
|
|
+ fontSize: 16,
|
|
|
+ color: Colors.white,
|
|
|
+ ),
|
|
|
+ message: _buildAIText(diagnosisConclusion!),
|
|
|
+ child: Text(
|
|
|
+ 'AI',
|
|
|
+ style: TextStyle(
|
|
|
+ color: _buildAITextColor(
|
|
|
+ diagnosisConclusion!,
|
|
|
+ ),
|
|
|
+ fontSize: 20,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ String _buildAIText(DiagnosisConclusionEnum diagnosisConclusion) {
|
|
|
+ switch (diagnosisConclusion) {
|
|
|
+ case DiagnosisConclusionEnum.NotRequired:
|
|
|
+ return i18nBook.remedical.noNeedAIYet.t;
|
|
|
+ case DiagnosisConclusionEnum.InProcess:
|
|
|
+ return i18nBook.remedical.didNotHandle.t;
|
|
|
+ case DiagnosisConclusionEnum.Unrecognized:
|
|
|
+ return i18nBook.remedical.didNotIdentify.t;
|
|
|
+ case DiagnosisConclusionEnum.NoObviousLesion:
|
|
|
+ return i18nBook.remedical.noAbnormal.t;
|
|
|
+ case DiagnosisConclusionEnum.Benign:
|
|
|
+ return i18nBook.remedical.benign.t;
|
|
|
+ case DiagnosisConclusionEnum.Malignant:
|
|
|
+ return i18nBook.remedical.malignant.t;
|
|
|
+ case DiagnosisConclusionEnum.BenignAndMalignant:
|
|
|
+ return i18nBook.remedical.benignWithMalignant.t;
|
|
|
+ default:
|
|
|
+ return i18nBook.remedical.didNotIdentify.t;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ dynamic _buildAITextColor(DiagnosisConclusionEnum diagnosisConclusion) {
|
|
|
+ switch (diagnosisConclusion) {
|
|
|
+ case DiagnosisConclusionEnum.NotRequired:
|
|
|
+ return Colors.transparent;
|
|
|
+ case DiagnosisConclusionEnum.InProcess:
|
|
|
+ return Colors.lightBlue;
|
|
|
+ case DiagnosisConclusionEnum.Unrecognized:
|
|
|
+ return Colors.lightBlue;
|
|
|
+ case DiagnosisConclusionEnum.NoObviousLesion:
|
|
|
+ return Colors.lightBlue;
|
|
|
+ case DiagnosisConclusionEnum.Benign:
|
|
|
+ return Colors.greenAccent;
|
|
|
+ case DiagnosisConclusionEnum.Malignant:
|
|
|
+ return Colors.redAccent;
|
|
|
+ case DiagnosisConclusionEnum.BenignAndMalignant:
|
|
|
+ return Colors.redAccent;
|
|
|
+ default:
|
|
|
+ return Colors.transparent;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget _buildAIDiagnosticOrgans() {
|
|
|
+ switch (diagnosisOrgans?.length == 0
|
|
|
+ ? DiagnosisOrganEnum.Null
|
|
|
+ : diagnosisOrgans?[0]) {
|
|
|
+ case DiagnosisOrganEnum.Null:
|
|
|
+ return const SizedBox();
|
|
|
+ case DiagnosisOrganEnum.placeHolder_1:
|
|
|
+ return const SizedBox();
|
|
|
+ case DiagnosisOrganEnum.Breast:
|
|
|
+ return Text(
|
|
|
+ i18nBook.remedical.breast.t,
|
|
|
+ style: TextStyle(
|
|
|
+ color: _buildAITextColor(
|
|
|
+ diagnosisConclusion!,
|
|
|
+ ),
|
|
|
+ fontSize: 18,
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ case DiagnosisOrganEnum.Abdomen:
|
|
|
+ return Text(
|
|
|
+ i18nBook.bodyParts.abdomen.t,
|
|
|
+ style: TextStyle(
|
|
|
+ color: _buildAITextColor(
|
|
|
+ diagnosisConclusion!,
|
|
|
+ ),
|
|
|
+ fontSize: 18,
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ case DiagnosisOrganEnum.Liver:
|
|
|
+ return Text(
|
|
|
+ i18nBook.remedical.liver.t,
|
|
|
+ style: TextStyle(
|
|
|
+ color: _buildAITextColor(
|
|
|
+ diagnosisConclusion!,
|
|
|
+ ),
|
|
|
+ fontSize: 18,
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ case DiagnosisOrganEnum.Cholecyst:
|
|
|
+ return Text(
|
|
|
+ i18nBook.remedical.cholecyst.t,
|
|
|
+ style: TextStyle(
|
|
|
+ color: _buildAITextColor(
|
|
|
+ diagnosisConclusion!,
|
|
|
+ ),
|
|
|
+ fontSize: 18,
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ case DiagnosisOrganEnum.Kidney:
|
|
|
+ return Text(
|
|
|
+ i18nBook.remedical.kidney.t,
|
|
|
+ style: TextStyle(
|
|
|
+ color: _buildAITextColor(
|
|
|
+ diagnosisConclusion!,
|
|
|
+ ),
|
|
|
+ fontSize: 18,
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ case DiagnosisOrganEnum.Spleen:
|
|
|
+ return Text(
|
|
|
+ i18nBook.remedical.spleen.t,
|
|
|
+ style: TextStyle(
|
|
|
+ color: _buildAITextColor(
|
|
|
+ diagnosisConclusion!,
|
|
|
+ ),
|
|
|
+ fontSize: 18,
|
|
|
+ ),
|
|
|
+ );
|
|
|
+
|
|
|
+ default:
|
|
|
+ return Container();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|