Explorar el Código

小程序修改第一版

张田田 hace 11 meses
padre
commit
d055339ff2
Se han modificado 100 ficheros con 3724 adiciones y 482 borrados
  1. 6 0
      .idea/vcs.xml
  2. 111 0
      .idea/workspace.xml
  3. 10 0
      miniprogram/app.json
  4. BIN
      miniprogram/assets/icon/icon_plan@3x.png
  5. 16 9
      miniprogram/components/button/button.ts
  6. 54 0
      miniprogram/components/record-index/record-index.js
  7. 6 0
      miniprogram/components/record-index/record-index.json
  8. 22 0
      miniprogram/components/record-index/record-index.wxml
  9. 21 0
      miniprogram/components/record-index/record-index.wxss
  10. 5 5
      miniprogram/components/tabbar/tabbar.ts
  11. 1 0
      miniprogram/lib/request/create.ts
  12. 3 0
      miniprogram/lib/use/use-phone.ts
  13. 1 1
      miniprogram/module/article/components/science-card/science-card.scss
  14. BIN
      miniprogram/module/care/assets/icon/icon_effect@3x.png
  15. BIN
      miniprogram/module/care/assets/icon/icon_health@2x.png
  16. BIN
      miniprogram/module/care/assets/icon/icon_report.png
  17. BIN
      miniprogram/module/care/assets/icon/icon_scheme@2x.png
  18. 13 0
      miniprogram/module/care/pages/care/verifyRecord.json
  19. 72 0
      miniprogram/module/care/pages/care/verifyRecord.scss
  20. 56 0
      miniprogram/module/care/pages/care/verifyRecord.ts
  21. 33 0
      miniprogram/module/care/pages/care/verifyRecord.wxml
  22. 25 0
      miniprogram/module/care/pages/careDetail/careDetail.json
  23. 557 0
      miniprogram/module/care/pages/careDetail/careDetail.scss
  24. 164 0
      miniprogram/module/care/pages/careDetail/careDetail.ts
  25. 249 0
      miniprogram/module/care/pages/careDetail/careDetail.wxml
  26. 17 0
      miniprogram/module/care/pages/offlineTreatment/offlineTreatment.json
  27. 97 0
      miniprogram/module/care/pages/offlineTreatment/offlineTreatment.scss
  28. 36 0
      miniprogram/module/care/pages/offlineTreatment/offlineTreatment.ts
  29. 52 0
      miniprogram/module/care/pages/offlineTreatment/offlineTreatment.wxml
  30. 13 0
      miniprogram/module/care/pages/reportRecord/reportRecord.json
  31. 49 0
      miniprogram/module/care/pages/reportRecord/reportRecord.scss
  32. 43 0
      miniprogram/module/care/pages/reportRecord/reportRecord.ts
  33. 17 0
      miniprogram/module/care/pages/reportRecord/reportRecord.wxml
  34. 23 0
      miniprogram/module/care/request.ts
  35. 163 0
      miniprogram/module/charts/components/record-index/chalk.theme.ts
  36. 110 0
      miniprogram/module/charts/components/record-index/health-index.ts
  37. 9 0
      miniprogram/module/charts/components/record-index/record-index.json
  38. 33 0
      miniprogram/module/charts/components/record-index/record-index.scss
  39. 95 0
      miniprogram/module/charts/components/record-index/record-index.ts
  40. 22 0
      miniprogram/module/charts/components/record-index/record-index.wxml
  41. 21 0
      miniprogram/module/charts/components/record-index/request.ts
  42. 1 1
      miniprogram/module/charts/ec-canvas/ec-canvas.wxss
  43. 6 0
      miniprogram/module/charts/record-care/record-care.json
  44. 11 0
      miniprogram/module/charts/record-care/record-care.scss
  45. 136 0
      miniprogram/module/charts/record-care/record-care.ts
  46. 11 0
      miniprogram/module/charts/record-care/record-care.wxml
  47. 8 0
      miniprogram/module/charts/record-care/request.ts
  48. 16 9
      miniprogram/module/charts/record-index/chalk.theme.ts
  49. 27 5
      miniprogram/module/charts/record-index/record-index.scss
  50. 60 27
      miniprogram/module/charts/record-index/record-index.ts
  51. 18 5
      miniprogram/module/charts/record-index/record-index.wxml
  52. 17 4
      miniprogram/module/charts/record-index/request.ts
  53. 5 1
      miniprogram/module/chats/components/guide/guide.ts
  54. 2 2
      miniprogram/module/chats/components/message-system/message-system.scss
  55. 3 42
      miniprogram/module/chats/pages/analysis/analysis.ts
  56. 11 15
      miniprogram/module/chats/pages/index/index.scss
  57. 13 13
      miniprogram/module/follow/pages/evaluation/report.wxml
  58. 19 4
      miniprogram/module/health/components/card-analysis/card-analysis-content.scss
  59. 1 0
      miniprogram/module/health/components/card-analysis/card-analysis-content.ts
  60. 10 3
      miniprogram/module/health/components/card-analysis/card-analysis-content.wxml
  61. 6 0
      miniprogram/module/health/components/care-record/care-record.json
  62. 77 0
      miniprogram/module/health/components/care-record/care-record.scss
  63. 46 0
      miniprogram/module/health/components/care-record/care-record.ts
  64. 28 0
      miniprogram/module/health/components/care-record/care-record.wxml
  65. 6 0
      miniprogram/module/health/components/care-scheme/care-scheme.json
  66. 125 0
      miniprogram/module/health/components/care-scheme/care-scheme.scss
  67. 45 0
      miniprogram/module/health/components/care-scheme/care-scheme.ts
  68. 41 0
      miniprogram/module/health/components/care-scheme/care-scheme.wxml
  69. 10 3
      miniprogram/module/health/components/follow-evaluation/follow-evaluation.scss
  70. 10 4
      miniprogram/module/health/components/follow-evaluation/follow-evaluation.ts
  71. 7 7
      miniprogram/module/health/components/follow-evaluation/follow-evaluation.wxml
  72. 2 2
      miniprogram/module/health/components/follow-record/follow-record.scss
  73. 4 4
      miniprogram/module/health/components/follow-record/follow-record.wxml
  74. 7 0
      miniprogram/module/health/components/nodrug-therapy/nodrug-therapy.json
  75. 104 0
      miniprogram/module/health/components/nodrug-therapy/nodrug-therapy.scss
  76. 42 0
      miniprogram/module/health/components/nodrug-therapy/nodrug-therapy.ts
  77. 41 0
      miniprogram/module/health/components/nodrug-therapy/nodrug-therapy.wxml
  78. 10 2
      miniprogram/module/health/components/report-health-index/report-health-index.scss
  79. 21 13
      miniprogram/module/health/components/report-health-index/report-health-index.wxml
  80. 1 1
      miniprogram/module/health/components/report-health-patient/report-health-patient.scss
  81. 10 8
      miniprogram/module/health/components/report-health-patient/report-health-patient.wxml
  82. 2 1
      miniprogram/module/health/components/report-health-status/report-health-status.json
  83. 50 7
      miniprogram/module/health/components/report-health-status/report-health-status.scss
  84. 57 28
      miniprogram/module/health/components/report-health-status/report-health-status.ts
  85. 66 71
      miniprogram/module/health/components/report-health-status/report-health-status.wxml
  86. 3 1
      miniprogram/module/health/model/health.model.ts
  87. 4 1
      miniprogram/module/health/pages/home/home.json
  88. 6 1
      miniprogram/module/health/pages/home/home.scss
  89. 3 1
      miniprogram/module/health/pages/home/home.ts
  90. 24 19
      miniprogram/module/health/pages/home/home.wxml
  91. 1 0
      miniprogram/module/health/pages/report/report.scss
  92. 71 65
      miniprogram/module/health/pages/report/report.wxml
  93. 3 12
      miniprogram/module/health/pages/status/status.ts
  94. 40 0
      miniprogram/module/health/request.ts
  95. 1 1
      miniprogram/module/health/tools/health-index.ts
  96. 8 0
      miniprogram/module/user/pages/user-certification/user-certification.scss
  97. 99 51
      miniprogram/module/user/pages/user-certification/user-certification.ts
  98. 12 7
      miniprogram/module/user/pages/user-certification/user-certification.wxml
  99. 25 26
      miniprogram/module/user/pages/user-edit/user-edit.ts
  100. 6 0
      miniprogram/module/user/request.ts

+ 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>

+ 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": {

BIN
miniprogram/assets/icon/icon_plan@3x.png


+ 16 - 9
miniprogram/components/button/button.ts

@@ -48,25 +48,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%;
+} 

+ 5 - 5
miniprogram/components/tabbar/tabbar.ts

@@ -55,10 +55,9 @@ Component({
           }
         })
         .exec();
-      console.log(this.data.pageHeight, "2222");
     },
     toChatsPage(page: string) {
-      console.log(this.data.patientId, "patientId", page);
+      // console.log(this.data.patientId, "patientId", page);
       if (!this.data?.patientId) {
         wx.showModal({
           title: "出错了",
@@ -73,7 +72,7 @@ Component({
       wx.setStorageSync("isAnalysis", 3);
     },
     onChange(e) {
-      console.log(e, "e");
+      // console.log(e, "e");
       this.setData({
         value: e.detail.value,
       });
@@ -94,8 +93,9 @@ Component({
     },
   },
   lifetimes: {
-    attached() {
-      console.log(this.data.tabbarValue, "tabbarValuetabbarValue");
+    attached(options: string) {
+      // console.log(options,"tabbar")
+      // console.log(this.data.tabbarValue, "tabbarValuetabbarValue");
       this.setData({
         value: this.data.tabbarValue,
       });

+ 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 {

BIN
miniprogram/module/care/assets/icon/icon_effect@3x.png


BIN
miniprogram/module/care/assets/icon/icon_health@2x.png


BIN
miniprogram/module/care/assets/icon/icon_report.png


BIN
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;
+}

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

@@ -0,0 +1,164 @@
+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, "careDetail--watch");
+        if (res.items.length > 0) {
+          isShowDelivery = res.items.some((item: any) => {
+            return item.conditioningProgramDetail?.isDelivery === "Y";
+          });
+        }
+        this.setData({
+          isShowDelivery,
+        });
+        console.log(isShowDelivery, "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;
+    // console.log(id, "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.patientConditioningOfflines && item.patientConditioningOfflines.length>0}}">
+              <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}}">核销记录</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.institutionName}}
+              </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:key="id" wx:if="{{item.patientConditioningOnlines && item.patientConditioningOnlines.length>0}}">
+              <view class="scheme-title">{{item.conditioningProgramDetail.name}}</view>
+              <view class="divider"></view>
+              <image class="scheme-img" rc="{{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.healthAnalysisReports && item.healthAnalysisReports.length>0}}">
+              <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}}">健康分析报告</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.institutionName}}
+              </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%;
+} 

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

@@ -0,0 +1,136 @@
+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() {
+      console.log(this.data.careDetail.patientConditioningScores,"获取数据")
+      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"
       }
     }
   }

+ 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;
+} 

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

@@ -7,9 +7,24 @@ 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();
+        console.log(this.data.charts, 'charts')
+      } 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 +33,64 @@ 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, 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,
+                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 });
+      }
+    }
   }
 })

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

@@ -1,8 +1,21 @@
 <!--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:elif="{{error}}">
+    <view class="error">加载失败,请重试</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) }
+    })
+  }
+  
 }

+ 5 - 1
miniprogram/module/chats/components/guide/guide.ts

@@ -35,7 +35,11 @@ Component({
       });
     },
     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[]) {

+ 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;
   }
 

+ 3 - 42
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])
@@ -249,7 +210,7 @@ Component({
         } catch (error) {
           console.log('[Analysis] Submit failed, resetting button');
           wx.showToast({ title: error?.errMsg ?? "提交失败", icon: "none" });
-          resetButton();
+          submitBtn?.resetState();
         }
       } else {
         // 对话管家

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

@@ -1,17 +1,21 @@
-@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 {
   position: fixed;
   left: 0;
@@ -23,14 +27,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 +50,4 @@ background-color: #F5F6F7;
     color: #999;
     margin-bottom: 6px;
   }
-}
+}

+ 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>

+ 19 - 4
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,11 +66,13 @@
   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{
@@ -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;
     }
   }

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

@@ -12,6 +12,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) {

+ 10 - 3
miniprogram/module/health/components/card-analysis/card-analysis-content.wxml

@@ -1,7 +1,12 @@
 <!--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-title">
+<view wx:if="type===files">
+<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 +51,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="type===files">
+<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();
+      // 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.estimatedStartDate}}</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 */
+}

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

@@ -35,10 +35,16 @@ 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: [],
+        });
+      }
     },
   },
 });

+ 7 - 7
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>
@@ -19,12 +21,10 @@
         <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-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;
     }
   }

+ 4 - 4
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>
@@ -25,6 +27,4 @@
       </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"
+  }
+}

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

@@ -0,0 +1,104 @@
+@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: 24rpx 24rpx 18rpx 24rpx;
+  box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.03);
+}
+.therapy-title {
+  font-size: 28rpx;
+  font-weight: 500;
+  color: #222;
+  margin-bottom: 12rpx;
+}
+.therapy-row {
+  font-size: 26rpx;
+  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_record@2x.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.title}}</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">

+ 1 - 1
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 {

+ 10 - 8
miniprogram/module/health/components/report-health-patient/report-health-patient.wxml

@@ -4,7 +4,7 @@
 <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">
@@ -16,7 +16,9 @@
             </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">身份证号:</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"
   }
 }

+ 50 - 7
miniprogram/module/health/components/report-health-status/report-health-status.scss

@@ -4,6 +4,16 @@
 @import '../../../../themes/draggable-sheet.scss';
 
 /* module/health/components/report-health-status/report-health-status.wxss */
+.status-box{
+  font-size: 16px;
+  font-weight: bold;
+  color: black;
+}
+.status-content{
+  width: 100%;
+  white-space: pre-wrap;
+  text-align: center;
+}
 .title-box{
   font-size: 16px;
   font-weight: bold;
@@ -20,8 +30,8 @@
   font-size: 12px;
 }
 .icon{
-  width: 20px;
-  height: 20px;
+  width: 23px;
+  height: 23px;
   margin-right: 10rpx;
 }
 .report-box {
@@ -32,11 +42,12 @@
   padding: 10px;
 }
 .report-data-wrapper {
-  background: linear-gradient(180deg, #D6E4F5 0%, #F3F4F6 100%);
+  // background: linear-gradient(180deg, #D6E4F5 0%, #F3F4F6 100%);
+  background: linear-gradient(180deg, #D6E4F5 0%, #F5F6F7 100%);
   font-size: 14px;
-  border-radius: 10px;
-  width: 95%;
-  margin: 10px auto;
+  border-radius: 20px;
+  width: 100%;
+  margin:auto;
 
   .card-body {
     display: flex;
@@ -67,4 +78,36 @@
 
 .text-item+.text-item::before {
   content: ',';
-}
+}
+.status-title{
+  width: 100%;
+  font-size: 16px;
+  font-weight: bold;
+  color: black;
+  height: 50px;
+  line-height: 50px;
+ 
+  text-align: center;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.card-container{
+  background-color: #F8FAFD;
+  border-radius: 10px;
+  width: 94%;
+  margin: auto auto 10px auto;
+}
+.report-content{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  padding: 10px 16px;
+}
+.nodata-box{
+  width: 94%;
+  margin: auto;
+  border-top: 1px solid #E7E7E7;
+  padding-top: 10px;
+}

+ 57 - 28
miniprogram/module/health/components/report-health-status/report-health-status.ts

@@ -1,35 +1,48 @@
 import PageContainerBehavior from "../../../../core/behavior/page-container.behavior";
-import { DraggableSheetBehavior, getDraggableSheetContext } from "../../../../core/behavior/draggableSheet.behavior"
+import {
+  DraggableSheetBehavior,
+  getDraggableSheetContext,
+} from "../../../../core/behavior/draggableSheet.behavior";
 import { getTickleContext } from "../../../../core/behavior/tickle.behavior";
 
 // module/health/components/report-health-status/report-health-status.ts
-import { healthAnalysisListMethod, healthAnalysisMethod, healthReportListMethod, healthReportMethod } from "../../request";
+import {
+  healthAnalysisListMethod,
+  healthAnalysisMethod,
+  healthReportListMethod,
+  healthReportMethod,
+} from "../../request";
 import { healthAnalysisModel, healthRecord } from "../../model/health.model";
-
+import { AnalysisModel } from "../../model/health.model";
 interface PanelProps {
   shade?: boolean;
   title?: string;
   data: AnyArray;
-  type?: 'analysis' | 'report';
+  type?: "analysis" | "report";
 }
 
 Component({
   behaviors: [
     PageContainerBehavior,
-    DraggableSheetBehavior('.health-report-list'),
+    DraggableSheetBehavior(".health-report-list"),
   ],
   lifetimes: {
     attached() {
       this._load();
-    }
+    },
   },
   pageLifetimes: {
-    hide() { this._hideDraggableSheet({}); }
+    hide() {
+      this._hideDraggableSheet({});
+    },
   },
   data: {
     dataset: {},
+    tongue: null as unknown as AnalysisModel,
+    face: null as unknown as AnalysisModel,
+    analysisData: null as unknown as AnalysisModel,
     loading: false,
-    message: '',
+    message: "",
     panel: {
       shade: false,
       data: [],
@@ -39,13 +52,15 @@ Component({
   },
   methods: {
     async showReportList() {
+      console.log("showReportList",this.data._healthReportList);
       if (!this.data._healthReportList.loaded) {
-        wx.showLoading({ title: '加载中' })
+        wx.showLoading({ title: "加载中" });
         try {
           const data = await healthReportListMethod();
+          console.log("data",data);
           this.setData({
-            '_healthReportList.data': data,
-            '_healthReportList.loaded': true,
+            "_healthReportList.data": data,
+            "_healthReportList.loaded": true,
           });
         } catch (error) {
           getTickleContext.call(this).showErrorMessage(error.errMsg);
@@ -53,18 +68,19 @@ Component({
         wx.hideLoading();
       }
       this._showDraggableSheet({
-        title: '健康分析报告记录', type: 'report',
-        data: this.data._healthReportList.data
+        title: "健康分析报告记录",
+        type: "report",
+        data: this.data._healthReportList.data,
       });
     },
     async showAnalysisList() {
       if (!this.data._healthAnalysisList.loaded) {
-        wx.showLoading({ title: '加载中' })
+        wx.showLoading({ title: "加载中" });
         try {
           const data = await healthAnalysisListMethod();
           this.setData({
-            '_healthAnalysisList.data': data,
-            '_healthAnalysisList.loaded': true,
+            "_healthAnalysisList.data": data,
+            "_healthAnalysisList.loaded": true,
           });
         } catch (error) {
           getTickleContext.call(this).showErrorMessage(error.errMsg);
@@ -72,12 +88,15 @@ Component({
         wx.hideLoading();
       }
       this._showDraggableSheet({
-        title: '舌面分析报告记录', type: 'analysis',
+        title: "舌面分析报告记录",
+        type: "analysis",
         data: this.data._healthAnalysisList.data,
       });
     },
     showStatusList() {
-      wx.navigateTo({ url: `/module/health/pages/status-record/status-record` });
+      wx.navigateTo({
+        url: `/module/health/pages/status-record/status-record`,
+      });
     },
     toPreviewPage(event: WechatMiniprogram.TouchEvent) {
       const { id, type } = event.mark ?? {};
@@ -88,15 +107,26 @@ Component({
 
     async _load() {
       this.setData({ loading: true });
+    
       const params = { id: void 0, scene: void 0 };
       try {
         const report = await healthReportMethod(params);
-        const { id: analysisId, ...analysis } = await healthAnalysisMethod(params).catch(() => healthAnalysisModel({}));
+        const { id: analysisId, ...analysis } = await healthAnalysisMethod(
+          params
+        ).catch(() => healthAnalysisModel({}));
         const data = healthRecord({ ...report, ...analysis, analysisId });
         this.setData({
           dataset: data,
           loading: false,
         });
+        data.condition = data.condition.map((item:any)=>{
+          item.value = item.value.split(',')
+          return item
+        })
+        console.log("获取dataset数据", data.condition );
+        const { tongue, face, ...analysisData } = await healthAnalysisMethod(params);
+        this.setData({ tongue, face, analysisData });
+      console.log("analysisData", analysisData,tongue,face);
       } catch (error) {
         this.setData({
           dataset: null,
@@ -113,29 +143,28 @@ Component({
           pixels: 600,
           animated: true,
           duration: 300,
-          easingFunction: 'ease'
+          easingFunction: "ease",
         });
         this.setData({ panel: { ...props, shade: true } });
       } else {
-        wx.showToast({ title: '暂无更新记录' })
+        wx.showToast({ title: "暂无更新记录" });
       }
-
     },
     _hideDraggableSheet(e?: any) {
-      this.setData({ 'panel.shade': false });
+      this.setData({ "panel.shade": false });
       if (!e) return;
       getDraggableSheetContext.call(this).scrollTo({
         size: 0,
         animated: true,
         duration: 300,
-        easingFunction: 'ease'
+        easingFunction: "ease",
       });
     },
     _draggableSizeUpdate(e: any) {
-      'worklet'
+      "worklet";
       if (e.pixels < 1) {
-        wx.worklet.runOnJS(this._hideDraggableSheet.bind(this))()
+        wx.worklet.runOnJS(this._hideDraggableSheet.bind(this))();
       }
     },
-  }
-})
+  },
+});

+ 66 - 71
miniprogram/module/health/components/report-health-status/report-health-status.wxml

@@ -1,92 +1,56 @@
 <!--module/health/components/report-health-status/report-health-status.wxml-->
-<view class="card-wrapper report-data-wrapper">
-  <view>
+<view class="card-wrapper report-data-wrapper" style="margin-top:30px">
   <view class="report-box">
-  <view class="health-title">
-    <block slot="title">
-    <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
-      <image wx:else class="icon" src="../../assets/icon/icon_health@2x.png" mode="heightFix" />
-      <text class="title-box">健康状况</text>
-    </block>
+    <view class="health-title">
+      <block slot="title">
+        <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
+        <image wx:else class="icon" src="../../assets/icon/icon_health@2x.png" mode="heightFix" />
+        <text class="title-box">健康状况</text>
+      </block>
     </view>
+
     <block slot="right-icon">
       <view class="extra-warapper" slot="extra-status" catch:tap="showStatusList">
         <text>更新记录</text>
         <t-icon t-class="icon" name="chevron-right-double-s" size="24px" />
       </view>
     </block>
-</view>
-    <view slot="description" wx:if="{{!loading && !dataset.condition.length}}" style="padding: 0px 10px 10px 20px;">暂无数据</view>
-</view>
-
-  <view class="card-body status-data-wrapper" wx:if="{{dataset.condition.length}}">
-    <span class="row" wx:for="{{dataset.condition}}" wx:key="value">
-      <text wx:if="{{item.label}}">{{item.label}}:</text>
-      <text>{{item.value}}</text>
-    </span>
   </view>
 
-  <t-empty wx:if="{{message}}" t-class="empty-wrapper error" icon="info-circle" description="{{message}}" />
-</view>
 
-<view wx:if="{{dataset.analysisId}}" class="card-wrapper report-data-wrapper" mark:type="analysis" bind:tap="toPreviewPage">
-  <t-cell t-class="card-header cell-border-gradient" t-class-title="card-header__title">
-    <block slot="title">
-    <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
-      <image wx:else class="icon" src="../../assets/icon/icon_tongue@2x.png" mode="heightFix"></image>
-      <text class="title-box">舌面分析报告</text>
-      
-    </block>
-    <block slot="right-icon">
-      <view class="extra-warapper" catch:tap="showAnalysisList">
-        <text>更新记录</text>
-        <t-icon t-class="icon" name="chevron-right-double-s" size="24px" />
-      </view>
-    </block>
 
-    <view slot="description" wx:if="{{!loading && !dataset.analysis.length}}">暂无数据</view>
-  </t-cell>
-  <view class="card-body report-wrapper tongue-box" mark:id="{{dataset.analysisId}}" wx:for="{{dataset.analysis}}" wx:key="value">
-    <view class="content-wrapper">
-      <span class="row">
-        <text wx:if="{{item.label}}">{{item.label}}:</text>
-        <text>{{item.value}}</text>
-      </span>
+  <!-- 欲病状态 -->
+  <view class="card-container">
+    <view class="status-title">{{dataset.report[0].value}}</view>
+    <view class="card-body report-wrapper" mark:id="{{dataset.reportId}}" style="padding-top:0px;border-radius: 0 0 10px 10px;">
+      <view class="content-wrapper" style="border-top: 1px solid #E7E7E7;padding-top:10px">
+        <span class="row" wx:for="{{dataset.report}}" wx:key="value">
+          <text wx:if="{{item.label}}" style="color:#8C8C8C;font-size:14px">{{item.label}}:</text>
+          <text style="font-size:14px"> {{item.value}}</text>
+        </span>
+      </view>
     </view>
-    <image wx:if="{{item.cover[0]}}" class="image-wrapper" src="{{item.cover[0]}}" mode="aspectFill" />
+    <t-empty wx:if="{{message}}" t-class="empty-wrapper error" icon="info-circle" description="{{message}}" />
   </view>
+  <!-- 症状 -->
+  <view class="card-container">
+    <view class="status-title">症状</view>
+    <view class="card-body status-data-wrapper" wx:if="{{dataset.condition.length}}" style="border-top: 1px solid #E7E7E7;padding-top:10px">
+      <span class="row" wx:for="{{dataset.condition}}" wx:key="value">
 
-  <t-empty wx:if="{{message}}" t-class="empty-wrapper error" icon="info-circle" description="{{message}}" />
-</view>
-
-<view class="card-wrapper report-data-wrapper" mark:type="report" bind:tap="toPreviewPage">
-  <t-cell t-class="card-header cell-border-gradient" t-class-title="card-header__title">
-    <block slot="title">
-     
-      <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
-      <image wx:else class="icon" src="../../assets/icon/icon_scheme@2x.png" mode="heightFix"></image>
-     <text class="title-box">健康分析报告</text>
-    </block>
-    <block slot="right-icon">
-      <view class="extra-warapper" catch:tap="showReportList">
-        <text>更新记录</text>
-        <t-icon t-class="icon" name="chevron-right-double-s" size="24px" />
-      </view>
-    </block>
-
-    <view slot="description" wx:if="{{!loading && !dataset.report.length}}">暂无数据</view>
-  </t-cell>
-  <view class="card-body report-wrapper tongue-box" mark:id="{{dataset.reportId}}">
-    <view class="content-wrapper">
-      <span class="row" wx:for="{{dataset.report}}" wx:key="value">
-        <text wx:if="{{item.label}}">{{item.label}}:</text>
-        <text>{{item.value}}</text>
+        <view>{{item.value}}</view>
       </span>
     </view>
-    <image class="image-wrapper" src="../../assets/image/health-report.png" mode="aspectFill" />
+    <t-empty wx:if="{{message}}" t-class="empty-wrapper error" icon="info-circle" description="{{message}}" />
+    <view class="nodata-box">
+      <view slot="description" wx:if="{{!loading && !dataset.condition.length}}" style="padding: 0px 10px 20px 20px;">暂无数据</view>
+    </view>
   </view>
 
-  <t-empty wx:if="{{message}}" t-class="empty-wrapper error" icon="info-circle" description="{{message}}" />
+
+  <!-- 舌象/面相 -->
+  <card-analysis-content tongue="{{tongue}}" face="{{face}}" simple="{{ {tongue: false, face: true} }}" :type="files">
+  </card-analysis-content>
 </view>
 
 <report-health-scheme dataset="{{dataset.conditProgram}}" mark:type="scheme" mark:id="{{dataset.reportId}}" bind:tap="toPreviewPage"></report-health-scheme>
@@ -105,7 +69,6 @@
         <list-builder list="{{panel.data}}" child-height="90">
           <block slot:item slot:index>
             <t-cell t-class="cell-border-gradient" hover arrow title="{{item.reportTime}}" mark:id="{{item.id}}">
-              <image slot="image" src="../../assets/image/health-report.png" style="width: 53px;height: 53px;"></image>
               <text slot="description" overflow="ellipsis">{{item.description}}</text>
             </t-cell>
           </block>
@@ -113,4 +76,36 @@
       </sticky-section>
     </scroll-view>
   </draggable-sheet>
-</root-portal>
+</root-portal>
+
+<view class="card-wrapper report-data-wrapper" mark:type="report" bind:tap="toPreviewPage">
+  <view>
+    <view class="report-box">
+      <view class="health-title">
+        <block slot="title">
+          <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
+          <image wx:else class="icon" src="../../assets/icon/icon_scheme@2x.png" mode="heightFix"></image>
+          <text class="title-box">健康分析报告</text>
+        </block>
+      </view>
+      <block slot="right-icon">
+        <view class="extra-warapper" catch:tap="showReportList">
+          <text>更新记录</text>
+          <t-icon t-class="icon" name="chevron-right-double-s" size="24px" />
+        </view>
+      </block>
+
+    </view>
+  </view>
+  <view class="card-body report-wrapper tongue-box" mark:id="{{dataset.reportId}}">
+    <view class="content-wrapper report-content">
+      <view class="status-box">{{dataset.report[0].value}}</view>
+      <view wx:if="{{dataset.report.length>0}}" class="status-content">{{dataset.report[1].value}}表现为{{dataset.report[2].value}}</view>
+      <view class="status-box">体质:{{dataset.report[3].value}}</view>
+    </view>
+
+    <image class="image-wrapper" src="../../assets/image/health-report.png" mode="aspectFill" />
+  </view>
+  <view slot="description" wx:if="{{!loading && !dataset.report.length}}">暂无数据</view>
+  <t-empty wx:if="{{message}}" t-class="empty-wrapper error" icon="info-circle" description="{{message}}" />
+</view>

+ 3 - 1
miniprogram/module/health/model/health.model.ts

@@ -41,9 +41,11 @@ export function healthReportModel(data: AnyObject) {
     report: [
       fn('结果显示您是', data?.willillStateName, true),
       fn('程度', data?.willillDegreeName),
-      // fn('类型', data?.willillSocialName),
+      fn('类型', data?.willillSocialName),
       fn('表现', data?.willillFunctionName),
       fn('体质', data?.constitutionGroupName, true),
+      fn('证素', data?.factorItemSummary, true),
+      fn('证型', data?.diagnoseSyndromeSummary, true),
     ].filter(Boolean),
 
     result: data?.constitutionGroupDefinition ?? '',

+ 4 - 1
miniprogram/module/health/pages/home/home.json

@@ -10,6 +10,9 @@
     "report-health-patient": "../../components/report-health-patient/report-health-patient",
     "card-report": "../../components/card-report/card-report",
     "follow-evaluation": "../../components/follow-evaluation/follow-evaluation",
-    "follow-record": "../../components/follow-record/follow-record"
+    "follow-record": "../../components/follow-record/follow-record",
+    "care-scheme": "../../components/care-scheme/care-scheme",
+    "nodrug-therapy": "../../components/nodrug-therapy/nodrug-therapy",
+    "care-record": "../../components/care-record/care-record"
   }
 }

+ 6 - 1
miniprogram/module/health/pages/home/home.scss

@@ -2,7 +2,7 @@
 @import '../../../../themes/draggable-sheet.scss';
 @import "../../report-common.scss";
 @import "../../../../themes/card.scss";
-/* module/health/pages/home/home.wxss */
+/* module/health/pages/home/home.scss */
 .health-container{
   background-image: url("/assets/bg/bg_records.png");
   background-repeat: no-repeat;
@@ -11,6 +11,11 @@
   background-size: cover; /* or contain, depending on your needs */
   background-position: top;
   background-color: #F5F6F7;
+ 
+}
+.page-scroll__container{
+  
+  padding-bottom: calc(100rpx + env(safe-area-inset-bottom)) !important;
 }
 .card-body.report-wrapper {
   display: flex;

+ 3 - 1
miniprogram/module/health/pages/home/home.ts

@@ -2,7 +2,7 @@ import PageContainerBehavior from "../../../../core/behavior/page-container.beha
 
 // module/health/pages/home/home.ts
 import { toPatientPage } from "../../router";
-import { healthIndexMethod, healthPatientMethod, } from "../../request";
+import { healthIndexMethod, healthPatientMethod,getCareRecordListMethod } from "../../request";
 import { healthIndex2Progress } from "../../tools/health-index";
 
 Component({
@@ -13,6 +13,7 @@ Component({
     attached() {
       this.getHealthPatient();
       this.getHealthIndex();
+   
     }
   },
   properties: {},
@@ -22,6 +23,7 @@ Component({
     healthIndex: { data: [], loading: false, message: '' },
   },
   methods: {
+  
     async getHealthPatient() {
       this.setData({ 'healthPatient.loading': true, })
       try {

+ 24 - 19
miniprogram/module/health/pages/home/home.wxml

@@ -1,23 +1,28 @@
 <!--module/health/pages/home/home.wxml-->
 <view class="health-container">
-<t-navbar title="健康档案" left-arrow />
-<scroll-view class="page-scroll__container" type="list" scroll-y style="{{containerStyle}}">
-  <report-health-patient dataset="{{healthPatient.data}}" loading="{{healthPatient.loading}}" message="{{healthPatient.message}}">
-    <view class="extra-warapper" slot="extra" catch:tap="toPatientPage">
-      <text>更新记录</text>
-      <t-icon t-class="icon" name="chevron-right-double-s" size="24px" />
-    </view>
-  </report-health-patient>
-  <report-health-status></report-health-status>
-  <report-health-index dataset="{{healthIndex.data}}" loading="{{healthIndex.loading}}" message="{{healthIndex.message}}">
-    <view class="extra-warapper" slot="extra" catch:tap="toHealthIndexListPage">
-      <text>更新记录</text>
-      <t-icon t-class="icon" name="chevron-right-double-s" size="24px" />
-    </view>
-  </report-health-index>
-   <follow-record></follow-record>
-<follow-evaluation></follow-evaluation>
- 
-</scroll-view>
+  <t-navbar title="健康档案" left-arrow />
+  <scroll-view class="page-scroll__container" type="list" scroll-y>
+    <report-health-patient dataset="{{healthPatient.data}}" loading="{{healthPatient.loading}}" message="{{healthPatient.message}}">
+      <view class="extra-warapper" slot="extra" catch:tap="toPatientPage">
+        <text>更新记录</text>
+        <t-icon t-class="icon" name="chevron-right-double-s" size="24px" />
+      </view>
+    </report-health-patient>
+    <report-health-status></report-health-status>
+    <report-health-index dataset="{{healthIndex.data}}" loading="{{healthIndex.loading}}" message="{{healthIndex.message}}">
+      <view class="extra-warapper" slot="extra" catch:tap="toHealthIndexListPage">
+        <text>更新记录</text>
+        <t-icon t-class="icon" name="chevron-right-double-s" size="24px" />
+      </view>
+    </report-health-index>
+    <!--我的调养方案-->
+    <care-scheme></care-scheme>
+    <follow-record></follow-record>
+    <follow-evaluation></follow-evaluation>
+    <!--调养记录-->
+    <care-record></care-record>
+    <!--线下非药物治疗-->
+    <nodrug-therapy></nodrug-therapy>
+  </scroll-view>
 </view>
 <t-message id="{{$messageId}}"></t-message>

+ 1 - 0
miniprogram/module/health/pages/report/report.scss

@@ -118,6 +118,7 @@
   background: white;
   border-radius: 10px;
   padding: 10px;
+  margin-bottom: 10px;
 }
 .talbel-wrapper {
   $border: 1px solid#EEE;

+ 71 - 65
miniprogram/module/health/pages/report/report.wxml

@@ -1,88 +1,94 @@
 <!--module/health/pages/report/report.wxml-->
 <view class="report-container">
-<t-navbar title="健康分析报告" left-arrow bind:fail="toHomePage" />
+  <t-navbar title="健康分析报告" left-arrow bind:fail="toHomePage" />
 
-<scroll-view class="page-scroll__container" type="list" scroll-y style="{{containerStyle}}">
-  <view class="card-wrapper">
-    <t-cell t-class="card-header no-body {{schemeId ? '' : 'cell-border-gradient'}}" bordered="{{!schemeId}}" style="background:transparent" >
-      <view slot="title" class="header-row">
-        <view class="date-text"><text style="color:#8C8C8C">报告日期:</text><text style="color:black">{{dataset.reportTime}}</text></view>
-        <view bind:tap="toSchemePage" class="recuperate-btn" wx:if="{{!!schemeId}}">调理方案</view>
+  <scroll-view class="page-scroll__container" type="list" scroll-y style="{{containerStyle}}">
+    <view class="card-wrapper">
+      <t-cell t-class="card-header no-body {{schemeId ? '' : 'cell-border-gradient'}}" bordered="{{!schemeId}}" style="background:transparent">
+        <view slot="title" class="header-row">
+          <view class="date-text"><text style="color:#8C8C8C">报告日期:</text><text style="color:black">{{dataset.reportTime}}</text></view>
+          <view bind:tap="toSchemePage" class="recuperate-btn" wx:if="{{!!schemeId}}">调理方案</view>
+        </view>
+      </t-cell>
+      <view class="card-body notification-wrapper" wx:if="{{!schemeId && showScheme}}">
+        <text style="padding-right: 10px;font-size:16px">请找医生</text> <text style="font-size:20px">获取中医调理方案</text>
       </view>
-    </t-cell>
-    <view  class="card-body notification-wrapper" wx:if="{{!schemeId && showScheme}}">
-      <text style="padding-right: 10px;font-size:16px">请找医生</text> <text style="font-size:20px">获取中医调理方案</text>
     </view>
-  </view>
 
-  <view class="card-wrapper">
-    <view class="card-body report-wrapper">
-      <view class="content-wrapper">
-        <block wx:if="dataset">
-          <span class="row" wx:for="{{dataset.report}}" wx:key="value">
-            <text wx:if="{{item.label}}" class="{{item.label==='结果显示您是'?'label-text':'label-title'}}" >{{item.label}}:</text>
-            <text class="{{item.label==='结果显示您是'?'value-text':'value-title'}}">{{item.value}}</text>
-          </span>
-        </block>
+    <view class="card-wrapper">
+      <view class="card-body report-wrapper">
+        <view class="content-wrapper">
+          <block wx:if="dataset">
+            <span class="row" wx:for="{{dataset.report}}" wx:key="value">
+              <text wx:if="{{item.label}}" class="{{item.label==='结果显示您是'?'label-text':'label-title'}}">{{item.label}}:</text>
+              <text class="{{item.label==='结果显示您是'?'value-text':'value-title'}}">{{item.value}}</text>
+            </span>
+          </block>
+        </view>
+        <image class="image-wrapper" src="../../assets/image/health-report.png" mode="aspectFill" />
       </view>
-      <image class="image-wrapper" src="../../assets/image/health-report.png" mode="aspectFill" />
     </view>
-  </view>
 
-  <view class="card-wrapper">
-    <view class="card-body constitution-container">
-    <view class="card-title">
-    <view><image src="../../assets/icon/icon_physique@2x.png" class="icon-title" /></view>
-    <view class="text-title">体质</view>
-    </view>
-      <view class="content-wrapper">
-        <block wx:if="dataset">
-        <view class="result-box">
-        <image src="../../assets/image/pic_body@2x.png" class="body-image" mode="widthFix" />
-          <text class="result-text">{{dataset.result}}</text>
-        <view>
-        </view>
+    <view class="card-wrapper">
+      <view class="card-body constitution-container">
+        <view class="card-title">
+          <view>
+            <image src="../../assets/icon/icon_physique@2x.png" class="icon-title" />
+          </view>
+          <view class="text-title">体质</view>
         </view>
-        </block>
-        <view class="talbel-wrapper">
-          <view class="talbel-row {{index % 2 === 0 ? 'odd-row' : ''}}" wx:for="{{dataset.physique}}" wx:key="value" wx:for-index="index">
-            <view class="label">{{item.label}}</view>
-            <view class="value">{{item.value}}</view>
+        <view class="content-wrapper">
+          <block wx:if="dataset">
+            <view class="result-box">
+              <image src="../../assets/image/pic_body@2x.png" class="body-image" mode="widthFix" />
+              <text class="result-text">{{dataset.result}}</text>
+              <view>
+              </view>
+            </view>
+          </block>
+          <view class="talbel-wrapper">
+            <view class="talbel-row {{index % 2 === 0 ? 'odd-row' : ''}}" wx:for="{{dataset.physique}}" wx:key="value" wx:for-index="index">
+              <view class="label">{{item.label}}</view>
+              <view class="value">{{item.value}}</view>
+            </view>
           </view>
         </view>
       </view>
     </view>
-  </view>
 
-  <card-analysis-content tongue="{{dataset.tongue}}" face="{{dataset.face}}" simple="{{ {tongue: false, face: true} }}"></card-analysis-content>
+    <card-analysis-content tongue="{{dataset.tongue}}" face="{{dataset.face}}" simple="{{ {tongue: false, face: true} }}"></card-analysis-content>
 
-  <view class="card-wrapper">
-    <view class="card-body constitution-container">
-      <view class="card-title">
-    <view><image src="../../assets/icon/icon_zhengsu@2x.png" class="icon-title" /></view>
-    <view class="text-title">中医证素</view>
-    </view>
-      <view class="rows" wx:for="{{dataset.factorItems}}" wx:key="*this">
-        <view class="primary">{{item.factorItemName}}</view>
-        <view style="margin-top: 4px;" wx:if="{{item.factorItemDescription}}">&emsp;&emsp;{{item.factorItemDescription}}</view>
+    <view class="card-wrapper">
+      <view class="card-body constitution-container">
+        <view class="card-title">
+          <view>
+            <image src="../../assets/icon/icon_zhengsu@2x.png" class="icon-title" />
+          </view>
+          <view class="text-title">中医证素</view>
+        </view>
+        <view class="rows" wx:for="{{dataset.factorItems}}" wx:key="*this">
+          <view class="primary">{{item.factorItemName}}</view>
+          <view style="margin-top: 4px;" wx:if="{{item.factorItemDescription}}">&emsp;&emsp;{{item.factorItemDescription}}</view>
+        </view>
       </view>
     </view>
-  </view>
-  <view class="card-wrapper">
-   <view class="card-body constitution-container">
-      <view class="card-title">
-    <view><image src="../../assets/icon/icon_zhengxing@2x.png" class="icon-title" /></view>
-    <view class="text-title">中医证型</view>
-    </view>
-      <view class="rows" wx:for="{{dataset.diagnoseSyndromes}}" wx:key="*this">
-        <view class="primary">{{item.diagnoseSyndromeName}}</view>
-        <view style="margin-top: 4px;" wx:if="{{item.diagnoseSyndromeAnalysis}}">&emsp;&emsp;{{item.diagnoseSyndromeAnalysis}}</view>
+    <view class="card-wrapper">
+      <view class="card-body constitution-container">
+        <view class="card-title">
+          <view>
+            <image src="../../assets/icon/icon_zhengxing@2x.png" class="icon-title" />
+          </view>
+          <view class="text-title">中医证型</view>
+        </view>
+        <view class="rows" wx:for="{{dataset.diagnoseSyndromes}}" wx:key="*this">
+          <view class="primary">{{item.diagnoseSyndromeName}}</view>
+          <view style="margin-top: 4px;" wx:if="{{item.diagnoseSyndromeAnalysis}}">&emsp;&emsp;{{item.diagnoseSyndromeAnalysis}}</view>
+        </view>
       </view>
     </view>
-  </view>
 
-  <report-health-index dataset="{{healthIndex.data}}" loading="{{healthIndex.loading}}" message="{{healthIndex.message}}">
-  </report-health-index>
-</scroll-view>
+    <report-health-index dataset="{{healthIndex.data}}" loading="{{healthIndex.loading}}" message="{{healthIndex.message}}">
+    </report-health-index>
+  </scroll-view>
 </view>
 <t-message id="{{$messageId}}"></t-message>

+ 3 - 12
miniprogram/module/health/pages/status/status.ts

@@ -35,17 +35,12 @@ Component({
     },
 
     async onSubmit(event: WechatMiniprogram.FormSubmit) {
+      let submitBtn = this.selectComponent('#submitBtn');
       const values = event.detail.value;
       const model = Object
         .entries(values)
         .filter(([, value]) => value)
         .map(([quotaId, quotaVal]) => ({ quotaId, quotaVal }));
-      
-      let submitBtn = this.selectComponent('#submitBtn');
-      if (submitBtn) {
-        submitBtn.setData({ isDisabled: true });
-      }
-
       if (model.length) {
         wx.showLoading({ title: `提交中` });
         try {
@@ -66,16 +61,12 @@ Component({
           this.getOpenerEventChannel().emit('update', result);
           wx.navigateBack();
         } catch (error) {
-          if (submitBtn) {
-            submitBtn.setData({ isDisabled: false });
-          }
+          submitBtn?.resetState();
           getTickleContext.call(this).showErrorMessage(error.errMsg);
         }
         wx.hideLoading();
       } else {
-        if (submitBtn) {
-          submitBtn.setData({ isDisabled: false });
-        }
+        submitBtn?.resetState();
         wx.showToast({ title: '请至少填写一项', icon: 'error' });
       }
     }

+ 40 - 0
miniprogram/module/health/request.ts

@@ -176,3 +176,43 @@ export function getFollowRecordListMethod() {
     }
   })
 }
+
+// 获取调养记录列表 
+export function getCareRecordListMethod(progress: string) {
+  return Post(`/patientCrManage/pagePcrs`, {progress}, {
+    transform({ data }: AnyObject) {
+      return data;
+    }
+  })
+}
+
+// 线下非药物治疗
+export function getOfflineTreatmentListMethod(progress: string) {
+  return Post(`/patientCrManage/pagePofflineCp`, {progress}, {
+    transform({ data }: AnyObject) {
+      return data;
+    }
+  })
+}
+
+// 核销记录
+// export function getVerifyRecordMethod(id: number) {
+//   console.log(id, "核销记录");
+//   // return Post(`/patientCrManage/pofflineCp`, {id}, {
+//   //   transform({ data }: AnyObject) {
+//   //     return data;
+//   //   }
+//   // })
+// }
+
+// 获取调理中的调理记录
+export function getCareRecordMethod() {
+  return Post(`/patientCrManage/getPcing`, {}, {
+    transform({ data }: AnyObject) {
+      return data;
+    }
+  })
+}
+
+
+

+ 1 - 1
miniprogram/module/health/tools/health-index.ts

@@ -81,7 +81,7 @@ export function healthIndex2Progress(model: App.Health.Index.Model[]): AnyObject
       valueType, valueOffset: `${valueOffset}%`,
       valueOffsetLeft, valueOffsetRight,
     }
-    console.log(a, '12345-->', length);
+    // console.log(a, '12345-->', length);
     
     return a;
   })

+ 8 - 0
miniprogram/module/user/pages/user-certification/user-certification.scss

@@ -45,4 +45,12 @@
   .no-border {
     display: none;
   }
+}
+
+.phone-cell {
+  color: black !important; // 使用 !important 确保优先级
+
+  .note-class {
+    color: black !important; // 确保 note 字体为黑色
+  }
 }

+ 99 - 51
miniprogram/module/user/pages/user-certification/user-certification.ts

@@ -1,29 +1,33 @@
 import DictionariesBehavior from "../../../../core/behavior/dictionaries.behavior";
 import PageContainerBehavior from "../../../../core/behavior/page-container.behavior";
-import tickleBehavior, { getTickleContext } from "../../../../core/behavior/tickle.behavior";
+import tickleBehavior, {
+  getTickleContext,
+} from "../../../../core/behavior/tickle.behavior";
 
 import { openPrivacyContract } from "../../../../lib/wx/open-api";
 
 // module/user/pages/user-certification/user-certification.ts
-import { createUserInfoMethod, verifyCardnoMethod } from "../../request"
+import {
+  createUserInfoMethod,
+  verifyCardnoMethod,
+  createPhoneRegister,
+} from "../../request";
 import { usePhoneNumber } from "../../../../lib/use/use-phone";
 
 Component({
-  behaviors: [
-    PageContainerBehavior,
-    DictionariesBehavior,
-    tickleBehavior,
-  ],
+  behaviors: [PageContainerBehavior, DictionariesBehavior, tickleBehavior],
   lifetimes: {
     attached() {
       const channel = this.getOpenerEventChannel();
-      channel.on('navigateBack', (data) => { this.setData(data); })
+      channel.on("navigateBack", (data) => {
+        this.setData(data);
+      });
 
       const { getPhoneNumber, updateStatus, updateValue } = usePhoneNumber();
       this.getPhoneNumber = <any>getPhoneNumber;
-      updateStatus(status => this.setData({ 'loading': status === 'loading' }));
-      updateValue(value => this.setData({ 'model.phone': value }));
-    }
+      updateStatus((status) => this.setData({ loading: status === "loading" }));
+      updateValue((value) => this.setData({ "model.phone": value }));
+    },
   },
   properties: {
     hide: { type: Boolean, value: false },
@@ -32,82 +36,126 @@ Component({
     loading: false,
     verifying: false,
     model: {} as AnyObject,
-    name: '',
-    cardno: '',
-    age: '',
-    sex: '',
-    privacyContract: { agree: false, name: '《隐私政策》', show: false },
+    name: "",
+    cardno: "",
+    age: "",
+    sex: "",
+    privacyContract: { agree: false, name: "《隐私政策》", show: false },
   },
 
   /**
    * 组件的方法列表
    */
   methods: {
-    getPhoneNumber() { /** usePhoneNumber 中实现 */ },
+    getPhoneNumber(event: WechatMiniprogram.ButtonGetPhoneNumber) {
+      if (wx.getSystemInfoSync().platform === "devtools") {
+        wx.showToast({ title: "请在真机上测试", icon: "none" });
+        return;
+      }
+      const { getPhoneNumber, updateValue } = usePhoneNumber();
+      getPhoneNumber(event);
+      updateValue((value) => this.setData({ "model.phone": value }));
+      console.log("手机号", this.data.model.phone);
+    },
+    // getPhoneNumber() { /** usePhoneNumber 中实现 */ },
     openPrivacyContract: openPrivacyContract,
-    onPrivacySetting({ detail }: { detail: WechatMiniprogram.GetPrivacySettingSuccessCallbackResult }) {
+    onPrivacySetting({
+      detail,
+    }: {
+      detail: WechatMiniprogram.GetPrivacySettingSuccessCallbackResult;
+    }) {
       this.setData({
-        'privacyContract.name': detail.privacyContractName,
+        "privacyContract.name": detail.privacyContractName,
         // 'privacyContract.agree': !detail.needAuthorization,
-      })
+      });
     },
     onAgreeChange(event: any) {
       console.log(event);
 
       const agree = event?.detail?.checked;
-      if (agree) this.setData({ 'privacyContract.show': true });
-      else this.setData({ 'privacyContract.agree': agree });
+      if (agree) this.setData({ "privacyContract.show": true });
+      else this.setData({ "privacyContract.agree": agree });
     },
     onAgree() {
-      console.log('onAgree-->');
+      const submitBtn = this.selectComponent("#submitBtn");
+      console.log("onAgree-->");
 
-      this.setData({ 'privacyContract.agree': true });
+      this.setData({ "privacyContract.agree": true });
+      if (submitBtn) submitBtn.resetState();
     },
     async verifyCardno(event: WechatMiniprogram.InputConfirm) {
       const value = event.detail.value;
-      if (value.length !== 18) { wx.showToast({ title: '请输入正确的身份证号', icon: 'none' }); }
-      else {
+      if (value.length !== 18) {
+        wx.showToast({ title: "请输入正确的身份证号", icon: "none" });
+      } else {
         this.setData({ verifying: true });
         try {
           const data = await verifyCardnoMethod(value);
-          this.setData({ 'age': data.age, 'sex': data.sex });
+          this.setData({ age: data.age, sex: data.sex });
         } catch (error) {
-          this.setData({ 'cardno': '', 'age': '', 'sex': '' });
-          wx.showToast({ title: error.errMsg, icon: 'error' });
+          this.setData({ cardno: "", age: "", sex: "" });
+          wx.showToast({ title: error.errMsg, icon: "error" });
         }
         this.setData({ verifying: false });
       }
     },
     async onSubmit(event: WechatMiniprogram.FormSubmit) {
       const data = { ...this.data.model, ...event.detail.value };
-
-      if (!data.cardno) data.cardno = this.data.cardno;
-      if (data.sex == null) data.sex = this.data.sex;
-      if (!data.agemust) data.agemust = this.data.privacyContract.agree ? 'Y' : 'N';
-      console.log(data);
-      // if (!data.phone) return getTickleContext.call(this).showWarnMessage('请获取手机号码');
-      if (!data.name) return getTickleContext.call(this).showWarnMessage('请输入姓名');
-      if (data.cardno?.length !== 18) return getTickleContext.call(this).showWarnMessage('请输入正确的身份证号');
-      if (data.sex === '1' && !data.womenSpecialPeriod) return getTickleContext.call(this).showWarnMessage('请至少选择一项女性特殊期');
-      if (!data.height) return getTickleContext.call(this).showWarnMessage('请输入身高');
-      if (!data.weight) return getTickleContext.call(this).showWarnMessage('请输入体重');
-      console.log(data);
-      if (data.agemust === 'N') {
-        this.setData({ 'privacyContract.show': true })
-        return wx.showToast({ title: `请阅读并同意${this.data.privacyContract.name}`, icon: 'none' })
+      data.phone = this.data.model.phone;
+      const submitBtn = this.selectComponent("#submitBtn");
+      if (!data.phone) {
+        if (submitBtn) submitBtn.resetState();
+        return getTickleContext.call(this).showWarnMessage("请获取手机号码");
+      }
+      // if (!data.cardno) data.cardno = this.data.cardno;
+      // if (data.sex == null) data.sex = this.data.sex;
+      if (!data.agemust) {
+        data.agemust = this.data.privacyContract.agree ? "Y" : "N";
       }
 
-      wx.showLoading({ title: '保存中' });
+      // if (!data.name)
+      //   return getTickleContext.call(this).showWarnMessage("请输入姓名");
+      // if (data.cardno?.length !== 18)
+      //   return getTickleContext
+      //     .call(this)
+      //     .showWarnMessage("请输入正确的身份证号");
+      // if (data.sex === "1" && !data.womenSpecialPeriod)
+      //   return getTickleContext
+      //     .call(this)
+      //     .showWarnMessage("请至少选择一项女性特殊期");
+      // if (!data.height)
+      //   return getTickleContext.call(this).showWarnMessage("请输入身高");
+      // if (!data.weight)
+      //   return getTickleContext.call(this).showWarnMessage("请输入体重");
+      if (data.agemust === "N") {
+        if (submitBtn) submitBtn.resetState();
+        this.setData({ "privacyContract.show": true });
+        return wx.showToast({
+          title: `请阅读并同意${this.data.privacyContract.name}`,
+          icon: "none",
+        });
+      }
+      wx.showLoading({ title: "保存中" });
       try {
-        const { patientId } = await createUserInfoMethod(<any>data);
+        // const { patientId } = await createUserInfoMethod(<any>data);
+        const { patientId } = await createPhoneRegister(<any>data);
         // await wx.navigateBack();
         // if (patientId) this.getOpenerEventChannel().emit('update', { patientId });
-        wx.setStorageSync('patientId', patientId);
-        wx.redirectTo({ url: `/module/chats/pages/index/index?component=questionnaire` });
+        wx.setStorageSync("patientId", patientId);
+        // wx.redirectTo({
+        //   url: `/module/chats/pages/index/index?component=questionnaire`,
+        // });
+        wx.redirectTo({
+          url: `/pages/home/home`,
+        });
       } catch (error) {
+        // 请求失败时恢复按钮状态
+        if (submitBtn) {
+          submitBtn.resetState();
+        }
         getTickleContext.call(this).showErrorMessage(error.errMsg);
       }
-      wx.hideLoading()
-    }
+      wx.hideLoading();
+    },
   },
-})
+});

+ 12 - 7
miniprogram/module/user/pages/user-certification/user-certification.wxml

@@ -3,30 +3,35 @@
 <t-navbar title="完善信息" left-arrow="{{hide !== true}}" />
 <scroll-view class="page-scroll__container" type="list" scroll-y style="{{containerStyle}}">
   <form bindsubmit="onSubmit">
-    <!-- <view class="open-button">
-      <t-cell t-class="cell-border-gradient" required title="手机号" hover="{{!model['phone']}}" note="{{model['phone'] || '点击获取手机号码'}}">
+    <view class="open-button">
+      <t-cell t-class="cell-border-gradient phone-cell" t-class-note="note-class" required title="手机号" hover="{{!model['phone']}}" note="{{model['phone'] || '点击获取手机号码'}}">
         <t-loading wx:if="{{loading}}" theme="spinner" size="24rpx" slot="note" />
       </t-cell>
       <button wx:if="{{!loading && !model['phone']}}" class="open-button__inner" size="mini" open-type="getRealtimePhoneNumber" bind:getrealtimephonenumber="getPhoneNumber">选择授权手机</button>
-    </view> -->
-    <t-cell t-class="cell-border-gradient cell-field" t-class-note="cell-field__wrapper" required title="姓名">
+    </view>
+    <!-- 新注释的 -->
+    <!-- <t-cell t-class="cell-border-gradient cell-field" t-class-note="cell-field__wrapper" required title="姓名">
       <input class="cell-field__inner" slot="note" name="name" type="text" placeholder="请输入姓名" confirm-type="next" />
     </t-cell>
     <t-cell t-class="cell-border-gradient cell-field" t-class-note="cell-field__wrapper" required title="身份证号">
       <input class="cell-field__inner" slot="note" name="cardno" model:value="{{cardno}}" type="idcard" placeholder="请输入身份证号" maxlength="18" confirm-type="next" bind:blur="verifyCardno" />
       <t-loading wx:if="{{verifying}}" slot="note" theme="spinner" size="24rpx" slot="note" />
-    </t-cell>
+    </t-cell> -->
+<!-- end -->
+
     <!-- <t-cell t-class="cell-border-gradient" required title="年龄" note="{{model['age']}}岁" />
     <t-cell t-class="cell-border-gradient" required title="性别" note="{{dictionary.label($dictionaries, 'sys_user_sex', model['sex'])}}" /> -->
-    <user-data-edit model="{{model}}" sex="{{sex}}" retractable="{{true}}" dirty="{{dirty}}"></user-data-edit>
 
+    <!-- 新注释的 -->
+    <!-- <user-data-edit model="{{model}}" sex="{{sex}}" retractable="{{true}}" dirty="{{dirty}}"></user-data-edit> -->
+<!-- end -->
     <view class="privacy-contract-wrapper">
       <t-radio t-class="privacy-contract" t-class-border="no-border" icon="circle" block="{{false}}" checked="{{privacyContract.agree}}" bind:change="onAgreeChange">
         <text slot="content" style="font-size: 14px;">我已阅读与同意 <text class="name" catch:tap="openPrivacyContract">{{privacyContract.name}}</text></text>
       </t-radio>
     </view>
 
-    <form-button block index="1"></form-button>
+    <form-button block index="1" id="submitBtn"></form-button>
   </form>
 </scroll-view>
 

+ 25 - 26
miniprogram/module/user/pages/user-edit/user-edit.ts

@@ -1,8 +1,10 @@
-import tickleBehavior, { getTickleContext } from "../../../../core/behavior/tickle.behavior";
+import tickleBehavior, {
+  getTickleContext,
+} from "../../../../core/behavior/tickle.behavior";
 import DictionariesBehavior from "../../../../core/behavior/dictionaries.behavior";
 import PageContainerBehavior from "../../../../core/behavior/page-container.behavior";
 import { PageLoadBehavior } from "../../../../core/behavior/page-loading.behavior";
-import { getUserInfoMethod, updateUserInfoMethod } from "../../request"
+import { getUserInfoMethod, updateUserInfoMethod } from "../../request";
 
 // module/user/pages/user-edit/user-edit.ts
 Component({
@@ -10,10 +12,10 @@ Component({
     PageContainerBehavior,
     PageLoadBehavior<App.Patient.Model>(getUserInfoMethod),
     DictionariesBehavior,
-    tickleBehavior
+    tickleBehavior,
   ],
   lifetimes: {
-    attached() { }
+    attached() {},
   },
   properties: {},
   data: {
@@ -22,41 +24,38 @@ Component({
   },
   methods: {
     onSubmit(event: WechatMiniprogram.FormSubmit) {
-      this.setData({ dirty: true })
-
+      const submitBtn = this.selectComponent("#submitBtn");
+      this.setData({ dirty: true });
       const data = { ...this.data.model, ...event.detail.value };
-      if (!data.patientId) data.patientId = wx.getStorageSync('patientId');
-
-      // 在调用接口前设置按钮为禁用状态
-      const submitBtn = this.selectComponent('#submitBtn');
-      if (submitBtn) {
-        submitBtn.setData({ isDisabled: true });
-      }
-
+      if (!data.patientId) data.patientId = wx.getStorageSync("patientId");
       // 表单验证
-      if (data.sex.toString() === '1' && !data.womenSpecialPeriod) {
-        if (submitBtn) submitBtn.setData({ isDisabled: false });
-        return getTickleContext.call(this).showWarnMessage('请至少选择一项女性特殊期');
+      if (data.sex.toString() === "1" && !data.womenSpecialPeriod) {
+        if (submitBtn) submitBtn.resetState();
+        return getTickleContext
+          .call(this)
+          .showWarnMessage("请至少选择一项女性特殊期");
       }
       if (!data.height) {
-        if (submitBtn) submitBtn.setData({ isDisabled: false });
-        return getTickleContext.call(this).showWarnMessage('请填写身高');
+        if (submitBtn) submitBtn.resetState();
+        return getTickleContext.call(this).showWarnMessage("请填写身高");
       }
       if (!data.weight) {
-        if (submitBtn) submitBtn.setData({ isDisabled: false });
-        return getTickleContext.call(this).showWarnMessage('请填写体重');
+        if (submitBtn) submitBtn.resetState();
+        return getTickleContext.call(this).showWarnMessage("请填写体重");
       }
 
       updateUserInfoMethod(<any>data)
         .then(() => wx.navigateBack())
-        .then(() => { this.getOpenerEventChannel().emit('update2', event.detail.value); })
+        .then(() => {
+          this.getOpenerEventChannel().emit("update2", event.detail.value);
+        })
         .catch((error) => {
           // 请求失败时恢复按钮状态
           if (submitBtn) {
-            submitBtn.setData({ isDisabled: false });
+            submitBtn.resetState();
           }
-          getTickleContext.call(this).showWarnMessage(error.errMsg)
-        })
+          getTickleContext.call(this).showWarnMessage(error.errMsg);
+        });
     },
   },
-})
+});

+ 6 - 0
miniprogram/module/user/request.ts

@@ -57,6 +57,12 @@ export function createUserInfoMethod(data: App.Patient.Model) {
   });
 }
 
+// 手机号注册 
+export function createPhoneRegister(data: App.Patient.Model) {
+  return Get(`/mobileAccountManage/phoneRegister`, { params: { ...to(data) } })
+    .then(res => ({ patientId: res.data }));
+}
+
 export async function updateUserInfoMethod(data: App.Patient.Model) {
 
   const result = await Post(`/patientInfoManage/updatePatientInfo`, to(data));

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio