|
@@ -0,0 +1,104 @@
|
|
|
+export function fromTongueAnalysisModel(data: Record<string, any>): AnalysisModel {
|
|
|
+ const exception: AnalysisException[] = [];
|
|
|
+ const fromTongueException = fromAnalysisException(exception);
|
|
|
+ const c1 = data?.upImg ?? data?.tongueImgUrl;
|
|
|
+ const c2 = data?.downImg ?? data?.tongueBackImgUrl;
|
|
|
+ return {
|
|
|
+ table: {
|
|
|
+ columns: ['舌象维度', '检测结果', '标准值'],
|
|
|
+ data: [
|
|
|
+ fromTongueException(data?.tongueColor, '舌色'),
|
|
|
+ fromTongueException(data?.tongueCoatingColor, '苔色'),
|
|
|
+ fromTongueException(data?.tongueShape, '舌形'),
|
|
|
+ fromTongueException(data?.tongueCoating, '苔质'),
|
|
|
+ fromTongueException(data?.bodyFluid, '津液'),
|
|
|
+ fromTongueException(data?.sublingualVein, '舌下'),
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ exception,
|
|
|
+ result: data?.tongueAnalysisResult ?? data?.tongue ?? '',
|
|
|
+ cover: Object.assign([c1, c2].filter(Boolean), {
|
|
|
+ ['舌上']: c1,
|
|
|
+ ['舌下']: c2,
|
|
|
+ }),
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+export function fromFaceAnalysisModel(data: Record<string, any>): AnalysisModel {
|
|
|
+ const exception: AnalysisException[] = [];
|
|
|
+ const fromTongueException = fromAnalysisException(exception, (label, value) => `${label}${value}`);
|
|
|
+ const c1 = data?.faceImg ?? data?.faceImgUrl;
|
|
|
+ const c2 = data?.faceLeft ?? data?.faceLeftImgUrl;
|
|
|
+ const c3 = data?.faceRight ?? data?.faceRightImgUrl;
|
|
|
+ return {
|
|
|
+ table: {
|
|
|
+ columns: ['面象维度', '检测结果', '标准值'],
|
|
|
+ data: [
|
|
|
+ fromTongueException(data?.faceColor, '面色'),
|
|
|
+ fromTongueException(data?.mainColor, '主色'),
|
|
|
+ fromTongueException(data?.shine, '光泽'),
|
|
|
+ fromTongueException(data?.leftBlackEye, '左黑眼圈'),
|
|
|
+ fromTongueException(data?.rightBlackEye, '右黑眼圈'),
|
|
|
+ fromTongueException(data?.lipColor, '唇色'),
|
|
|
+ fromTongueException(data?.eyeContact, '眼神'),
|
|
|
+ fromTongueException(data?.leftEyeColor, '左目色'),
|
|
|
+ fromTongueException(data?.rightEyeColor, '右目色'),
|
|
|
+ fromTongueException(data?.hecticCheek, '两颧红'),
|
|
|
+ fromTongueException(data?.noseFold, '鼻褶'),
|
|
|
+ fromTongueException(data?.cyanGlabella, '眉间/鼻柱青色'),
|
|
|
+ fromTongueException(data?.faceSkinDefects, '面部皮损'),
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ exception,
|
|
|
+ result: data?.faceAnalysisResult ?? data?.face ?? '',
|
|
|
+ cover: Object.assign([c1, c2, c3].filter(Boolean), {
|
|
|
+ ['正面']: c1,
|
|
|
+ ['左面']: c2,
|
|
|
+ ['右面']: c3,
|
|
|
+ }),
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+export interface AnalysisModel {
|
|
|
+ table: {
|
|
|
+ columns: string[];
|
|
|
+ data: (string[] & { exception: boolean })[];
|
|
|
+ };
|
|
|
+ exception: AnalysisException[];
|
|
|
+ cover: string[];
|
|
|
+ result: string;
|
|
|
+}
|
|
|
+
|
|
|
+export interface AnalysisException {
|
|
|
+ title: string;
|
|
|
+ cover?: string;
|
|
|
+ description?: string;
|
|
|
+ descriptions: { label: string; value: string }[];
|
|
|
+ tags: string[];
|
|
|
+}
|
|
|
+
|
|
|
+function fromAnalysisException(exception: AnalysisException[], $title = (label: string, value: string) => value) {
|
|
|
+ return function (data: { actualList?: Record<string, any>[]; standardValue?: string }, label: string) {
|
|
|
+ let is = false;
|
|
|
+ const values =
|
|
|
+ data?.actualList?.map((item) => {
|
|
|
+ let title: string = item?.actualValue ?? '';
|
|
|
+ const suffix = item?.contrast ?? 's';
|
|
|
+ if (suffix !== 's') {
|
|
|
+ title += ` (${suffix || ''}) `;
|
|
|
+ is = true;
|
|
|
+ exception.push({
|
|
|
+ title: $title(label, title),
|
|
|
+ cover: item.splitImage,
|
|
|
+ descriptions: [
|
|
|
+ item.features ? { label: '【特征】', value: item.features } : null,
|
|
|
+ item.clinicalSignificance ? { label: '【临床意义】', value: item.clinicalSignificance } : null,
|
|
|
+ ].filter((v) => !!v),
|
|
|
+ tags: item.attrs ?? [],
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return title;
|
|
|
+ }) ?? [];
|
|
|
+ return Object.assign([label, values.join('<br>'), data?.standardValue ?? ''], { exception: is });
|
|
|
+ };
|
|
|
+}
|