index.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <template>
  2. <div class="entry-information-page">
  3. <custom-header name="录入信息" bgColor="#fff"></custom-header>
  4. <div class="entry-information-body">
  5. <service-information v-if="currentStep === 1 && isServiceEntry" @next="handleNext" />
  6. <ba-information v-else-if="currentStep === 1" @next="handleNext" />
  7. <select-category v-else-if="currentStep === 2" :multiple="isServiceEntry" @prev="handlePrev" @next="handleNext" />
  8. <select-equipment
  9. v-else-if="showEquipmentStep"
  10. :key="equipmentScope || 'farmer'"
  11. :is-service="isServiceEntry"
  12. :is-last-step="equipmentIsLastStep"
  13. :equipment-scope="equipmentScope"
  14. :total-steps="totalSteps"
  15. @prev="handlePrev"
  16. @next="handleNext"
  17. @confirm="handleConfirm"
  18. />
  19. <select-variety
  20. v-else-if="showVarietyStep"
  21. :multiple="isServiceEntry"
  22. @prev="handlePrev"
  23. @next="handleNext"
  24. />
  25. <manual-farming-service
  26. v-else-if="showManualStep"
  27. :has-field="hasFieldSelected"
  28. :has-fruit="hasFruitSelected"
  29. @prev="handlePrev"
  30. @next="handleNext"
  31. @confirm="handleConfirm"
  32. />
  33. </div>
  34. </div>
  35. </template>
  36. <script setup>
  37. import { computed, onActivated, onMounted, ref, watch } from "vue";
  38. import { useRoute, useRouter } from "vue-router";
  39. import customHeader from "@/components/customHeader.vue";
  40. import baInformation from "./components/baInformation.vue";
  41. import serviceInformation from "./components/serviceInformation.vue";
  42. import selectCategory from "./components/selectCategory.vue";
  43. import selectVariety from "./components/selectVariety.vue";
  44. import selectEquipment from "./components/selectEquipment.vue";
  45. import manualFarmingService from "./components/manualFarmingService.vue";
  46. const STEP_KEY = "ENTRY_INFORMATION_STEP";
  47. const INVITE_TYPE_KEY = "ENTRY_INVITE_TYPE";
  48. const CATEGORY_SESSION_KEY = "ENTRY_SELECTED_CATEGORY";
  49. const ADMIN_ID_KEY = "ENTRY_ADMIN_ID";
  50. const router = useRouter();
  51. const route = useRoute();
  52. function readStep() {
  53. const step = Number(sessionStorage.getItem(STEP_KEY));
  54. return step >= 1 && step <= 5 ? step : 1;
  55. }
  56. function readInviteType() {
  57. const fromQuery = route.query.inviteType;
  58. if (fromQuery === "service" || fromQuery === "farmer") {
  59. sessionStorage.setItem(INVITE_TYPE_KEY, fromQuery);
  60. return fromQuery;
  61. }
  62. return sessionStorage.getItem(INVITE_TYPE_KEY) || "farmer";
  63. }
  64. function syncAdminIdFromQuery() {
  65. const fromQuery = route.query.adminId;
  66. if (fromQuery != null && fromQuery !== "") {
  67. sessionStorage.setItem(ADMIN_ID_KEY, String(fromQuery));
  68. }
  69. }
  70. const currentStep = ref(readStep());
  71. const inviteType = ref(readInviteType());
  72. const isServiceEntry = computed(() => inviteType.value === "service");
  73. const hasFieldSelected = ref(false);
  74. const hasFruitSelected = ref(false);
  75. const isBothCrops = computed(() => hasFieldSelected.value && hasFruitSelected.value);
  76. const totalSteps = computed(() => {
  77. if (!isServiceEntry.value) return 4;
  78. return isBothCrops.value ? 6 : 4;
  79. });
  80. const maxStep = computed(() => {
  81. if (!isServiceEntry.value) return 4;
  82. return isBothCrops.value ? 5 : 4;
  83. });
  84. const showEquipmentStep = computed(() => {
  85. if (!isServiceEntry.value) return currentStep.value === 4;
  86. if (hasFieldSelected.value && currentStep.value === 3) return true;
  87. if (isBothCrops.value && currentStep.value === 5) return true;
  88. if (hasFruitSelected.value && !hasFieldSelected.value && currentStep.value === 4) return true;
  89. return false;
  90. });
  91. const equipmentScope = computed(() => {
  92. if (!isServiceEntry.value) return "";
  93. if (!hasFieldSelected.value) return "fruit";
  94. return currentStep.value === 5 ? "fruit" : "field";
  95. });
  96. const equipmentIsLastStep = computed(() => {
  97. if (!isServiceEntry.value) return true;
  98. return equipmentScope.value === "fruit";
  99. });
  100. const showVarietyStep = computed(() => !isServiceEntry.value && currentStep.value === 3);
  101. const showManualStep = computed(() => {
  102. if (!isServiceEntry.value) return false;
  103. if (hasFieldSelected.value) return currentStep.value === 4;
  104. return hasFruitSelected.value && currentStep.value === 3;
  105. });
  106. function refreshHasField() {
  107. try {
  108. const list = JSON.parse(sessionStorage.getItem(CATEGORY_SESSION_KEY) || "[]");
  109. const items = Array.isArray(list) ? list : [];
  110. hasFieldSelected.value = items.some(
  111. (item) => item?.firstCrop === "大田" || item?.majorKey === "field"
  112. );
  113. hasFruitSelected.value = items.some(
  114. (item) => item?.firstCrop === "果树" || item?.majorKey === "fruit"
  115. );
  116. } catch {
  117. hasFieldSelected.value = false;
  118. hasFruitSelected.value = false;
  119. }
  120. }
  121. function clampStep() {
  122. if (currentStep.value > maxStep.value) {
  123. currentStep.value = maxStep.value;
  124. }
  125. }
  126. function syncEntryState() {
  127. inviteType.value = readInviteType();
  128. syncAdminIdFromQuery();
  129. currentStep.value = readStep();
  130. refreshHasField();
  131. clampStep();
  132. }
  133. onMounted(syncEntryState);
  134. onActivated(syncEntryState);
  135. watch(
  136. currentStep,
  137. (step) => {
  138. sessionStorage.setItem(STEP_KEY, String(step));
  139. },
  140. { immediate: true }
  141. );
  142. const handleNext = () => {
  143. refreshHasField();
  144. if (hasFieldSelected.value && currentStep.value === 3) {
  145. sessionStorage.removeItem("ENTRY_MANUAL_VIEW");
  146. }
  147. if (currentStep.value < maxStep.value) {
  148. currentStep.value += 1;
  149. }
  150. };
  151. const handlePrev = () => {
  152. if (currentStep.value > 1) {
  153. currentStep.value -= 1;
  154. }
  155. };
  156. const handleConfirm = () => {
  157. router.replace("/growth_report");
  158. };
  159. </script>
  160. <style lang="scss" scoped>
  161. .entry-information-page {
  162. height: 100vh;
  163. background: linear-gradient(270deg, rgba(218, 195, 255, 0.59) 0%, #E6F2FF 0.01%, #8FC5FE 100%);
  164. display: flex;
  165. flex-direction: column;
  166. }
  167. .entry-information-body {
  168. height: 100%;
  169. display: flex;
  170. flex-direction: column;
  171. overflow: hidden;
  172. }
  173. </style>