瀏覽代碼

Merge branch 'feature/register_branch' into develop

cc12458 10 月之前
父節點
當前提交
511e063e35
共有 100 個文件被更改,包括 3518 次插入383 次删除
  1. 6 0
      .idea/vcs.xml
  2. 111 0
      .idea/workspace.xml
  3. 25 3
      miniprogram/app.config.ts
  4. 10 0
      miniprogram/app.json
  5. 二進制
      miniprogram/assets/icon/icon_plan@3x.png
  6. 21 10
      miniprogram/components/button/button.ts
  7. 54 0
      miniprogram/components/record-index/record-index.js
  8. 6 0
      miniprogram/components/record-index/record-index.json
  9. 22 0
      miniprogram/components/record-index/record-index.wxml
  10. 21 0
      miniprogram/components/record-index/record-index.wxss
  11. 4 14
      miniprogram/components/tabbar/tabbar.ts
  12. 1 1
      miniprogram/components/tabbar/tabbar.wxml
  13. 1 0
      miniprogram/lib/request/create.ts
  14. 3 0
      miniprogram/lib/use/use-phone.ts
  15. 1 1
      miniprogram/module/article/components/science-card/science-card.scss
  16. 二進制
      miniprogram/module/care/assets/icon/icon_effect@3x.png
  17. 二進制
      miniprogram/module/care/assets/icon/icon_health@2x.png
  18. 二進制
      miniprogram/module/care/assets/icon/icon_report.png
  19. 二進制
      miniprogram/module/care/assets/icon/icon_scheme@2x.png
  20. 13 0
      miniprogram/module/care/pages/care/verifyRecord.json
  21. 72 0
      miniprogram/module/care/pages/care/verifyRecord.scss
  22. 56 0
      miniprogram/module/care/pages/care/verifyRecord.ts
  23. 33 0
      miniprogram/module/care/pages/care/verifyRecord.wxml
  24. 25 0
      miniprogram/module/care/pages/careDetail/careDetail.json
  25. 557 0
      miniprogram/module/care/pages/careDetail/careDetail.scss
  26. 162 0
      miniprogram/module/care/pages/careDetail/careDetail.ts
  27. 249 0
      miniprogram/module/care/pages/careDetail/careDetail.wxml
  28. 17 0
      miniprogram/module/care/pages/offlineTreatment/offlineTreatment.json
  29. 97 0
      miniprogram/module/care/pages/offlineTreatment/offlineTreatment.scss
  30. 36 0
      miniprogram/module/care/pages/offlineTreatment/offlineTreatment.ts
  31. 52 0
      miniprogram/module/care/pages/offlineTreatment/offlineTreatment.wxml
  32. 13 0
      miniprogram/module/care/pages/reportRecord/reportRecord.json
  33. 49 0
      miniprogram/module/care/pages/reportRecord/reportRecord.scss
  34. 43 0
      miniprogram/module/care/pages/reportRecord/reportRecord.ts
  35. 17 0
      miniprogram/module/care/pages/reportRecord/reportRecord.wxml
  36. 23 0
      miniprogram/module/care/request.ts
  37. 163 0
      miniprogram/module/charts/components/record-index/chalk.theme.ts
  38. 110 0
      miniprogram/module/charts/components/record-index/health-index.ts
  39. 9 0
      miniprogram/module/charts/components/record-index/record-index.json
  40. 33 0
      miniprogram/module/charts/components/record-index/record-index.scss
  41. 95 0
      miniprogram/module/charts/components/record-index/record-index.ts
  42. 22 0
      miniprogram/module/charts/components/record-index/record-index.wxml
  43. 21 0
      miniprogram/module/charts/components/record-index/request.ts
  44. 1 1
      miniprogram/module/charts/ec-canvas/ec-canvas.wxss
  45. 6 0
      miniprogram/module/charts/record-care/record-care.json
  46. 11 0
      miniprogram/module/charts/record-care/record-care.scss
  47. 135 0
      miniprogram/module/charts/record-care/record-care.ts
  48. 11 0
      miniprogram/module/charts/record-care/record-care.wxml
  49. 8 0
      miniprogram/module/charts/record-care/request.ts
  50. 16 9
      miniprogram/module/charts/record-index/chalk.theme.ts
  51. 2 1
      miniprogram/module/charts/record-index/health-index.ts
  52. 27 5
      miniprogram/module/charts/record-index/record-index.scss
  53. 58 27
      miniprogram/module/charts/record-index/record-index.ts
  54. 15 5
      miniprogram/module/charts/record-index/record-index.wxml
  55. 17 4
      miniprogram/module/charts/record-index/request.ts
  56. 51 26
      miniprogram/module/chats/components/guide/guide.ts
  57. 1 1
      miniprogram/module/chats/components/guide/guide.wxml
  58. 13 12
      miniprogram/module/chats/components/message-again/message-again.scss
  59. 75 82
      miniprogram/module/chats/components/message-again/message-again.ts
  60. 23 27
      miniprogram/module/chats/components/message-again/message-again.wxml
  61. 3 0
      miniprogram/module/chats/components/message-follow/message-follow.scss
  62. 2 1
      miniprogram/module/chats/components/message-select/message-select.ts
  63. 2 2
      miniprogram/module/chats/components/message-select/message-select.wxml
  64. 2 2
      miniprogram/module/chats/components/message-system/message-system.scss
  65. 7 4
      miniprogram/module/chats/components/questionnaire/questionnaire.ts
  66. 1 1
      miniprogram/module/chats/components/questionnaire/questionnaire.wxml
  67. 10 47
      miniprogram/module/chats/pages/analysis/analysis.ts
  68. 12 15
      miniprogram/module/chats/pages/index/index.scss
  69. 40 7
      miniprogram/module/chats/pages/index/index.ts
  70. 3 2
      miniprogram/module/chats/pages/index/index.wxml
  71. 0 1
      miniprogram/module/follow/pages/evaluation/report.ts
  72. 13 13
      miniprogram/module/follow/pages/evaluation/report.wxml
  73. 二進制
      miniprogram/module/health/assets/icon/icon_treatment@3x.png
  74. 二進制
      miniprogram/module/health/assets/image/health-report.png
  75. 20 5
      miniprogram/module/health/components/card-analysis/card-analysis-content.scss
  76. 9 1
      miniprogram/module/health/components/card-analysis/card-analysis-content.ts
  77. 12 4
      miniprogram/module/health/components/card-analysis/card-analysis-content.wxml
  78. 6 0
      miniprogram/module/health/components/care-record/care-record.json
  79. 77 0
      miniprogram/module/health/components/care-record/care-record.scss
  80. 46 0
      miniprogram/module/health/components/care-record/care-record.ts
  81. 28 0
      miniprogram/module/health/components/care-record/care-record.wxml
  82. 6 0
      miniprogram/module/health/components/care-scheme/care-scheme.json
  83. 125 0
      miniprogram/module/health/components/care-scheme/care-scheme.scss
  84. 45 0
      miniprogram/module/health/components/care-scheme/care-scheme.ts
  85. 41 0
      miniprogram/module/health/components/care-scheme/care-scheme.wxml
  86. 10 3
      miniprogram/module/health/components/follow-evaluation/follow-evaluation.scss
  87. 16 4
      miniprogram/module/health/components/follow-evaluation/follow-evaluation.ts
  88. 8 8
      miniprogram/module/health/components/follow-evaluation/follow-evaluation.wxml
  89. 2 2
      miniprogram/module/health/components/follow-record/follow-record.scss
  90. 3 0
      miniprogram/module/health/components/follow-record/follow-record.ts
  91. 5 5
      miniprogram/module/health/components/follow-record/follow-record.wxml
  92. 7 0
      miniprogram/module/health/components/nodrug-therapy/nodrug-therapy.json
  93. 105 0
      miniprogram/module/health/components/nodrug-therapy/nodrug-therapy.scss
  94. 42 0
      miniprogram/module/health/components/nodrug-therapy/nodrug-therapy.ts
  95. 41 0
      miniprogram/module/health/components/nodrug-therapy/nodrug-therapy.wxml
  96. 10 2
      miniprogram/module/health/components/report-health-index/report-health-index.scss
  97. 21 13
      miniprogram/module/health/components/report-health-index/report-health-index.wxml
  98. 2 2
      miniprogram/module/health/components/report-health-patient/report-health-patient.scss
  99. 11 9
      miniprogram/module/health/components/report-health-patient/report-health-patient.wxml
  100. 2 1
      miniprogram/module/health/components/report-health-status/report-health-status.json

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 111 - 0
.idea/workspace.xml

@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AutoImportSettings">
+    <option name="autoReloadType" value="SELECTIVE" />
+  </component>
+  <component name="ChangeListManager">
+    <list default="true" id="ade0a8c5-0639-4f05-956a-aae1181b5d18" name="更改" comment="">
+      <change beforePath="$PROJECT_DIR$/miniprogram/app.json" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/app.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/components/tabbar/tabbar.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/components/tabbar/tabbar.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/lib/request/create.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/lib/request/create.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/lib/use/use-phone.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/lib/use/use-phone.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/article/components/science-card/science-card.scss" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/article/components/science-card/science-card.scss" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/charts/record-index/chalk.theme.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/charts/record-index/chalk.theme.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/charts/record-index/record-index.scss" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/charts/record-index/record-index.scss" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/charts/record-index/record-index.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/charts/record-index/record-index.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/charts/record-index/record-index.wxml" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/charts/record-index/record-index.wxml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/charts/record-index/request.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/charts/record-index/request.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/chats/components/message-system/message-system.scss" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/chats/components/message-system/message-system.scss" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/components/card-analysis/card-analysis-content.scss" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/components/card-analysis/card-analysis-content.scss" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/components/card-analysis/card-analysis-content.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/components/card-analysis/card-analysis-content.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/components/card-analysis/card-analysis-content.wxml" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/components/card-analysis/card-analysis-content.wxml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/components/follow-evaluation/follow-evaluation.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/components/follow-evaluation/follow-evaluation.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-index/report-health-index.scss" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-index/report-health-index.scss" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-index/report-health-index.wxml" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-index/report-health-index.wxml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-patient/report-health-patient.scss" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-patient/report-health-patient.scss" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-status/report-health-status.json" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-status/report-health-status.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-status/report-health-status.scss" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-status/report-health-status.scss" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-status/report-health-status.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-status/report-health-status.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-status/report-health-status.wxml" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/components/report-health-status/report-health-status.wxml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/model/health.model.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/model/health.model.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/pages/home/home.json" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/pages/home/home.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/pages/home/home.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/pages/home/home.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/pages/home/home.wxml" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/pages/home/home.wxml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/pages/report/report.scss" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/pages/report/report.scss" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/health/request.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/health/request.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/user/pages/user-certification/user-certification.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/user/pages/user-certification/user-certification.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/user/pages/user-certification/user-certification.wxml" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/user/pages/user-certification/user-certification.wxml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/module/user/request.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/module/user/request.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/pages/home/home.scss" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/pages/home/home.scss" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/pages/home/home.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/pages/home/home.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/pages/home/home.wxml" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/pages/home/home.wxml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/pages/home/request.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/pages/home/request.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/pages/mine/mine.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/pages/mine/mine.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/pages/mine/mine.wxml" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/pages/mine/mine.wxml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/themes/card.scss" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/themes/card.scss" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/themes/page.scss" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/themes/page.scss" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/miniprogram/utils/util.ts" beforeDir="false" afterPath="$PROJECT_DIR$/miniprogram/utils/util.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/tsconfig.json" beforeDir="false" afterPath="$PROJECT_DIR$/tsconfig.json" afterDir="false" />
+    </list>
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+  </component>
+  <component name="ProjectColorInfo">{
+  &quot;associatedIndex&quot;: 6
+}</component>
+  <component name="ProjectId" id="2y83hfQWdk0KL1ry1ltAyuUZcIM" />
+  <component name="ProjectViewState">
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showLibraryContents" value="true" />
+  </component>
+  <component name="PropertiesComponent">{
+  &quot;keyToString&quot;: {
+    &quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
+    &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
+    &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
+    &quot;git-widget-placeholder&quot;: &quot;feature/register__branch&quot;,
+    &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
+    &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
+    &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
+    &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
+    &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
+    &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
+  }
+}</component>
+  <component name="SharedIndexes">
+    <attachedChunks>
+      <set>
+        <option value="bundled-js-predefined-d6986cc7102b-6a121458b545-JavaScript-WS-251.25410.117" />
+      </set>
+    </attachedChunks>
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="默认任务">
+      <changelist id="ade0a8c5-0639-4f05-956a-aae1181b5d18" name="更改" comment="" />
+      <created>1749202493163</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1749202493163</updated>
+      <workItem from="1749202494220" duration="720000" />
+      <workItem from="1749523832830" duration="2478000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="3" />
+    <option name="exactExcludedFiles">
+      <list>
+        <option value="$PROJECT_DIR$/miniprogram/module/care/pages/careDetail/careDetail.js" />
+        <option value="$PROJECT_DIR$/miniprogram/module/charts/compoments/record-index/record-index.js" />
+        <option value="$PROJECT_DIR$/miniprogram/module/charts/compoments/record-index/chalk.theme.js" />
+        <option value="$PROJECT_DIR$/miniprogram/module/charts/record-care/record-care.js" />
+        <option value="$PROJECT_DIR$/miniprogram/module/charts/record-care/record-care.js" />
+      </list>
+    </option>
+  </component>
+</project>

+ 25 - 3
miniprogram/app.config.ts

@@ -1,6 +1,28 @@
 import { getAccountInfoSync } from "./lib/wx/open-api";
 
 const miniProgram = getAccountInfoSync();
-const port = miniProgram.envVersion === 'release' ? 433 : 4433;
-export const Base_URL = `https://wx.hzliuzhi.com:${port}/manager/fdhb-mobile` as const;
-export const Upload_URL = `https://wx.hzliuzhi.com:${port}/manager/file` as const;
+// 测试环境
+let BaseURL = "";
+let UploadURL = "";
+const url = "https://test.hzliuzhi.com/manager/";
+if (miniProgram.envVersion === "trial") {
+  BaseURL = url + "fdhb-mobile";
+  UploadURL = url + "file";
+} else {
+  const port = miniProgram.envVersion === "release" ? 433 : 4433;
+  BaseURL = `https://wx.hzliuzhi.com:${port}/manager/fdhb-mobile` as const;
+  UploadURL = `https://wx.hzliuzhi.com:${port}/manager/file` as const;
+}
+console.log(
+  miniProgram.envVersion,
+  "小程序的版本",
+  "BaseURL:",
+  BaseURL,
+  "UploadURL:",
+  UploadURL
+);
+export const Base_URL = BaseURL;
+export const Upload_URL = UploadURL;
+// const port = miniProgram.envVersion === 'release' ? 433 : 4433;
+// export const Base_URL = `https://wx.hzliuzhi.com:${port}/manager/fdhb-mobile` as const;
+// export const Upload_URL = `https://wx.hzliuzhi.com:${port}/manager/file` as const;

+ 10 - 0
miniprogram/app.json

@@ -47,6 +47,16 @@
       "name": "follow",
       "root": "module/follow",
       "pages": ["pages/evaluation/report"]
+    },
+    {
+      "name": "care",
+      "root": "module/care",
+      "pages": [
+        "pages/care/verifyRecord",
+        "pages/offlineTreatment/offlineTreatment",
+        "pages/careDetail/careDetail",
+        "pages/reportRecord/reportRecord"
+      ]
     }
   ],
   "preloadRule": {

二進制
miniprogram/assets/icon/icon_plan@3x.png


+ 21 - 10
miniprogram/components/button/button.ts

@@ -27,12 +27,16 @@ Component({
       },
       {
         name: '提交',
-        value: 'cancel',
+        value: 'submit',
       },
       {
         name: '确定',
         value: 'confirm',
       },
+      {
+        name: '取消',
+        value: 'cancel',
+      },
     ],
     src: '',
     isDisabled: false,
@@ -48,25 +52,32 @@ Component({
       
       // 如果是刚刚重置的按钮(100ms内),不要立即禁用
       const now = Date.now();
+
       if (now - this.data._lastResetTime < 100) {
         console.log('[Button] button was just reset, not disabling');
         this.triggerEvent('submit');
         return;
       }
-      
+
       console.log('[Button] setting isDisabled to true');
       this.setData({ isDisabled: true });
-      this.triggerEvent('submit');
+      this.triggerEvent("submit");
     },
-    
+
     resetState() {
-      console.log('[Button] resetState called');
-      console.log('[Button] current isDisabled:', this.data.isDisabled);
+      console.log("[Button] resetState called");
+      console.log("[Button] current isDisabled:", this.data.isDisabled);
       this.setData({ 
         isDisabled: false,
         _lastResetTime: Date.now()
       });
-      console.log('[Button] isDisabled set to:', false);
-    }
-  }
-})
+      console.log('[Button] isDisabled set to:', this.data.isDisabled);
+    },
+
+    valFailure() {
+      console.log("[Button] valFailure called");
+      // 处理失败逻辑
+      if (this) this.setData({ isDisabled: true }); // 重置按钮状态
+    },
+  },
+});

+ 54 - 0
miniprogram/components/record-index/record-index.js

@@ -0,0 +1,54 @@
+// components/record-index/record-index.js
+Component({
+  properties: {
+    id: {
+      type: String,
+      value: ''
+    }
+  },
+
+  data: {
+    loading: true,
+    error: false,
+    charts: [],
+    rect: {
+      width: 0,
+      height: 0
+    }
+  },
+
+  lifetimes: {
+    attached() {
+      this.init();
+    }
+  },
+
+  methods: {
+    async init() {
+      try {
+        const systemInfo = wx.getSystemInfoSync();
+        const rect = {
+          width: systemInfo.windowWidth,
+          height: 300
+        };
+        
+        this.setData({ rect });
+        await this.loadCharts();
+      } catch (error) {
+        console.error('Failed to initialize record-index:', error);
+        this.setData({ error: true, loading: false });
+      }
+    },
+
+    async loadCharts() {
+      try {
+        // TODO: Implement your chart data loading logic here
+        // This should be similar to what you have in the page version
+        this.setData({ loading: false });
+      } catch (error) {
+        console.error('Failed to load charts:', error);
+        this.setData({ error: true, loading: false });
+      }
+    }
+  }
+}); 

+ 6 - 0
miniprogram/components/record-index/record-index.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "ec-canvas": "../../ec-canvas/ec-canvas"
+  }
+} 

+ 22 - 0
miniprogram/components/record-index/record-index.wxml

@@ -0,0 +1,22 @@
+<!--components/record-index/record-index.wxml-->
+<view class="chart-container">
+  <block wx:if="{{loading}}">
+    <view class="loading">加载中...</view>
+  </block>
+  <block wx:elif="{{error}}">
+    <view class="error">加载失败,请重试</view>
+  </block>
+  <block wx:else>
+    <view class="chart">
+      <view wx:for="{{charts}}" wx:key="*this" style="width: {{rect.width}}px; height: {{rect.height}}px;">
+        <ec-canvas 
+          id="dom-{{item.id}}"
+          canvas-id="canvas-{{item.id}}"
+          ec="{{item}}" 
+          force-use-old-canvas="true"
+          disable-scroll="true"
+        ></ec-canvas>
+      </view>
+    </view>
+  </block>
+</view> 

+ 21 - 0
miniprogram/components/record-index/record-index.wxss

@@ -0,0 +1,21 @@
+.chart-container {
+  width: 100%;
+  background: #fff;
+  padding: 20rpx;
+  box-sizing: border-box;
+}
+
+.loading, .error {
+  text-align: center;
+  padding: 40rpx;
+  color: #999;
+}
+
+.chart {
+  width: 100%;
+}
+
+ec-canvas {
+  width: 100%;
+  height: 100%;
+} 

+ 4 - 14
miniprogram/components/tabbar/tabbar.ts

@@ -3,6 +3,7 @@ import Tabbar from "../../miniprogram_npm/tdesign-miniprogram/tab-bar/tab-bar";
 
 Component({
   data: {
+    tabbarHeight: 0,
     pageHeight: "100vh",
     value: "/pages/home/home",
     list: [
@@ -14,7 +15,7 @@ Component({
       },
       {
         value: "/module/chats/pages/index/index",
-        label: "AI对话管家",
+        label: "健康管家",
         icon: "app",
         path: "/module/chats/pages/index/index",
       },
@@ -55,25 +56,14 @@ Component({
           }
         })
         .exec();
-      console.log(this.data.pageHeight, "2222");
     },
     toChatsPage(page: string) {
-      console.log(this.data.patientId, "patientId", page);
-      if (!this.data?.patientId) {
-        wx.showModal({
-          title: "出错了",
-          content: "错误,请重试",
-          showCancel: false,
-        });
-        return;
-      }
       wx.redirectTo({
         url: `${page}?component=guide&isShowGuide=true`,
       });
       wx.setStorageSync("isAnalysis", 3);
     },
-    onChange(e) {
-      console.log(e, "e");
+    onChange(e:any) {
       this.setData({
         value: e.detail.value,
       });
@@ -95,7 +85,7 @@ Component({
   },
   lifetimes: {
     attached() {
-      console.log(this.data.tabbarValue, "tabbarValuetabbarValue");
+      // 赋值
       this.setData({
         value: this.data.tabbarValue,
       });

+ 1 - 1
miniprogram/components/tabbar/tabbar.wxml

@@ -1,4 +1,4 @@
-<t-tab-bar t-class="t-tab-bar" value="{{value}}" bindchange="onChange" theme="tag" split="{{false}}">
+<t-tab-bar t-class="my-tabbar" value="{{value}}" bindchange="onChange" theme="tag" split="{{false}}">
   <t-tab-bar-item wx:for="{{list}}" wx:key="value" value="{{item.value}}" icon="{{item.icon}}" data-id="{{item.id}}">
     {{item.label}}
   </t-tab-bar-item>

+ 1 - 0
miniprogram/lib/request/create.ts

@@ -27,6 +27,7 @@ export function createRequest(option: IRequestCreateConfig) {
     header ??= {};
     header['Authorization'] = meta?.ignoreToken ? '' : await option.token?.() ?? '';
     header['patientId'] = wx.getStorageSync('patientId') ?? '';
+    // header['patientId'] = '783';
     header['doctorId'] = wx.getStorageSync('doctorId') ?? '';
     header['appId'] = miniProgram.appId ?? '';
     header['version'] = miniProgram.version ?? '';

+ 3 - 0
miniprogram/lib/use/use-phone.ts

@@ -27,8 +27,11 @@ export function usePhoneNumber() {
       callback(status)
     },
     getPhoneNumber(event: WechatMiniprogram.ButtonGetPhoneNumber) {
+      console.log('getPhoneNumber-->', event);
       const code = event.detail.code;
+      console.log('getPhoneNumber-->code', code);
       if (!code) return;
+      console.log('getPhoneNumber-->');
       _updateStatus.forEach(cb => cb('loading'))
       request({
         url: `/mobileAccountManage/getAccountPhone`,

+ 1 - 1
miniprogram/module/article/components/science-card/science-card.scss

@@ -5,7 +5,7 @@
   flex-direction: row;
   align-items: center;
   min-height: 125px;
-  padding: 12px;
+  padding: 12px 0;
   box-sizing: border-box;
 
   .cover {

二進制
miniprogram/module/care/assets/icon/icon_effect@3x.png


二進制
miniprogram/module/care/assets/icon/icon_health@2x.png


二進制
miniprogram/module/care/assets/icon/icon_report.png


二進制
miniprogram/module/care/assets/icon/icon_scheme@2x.png


+ 13 - 0
miniprogram/module/care/pages/care/verifyRecord.json

@@ -0,0 +1,13 @@
+{
+  "renderer": "skyline",
+  "navigationBarTextStyle": "white",
+  "navigationBarBackgroundColor": "#0f2226",
+  "backgroundColor": "#0f2226",
+  "backgroundColorContent": "#0f2226",
+  "backgroundColorTop": "#0f2226",
+  "backgroundColorBottom": "#0f2226",
+  "component": true,
+  "usingComponents": {
+    "t-icon": "tdesign-miniprogram/icon/icon"
+  }
+}

+ 72 - 0
miniprogram/module/care/pages/care/verifyRecord.scss

@@ -0,0 +1,72 @@
+.page-container {
+  background-color: #f3f3f3;
+  padding-top: 10px;
+  height: calc(100vh - 44px);
+  box-sizing: border-box;
+  -webkit-overflow-scrolling: touch;
+  .verify-record-page {
+    background: white;
+    // padding: 24rpx 0;
+    padding-bottom: 50px;
+  }
+  .title {
+    font-size: 32rpx;
+    font-weight: bold;
+    padding: 24rpx 32rpx 12rpx 32rpx;
+    color: #222;
+  }
+  .record-card {
+    background: #fff;
+    border-radius: 16rpx;
+    margin: 0 24rpx 24rpx 24rpx;
+    padding: 24rpx 24rpx 18rpx 24rpx;
+    box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.03);
+  }
+  .record-header {
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #222;
+    margin-bottom: 12rpx;
+    display: flex;
+    align-items: center;
+  }
+  .record-index {
+    margin-right: 8rpx;
+  }
+  .record-time {
+    color: #222;
+  }
+  .record-row {
+    font-size: 26rpx;
+    color: #666;
+    margin-bottom: 8rpx;
+    display: flex;
+    flex-wrap: wrap;
+  }
+  
+  .opt-img {
+    display: flex;
+    justify-content: baseline;
+    .img-box {
+      width: 300rpx;
+      height: 200rpx;
+      border-radius: 10rpx;
+    }
+  }
+  .label {
+    color: #999;
+    margin-right: 8rpx;
+  }
+}
+.empty-state {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  min-height: 300rpx;
+  padding: 40rpx;
+  
+  .empty-text {
+    color: #999;
+    font-size: 28rpx;
+  }
+}

+ 56 - 0
miniprogram/module/care/pages/care/verifyRecord.ts

@@ -0,0 +1,56 @@
+import { Get, Post } from "../../../../lib/request/method";
+// import { getVerifyRecordMethod } from "../../../health/request";
+Page({
+  onLoad(options: { id: number }) {
+    console.log("options", options);
+    if (options.id) {
+      this.getVerifyRecordList(options.id);
+    }
+  },
+  // 获取核销记录列表
+  async getVerifyRecordList(id: number) {
+    try {
+      const res = await Post(
+        `/patientCrManage/pofflineCp/${id}`,
+        {},
+        {
+          transform({ data }: any) {
+            return data;
+          },
+        }
+      );
+      if (res && res.length > 0) {
+        this.setData({
+          recordList: res,
+        });
+      } else {
+        this.setData({
+          recordList: [],
+        });
+      }
+    } catch (error) {
+      console.log(error, "核销记录列表");
+    }
+  },
+  data: {
+    id: "",
+    recordList: [
+      // {
+      //   id: 1,
+      //   time: "2025-02-04 15:45:12",
+      //   doctor: "余医生",
+      //   feedback: "气喘症状有所缓解",
+      //   acupoint: "足三里、三阴交、气海、关元",
+      //   url: "https://wx.hzliuzhi.com/media/healthManager/wx/share.jpg"
+      // },
+      // {
+      //   id: 2,
+      //   time: "2025-02-11 15:45:12",
+      //   doctor: "余医生",
+      //   feedback: "气喘症状有所缓解",
+      //   acupoint: "足三里、三阴交、气海、关元",
+      //   url: "https://wx.hzliuzhi.com/media/healthManager/wx/share.jpg"
+      // }
+    ],
+  },
+});

+ 33 - 0
miniprogram/module/care/pages/care/verifyRecord.wxml

@@ -0,0 +1,33 @@
+<t-navbar title="核销记录" left-arrow />
+<scroll-view class="page-container" scroll-y>
+ 
+<view class="verify-record-page" wx:if="{{recordList.length>0}}">
+  <block wx:for="{{recordList}}" wx:key="id">
+    <view class="record-card">
+      <view class="record-header">
+        <text class="record-index">{{index + 1}}、</text>
+        <text class="record-time">{{item.operateTime}}</text>
+      </view>
+      <view class="record-row" wx:if="{{item.operateBy}}">
+        <text class="label">操作人:</text>
+        <text style="color:black">{{item.operateBy}}</text>
+      </view>
+      <view class="record-row" wx:if="{{item.feedback}}">
+        <text class="label">上一次治疗反馈:</text>
+        <text style="color:black">{{item.feedback}}</text>
+      </view>
+      <view class="record-row" wx:if="{{item.acuPointNames}}">
+        <text class="label">穴位:</text>
+        <text style="color:black">{{item.acuPointNames}}</text>
+      </view>
+       <view class="record-row opt-img" wx:if="{{item.photo}}">
+        <text class="label">操作照片:</text>
+     <image src="{{item.photo}}" class="img-box" />
+      </view>
+    </view>
+  </block>
+</view>
+ <view wx:else class="empty-state">
+    <text class="empty-text">暂无数据</text>
+  </view>
+</scroll-view>

+ 25 - 0
miniprogram/module/care/pages/careDetail/careDetail.json

@@ -0,0 +1,25 @@
+{
+  "renderer": "webview",
+  "navigationBarTextStyle": "white",
+  "navigationBarBackgroundColor": "#0f2226",
+  "backgroundColor": "#0f2226",
+  "backgroundColorContent": "#0f2226",
+  "backgroundColorTop": "#0f2226",
+  "backgroundColorBottom": "#0f2226",
+  "component": true,
+  "usingComponents": {
+    "t-tag": "tdesign-miniprogram/tag/tag",
+    "t-icon": "tdesign-miniprogram/icon/icon",
+    "record-care": "/module/charts/record-care/record-care",
+    "record-index": "/module/charts/record-index/record-index",
+    "t-image": "tdesign-miniprogram/image/image",
+    "t-button": "tdesign-miniprogram/button/button",
+    "t-drawer": "tdesign-miniprogram/drawer/drawer",
+    "t-skeleton": "tdesign-miniprogram/skeleton/skeleton",
+    "t-empty": "tdesign-miniprogram/empty/empty"
+  },
+  "componentPlaceholder": {
+    "record-care": "view",
+    "record-index": "view"
+  }
+}

+ 557 - 0
miniprogram/module/care/pages/careDetail/careDetail.scss

@@ -0,0 +1,557 @@
+
+
+
+/* module/chats/pages/index/index.wxss */
+
+.page-scroll__container {
+  box-sizing: border-box;
+  overflow-y: auto;
+  padding-top: 10px;
+  // padding-bottom: calc(100rpx + env(safe-area-inset-bottom));
+  height: 100vh;
+}
+.fullscreen-bg {
+  position: relative;
+  height: 100vh;
+  background-image: url("https://wx.hzliuzhi.com:4433/manager/file/statics/2025/06/17/bg_interview_20250617141722A079.png");
+  background-size: 100% 100%;
+  background-repeat: no-repeat;
+  background-color: #f5f6f7;
+}
+.detail-container{
+  background-color: #F9F9F9;
+  padding: 24rpx 24rpx 18rpx 32rpx;
+  margin: auto;
+  width: 92%;
+  border-radius: 0 0 16px 16px;
+}
+.detail-box {
+  padding: 10px 0 0 0;
+  width: 96%;
+}
+.info-card {
+  background: #fff;
+  background: linear-gradient(180deg, #d6e4f5 0%, #f3f4f6 100%);
+  border-radius: 16px;
+border-top: 1px solid white;
+  box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.03);
+  font-size: 28rpx;
+  margin: 24rpx 24rpx 0 0rpx;
+}
+.row {
+  display: flex;
+  align-items: center;
+  margin-bottom: 20rpx;
+  color: #222;
+  font-size: 28rpx;
+}
+.delivery{
+  margin-bottom: 20rpx;
+  color: #222;
+}
+.card-content{
+  padding: 10px 0 0px 0px;
+  width: 96%;
+  background: white;
+  margin: auto;
+}
+.status-tag {
+  background-color: #1976d2;
+  margin: 0 0px 10px 16px;
+  color: #fff;
+  width: 100rpx;
+  height: 26px;
+  line-height: 26px;
+  padding: 4rpx 16rpx;
+  border-radius: 8rpx;
+  font-size: 28rpx;
+  text-align: center;
+}
+.status-icon {
+  margin-right: 12rpx;
+}
+.card-title {
+  font-size: 16px;
+  font-weight: 600;
+  color: black;
+}
+.label {
+  color: #999;
+  min-width: 90rpx;
+  display: inline-block;
+}
+.address-block {
+  background: #EBEEF4;
+  border-radius: 10rpx;
+  padding: 12rpx;
+  color: #666;
+  margin-bottom: 12rpx;
+  font-size: 28rpx;
+  line-height: 1.6;
+}
+.status-card {
+  border-radius: 16px;
+  margin: 24px auto;
+  width: 95%;
+
+  background: -webkit-linear-gradient(top,#D6E4F5,#D6E4F5,white);
+
+  // background: linear-gradient(180deg, #d6e4f5 0%, #f3f4f6 100%);
+  padding: 15px 10px 10px 10px;
+}
+.icon {
+  width: 20px;
+  height: 20px;
+  margin-right: 10rpx;
+}
+.content-box {
+  background-color: white;
+  border-radius: 10px;
+  padding: 12px 15px;
+}
+.scheme-outer {
+  background: linear-gradient(135deg, #e3f0ff 0%, #b3d8fd 100%);
+  border-radius: 20rpx;
+  padding: 24rpx 0 0 0;
+  min-height: 100vh;
+}
+.scheme-header {
+  display: flex;
+  align-items: center;
+  padding: 0 32rpx 16rpx 32rpx;
+}
+.header-icon {
+  border: 1.5rpx dashed #1976d2;
+  border-radius: 8rpx;
+  background: #fff;
+  margin-right: 16rpx;
+  padding: 6rpx;
+}
+.header-title {
+  font-size: 30rpx;
+  font-weight: 600;
+  color: #222;
+  margin-left: 12rpx;
+}
+.scheme-card {
+  background: #fff;
+  border-radius: 16rpx;
+  margin: 0 0rpx 24rpx 0rpx;
+  padding: 24rpx 24rpx 18rpx 30rpx;
+  box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.03);
+}
+.scheme-title {
+  font-size: 28rpx;
+  font-weight: 600;
+  color: #222;
+  text-align: center;
+  margin-bottom: 12rpx;
+}
+.divider {
+  height: 1rpx;
+  background: #eee;
+  margin: 12rpx 0;
+}
+.scheme-img {
+  width: 280rpx;
+  height: 160rpx;
+  display: block;
+  margin: 0 auto 16rpx auto;
+  border-radius: 12rpx;
+  border: 1px solid #e5e5e5;
+}
+.scheme-row {
+  font-size: 26rpx;
+  color: #222;
+  margin-bottom: 15rpx;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+}
+.scheme-row.between {
+  justify-content: space-between;
+}
+.scheme-row.light {
+  color: #999;
+  font-size: 14px;
+}
+.success {
+  color: #2ec4b6;
+  margin: 0 4rpx;
+}
+.link {
+  display: flex;
+  align-items: center;
+  color: #1976d2;
+  margin-left: 16rpx;
+  font-weight: 500;
+  font-size: 26rpx;
+
+}
+.text-gray{
+  color: #999;
+  font-size: 14px;
+}
+.opt-box{
+ position: absolute;
+ right: 10px;
+}
+.desc-row {
+  display: flex;
+  align-items: flex-start;
+  margin-bottom: 8rpx;
+}
+.desc-label {
+  font-weight: bold;
+  color: #222;
+  margin-right: 8rpx;
+  font-size: 26rpx;
+}
+.desc-content {
+  color: #222;
+  font-size: 26rpx;
+  flex: 1;
+  word-break: break-all;
+}
+.scheme-bottom {
+  position: relative;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  background: #f6f7fa;
+  border-radius: 8rpx;
+  padding: 30rpx;
+  margin-top: 12rpx;
+  font-size: 26rpx;
+}
+.next-time {
+  color: #1976d2;
+}
+.tongue-list-outer {
+  // background: #f6faff;
+  background-color: white;
+  border-radius: 18rpx;
+  padding: 24rpx 0 24rpx 0;
+  // margin: 24rpx;
+  margin-top: 10px;
+  box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
+}
+.tongue-list-title {
+  text-align: center;
+  font-size: 32rpx;
+  font-weight: 600;
+  color: #222;
+  // margin-bottom: 18rpx;
+  margin: 10px 0 15px 0;
+}
+.tongue-list-table {
+  background: #fff;
+  border: 1px solid #e5e5e5;
+}
+
+.header-cell {
+  flex: 1; /* 其他列占用剩余空间 */
+  text-align: center;
+  position: relative; /* 使边框定位相对 */
+}
+
+.header-cell:not(:last-child) {
+  border-right: 1rpx solid #e5e5e5; /* 添加右边框,排除最后一个标题 */
+}
+
+.cell {
+  flex: 1;
+  padding: 18rpx;
+
+  .cell-content {
+    display: flex;
+    align-items: center;
+
+    .column {
+      flex: 1;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+
+    .divider {
+      width: 1px;
+      height: 24rpx;
+      background: #eee;
+      margin: 0 16rpx;
+    }
+  }
+}
+.tongue-img {
+  width: 80rpx;
+  height: 80rpx;
+  border-radius: 8rpx;
+  object-fit: contain;
+  background: #f3f3f3;
+}
+.report-btn {
+  margin-top: 8rpx;
+  display: flex;
+  align-items: center;
+  color: #1976d2;
+  background: #eaf2ff;
+  border-radius: 8rpx;
+  font-size: 24rpx;
+  padding: 4rpx 12rpx;
+  cursor: pointer;
+}
+.report-btn t-icon {
+  margin-right: 6rpx;
+}
+.symptom-list-outer {
+  background: white;
+  border-radius: 18rpx;
+  padding: 10px 16px 16px 16px;
+  // margin: 24rpx;
+  margin-top: 10px;
+  margin-bottom: 24rpx;
+  box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
+}
+.symptom-list-title {
+  text-align: center;
+  font-size: 32rpx;
+  font-weight: 600;
+  color: #222;
+  margin: 10px 10px 15px 10px;
+}
+.symptom-list-table {
+  background: #fff;
+  // border-radius: 12rpx;
+  overflow: auto;
+  border: 1px solid #e5e5e5;
+}
+.table-header {
+  display: flex;
+  background: #EEEEEE;
+  border-bottom: 1rpx solid #e5e5e5;
+  padding: 20px;
+}
+
+.table-row {
+  display: flex;
+  align-items: center;
+  border-bottom: 1rpx solid #f0f0f0;
+  background: #fff;
+  min-height: 80rpx;
+}
+.tongue-list-outer{
+  padding: 10px 16px 16px 16px;
+}
+.cell {
+  flex: 1;
+  text-align: center;
+  // padding: 18rpx 0;
+  font-size: 28rpx;
+  color: #222;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  // border-right: 1rpx solid #e5e5e5;
+  &:last-child {
+    border-right: none;
+  }
+}
+.symptom-cell {
+  padding: 0;
+  display: flex;
+  justify-content: center;
+  align-items: stretch;
+  // width: 200px; /* 设置固定宽度 */
+  // overflow-x: auto; /* 允许整体横向滚动 */
+}
+.symptom-scroll {
+  width: 100%;
+  overflow-x: auto; /* 允许整体横向滚动 */
+  // flex: 1; /* 使其占据剩余空间 */
+}
+.symptom-cols {
+  display: flex;
+  width: auto; /* 允许根据内容宽度自适应 */
+}
+.symptom-col {
+  flex: none; /* 不使用 flex 属性,确保每个症状列宽度一致 */
+  text-align: center;
+  padding: 0 8rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  min-height: 48rpx;
+  width: 100px; /* 设置固定宽度以确保对齐 */
+  border-right: 1rpx solid #e5e5e5;
+  font-size: 28rpx;
+  box-sizing: border-box;
+
+  &.empty {
+    color: #999; /* 占位符颜色 */
+    font-style: italic; /* 斜体显示 */
+  }
+}
+.highlight {
+  color: #2ec4b6;
+  font-weight: 600;
+}
+.chart-container {
+  width: 100%;
+  height: 400rpx;
+  margin: 20rpx 0;
+  background: #fff;
+  border-radius: 8rpx;
+  overflow: hidden;
+}
+
+ec-canvas {
+  width: 100%;
+  height: 100%;
+}
+.icon{
+  width: 23px;
+  height: 23px;
+  margin-right: 10rpx;
+}
+.header-cell.date-cell {
+  width: 100px; /* 设置固定宽度 */
+  flex: none; /* 不使用 flex 属性 */
+  text-align: center; /* 可选:居中对齐 */
+}
+
+.cell.date-cell {
+  width: 100px; /* 设置与标题相同的固定宽度 */
+  text-align: center; /* 可选:居中对齐 */
+  flex: none;
+}
+
+.table-row:nth-child(odd) {
+  background-color: #F9F9F9; /* 设置偶数行的背景颜色 */
+}
+.date-cells:nth-child(odd){
+  background-color: #F9F9F9;
+}
+.index-title{
+  text-align: center;
+  font-size: 28rpx;
+  color: #000;
+  font-size: 16px;
+  padding: 20px 0 15px 0;
+  border-bottom: 1px solid #e5e5e5;
+  width: 92%;
+  margin: auto;
+  font-weight: 500;
+}
+.index-container{
+  background-color: white;
+  border-radius: 10px;
+  width: 98%;
+  padding-left:10px;
+}
+
+// ====
+/* 基础样式 */
+.container {
+  display: flex;
+  flex-direction: column;
+  // height: 100vh;
+  width: 100%;
+}
+
+/* 表头样式 */
+.table-headers {
+  display: flex;
+  height: 80rpx;
+  background: #EEEEEE;
+  position: sticky;
+  top: 0;
+  z-index: 10;
+  padding: 10px 20px;
+}
+
+.date-header {
+  width: 200rpx;
+  padding: 20rpx 0;
+  text-align: center;
+  border-right: 1px solid #ddd;
+  flex-shrink: 0;
+}
+
+.symptoms-header-scroll {
+  flex: 1;
+  overflow: hidden;
+}
+
+.symptoms-header {
+  padding: 20rpx;
+  min-width: 100%;
+  text-align: center;
+}
+
+/* 表格内容 */
+.table-body {
+  display: flex;
+  flex: 1;
+  overflow: hidden;
+  background-color: #f5f5f5;
+}
+
+/* 固定日期列 */
+.date-column {
+  width: 240rpx;
+  overflow-y: auto;
+  border-right: 1px solid #ddd;
+  background-color: white;
+}
+
+.date-cells {
+  // padding: 20rpx;
+  text-align: center;
+  border-bottom: 1px solid #eee;
+  height: 100rpx;
+  box-sizing: border-box;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 10px 0;
+}
+
+/* 可滚动症状列 */
+.symptoms-column {
+  flex: 1;
+  overflow: auto;
+  background-color: white;
+  border-right: 1px solid #eee;
+}
+
+
+.symptoms-grid {
+  display: flex;
+  flex-direction: column;
+  border-right: 1px solid #eee;
+}
+
+.symptoms-row {
+  display: flex;
+  min-width: fit-content;
+  border-bottom: 1px solid #eee;
+  height: 100rpx;
+  box-sizing: border-box;
+  background-color: white;
+}
+.symptom-row:nth-child(odd){
+  background-color: #F9F9F9;
+}
+.symptom-cells {
+  min-width: 200rpx;
+  padding: 20rpx;
+  border-right: 1px solid #eee;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  white-space: nowrap;
+}

+ 162 - 0
miniprogram/module/care/pages/careDetail/careDetail.ts

@@ -0,0 +1,162 @@
+import { Post } from "../../../../lib/request/method";
+import { fromHealthReportSymptom } from "../../../../utils/util";
+Page({
+  onLoad(options) {
+    // console.log("options", options);
+    if (options.id) {
+      wx.setStorageSync("careId", Number(options.id));
+      this.getCareDetail(Number(options.id));
+    }
+    const patientName = wx.getStorageSync("patientName");
+    if (patientName) {
+      this.setData({
+        patientName,
+      });
+    }
+  },
+
+  data: {
+    patientName: "",
+    careDetail: {},
+    healthReports: [],
+    statusText: "未知状态",
+    loading: true,
+    isShow: false,
+    isShowDelivery: false,
+  },
+  // 获取调理详情
+  async getCareDetail(id: number) {
+    wx.showLoading({
+      title: "加载中",
+      mask: true,
+    });
+    try {
+      const res = await Post(
+        `/patientCrManage/getPcrProcessById/${id}`,
+        {},
+        {
+          transform({ data }: any) {
+            return data;
+          },
+        }
+      );
+      if (res) {
+        wx.hideLoading();
+        // 设置状态文本
+        const statusMap: Record<string, string> = {
+          "0": "待付款",
+          "1": "已作废",
+          "2": "用户取消",
+          "3": "未开始",
+          "4": "调理中",
+          "5": "已完结",
+        };
+        const statusText = statusMap[res.progress] || "未知状态";
+        this.setData({
+          loading: false,
+          careDetail: res,
+          statusText,
+        });
+        let isShowDelivery = false;
+        console.log(res.items, "服务包详情数据");
+        if (res.items.length > 0) {
+          isShowDelivery = res.items.some((item: any) => {
+            return item.conditioningProgramDetail?.isDelivery === "Y";
+          });
+        }
+        this.setData({
+          isShowDelivery,
+        });
+        var data = res.items.find(
+          (item: any) =>
+            Array.isArray(item.healthAnalysisReports) &&
+            item.healthAnalysisReports.length > 0
+        );
+        if (data) {
+          const items = data.healthAnalysisReports.map((report: any) => {
+            return {
+              ...report,
+              symptoms: fromHealthReportSymptom(report).items,
+            };
+          });
+          this.setData({
+            healthReports: items,
+          });
+        }
+        // 设置页面标题
+        if (res.conditioningWrapName) {
+          wx.setNavigationBarTitle({
+            title: res.conditioningWrapName,
+          });
+        }
+      } else {
+        wx.hideLoading();
+        this.setData({
+          loading: false,
+          careDetail: {},
+        });
+      }
+      if (JSON.stringify(this.data.careDetail) !== "{}") {
+        this.setData({
+          isShow: true,
+        });
+      } else {
+        this.setData({
+          isShow: false,
+        });
+      }
+    } catch (error) {
+      console.log(error);
+      wx.hideLoading();
+      this.setData({
+        isShow: false,
+        loading: false,
+      });
+    }
+  },
+
+  onRecord(e: any) {
+    const id = e.currentTarget.dataset.id;
+    // 跳转核销记录
+    wx.navigateTo({
+      url: `/module/care/pages/care/verifyRecord?id=${id}`,
+      success: () => {
+        // console.log("跳转成功");
+      },
+      fail: (error) => {
+        console.error("跳转失败:", error);
+      },
+    });
+  },
+  onOffline(e: any) {
+    // 跳转线下操作
+  },
+  onReport(e: WechatMiniprogram.TouchEvent) {
+    wx.navigateTo({
+      url: "/module/care/pages/reportRecord/reportRecord",
+    });
+  },
+  onSeeReport(e: WechatMiniprogram.TouchEvent) {
+    const id = e.currentTarget.dataset.id;
+    if (id) {
+      wx.navigateTo({ url: `/module/health/pages/report/report?id=${id}` });
+    } else {
+      wx.showToast({
+        title: "暂无数据",
+        icon: "none",
+      });
+    }
+  },
+  onPreviewImage(e: WechatMiniprogram.TouchEvent) {
+    const url = e.currentTarget.dataset.url;
+    wx.previewImage({
+      current: url,
+      urls: [url],
+      showmenu: true,
+    });
+  },
+
+  onHide() {
+    wx.removeStorageSync("careId");
+  },
+});

+ 249 - 0
miniprogram/module/care/pages/careDetail/careDetail.wxml

@@ -0,0 +1,249 @@
+<view class="fullscreen-bg">
+  <t-navbar title="服务包详情" left-arrow />
+  <scroll-view 
+    class="page-scroll__container" 
+    scroll-y 
+  >
+    <block wx:if="{{!loading}}">
+      <block wx:if="{{isShow}}">
+        <!-- 调理中卡片 -->
+        <view class="info-card card-content">
+          <view class="status-tag">
+            {{statusText}}
+          </view>
+          <view class="detail-container">
+            <view class="detail-box">
+              <view class="row"><text class="label">开具时间:</text>{{careDetail.createTime}}</view>
+              <view class="row"><text class="label">开具医生:</text>{{careDetail.createBy}}</view>
+              <view class="delivery" wx:if="{{isShowDelivery}}">
+              <view style="margin-bottom:10px"> 
+                <text class="label">配送:</text>
+                <text>是</text>
+              </view>
+                <view class="address-block">
+                 <view>
+                 {{careDetail.provinceName}}{{careDetail.cityName}}{{careDetail.areaName}}{{careDetail.detailAddress}}
+                  </view>
+                  <view>
+                  <text style="margin-right:10px"> {{patientName}}</text>
+                  <text>{{careDetail.phone}}</text>
+                  
+                  </view>
+                </view>
+              </view>
+              <view class="row"><text class="label">价格:</text>{{careDetail.cost}}元</view>
+            </view>
+          </view>
+        </view>
+        <!-- 健康状况卡片 -->
+        <view class="info-card status-card">
+          <view class="row">
+            <image class="icon" src="../../assets/icon/icon_health@2x.png" mode="heightFix" />
+            <text class="card-title">健康状况</text>
+          </view>
+          <view class="content-box">
+            <view class="row"><text class="label">程度:</text>{{careDetail.healthAnalysisReport.willillDegreeName}}</view>
+            <view class="row"><text class="label">表现:</text>{{careDetail.healthAnalysisReport.willillFunctionName}}</view>
+            <view class="row"><text class="label">体质:</text>{{careDetail.healthAnalysisReport.constitutionGroupName}}</view>
+            <view class="row"><text class="label">证素:</text>{{careDetail.healthAnalysisReport.factorItemSummary}}</view>
+            <view class="row"><text class="label">证型:</text>{{careDetail.healthAnalysisReport.diagnoseSyndromeSummary}}</view>
+          </view>
+        </view>
+        <!-- 调养方案 -->
+        <view class="info-card status-card">
+          <view class="row">
+            <image class="icon" src="../../assets/icon/icon_scheme@2x.png" mode="heightFix" />
+            <text class="card-title">调养方案</text>
+          </view>
+          <view wx:for="{{careDetail.items}}" wx:key="id">
+            <!-- 线下操作-->
+            <view class="scheme-card" wx:if="{{item.conditioningProgramDetail.isOffline && item.conditioningProgramDetail.isOffline==='Y'}}">
+              <view class="scheme-title" wx:if="{{item.conditioningProgramDetail && item.conditioningProgramDetail.name && item.conditioningProgramDetail.name!=='null'}}">{{item.conditioningProgramDetail.name}}</view>
+              <view class="divider"></view>
+              <image class="scheme-img" src="{{item.conditioningProgramDetail.photo}}" mode="aspectFill" wx:if="{{item.conditioningProgramDetail.photo}}" />
+              <view class="scheme-row light"><text class="text-gray" wx:if="{{item.arrangeDate || item.arrangeDate!==null}}">下次时间:</text>{{item.arrangeDate}}</view>
+              <view class="scheme-row between">
+                <text>
+                  <text class="text-gray">已完成:</text>
+                  <text class="success">
+                    <text> {{item.finishCount}}次</text>
+                    <text style="margin:0 5px;color:black">/</text>
+                    <text style="color:black">{{item.totalMeasure}}次</text>
+                  </text>
+                </text>
+                <text class="link" bindtap="onRecord" data-id="{{item.id}}" wx:if="{{item.conditioningProgramDetail.isOffline && item.conditioningProgramDetail.isOffline==='Y'}}">核销记录</text>
+              </view>
+              <view class="scheme-row">
+                <text class="text-gray">频次:</text>
+                每 {{item.frequencyType}}天{{item.frequencyMeasure}}{{item.conditioningProgramDetail.cpFixedPricingRule.convertUnit || '次'}}
+              </view>
+              <view class="scheme-row">
+                <text class="text-gray">机构:</text>
+                {{item.conditioningProgramDetail.conditioningProgramSupplierName}}
+              </view>
+              <view class="scheme-bottom" wx:if="{{item.actualStartDate}}">
+                <text class="next-time" wx:if="{{item.arrangeDate}}">下一次时间:{{item.arrangeDate}}</text>
+                <view class="link opt-box" bindtap="onOffline" data-id="{{item.id}}">
+                  <t-icon name="app" size="24rpx" color="#1976d2" />
+                  <text style="margin-left:10px">线下操作</text>
+                </view>
+              </view>
+            </view>
+            <!-- 线上操作 -->
+            <view class="scheme-card" wx:if="{{item.conditioningProgramDetail.isOffline && item.conditioningProgramDetail.isOffline==='N'}}">
+              <view class="scheme-title">{{item.conditioningProgramDetail.name}}</view>
+              <view class="divider"></view>
+              <image class="scheme-img" src="{{item.conditioningProgramDetail.photo}}" mode="aspectFill" wx:if="{{item.conditioningProgramDetail.photo}}" />
+              <view class="scheme-row light">
+                <text class="text-gray">数量:</text>
+                {{item.totalMeasure}}
+              </view>
+              <view class="scheme-row between">
+                <text>
+                  <text class="label between">频次:</text>
+                  <text>每{{item.frequencyType}}天{{item.frequencyMeasure}}{{item.conditioningProgramDetail.cpFixedPricingRule.convertUnit}}</text>
+                </text>
+              </view>
+              <view class="desc-row">
+                <text class="desc-label">{{item.remark || ''}}</text>
+              </view>
+            </view>
+            <!-- 健康评估-->
+            <view class="scheme-card" wx:if="{{item.conditioningProgramDetail.conditioningProgramType && item.conditioningProgramDetail.conditioningProgramType==='健康评估'}}">
+              <view class="scheme-title">{{item.conditioningProgramDetail.name}}</view>
+              <view class="divider"></view>
+              <image class="scheme-img" src="{{item.conditioningProgramDetail.photo}}" mode="aspectFill" wx:if="{{item.conditioningProgramDetail.photo}}" />
+              <view class="scheme-row between" style="margin-top:15px">
+                <text>
+                  <text class="text-gray">已完成:</text>
+                  <text class="success">
+                    <text> {{item.finishCount}}次</text>
+                    <text style="margin:0 5px;color:black">/</text>
+                    <text style="color:black">{{item.totalMeasure}}次</text>
+                  </text>
+                </text>
+                <text class="link" bindtap="onReport" data-id="{{item.id}}" wx:if="{{item.conditioningProgramDetail.conditioningProgramType && item.conditioningProgramDetail.conditioningProgramType==='健康评估'}}">健康分析报告</text>
+              </view>
+              <view class="scheme-row">
+                <text class="text-gray">频次:</text>
+                <view wx:if="{{item.frequencyType==='不限'}}">{{item.frequencyType}}{{item.conditioningProgramDetail.cpFixedPricingRule.convertUnit}}</view>
+                <view wx:else>
+                  每 {{item.frequencyType}}天{{item.frequencyMeasure}}{{item.conditioningProgramDetail.cpFixedPricingRule.convertUnit}}
+                </view>
+              
+              </view>
+              <view class="desc-row">
+                <text class="text-gray">操作指南:</text>
+                <text class="desc-label">{{item.remark}}</text>
+              </view>
+            </view>
+          </view>
+        </view>
+        <!--调养效果  -->
+        <view class="info-card status-card">
+          <view class="row">
+            <image class="icon" src="../../assets/icon/icon_effect@3x.png" mode="heightFix" />
+            <text class="header-title">调养效果</text>
+          </view>
+          <!--调养效果  -->
+          <record-care></record-care>
+          <!--舌象  -->
+          <view class="tongue-list-outer">
+            <view class="tongue-list-title">舌象</view>
+            <view class="tongue-list-table">
+              <view class="table-header">
+                <view class="header-cell date-cell">日期</view>
+                <view class="header-cell">舌面</view>
+                <view class="header-cell">舌底</view>
+              </view>
+              <block wx:for="{{healthReports}}" wx:key="healthAnalysisReportId">
+                <view class="table-row">
+                  <view class="cell date-cell">
+                    <view>{{item.time4}}</view>
+                    <view class="report-btn" bindtap="onSeeReport" data-date="{{item.time4}}" data-id="{{item.healthAnalysisReportId}}">
+                      <t-icon name="file" size="20rpx" color="#1976d2" />
+                      <text>查看报告</text>
+                    </view>
+                  </view>
+                  <view class="cell">
+                    <t-image wx:if="{{item.upImg}}" src="{{item.upImg}}" mode="aspectFit" width="80rpx" height="80rpx" shape="round" bind:tap="onPreviewImage" data-url="{{item.upImg}}" />
+                    <t-icon wx:else name="image" size="48rpx" color="#ccc" />
+                  </view>
+                  <view class="cell">
+                    <t-image wx:if="{{item.downImg}}" src="{{item.downImg}}" mode="aspectFit" width="80rpx" height="80rpx" shape="round" bind:tap="onPreviewImage" data-url="{{item.downImg}}" />
+                    <t-icon wx:else name="image" size="48rpx" color="#ccc" />
+                  </view>
+                </view>
+              </block>
+            </view>
+          </view>
+          <!--面象  -->
+          <view class="tongue-list-outer">
+            <view class="tongue-list-title">面象</view>
+            <view class="tongue-list-table">
+              <view class="table-header">
+                <view class="header-cell date-cell">日期</view>
+                <view class="header-cell">面部</view>
+              </view>
+              <block wx:for="{{healthReports}}" wx:key="healthAnalysisReportId">
+                <view class="table-row">
+                  <view class="cell date-cell">
+                    <view>{{item.time4}}</view>
+                    <view class="report-btn" bindtap="onSeeReport" data-date="{{item.time4}}" data-id="{{item.healthAnalysisReportId}}">
+                      <t-icon name="file" size="20rpx" color="#1976d2" />
+                      <text>查看报告</text>
+                    </view>
+                  </view>
+                  <view class="cell">
+                    <t-image wx:if="{{item.faceImg}}" src="{{item.faceImg}}" mode="aspectFit" width="80rpx" height="80rpx" shape="round" bind:tap="onPreviewImage" data-url="{{item.faceImg}}" />
+                    <t-icon wx:else name="image" size="48rpx" color="#ccc" />
+                  </view>
+                </view>
+              </block>
+            </view>
+          </view>
+          <!--症状  -->
+          <view class="symptom-list-outer">
+            <view class="symptom-list-title">症状</view>
+            <view class="container">
+              <!-- 表头 -->
+              <view class="table-headers">
+                <view class="date-header">日期</view>
+                <view class="symptoms-header-scroll">
+                  <view class="symptoms-header">症状</view>
+                </view>
+              </view>
+              <!-- 表格内容 -->
+              <view class="table-body">
+                <!-- 固定日期列 -->
+                <view class="date-column">
+                  <view wx:for="{{healthReports}}" wx:key="healthAnalysisReportId" class="date-cells">
+                    {{item.time4}}
+                  </view>
+                </view>
+                <!-- 可滚动症状列 -->
+                <scroll-view class="symptoms-column" scroll-x>
+                  <view class="symptoms-grid">
+                    <view wx:for="{{healthReports}}" wx:key="healthAnalysisReportId" class="symptoms-row">
+                      <view wx:for="{{item.symptoms}}" wx:key="index" class="symptom-cells" wx:for-item="symptom">
+                        {{symptom.name || ' '}}
+                      </view>
+                    </view>
+                  </view>
+                </scroll-view>
+              </view>
+            </view>
+          </view>
+          <!--指标  -->
+          <view class="index-container">
+            <view class="index-title">指标</view>
+             <record-index></record-index>
+          </view>
+        </view>
+      </block>
+      <block wx:else>
+        <t-empty icon="info-circle-filled" description="暂无数据" />
+      </block>
+    </block>
+  </scroll-view>
+</view>

+ 17 - 0
miniprogram/module/care/pages/offlineTreatment/offlineTreatment.json

@@ -0,0 +1,17 @@
+{
+  "renderer": "skyline",
+  "navigationBarTextStyle": "white",
+  "navigationBarBackgroundColor": "#0f2226",
+  "backgroundColor": "#0f2226",
+  "backgroundColorContent": "#0f2226",
+  "backgroundColorTop": "#0f2226",
+  "backgroundColorBottom": "#0f2226",
+  "component": true,
+  "usingComponents": {
+    "t-icon": "tdesign-miniprogram/icon/icon",
+    "t-navbar": "tdesign-miniprogram/navbar/navbar",
+    "t-tabs": "tdesign-miniprogram/tabs/tabs",
+    "t-tab-panel": "tdesign-miniprogram/tab-panel/tab-panel",
+    "t-empty": "tdesign-miniprogram/empty/empty"
+  }
+}

+ 97 - 0
miniprogram/module/care/pages/offlineTreatment/offlineTreatment.scss

@@ -0,0 +1,97 @@
+.page-container {
+  background-color: #f3f3f3;
+  padding-top: 10px;
+  height: calc(100vh - 44px);
+  box-sizing: border-box;
+  -webkit-overflow-scrolling: touch;
+}
+
+.offline-treatment-page {
+  background: #f6f7fa;
+  min-height: 100vh;
+}
+
+.page-container {
+  padding: 24rpx 0;
+}
+
+.treatment-card {
+  background: #fff;
+  border-radius: 16rpx;
+  margin: 0 24rpx 24rpx 24rpx;
+  padding: 24rpx 24rpx 18rpx 24rpx;
+  box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.03);
+}
+
+.treatment-title {
+  font-size: 28rpx;
+  font-weight: 500;
+  color: #222;
+  margin-bottom: 12rpx;
+}
+
+.treatment-row {
+  font-size: 26rpx;
+  color: #666;
+  margin-bottom: 8rpx;
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.label {
+  color: black;
+  margin-right: 8rpx;
+}
+
+.treatment-detail-card {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  background: #fff;
+  border-radius: 16rpx;
+  margin: 0 24rpx 32rpx 24rpx;
+  padding: 24rpx 54rpx 18rpx 24rpx;
+  box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.03);
+  font-size: 28rpx;
+}
+
+.row {
+  display: flex;
+  align-items: center;
+  color: #222;
+  font-size: 28rpx;
+  margin-bottom: 20rpx;
+}
+
+.between {
+  justify-content: space-between;
+}
+
+.bold {
+  font-weight: 600;
+}
+
+.status {
+  font-size: 28rpx;
+  font-weight: 500;
+  margin-bottom: 20rpx;
+}
+
+.status.done {
+  color: #43A047;
+  margin-left: 16rpx;
+}
+
+.count {
+  margin-left: 16rpx;
+  color: #222;
+}
+
+.divider {
+  height: 1rpx;
+  background: #eee;
+  margin: 18rpx 0;
+}
+.sub-label {
+  color: #bbb;
+}

+ 36 - 0
miniprogram/module/care/pages/offlineTreatment/offlineTreatment.ts

@@ -0,0 +1,36 @@
+import { getOfflineTreatmentListMethod } from "../../request";
+
+Page({
+  data: {
+    currentTab: '',
+    treatmentList: [ ],
+  },
+  onLoad() {
+    this.getOfflineTreatmentList('');
+  },
+  // 跳转到核销记录
+  switchVerifyRecode(){
+    wx.navigateTo({
+      url: '/pages/care/verifyRecode',
+    })
+  },
+  onTabChange(e: any) {
+    const progress = e.detail.value;
+    this.setData({
+      currentTab: progress
+    })
+    this.getOfflineTreatmentList(progress);
+  },
+  // 获取线下非药物治疗记录列表
+   async getOfflineTreatmentList(progress: string) {
+    this.setData({
+     treatmentList: []
+    })
+    const res =  await getOfflineTreatmentListMethod(progress);
+    if(res && res.data && res.data.length > 0) {
+      this.setData({
+        treatmentList: res.data
+      })
+    }
+  }
+});

+ 52 - 0
miniprogram/module/care/pages/offlineTreatment/offlineTreatment.wxml

@@ -0,0 +1,52 @@
+<t-navbar title="线下非药物治疗" left-arrow />
+<view class="offline-treatment-page">
+  <t-tabs value="{{currentTab}}" bind:change="onTabChange">
+    <t-tab-panel label="全部" value=""></t-tab-panel>
+    <t-tab-panel label="治疗中" value="0"></t-tab-panel>
+    <t-tab-panel label="治疗完成" value="1"></t-tab-panel>
+  </t-tabs>
+  <scroll-view class="page-container" scroll-y>
+  <view wx:if="{{treatmentList.length>0}}">
+    <block wx:for="{{treatmentList}}" wx:key="id">
+      <view class="treatment-detail-card" bind:tap="switchVerifyRecode">
+      <view> 
+        <view class="row between">
+          <text class="label bold">项目:{{item.conditioningProgramName}}</text>
+        </view>
+        <view class="row">
+         <text class="sub-label">开具人:</text>
+        {{item.operateBy}}</view>
+          <view class="row">
+           <text class="sub-label">开始时间:</text>
+           {{item.estimatedStartDate}}
+        </view>
+        <view class="row">
+         <text class="sub-label">频次:</text>
+         每{{item.frequencyType}}天{{item.frequencyMeasure}}{{item.convertUnit}}
+        </view>
+        <view class="row" wx:if="{{tem.arrangeDate}}">
+          <text class="sub-label">下次时间:</text>
+          {{item.arrangeDate}}
+        </view>
+        <view class="row" wx:if="{{item.conditioningProgramSupplierName}}">
+           <text class="sub-label">机构:</text>
+          {{item.conditioningProgramSupplierName}}
+        </view>
+        <view class="divider"></view>
+      </view>
+      <view style="margin-top:-80px">
+       <view class="status" style="color:{{item.status === 'doing' ? '#F44336' : '#43A047'}}">
+       {{item.progress === '0' ? '进行中' : '已完成'}}
+          </view>
+          <view>{{item.finishCount}}/{{item.totalMeasure}}</view>
+      </view>
+</view>
+    </block>
+    </view>
+
+<view wx:else>
+   <t-empty icon="info-circle-filled" description="暂无数据" />
+</view>
+    
+  </scroll-view>
+</view>

+ 13 - 0
miniprogram/module/care/pages/reportRecord/reportRecord.json

@@ -0,0 +1,13 @@
+{
+  "renderer": "skyline",
+  "navigationBarTextStyle": "white",
+  "navigationBarBackgroundColor": "#0f2226",
+  "backgroundColor": "#0f2226",
+  "backgroundColorContent": "#0f2226",
+  "backgroundColorTop": "#0f2226",
+  "backgroundColorBottom": "#0f2226",
+  "component": true,
+  "usingComponents": {
+    "t-icon": "tdesign-miniprogram/icon/icon"
+  }
+}

+ 49 - 0
miniprogram/module/care/pages/reportRecord/reportRecord.scss

@@ -0,0 +1,49 @@
+.page-container {
+  background-color: #f3f3f3;
+  height: calc(100vh - 44px);
+  box-sizing: border-box;
+  -webkit-overflow-scrolling: touch;
+  .record-list {
+    background: white;
+    padding: 0;
+  }
+  .record-item {
+    display: flex;
+    align-items: center;
+    background: white;
+    border-radius: 16rpx;
+    margin: 20rpx 16rpx 0 16rpx;
+    padding: 20rpx 24rpx;
+    position: relative;
+    box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.08);
+  }
+  .icon-wrap {
+    margin-right: 24rpx;
+  }
+  .content-wrap {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+  }
+  .date {
+    font-size: 28rpx;
+    font-weight: 600;
+    margin-bottom: 8rpx;
+  }
+  .desc {
+    color: #666;
+    font-size: 24rpx;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+  }
+  .arrow-wrap {
+    margin-left: 16rpx;
+    display: flex;
+    align-items: center;
+  }
+  .item-hover {
+    background: #f3f3f3;
+  }
+}

+ 43 - 0
miniprogram/module/care/pages/reportRecord/reportRecord.ts

@@ -0,0 +1,43 @@
+import { healthReportListMethod } from "../../request";
+import { getTickleContext } from "../../../../core/behavior/tickle.behavior";
+interface PanelProps {
+  shade?: boolean;
+  title?: string;
+  data: AnyArray;
+  type?: "analysis" | "report";
+}
+Page({
+  onLoad() {
+    this.getReportRecordList();
+  },
+
+  data: {
+    panel: {
+      shade: false,
+      data: [],
+    } as PanelProps,
+    _healthReportList: { data: [], loaded: false },
+    defaultIcon: '/assets/health/record-icon.png',
+  },
+  async getReportRecordList() {
+    if (!this.data._healthReportList.loaded) {
+      wx.showLoading({ title: "加载中" });
+      try {
+        const data = await healthReportListMethod();
+        console.log("data333",data);
+        this.setData({
+          "_healthReportList.data": data,
+          "_healthReportList.loaded": true,
+        });
+      } catch (error) {
+        getTickleContext.call(this).showErrorMessage(error.errMsg);
+      }
+      wx.hideLoading();
+    }
+  },
+  onItemTap(e: any) {
+    const id = e.currentTarget.dataset.id;
+    // 跳转到详情页
+    wx.navigateTo({ url: `/module/health/pages/report/report?id=${id}` });
+  }
+});

+ 17 - 0
miniprogram/module/care/pages/reportRecord/reportRecord.wxml

@@ -0,0 +1,17 @@
+<t-navbar title="健康分析报告记录" left-arrow />
+<scroll-view class="page-container" scroll-y>
+ 
+<view class="record-list">
+  <block wx:for="{{_healthReportList.data}}" wx:key="id">
+    <view class="record-item" hover-class="item-hover" bindtap="onItemTap" data-id="{{item.id}}">
+      <view class="content-wrap">
+        <view class="date">{{item.reportTime}}</view>
+        <view class="desc">{{item.description}}</view>
+      </view>
+      <view class="arrow-wrap">
+        <t-icon name="chevron-right" size="36rpx" color="#666" />
+      </view>
+    </view>
+  </block>
+</view>
+</scroll-view>

+ 23 - 0
miniprogram/module/care/request.ts

@@ -0,0 +1,23 @@
+import { Get, Post } from "../../lib/request/method";
+
+
+export function healthReportListMethod() {
+  const transform = ({ data }: AnyObject) => {
+    return Array.isArray(data) ? data.map(item => {
+      return {
+        id: item.healthAnalysisReportId,
+        reportTime: item.time3,
+        description: [item.willillStateName, item.willillDegreeName, item.willillSocialName, item.willillFunctionName].filter(Boolean).join(',')
+      }
+    }) : []
+  }
+  return Get(`/analysisManage/getHarsTid`, { transform })
+}
+// 线下非药物治疗
+export function getOfflineTreatmentListMethod(progress: string) {
+  return Post(`/patientCrManage/pagePofflineCp`, {progress}, {
+    transform({ data }: AnyObject) {
+      return data;
+    }
+  })
+}

+ 163 - 0
miniprogram/module/charts/components/record-index/chalk.theme.ts

@@ -0,0 +1,163 @@
+import { Color } from "XrFrame/xrFrameSystem"
+
+const theme = {
+  "color": [
+    "#72ccff",
+    "#f7c5a0"
+  ],
+  // "backgroundColor": "#0f2226",
+  "backgroundColor": "#fff",
+  "textStyle": {},
+  "title": {
+    "textStyle": {
+      // "color": "#38ff6e"
+      "color": "#000"
+    },
+    "subtextStyle": {
+      "color": "#dddddd"
+    }
+  },
+  "line": {
+    "itemStyle": {
+      // "borderWidth": "4"
+    },
+    "lineStyle": {
+      "width": "2"
+    },
+    "symbolSize": 6,
+    "symbol": "circle",
+    "smooth": true
+  },
+  "categoryAxis": {
+    "axisLine": {
+      "show": true,
+      "lineStyle": {
+        "color": "#000"
+      }
+    },
+    "axisTick": {
+      "show": true,
+      "lineStyle": {
+        "color": "#333"
+      }
+    },
+    "axisLabel": {
+      "show": true,
+      "color": "#000"
+    },
+    "splitLine": {
+      "show": false
+    }
+  },
+  "valueAxis": {
+    "axisLine": {
+      "show": true,
+      "lineStyle": {
+        "color": "#86909C"
+      }
+    },
+    "axisTick": {
+      "show": true,
+      "lineStyle": {
+        "color": "#333"
+      }
+    },
+    "axisLabel": {
+      "show": true,
+      "color": "#86909C"
+    },
+    "splitLine": {
+      "show": true,
+      "lineStyle": {
+        "color": "#E5E8EF",
+        "type": "dashed"
+      }
+    }
+  },
+  "timeAxis": {
+    "axisLine": {
+      "show": true,
+      "lineStyle": {
+        "color": "#666666"
+      }
+    },
+    "axisTick": {
+      "show": false,
+      "lineStyle": {
+        "color": "#333"
+      }
+    },
+    "axisLabel": {
+      "show": true,
+      "color": "#aaaaaa"
+    },
+    "splitLine": {
+      "show": true,
+      "lineStyle": {
+        "color": [
+          "#666666"
+        ]
+      }
+    },
+    "splitArea": {
+      "show": false,
+      "areaStyle": {
+        "color": [
+          "rgba(250,250,250,0.05)",
+          "rgba(200,200,200,0.02)"
+        ]
+      }
+    }
+  },
+  "legend": {
+    "textStyle": {
+      "color": "#ffffff"
+    }
+  },
+  "tooltip": {
+    "axisPointer": {
+      "lineStyle": {
+        "color": "#cccccc",
+        "width": 1
+      },
+      "crossStyle": {
+        "color": "#cccccc",
+        "width": 1
+      }
+    }
+  },
+  "visualMap": {
+    "color": [
+      "#fc97af",
+      "#72ccff",
+      "#fc97af"
+    ]
+  },
+  "dataZoom": {
+    "backgroundColor": "rgba(255,255,255,0)",
+    "dataBackgroundColor": "rgba(114,204,255,1)",
+    "fillerColor": "rgba(114,204,255,0.2)",
+    "handleColor": "#72ccff",
+    "handleSize": "100%",
+    "textStyle": {
+      "color": "#333333"
+    }
+  },
+  "markPoint": {
+    "label": {
+      // Color:" #1976d2"
+      Color:"#1D6FF6"
+    },
+    "emphasis": {
+      "label": {
+        // "color": "#293441"
+        Color:" #1976d2"
+      }
+    }
+  }
+}
+
+export default [
+  'chalk',
+  theme,
+]

+ 110 - 0
miniprogram/module/charts/components/record-index/health-index.ts

@@ -0,0 +1,110 @@
+function gather(
+  data: App.Health.Index.Data[],
+  transform: (model: App.Health.Index.Model, index?: number) => any,
+  skip = false,
+  // link = { 血压: ['收缩压', '舒张压'], }
+  link = {}
+) {
+  const ref = ((link) => {
+    const ref: Record<string, { id: string; name: string; }> = {};
+    Object.entries(link).forEach(([name, keys]) => {
+      const _ = { id: name, name };
+      (keys as AnyArray).forEach(key => { ref[key] = _; })
+    })
+    return ref;
+  })(link);
+
+  const cache = new Map<{ id: string; name: string; }, App.Health.Index.Chart[]>();
+  for (const item of data) {
+    if (skip && item.isAuto) continue;
+    const model = createHealthIndex(item);
+    const _ = ref[model.name] ?? { id: model.id, name: model.name };
+    if (ref[model.id]) model.name = model.name.replace(_.name, '');
+    if (cache.has(_)) {
+      cache.get(_)?.push(transform(model, cache.get(_)?.length));
+    } else {
+      cache.set(_, [transform(model)]);
+    }
+  }
+  return [...cache].map(gather => ({ ...gather[0], options: gather[1] }))
+}
+
+export function createHealthIndex(data: App.Health.Index.Data): App.Health.Index.Model {
+  const { quotaId: id, minVal, maxVal, inputMin, inputMax, inputPrecision, patientQuotaRecordDTOS, ...model } = data;
+  const scope = [+minVal, +maxVal] as const;
+  const range = [
+    +inputMin! || Math.floor(scope[0] * 0.75),
+    +inputMax! || Math.floor(scope[1] * 1.25),
+  ]
+  return {
+    ...model, id,
+    precision: (+inputPrecision!) || 1,
+    range, scope,
+    values: patientQuotaRecordDTOS?.map(item => {
+      return { value: +item.quotaVal, abnormal: item.abnormal, description: item.abnormalDesc, date: item.time2 }
+    })?.filter(item => !!item.value),
+  } as App.Health.Index.Model
+}
+
+export function healthIndex2Chart(model: App.Health.Index.Model, index = 0): AnyObject {
+  const data = model.values?.map(t => [t.date, t.value]) ?? [];
+  const yAxis = {
+    name: model.unit,
+    nameTextStyle: { color: '#ccc' },
+    type: 'value', scale: true,
+    min: model.range[0],
+    max: Math.min(
+      model.range[1],
+      Math.floor(Math.max(model.scope[1], ...data.map((item: AnyArray) => item[1])) * 2)
+    ),
+    minInterval: model.precision >= 1 ? model.precision : void 0,
+    axisLine: { show: true }
+  }
+  const series = {
+    name: model.name,
+    yAxisIndex: 0,
+    type: 'line', smooth: true,
+    data,
+    markLine: {
+      data: model.scope.map(value => { return { yAxis: value } })
+    }
+  }
+  const visualMap = {
+    show: false,
+    type: 'piecewise',
+    pieces: [
+      { gt: model.scope[1] },
+      { gte: model.scope[0], lte: model.scope[1] },
+      { lt: model.scope[0] }
+    ]
+  }
+
+  return { yAxis, series, visualMap }
+}
+
+export function transformHealthIndex2Chart(data: App.Health.Index.Data[]): AnyObject[] {
+  const list = gather(data, healthIndex2Chart)
+  console.log(list, 'transformHealthIndex2Chart-->list');
+
+  const charts = [];
+  for (const item of list) {
+    const xAxis = { type: 'category', axisLabel: { overflow: 'breakAll' } }
+    const yAxis = [], series = [], visualMap = [];
+    for (const option of item.options) {
+      yAxis.push(option.yAxis);
+      visualMap.push(option.visualMap);
+      if (option.series.data?.length) series.push(option.series);
+    }
+    if (!series.length) continue;
+    charts.push({
+      id: item.id,
+      title: { text: `${item.name}` },
+      tooltip: { trigger: 'axis' },
+      legend: { show: series.length > 1 },
+      grid: { bottom: 25 },
+      xAxis, yAxis: yAxis[0],
+      series, visualMap,
+    })
+  }
+  return charts;
+}

+ 9 - 0
miniprogram/module/charts/components/record-index/record-index.json

@@ -0,0 +1,9 @@
+{
+  "renderer": "webview",
+  "navigationStyle": "default",
+  "navigationBarTitleText": "指标更新记录",
+  "component": true,
+  "usingComponents": {
+    "ec-canvas": "../../ec-canvas/ec-canvas"
+  }
+}

+ 33 - 0
miniprogram/module/charts/components/record-index/record-index.scss

@@ -0,0 +1,33 @@
+/* module/health/pages/record-index/record-index.wxss */
+page {
+  background-color: white;
+}
+.chart {
+  margin: 12px 0;
+}
+.chart-container {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background: #fff;
+  border-radius: 12rpx;
+  margin: 20rpx 0;
+}
+
+.chart {
+  width: 100%;
+  height: 100%;
+}
+
+.loading, .error {
+  padding: 40rpx;
+  text-align: center;
+  color: #666;
+  font-size: 28rpx;
+}
+
+.error {
+  color: #ff4d4f;
+} 

+ 95 - 0
miniprogram/module/charts/components/record-index/record-index.ts

@@ -0,0 +1,95 @@
+import * as echarts from '../../ec-canvas/echarts.min';
+import Theme from './chalk.theme';
+import { healthIndexReportMethod } from './request';
+
+echarts.registerTheme(...Theme);
+
+// module/health/pages/record-index/record-index.ts
+Component({
+  lifetimes: {
+    async attached() {
+      try {
+        await this._initRect();
+        await this._getData();
+      } catch (error) {
+        console.error('record-index component error:', error);
+      }
+    },
+    detached() {
+      // 清理图表实例
+      if (this.data.charts) {
+        this.data.charts.forEach((chart: any) => {
+          if (chart && chart.dispose) {
+            chart.dispose();
+          }
+        });
+      }
+    }
+  },
+  properties: {
+
+  },
+  data: {
+    gap: 0,
+    scale: 1,
+    rect: { width: 0, height: 0 },
+    charts: [] as string[],
+    loading: true,
+    error: false
+  },
+  methods: {
+    async _initRect() {
+      try {
+        const { windowWidth, pixelRatio } = wx.getWindowInfo()
+        const { right } = wx.getMenuButtonBoundingClientRect();
+        const gap = windowWidth - right;
+
+        const width = windowWidth - gap * 2;
+        const height = Math.floor(width * 3 / 4);
+        this.setData({
+          rect: { width, height, },
+          scale: pixelRatio,
+          gap
+        });
+      } catch (error) {
+        console.error('_initRect error:', error);
+        throw error;
+      }
+    },
+    async _getData() {
+      try {
+        this.setData({ loading: true, error: false });
+        const charts = await healthIndexReportMethod();
+        
+        if (!charts || charts.length === 0) {
+          this.setData({ loading: false, error: true });
+          return;
+        }
+
+        const chartConfigs = charts.map((option: any) => {
+          return {
+            id: option.id,
+            onInit(canvas: any, width: number, height: number, dpr: number) {
+              const ec = echarts.init(canvas, Theme[0], {
+                width: width,
+                height: height,
+                devicePixelRatio: dpr
+              });
+              canvas.setChart(ec);
+              ec.setOption(option);
+              return ec;
+            }
+          }
+        });
+
+        this.setData({
+          charts: chartConfigs,
+          loading: false
+        });
+      } catch (error) {
+        console.error('_getData error:', error);
+        this.setData({ loading: false, error: true });
+      }
+    }
+  }
+})

+ 22 - 0
miniprogram/module/charts/components/record-index/record-index.wxml

@@ -0,0 +1,22 @@
+<!--module/charts/components/record-index/record-index.wxml-->
+<view class="chart-container">
+  <block wx:if="{{loading}}">
+    <view class="loading">加载中...</view>
+  </block>
+  <block wx:elif="{{error}}">
+    <view class="error">加载失败,请重试</view>
+  </block>
+  <block wx:else>
+    <view class="chart">
+      <view wx:for="{{charts}}" wx:key="*this" style="width: {{rect.width}}px; height: {{rect.height}}px;">
+        <ec-canvas 
+          id="index-chart-{{item.id}}"
+          canvas-id="index-canvas-{{item.id}}"
+          ec="{{item}}" 
+          force-use-old-canvas="true"
+          disable-scroll="true"
+        ></ec-canvas>
+      </view>
+    </view>
+  </block>
+</view>

+ 21 - 0
miniprogram/module/charts/components/record-index/request.ts

@@ -0,0 +1,21 @@
+import { Post } from "../../../../lib/request/method"
+import { transformHealthIndex2Chart } from "./health-index";
+const careId=wx.getStorageSync('careId')
+export function healthIndexReportMethod() {
+  if(careId)
+  {
+    console.log(careId, '服务包详情');
+    return Post(`/patientCrManage/getPcrProcessById/${careId}`, {}, {
+      transform({ data }: any) { 
+        return transformHealthIndex2Chart(<any[]>data.patientQuotaGroups)
+       }
+    })
+
+  }else{
+    console.log('获取健康评估记录');
+    return Post(`/patientQuota/getQuovalRecord`, {}, {
+      transform({ data }) { return transformHealthIndex2Chart(<any[]>data) }
+    })
+  }
+  
+}

+ 1 - 1
miniprogram/module/charts/ec-canvas/ec-canvas.wxss

@@ -1,4 +1,4 @@
 .ec-canvas {
-  width: 100%;
+  width: 96%;
   height: 100%;
 }

+ 6 - 0
miniprogram/module/charts/record-care/record-care.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "ec-canvas": "../ec-canvas/ec-canvas"
+  }
+}

+ 11 - 0
miniprogram/module/charts/record-care/record-care.scss

@@ -0,0 +1,11 @@
+.chart-care {
+  width: 100%;
+  height: 500rpx;
+  background: #fff;
+  border-radius: 12rpx;
+}
+
+.canvas-box {
+  width: 100%;
+  height: 100%;
+} 

+ 135 - 0
miniprogram/module/charts/record-care/record-care.ts

@@ -0,0 +1,135 @@
+import * as echarts from '../ec-canvas/echarts.min';
+import { Post } from "../../../lib/request/method"
+
+
+Component({
+  lifetimes: {
+    async attached() {
+      const careId = wx.getStorageSync('careId');
+      if (careId) {
+        await this.getCareDetail(careId);
+      }
+    }
+  },
+  properties: {
+  },
+  data: {
+    charts: {} as any,
+    careDetail: {} as any,
+    ec: {
+      lazyLoad: true
+    }
+  },
+  methods: {
+    async getCareDetail(id: number) {
+      const res = await Post(
+        `/patientCrManage/getPcrProcessById/${id}`,
+        {},
+        {
+          transform({ data }: any) {
+            return data;
+          },
+        }
+      );
+      if (res) {
+        this.setData({
+          careDetail: res,
+        }, () => {
+          this._getData();
+        });
+      }
+    },
+    async _getData() {
+      if (this.data.careDetail.patientConditioningScores?.length > 0) {
+        const option = {
+          title: {
+            text: "健康评分",
+            left: "center",
+            top: 0,
+            textStyle: {
+              fontSize: 18
+            }
+          },
+          tooltip: {
+            trigger: "axis",
+          },
+          xAxis: {
+            type: "category",
+            data: this.data.careDetail.patientConditioningScores.map((item: any) => item.time4),
+            axisLabel: {
+              interval: 0,
+              rotate: 45,
+              fontSize: 12
+            },
+            axisTick: {
+              alignWithLabel: true
+            }
+          },
+          yAxis: {
+            type: "value",
+            name: "",
+            min: 0,
+            max: 100
+          },
+          series: [
+            {
+              data: this.data.careDetail.patientConditioningScores.map((item: any) => item.score),
+              type: "line",
+              smooth: true,
+              symbol: 'circle',
+              symbolSize: 8,
+              lineStyle: {
+                color: "#1976d2",
+                width: 3
+              },
+              itemStyle: {
+                color: "#1976d2",
+                borderWidth: 2,
+                borderColor: '#fff'
+              },
+              label: {
+                show: true,
+                position: 'top',
+                formatter: function(params: any) {
+                  return params.value;
+                },
+                fontSize: 12,
+                color: '#666'
+              }
+            },
+          ],
+          grid: {
+            left: '5%',
+            right: '5%',
+            bottom: '15%',
+            top: '15%',
+            containLabel: true
+          },
+        };
+        // 获取组件实例
+        const ecComponent = this.selectComponent('#effectChart');
+        if (ecComponent) {
+          ecComponent.init((canvas: any, width: number, height: number, dpr: number) => {
+            const chart = echarts.init(canvas, null, {
+              width: width,
+              height: height,
+              devicePixelRatio: dpr
+            });
+            canvas.setChart(chart);
+            chart.setOption(option);
+            return chart;
+          });
+        }
+      }
+    },
+    onInit(canvas: any, width: number, height: number, dpr: number) {
+      const chart = echarts.init(canvas, null, {
+        width: width,
+        height: height,
+        devicePixelRatio: dpr
+      });
+      canvas.setChart(chart);
+      return chart;
+    }
+  }
+})

+ 11 - 0
miniprogram/module/charts/record-care/record-care.wxml

@@ -0,0 +1,11 @@
+<!--module/charts/pages/record-care/record-care.wxml-->
+  <view class="chart-care" wx-if="{{careDetail.patientConditioningScores}}">
+    <ec-canvas 
+    class="canvas-box"
+      id="effectChart" 
+      canvas-id="effectChart" 
+      ec="{{ ec }}" 
+      force-use-old-canvas="true"
+      disable-scroll="true"
+    ></ec-canvas>
+  </view>

+ 8 - 0
miniprogram/module/charts/record-care/request.ts

@@ -0,0 +1,8 @@
+import { Post } from "../../../lib/request/method"
+import { transformHealthIndex2Chart } from "./health-index";
+
+export function healthIndexReportMethod() {
+  return Post(`/patientQuota/getQuovalRecord`, {}, {
+    transform({ data }) { return transformHealthIndex2Chart(<any[]>data) }
+  })
+}

+ 16 - 9
miniprogram/module/charts/record-index/chalk.theme.ts

@@ -1,13 +1,17 @@
+import { Color } from "XrFrame/xrFrameSystem"
+
 const theme = {
   "color": [
     "#72ccff",
     "#f7c5a0"
   ],
-  "backgroundColor": "#0f2226",
+  // "backgroundColor": "#0f2226",
+  "backgroundColor": "#fff",
   "textStyle": {},
   "title": {
     "textStyle": {
-      "color": "#38ff6e"
+      // "color": "#38ff6e"
+      "color": "#000"
     },
     "subtextStyle": {
       "color": "#dddddd"
@@ -28,7 +32,7 @@ const theme = {
     "axisLine": {
       "show": true,
       "lineStyle": {
-        "color": "#666666"
+        "color": "#000"
       }
     },
     "axisTick": {
@@ -39,7 +43,7 @@ const theme = {
     },
     "axisLabel": {
       "show": true,
-      "color": "#aaaaaa"
+      "color": "#000"
     },
     "splitLine": {
       "show": false
@@ -49,7 +53,7 @@ const theme = {
     "axisLine": {
       "show": true,
       "lineStyle": {
-        "color": "#666666"
+        "color": "#86909C"
       }
     },
     "axisTick": {
@@ -60,12 +64,13 @@ const theme = {
     },
     "axisLabel": {
       "show": true,
-      "color": "#aaaaaa"
+      "color": "#86909C"
     },
     "splitLine": {
       "show": true,
       "lineStyle": {
-        "color": "#666666"
+        "color": "#E5E8EF",
+        "type": "dashed"
       }
     }
   },
@@ -140,11 +145,13 @@ const theme = {
   },
   "markPoint": {
     "label": {
-      "color": "#293441"
+      // Color:" #1976d2"
+      Color:"#1D6FF6"
     },
     "emphasis": {
       "label": {
-        "color": "#293441"
+        // "color": "#293441"
+        Color:" #1976d2"
       }
     }
   }

+ 2 - 1
miniprogram/module/charts/record-index/health-index.ts

@@ -84,10 +84,11 @@ export function healthIndex2Chart(model: App.Health.Index.Model, index = 0): Any
 
 export function transformHealthIndex2Chart(data: App.Health.Index.Data[]): AnyObject[] {
   const list = gather(data, healthIndex2Chart)
-  console.log(list, 'transformHealthIndex2Chart-->list');
+  // console.log(list, 'transformHealthIndex2Chart-->list');
 
   const charts = [];
   for (const item of list) {
+    // console.log(item, 'item111');
     const xAxis = { type: 'category', axisLabel: { overflow: 'breakAll' } }
     const yAxis = [], series = [], visualMap = [];
     for (const option of item.options) {

+ 27 - 5
miniprogram/module/charts/record-index/record-index.scss

@@ -1,7 +1,29 @@
 /* module/health/pages/record-index/record-index.wxss */
-page {
-  background-color: #0F2226;
+// page {
+//   background-color: red;
+//   height: 100vh;
+// }
+.chart-container {
+  // width: 100%;
+  // height: 100%;
+  // display: flex;
+  // flex-direction: column;
+  // justify-content: center;
+  align-items: center;
+  background: #fff;
+  border-radius: 12rpx;
+  margin: 20rpx 0;
 }
-.chart {
-  margin: 12px 0;
-}
+
+
+
+.loading, .error {
+  padding: 40rpx;
+  text-align: center;
+  color: #666;
+  font-size: 28rpx;
+}
+
+.error {
+  color: #ff4d4f;
+} 

+ 58 - 27
miniprogram/module/charts/record-index/record-index.ts

@@ -7,9 +7,23 @@ echarts.registerTheme(...Theme);
 // module/health/pages/record-index/record-index.ts
 Component({
   lifetimes: {
-    attached() {
-      this._initRect();
-      this._getData();
+    async attached() {
+      // try {
+        await this._initRect();
+        await this._getData();
+      // } catch (error) {
+      //   console.error('record-index component error:', error);
+      // }
+    },
+    detached() {
+      // 清理图表实例
+      if (this.data.charts) {
+        this.data.charts.forEach((chart: any) => {
+          if (chart && chart.dispose) {
+            chart.dispose();
+          }
+        });
+      }
     }
   },
   properties: {
@@ -18,46 +32,63 @@ Component({
   data: {
     gap: 0,
     scale: 1,
-    rect: { width: 0, height: 0 },
-
+    rect: { width: 375, height: 300 },
     charts: [] as string[],
+    loading: true,
+    error: false
   },
   methods: {
-    _initRect() {
-      const { windowWidth, pixelRatio } = wx.getWindowInfo()
-      const { right } = wx.getMenuButtonBoundingClientRect();
-      const gap = windowWidth - right;
+    async _initRect() {
+      try {
+        const { windowWidth, pixelRatio } = wx.getWindowInfo()
+        const { right } = wx.getMenuButtonBoundingClientRect();
+        const gap = windowWidth - right;
 
-      const width = windowWidth - gap * 2;
-      const height = Math.floor(width * 3 / 4);
-      this.setData({
-        rect: { width, height, },
-        scale: pixelRatio, gap
-      })
+        const width = windowWidth - gap * 2;
+        const height = Math.floor(width * 3 / 4);
+        this.setData({
+          rect: { width, height, },
+          scale: pixelRatio,
+          gap
+        });
+      } catch (error) {
+        console.error('_initRect error:', error);
+        throw error;
+      }
     },
     async _getData() {
-      const charts = await healthIndexReportMethod();
-      this.setData({
-        charts: charts.map((option: any) => {
+      try {
+        this.setData({ loading: true, error: false });
+        const charts = await healthIndexReportMethod();
+        if (!charts || charts.length === 0) {
+          this.setData({ loading: false, });
+          return;
+        }
+
+        const chartConfigs = charts.map((option: any) => {
           return {
             id: option.id,
             onInit(canvas: any, width: number, height: number, dpr: number) {
               const ec = echarts.init(canvas, Theme[0], {
-                width: width,
-                height: height,
+                width: 400,
+                height: 280,
                 devicePixelRatio: dpr
               });
               canvas.setChart(ec);
               ec.setOption(option);
-
-              console.log(option, '1-->');
-              
-
               return ec;
             }
           }
-        })
-      });
-    },
+        });
+
+        this.setData({
+          charts: chartConfigs,
+          loading: false
+        });
+      } catch (error) {
+        console.error('_getData error:', error);
+        this.setData({ loading: false, error: true });
+      }
+    }
   }
 })

+ 15 - 5
miniprogram/module/charts/record-index/record-index.wxml

@@ -1,8 +1,18 @@
 <!--module/health/pages/record-index/record-index.wxml-->
-<view style="padding: 0 {{gap}}px;">
-  <block wx:for="{{charts}}" wx:key="*this">
-    <view class="chart" style="width: {{rect.width}}px;height: {{rect.height}}px;">
-      <ec-canvas id="dom-{{item.id}}" canvas-id="canvas-{{item.id}}" ec="{{ item }}"></ec-canvas>
-    </view>
+<view class="chart-container">
+  <block wx:if="{{loading}}">
+    <view class="loading">加载中...</view>
+  </block>
+  <block wx:else>
+      <view wx:for="{{charts}}" wx:key="*this" style="width: {{rect.width}}px; height: {{rect.height}}px;">
+        <ec-canvas 
+          id="dom-{{item.id}}"
+          canvas-id="canvas-{{item.id}}"
+          ec="{{item}}" 
+          force-use-old-canvas="true"
+          disable-scroll="true"
+          style="width: {{rect.width}}px; height: {{rect.height}}px;"
+        ></ec-canvas>
+      </view>
   </block>
 </view>

+ 17 - 4
miniprogram/module/charts/record-index/request.ts

@@ -1,8 +1,21 @@
 import { Post } from "../../../lib/request/method"
 import { transformHealthIndex2Chart } from "./health-index";
-
+const careId=wx.getStorageSync('careId')
 export function healthIndexReportMethod() {
-  return Post(`/patientQuota/getQuovalRecord`, {}, {
-    transform({ data }) { return transformHealthIndex2Chart(<any[]>data) }
-  })
+  if(careId)
+  {
+    console.log(careId, '服务包详情');
+    return Post(`/patientCrManage/getPcrProcessById/${careId}`, {}, {
+      transform({ data }: any) { 
+        return transformHealthIndex2Chart(<any[]>data.patientQuotaGroups)
+       }
+    })
+
+  }else{
+    console.log('获取健康评估记录');
+    return Post(`/patientQuota/getQuovalRecord`, {}, {
+      transform({ data }) { return transformHealthIndex2Chart(<any[]>data) }
+    })
+  }
+  
 }

+ 51 - 26
miniprogram/module/chats/components/guide/guide.ts

@@ -1,50 +1,75 @@
 // module/chats/components/guide/guide.ts
+import { getPatients } from "../../../../pages/home/request";
+import { toCertificationPage } from "../../../../pages/home/router";
 Component({
   lifetimes: {},
   properties: {
-    id: { type: String, value: '' },
+    id: { type: String, value: "" },
     active: { type: Boolean, value: false },
     analysisCount: { type: Number, value: 0 },
   },
   data: {
     result: [] as string[],
     result2: false,
+    patient: {} as any,
   },
   methods: {
-    handleA() {
-      if (this.data.active){
-         this.triggerEvent('next', { component: 'questionnaire', scroll: true});
-         this.triggerEvent('nextType', { MessageType:2 });
+    async handleA() {
+      const { patient } = await getPatients(/*this.data.patientId*/);
+      console.log("patient", patient);
+      if (!patient) await toCertificationPage();
+      else {
+        if (this.data.active) {
+          this.triggerEvent("next", { component: "questionnaire", scroll: true });
+          this.triggerEvent("nextType", { MessageType: 2 });
+        }
       }
     },
-    handleB() {
-      if (this.data.active) wx.navigateTo({
-        url: '/module/health/pages/status/status',
-        events: { update: this._update.bind(this) }
-      });
+    async handleB() {
+      const { patient } = await getPatients(/*this.data.patientId*/);
+      if (!patient) await toCertificationPage();
+      else {
+        if (this.data.active)
+          wx.navigateTo({
+            url: "/module/health/pages/status/status",
+            events: { update: this._update.bind(this) },
+          });
+      }
     },
-    handleC() {
-      if (this.data.active) wx.navigateTo({
-        url: '/module/user/pages/user-edit/user-edit',
-        events: {
-          update2: () => {
-            this.setData({ result2: true });
-            this.triggerEvent('next', { component: 'guide', scroll: true });
-          }
-        }
-      });
+    async handleC() {
+      const { patient } = await getPatients(/*this.data.patientId*/);
+      if (!patient) await toCertificationPage();
+      else {
+        if (this.data.active)
+        wx.navigateTo({
+          url: "/module/user/pages/user-edit/user-edit",
+          events: {
+            update2: () => {
+              this.setData({ result2: true });
+              this.triggerEvent("next", { component: "guide", scroll: true });
+            },
+          },
+        });
+      }
     },
     handleD() {
-      if (this.data.active) wx.navigateBack();
+      // if (this.data.active) wx.navigateBack();
+      if (this.data.active) {
+        console.log("tiaohzuan1");
+        wx.redirectTo({ url: "/pages/home/home" });
+      }
     },
 
     _update(result: string[]) {
       if (result.length) {
         this.setData({ result });
-        this.triggerEvent('next', { component: 'guide', scroll: true });
+        this.triggerEvent("next", { component: "guide", scroll: true });
       } else {
-        setTimeout(() => wx.showToast({ title: `没有更改项`, icon: 'none' }), 300)
+        setTimeout(
+          () => wx.showToast({ title: `没有更改项`, icon: "none" }),
+          300
+        );
       }
-    }
-  }
-})
+    },
+  },
+});

+ 1 - 1
miniprogram/module/chats/components/guide/guide.wxml

@@ -18,7 +18,7 @@
       t-class="cell-border-gradient {{_.getClassName(active)}}" 
       t-class-hover="custom-cell-hover"
       t-class-title="health-analysis-title"
-      title="1、健康分析(剩余{{analysisCount<0?0:analysisCount}}次)" 
+      title="1、健康分析" 
       hover="{{active}}" 
       bind:tap="handleA"
       style="--td-cell-hover-color: #F5F5F5;"

+ 13 - 12
miniprogram/module/chats/components/message-again/message-again.scss

@@ -64,11 +64,11 @@
 }
 .input-panel {
   display: flex;
-  background: #dddddd;
-  height: 60px;
+  background: #F3F3F3;
+  height: 120rpx;
   position: fixed;
   width:100%;
-  padding:0px 10px;
+  padding:0px 20px;
   align-items: center;
   box-sizing: border-box;
   // border: 1px solid red;
@@ -90,7 +90,7 @@
   display: inline-block;
   padding: 0px 10px;
   color: #fff;
-  background: green;
+  background: #1D6FF6;
   border-radius: 3px;
   line-height:40px;
   margin-left:5px;
@@ -110,9 +110,7 @@
   // border: 3rpx solid var(--td-bg-color-container, #fff);
 }
 
-.card-active {
-  border-color: var(--td-brand-color, #0052d9);
-}
+
 
 .card-active::after {
   content: '';
@@ -123,7 +121,8 @@
   width: 0;
   border-width: 28px 28px 28px 0;
   border-style: solid;
-  border-color: var(--td-brand-color, #1B4F34) transparent transparent transparent;
+  // border-color: var(--td-brand-color, #1B4F34) transparent transparent transparent;
+  border-color: var(--td-brand-color, #1D6FF6) transparent transparent transparent;
 }
 .not-change {
   width: 100%;
@@ -226,7 +225,7 @@
 
       &--confirm {
         // color: var(--primary-color);
-        color: black;
+        color: #1D6FF6;
       }
     }
   }
@@ -256,7 +255,7 @@
 
   &--active {
     // border-color: var(--td-bg-color-container, #9ea1a5);
-    border: 1px solid #EEEEEE;
+    border: 1px solid #1D6FF6;
 
     &::after {
       content: '';
@@ -269,7 +268,8 @@
       border-width: 28px 28px 28px 0;
       border-style: solid;
       border-color: var(--td-bg-color-container) transparent transparent transparent;
-      border: 14px solid var(--td-bg-color-container, #0052d9);
+      // border: 14px solid var(--td-bg-color-container, #0052d9);
+      border: 14px solid #1D6FF6;
       border-bottom-color: transparent;
       border-right-color: transparent;
     }
@@ -281,7 +281,8 @@
 
   &__icon {
     // color: var(--primary-color, #fff);
-    color: black;
+    // color: black;
+    color: white  ;
     position: absolute;
     left: 1.5px;
     top: 1.5px;

+ 75 - 82
miniprogram/module/chats/components/message-again/message-again.ts

@@ -1,8 +1,5 @@
 // module/chats/components/message-select/message-select.ts
-import { Message } from "tdesign-miniprogram";
-import { getTickleContext } from "../../../../core/behavior/tickle.behavior";
 import { Get, Post } from "../../../../lib/request/method";
-import Input from "../../../../miniprogram_npm/tdesign-miniprogram/input/input";
 interface Option {
   id: string;
   name: string;
@@ -16,7 +13,6 @@ interface HandleEvent {
     item: Option;
   };
 }
-const app = getApp();
 Component({
   properties: {
     payload: {
@@ -28,11 +24,12 @@ Component({
     workId: { type: Number, value: 0 },
   },
   data: {
+    placeholder: "请输入",
+    safeBottomRpx: 0,
     // 键盘逻辑
-    inputBoxBottom: 0,
+    inputBoxBottom: 0, //初始华底部的值
     inputText: "",
     messages: [],
-    scrollTop: 0, // 滚动位置
     showrePlenish: false,
     inputFocus: false,
     // end
@@ -65,39 +62,25 @@ Component({
     symptomsList: [],
     isHaveNewSyndrome: "",
     isAnalysis: 0,
-    shows: false,
+    InputHeight:0,
   },
-  attached(options: any) {
+  attached() {
     this.setData({
       isAnalysis: wx.getStorageSync("isAnalysis"),
     });
-    if (wx.getSystemInfoSync().platform === "ios") {
-      this.setData({
-        inputBoxBottom: 10,
-      });
-    } else {
-      this.setData({
-        inputBoxBottom: 0,
-      });
-    }
-    // 键盘===========================
-    wx.onKeyboardHeightChange((res) => {
-      console.log(res, "res1111111111111");
-      const height = res.height;
-      if (height > 0) {
-        this.setData({
-          // 某些机型需要在此处也设置键盘高度
-          inputBoxBottom: height,
-        });
-      } else {
-        this.setData({
-          // 某些机型需要在此处也设置键盘高度
-          inputBoxBottom: 0,
-        });
-      }
+    const systemInfo = wx.getSystemInfoSync();
+    const windowHeight = systemInfo.windowHeight;
+    const safeAreaBottom = systemInfo.safeArea?.bottom ?? windowHeight; // 没有safeArea时,bottom等于windowHeight
+    const safeBottom = windowHeight - safeAreaBottom; // 安全区底部距离(px)
+    const tabBarHeight = 100; // 底部tabbar的高度
+    const safeBottomRpx = (750 / systemInfo.windowWidth) * safeBottom; // rpx
+    // 初始的底部bottom   底部安全区的高度+tabbar的高度
+    this.setData({
+      inputBoxBottom: safeBottomRpx + tabBarHeight,
+      safeBottomRpx: safeBottomRpx,
+      InputHeight:safeBottomRpx + tabBarHeight,
     });
-    console.log(this.data.inputBoxBottom, "刚进页面的高度");
-    // end======================
+
     this.setData({
       hasSelected: this.data.options
         .filter((option) => !option.hide)
@@ -114,36 +97,23 @@ Component({
           .some((option) => option.checked),
       });
     },
-    // 'messages':function(value: any) {
-    //   console.log(value, "messages11111");
-    //   if(value.length>0){
-
-    //   }
-    // },
   },
+
   methods: {
-    // 滚动到底部
-    // scrollToBottom() {
-    //   // 创建一个选择器获取消息容器高度
-    //   const query = wx.createSelectorQuery();
-    //   query.select(".messages").boundingClientRect();
-    //   query.exec((res) => {
-    //     if (res && res[0]) {
-    //       this.setData({
-    //         scrollTop: res[0].height,
-    //       });
-    //     }
-    //   });
-    // },
     handleInput(e: any) {
-      // console.log(e, "输入框输入内容");
       this.setData({ inputText: e.detail.value });
     },
     // 发送信息
     send() {
       const text = this.data.inputText.trim();
+      // 如果输入框内容为空,则不发送信息
       if (!text) {
         wx.showToast({ title: "发送的信息不能为空", icon: "none" });
+        if (this.data.inputFocus) {
+          this.setData({
+            inputFocus: true,
+          });
+        }
         return;
       }
       const userMessage = {
@@ -154,22 +124,15 @@ Component({
         status: "sending",
       };
       this.setData({
-        inputBoxBottom: 0,
         messages: [...this.data.messages, userMessage],
-        inputText: "",
-      });
-      this.triggerEvent("boxBottom", {
-        inputBoxBottom: this.data.inputBoxBottom,
       });
-      // 保持键盘打开状态
-      this.setData({ inputFocus: true });
       if (this.data.messages.length === 2 && this.data.symptomResult === "有") {
         this.setData({
           showrePlenish: false,
         });
         this.triggerEvent("nextType", { MessageType: 2 });
         this.triggerEvent("boxBottom", {
-          inputBoxBottom: this.data.inputBoxBottom - 50,
+          inputBoxBottom: this.data.InputHeight - 60,
         });
       } else if (
         this.data.messages.length === 1 &&
@@ -179,32 +142,52 @@ Component({
           showrePlenish: false,
         });
         this.triggerEvent("nextType", { MessageType: 2 });
+        this.triggerEvent("boxBottom", {
+          inputBoxBottom: this.data.InputHeight - 60,
+        });
+      } else if (
+        this.data.messages.length === 1 &&
+        this.data.symptomResult === "有"
+      ) {
+        this.setData({
+          placeholder: "请问还有其他要补充的吗?",
+          inputBoxBottom: this.data.InputHeight,
+        });
+        this.triggerEvent("boxBottom", {
+          inputBoxBottom: this.data.InputHeight,
+        });
       }
-      // 滚动到底部
-      // this.scrollToBottom();
+      this.triggerEvent("scroll", { id: "bottom" });
+      // 发送信息之后 输入框内容清空
+      this.setData({
+        inputText: "",
+      });
     },
     // 键盘聚焦
-    onInputFocus(e) {
+    onInputFocus(e: any) {
+      const systemInfo = wx.getSystemInfoSync();
+      const height = (750 / systemInfo.windowWidth) * e.detail.height; // 转为rpx
       this.setData({
-        inputFocus: false,
-        // 某些机型需要在此处也设置键盘高度
-        inputBoxBottom: e.detail.height || this.data.inputBoxBottom,
+        inputFocus: true,
+        inputBoxBottom: height,
       });
       this.triggerEvent("boxBottom", {
-        inputBoxBottom: this.data.inputBoxBottom,
+        inputBoxBottom: height,
       });
+      this.triggerEvent("scroll", { id: "bottom" });
     },
     // 键盘失焦
-    onInputBlur() {
+    onInputBlur(e: any) {
+      // 输入框失焦之后 底部高度是tabbar高度+安全区的高度
       this.setData({
         inputFocus: false,
-        inputBoxBottom: 0,
+        inputBoxBottom: this.data.InputHeight,
       });
       this.triggerEvent("boxBottom", {
-        inputBoxBottom: this.data.inputBoxBottom,
+        inputBoxBottom: this.data.InputHeight,
       });
+      this.triggerEvent("scroll", { id: "bottom" });
     },
-    // end ============================
     // 在字典中取症状的状态
     async getStatus() {
       const dict = await Get("/dict/getDicts", {
@@ -263,29 +246,36 @@ Component({
         wx.showToast({ title: error.errMsg, icon: "error" });
       }
     },
-    onChangeValue(e) {
+    // 选择有或没有
+    onChangeValue(e: any) {
       this.setData({ value1: e.detail.value });
+      // 输入框底部的bottom也还是最初的inputBoxBottom就可以了
       this.triggerEvent("boxBottom", {
         inputBoxBottom: this.data.inputBoxBottom,
       });
       this.setData({
         symptomResult: this.data.radioList.find(
-          (item) => item.value === e.detail.value
+          (item: any) => item.value === e.detail.value
         )?.label,
         isHaveNewSyndrome: this.data.radioList.find(
-          (item) => item.value === e.detail.value
+          (item: any) => item.value === e.detail.value
         )?.id,
       });
       let followObj: any = {
         isHaveNewSyndrome: this.data.isHaveNewSyndrome,
-        symptomList: this.data.symptomsList,
+        symptomsList: this.data.symptomsList,
       };
-      // console.log(this.data.isHaveNewSyndrome, "this.data.isHaveNewSyndrome");
+      if (this.data.isHaveNewSyndrome === "N") {
+        this.setData({ placeholder: "请问还有其他要补充的吗?" });
+      } else {
+        this.setData({ placeholder: "请描述新的症状?" });
+      }
       this.setData({ btnDisabled: true });
       wx.setStorageSync("followObj", followObj);
       this.setData({
         showrePlenish: true,
       });
+      this.triggerEvent("scroll", { id: "bottom" });
     },
     handleTop(event: HandleEvent) {
       if (this.data.result) return;
@@ -340,7 +330,6 @@ Component({
       multiple?: boolean
     ) {
       const checked = !item.checked;
-      console.log(checked, multiple, "_handle");
       if (checked) {
         const fn = () => {
           if (multiple) {
@@ -358,12 +347,10 @@ Component({
             subOptions: item.options,
             subMultiple: true,
           });
-          // console.log(this.data.subMultiple, "subOptions", item.css);
           this.onCancel = () => {
             this.setData({ subOptions: [] });
           };
           this.onConfirm = () => {
-            // console.log(this.data.subOptions, "subOptions", item.css);
             if (!this.data.subOptions.some((option) => option.checked)) {
               wx.showToast({ title: "请至少选择一项", icon: "error" });
             } else {
@@ -418,15 +405,21 @@ Component({
           }
         });
         this.setData({ symptomsList });
-        this.triggerEvent("next", { options: this.data.options });
+        this.triggerEvent("scroll", { id: "bottom" });
       }
     },
+
     onSkip() {
       if (this.data.result || this.data.hasSelected) return;
       if (!this.data.payload.required) {
         this.setData({ result: "无变化" });
         this.triggerEvent("next", { options: this.data.options });
       }
+      this.triggerEvent("scroll", { id: "bottom" });
+      this.setData({ placeholder: "请问还有其他要补充的吗?" });
     },
   },
+  onUnload() {
+    wx.offKeyboardHeightChange(); // 解绑键盘高度变化监听
+  },
 });

+ 23 - 27
miniprogram/module/chats/components/message-again/message-again.wxml

@@ -1,4 +1,3 @@
-
 <!--module/chats/components/message-again/message-again.wxml-->
 <wxs module="_">
   module.exports.getClassName = function (option) {
@@ -31,7 +30,7 @@
   </view>
 
   <view class="chat-card__content">
-   <t-cell t-class="cell-border-gradient" title="您好,您于{{followObj.medicalTime}}在我院{{followObj.medicalDepartment}}因为{{followObj.diagnosis}}就诊。接下来,我们将对您进行一个随访,请依据您目前的实际情况回答。"></t-cell>
+    <t-cell t-class="cell-border-gradient" title="您好,您于{{followObj.medicalTime}}在我院{{followObj.medicalDepartment}}因为{{followObj.diagnosis}}就诊。接下来,我们将对您进行一个随访,请依据您目前的实际情况回答。"></t-cell>
   </view>
 </view>
 <view class="chat-card left">
@@ -53,7 +52,7 @@
         <view class="not-change">无变化</view>
       </view>
       <view wx:if="{{multiple}}" class="item" bind:tap="onSubmit">
-      <view class="sub-btn">选好了</view>
+        <view class="sub-btn">选好了</view>
       </view>
     </view>
   </view>
@@ -69,20 +68,20 @@
   <t-loading wx:if="{{active}}" t-class="loading" theme="spinner" size="40rpx" class="wrapper" />
 </view>
 
-<view class="chat-card left"  wx:if="{{result}}"> 
+<view class="chat-card left" wx:if="{{result}}">
   <view class="chat-card__avatar ">
     <image src="../../assets/robot.png" mode="aspectFill" />
   </view>
   <view class="chat-card__content">
-     <t-cell t-class="cell-border-gradient" title="请问有没有出现新的症状?"></t-cell>
-      <t-radio-group t-class="horizontal-box" value="{{value1}}" bind:change="onChangeValue" disabled="{{btnDisabled}}">
-  <view wx:for="{{radioList}}" wx:key="index" class="radio-card {{value1 == index ? 'card-active' : ''}}">
-    <t-icon wx:if="{{value1 == index}}" name="check" t-class="card__icon" ariaHidden="{{true}}" />
-    <t-radio value="{{index}}" label="{{item.label}}" icon="none" borderless  />
-  </view>
-</t-radio-group>
-     </view>
+    <t-cell t-class="cell-border-gradient" title="请问有没有出现新的症状?"></t-cell>
+    <t-radio-group t-class="horizontal-box" value="{{value1}}" bind:change="onChangeValue" disabled="{{btnDisabled}}">
+      <view wx:for="{{radioList}}" wx:key="index" class="radio-card {{value1 == index ? 'card-active' : ''}}">
+        <t-icon wx:if="{{value1 == index}}" name="check" t-class="card__icon" ariaHidden="{{true}}" />
+        <t-radio value="{{index}}" label="{{item.label}}" icon="none" borderless />
+      </view>
+    </t-radio-group>
   </view>
+</view>
 
 
 
@@ -96,16 +95,16 @@
   <t-loading wx:if="{{active}}" t-class="loading" theme="spinner" size="40rpx" class="wrapper" />
 </view>
 
-<view class="chat-card left" wx:if="{{symptomResult==='有'}}"> 
+<view class="chat-card left" wx:if="{{symptomResult==='有'}}">
   <view class="chat-card__avatar ">
     <image src="../../assets/robot.png" mode="aspectFill" />
   </view>
   <view class="chat-card__content">
-     <t-cell t-class="cell-border-gradient" title="请描述新的症状?"></t-cell>
-     </view>
+    <t-cell t-class="cell-border-gradient" title="请描述新的症状?"></t-cell>
   </view>
+</view>
 
-    <view class="chat-card right" wx:if="{{messages[0].content && symptomResult==='有'}}">
+<view class="chat-card right" wx:if="{{messages[0].content && symptomResult==='有'}}" >
   <view class="chat-card__avatar ">
     <user-avatar></user-avatar>
   </view>
@@ -116,16 +115,16 @@
 </view>
 
 
-<view class="chat-card left" wx:if="{{messages.length>0 || symptomResult==='没有' }}"> 
+<view class="chat-card left" wx:if="{{messages.length>0 || symptomResult==='没有' }}">
   <view class="chat-card__avatar ">
     <image src="../../assets/robot.png" mode="aspectFill" />
   </view>
   <view class="chat-card__content">
-     <t-cell t-class="cell-border-gradient" title="请问还有其他要补充的吗?"></t-cell>
-     </view>
+    <t-cell t-class="cell-border-gradient" title="请问还有其他要补充的吗?"></t-cell>
   </view>
+</view>
 
-    <view class="chat-card right" wx:if="{{symptomResult==='有'?messages[1].content:false || symptomResult==='没有'?messages[0].content:false}}">
+<view class="chat-card right" wx:if="{{symptomResult==='有'?messages[1].content:false || symptomResult==='没有'?messages[0].content:false}}">
   <view class="chat-card__avatar ">
     <user-avatar></user-avatar>
   </view>
@@ -138,9 +137,9 @@
 
 
 
-<view class="input-panel" style="bottom:{{inputBoxBottom}}px;" wx:if="{{showrePlenish}}" >
-  <input bind:input="handleInput" value="{{inputText}}" adjust-position="{{false}}" placeholder="请输入"  bind:focus="onInputFocus" bind:blur="onInputBlur"
-   confirm-type="send" />
+<view class="input-panel" style="bottom:{{inputBoxBottom}}rpx;" wx:if="{{showrePlenish}}">
+  <input bind:input="handleInput" value="{{inputText}}" adjust-position="{{false}}" placeholder="{{placeholder}}" 
+  bind:focus="onInputFocus" bind:blur="onInputBlur" confirm-type="send" focus="{{inputFocus}}" />
   <view class="send-btn" bind:tap="send">发送</view>
 </view>
 
@@ -161,7 +160,4 @@
       </grid-builder>
     </scroll-view>
   </view>
-</t-popup>
-
-
-
+</t-popup>

+ 3 - 0
miniprogram/module/chats/components/message-follow/message-follow.scss

@@ -7,4 +7,7 @@
 .chat-card__handle .item {
   width: 280px * 0.5;
   height: 52px * 0.5;
+}
+.health-report{
+  color: #1D6FF6 !important;
 }

+ 2 - 1
miniprogram/module/chats/components/message-select/message-select.ts

@@ -104,7 +104,7 @@ Component({
       if (!this.data.hasSelected) {
         wx.showToast({ title: '请至少选择一项', icon: 'error' })
       } else {
-        console.log(this.data.options);
+        console.log(this.data.options,"提交");
         const result = this.data.options
           .filter((item: any) => item?.checked && !item?.hide)
           .map((option: any) => {
@@ -116,6 +116,7 @@ Component({
           })
           .join('; ');
         this.setData({ result })
+
         this.triggerEvent('next', { options: this.data.options });
       }
     },

+ 2 - 2
miniprogram/module/chats/components/message-select/message-select.wxml

@@ -38,10 +38,10 @@
     </scroll-view>
     <view wx:if="{{payload.multiple || !payload.required}}" class="chat-card__handle {{active ? '' : 'disabled'}}">
       <view wx:if="{{!payload.required}}" class="item {{hasSelected ? 'disabled': ''}}" bind:tap="onSkip">
-        <view class="not-change">无变化</view>
+        <view class="not-change">都没有</view>
       </view>
       <view wx:if="{{payload.multiple}}" class="item" bind:tap="onSubmit">
-        <view class="sub-btn">选好了</view>
+        <view class="sub-btn">提交</view>
       </view>
     </view>
   </view>

+ 2 - 2
miniprogram/module/chats/components/message-system/message-system.scss

@@ -8,8 +8,8 @@
   .title {
     padding: 4px 12px;
     font-size: 12px;
-    color: #7F96A7;
-    background-color: #1B4F34;
+    color: white;
+    background-color: #1D6FF6;
     border-radius: 5px;
   }
 

+ 7 - 4
miniprogram/module/chats/components/questionnaire/questionnaire.ts

@@ -80,11 +80,13 @@ Component({
       this.setData({ messageType: event.detail.MessageType });
       this._next();
     },
+    scroll(option: { id: string }) {
+      this.triggerEvent("to", option.detail.id);
+    },
     boxBottom(event: boxBottom) {
-      console.log(event, "监听页面高度event");
       this.setData({ inputBoxBottom: event.detail.inputBoxBottom });
       this.triggerEvent("boxBottom", {
-        inputBoxBottom: this.data.inputBoxBottom,
+        inputBoxBottom: this.data.inputBoxBottom+100,
       });
       console.log(this.data.inputBoxBottom, "监听页面高度boxbottom");
     },
@@ -99,7 +101,7 @@ Component({
         this._next();
       } else {
         this._createMessage({
-          id: 2,
+          id: `follow.${Date.now()}`,
           type: "follow",
           payload: { title: "" },
         });
@@ -112,6 +114,7 @@ Component({
           {},
           {
             transform({ data }: any) {
+              console.log(data, "剩余次数");
               return data?.residuedCou;
             },
           }
@@ -177,7 +180,7 @@ Component({
       try {
         if (this.data.messageType === 1) {
           this._createMessage({
-            id: 1,
+            id: `again.${Date.now()}`,
             type: "again",
             payload: { title: "" },
           });

+ 1 - 1
miniprogram/module/chats/components/questionnaire/questionnaire.wxml

@@ -8,7 +8,7 @@
 </wxs>
 <!--module/chats/components/questionnaire/questionnaire.wxml-->
 <block wx:for="{{messages}}" wx:key="id">
-  <message-again wx:if="{{_.show(item,'again')}}" bind:nextType="nextType" workId="{{workId}}" bind:boxBottom="boxBottom" />
+  <message-again wx:if="{{_.show(item,'again')}}" bind:nextType="nextType" workId="{{workId}}" bind:boxBottom="boxBottom" bind:scroll="scroll"/>
   <message-count wx:elif="{{_.show(item,'count')}}" payload="{{item.payload}}" id="{{item.id}}" active="{{_.active(lastId,item.id)}}" bind:next="handle" /> 
   <message-analysis wx:elif="{{_.show(item,'analysis')}}" active="{{_.active(lastId,item.id)}}" id="{{item.id}}" payload="{{item.payload}}" bind:next="handle" messageType="{{messageType}}" />
   <message-follow wx:elif="{{_.show(item,'follow')}}" bind:nextType="nextType" workId="{{workId}}" bind:boxBottom="boxBottom" />

+ 10 - 47
miniprogram/module/chats/pages/analysis/analysis.ts

@@ -80,16 +80,6 @@ Component({
       followObj: wx.getStorageSync("followObj"),
       workId: wx.getStorageSync("workId"),
     });
-    // 确保按钮初始状态可用
-    setTimeout(() => {
-      console.log('[Analysis] Initializing button state...');
-      const submitBtn = this.selectComponent('#submitBtn');
-      console.log('[Analysis] Found submit button:', submitBtn);
-      if (submitBtn) {
-        console.log('[Analysis] Resetting button state');
-        submitBtn.resetState();
-      }
-    }, 100);
   },
   methods: {
     handle(event: WechatMiniprogram.TouchEvent) {
@@ -155,51 +145,22 @@ Component({
         });
     },
     async onSubmit() {
-      console.log('[Analysis] Submit started');
       const submitBtn = this.selectComponent('#submitBtn');
-      console.log('[Analysis] Found submit button:', submitBtn);
-      
-      // Check if enough time has passed since the last reset
-      const now = Date.now();
-      if (now - this.data._lastResetTime < 100) {
-        console.log('[Analysis] Skipping disable - too soon after reset');
-        return;
-      }
-      
-      // 开始提交时禁用按钮
-      if (submitBtn) {
-        console.log('[Analysis] Disabling button');
-        submitBtn.setData({ isDisabled: true });
-      }
-
       const data = {
         thumbnail: [] as any,
         source: [] as any,
       };
-
-      // 验证前重置按钮状态
-      const resetButton = () => {
-        console.log('[Analysis] Resetting button state');
-        const btn = this.selectComponent('#submitBtn');
-        console.log('[Analysis] Found submit button:', btn);
-        if (btn) {
-          this.setData({ _lastResetTime: Date.now() });
-          console.log('[Analysis] Calling resetState');
-          btn.resetState();
-        }
-      };
-
       for (let index = 0; index < this.data.uploadList.length; index++) {
         const item = this.data.uploadList[index];
         if (this.data._queue[index]) {
           console.log('[Analysis] Upload in progress, resetting button');
           wx.showToast({ title: `请等待图片上传完毕`, icon: "none" });
-          resetButton();
+          submitBtn?.resetState();
           return;
         } else if (item.required && !this.data.original[index]) {
           console.log('[Analysis] Missing required image, resetting button');
           wx.showToast({ title: `请上传${item.label}`, icon: "none" });
-          resetButton();
+          submitBtn?.resetState();
           return;
         }
         if (this.data.original[index])
@@ -214,19 +175,21 @@ Component({
           });
       }
       let imageObj: any = {
-        upImg: this.data.thumbnail[0],
-        downImg: this.data.thumbnail[1],
-        faceImg: this.data.thumbnail[2],
+        upImg: this.data.original[0],
+        downImg: this.data.original[1],
+        faceImg: this.data.original[2],
       };
+      
+      // console.log(this.data.followObj, "this.data.followObj");
       this.setData({
         activeObj: { ...imageObj, ...this.data.followObj },
       });
-      console.log({ ...this.data.activeObj }, "activeObj");
+      // console.log({ ...this.data.activeObj }, "activeObj");
       let isAnalysis: number;
       if (this.data.messageType === 2) {
         isAnalysis = wx.getStorageSync("isAnalysis");
       }
-      console.log(this.data.messageType, "messageType", isAnalysis);
+      // console.log(this.data, "messageType", isAnalysis);
       if (isAnalysis === 2) {
         // 提交随访提醒
         try {
@@ -249,7 +212,7 @@ Component({
         } catch (error) {
           console.log('[Analysis] Submit failed, resetting button');
           wx.showToast({ title: error?.errMsg ?? "提交失败", icon: "none" });
-          resetButton();
+          submitBtn?.resetState();
         }
       } else {
         // 对话管家

+ 12 - 15
miniprogram/module/chats/pages/index/index.scss

@@ -1,15 +1,20 @@
-@import '../../../../themes/page.scss';
+@import "../../../../themes/page.scss";
 
 /* module/chats/pages/index/index.wxss */
-.chats-container {
-  position: relative;
-  height: 100vh;
-  background-color: #f7f7f7;
-}
 
 .page-scroll__container {
   box-sizing: border-box;
   overflow-y: auto;
+
+}
+
+.chats-container {
+  position: relative;
+  height: 100vh;
+  background-image: url("/assets/bg/bg_dialog@2x.png");
+  background-size: 100% 100%;
+  background-repeat: no-repeat;
+  background-color: #f5f6f7;
 }
 
 .tabbar-container {
@@ -23,14 +28,6 @@
   box-shadow: 0 -2rpx 6rpx rgba(0, 0, 0, 0.1);
 }
 
-.chats-container{
-
-background-image: url("/assets/bg/bg_dialog@2x.png");
-background-size: 100% 100%;
-background-repeat: no-repeat;
-background-color: #F5F6F7;
-}
-
 .chat {
   padding: 24px 12px;
 }
@@ -54,4 +51,4 @@ background-color: #F5F6F7;
     color: #999;
     margin-bottom: 6px;
   }
-}
+}

+ 40 - 7
miniprogram/module/chats/pages/index/index.ts

@@ -31,7 +31,19 @@ Component({
       });
       const component = this.data.component as "guide" | "questionnaire";
       this.handle({ detail: { component, scroll: true } });
-      console.log("id-index",this.data);
+      // 计算底部bottom
+      const systemInfo = wx.getSystemInfoSync();
+      const windowHeight = systemInfo.windowHeight;
+      const safeAreaBottom = systemInfo.safeArea?.bottom ?? windowHeight; // 没有safeArea时,bottom等于windowHeight
+      const safeBottom = windowHeight - safeAreaBottom; // 安全区底部距离(px)
+      const safeBottomRpx = (750 / systemInfo.windowWidth) * safeBottom; // rpx
+      console.log(safeBottom, "safeBottom");
+      // const tabbarHeight = 40; // 你的tabbar高度,单位px(如80rpx转px,或直接用rpx)
+      // let paddingBottom = tabbarHeight + safeBottom;
+      this.setData({
+        paddingBottom: this.data.paddingBottom+safeBottomRpx,
+      });
+      console.log(this.data.paddingBottom, "paddingBottom");
     },
     ready() {
       wx.createSelectorQuery()
@@ -52,20 +64,28 @@ Component({
     date: "",
     messages: {} as Record<number, Message>,
     lastId: "",
-    inputBoxBottom:0,
-    tabbarValue:"/module/chats/pages/index/index",
+    inputBoxBottom: 0,
+    tabbarValue: "/module/chats/pages/index/index",
     analysisCount: 0,
+    paddingBottom: 100,  // 底部tabbar高度是100
   },
   observers: {
     "messages.**"(messages) {
       const message = Object.values(messages).pop() as Message;
       this.setData({ lastId: message?.id });
     },
+    // calc(100rpx + env(safe-area-inset-bottom))
   },
   methods: {
     boxBottom(event: boxBottom) {
-      console.log(event, "监听页面index高度event");
-      this.setData({ inputBoxBottom: event.detail.inputBoxBottom+60 });
+      console.log(event.detail.inputBoxBottom, "监听页面index高度boxbottom");
+      this.setData({
+        inputBoxBottom: event.detail.inputBoxBottom,
+      });
+      // const bottom=this.data.paddingBottom;
+      this.setData({
+        paddingBottom: event.detail.inputBoxBottom,
+      });
       console.log(this.data.inputBoxBottom, "监听页面index高度boxbottom");
     },
     nextType(event: NextTypeEvent) {
@@ -73,6 +93,7 @@ Component({
     },
     getCount(event: GetCountEvent) {
       this.setData({ analysisCount: event.detail.analysisCount });
+      console.log(this.data.analysisCount, "监听页面index高度getCount");
     },
     handle(event: HandleEvent) {
       const index = Object.keys(this.data.messages).length;
@@ -85,12 +106,24 @@ Component({
       if (event.detail?.scroll) this.scrollIntoView();
     },
     scrollIntoView(event?: ScrollIntoViewEvent) {
+      console.log(event, "index-scrollIntoView");
       clearTimeout(getScrollcontext.call(this).timer);
       const id = event?.detail ?? this.data.lastId;
+      console.log(id, "index-scrollIntoView");
+
       getScrollcontext.call(this).timer = setTimeout(() => {
-        getScrollcontext
+        const scroll = getScrollcontext
           .call(this)
-          .scroll?.scrollIntoView(`#${id}`, { alignment: "end" });
+          .scroll;
+
+        if(id === "bottom"){
+          scroll?.scrollTo({
+            top: Number.MAX_SAFE_INTEGER,
+            animated: true
+           })
+        }else{
+          scroll?.scrollIntoView(`#${id}`, { alignment: "end" });
+        }
       }, 300);
     },
   },

+ 3 - 2
miniprogram/module/chats/pages/index/index.wxml

@@ -18,7 +18,7 @@
     enable-passive 
     scroll-into-view="{{lastId}}" 
     scroll-into-view-alignment="end" 
-    style="height: calc(100vh - 180rpx); padding-bottom: calc(100rpx + env(safe-area-inset-bottom));"
+    style="height: calc(100vh - 180rpx); padding-bottom:{{paddingBottom}}rpx;"
   >
     <view class="system-wrapper">
       <view class="date">{{date}}</view>
@@ -27,7 +27,8 @@
     
     <block wx:for="{{messages}}" wx:key="id">
       <chat-guide wx:if="{{(_.show(item, 'guide') && isShowGuide)}}" id="{{item.id}}" active="{{_.active(lastId, item.id)}}" bind:next="handle" bind:to="scrollIntoView" bind:nextType="nextType" bind:getCount="getCount" analysisCount="{{analysisCount}}" />
-      <chat-questionnaire wx:if="{{_.show(item, 'questionnaire') && messageType}}" id="{{item.id}}" active="{{_.active(lastId, item.id)}}" bind:next="handle" bind:to="scrollIntoView" bind:nextType="nextType" messageType="{{messageType}}" workId="{{id}}" bind:boxBottom="boxBottom" />
+      <chat-questionnaire wx:if="{{_.show(item, 'questionnaire') && messageType}}" id="{{item.id}}" active="{{_.active(lastId, item.id)}}" bind:next="handle" 
+      bind:to="scrollIntoView" bind:nextType="nextType" messageType="{{messageType}}" workId="{{id}}" bind:boxBottom="boxBottom" />
     </block>
   </scroll-view>
 

+ 0 - 1
miniprogram/module/follow/pages/evaluation/report.ts

@@ -2,7 +2,6 @@ import { Get } from "../../../../lib/request/method";
 
 Page({
   onLoad(options: { id: number }) {
-    console.log("options", options);
     if (options.id) {
       this.getReport(options.id);
     }

+ 13 - 13
miniprogram/module/follow/pages/evaluation/report.wxml

@@ -1,18 +1,18 @@
 <t-navbar title="随访评估报告" left-arrow />
 <scroll-view class="page-container" scroll-y>
- 
- <view>
+
+  <view wx:if="{{tasks.length>0}}">
     <view class="follow-box" style="padding-top:20px">
       <view class="title">随访计划:</view>
       <view class="content">{{followDetail.followupPlanName}}</view>
     </view>
-    
+
     <view class="follow-box">
       <view class="title">评估结果:</view>
       <view class="content">{{followDetail.evaluate.evaluateDeal==='1'?'复诊':followDetail.evaluate.evaluateDeal==='2'?'中医调养':''}}</view>
     </view>
 
- <view class="follow-box">
+    <view class="follow-box">
       <view class="title">疾病专归:</view>
       <view class="content">{{followDetail.evaluate.evaluateSituation==='1'?'痊愈':followDetail.evaluate.evaluateSituation==='2'?'好转':followDetail.evaluate.evaluateSituation==='3'?'无变化':followDetail.evaluate.evaluateSituation==='4'?'恶化':''}}</view>
     </view>
@@ -28,10 +28,10 @@
       <view class="title">评估日期:</view>
       <view class="content">{{followDetail.evaluateTime}}</view>
     </view>
-    </view>
+  </view>
 
 
- <view class="follow-record">随访记录</view>
+  <view class="follow-record">随访记录</view>
 
   <block wx:for="{{tasks}}" wx:key="id" wx:for-item="task">
     <view style="margin-bottom:16px">
@@ -55,7 +55,7 @@
           </view>
         </view>
 
-       <view class="new-symptoms">
+        <view class="new-symptoms">
           <view>2、请问有没有出现新的症状?</view>
           <view style="margin-left:20px;margin-top:10px">{{task.fillin.isHaveNewSyndrome==='Y'?'有':task.fillin.isHaveNewSyndrome==='N'?'没有':'无'}}</view>
         </view>
@@ -64,22 +64,22 @@
           <view>3、如果有其他情况吗,请留言?</view>
           <view style="margin-left:20px;margin-top:10px">{{task.fillin.otherDesc?task.fillin.otherDesc:'用户暂无留言~'}}</view>
         </view>
-        
-          <view class="image-box" wx:if="{{task.fiilin.upImg || task.fillin.downImg || task.fillin.faceImg}}">
+
+        <view class="image-box" wx:if="{{task.fiilin.upImg || task.fillin.downImg || task.fillin.faceImg}}">
           <image class="tongue__img" src="{{task.fiilin.upImg}}" mode="aspectFit" />
           <image class="tongue__img" src="{{task.fillin.downImg}}" mode="aspectFit" />
           <image class="tongue__img" src="{{task.fillin.faceImg}}" mode="aspectFit" />
         </view>
 
-      <view class="report-box" wx:if="{{task.tonguefaceAnalysisReportId}}">
-          <image class="icon-bg" src="../../assets/icon/icon_report.png"  />
+        <view class="report-box" wx:if="{{task.tonguefaceAnalysisReportId}}">
+          <image class="icon-bg" src="../../assets/icon/icon_report.png" />
           <view bind:tap="goSeeFaceReport" data-id="{{task.tonguefaceAnalysisReportId}}">查看舌面象分析报告</view>
         </view>
 
-         
+
 
       </view>
     </view>
   </block>
-  
+
 </scroll-view>

二進制
miniprogram/module/health/assets/icon/icon_treatment@3x.png


二進制
miniprogram/module/health/assets/image/health-report.png


+ 20 - 5
miniprogram/module/health/components/card-analysis/card-analysis-content.scss

@@ -2,6 +2,18 @@
 @import "../../report-common.scss";
 @import "../../../../themes/card.scss";
 /* module/health/components/card-analysis/card-analysis-content.wxss */
+.togue-title{
+  font-size: 16px;
+  color: black;
+  font-weight: 500;
+  text-align: center;
+  width: 100%;
+  height: 50px;
+  line-height: 50px;
+  background-color: white;
+  border-radius: 10px 10px 0 0;
+  
+}
 .picture-container {
   display: flex;
   margin: 20px 0;
@@ -54,18 +66,20 @@
   align-items: center;
 }
 .tongue-container{
-  padding: var(--td-cell-horizontal-padding, 32rpx) !important;
-  background: linear-gradient(180deg, #D6E4F5 0%, #F3F4F6 100%);
+  padding: 0px 5px 0px 5px;
 }
+  // padding: var(--td-cell-horizontal-padding, 32rpx) !important;
+  // background: linear-gradient(180deg, #D6E4F5 0%, #F3F4F6 100%);
+
 .constitution-container{
-  border-radius: 20rpx;
+  border-radius: 0 0 10px 10px;
  
 }
 .card-title{
   display: flex;
   align-items: center;
   justify-content: space-between;
-  margin-bottom: 10rpx;
+  margin-bottom: 20rpx;
 }
 .text-title{
   font-size: 16px;
@@ -107,7 +121,8 @@
     font-weight: 500;
     background-color: #B4D1FF;
     &:first-child {
-      background-color: #EFF4F9;
+      // background-color: #EFF4F9;
+      background-color: #B4D1FF;
       border-radius: 10px 0 0 0;
     }
   }

+ 9 - 1
miniprogram/module/health/components/card-analysis/card-analysis-content.ts

@@ -3,7 +3,13 @@ import { AnalysisException, AnalysisModel } from "../../model/health.model";
 
 // module/health/components/card-analysis/card-analysis-content.ts
 Component({
-
+  lifetimes: {
+    attached() {
+      if(this.properties.type==='files'){ 
+        this.setData({ isShowType: true });
+      }
+    }
+  },
   /**
    * 组件的属性列表
    */
@@ -12,6 +18,7 @@ Component({
     face: { type: Object, value: null },
     simple: { type: Object, value: { tongue: false, face: false } },
     exception: { type: Object, value: { tongue: false, face: false } },
+    type: { type: String, value: '' },
   },
   observers: {
     'exception.tongue, tongue'(show: boolean, tongue: AnalysisModel) {
@@ -30,6 +37,7 @@ Component({
   data: {
     tongueException: [],
     faceException: [],
+    isShowType: '',
   },
   methods: {
     async preview(event: WechatMiniprogram.TouchEvent) {

+ 12 - 4
miniprogram/module/health/components/card-analysis/card-analysis-content.wxml

@@ -1,7 +1,13 @@
 <!--module/health/components/card-analysis/card-analysis-content.wxml-->
-<view class="card-wrapper tongue-container" wx:if="{{tongue.result}}" mark:type="tongue" bind:tap="preview">
+<view class="card-wrapper tongue-container" wx:if="{{tongue.result}}" 
+mark:type="tongue" bind:tap="preview">
 
-  <view class="card-title">
+<view wx:if="{{isShowType}}">
+<view class="togue-title"> 舌象</view>
+</view>
+
+
+  <view class="card-title" wx:else>
     <view class="tongue-right">
       <view>
         <image src="../../assets/icon/icon_tongue@2x.png" class="icon-title" />
@@ -46,8 +52,10 @@
 <exception wx:if="{{tongueException.length}}" dataset="{{tongueException}}"></exception>
 
 <view class="card-wrapper tongue-container" wx:if="{{face.result}}" mark:type="face" bind:tap="preview">
-
-  <view class="card-title">
+<view wx:if="{{isShowType}}">
+<view class="togue-title"> 面象</view>
+</view>
+  <view class="card-title" wx:else>
     <view class="tongue-right">
       <view>
         <image src="../../assets/icon/icon_face@2x.png" class="icon-title" />

+ 6 - 0
miniprogram/module/health/components/care-record/care-record.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "t-popup": "tdesign-miniprogram/popup/popup"
+  }
+}

+ 77 - 0
miniprogram/module/health/components/care-record/care-record.scss

@@ -0,0 +1,77 @@
+@import "../../../../themes//t.cell.scss";
+@import "../../report-common.scss";
+@import "../../../../themes/card.scss";
+/* module/health/components/follow-evaluation/follow-evaluation.wxss */
+.card-wrapper {
+  margin: 0 0rpx 30rpx 0;
+}
+
+.constitution-container {
+  border-radius: 20rpx;
+  background: linear-gradient(180deg, #D6E4F5 0%, #F3F4F6 100%);
+  padding: 0px 10px 10px 10px;
+}
+
+.text-title {
+  font-size: 16px;
+  color: black;
+  font-weight: 500;
+}
+
+.card-title {
+  display: flex;
+  align-items: center;
+  margin-bottom: 10rpx;
+}
+
+.icon-title {
+  width: 20px;
+  height: 20px;
+  margin-right: 10rpx;
+}
+
+.card-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 10rpx;
+  padding: 20px 0 0px 0 !important;
+}
+
+.table {
+  background: #FFFFFF;
+  border: 1px solid #EEEEEE;
+  border-radius: 8px;
+  
+  .table-row {
+    display: flex;
+    border-bottom: 1px solid #EEEEEE;
+    height: 40px;
+    line-height: 40px;
+    border-radius: 8px 8px 0px 0px;
+    
+    &:last-child {
+      border-bottom: none;
+    }
+    
+    &.header {
+      background: #EEEEEE;
+      font-weight: 500;
+    }
+  }
+  
+  .table-cell {
+    flex: 1;
+    padding: 0 16rpx;
+    text-align: center;
+    font-size: 28rpx;
+    color: #191919;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    
+    &:first-child {
+      text-align: center;
+    }
+  }
+}

+ 46 - 0
miniprogram/module/health/components/care-record/care-record.ts

@@ -0,0 +1,46 @@
+// module/health/components/field-ruler/field-ruler.ts
+import { getCareRecordListMethod } from "../../request";
+Component({
+  behaviors: ["wx://form-field-group"],
+  lifetimes: {
+    attached() {
+      this.getCareRecordList();
+    },
+  },
+  methods: {
+    async getCareRecordList() {
+      // 0 进行中 1 已完成
+      const res = await getCareRecordListMethod("0");
+      // console.log(res,"所有的调养记录列表");
+      if(res && res.data && res.data.length > 0) {
+        this.setData({
+          careRecordList: res.data,
+        });
+      } else {
+        this.setData({
+          careRecordList: [],
+        });
+      }
+    },
+    goDetail(e: any) {
+      const id = e.currentTarget.dataset.id;
+      if(id) {
+        wx.navigateTo({
+          url: `/module/care/pages/careDetail/careDetail?id=${id}`,
+        });
+      }
+  },
+  },
+  properties: {},
+
+  /**
+   * 组件的初始数据
+   */
+  data: {
+    loading: false,
+    careRecordList: [
+    ],
+  },
+  observers: {},
+ 
+});

+ 28 - 0
miniprogram/module/health/components/care-record/care-record.wxml

@@ -0,0 +1,28 @@
+<wxs module="_">
+
+</wxs>
+<!--module/health/components/care-record/care-record.wxml-->
+<view class="card-wrapper">
+  <view class="constitution-container">
+    <view class="card-header">
+      <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
+      <view class="card-title">
+        <view><image src="../../assets/icon/icon_record@2x.png" class="icon-title" /></view>
+        <view class="text-title">调养记录</view>
+      </view>
+      <slot name="extra"></slot>
+    </view>
+    <view class="table">
+      <view class="table-row header">
+        <view class="table-cell">开具时间</view>
+        <view class="table-cell">服务包名称</view>
+      </view>
+      <view class="table-row" wx:for="{{careRecordList}}" wx:key="id" bindtap="goDetail" data-id="{{item.id}}">
+        <view class="table-cell">{{item.operateTime}}</view>
+        <view class="table-cell">{{item.conditioningWrapName}}</view>
+      </view>
+    </view>
+  </view>
+</view>
+
+

+ 6 - 0
miniprogram/module/health/components/care-scheme/care-scheme.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "t-popup": "tdesign-miniprogram/popup/popup"
+  }
+}

+ 125 - 0
miniprogram/module/health/components/care-scheme/care-scheme.scss

@@ -0,0 +1,125 @@
+@import "../../../../themes//t.cell.scss";
+@import "../../report-common.scss";
+@import "../../../../themes/card.scss";
+
+/* module/health/components/follow-evaluation/follow-evaluation.wxss */
+.card-wrapper {
+  margin: 0 0 10px 0 !important;
+}
+
+.constitution-container {
+  margin-top: 15px;
+  border-radius: 20rpx;
+  background: linear-gradient(180deg, #D6E4F5 0%, #F3F4F6 100%);
+  padding: 0px 10px 10px 10px;
+}
+
+.text-title {
+  font-size: 16px;
+  color: black;
+  font-weight: 500;
+}
+
+.card-title {
+  display: flex;
+  align-items: center;
+  margin-bottom: 10rpx;
+  padding-left: 4px;
+}
+
+.icon-title {
+  width: 20px;
+  height: 20px;
+  margin-right: 10rpx;
+}
+
+.card-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 10rpx;
+  padding: 20px 0 0px 0 !important;
+}
+
+.care-scheme-outer {
+  background: linear-gradient(135deg, #e3f0ff 0%, #f6fafd 100%);
+  border-radius: 20rpx;
+  padding: 24rpx 0 0 0;
+  margin: 0 24rpx;
+}
+
+.care-scheme-header {
+  display: flex;
+  align-items: center;
+  padding: 0 32rpx 16rpx 32rpx;
+}
+
+.header-icon {
+  border: 1.5rpx dashed #1976d2;
+  border-radius: 8rpx;
+  background: #fff;
+  margin-right: 16rpx;
+  padding: 6rpx;
+}
+
+.header-title {
+  font-size: 30rpx;
+  font-weight: 600;
+  color: #222;
+}
+
+.care-scheme-card {
+  background: #fff;
+  border-radius: 16rpx;
+  margin: 0 24rpx 24rpx 24rpx;
+  padding: 24rpx 24rpx 18rpx 24rpx;
+  box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.03);
+}
+
+.scheme-title-row {
+  display: flex;
+  align-items: center;
+  margin-bottom: 18rpx;
+}
+
+.status-tag {
+  margin-right: 16rpx;
+  background-color: #1976d2;
+  color: #fff;
+  padding: 5px 10px;
+  border-radius: 5px;
+}
+
+.scheme-title {
+  font-size: 28rpx;
+  font-weight: 500;
+  color: #222;
+}
+
+.scheme-list {
+  margin-top: 8rpx;
+}
+
+.scheme-list-row {
+  width: 60%;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  font-size: 26rpx;
+  color: #222;
+  margin-bottom: 10rpx;
+}
+
+.item-name {
+  font-weight: 500;
+}
+
+.item-desc {
+  color: black;
+}
+.empty-data{
+  width: 94%;
+  margin: auto;
+  // border-top: 1px solid #E7E7E7;
+  padding: 10px 0 10px 0;
+}

+ 45 - 0
miniprogram/module/health/components/care-scheme/care-scheme.ts

@@ -0,0 +1,45 @@
+// module/health/components/field-ruler/field-ruler.ts
+import {  getCareRecordMethod } from "../../request";
+Component({
+  behaviors: ["wx://form-field-group"],
+  lifetimes: {
+    attached() {
+      this.getCareRecordList();
+    },
+  },
+   /**
+   * 组件的初始数据
+   */
+   data: {
+    loading: false,
+    careRecordList: [],
+  },
+  methods: {
+  // 获取调养记录列表
+  async getCareRecordList(e: any) {
+    const data = await getCareRecordMethod();  
+    if(data  && data.length > 0) {
+      this.setData({
+        careRecordList: data,
+      });
+    } else {
+      this.setData({
+        careRecordList: [],
+      });
+    }
+    // console.log(this.data.careRecordList,'调理中的调养记录列表11');
+    },
+    // 跳转调养方案详情
+    goDetail(e: any) {
+      const id = e.currentTarget.dataset.id;
+      if(id) {
+        wx.navigateTo({
+          url: `/module/care/pages/careDetail/careDetail?id=${id}`,
+        });
+      }
+  },
+  },
+  properties: {},
+  observers: {},
+ 
+});

+ 41 - 0
miniprogram/module/health/components/care-scheme/care-scheme.wxml

@@ -0,0 +1,41 @@
+<wxs module="_">
+
+</wxs>
+<!--module/health/components/care-scheme/care-scheme.wxml-->
+<view class="card-wrapper">
+  <view class="constitution-container">
+    <view class="card-header">
+      <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
+      <view class="card-title">
+        <view><image src="../../assets/icon/icon_record@2x.png" class="icon-title" /></view>
+        <view class="text-title">我的调养方案</view>
+      </view>
+      <slot name="extra"></slot>
+    </view>
+   
+ <view class="care-scheme-card"  style="margin:0" wx:if="{{careRecordList.length>0}}" >
+ <view wx:if="{{careRecordList && careRecordList[0].items.length>0}}" bind:tap="goDetail" data-id="{{careRecordList[0].id}}">
+    <view class="scheme-title-row">
+      <t-tag theme="primary" shape="round" size="small" class="status-tag">调理中</t-tag>
+      <text class="scheme-title" wx:if="{{careRecordList && careRecordList[0].conditioningWrapName}}">{{careRecordList[0].conditioningWrapName}}</text>
+    </view>
+    <view class="scheme-list" wx:for="{{careRecordList[0].items}}" wx:for-item="item" wx:key="index">
+      <view class="scheme-list-row">
+        <text class="item-name">{{item.conditioningProgramName}}</text>
+        <text class="item-desc">每{{item.frequencyType}}天{{item.frequencyMeasure}}{{item.convertUnit}}</text>
+      </view>
+    </view>
+    </view>
+    <view wx:else class="empty-data" >
+暂无数据
+</view>
+  </view>
+
+<view wx:else class="empty-data">
+暂无数据
+</view>
+
+  </view>
+</view>
+
+

+ 10 - 3
miniprogram/module/health/components/follow-evaluation/follow-evaluation.scss

@@ -3,7 +3,7 @@
 @import "../../../../themes/card.scss";
 /* module/health/components/follow-evaluation/follow-evaluation.wxss */
 .card-wrapper {
-  margin: 0 20rpx 30rpx;
+  margin: 0 0rpx 30rpx 0;
 }
 
 .constitution-container {
@@ -55,7 +55,7 @@
     }
     
     &.header {
-      background: #F5F7FA;
+      background: #EEEEEE;
       font-weight: 500;
     }
   }
@@ -69,10 +69,17 @@
     white-space: nowrap;
     overflow: hidden;
     text-overflow: ellipsis;
-    max-width: 0;
+    // max-width: 0;
     
     &:first-child {
       text-align: center;
     }
   }
 }
+
+.truncate {
+  width: 100px !important; /* Set your desired width */
+  white-space: nowrap; /* Prevent text from wrapping */
+  overflow: hidden; /* Hide overflow text */
+  text-overflow: ellipsis; /* Show ellipsis for overflow text */
+}

+ 16 - 4
miniprogram/module/health/components/follow-evaluation/follow-evaluation.ts

@@ -35,10 +35,22 @@ Component({
   methods: {
     async getFollowEvaluationList() {
       const res = await getFollowEvaluationListMethod();
-      console.log(res,"评估列表");
-      this.setData({
-        followEvaluationList: res.data,
-      });
+      // console.log(res,"评估列表");
+      if(res && res.data && res.data.length > 0){
+        this.setData({
+          followEvaluationList: res.data,
+        });
+      }else{
+        this.setData({
+          followEvaluationList: [],
+        });
+      }
+    },
+    goFollowEvaluation() {
+      console.log("评估详情");
+      // wx.navigateTo({
+      //   url: `/module/follow/pages/evaluation/report`,
+      // });
     },
   },
 });

+ 8 - 8
miniprogram/module/health/components/follow-evaluation/follow-evaluation.wxml

@@ -7,7 +7,9 @@
     <view class="card-header">
       <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
       <view class="card-title">
-        <view><image src="../../assets/icon/icon_assess@2x.png" class="icon-title" /></view>
+        <view>
+          <image src="../../assets/icon/icon_assess@2x.png" class="icon-title" />
+        </view>
         <view class="text-title">随访评估</view>
       </view>
       <slot name="extra"></slot>
@@ -18,13 +20,11 @@
         <view class="table-cell">随访计划</view>
         <view class="table-cell">评估结果</view>
       </view>
-      <view class="table-row" wx:for="{{followEvaluationList}}" wx:key="id">
-        <view class="table-cell">{{item.evaluateTime}}</view>
-        <view class="table-cell">{{item.followupPlanName}}</view>
-        <view class="table-cell">{{item.evaluate.evaluateDeal==='1'?'复诊 ':item.evaluate.evaluateDeal==='2'?'中医调养':''}}</view>
+      <view class="table-row" wx:for="{{followEvaluationList}}" wx:key="id" bindtap="goFollowEvaluation">
+        <view class="table-cell truncate">{{item.evaluateTime}}</view>
+        <view class="table-cell truncate">{{item.followupPlanName}}</view>
+        <view class="table-cell truncate">{{item.evaluate.evaluateDeal==='1'?'复诊 ':item.evaluate.evaluateDeal==='2'?'中医调养':''}}</view>
       </view>
     </view>
   </view>
-</view>
-
-
+</view>

+ 2 - 2
miniprogram/module/health/components/follow-record/follow-record.scss

@@ -3,7 +3,7 @@
 @import "../../../../themes/card.scss";
 /* module/health/components/follow-evaluation/follow-evaluation.wxss */
 .card-wrapper {
-  margin: 0 20rpx 30rpx;
+  margin: 0;
 }
 
 .constitution-container {
@@ -55,7 +55,7 @@
     }
     
     &.header {
-      background: #F5F7FA;
+      background: #EEEEEE;
       font-weight: 500;
     }
   }

+ 3 - 0
miniprogram/module/health/components/follow-record/follow-record.ts

@@ -15,6 +15,9 @@ Component({
         followEvaluationList: res.data,
       });
     },
+    goFollowRecord(e: any) {
+      console.log(e, "记录列表");
+    },
   },
   properties: {},
 

+ 5 - 5
miniprogram/module/health/components/follow-record/follow-record.wxml

@@ -7,7 +7,9 @@
     <view class="card-header">
       <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
       <view class="card-title">
-        <view><image src="../../assets/icon/icon_record@2x.png" class="icon-title" /></view>
+        <view>
+          <image src="../../assets/icon/icon_record@2x.png" class="icon-title" />
+        </view>
         <view class="text-title">随访记录</view>
       </view>
       <slot name="extra"></slot>
@@ -18,13 +20,11 @@
         <view class="table-cell">随访计划</view>
         <view class="table-cell">状态</view>
       </view>
-      <view class="table-row" wx:for="{{followEvaluationList}}" wx:key="id">
+      <view class="table-row" wx:for="{{followEvaluationList}}" wx:key="id" bindtap="goFollowRecord">
         <view class="table-cell">{{item.arrangeTime}}</view>
         <view class="table-cell">{{item.followupPlanName}}</view>
         <view class="table-cell">{{item.progress==='1'?'未完成':item.progress==='2'?'已完成':item.progress==='0'?'未开始':''}}</view>
       </view>
     </view>
   </view>
-</view>
-
-
+</view>

+ 7 - 0
miniprogram/module/health/components/nodrug-therapy/nodrug-therapy.json

@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {
+    "t-popup": "tdesign-miniprogram/popup/popup",
+    "t-icon": "tdesign-miniprogram/icon/icon"
+  }
+}

+ 105 - 0
miniprogram/module/health/components/nodrug-therapy/nodrug-therapy.scss

@@ -0,0 +1,105 @@
+@import "../../../../themes//t.cell.scss";
+@import "../../report-common.scss";
+@import "../../../../themes/card.scss";
+/* module/health/components/follow-evaluation/follow-evaluation.wxss */
+.card-wrapper {
+  margin: 0 0rpx 30rpx 0;
+}
+.constitution-container {
+  border-radius: 20rpx;
+  background: linear-gradient(180deg, #D6E4F5 0%, #F3F4F6 100%);
+  padding: 0px 0px 10px 10px;
+}
+
+.text-title {
+  font-size: 16px;
+  color: black;
+  font-weight: 500;
+}
+
+.card-title {
+  display: flex;
+  align-items: center;
+  margin-bottom: 10rpx;
+}
+
+.icon-title {
+  width: 20px;
+  height: 20px;
+  margin-right: 10rpx;
+}
+
+.card-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 10rpx;
+  padding: 20px 0 0px 0 !important;
+}
+.nodrug-therapy-outer {
+  background: linear-gradient(135deg, #e3f0ff 0%, #f6fafd 100%);
+  border-radius: 20rpx;
+  padding: 24rpx 0 0 0;
+  margin: 0 24rpx;
+}
+.nodrug-therapy-header {
+  display: flex;
+  align-items: center;
+  padding: 0 32rpx 16rpx 32rpx;
+  position: relative;
+}
+.header-icon {
+  border: 1.5rpx dashed #1976d2;
+  border-radius: 8rpx;
+  background: #fff;
+  margin-right: 16rpx;
+  padding: 6rpx;
+}
+.header-title {
+  font-size: 30rpx;
+  font-weight: 600;
+  color: #222;
+}
+.more-link {
+  position: absolute;
+  right: 32rpx;
+  color: #1976d2;
+  font-size: 24rpx;
+  display: flex;
+  align-items: center;
+}
+.nodrug-therapy-list {
+  margin: 0 24rpx 24rpx 24rpx;
+}
+.therapy-card {
+  background: #fff;
+  border-radius: 16rpx;
+  margin-bottom: 18rpx;
+  padding: 30rpx 24rpx 18rpx 24rpx;
+  box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.03);
+}
+.therapy-title {
+  font-size: 32rpx;
+  font-weight: 500;
+  color: #222;
+  margin-bottom: 20rpx;
+  text-align: center;
+}
+.therapy-row {
+  font-size: 28rpx;
+  color: #666;
+  margin-bottom: 8rpx;
+  display: flex;
+  flex-wrap: wrap;
+  text-align: center;
+}
+.label {
+  color: #999;
+  margin-right: 8rpx;
+}
+.empty-data{
+  width: 94%;
+  margin: auto;
+  border-top: 1px solid #E7E7E7;
+  padding-top: 10px;
+}

+ 42 - 0
miniprogram/module/health/components/nodrug-therapy/nodrug-therapy.ts

@@ -0,0 +1,42 @@
+// module/health/components/field-ruler/field-ruler.ts
+import { getOfflineTreatmentListMethod } from "../../request";
+Component({
+  behaviors: ["wx://form-field-group"],
+  lifetimes: {
+    attached() {
+      this.getOfflineTreatmentList();
+    },
+  },
+  methods: {
+    // 更多记录
+    onMore() {
+      wx.navigateTo({
+        url: "/module/care/pages/offlineTreatment/offlineTreatment",
+      });
+    },
+    async getOfflineTreatmentList() {
+      // 0 进行中 1 已完成
+      const res = await getOfflineTreatmentListMethod("0");
+      // console.log(res, "我的线下非药物治疗记录列表");
+      if(res && res.data && res.data.length > 0) {
+        this.setData({
+          offlineTreatmentList: res.data,
+        });
+      } else {
+        this.setData({
+          offlineTreatmentList: [],
+        });
+      }
+    },
+  },
+  properties: {},
+
+  /**
+   * 组件的初始数据
+   */
+  data: {
+    loading: false,
+    offlineTreatmentList: [],
+  },
+  observers: {},
+});

+ 41 - 0
miniprogram/module/health/components/nodrug-therapy/nodrug-therapy.wxml

@@ -0,0 +1,41 @@
+<wxs module="_">
+
+</wxs>
+<!--module/health/components/care-scheme/care-scheme.wxml-->
+<view class="card-wrapper">
+  <view class="constitution-container">
+    <view class="card-header">
+      <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
+      <view class="card-title">
+        <view>
+          <image src="../../assets/icon/icon_treatment@3x.png" class="icon-title" />
+        </view>
+        <view class="text-title">非药物治疗</view>
+      </view>
+      <view class="more-link" bindtap="onMore">
+      <text class="record">更多记录</text> 
+      <t-icon t-class="icon" name="chevron-right-double-s" size="24px" />
+      </view>
+      <slot name="extra"></slot>
+    </view>
+    <view class="nodrug-therapy-list" wx:if="{{offlineTreatmentList.length>0}}">
+      <block wx:for="{{offlineTreatmentList}}" wx:key="id">
+        <view class="therapy-card">
+          <view class="therapy-title">{{item.conditioningProgramName}}</view>
+          <view class="therapy-row">
+            <text class="label">下次时间:</text>
+            <text style="color:black">{{item.arrangeDate}}</text>
+          </view>
+          <view class="therapy-row">
+            <text class="label">机构:</text>
+            <text style="color:black">{{item.conditioningProgramSupplierName}}</text>
+          </view>
+        </view>
+      </block>
+    </view>
+    <view wx:else class="empty-data">
+      暂无数据
+    </view>
+
+  </view>
+</view>

+ 10 - 2
miniprogram/module/health/components/report-health-index/report-health-index.scss

@@ -3,8 +3,10 @@
 @import "../../../../themes/card.scss";
 /* module/health/components/report-health-index/report-health-index.wxss */
 .constitution-container {
-  border-radius: 20rpx;
+  border-radius: 20rpx 20rpx 0 0;
   background: linear-gradient(180deg, #D6E4F5 0%, #F3F4F6 100%);
+  margin: 0  !important;
+  padding: 0px 10px 10px 10px;
 }
 .text-title{
   font-size: 16px;
@@ -24,7 +26,7 @@
 .health-index {
   $size: 20px;
   $gap: 12px;
-  background-color: transparent;
+  // background-color: transparent;
 
 
   &__title {
@@ -121,4 +123,10 @@
       }
     }
   }
+}
+.nodata-box{
+  width: 94%;
+  margin: auto;
+  border-top: 1px solid #E7E7E7;
+  padding: 10px 0 10px 0;
 }

+ 21 - 13
miniprogram/module/health/components/report-health-index/report-health-index.wxml

@@ -1,18 +1,26 @@
 <!--module/health/components/report-health-index/report-health-index.wxml-->
-<view class="card-wrapper constitution-container">
-  <view class="card-header" style="background:transparent">
-    <block slot="title">
-      <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
-         <view class="card-title">
-    <view><image src="../../assets/icon/icon_index@2x.png" class="icon-title" /></view>
-    <view class="text-title">指标信息</view>
-    </view>
-    </block>
-    <block slot="right-icon">
-      <slot name="extra"></slot>
-    </block>
+<view>
+  <view class="card-wrapper constitution-container">
+    <view class="card-header" style="background:transparent;padding: 15px 0px 0 5px;">
+      <block slot="title">
+        <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
+        <view class="card-title">
+          <view>
+            <image src="../../assets/icon/icon_index@2x.png" class="icon-title" />
+          </view>
+          <view class="text-title">指标信息</view>
+        </view>
+      </block>
 
-    <view slot="description" wx:if="{{!loading && !dataset.length}}">暂无数据</view>
+
+      <block slot="right-icon">
+        <slot name="extra"></slot>
+      </block>
+
+    </view>
+    <view class="nodata-box">
+      <view slot="description" wx:if="{{!loading && !dataset.length}}" >暂无数据</view>
+    </view>
   </view>
 
   <t-cell wx:for="{{dataset}}" t-class="card-body health-index cell-border-gradient" t-class-title="health-index__title" t-class-description="health-index__slider">

+ 2 - 2
miniprogram/module/health/components/report-health-patient/report-health-patient.scss

@@ -17,7 +17,7 @@
 }
 .basic-info{
   color: black;
-  font-weight: 400;
+  font-weight: 500;
 }
 .card-body {
   .row+.row {
@@ -75,7 +75,7 @@
     .image-wrapper {
       flex: none;
       width: 100px;
-      height: 120px;
+      height: 100px;
       margin-right: 13px;
       border-radius: 10px;
     }

+ 11 - 9
miniprogram/module/health/components/report-health-patient/report-health-patient.wxml

@@ -4,19 +4,21 @@
 <view class="card-wrapper">
   <t-cell t-class="card-header no-body" bordered="{{false}}" t-class-description="patient-info-content">
     <block slot="description">
-    <image src="../../assets/image/health-report.png" class="user-image" mode="widthFix" />
+      <image src="../../assets/image/health-report.png" class="user-image" mode="widthFix" />
       <view class="content">
         <view class="row primary title">{{dataset.name}}</view>
         <view class="row">
           <span class="col">
             <text class="text-item">{{dictionary.label($dictionaries, 'sys_user_sex', dataset.sex)}}</text>
-            <text class="text-item">{{dataset.age}}岁</text>
+            <text class="text-item" wx:if="{{dataset.age}}">{{dataset.age}}岁</text>
             <block wx:for="{{specialPeriod}}" wx:key="*this">
               <text class="text-item" wx:if="{{dictionary.label($dictionaries,'women_special_period', item) !== '无'}}">{{dictionary.label($dictionaries,'women_special_period', item)}}</text>
             </block>
             <text class="text-item" wx:for="{{job}}" wx:key="*this">{{dictionary.label($dictionaries, 'job', item)}}</text>
             <view class="text-items" wx:if="{{dataset.phone}}"><text style="color:#8C8C8C">手机号:</text><text style="color:black">{{dataset.phone}}</text></view>
-            <view class="text-items"><text style="color:#8C8C8C">身份证号:</text><view style="color:black">{{dataset.cardno}}</view></view>
+            <view class="text-items"><text style="color:#8C8C8C" wx:if="{{dataset.cardno}}">身份证号:</text>
+              <view style="color:black">{{dataset.cardno}}</view>
+            </view>
           </span>
         </view>
       </view>
@@ -28,13 +30,13 @@
   <view class="card-box">
     <block slot="title">
       <text class="basic-info">基础信息</text>
-      <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" /> 
+      <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
     </block>
     <block slot="right-icon">
       <slot name="extra"></slot>
     </block>
     <view slot="description" wx:if="{{!loading && !dataset}}">暂无数据</view>
-</view>
+  </view>
 
   <view class="body-box">
     <image class="image-wrapper" src="../../assets/image/health-report.png" mode="aspectFill" />
@@ -43,21 +45,21 @@
         <view>{{dataset.willillStateName}}</view>
       </view>
       <view class="row">
-        <span class="col">
+        <span class="col" wx:if="{{dataset.height}}">
           <text style="color:#8C8C8C">身高:</text>
           <text>{{dataset.height}}cm</text>
         </span>
-        <span class="col">
+        <span class="col" wx:if="{{dataset.weight}}">
           <text style="color:#8C8C8C">体重:</text>
           <text>{{dataset.weight}}kg</text>
         </span>
       </view>
       <view class="row">
-        <span class="col">
+        <span class="col" wx:if="{{dictionary.label($dictionaries, 'sys_yes_no', dataset.drinkState)}}">
           <text style="color:#8C8C8C">饮酒:</text>
           <text>{{dictionary.label($dictionaries, 'sys_yes_no', dataset.drinkState)}}</text>
         </span>
-        <span class="col">
+        <span class="col" wx:if="{{dictionary.label($dictionaries, 'sys_yes_no', dataset.smokeState)}}">
           <text style="color:#8C8C8C">抽烟:</text>
           <text>{{dictionary.label($dictionaries, 'sys_yes_no', dataset.smokeState)}}</text>
         </span>

+ 2 - 1
miniprogram/module/health/components/report-health-status/report-health-status.json

@@ -8,6 +8,7 @@
     "t-loading": "tdesign-miniprogram/loading/loading",
     "t-empty": "tdesign-miniprogram/empty/empty",
     "card-report": "../../components/card-report/card-report",
-    "report-health-scheme": "../../components/report-health-scheme/report-health-scheme"
+    "report-health-scheme": "../../components/report-health-scheme/report-health-scheme",
+    "card-analysis-content": "../../components/card-analysis/card-analysis-content"
   }
 }

部分文件因文件數量過多而無法顯示