与牧同行-小程序用户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

254 lines
11 KiB

  1. <!-- 页面结构 -->
  2. <view class="xqbox">
  3. <!-- 页面内容 -->
  4. <scroll-view class="page-content" scroll-y refresher-enabled refresher-triggered="{{refreshing}}" bindrefresherrefresh="onRefresh" enhanced show-scrollbar="{{false}}" lower-threshold="100" bindscrolltolower="onScrollToLower">
  5. <!-- 用户问诊卡片 -->
  6. <view class="user-query-card card-enter">
  7. <!-- 用户信息 -->
  8. <view class="user-info-section">
  9. <view class="avatar-wrapper">
  10. <image class="user-avatar" src="{{diagnosisData.avatar?baseUrl+diagnosisData.avatar:'/pages/images/tx.png'}}"></image>
  11. </view>
  12. <view class="user-details">
  13. <view class="user-name-row">
  14. <text class="user-name">{{diagnosisData.farmerName || '用户'}}</text>
  15. <view class="status-badge {{diagnosisData.status === '已回复' ? 'status-replied' : 'status-pending'}} pulse">
  16. {{diagnosisData.status}}
  17. </view>
  18. </view>
  19. <view class="pet-info">
  20. <view class="pet-info-tags">
  21. <view class="pet-tag gradient-blue">{{diagnosisData.animalType}}</view>
  22. <view class="pet-tag gradient-orange">{{diagnosisData.animalAge}}</view>
  23. <view class="pet-tag gradient-pink">{{diagnosisData.animalGender}}</view>
  24. </view>
  25. <view class="time-info">
  26. <text class="time-text">{{diagnosisData.createdTime}}</text>
  27. </view>
  28. </view>
  29. </view>
  30. </view>
  31. <!-- 症状描述 -->
  32. <view class="symptom-section">
  33. <view class="section-header">
  34. <text class="section-title">症状描述</text>
  35. <view class="title-decoration"></view>
  36. </view>
  37. <view class="symptom-content">
  38. <view class="quote-left">
  39. <text>"</text>
  40. </view>
  41. <text class="symptom-text">{{diagnosisData.description}}</text>
  42. </view>
  43. </view>
  44. <!-- 相关图片 -->
  45. <view class="image-section" wx:if="{{diagnosisData.images && diagnosisData.images.length > 0}}">
  46. <view class="section-header">
  47. <text class="section-title">相关图片</text>
  48. <text class="image-count gradient-blue">{{diagnosisData.images.length}}张</text>
  49. </view>
  50. <scroll-view class="images-scroll" scroll-x>
  51. <view class="images-container">
  52. <block wx:for="{{diagnosisData.images}}" wx:key="*this" wx:for-index="index">
  53. <view class="image-wrapper">
  54. <image class="symptom-image" src="{{baseUrl+item}}" mode="aspectFill" bindtap="previewImage" data-url="{{baseUrl+item}}" data-urls="{{diagnosisData.images}}" data-type="user"></image>
  55. </view>
  56. </block>
  57. </view>
  58. </scroll-view>
  59. </view>
  60. <!-- 方案制定按钮 -->
  61. <view class="fazd" bindtap="showPlanModal">
  62. <view class="zdnr pulse">
  63. 方案制定查看
  64. </view>
  65. </view>
  66. <!-- 卡片装饰 -->
  67. <view class="card-decoration">
  68. <view class="decoration-dot dot-1"></view>
  69. <view class="decoration-dot dot-2"></view>
  70. <view class="decoration-dot dot-3"></view>
  71. </view>
  72. </view>
  73. <!-- 兽医回复区域 -->
  74. <view class="replies-section">
  75. <view class="section-header">
  76. <text class="section-title">兽医回复</text>
  77. <view class="reply-count gradient-purple">
  78. <text class="count-number">{{replies.length}}</text>
  79. <text class="count-text">条回复</text>
  80. </view>
  81. </view>
  82. <!-- 回复列表 -->
  83. <view class="replies-list">
  84. <block wx:for="{{replies}}" wx:key="index" wx:for-index="index">
  85. <view class="vet-reply-card fade-in-up" style="animation-delay: {{index * 0.1}}s;">
  86. <!-- 兽医信息 -->
  87. <view class="vet-info">
  88. <view class="avatar-wrapper">
  89. <image class="vet-avatar" src="{{item.avatar?baseUrl+item.avatar:'/pages/images/tx.png'}}"></image>
  90. <view class="vet-verified"></view>
  91. </view>
  92. <view class="vet-details">
  93. <view class="vet-name-row">
  94. <text class="vet-name">{{item.replyName || '兽医'}}</text>
  95. <view class="vet-badge gradient-gold" wx:if="{{item.title}}">
  96. <text class="vet-title">{{item.title}}</text>
  97. </view>
  98. </view>
  99. <view class="vet-meta">
  100. <view class="meta-item" wx:if="{{item.hospital}}">
  101. <text class="vet-hospital">{{item.hospital}}</text>
  102. </view>
  103. <view class="meta-item" wx:if="{{item.experience}}">
  104. <text class="vet-experience">{{item.experience}}</text>
  105. </view>
  106. </view>
  107. </view>
  108. </view>
  109. <!-- 回复内容 -->
  110. <view class="reply-content">
  111. <view class="reply-bubble">
  112. <text class="reply-text">{{item.content}}</text>
  113. </view>
  114. <!-- 兽医回复图片 -->
  115. <view wx:if="{{item.images && item.images.length > 0}}" class="reply-images-section">
  116. <view class="reply-images-grid grid-{{item.images.length}}">
  117. <block wx:for="{{item.images}}" wx:key="this" wx:for-index="imgIndex">
  118. <view class="reply-image-wrapper" bindtap="previewReplyImage" data-url="{{item}}" data-fullurl="{{baseUrl + item}}" data-urls="{{item.images}}" data-current-index="{{imgIndex}}" data-reply-index="{{index}}">
  119. <image class="reply-image" src="{{baseUrl + item}}" mode="aspectFill" lazy-load></image>
  120. <!-- 如果图片数量大于4且当前是第4张,显示剩余数量遮罩 -->
  121. <view wx:if="{{item.images.length > 4 && imgIndex === 3}}" class="image-more-mask">
  122. <text class="more-count">+{{item.images.length - 4}}</text>
  123. </view>
  124. </view>
  125. </block>
  126. </view>
  127. </view>
  128. </view>
  129. <!-- 回复底部 -->
  130. <view class="reply-footer">
  131. <view class="reply-time">
  132. <text class="time-text">{{item.createdAt || item.createTime || ''}}</text>
  133. </view>
  134. </view>
  135. </view>
  136. </block>
  137. <!-- 无回复状态 -->
  138. <view wx:if="{{replies.length === 0}}" class="no-replies fade-in">
  139. <text class="no-replies-title">等待兽医回复中</text>
  140. <text class="no-replies-desc">专业兽医通常会在24小时内为您解答</text>
  141. <view class="waiting-animation">
  142. <view class="loading-dot dot-1"></view>
  143. <view class="loading-dot dot-2"></view>
  144. <view class="loading-dot dot-3"></view>
  145. </view>
  146. </view>
  147. </view>
  148. </view>
  149. <!-- 底部安全区域 -->
  150. <view class="page-bottom-safe">
  151. <view class="bottom-content">
  152. <text class="bottom-text">—— 已经没有更多了 ——</text>
  153. </view>
  154. </view>
  155. </scroll-view>
  156. <!-- 方案制定弹框-->
  157. <view class="modal-mask" wx:if="{{showPlanModal}}" bindtap="hidePlanModal" catchtouchmove="preventTouch">
  158. <view class="modal-content" catchtap="stopPropagation">
  159. <view class="modal-header">
  160. <text class="modal-title">📋 治疗方案</text>
  161. <view class="modal-close" bindtap="hidePlanModal">
  162. <text class="close-icon">✕</text>
  163. </view>
  164. </view>
  165. <!-- 优化滚动区域 -->
  166. <scroll-view class="modal-body" scroll-y enhanced show-scrollbar="{{false}}" bindscrolltolower="onPlanScrollToLower" lower-threshold="50">
  167. <view class="plan-list">
  168. <block wx:for="{{planList}}" wx:key="index" wx:for-index="idx">
  169. <view class="plan-card fade-in-up" style="animation-delay: {{idx * 0.08}}s;">
  170. <!-- 兽医信息行 -->
  171. <view class="plan-vet-row">
  172. <image class="plan-avatar" src="{{item.vetAvatar ? baseUrl + item.vetAvatar : '/pages/images/tx.png'}}" mode="aspectFill"></image>
  173. <view class="plan-vet-info">
  174. <text class="plan-user-name">{{item.vetNickName || '兽医'}}</text>
  175. <text class="plan-title-tag" wx:if="{{item.title}}">{{item.title}}</text>
  176. </view>
  177. </view>
  178. <!-- 诊断结果 -->
  179. <view class="plan-item" wx:if="{{item.diagnosis}}">
  180. <view class="item-label">🔍 诊断结果</view>
  181. <view class="item-value diagnosis-text">{{item.diagnosis}}</view>
  182. </view>
  183. <!-- 治疗方式 -->
  184. <view class="plan-item" wx:if="{{item.treatmentMethod}}">
  185. <view class="item-label">💊 治疗方式</view>
  186. <view class="item-value">{{item.treatmentMethod}}</view>
  187. </view>
  188. <!-- 治疗方案描述 -->
  189. <view class="plan-item" wx:if="{{item.treatmentDesc}}">
  190. <view class="item-label">📝 方案描述</view>
  191. <view class="item-value">{{item.treatmentDesc}}</view>
  192. </view>
  193. <!-- 注意事项 -->
  194. <view class="plan-item" wx:if="{{item.precautions}}">
  195. <view class="item-label">⚠️ 注意事项</view>
  196. <view class="item-value precautions-text">{{item.precautions}}</view>
  197. </view>
  198. <!-- 如果有图片展示在底部 -->
  199. <view wx:if="{{item.images && item.images.length > 0}}" class="plan-images">
  200. <scroll-view scroll-x class="plan-images-scroll" show-scrollbar="{{false}}">
  201. <view class="plan-images-container">
  202. <block wx:for="{{item.images}}" wx:key="this" wx:for-index="imgIdx">
  203. <image class="plan-thumb" src="{{baseUrl + item.images[imgIdx]}}" mode="aspectFill" bindtap="previewPlanImage" data-url="{{baseUrl + item.images[imgIdx]}}" data-urls="{{item.images}}" data-base="{{baseUrl}}"></image>
  204. </block>
  205. </view>
  206. </scroll-view>
  207. </view>
  208. </view>
  209. </block>
  210. <!-- 空状态 -->
  211. <view wx:if="{{planList.length === 0}}" class="plan-empty">
  212. <text class="empty-icon">📭</text>
  213. <text class="empty-text">暂无治疗方案</text>
  214. </view>
  215. <!-- 加载更多提示 -->
  216. <view wx:if="{{planList.length > 0 && hasMorePlan}}" class="plan-loading-more" bindtap="loadMorePlan">
  217. <text class="loading-more-text">加载更多...</text>
  218. </view>
  219. <!-- 没有更多提示 -->
  220. <view wx:if="{{planList.length > 0 && !hasMorePlan}}" class="plan-no-more">
  221. <text class="no-more-text">—— 没有更多治疗方案 ——</text>
  222. </view>
  223. </view>
  224. <!-- 底部安全填充区,确保最后一条内容能完全显示 -->
  225. <view class="modal-bottom-fill"></view>
  226. </scroll-view>
  227. </view>
  228. </view>
  229. </view>