2 Commits 182ce450e9 ... 521d29653b

Author SHA1 Message Date
  lxf 521d29653b Merge branch 'master' of http://www.sysuimars.cn:3000/feiniao/feiniao-farm-h5 1 week ago
  lxf 41bbd5eb2a feat: 增加编辑农事 1 week ago

+ 26 - 0
src/api/enum.js

@@ -0,0 +1,26 @@
+module.exports = {
+    //角色枚举
+    ROLE:{
+        ADMIN:1,
+        GARDEN_MASTER:2,
+        EXPERT:3
+    }
+    ,
+    //农事记录状态枚举
+    NS_RECORD_STATUS_ENUM:{
+        STAY_START:0,//待开始处理
+        STAY_VIEW:1,//待观察
+        STAY_EXECUTE:2,//待执行
+        STAY_CONFIRM:3,//待确认
+        STAY_CHECK:4,//待确认
+        CHENG_XIAO_FEN_XI:5//成效分析
+    },
+    // 果园状态
+    GARDEN_STATUS_ENUM: {
+        DONE: 0, // 完全解除
+        ABNORMAL_GROWTH: 1, // 生长异常
+        ABNORMAL_Pest: 2, // 病虫异常
+        PENDING_REVIEW: 3, // 待复核
+        REVIEWED: 4 // 复核完成
+    }
+}

BIN
src/assets/img/status/status_bcyc.png


BIN
src/assets/img/status/status_dfh.png


BIN
src/assets/img/status/status_szyc.png


+ 2 - 2
src/components/detailDialog.vue

@@ -85,8 +85,8 @@
             <img class="right-img" src="@/assets/img/home/right.png" alt="">
         </div>
         <div class="no-popup-title">
-            <span>农事已触发成功</span>
-            <div class="no-popup-title-sub">您可以在 农场监测-农事任务 看到农事状态</div>
+            <span>好的,感谢您的配合</span>
+            <div class="no-popup-title-sub">请您耐心等待 专家确认农事</div>
         </div>
         <div class="no-popup-btn" @click="noShow = false">我知道了</div>
     </Popup>

+ 8 - 1
src/router/globalRoutes.js

@@ -74,7 +74,8 @@ export default [
         path: "/message_list",
         name: "MessageList",
         component: () => import("@/views/old_mini/mine/pages/messageList.vue"),
-    },// 识别结果
+    },
+    // 识别结果
     {
         path: "/recognize",
         name: "Recognize",
@@ -93,4 +94,10 @@ export default [
         name: "FarmManageDetail",
         component: () => import("@/views/old_mini/home/index.vue"),
     },
+    // 编辑农事
+    {
+        path: "/modify_work",
+        name: "ModifyWork",
+        component: () => import("@/views/old_mini/modify_work/index.vue"),
+    },
 ];

+ 2 - 2
src/views/old_mini/home/subPages/expertList.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="prescription-list">
-        <custom-header name="创建农场"></custom-header>
+        <custom-header name="咨询专家"></custom-header>
         <div class="prescription-filter">
             <div class="filter-search">
                 <el-input
@@ -85,7 +85,7 @@
                         </div>
                     </div>
                     <div class="list-btn">
-                        <div class="btn-primary" @click.stop="handleChat(item)">
+                        <div class="btn-primary" @click.stop="toPage(item)">
                             <span>免费咨询</span>
                         </div>
                         <div class="btn-plain" @click.stop="handlePage(item)">查看处方</div>

+ 1213 - 0
src/views/old_mini/modify_work/index.vue

@@ -0,0 +1,1213 @@
+<template>
+    <div class="new-farming-page">
+        <custom-header name="编辑农事"></custom-header>
+        <div class="new-farming-content">
+            <div class="box-wrap farm-info">
+                <div class="info-title">
+                    <div class="card-title">农场现状</div>
+                    <div class="info-more">
+                        点击查看更多
+                        <el-icon><ArrowRight /></el-icon>
+                    </div>
+                </div>
+                <div class="info-content">
+                    当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标
+                </div>
+            </div>
+            <div class="box-wrap farm-photo">
+                <div class="photo-list">
+                    <div class="img-item" v-for="(item, index) in 6" :key="index">
+                        <img class="photo-item" src="https://birdseye-img-ali-cdn.sysuimars.com/16926861-1e20-4cbd-8bf2-90208db5a2d0/806080da-1a30-4b5b-b64b-b22e722c6cb6/DJI_202509010800_001_806080da-1a30-4b5b-b64b-b22e722c6cb6/DJI_20250901080536_0045_V_code-ws0fsmge97gh.jpeg" alt="">
+                    </div>
+                </div>
+                <div class="list-text">点击查看更多</div>
+            </div>
+            <el-form
+                ref="formRef"
+                style="max-width: 600px"
+                label-position="left"
+                :rules="rules"
+                :model="dynamicValidateForm"
+                class="demo-dynamic"
+            >
+                <div class="farm-card">
+                    <div class="card-title">秋梢防虫<span class="type-tag">标准农事</span></div>
+                    <div class="info-content">
+                        <el-form-item label-width="70px" class="form-item text-item" label="农事编号">
+                            <div class="info-text">
+                                BZ-YY-04-SQYY-20
+                            </div>
+                        </el-form-item>
+                        <el-form-item label-width="70px" class="form-item text-item" label="服务亩树">
+                            <div class="info-text">
+                                100亩
+                            </div>
+                        </el-form-item>
+                        <el-form-item label-width="70px" class="form-item text-item" label="服务区域">
+                            <div class="info-text">
+                                广州市从化区荔枝博览园
+                            </div>
+                        </el-form-item>
+                        <el-form-item label-width="70px" class="form-item" prop="conditionRate" label="触发条件">
+                            <div class="condition-wrap">
+                                <el-select v-model="dynamicValidateForm.condition" placeholder="请选择触发条件" style="width: 58%">
+                                    <el-option v-for="(item, index) in farmWorkIndexNameList" :key="index" :value="item" :label="item" />
+                                </el-select>
+                                <span class="symbol"></span>
+                                <el-select v-model="dynamicValidateForm.conditionRate" placeholder="" style="width: 34%">
+                                    <el-option :value="0" label="0%" />
+                                    <el-option :value="5" label="5%" />
+                                    <el-option :value="10" label="10%" />
+                                    <el-option :value="20" label="20%" />
+                                    <el-option :value="40" label="40%" />
+                                    <el-option :value="60" label="60%" />
+                                    <el-option :value="80" label="80%" />
+                                </el-select>
+                            </div>
+                        </el-form-item>
+                        <el-form-item label-width="70px" class="form-item" prop="executeDate" label="执行时间">
+                            <el-date-picker
+                                class="item-input"
+                                style="width: 100%"
+                                value-format="YYYY-MM-DD"
+                                v-model="dynamicValidateForm.executeDate"
+                                type="date"
+                                :clearable="false"
+                                placeholder="选择日期"
+                            />
+                        </el-form-item>
+                    </div>
+                </div>
+                <div class="farm-card prescription-content">
+                    <div class="card-title pb-12">药物处方</div>
+                    <el-form-item label-width="32%" class="form-item" prop="usageMode" label="施用方式">
+                        <el-select v-model="dynamicValidateForm.usageMode" placeholder="请选择施用方式" style="width: 100%">
+                            <el-option
+                                v-for="(usage, uId) in allUsageModeList"
+                                :key="uId"
+                                :label="usage"
+                                :value="usage"
+                            />
+                        </el-select>
+                    </el-form-item>
+                    <div v-if="dynamicValidateForm.usageMode !== '人工农事'">
+                        <el-form-item
+                            v-for="(prescriptionItem, prescriptionI) in dynamicValidateForm.prescriptionList"
+                            :key="prescriptionI"
+                            :prop="'prescriptions.' + prescriptionI + '.value'"
+                            class="prescription-item"
+                        >
+                            <div class="recipe-item">
+                                <div class="sub-title">
+                                    <div>{{ prescriptionItem.name }}处方</div>
+                                    <div class="add-tag" @click="addDomain(prescriptionI)">
+                                        <el-icon color="#2199F8"><Plus /></el-icon>新增药物
+                                    </div>
+                                </div>
+                                <div class="recipe-form">
+                                    <el-form-item
+                                        v-for="(domain, index) in prescriptionItem.pesticideFertilizerList"
+                                        :key="domain.key"
+                                        :prop="'pesticideFertilizerList.' + index + '.value'"
+                                    >
+                                        <div class="form-box">
+                                            <div class="form-index">{{ formatIndex(index) }}</div>
+                                            <div class="box-item" v-if="domain.typeName">
+                                                <div class="form-l">使用功效</div>
+                                                <div class="form-r r-text">
+                                                    {{ domain.typeName }}
+                                                    <!-- <el-select
+                                                    v-model="domain.typeName"
+                                                    placeholder="请选择"
+                                                    style="width: 100%"
+                                                    >
+                                                        <el-option :label="domain.typeName" :value="domain.typeName" />
+                                                </el-select> -->
+                                                </div>
+                                            </div>
+                                            <div class="box-item">
+                                                <div class="form-l">肥药名称</div>
+                                                <div class="form-r">
+                                                    <el-select
+                                                        filterable
+                                                        @change="handlePesticideFertilizerChange(prescriptionI, index)"
+                                                        v-model="domain.pesticideFertilizerId"
+                                                        placeholder="请选择"
+                                                        style="width: 100%"
+                                                    >
+                                                        <el-option
+                                                            v-for="item in pesticideFertilizersOptions"
+                                                            :key="item.id"
+                                                            :label="item.defaultName"
+                                                            :value="item.id"
+                                                        />
+                                                    </el-select>
+                                                </div>
+                                            </div>
+                                            <div class="form-title">人工方式</div>
+                                            <div class="box-item sub-item">
+                                                <div class="form-l has-sub">
+                                                    <div class="main-name">肥药配比</div>
+                                                    <div class="sub-name">(药剂:兑水量)</div>
+                                                </div>
+                                                <div class="form-r input-box text-center">
+                                                    <el-input
+                                                        v-model="domain.ratio"
+                                                        style="width: 100%"
+                                                        placeholder="请输入"
+                                                    />
+                                                </div>
+                                            </div>
+                                            <!-- <div class="box-item sub-item">
+                                                <div class="form-l">施用方式</div>
+                                                <div class="form-r">
+                                                    <el-select
+                                                        v-model="domain.usageMode"
+                                                        placeholder="请选择"
+                                                        style="width: 100%"
+                                                    >
+                                                        <el-option
+                                                            v-for="(usage, uId) in domain.usageModeList"
+                                                            :key="uId"
+                                                            :label="usage"
+                                                            :value="usage"
+                                                        />
+                                                    </el-select>
+                                                </div>
+                                            </div> -->
+                                            <div class="box-item sub-item">
+                                                <div class="form-l has-sub">
+                                                    <div class="main-name">单亩用量</div>
+                                                    <div class="sub-name">(亩数:药剂)</div>
+                                                </div>
+                                                <div class="form-r input-box text-center">
+                                                    <el-input
+                                                        v-model="domain.muUsage"
+                                                        style="width: 100%"
+                                                        placeholder="请输入"
+                                                    />
+                                                </div>
+                                            </div>
+                                            <div v-if="dynamicValidateForm.usageMode === '叶面施'">
+                                                <div class="form-title">无人机方式</div>
+                                                <div class="box-item sub-item">
+                                                    <div class="form-l has-sub">
+                                                        <div class="main-name">肥药配比</div>
+                                                        <div class="sub-name">(药剂:兑水量)</div>
+                                                    </div>
+                                                    <div class="form-r input-box text-center">
+                                                        <el-input
+                                                            v-model="domain.ratio2"
+                                                            style="width: 100%"
+                                                            placeholder="请输入"
+                                                        />
+                                                    </div>
+                                                </div>
+                                                <div class="box-item sub-item">
+                                                    <div class="form-l has-sub">
+                                                        <div class="main-name">单亩用量</div>
+                                                        <div class="sub-name">(亩数:药剂)</div>
+                                                    </div>
+                                                    <div class="form-r input-box text-center">
+                                                        <el-input
+                                                            v-model="domain.muUsage2"
+                                                            style="width: 100%"
+                                                            placeholder="请输入"
+                                                        />
+                                                    </div>
+                                                </div>
+                                            </div>
+                                            <div class="input-box mark-box">
+                                                <el-input
+                                                    v-model="domain.remark"
+                                                    style="width: 100%"
+                                                    placeholder="备注:用药注意事项"
+                                                />
+                                            </div>
+                                            <div class="action-btn">
+                                                <el-button
+                                                    class="btn delete-btn"
+                                                    @click.prevent="removeDomain(prescriptionI, domain)"
+                                                >
+                                                    删除
+                                                </el-button>
+                                                <el-button
+                                                    type="primary"
+                                                    class="btn"
+                                                    @click.prevent="resetItemForm(prescriptionI, index)"
+                                                >
+                                                    重置
+                                                </el-button>
+                                            </div>
+                                        </div>
+                                    </el-form-item>
+                                </div>
+                            </div>
+                        </el-form-item>
+                    </div>
+                </div>
+                <div class="farm-card map-content">
+                    <div class="card-title">执行农事区域</div>
+                    <div class="info-content">
+                        <div class="area-select">
+                            执行分区:
+                            <span class="block"></span>
+                            <el-select
+                                popper-class="v-select-popper-ns"
+                                v-model="regionId"
+                                placeholder="请选择分区"
+                                style="width: 100px"
+                                @change="changeRegion"
+                            >
+                                <el-option
+                                    v-for="(area, index) in areaList"
+                                    :key="index"
+                                    :label="area.name"
+                                    :value="area.id"
+                                >
+                                </el-option>
+                            </el-select>
+                        </div>
+                        <div class="area-select">
+                            服务亩数:
+                            <span class="block"></span>{{ serveArea }}
+                        </div>
+                        <div class="bottom-map" ref="areaRef"></div>
+                        <div>
+                            <div class="check-btn">
+                                <el-checkbox v-model="checkedArea" @change="handleArea" label="全选" size="large" />
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="submit-btn">
+                    <div class="btn second">驳回</div>
+                    <div class="btn" @click.prevent="submitForm(formRef)">立即下发</div>
+                </div>
+            </el-form>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import { onActivated, ref, reactive, onDeactivated, computed, onMounted } from "vue";
+import { useRouter, useRoute } from "vue-router";
+import { ElMessage } from "element-plus";
+import customHeader from "@/components/customHeader.vue";
+import NewFarmMap from "./newFarmMap";
+import { useStore } from "vuex";
+import eventBus from "@/api/eventBus";
+import dayjs from "dayjs";
+const store = useStore();
+const router = useRouter();
+const route = useRoute();
+
+const gardenId = ref(null);
+const actionType = ref([]);
+onMounted(() => {
+    window.scrollTo(0, 0);
+    getFarmWorkNameList();
+    getFarmWorkIndexNameList();
+    // actionType.value = JSON.parse(route.query.data);
+    actionType.value = ["生长异常"];
+    dynamicValidateForm.prescriptionList = actionType.value.map((name) => ({
+        name,
+        pesticideFertilizerList: [
+            {
+                key: 1,
+                typeName: "",
+                muUsage: "",
+                muUsage2: "",
+                ratio: "",
+                ratio2: "",
+                remark: "",
+            },
+        ],
+    }));
+console.log('dynamicValidateForm.prescriptionList', dynamicValidateForm.prescriptionList);
+    const point = store.state.home.miniUserLocationPoint;
+    newFarmMap.initMap(point, areaRef.value);
+    eventBus.on("editNsMap:areaVal", getArea);
+    gardenId.value = route.query.gardenId;
+    getAreaList(() => {
+        newFarmMap.initArea(areaList.value);
+    });
+
+    getWarningMsg();
+});
+
+onDeactivated(() => {
+    newFarmMap.destroyMap();
+    resetForm(formRef.value);
+});
+
+const resetForm = (formEl) => {
+    if (!formEl) return;
+    formEl.resetFields();
+    serveArea.value = null;
+    regionId.value = null;
+};
+
+// 表单
+const formRef = ref();
+const dynamicValidateForm = reactive({
+    name: "",
+    conditionRate: "",
+    executeDate: dayjs().format("YYYY-MM-DD"),
+    checkDay: "",
+    usageMode: "",
+    prescriptionList: [
+        {
+            name: "",
+            pesticideFertilizerList: [
+                {
+                    key: 1,
+                    typeName: "",
+                    muUsage: "",
+                    muUsage2: "",
+                    ratio: "",
+                    ratio2: "",
+                    remark: "",
+                },
+            ],
+        },
+    ],
+});
+
+const rules = {
+    name: [
+        {
+            required: true,
+            message: "请输入农事名称",
+            trigger: "blur",
+        },
+    ],
+    conditionRate: [
+        {
+            required: false,
+            message: "请输入触发条件",
+            trigger: "blur",
+        },
+    ],
+    executeDate: [
+        {
+            required: false,
+            message: "请选择执行时间",
+            trigger: "blur",
+        },
+    ],
+    checkDay: [
+        {
+            required: true,
+            message: "请选择复核时间",
+            trigger: "blur",
+        },
+    ],
+};
+
+const formatIndex = (index) => {
+    return String(index + 1).padStart(2, "0");
+};
+
+const addDomain = (parentIndex) => {
+    dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList.unshift({
+        key: Date.now(),
+        muUsage: "",
+        muUsage2: "",
+        ratio: "",
+        ratio2: "",
+        remark: "",
+    });
+};
+
+let pesticideFertilizersOptions = ref([
+    // {
+    //     id: 'null',
+    //     name: "芸苔素内酯 15000倍",
+    //     typeName: "30",
+    //     defaultRatio: null,
+    //     defaultDroneRatio: null,
+    //     unit: 0,
+    //     defaultName: "调节",
+    // },
+    {
+        brand: "天润美满",
+        capacity: 1000,
+        count: null,
+        defaultDroneRatio: null,
+        defaultName: "生物活性酶",
+        defaultRatio: null,
+        ftl: "",
+        id: "185",
+        name: "生物活性酶",
+        pesticideFertilizerCode: "1185",
+        price: 220.0,
+        processUnit: "",
+        typeId: 1,
+        typeName: "调节",
+        unit: "ml",
+        unitUsage: null,
+        unitWaterAmount: null,
+        usageModeList: ["叶面施"],
+    },
+    {
+        brand: "",
+        capacity: null,
+        count: null,
+        defaultDroneRatio: null,
+        defaultName: "矮壮素",
+        defaultRatio: null,
+        ftl: "",
+        id: "145",
+        name: "矮壮素",
+        pesticideFertilizerCode: "1145",
+        price: null,
+        processUnit: "",
+        typeId: 1,
+        typeName: "调节",
+        unit: "ml",
+        unitUsage: null,
+        unitWaterAmount: null,
+        usageModeList: ["叶面施"],
+    },
+]);
+// VE_API.order.pesticideFertilizers().then(({ data }) => {
+//     pesticideFertilizersOptions.value = data;
+// });
+
+const allUsageMode = ref(null);
+const allUsageModeList = ["叶面施", "根部施", "人工农事"];
+
+// 农事名称列表
+const farmWorkIndexNameList = ref([
+        "片区拔节率",
+        "园区花蕾率",
+        "单树花蕾率",
+        "片区雄穗抽出率",
+        "园区花量大率",
+        "单树花量大率",
+        "片区分蘖率",
+    ]);
+function getFarmWorkIndexNameList() {
+    farmWorkIndexNameList.value = [
+        "片区拔节率",
+        "园区花蕾率",
+        "单树花蕾率",
+        "片区雄穗抽出率",
+        "园区花量大率",
+        "单树花量大率",
+        "片区分蘖率",
+    ];
+    // VE_API.farm.fetchFarmWorkIndexNameList().then(({data}) => {
+    //     farmWorkIndexNameList.value = data
+    // })
+}
+// 触发指标列表
+const farmWorkNameList = ref([]);
+function getFarmWorkNameList() {
+    // VE_API.farm.fetchFarmWorkNameList().then(({data}) => {
+    //     farmWorkNameList.value = data
+    // })
+}
+
+// 预警文字信息
+const warningMsg = ref("");
+
+const getWarningMsg = () => {
+    // VE_API.farm.getFarmWorkWarningMsg({farmId: gardenId.value}).then(({data}) => {
+    //     warningMsg.value = data
+    // })
+};
+
+/**
+ * 选择药肥的时候修改订单中药肥pesticideFertilizerId 以外其他数据
+ * @param index
+ */
+const handlePesticideFertilizerChange = (parentIndex, index) => {
+    let obj = pesticideFertilizersOptions.value.filter(
+        (item) =>
+            dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList[index].pesticideFertilizerId ===
+            item.id
+    )[0];
+    dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList[index] = {
+        ...dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList[index],
+        typeName: obj.typeName,
+        unit: obj.unit,
+        defaultRatio: obj.defaultRatio,
+        usageModeList: obj.usageModeList,
+        ratio: obj.defaultRatio,
+        defaultName: obj.defaultName,
+        pesticideFertilizerName: obj.name,
+        pesticideFertilizerCode: obj.pesticideFertilizerCode,
+    };
+};
+
+const removeDomain = (parentIndex, item) => {
+    const index = dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList.indexOf(item);
+    if (index !== -1) {
+        dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList.splice(index, 1);
+    }
+};
+
+const resetItemForm = (parentIndex, index) => {
+    dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList[index] = {
+        typeName: "",
+        muUsage: "",
+        muUsage2: "",
+        ratio: "",
+        ratio2: "",
+        remark: "",
+    };
+};
+
+const submitForm = (formEl) => {
+    if (!formEl) return;
+    formEl.validate((valid) => {
+        if (valid) {
+            submit();
+        } else {
+            console.log("error submit!");
+        }
+    });
+};
+
+const submit = () => {
+    const executeBlueZones = newFarmMap.getSelectedBlueRegion();
+    // if (!executeBlueZones || !executeBlueZones.length) {
+    //     ElMessage({
+    //         message: "请选择执行区域",
+    //         type: "warning",
+    //     });
+    //     return false
+    // }
+
+    console.log("dynamicValidateForm.prescriptionList", dynamicValidateForm.prescriptionList);
+    // 检查药物所有项是否都包含特定的字段
+    // const hasRequiredFields = dynamicValidateForm.prescriptionList.every(item => {
+    //     return item.pesticideFertilizerList.every(domain  => {
+    //         const hasPesticideFertilizerCode  = 'pesticideFertilizerCode' in domain
+    //         const hasMuUsage = 'muUsage' in domain;
+    //         const hasRatio = 'ratio' in domain;
+
+    //         const isMuUsageValid = domain.muUsage !== '';
+    //         const isRatioValid = domain.ratio ? true : false;
+
+    //         return hasPesticideFertilizerCode && hasMuUsage && hasRatio && isMuUsageValid && isRatioValid
+    //     });
+    // })
+    // if (!hasRequiredFields) {
+    //     ElMessage({
+    //         message: "请完善药物信息",
+    //         type: "warning",
+    //     });
+    //     return false
+    // }
+
+    // const flattenedDomains = flattenDomains(dynamicValidateForm.prescription)
+    const data = {
+        ...dynamicValidateForm,
+        // prescription: flattenedDomains,
+        farmWorkType: farmWorkTypeVal.value,
+        farmId: gardenId.value,
+        regionId: regionId.value,
+        executeBlueZones,
+        // weatherWarningMsg: warningMsg.value,
+        // allUsageMode: allUsageMode.value,
+    };
+    console.log("ddddaaaaa", data);
+    // 新增农事
+    VE_API.farm.saveFarmWork(data).then(({ code }) => {
+        if (code === 0) {
+            ElMessage({
+                message: "保存成功",
+                type: "success",
+            });
+            setTimeout(() => {
+                // router.go(-1);
+                router.replace("/expert_album?reload=true");
+            }, 500);
+        }
+    });
+    // const data = {
+    //     orderId: props.prescriptioData.orderId,
+    //     orderStatus: 1,
+    //     pesticideFertilizers: dynamicValidateForm.domains,
+    // };
+    // VE_API.order.confirm(data).then(({ code }) => {
+    //     if (code == 0) {
+    //         console.log('专家下发处方成功');
+    //         eventBus.emit('discover:submitForm')
+    //         window.location.reload()
+    //     }
+    // });
+};
+
+const farmWorkTypeVal = computed(() => {
+    const valueMap = {
+        生长异常: 1,
+        病虫异常: 3,
+        营养农事: 2,
+    };
+
+    if (actionType.value.length === 1) {
+        return valueMap[actionType.value[0]] || null; // 如果只有一个元素,返回对应的值,否则返回 null
+    } else {
+        return 1;
+    }
+});
+
+function flattenDomains(data) {
+    return data.reduce((acc, item) => {
+        return acc.concat(item.pesticideFertilizerList);
+    }, []);
+}
+
+// 地图
+const areaRef = ref(null);
+let newFarmMap = new NewFarmMap();
+
+const serveArea = ref(null);
+// 农场分区列表
+const areaList = ref([]);
+const regionId = ref(null);
+const getAreaList = (callback) => {
+    const data = [
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 2,
+            "isGenerateReport": 1,
+            "name": "分区2",
+            "pointCount": 131,
+            "pointWkt": "POINT (113.6142086995688 23.585836479509055)",
+            "regionCode": "LBY-MR-2",
+            "wkt": "MULTIPOLYGON (((113.61348988377155 23.58617369800422, 113.61395837633405 23.58622555407246, 113.61414076654707 23.58622555407246, 113.61436964832843 23.5862774101407, 113.61478628474084 23.586468741036786, 113.61491681896747 23.58652417337007, 113.61512424307672 23.586449071517652, 113.61491503077356 23.585742756367924, 113.61479880177082 23.585596129050916, 113.61473800497858 23.585451289764112, 113.61438931780664 23.585286780835393, 113.61410858003889 23.585299297865365, 113.61385645239149 23.585249229909184, 113.61378135053907 23.585288569029306, 113.61357571446003 23.585283204611276, 113.61347200232355 23.585342213209604, 113.61338080721704 23.585506721974614, 113.61335934954492 23.585665866485304, 113.61342193444922 23.58616296916816, 113.61348988377155 23.58617369800422)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 9,
+            "isGenerateReport": 1,
+            "name": "分区9",
+            "pointCount": 63,
+            "pointWkt": "POINT (113.61725048541882 23.585262743588892)",
+            "regionCode": "LBY-MR-9",
+            "wkt": "MULTIPOLYGON (((113.61697301904715 23.585749021838886, 113.617320420354 23.585742359348075, 113.61752600578478 23.585708095109652, 113.61772112158744 23.5856785897931, 113.61789720170187 23.58559102562808, 113.61787340709186 23.585330236701996, 113.61793812843106 23.58526932250014, 113.61795526055036 23.585167481569073, 113.61793146594025 23.585022810339957, 113.61790671954574 23.58491525870246, 113.61779345720193 23.58473346788171, 113.61779821612386 23.584601169849783, 113.61771921801855 23.584509798547092, 113.61763260563801 23.584517412822354, 113.61755741467023 23.584640193010298, 113.61736515422085 23.584823887399946, 113.61726902399624 23.58487623554194, 113.61709484745067 23.584864814129187, 113.61707105284067 23.584962847922696, 113.61699586187265 23.585023762124397, 113.61689877986377 23.585071351344393, 113.61675981934107 23.58515796372515, 113.61663132844662 23.585192227963518, 113.61646000725422 23.58524076896813, 113.61634484134152 23.585320718857897, 113.61628392713976 23.585360693802862, 113.6162163504473 23.585397813394497, 113.61601552393823 23.585480618637533, 113.61596127222741 23.585499654325552, 113.61597174185577 23.585538677485918, 113.61598125969975 23.585561520311693, 113.61608690776846 23.585591025628073, 113.61610689524092 23.585611013100582, 113.61619350762157 23.58557960421532, 113.6162886860618 23.58552820785755, 113.61632104673151 23.585492040050294, 113.61638196093314 23.585453968674216, 113.61646095903859 23.585480618637543, 113.6164771393734 23.585505365031985, 113.61649617506146 23.585564375664962, 113.61648760900198 23.58561006131614, 113.61645048941011 23.58567192730245, 113.61649807863034 23.585676686224392, 113.61662466595578 23.585595784550236, 113.61671698904298 23.585495847187836, 113.61676553004737 23.585587218490588, 113.61681787818966 23.585559616742817, 113.61689211737293 23.5854558722431, 113.61695588692798 23.585499654325556, 113.61697301904715 23.585749021838886)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 29,
+            "isGenerateReport": 1,
+            "name": "分区8",
+            "pointCount": 40,
+            "pointWkt": "POINT (113.61587084394066 23.58618878122994)",
+            "regionCode": "LBY-MR-8",
+            "wkt": "MULTIPOLYGON (((113.61516876894466 23.58617727723074, 113.6153952936325 23.58616014511155, 113.61551426668275 23.586215348606817, 113.61564275757719 23.586290539574595, 113.61565798612749 23.58640951262483, 113.61577695917796 23.58637905552401, 113.61584168051715 23.586392380505654, 113.615912112563 23.58637048946448, 113.61613483011318 23.586200120056528, 113.6162547549478 23.586365730542376, 113.61623762282863 23.586448535785365, 113.61615196223237 23.586476137533136, 113.61634435485792 23.586946782901485, 113.61654695275945 23.586932042261843, 113.61651364030526 23.58667220511998, 113.61648127963554 23.586552280285296, 113.61640894402115 23.58641903046899, 113.61636135480092 23.586292443143435, 113.6163308977001 23.586121121951034, 113.61631471736528 23.58605735239606, 113.61618622647107 23.586071629162152, 113.61612911940675 23.58603260600161, 113.61610342122786 23.58595265611185, 113.61601109814079 23.585864140162432, 113.61585310193013 23.585803225960632, 113.61557898802205 23.585730890346124, 113.6153714990225 23.585723276070855, 113.61520493675204 23.585882224066058, 113.61516591359151 23.586056400611785, 113.61516876894466 23.58617727723074)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 12828,
+            "isGenerateReport": 1,
+            "name": "分区5",
+            "pointCount": 45,
+            "pointWkt": "POINT (113.61692837797158 23.58435388968608)",
+            "regionCode": "LBY-MR-5",
+            "wkt": "MULTIPOLYGON (((113.61726902399624 23.584875938109313, 113.61732981922493 23.584649032707855, 113.61741785928217 23.58458954618279, 113.6176284415812 23.584287354634938, 113.61761892373723 23.584146966435544, 113.61762249292879 23.584041080420736, 113.61758442155264 23.584010147427676, 113.61752374529698 23.583939953328095, 113.6174499820059 23.583857861923292, 113.61723702024568 23.5839113997961, 113.61706331959229 23.583947091711153, 113.61689794705232 23.583967317129648, 113.61673019505157 23.58399468093132, 113.61659218631306 23.584025613924393, 113.61641848565968 23.584054167456387, 113.61624716446725 23.584093428562902, 113.61621623147425 23.584286164904498, 113.61622218012678 23.584531249388036, 113.6162186109351 23.58466211974327, 113.61629713314835 23.584684724622857, 113.6166052733487 23.58470970896351, 113.61669926205845 23.584731124112597, 113.61678016373266 23.584778713332653, 113.61680276861217 23.584819164169826, 113.61683846052725 23.58481916416982, 113.61689080866942 23.584775144141148, 113.61697884872665 23.58482035390024, 113.61709484745067 23.584864516696555, 113.61726902399624 23.584875938109313)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 126202,
+            "isGenerateReport": 1,
+            "name": "LBY-MR-SG1",
+            "pointCount": null,
+            "pointWkt": "POINT (113.67786773078139 23.512815571668426)",
+            "regionCode": "LBY-MR-SG1",
+            "wkt": "POLYGON ((113.67643632076339 23.512862037149922, 113.67909107058698 23.51321600379307, 113.67909107058698 23.512673254940246, 113.67661330408497 23.512472673842463, 113.67643632076339 23.512862037149922))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 172047,
+            "isGenerateReport": 1,
+            "name": "认养分区",
+            "pointCount": null,
+            "pointWkt": "POINT (113.61573550741103 23.586606696698798)",
+            "regionCode": "LBY认养分区",
+            "wkt": "MULTIPOLYGON (((113.61553138381385 23.586555391814727, 113.61578836560238 23.586770495089638, 113.61593018147823 23.586692924660838, 113.61571507820327 23.5864349910878, 113.61553138381385 23.586555391814727)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 175094,
+            "isGenerateReport": 1,
+            "name": "12",
+            "pointCount": null,
+            "pointWkt": "POINT (113.61860504330416 23.583859757151316)",
+            "regionCode": "LBY-MR-12",
+            "wkt": "MULTIPOLYGON (((113.61790764544605 23.58437349638575, 113.61810434755591 23.58448136528483, 113.61834039008784 23.58457781277093, 113.61887973458238 23.58461715319288, 113.61901298439875 23.584476289101246, 113.61925029597637 23.584407760624345, 113.61937973865497 23.58437349638575, 113.61932390063691 23.584164103817216, 113.61923506742585 23.5838836446801, 113.61920587937084 23.583660292607078, 113.61927060071025 23.58345216908441, 113.61940004338908 23.5832846550295, 113.6191449651692 23.58325927411221, 113.61896095351813 23.583223740827805, 113.61884166320624 23.58314759807564, 113.61873379430745 23.58305115058954, 113.6185180565094 23.583087952919755, 113.61840257333529 23.58318947658927, 113.61825028783096 23.583260543158076, 113.61815510939073 23.583216126552543, 113.61807262140928 23.583183131360045, 113.61779216227194 23.583299883580025, 113.61792541208831 23.58360953077215, 113.61817668317042 23.583615876001545, 113.61831374012445 23.583843035212283, 113.61829216634476 23.583925523193727, 113.61821348550086 23.5839014113223, 113.6179825191524 23.583770699597665, 113.6178530764738 23.583793542423393, 113.61783784792328 23.583905218459847, 113.617946985868 23.58400166594589, 113.61795713823494 23.584085422973374, 113.61786703597829 23.58419963710162, 113.61785815265716 23.58428847031246, 113.61790764544605 23.58437349638575)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 175095,
+            "isGenerateReport": 1,
+            "name": "13",
+            "pointCount": null,
+            "pointWkt": "POINT (113.61907779775447 23.582774628335315)",
+            "regionCode": "LBY-MR-13",
+            "wkt": "MULTIPOLYGON (((113.6185180565094 23.583087952919755, 113.61873379430756 23.58305115058954, 113.61884166320624 23.58314759807564, 113.61896095351813 23.583223740827805, 113.6191449651692 23.58325927411221, 113.61940004338908 23.5832846550295, 113.61952853428329 23.58303148037845, 113.61974554112703 23.582682175502953, 113.61942574156774 23.58233191884284, 113.61909737594897 23.58227005285653, 113.61872713181651 23.58242614549863, 113.61843207865172 23.58267265765886, 113.61843112686734 23.583051467850964, 113.6185180565094 23.583087952919755)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 175096,
+            "isGenerateReport": 1,
+            "name": "15",
+            "pointCount": null,
+            "pointWkt": "POINT (113.61729343325402 23.581078231145653)",
+            "regionCode": "LBY-MR-15",
+            "wkt": "MULTIPOLYGON (((113.61579634969576 23.580895993441118, 113.61623258421344 23.58139885286704, 113.61657522659812 23.581547965756727, 113.61743341886756 23.5818731587608, 113.61737155288142 23.58216345300349, 113.61798704012836 23.582252286214498, 113.61852479831566 23.58088806190449, 113.61799973058703 23.58035347633188, 113.61769991850042 23.580115530231183, 113.61644039047451 23.580399479244647, 113.61574558786083 23.580797642386187, 113.61579634969576 23.580895993441118)))"
+        }
+    ]
+    areaList.value = data;
+    regionId.value = (data && data.length && data[0].id) || "";
+    changeRegion(regionId.value);
+    callback && callback();
+    // VE_API.region.list({ farmId: gardenId.value }).then(({ data, code }) => {
+    // });
+};
+
+// 切换分区
+const changeRegion = (e) => {
+    checkedArea.value = false;
+    newFarmMap.getBlueRegion({ gardenId: gardenId.value, regionId: e }, () => {
+        // newFarmMap.setBlueRegion([{id: "ws0y1me7h94u"}, {id: "ws0y1me545tg"}])
+        // serveArea.value = "3.72亩"
+    });
+};
+
+// 所选蓝色分区的面积
+const getArea = (val) => {
+    serveArea.value = val.toFixed(2) + "亩";
+};
+
+const checkedArea = ref(false);
+const handleArea = (e) => {
+    newFarmMap.toggleAllArea(e);
+};
+</script>
+
+<style lang="scss" scoped>
+.new-farming-page {
+    height: 100vh;
+    position: relative;
+    overflow: auto;
+    font-size: 14px;
+    ::v-deep {
+        .custom-header {
+            position: fixed;
+            top: 0;
+            padding-bottom: 1px;
+        }
+    }
+    .prescription-content {
+        padding-top: 12px;
+    }
+    .box-wrap {
+        background: #fff;
+        padding: 10px;
+        border-radius: 8px;
+    }
+    .new-farming-content {
+        margin: 41px 0 62px 0;
+        padding: 4px 12px 8px 12px;
+        background: #f2f3f5;
+        width: 100%;
+        box-sizing: border-box;
+        .farm-info {
+            color: rgba(0, 0, 0, 0.6);
+            font-size: 14px;
+            margin-top: 14px;
+            .info-title {
+                display: flex;
+                align-items: center;
+                justify-content: space-between;
+                color: rgba(41, 41, 41, 0.3);
+                .info-more {
+                    display: flex;
+                    align-items: center;
+                }
+            }
+        }
+        .farm-photo {
+            margin-top: 10px;
+            .photo-list {
+                display: flex;
+                align-items: center;
+                width: 100%;
+                overflow: auto;
+                padding-bottom: 10px;
+                .photo-item {
+                    width: 92px;
+                    height: 92px;
+                    border-radius: 8px;
+                    object-fit: cover;
+                }
+                .img-item + .img-item {
+                    margin-left: 12px;
+                }
+            }
+            .list-text {
+                text-align: center;
+                color: rgba(0, 0, 0, 0.5);
+                padding-top: 2px;
+            }
+        }
+        .submit-btn {
+            z-index: 10;
+            position: fixed;
+            bottom: 0px;
+            left: 0;
+            width: 100%;
+            display: flex;
+            align-items: center;
+            padding: 12px;
+            background: #F2F3F5;
+            box-sizing: border-box;
+            box-shadow: 0 4px 4px rgba(0, 0, 0, 0.4);
+            .btn {
+                height: 40px;
+                border-radius: 20px;
+                line-height: 40px;
+                flex: 1;
+                text-align: center;
+                background: #2199F8;
+                color: #FFFFFF;
+                font-size: 16px;
+                &.second {
+                    background: #FFFFFF;
+                    color: #737373;
+                }
+            }
+            .btn + .btn {
+                margin-left: 12px;
+            }
+        }
+    }
+    .card-title {
+        font-size: 16px;
+        font-weight: bold;
+        color: #000;
+        display: flex;
+        align-items: center;
+        // justify-content: space-between;
+        .add-tag {
+            font-size: 12px;
+            color: #2199f8;
+            padding: 4px 8px;
+            background: rgba(33, 153, 248, 0.16);
+            border-radius: 20px;
+            font-weight: normal;
+            height: 25px;
+            line-height: 25px;
+        }
+        .type-tag {
+            margin-left: 5px;
+            font-size: 12px;
+            color: #000000;
+            padding: 0 10px;
+            background: rgba(119, 119, 119, 0.1);
+            border-radius: 20px;
+            font-weight: normal;
+            height: 26px;
+            line-height: 26px;
+        }
+    }
+    .pb-12 {
+        padding-bottom: 12px;
+    }
+    .farm-card {
+        background: #ffffff;
+        border-radius: 8px;
+        padding: 12px 12px 0 12px;
+        width: 100%;
+        box-sizing: border-box;
+        margin-top: 10px;
+        color: rgba(0, 0, 0, 0.4);
+        &.map-content {
+            margin-top: 12px;
+        }
+    }
+
+    .usage-mode-wrap {
+        padding: 0 12px;
+        margin-top: 12px;
+        .info-content {
+            padding-top: 14px;
+            padding-bottom: 1px;
+        }
+
+        .el-form-item--default {
+            margin-bottom: 0;
+        }
+    }
+
+    ::v-deep {
+        .el-input__wrapper {
+            box-shadow: 0 0 0 1px rgba(33, 153, 248, 0.3) inset;
+        }
+        .el-input__inner {
+            color: #2199f8;
+        }
+        .el-input__prefix {
+            color: #2199f8;
+        }
+        .el-select__caret {
+            color: #2199f8;
+        }
+        .el-form-item__label {
+            height: 30px;
+            line-height: 30px;
+            color: rgba(0, 0, 0, 0.4);
+        }
+    }
+    .info-content {
+        padding: 10px 0;
+        position: relative;
+
+        .condition-wrap {
+            display: flex;
+            align-items: center;
+            width: 100%;
+            .symbol {
+                width: 10px;
+                // text-align: center;
+                // padding: 0 4px;
+            }
+        }
+        .item-input {
+            // width: 60%;
+            min-width: 140px;
+            max-width: 240px;
+        }
+        .recheck-text {
+            padding-left: 6px;
+        }
+        .info-item {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            width: 100%;
+        }
+        .info-item + .info-item {
+            margin-top: 12px;
+        }
+
+        .bottom-map {
+            width: 100%;
+            height: 250px;
+            clip-path: inset(0px round 8px);
+        }
+        .check-btn {
+            position: absolute;
+            bottom: 16px;
+            right: 6px;
+            background: rgba(0, 0, 0, 0.6);
+            padding: 0 8px;
+            border-radius: 8px;
+
+            ::v-deep {
+                .el-checkbox {
+                    color: #fff;
+                }
+            }
+        }
+        .area-select {
+            padding-bottom: 12px;
+            .block {
+                width: 12px;
+                display: inline-block;
+            }
+        }
+    }
+
+    ::v-deep {
+        .el-select__wrapper {
+            box-shadow: 0 0 0 1px rgba(33, 153, 248, 0.3) inset;
+            .el-select__placeholder {
+                color: #2199f8;
+                text-align: center;
+            }
+            .el-select__input {
+                color: #2199f8;
+            }
+        }
+        
+        .el-form-item--default {
+            margin-bottom: 8px;
+            &.text-item {
+                margin-bottom: 2px;
+                .el-form-item__content {
+                    line-height: 24px;
+                }
+                .el-form-item__label {
+                    height: 24px;
+                    line-height: 24px;
+                }
+            }
+        }
+    }
+    .sub-title {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        color: rgba(0, 0, 0, 0.6);
+        font-size: 14px;
+        .add-tag {
+            font-size: 12px;
+            color: #2199f8;
+            padding: 0 8px;
+            border: 1px solid #2199F8;
+            border-radius: 5px;
+            font-weight: normal;
+            height: 28px;
+            line-height: 28px;
+        }
+    }
+    .recipe-item {
+        width: 100%;
+        .recipe-form {
+            padding-top: 8px;
+        }
+
+        .box-item {
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            color: rgba(0, 0, 0, 0.4);
+            .r-text {
+                width: 140px;
+                text-align: center;
+            }
+            .form-r {
+                width: 60%;
+                min-width: 140px;
+                max-width: 240px;
+            }
+        }
+        .form-box {
+            border: 1px solid rgba(33, 153, 248, 0.8);
+            border-radius: 8px;
+            padding: 20px 10px;
+            width: 100%;
+            position: relative;
+            // background: rgb(209, 235, 255, 0.3);
+            margin-bottom: 12px;
+            .form-index {
+                position: absolute;
+                left: 0;
+                top: 0;
+                padding: 0 6px;
+                background: #2199F8;
+                border-radius: 4px 0 4px 0;
+                height: 18px;
+                line-height: 18px;
+                font-size: 12px;
+                color: #fff;
+            }
+            .input-box {
+                &.mark-box {
+                    padding: 8px 0 12px 0;
+                }
+
+                ::v-deep {
+                    .el-input__wrapper {
+                        box-shadow: 0 0 0 1px rgba(33, 153, 248, 0.3) inset;
+                    }
+                    .el-input__inner {
+                        color: #2199f8;
+                    }
+                }
+            }
+            .text-center {
+                ::v-deep {
+                    .el-input__inner {
+                        text-align: center;
+                    }
+                }
+            }
+            .action-btn {
+                .btn {
+                    flex: 1;
+                    width: calc(50% - 6px);
+                }
+                .delete-btn {
+                    color: #ff943d;
+                    background: rgba(255, 148, 61, 0.1);
+                    border: 1px solid #ff943d;
+                }
+            }
+            .btn-group {
+                padding-top: 12px;
+            }
+            .sub-item {
+                padding-left: 10px;
+                .has-sub {
+                    display: flex;
+                    flex-direction: column;
+                    align-items: center;
+                    .main-name {
+                        line-height: 20px;
+                    }
+                    .sub-name {
+                        font-size: 10px;
+                        color: rgba(129, 129, 129, 0.5);
+                        line-height: 14px;
+                    }
+                }
+                .colunm-sub {
+                    display: flex;
+                    align-items: center;
+                    .sub-name {
+                        font-size: 10px;
+                        color: rgba(129, 129, 129, 0.5);
+                    }
+                }
+                .r-text {
+                    width: 132px;
+                    text-align: center;
+                    font-size: 14px;
+                    color: #474747;
+                }
+                .price {
+                    ::v-deep {
+                        .el-input__wrapper {
+                            box-shadow: 0 0 0 1px rgba(33, 153, 248, 0.3) inset;
+                        }
+                        .el-input__inner {
+                            color: #2199f8;
+                        }
+                    }
+                }
+            }
+            .form-title {
+                color: #008eff;
+                font-size: 14px;
+                padding-top: 6px;
+            }
+            .box-item + .box-item {
+                margin-top: 8px;
+            }
+        }
+        .form-box + .form-box {
+            margin-top: 8px;
+        }
+        .usageMode-wrap {
+            padding-top: 8px;
+        }
+    }
+}
+</style>

+ 416 - 0
src/views/old_mini/modify_work/newFarmMap.js

@@ -0,0 +1,416 @@
+
+import config from "@/api/config.js"
+import * as KMap from '@/utils/ol-map/KMap';
+import Style from "ol/style/Style";
+import * as util from "@/common/ol_common.js"
+import { newAreaFeature, newAreaPoint, newPolymerFeature, newPoint} from "@/utils/map";
+import { GARDEN_STATUS_ENUM as STATUS_ENUM } from "@/api/enum.js"
+import Icon from "ol/style/Icon";
+import eventBus from '@/api/eventBus';
+import VectorLayer from "ol/layer/Vector.js";
+import {getArea} from 'ol/sphere.js';
+import * as proj from "ol/proj";
+import { register } from "ol/proj/proj4";
+import proj4 from "proj4"
+proj4.defs("EPSG:38572","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs");
+register(proj4);
+
+/**
+ * @description 智能巡园地图层对象
+ */
+class EditNsMap {
+
+    constructor() {
+        let that = this
+        this.vectorStyle = new KMap.VectorStyle()
+        let pointSimpleStyle = this.vectorStyle.getPointSimpleStyle(8, "#999999", "#d5d5d0", "1")
+        this.areaLayer = new KMap.VectorLayer("areaLayer", 999, { style: (f) => that.vectorStyle.getPolygonStyle("#0000001a", "#00000033", 3) })
+        this.subAreaLayer = new KMap.VectorLayer("subAreaLayer", 1000, {
+            style: (f) => {
+                return that.vectorStyle.getPolygonStyle(f.get("fillColor"), f.get("strokeColor"), 2)
+            }
+        })
+        this.afterDayNum = 3
+        this.areaPointLayer = new KMap.VectorLayer("areaPointLayer", 1002, { style: (f) => that.vectorStyle.getPointTextStyle(f.get("name"), "#120046", "#FFFFFF", 2, 13) })
+        this.treeCacheStyle = {}
+        this.treeStyle = (f) => {
+            let key = f.get("imgSrc");
+            if (that.treeCacheStyle[key]) {
+                return that.treeCacheStyle[key]
+            }
+            let style = new Style({
+                image: new Icon({
+                    src: f.get("imgSrc"),
+                    scale: 1,
+                    anchor: [0.5, 1],
+                })
+            });
+            that.treeCacheStyle[key] = style
+            return style
+        }
+        this.treeLayer = new KMap.VectorLayer("statusPointLayer", 999, { style: that.treeStyle })
+        this.treeFeatures = []
+
+        this.curArea = null
+        this.blueRegionLayer = new KMap.VectorLayer("blueRegionLayer", 99, {
+            minZoom: 1,
+            maxZoom: 22,
+            style: function (f) {
+                const selected = f.get('selected');
+                if (selected) {
+                    return that.vectorStyle.getPolygonStyle("rgba(23, 99, 110, 0.43)", "rgba(37, 227, 255, 0.7)", 2)
+                }
+                return that.vectorStyle.getPolygonStyle("rgba(0, 0, 0, 0.5)", "rgba(255, 255, 255, 0.2)", 1)
+            }
+        });
+
+        this.areaVal = 0
+    }
+
+    initMap(location, target) {
+        let level = 18
+        let coordinate = util.wktCastGeom(location).getFirstCoordinate()
+        this.kmap = new KMap.Map(target, level, coordinate[0], coordinate[1], null, 10, 22);
+        let xyz2 = config.base_img_url3 + 'map/lby/{z}/{x}/{y}.png';
+        this.kmap.addXYZLayer(xyz2, { minZoom: 12, maxZoom: 26 });
+        this.kmap.addLayer(this.areaLayer.layer)
+        this.kmap.addLayer(this.subAreaLayer.layer)
+        this.kmap.addLayer(this.treeLayer.layer)
+        this.kmap.addLayer(this.areaPointLayer.layer)
+        this.kmap.addLayer(this.blueRegionLayer.layer)
+
+        this.addMapSingerClick()
+    }
+
+    destroyMap() {
+        // 销毁地图实例
+        if (this.kmap) {
+            this.kmap.destroy()
+        }
+    }
+
+    initArea(data, callback) {
+        let that = this
+        this.areaLayer.refresh()
+        for (let item of data) {
+            that.areaLayer.addFeature(newAreaFeature(item))
+            that.areaPointLayer.addFeature(newAreaPoint(item))
+        }
+        callback && callback()
+    }
+
+    initSubArea(organId, callback) {
+        let that = this
+        this.subAreaLayer.refresh()
+        VE_API.sub_area.list({ organId }).then(({ data, code }) => {
+            for (let item of data) {
+                // item.fillColor = that.handleStatusColor(item.status).fillColor
+                // item.strokeColor = that.handleStatusColor(item.status).strokeColor
+                that.subAreaLayer.addFeature(newPolymerFeature(item))
+            }
+            callback && callback()
+        })
+    }
+
+
+    initTree(organId, callback) {
+        let that = this
+        this.treeLayer.refresh()
+        that.treeFeatures = []
+        VE_API.sub_area.treeList({ farmId: organId }).then(({ data }) => {
+            for (let item of data) {
+                let result = that.handleStatusIcon(item)
+                if (result.hasStatus) {
+                    item.imgSrc = result.imgSrc
+                    let point = newPoint(item);
+                    that.treeLayer.addFeature(point)
+                    that.treeFeatures.push(point)
+                }
+            }
+            callback && callback()
+        })
+    }
+
+    getBlueRegion({gardenId, regionId}, callback) {
+        this.blueRegionLayer.source && this.blueRegionLayer.source.clear()
+        const data = [
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 2,
+            "isGenerateReport": 1,
+            "name": "分区2",
+            "pointCount": 131,
+            "pointWkt": "POINT (113.6142086995688 23.585836479509055)",
+            "regionCode": "LBY-MR-2",
+            "wkt": "MULTIPOLYGON (((113.61348988377155 23.58617369800422, 113.61395837633405 23.58622555407246, 113.61414076654707 23.58622555407246, 113.61436964832843 23.5862774101407, 113.61478628474084 23.586468741036786, 113.61491681896747 23.58652417337007, 113.61512424307672 23.586449071517652, 113.61491503077356 23.585742756367924, 113.61479880177082 23.585596129050916, 113.61473800497858 23.585451289764112, 113.61438931780664 23.585286780835393, 113.61410858003889 23.585299297865365, 113.61385645239149 23.585249229909184, 113.61378135053907 23.585288569029306, 113.61357571446003 23.585283204611276, 113.61347200232355 23.585342213209604, 113.61338080721704 23.585506721974614, 113.61335934954492 23.585665866485304, 113.61342193444922 23.58616296916816, 113.61348988377155 23.58617369800422)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 9,
+            "isGenerateReport": 1,
+            "name": "分区9",
+            "pointCount": 63,
+            "pointWkt": "POINT (113.61725048541882 23.585262743588892)",
+            "regionCode": "LBY-MR-9",
+            "wkt": "MULTIPOLYGON (((113.61697301904715 23.585749021838886, 113.617320420354 23.585742359348075, 113.61752600578478 23.585708095109652, 113.61772112158744 23.5856785897931, 113.61789720170187 23.58559102562808, 113.61787340709186 23.585330236701996, 113.61793812843106 23.58526932250014, 113.61795526055036 23.585167481569073, 113.61793146594025 23.585022810339957, 113.61790671954574 23.58491525870246, 113.61779345720193 23.58473346788171, 113.61779821612386 23.584601169849783, 113.61771921801855 23.584509798547092, 113.61763260563801 23.584517412822354, 113.61755741467023 23.584640193010298, 113.61736515422085 23.584823887399946, 113.61726902399624 23.58487623554194, 113.61709484745067 23.584864814129187, 113.61707105284067 23.584962847922696, 113.61699586187265 23.585023762124397, 113.61689877986377 23.585071351344393, 113.61675981934107 23.58515796372515, 113.61663132844662 23.585192227963518, 113.61646000725422 23.58524076896813, 113.61634484134152 23.585320718857897, 113.61628392713976 23.585360693802862, 113.6162163504473 23.585397813394497, 113.61601552393823 23.585480618637533, 113.61596127222741 23.585499654325552, 113.61597174185577 23.585538677485918, 113.61598125969975 23.585561520311693, 113.61608690776846 23.585591025628073, 113.61610689524092 23.585611013100582, 113.61619350762157 23.58557960421532, 113.6162886860618 23.58552820785755, 113.61632104673151 23.585492040050294, 113.61638196093314 23.585453968674216, 113.61646095903859 23.585480618637543, 113.6164771393734 23.585505365031985, 113.61649617506146 23.585564375664962, 113.61648760900198 23.58561006131614, 113.61645048941011 23.58567192730245, 113.61649807863034 23.585676686224392, 113.61662466595578 23.585595784550236, 113.61671698904298 23.585495847187836, 113.61676553004737 23.585587218490588, 113.61681787818966 23.585559616742817, 113.61689211737293 23.5854558722431, 113.61695588692798 23.585499654325556, 113.61697301904715 23.585749021838886)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 29,
+            "isGenerateReport": 1,
+            "name": "分区8",
+            "pointCount": 40,
+            "pointWkt": "POINT (113.61587084394066 23.58618878122994)",
+            "regionCode": "LBY-MR-8",
+            "wkt": "MULTIPOLYGON (((113.61516876894466 23.58617727723074, 113.6153952936325 23.58616014511155, 113.61551426668275 23.586215348606817, 113.61564275757719 23.586290539574595, 113.61565798612749 23.58640951262483, 113.61577695917796 23.58637905552401, 113.61584168051715 23.586392380505654, 113.615912112563 23.58637048946448, 113.61613483011318 23.586200120056528, 113.6162547549478 23.586365730542376, 113.61623762282863 23.586448535785365, 113.61615196223237 23.586476137533136, 113.61634435485792 23.586946782901485, 113.61654695275945 23.586932042261843, 113.61651364030526 23.58667220511998, 113.61648127963554 23.586552280285296, 113.61640894402115 23.58641903046899, 113.61636135480092 23.586292443143435, 113.6163308977001 23.586121121951034, 113.61631471736528 23.58605735239606, 113.61618622647107 23.586071629162152, 113.61612911940675 23.58603260600161, 113.61610342122786 23.58595265611185, 113.61601109814079 23.585864140162432, 113.61585310193013 23.585803225960632, 113.61557898802205 23.585730890346124, 113.6153714990225 23.585723276070855, 113.61520493675204 23.585882224066058, 113.61516591359151 23.586056400611785, 113.61516876894466 23.58617727723074)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 12828,
+            "isGenerateReport": 1,
+            "name": "分区5",
+            "pointCount": 45,
+            "pointWkt": "POINT (113.61692837797158 23.58435388968608)",
+            "regionCode": "LBY-MR-5",
+            "wkt": "MULTIPOLYGON (((113.61726902399624 23.584875938109313, 113.61732981922493 23.584649032707855, 113.61741785928217 23.58458954618279, 113.6176284415812 23.584287354634938, 113.61761892373723 23.584146966435544, 113.61762249292879 23.584041080420736, 113.61758442155264 23.584010147427676, 113.61752374529698 23.583939953328095, 113.6174499820059 23.583857861923292, 113.61723702024568 23.5839113997961, 113.61706331959229 23.583947091711153, 113.61689794705232 23.583967317129648, 113.61673019505157 23.58399468093132, 113.61659218631306 23.584025613924393, 113.61641848565968 23.584054167456387, 113.61624716446725 23.584093428562902, 113.61621623147425 23.584286164904498, 113.61622218012678 23.584531249388036, 113.6162186109351 23.58466211974327, 113.61629713314835 23.584684724622857, 113.6166052733487 23.58470970896351, 113.61669926205845 23.584731124112597, 113.61678016373266 23.584778713332653, 113.61680276861217 23.584819164169826, 113.61683846052725 23.58481916416982, 113.61689080866942 23.584775144141148, 113.61697884872665 23.58482035390024, 113.61709484745067 23.584864516696555, 113.61726902399624 23.584875938109313)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 172047,
+            "isGenerateReport": 1,
+            "name": "认养分区",
+            "pointCount": null,
+            "pointWkt": "POINT (113.61573550741103 23.586606696698798)",
+            "regionCode": "LBY认养分区",
+            "wkt": "MULTIPOLYGON (((113.61553138381385 23.586555391814727, 113.61578836560238 23.586770495089638, 113.61593018147823 23.586692924660838, 113.61571507820327 23.5864349910878, 113.61553138381385 23.586555391814727)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 175094,
+            "isGenerateReport": 1,
+            "name": "12",
+            "pointCount": null,
+            "pointWkt": "POINT (113.61860504330416 23.583859757151316)",
+            "regionCode": "LBY-MR-12",
+            "wkt": "MULTIPOLYGON (((113.61790764544605 23.58437349638575, 113.61810434755591 23.58448136528483, 113.61834039008784 23.58457781277093, 113.61887973458238 23.58461715319288, 113.61901298439875 23.584476289101246, 113.61925029597637 23.584407760624345, 113.61937973865497 23.58437349638575, 113.61932390063691 23.584164103817216, 113.61923506742585 23.5838836446801, 113.61920587937084 23.583660292607078, 113.61927060071025 23.58345216908441, 113.61940004338908 23.5832846550295, 113.6191449651692 23.58325927411221, 113.61896095351813 23.583223740827805, 113.61884166320624 23.58314759807564, 113.61873379430745 23.58305115058954, 113.6185180565094 23.583087952919755, 113.61840257333529 23.58318947658927, 113.61825028783096 23.583260543158076, 113.61815510939073 23.583216126552543, 113.61807262140928 23.583183131360045, 113.61779216227194 23.583299883580025, 113.61792541208831 23.58360953077215, 113.61817668317042 23.583615876001545, 113.61831374012445 23.583843035212283, 113.61829216634476 23.583925523193727, 113.61821348550086 23.5839014113223, 113.6179825191524 23.583770699597665, 113.6178530764738 23.583793542423393, 113.61783784792328 23.583905218459847, 113.617946985868 23.58400166594589, 113.61795713823494 23.584085422973374, 113.61786703597829 23.58419963710162, 113.61785815265716 23.58428847031246, 113.61790764544605 23.58437349638575)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 175095,
+            "isGenerateReport": 1,
+            "name": "13",
+            "pointCount": null,
+            "pointWkt": "POINT (113.61907779775447 23.582774628335315)",
+            "regionCode": "LBY-MR-13",
+            "wkt": "MULTIPOLYGON (((113.6185180565094 23.583087952919755, 113.61873379430756 23.58305115058954, 113.61884166320624 23.58314759807564, 113.61896095351813 23.583223740827805, 113.6191449651692 23.58325927411221, 113.61940004338908 23.5832846550295, 113.61952853428329 23.58303148037845, 113.61974554112703 23.582682175502953, 113.61942574156774 23.58233191884284, 113.61909737594897 23.58227005285653, 113.61872713181651 23.58242614549863, 113.61843207865172 23.58267265765886, 113.61843112686734 23.583051467850964, 113.6185180565094 23.583087952919755)))"
+        },
+        {
+            "farmCode": "LBY",
+            "farmId": "766",
+            "id": 175096,
+            "isGenerateReport": 1,
+            "name": "15",
+            "pointCount": null,
+            "pointWkt": "POINT (113.61729343325402 23.581078231145653)",
+            "regionCode": "LBY-MR-15",
+            "wkt": "MULTIPOLYGON (((113.61579634969576 23.580895993441118, 113.61623258421344 23.58139885286704, 113.61657522659812 23.581547965756727, 113.61743341886756 23.5818731587608, 113.61737155288142 23.58216345300349, 113.61798704012836 23.582252286214498, 113.61852479831566 23.58088806190449, 113.61799973058703 23.58035347633188, 113.61769991850042 23.580115530231183, 113.61644039047451 23.580399479244647, 113.61574558786083 23.580797642386187, 113.61579634969576 23.580895993441118)))"
+        }
+    ]
+    for (let item of data) {
+        item.id = item.regionCode
+        try {
+            let feature = newAreaFeature(item);
+            this.blueRegionLayer.addFeature(feature)
+        } catch {
+            console.log('error');
+        }
+    }
+    this.kmap.fit(this.blueRegionLayer.source.getExtent(), [0, 0, 0, 0])
+    callback && callback(data.length)
+        // VE_API.farm.blueRegionList({ farmId: gardenId, regionId }).then(({ data, code }) => {
+        // })
+    }
+
+    setBlueRegion(data) {
+        this.blueRegionLayer.source.getFeatures().forEach(feature => {
+            // 检查 feature 的属性中是否有 selected 属性且为 true
+            data.map(item => {
+                if (item.id === feature.get('id')) {
+                    feature.set('selected', true)
+                }
+            })
+        });
+    }
+
+    toggleAllArea(val) {
+        let that = this
+        that.areaVal = 0
+        this.blueRegionLayer.source.getFeatures().forEach(feature => {
+            feature.set('selected', val)
+            if (val === true) {
+                let geom = feature.getGeometry().clone()
+                geom.transform(proj.get("EPSG:4326"), proj.get("EPSG:38572"))
+                let areaItem = getArea(geom)
+                areaItem = (areaItem + areaItem / 2) / 1000;
+                that.areaVal += areaItem
+            }
+            eventBus.emit("editNsMap:areaVal", that.areaVal)
+        });
+
+    }
+
+    // 状态图例
+    handleStatusIcon(obj) {
+        let key = this.afterDayNum == 3 ? "ycStatus" : this.afterDayNum == 5 ? "ycStatus5d" : "ycStatus7d"
+        let hasStatus = false
+        let imgSrc = null
+        if (obj[key] == 3) {
+            hasStatus = true
+            imgSrc = require('@/assets/img/status/status_bcyc.png')
+            return { hasStatus, imgSrc }
+        }
+        if (obj[key] == 2) {
+            hasStatus = true
+            imgSrc = require('@/assets/img/status/status_szyc.png')
+            return { hasStatus, imgSrc }
+        }
+        // if (obj[key] == 1) {
+        //     hasStatus = true
+        //     imgSrc = require('@/assets/status/status_dfh.png')
+        //     return { hasStatus, imgSrc }
+        // }
+        // if (obj[key] == 0) {
+        //     hasStatus = true
+        //     imgSrc = require('@/assets/status/status_xfdw.png')
+        //     return { hasStatus, imgSrc }
+        // }
+        return { hasStatus, imgSrc }
+    }
+
+    // 区级颜色
+    handleStatusColor(key) {
+        let fillColor = '#ffffff00'
+        let strokeColor = '#ffffff'
+        switch (key) {
+            case STATUS_ENUM.DONE:
+                fillColor = 'rgba(95,255,197,0)'
+                strokeColor = '#ffffff'
+                break;
+            case STATUS_ENUM.ABNORMAL_GROWTH:
+                fillColor = 'rgba(255,189,5,0.2)'
+                strokeColor = '#FFE44E'
+                break;
+            case STATUS_ENUM.ABNORMAL_Pest:
+                fillColor = 'rgba(51,11,3,0.52)'
+                strokeColor = '#F55A5A'
+                break;
+            case STATUS_ENUM.PENDING_REVIEW:
+                fillColor = 'rgba(3,40,51,0.2)'
+                strokeColor = '#032833'
+                break;
+            case STATUS_ENUM.REVIEWED:
+                fillColor = 'rgba(95,255,197,0.1)'
+                strokeColor = '#5FFFC5'
+                break;
+            default:
+                break;
+        }
+        return { fillColor, strokeColor }
+    }
+
+    addToggleTreeSelect(listener) {
+        let that = this
+        this.treeLayer.addToggleSelect(function ({ deselected, selected, preventDefault }) {
+            if (selected.length > 0) {
+                listener && listener(selected[0], deselected[0])
+            }
+            preventDefault()
+        }, this.kmap.map, that.treeStyle)
+    }
+
+    addToggleSubAreaSelect(listener) {
+        let that = this
+        this.subAreaLayer.addToggleSelect(function ({ deselected, selected, preventDefault }) {
+            if (selected.length > 0) {
+                that.treeLayer.source.forEachFeature((f) => {
+                    if (f.get("subAreaId") == selected[0].get("id")) {
+                        that.treeLayer.toggleSelect.getFeatures().remove(f)
+                    }
+                })
+                that.treeLayer.source.forEachFeature((f) => {
+                    if (f.get("subAreaId") == selected[0].get("id")) {
+                        that.treeLayer.toggleSelect.getFeatures().push(f)
+                    }
+                })
+            }
+            if (deselected.length > 0) {
+                that.treeLayer.source.forEachFeature((f) => {
+                    if (f.get("subAreaId") == deselected[0].get("id")) {
+                        that.treeLayer.toggleSelect.getFeatures().remove(f)
+                    }
+                })
+            }
+            listener && listener(selected[0], deselected[0])
+            preventDefault()
+        }, this.kmap.map)
+    }
+
+    refreshTree(organId, day, callback) {
+        this.afterDayNum = day
+        this.initTree(organId, callback)
+
+    }
+    fit(geomOrExtent) {
+        this.kmap.fit(geomOrExtent)
+    }
+
+
+    addMapSingerClick() {
+        let that = this
+        this.kmap.on("singleclick", (evt) => {
+            that.kmap.map.forEachFeatureAtPixel(evt.pixel, function (feature, layer) {
+                if (layer instanceof VectorLayer && layer.get("name") === "blueRegionLayer") {
+                    feature.set('selected', feature.get("selected") ? false : true);
+
+                    let geom = feature.getGeometry().clone()
+                    geom.transform(proj.get("EPSG:4326"), proj.get("EPSG:38572"))
+                    let areaItem = getArea(geom)
+                    areaItem = (areaItem + areaItem / 2) / 1000;
+                    if (feature.get('selected') === true) {
+                        that.areaVal += areaItem
+                    } else {
+                        that.areaVal -= areaItem
+                    }
+                    eventBus.emit("editNsMap:areaVal", that.areaVal)
+                }
+            })
+        })
+    }
+
+    getSelectedBlueRegion() {
+        // 用于存储 selected 为 true 的 feature 的 id
+        const selectedFeatureIds = [];
+        // 遍历所有 features
+        this.blueRegionLayer.source.getFeatures().forEach(feature => {
+            // 检查 feature 的属性中是否有 selected 属性且为 true
+            if (feature.get('selected') === true) {
+                // 获取 feature 的 id
+                const id = feature.get('id');
+                // 将 id 添加到数组中
+                selectedFeatureIds.push({ id });
+            }
+        });
+        return selectedFeatureIds;
+    }
+
+
+}
+
+export default EditNsMap