Prechádzať zdrojové kódy

Merge branch 'farmer' of http://www.sysuimars.cn:3000/feiniao/feiniao-farm-h5 into farmer

刘秀芳 4 dní pred
rodič
commit
b70dbc1880

+ 24 - 22
src/views/old_mini/create_farm/index.vue

@@ -73,7 +73,9 @@
                                                 />
                                             </el-select>
                                             <el-select
-                                                v-model="ruleForm.typeId"
+                                                v-model="ruleForm.typeIds"
+                                                multiple
+                                                collapse-tags
                                                 placeholder="品种"
                                                 class="period-select select-item"
                                             >
@@ -86,7 +88,7 @@
                                             </el-select>
                                         </div>
                                     </el-form-item>
-                                    <el-form-item v-if="paramsType !== 'farmer'" label="联系人" prop="fzr">
+                                    <el-form-item label="联系人" prop="fzr">
                                         <div class="area-box">
                                             <el-input
                                                 placeholder="请输入联系人姓名"
@@ -96,7 +98,7 @@
                                             />
                                         </div>
                                     </el-form-item>
-                                    <el-form-item v-if="paramsType !== 'farmer'" label="联系电话" prop="tel">
+                                    <el-form-item label="联系电话" prop="tel">
                                         <div class="area-box">
                                             <el-input
                                                 placeholder="请输入联系人电话"
@@ -315,7 +317,7 @@ onMounted(() => {
     // 清空地块和面积数据
     polygonArr.value = null;
     ruleForm.mu = "";
-    ruleForm.typeId = "";
+    ruleForm.typeIds = [];
 
     // 如果是编辑模式,等待品类列表加载完成后再回填数据
     if (route.query.type === "edit" && store.state.home.editFarmData) {
@@ -384,7 +386,7 @@ function handleMapUpdate() {
         // 不再自动生成默认地块,等待用户点击"新增地块"
         polygonArr.value = null;
         ruleForm.mu = "";
-        ruleForm.typeId = "";
+        ruleForm.typeIds = [];
         ruleForm.defaultFarm = false;
 
         return; // 直接返回,不执行下面的逻辑
@@ -501,7 +503,7 @@ const ruleForm = reactive({
     address: "",
     mu: "",
     speciesItem: null,
-    typeId: "",
+    typeIds: [],
     name: "",
     fzr: "",
     tel: "",
@@ -532,7 +534,7 @@ const rules = reactive({
         { validator: validateMianji, trigger: ["blur", "change"] },
     ],
     speciesItem: [{ required: true, message: "请选择品类", trigger: "blur" }],
-    typeId: [{ required: true, message: "请选择品种", trigger: "blur" }],
+    typeIds: [{ required: true, message: "请选择品种", trigger: "blur" }],
     name: [{ required: true, message: "请输入您的农场名称", trigger: ["blur", "change"] }],
     fzr: [{ required: true, message: "请输入联系人姓名", trigger: ["blur", "change"] }],
     tel: [
@@ -572,7 +574,7 @@ const submitForm = (formEl) => {
                 params.farmId = route.query.farmId;
             }
 
-            if (route.query.type === "client") {
+            if (route.query.type === "client" || route.query.type === "farmer") {
                 // 处理 geom 参数,如果是数组需要序列化
                 const queryParams = {
                     ...params,
@@ -592,16 +594,16 @@ const submitForm = (formEl) => {
                 return;
             }
 
-            if(route.query.type === "farmer") {
-                VE_API.farm.saveFarm({...params, expertMiniUserId: route.query.expertMiniUserId}).then((res) => {
-                    if (res.code === 0) {
-                        router.go(-1);
-                    } else {
-                        ElMessage.error(res.msg || '创建失败');
-                    }
-                });
-                return;
-            }
+            // if(route.query.type === "farmer") {
+            //     VE_API.farm.saveFarm({...params, expertMiniUserId: route.query.expertMiniUserId}).then((res) => {
+            //         if (res.code === 0) {
+            //             router.go(-1);
+            //         } else {
+            //             ElMessage.error(res.msg || '创建失败');
+            //         }
+            //     });
+            //     return;
+            // }
 
             const apiCall = route.query.type === "edit" ? VE_API.farm.updateFarm(params) : VE_API.farm.saveFarm(params);
 
@@ -760,13 +762,13 @@ async function changeSpecie(v) {
     // if (!data) {
     //     ElMessage.warning("该品类暂无可用方案,请选择其他品类");
     //     ruleForm.speciesItem = "";
-    //     ruleForm.typeId = "";
+    //     ruleForm.typeIds = [];
     //     fruitsList.value = [];
     //     return;
     // }
     getFruitsTypeItemList(v.id);
     // 清空品种选择
-    ruleForm.typeId = "";
+    ruleForm.typeIds = [];
     // 只有在创建模式下且用户没有手动修改过农场名称时,才自动设置农场名称
     if (route.query.type !== "edit" && !isFarmNameManuallyModified.value && farmCity.value) {
         ruleForm.name = farmCity.value + v.name + "农场";
@@ -921,8 +923,8 @@ function populateEditData() {
         getFruitsTypeItemList(editData.speciesId);
 
         // 设置品种
-        if (editData.typeId) {
-            ruleForm.typeId = editData.typeId;
+        if (editData.typeIds) {
+            ruleForm.typeIds = editData.typeIds;
         }
     }
 

+ 5 - 1
src/views/old_mini/home/index.vue

@@ -22,7 +22,7 @@
         </div>
 
         <div class="task-list">
-            <div class="task-title">待办任务</div>
+            <div class="task-title" @click="handleJump">待办任务</div>
             <div class="bottom-tag">
                 <div class="tag-card">
                     <div class="card-content">
@@ -84,6 +84,10 @@ import reminderTimePopup from "@/components/popup/reminderTimePopup.vue";
 import executeTracePopup from "@/components/popup/executeTracePopup.vue";
 import knowledgeCard from "./components/knowledgeCard.vue";
 
+const handleJump = () =>{
+    router.push('/create_farm?type=farmer&expertMiniUserId=81881')
+}
+
 const store = useStore();
 const tabBarHeight = computed(() => store.state.home.tabBarHeight);
 const router = useRouter();

+ 272 - 0
src/views/old_mini/home/subPages/prescriptionPage copy.vue

@@ -0,0 +1,272 @@
+<template>
+    <div class="prescription-page">
+        <div class="prescription-title">
+            <img @click="goBack" src="@/assets/img/home/back.png" alt="" />
+            <div class="title-name">农事处方维护单</div>
+            <div class="title-desc">请认真核对一下内容</div>
+        </div>
+        <div class="prescription-box">
+            <div class="box-title">
+                <img src="@/assets/img/home/label-icon.png" />
+                农场情况
+            </div>
+            <div class="box-content">
+                <div class="box-item" v-for="(group, i) in productList" :key="i">
+                    <div class="item-name">
+                        <span class="required-icon">*</span>
+                        <span>{{ group.name }}</span>
+                    </div>
+                    <div class="item-checkbox">
+                        <el-radio-group v-model="group.checked">
+                            <el-radio-button
+                                v-for="(item, index) in group.items"
+                                :key="index"
+                                :label="item.name"
+                                :value="item.name"
+                            />
+                        </el-radio-group>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="prescription-box">
+            <div class="box-title">
+                <img src="@/assets/img/home/label-icon.png" />
+                过往出现过的灾害 (多选)
+            </div>
+            <div class="box-content">
+                <div class="box-item" style="padding-top: 0">
+                    <div class="item-checkbox">
+                        <el-checkbox-group v-model="outputVal">
+                            <el-checkbox-button v-for="(item, index) in outputList" :key="index" :value="item.name">
+                                {{ item.name }}
+                            </el-checkbox-button>
+                        </el-checkbox-group>
+                    </div>
+                </div>
+            </div>
+            <div class="disaster-desc-box">
+                <span>其它异常</span>
+                <el-input
+                    v-model="disasterDesc"
+                    :autosize="{ minRows: 2, maxRows: 4 }"
+                    type="textarea"
+                    placeholder="请简单描述一下异常情况"
+                />
+            </div>
+        </div>
+
+        <!-- 按钮 -->
+        <div class="custom-bottom-fixed-btns">
+            <div class="bottom-btn secondary-btn" @click="handlePage">跳过</div>
+            <div class="bottom-btn primary-btn" @click="handlePage">生成处方</div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import { ref, onActivated } from "vue";
+import { useRouter, useRoute } from "vue-router";
+const router = useRouter();
+const route = useRoute();
+const productList = ref([
+    { name: "请选择您的果园土壤类型", items: [{ name: "红壤" }, { name: "壤土" }, { name: "冲积土" }] },
+    { name: "请选择您的灌溉方式", items: [{ name: "滴灌" }, { name: "穴灌" }, { name: "微喷灌" }] },
+    { name: "是否需要改良土壤", items: [{ name: "需要" }, { name: "不需要" }] },
+]);
+const outputList = ref([
+    { name: "低温冻害" },
+    { name: "干旱" },
+    { name: "暴雨渍水" },
+    { name: "病虫害" },
+    { name: "阴天寡照" },
+]);
+// 默认选中前两项
+const outputVal = ref([]);
+const disasterDesc = ref("");
+// 初始化默认选中第一项
+onActivated(() => {
+    // outputVal.value = outputList.value.length >= 2
+    //     ? [outputList.value[0].name, outputList.value[1].name]
+    //     : outputList.value.length === 1
+    //     ? [outputList.value[0].name]
+    //     : []
+    if (route.query.speciesName === '籼稻') {
+        productList.value[0].items = [{ name: "黏质土" }, { name: "壤土" }, { name: "冲积土" }];
+        productList.value[1].items = [{ name: "漫灌" }, { name: "间歇灌溉" }, { name: "喷灌" }];
+    }
+    // 为 productList 的每个 group 设置默认选中第一项
+    productList.value.forEach((group) => {
+        if (group.items && group.items.length > 0 && !group.checked) {
+            group.checked = group.items[0].name;
+        }
+    });
+});
+
+const goBack = () => {
+    // router.go(-1);
+    router.replace(`/create_farm?from=${route.query.from}&type=${route.query.type}`)
+};
+
+const handlePage = () => {
+    // 获取所有需要传递的参数,包括 from 参数
+    const queryParams = {
+        containerId: route.query.containerId,
+    };
+    
+    // 如果存在 from 参数,继续传递
+    if (route.query.from) {
+        queryParams.from = route.query.from;
+    }
+    
+    // 传递所有农场相关的参数,以便在 agricultural_plan 页面创建农场
+    const farmParams = ['wkt', 'speciesId', 'containerId', 'agriculturalCreate', 'geom', 'address', 'mu', 'name', 'fzr', 'tel', 'defaultFarm', 'typeId', 'speciesName','userType'];
+    farmParams.forEach(key => {
+        if (route.query[key] !== undefined) {
+            queryParams[key] = route.query[key];
+        }
+    });
+    router.push({
+        path: '/agricultural_plan',
+        query: queryParams
+    });
+};
+</script>
+
+<style lang="scss" scoped>
+.prescription-page {
+    position: relative;
+    width: 100%;
+    height: calc(100vh - 62px);
+    overflow: auto;
+    box-sizing: border-box;
+    background: linear-gradient(to left, #e6f2ff, #8fc5fe);
+    .prescription-title {
+        padding: 16px 14px;
+        background: url("@/assets/img/home/page-bg.png") no-repeat bottom right / 149px 116px;
+        background-position-y: 30px;
+        img {
+            width: 24px;
+        }
+        .title-name {
+            font-size: 22px;
+            color: #2e2e2e;
+            text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05);
+            font-weight: 800;
+            padding: 21px 0 4px 6px;
+        }
+        .title-desc {
+            font-size: 14px;
+            color: rgba(49, 49, 49, 0.56);
+            padding-left: 6px;
+        }
+    }
+    .prescription-box {
+        background: #ffffff;
+        box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1);
+        border-radius: 10px;
+        margin: 0 10px 10px;
+        box-sizing: border-box;
+        padding-bottom: 10px;
+        .box-title {
+            margin: 0 10px;
+            box-sizing: border-box;
+            border-bottom: 1px solid rgba(0, 0, 0, 0.15);
+            font-weight: 800;
+            font-size: 18px;
+            color: #222222;
+            padding: 15px 0 10px;
+            img {
+                width: 14px;
+                height: 9px;
+            }
+        }
+        .box-content {
+            padding: 0 10px;
+            .box-item {
+                padding-top: 10px;
+                .item-name {
+                    display: flex;
+                    align-items: center;
+                    font-size: 15px;
+                    color: rgba(0, 0, 0, 0.9);
+                    .required-icon {
+                        color: #ff0000;
+                        font-size: 16px;
+                        margin-right: 4px;
+                    }
+                }
+                .item-checkbox {
+                    ::v-deep {
+                        .el-radio-button,
+                        .el-checkbox-button {
+                            margin: 10px 7px 0 0;
+                            .el-radio-button__inner,
+                            .el-checkbox-button__inner {
+                                border: none;
+                                background: #f1f1f1;
+                                border-radius: 8px;
+                                padding: 13px 24px;
+                                border: 1px solid rgba(255, 255, 255, 0);
+                                color: #000000;
+                                font-size: 15px;
+                                font-weight: 400;
+                            }
+                            &.is-active,
+                            &.is-checked {
+                                &::after {
+                                    content: "";
+                                    position: absolute;
+                                    z-index: 9;
+                                    bottom: 0;
+                                    right: 0;
+                                    width: 18px;
+                                    height: 16px;
+                                    background: url("@/assets/img/home/checked-bg.png") no-repeat bottom right / 18px
+                                        16px;
+                                }
+                                .el-radio-button__inner,
+                                .el-checkbox-button__inner {
+                                    background: rgba(33, 153, 248, 0.1) !important;
+                                    color: #2199f8 !important;
+                                    border: 1px solid #2199f8 !important;
+                                    box-shadow: none;
+                                    font-weight: 500;
+                                }
+                            }
+                            &.is-active {
+                                .el-radio-button__original-radio:not(:disabled) + .el-radio-button__inner {
+                                    background: rgba(33, 153, 248, 0.1) !important;
+                                    color: #2199f8 !important;
+                                    border: 1px solid #2199f8 !important;
+                                    box-shadow: none;
+                                    font-weight: 500;
+                                }
+                            }
+                            &.is-checked {
+                                .el-checkbox-button__original-checkbox:not(:disabled) + .el-checkbox-button__inner {
+                                    background: rgba(33, 153, 248, 0.1) !important;
+                                    color: #2199f8 !important;
+                                    border: 1px solid #2199f8 !important;
+                                    box-shadow: none;
+                                    font-weight: 500;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    .disaster-desc-box {
+        padding: 10px;
+        display: flex;
+        align-items: center;
+        span {
+            font-size: 14px;
+            color: rgba(0, 0, 0, 0.9);
+            width: 80px;
+        }
+    }
+}
+</style>

+ 20 - 7
src/views/old_mini/home/subPages/prescriptionPage.vue

@@ -16,6 +16,7 @@
                         <span class="required-icon">*</span>
                         <span>{{ group.name }}</span>
                     </div>
+                    <div class="tips">{{ group.subName }}</div>
                     <div class="item-checkbox">
                         <el-radio-group v-model="group.checked">
                             <el-radio-button
@@ -29,7 +30,7 @@
                 </div>
             </div>
         </div>
-        <div class="prescription-box">
+        <!-- <div class="prescription-box">
             <div class="box-title">
                 <img src="@/assets/img/home/label-icon.png" />
                 过往出现过的灾害 (多选)
@@ -54,12 +55,12 @@
                     placeholder="请简单描述一下异常情况"
                 />
             </div>
-        </div>
+        </div> -->
 
         <!-- 按钮 -->
         <div class="custom-bottom-fixed-btns">
             <div class="bottom-btn secondary-btn" @click="handlePage">跳过</div>
-            <div class="bottom-btn primary-btn" @click="handlePage">生成处方</div>
+            <div class="bottom-btn primary-btn" @click="handlePage">确认信息</div>
         </div>
     </div>
 </template>
@@ -70,9 +71,10 @@ import { useRouter, useRoute } from "vue-router";
 const router = useRouter();
 const route = useRoute();
 const productList = ref([
-    { name: "请选择您的果园土壤类型", items: [{ name: "红壤" }, { name: "壤土" }, { name: "冲积土" }] },
-    { name: "请选择您的灌溉方式", items: [{ name: "滴灌" }, { name: "穴灌" }, { name: "微喷灌" }] },
-    { name: "是否需要改良土壤", items: [{ name: "需要" }, { name: "不需要" }] },
+    { name: "请选择您的果园土壤类型", subName:'土壤类型确认最佳施肥策略',items: [{ name: "砂质土" }, { name: "黏质土" }, { name: "壤土" }] },
+    { name: "请选择您的灌溉方式",subName:'处方执行方式,根据您的灌溉设施确定', items: [{ name: "人工浇灌" }, { name: "人工喷灌" }, { name: "微喷灌" },{name:'滴灌'}] },
+    { name: "请选择您的农机设备",subName:'农机可以加入农机租赁库,在农闲时获取额外收益', items: [{ name: "植保无人机" }, { name: "骑乘式割草机" },{name:'乘坐式喷药机'},{name:'果园运输车'},{name:'果园碎枝机'},{name:'农用吊运无人机'}] },
+    { name: "您最想改善的方向",items: [{ name: "病虫防治" }, { name: "树势不良" }, { name: "土壤板结" },{name:'保花保果'},{name:'品种改良'},{name:'树体剪枝'},{name:'果园规划'}] },
 ]);
 const outputList = ref([
     { name: "低温冻害" },
@@ -109,6 +111,12 @@ const goBack = () => {
 };
 
 const handlePage = () => {
+
+    if(route.query.type === 'farmer'){
+        router.push('/agri_record')
+        return
+    }
+
     // 获取所有需要传递的参数,包括 from 参数
     const queryParams = {
         containerId: route.query.containerId,
@@ -196,6 +204,11 @@ const handlePage = () => {
                         margin-right: 4px;
                     }
                 }
+                .tips{
+                    margin-left: 10px;
+                    font-size: 12px;
+                    color: rgba(0, 0, 0, 0.4);
+                }
                 .item-checkbox {
                     ::v-deep {
                         .el-radio-button,
@@ -206,7 +219,7 @@ const handlePage = () => {
                                 border: none;
                                 background: #f1f1f1;
                                 border-radius: 8px;
-                                padding: 13px 24px;
+                                padding: 13px 21px;
                                 border: 1px solid rgba(255, 255, 255, 0);
                                 color: #000000;
                                 font-size: 15px;

+ 9 - 0
src/views/old_mini/interactionList/index.vue

@@ -21,6 +21,7 @@
             <div class="uploaded-content" v-show="item.isConfirmed == null || item.expanded">
                 <div class="content-wrapper">
                     <div class="item-desc">{{ item.reason }}</div>
+                    <div class="tip-box">如果不确定是否发生,直接上传照片即可</div>
                     <div class="example-wrapper">
                         <div class="example-header">
                             <div>示例照片</div>
@@ -553,6 +554,14 @@ const handleSubmitAll = () => {
                     color: #3C3C3C;
                     margin-bottom: 10px;
                 }
+                .tip-box{
+                    font-size: 12px;
+                    color: #2199F8;
+                    padding: 3px 5px;
+                    border-radius: 4px;
+                    margin-bottom: 10px;
+                    background: linear-gradient(90deg, rgba(33, 153, 248, 0.2) 0%, rgba(221, 221, 221, 0) 100%);
+                }
 
                 .example-wrapper {
                     .example-header {