tab3.page.html 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <ion-header>
  2. <ion-toolbar color="primary">
  3. <ion-title (click)="initializeSampleData()">我的农场</ion-title>
  4. <ion-buttons slot="end">
  5. <ion-button (click)="toggleFieldForm()">
  6. <ion-icon [name]="showFieldForm ? 'close' : 'add'" slot="icon-only"></ion-icon>
  7. </ion-button>
  8. </ion-buttons>
  9. </ion-toolbar>
  10. </ion-header>
  11. <ion-content>
  12. <!-- 添加/编辑农田表单 -->
  13. <ion-card *ngIf="showFieldForm" class="form-card">
  14. <ion-card-header>
  15. <ion-card-title>{{ editingField ? '编辑农田' : '添加新农田' }}</ion-card-title>
  16. </ion-card-header>
  17. <ion-card-content>
  18. <form [formGroup]="fieldForm" (ngSubmit)="saveField()">
  19. <ion-item>
  20. <ion-label position="floating">农田名称</ion-label>
  21. <ion-input formControlName="name" type="text"></ion-input>
  22. </ion-item>
  23. <ion-item>
  24. <ion-label position="floating">面积(亩)</ion-label>
  25. <ion-input formControlName="area" type="number"></ion-input>
  26. </ion-item>
  27. <ion-item>
  28. <ion-label position="floating">位置</ion-label>
  29. <ion-input formControlName="location" type="text"></ion-input>
  30. </ion-item>
  31. <ion-item>
  32. <ion-label>当前作物</ion-label>
  33. <ion-select formControlName="currentCrop">
  34. <ion-select-option value="冬小麦">冬小麦</ion-select-option>
  35. <ion-select-option value="春玉米">春玉米</ion-select-option>
  36. <ion-select-option value="水稻">水稻</ion-select-option>
  37. <ion-select-option value="大豆">大豆</ion-select-option>
  38. </ion-select>
  39. </ion-item>
  40. <ion-item>
  41. <ion-label>土壤类型</ion-label>
  42. <ion-select formControlName="soilType">
  43. <ion-select-option value="粘壤土">粘壤土</ion-select-option>
  44. <ion-select-option value="砂壤土">砂壤土</ion-select-option>
  45. <ion-select-option value="壤土">壤土</ion-select-option>
  46. <ion-select-option value="粘土">粘土</ion-select-option>
  47. </ion-select>
  48. </ion-item>
  49. <div class="form-buttons">
  50. <ion-button type="button" fill="outline" (click)="cancelEdit()">取消</ion-button>
  51. <ion-button type="submit" [disabled]="!fieldForm.valid">保存</ion-button>
  52. </div>
  53. </form>
  54. </ion-card-content>
  55. </ion-card>
  56. <!-- 农场概览 -->
  57. <ion-card class="summary-card">
  58. <ion-card-header>
  59. <ion-card-title>农场概览</ion-card-title>
  60. </ion-card-header>
  61. <ion-card-content>
  62. <div class="summary-grid">
  63. <div class="summary-item">
  64. <ion-icon name="map" color="primary"></ion-icon>
  65. <h3>{{ fields.length }}</h3>
  66. <p>地块数量</p>
  67. </div>
  68. <div class="summary-item">
  69. <ion-icon name="leaf" color="success"></ion-icon>
  70. <h3>{{ totalArea }}亩</h3>
  71. <p>种植面积</p>
  72. </div>
  73. <div class="summary-item">
  74. <ion-icon name="alarm" color="warning"></ion-icon>
  75. <h3>{{ pendingTasks }}</h3>
  76. <p>待办农事</p>
  77. </div>
  78. </div>
  79. </ion-card-content>
  80. </ion-card>
  81. <!-- 农田地块列表 -->
  82. <ion-list>
  83. <ion-item-sliding *ngFor="let field of fields">
  84. <ion-item (click)="editField(field)">
  85. <ion-avatar slot="start">
  86. <img [src]="getCropImage(field.currentCrop)">
  87. </ion-avatar>
  88. <ion-label>
  89. <h2>{{ field.name }}</h2>
  90. <p>{{ field.area }}亩 • {{ field.currentCrop }}</p>
  91. <p class="field-status">
  92. <ion-badge *ngIf="field.status" [color]="getStatusColor(field.status)">
  93. {{ field.status }}
  94. </ion-badge>
  95. <span>种植 {{ field.daysPlanted }}天</span>
  96. </p>
  97. </ion-label>
  98. <ion-note slot="end">
  99. {{ field.nextTask || '暂无农事' }}
  100. </ion-note>
  101. </ion-item>
  102. <ion-item-options side="end">
  103. <ion-item-option color="danger" (click)="deleteField(field.id)">
  104. <ion-icon name="trash" slot="icon-only"></ion-icon>
  105. </ion-item-option>
  106. </ion-item-options>
  107. </ion-item-sliding>
  108. </ion-list>
  109. <!-- 无地块提示 -->
  110. <div class="empty-tip" *ngIf="fields.length === 0 && !showFieldForm">
  111. <ion-icon name="earth"></ion-icon>
  112. <p>您还没有添加农田地块</p>
  113. <ion-button fill="outline" (click)="toggleFieldForm()">添加第一块地</ion-button>
  114. </div>
  115. <!-- 农事提醒 -->
  116. <ion-card class="task-card" *ngIf="fields.length > 0">
  117. <ion-card-header>
  118. <ion-card-title>
  119. <ion-icon name="notifications" color="warning"></ion-icon>
  120. 近期农事提醒
  121. </ion-card-title>
  122. </ion-card-header>
  123. <ion-card-content>
  124. <ion-list>
  125. <ion-item *ngFor="let task of recentTasks" (click)="viewTaskDetail(task)">
  126. <ion-icon [name]="getTaskIcon(task.type)" slot="start" [color]="getTaskColor(task.type)"></ion-icon>
  127. <ion-label>
  128. <h3>{{ task.fieldName }}:{{ task.name }}</h3>
  129. <p>{{ task.dueDate | date:'MM月dd日' }} • {{ task.notes || '暂无备注' }}</p>
  130. </ion-label>
  131. <ion-badge slot="end" [color]="task.urgent ? 'danger' : 'medium'">
  132. {{ task.urgent ? '紧急' : '常规' }}
  133. </ion-badge>
  134. </ion-item>
  135. </ion-list>
  136. </ion-card-content>
  137. </ion-card>
  138. <!-- 生长记录 -->
  139. <ion-card *ngIf="fields.length > 0">
  140. <ion-card-header>
  141. <ion-card-title>
  142. <ion-icon name="calendar" color="primary"></ion-icon>
  143. 近期生长记录
  144. </ion-card-title>
  145. </ion-card-header>
  146. <ion-card-content>
  147. <div class="record-timeline">
  148. <div class="record-item" *ngFor="let record of recentRecords">
  149. <div class="record-date">{{ record.date | date:'MM.dd' }}</div>
  150. <div class="record-content">
  151. <h4>{{ record.fieldName }} {{ record.activity }}</h4>
  152. <p>{{ record.notes }}</p>
  153. </div>
  154. </div>
  155. </div>
  156. </ion-card-content>
  157. </ion-card>
  158. </ion-content>