huangxw преди 3 седмици
родител
ревизия
86c693083b
променени са 6 файла, в които са добавени 241 реда и са изтрити 19 реда
  1. 7 1
      src/manifest.json
  2. 166 17
      src/plant/base/base-edit/models/base-info/base-info.vue
  3. 6 1
      src/tools/map-draw-area/index.vue
  4. 55 0
      src/utils/common.ts
  5. 7 0
      src/utils/public.ts
  6. 0 0
      stats.html

+ 7 - 1
src/manifest.json

@@ -62,7 +62,13 @@
         },
         "usingComponents" : true,
         "mergeVirtualHostAttributes" : true,
-        "styleIsolation": "shared"
+        "styleIsolation": "shared",
+         "permission" : {
+            "scope.userLocation" : {
+                "desc" : "您的位置信息将用于基地位置选择"
+            }
+        },
+        "requiredPrivateInfos" : [ "chooseAddress", "chooseLocation", "getLocation" ]
     },
     "mp-alipay" : {
         "usingComponents" : true

+ 166 - 17
src/plant/base/base-edit/models/base-info/base-info.vue

@@ -1,10 +1,12 @@
 <template>
     <view class="z-paging-wrap">
-        <z-paging class="" ref="paging" bgColor="#fff" :fixed="false">
+        <z-paging class="" ref="paging" bgColor="#fff" :fixed="false" safe-area-inset-bottom scroll-with-animation>
             <view class="pd-24">
                 <up-alert type="primary" fontSize="24rpx" description="注意:基地不强制与品种挂钩!基地地址以行政村为界,可成片集中或相对集中,跨村则视为另一基地(连片跨村除外)。"></up-alert>
                 <view class="pd-10"></view>
                 <up-form class="p-rtv" labelPosition="top" :model="form" :rules="rules" labelWidth="auto" ref="upFormRef">
+                    <!-- 校验定位:基地类型 -->
+                    <view class="h-1" id="baseTypepppp"></view>
                     <ut-action-sheet v-model="form.baseType" :tabs="pt_base_type" title="选择基地类型">
                         <up-form-item borderBottom label="基地类型" required prop="baseType">
                             <view v-if="form.baseType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_base_type, form.baseType) }}</view>
@@ -24,12 +26,15 @@
                     <up-form-item borderBottom label="基地编号" prop="baseCode">
                         <up-input v-model="form.baseCode" placeholder="请输入基地编号" border="none" clearable></up-input>
                     </up-form-item>
+                    <!-- 校验定位:建设时间 -->
+                    <view class="h-1" id="buildDatepppp"></view>
                     <ut-datetime-picker v-model="form.buildDate" mode="date" dateFields="year">
                         <up-form-item borderBottom label="建设时间" required prop="buildDate">
                             <up-input v-model="form.buildDate" placeholder="请选择基地建设年份" border="none" clearable></up-input>
                         </up-form-item>
                     </ut-datetime-picker>
                     <!-- 选择基地组织方式 -->
+                    <view class="h-1" id="orgTypepppp"></view>
                     <ut-action-sheet v-model="form.orgType" :tabs="pt_org_type" title="选择基地组织方式">
                         <up-form-item borderBottom label="基地组织方式" required prop="orgType">
                             <view v-if="form.orgType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_org_type, form.orgType) }}</view>
@@ -40,8 +45,9 @@
                         </up-form-item>
                     </ut-action-sheet>
                     <!-- 选择基地负责人 -->
-
-                    <up-form-item @click="selectCpyMember"  borderBottom label="基地负责人" required prop="contactId">
+                    <!-- 校验定位:基地负责人 -->
+                    <view class="h-1" id="contactIdpppp"></view>
+                    <up-form-item @click="selectCpyMember" borderBottom label="基地负责人" required prop="contactId">
                         <view v-if="form.contactId" class="f-s-30 c-333 f-w-5 flex1">{{ form.contactName }}</view>
                         <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择基地负责人</view>
                         <template #right>
@@ -49,15 +55,18 @@
                         </template>
                     </up-form-item>
                     <!-- 填写基地联系电话 -->
+                    <view class="h-1" id="contactTelpppp"></view>
                     <up-form-item borderBottom label="基地联系电话" required prop="contactTel">
                         <up-input v-model="form.contactTel" placeholder="请输入基地联系电话" border="none" clearable></up-input>
                     </up-form-item>
                     <!-- 是否Gap基地 -->
+                    <view class="h-1" id="gapFlagpppp"></view>
                     <up-form-item borderBottom label="是否为Gap基地" required prop="gapFlag">
                         <up-radio-group v-model="form.gapFlag">
                             <up-radio :customStyle="{ marginRight: '60rpx' }" v-for="(item, index) in yes_no" :key="index" :label="item.label" :name="item.value"></up-radio>
                         </up-radio-group>
                     </up-form-item>
+                    <view class="h-1" id="adcodepppp"></view>
                     <up-form-item @click="showArea = true" borderBottom label="基地具体地址" required prop="gapInfo.adcode">
                         <!-- <up-input v-model="form.address" placeholder="请选择基地所在省/市/县/镇(乡)" border="none" clearable></up-input> -->
                         <view v-if="form?.gapInfo?.adcode" class="f-s-30 c-333 f-w-5 flex1">{{ form?.gapInfo?.adcodeName }}</view>
@@ -71,7 +80,7 @@
                     </up-form-item>
                     <up-form-item borderBottom>
                         <view class="flex1 ov-hd">
-                              <view class="d-flex a-c mb-10" style="margin-bottom: 5px;">
+                            <view class="d-flex a-c mb-10" style="margin-bottom: 5px">
                                 <view class="f-s-30 c-#666">基地范围</view>
                             </view>
                             <view class="bg-#ccc d-flex ov-hd p-rtv" @click="mapDrawArea">
@@ -84,6 +93,7 @@
                             </view>
                         </view>
                     </up-form-item>
+                    <view class="h-1" id="areaPppp"></view>
                     <up-form-item required borderBottom label="基地面积" prop="gapInfo.area">
                         <up-input v-model="form.gapInfo.area" placeholder="地块绘制后自动带出可修改" border="none" clearable></up-input>
                         <template #right>
@@ -91,28 +101,32 @@
                         </template>
                     </up-form-item>
                     <!-- 基地经纬度 -->
-                    <up-form-item label="基地经纬度" required prop="gapInfo.latitudeLongitude">
+                    <view class="h-1" id="lnglatpppp"></view>
+                    <up-form-item required label="基地经纬度" prop="longitudeLatitude">
                         <view class="flex1 d-flex a-c">
-                            <!-- 基地经度和基地纬度分开 -->
-                            <up-input v-model="form.gapInfo.lat" border="bottom" placeholder="70-150内的经度数值" clearable></up-input>
+                            <up-input v-model="form.gapInfo.lng" border="bottom" placeholder="70-150内的经度数值" clearable></up-input>
                             <view class="pd-5"></view>
-                            <up-input v-model="form.gapInfo.lng" placeholder="4-53内的纬度数值" border="bottom" clearable></up-input>
+                            <up-input v-model="form.gapInfo.lat" placeholder="4-53内的纬度数值" border="bottom" clearable></up-input>
                         </view>
                     </up-form-item>
                 </up-form>
             </view>
             <template #bottom>
-                <up-button text="月落" type="primary"></up-button>
+                <view class="pd-20 d-flex">
+                    <up-button @click="saveBaseInfo" class="mr-30" color="#F19F18" type="primary">暂存</up-button>
+                    <up-button @click="submitForm" type="primary">提交</up-button>
+                </view>
             </template>
         </z-paging>
     </view>
     <ut-picker-area v-model:show="showArea" v-model="form.gapInfo.adcode" @confirm="confirmArea"></ut-picker-area>
 </template>
 <script setup lang="ts" name="base-info">
+import { isOpenSetting } from '@/utils/common';
+import { generateUniqueId } from '@/utils/public';
 import { useClientRequest } from '@/utils/request';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { yes_no, pt_org_type, pt_base_type } = toRefs<any>(proxy?.useDict('yes_no', 'pt_org_type', 'pt_base_type'));
-
 const paging = ref<any>(null);
 const upFormRef = ref<any>(null);
 const showArea = ref(false);
@@ -124,26 +138,133 @@ const form = ref<any>({
         adcode: '',
         adcodeName: '',
         address: '',
+        areaUnit: '亩',
+        area: undefined
+    },
+    randomCode: generateUniqueId(),
+    // 当前位置经纬度
+    longitudeLatitude: {
+        lng: '',
+        lat: '',
     },
+    coordinates: [],
 });
 const rules = reactive({
-    baseType: [{ required: true, message: '请选择基地类型', trigger: 'change' }],
-    baseName: [{ required: true, message: '请输入基地名称', trigger: 'blur' }],
+    baseType: [{ required: true, message: '请选择基地类型', trigger: ['change'] }],
+    baseName: [{ required: true, message: '请输入基地名称', trigger: ['blur', 'change'] }],
+    buildDate: [{ required: true, message: '请选择基地建设年份', trigger: ['change'] }],
+    orgType: [{ required: true, message: '请选择基地组织方式', trigger: ['change'] }],
+    contactId: [{ required: true, message: '请选择基地负责人', trigger: ['change'] }],
+    contactTel: [{ required: true, message: '请输入基地联系电话', trigger: ['blur'] }],
+    gapFlag: [{ required: true, message: '请选择是否为Gap基地', trigger: ['change'] }],
+    'gapInfo.adcode': [{ required: true, message: '请选择基地所在省/市/县/镇(乡)', trigger: ['change'] }],
+    'gapInfo.area': [{ required: true, message: '请填写基地面积', trigger: ['change'] }],
+    longitudeLatitude: [
+        {
+            message: '请填写有效的经纬度(经度70-150,纬度4-53)',
+            validator: (rule: any, value: any) => {
+                const lng = Number(form.value?.gapInfo?.lng);
+                const lat = Number(form.value?.gapInfo?.lat);
+                if (!lng || !lat) return false;
+                if (Number.isNaN(lng) || Number.isNaN(lat)) return false;
+                return lng >= 70 && lng <= 150 && lat >= 4 && lat <= 53;
+            },
+            trigger: ['blur', 'change'],
+        },
+    ],
 });
-const mapDrawArea = () => {
+// saveInfo和submitForm防抖
+// 暂存基地信息
+const saveBaseInfo = async () => {
+    uni.$u.debounce(
+        async () => {
+            // 提交表单
+            uni.showLoading({
+                title: '保存中...',
+            });
+            try {
+                const res = await useClientRequest.post('/plt-api/app/base/temp', form.value);
+                uni.hideLoading();
+                if (!res || res !== 200) return;
+                uni.hideLoading();
+                uni.showToast({
+                    title: '保存成功',
+                    icon: 'success',
+                });
+            } catch (error) {
+                uni.hideLoading();
+            }
+        },
+        500,
+        true
+    );
+};
+const submitForm = async () => {
+    uni.$u.debounce(
+        async () => {
+            try {
+                await upFormRef.value?.validate();
+            } catch (error: any) {
+                console.log(form.value);
+                
+                console.log(error, '++++++++');
+                // 滚动到第一个错误字段
+                const firstErrorField = error && error[0].prop;
+                paging.value?.scrollIntoViewById(firstErrorField, 30, true);
+                return;
+            }
+            // 提交表单
+            uni.showLoading({
+                title: '提交中...',
+            });
+            try {
+                const res = await useClientRequest.post('/plt-api/app/base/add', form.value);
+                uni.hideLoading();
+                uni.showToast({
+                    title: '提交成功',
+                    icon: 'success',
+                });
+                // 返回上一页
+                setTimeout(() => {
+                    uni.navigateBack();
+                }, 1500);
+            } catch (error) {
+                uni.hideLoading();
+            }
+        },
+        500,
+        true
+    );
+};
+
+const mapDrawArea = async () => {
     uni.$on('mapAreaData', (data: any) => {
-        console.log('接收到地图绘制区域数据:', data);
         // 这里可以将 data 赋值给 form 中的相应字段
         form.value.gapInfo.basePic = data.gapInfo.basePic;
-        form.value.gapInfo.area = data.gapInfo.area;
+        form.value.gapInfo.area = String(data.gapInfo.area);
         form.value.gapInfo.areaUnit = data.gapInfo.areaUnit;
         form.value.coordinates = data.coordinates;
-        // 删除监听,防止重复触发
         uni.$off('mapAreaData');
     });
+    if (form.value.gapInfo?.basePic) {
+        // 暂存地图当前数据后跳转
+        await useClientRequest.post('/plt-api/app/gapCertificationInfo/painting', {
+            randomCode: form.value.id || form.value.randomCode,
+            value: JSON.stringify({
+                gapInfo: form.value.gapInfo,
+                coordinates: form.value.coordinates,
+            }),
+        });
+    }
     uni.$u.route({
         type: 'navigateTo',
         url: '/tools/map-draw-area/index',
+        params: {
+            drawId: form.value.id || form.value.randomCode,
+            unit: form.value.gapInfo.areaUnit || '亩',
+            lng: form.value.gapInfo.lng || form.value.longitudeLatitude.lng || '',
+            lat: form.value.gapInfo.lat || form.value.longitudeLatitude.lat || '',
+        },
     });
 };
 
@@ -162,7 +283,35 @@ const selectCpyMember = () => {
 const confirmArea = (area: any) => {
     form.value.gapInfo.adcodeName = area.fullName;
 };
-onLoad(() => {});
+onLoad((optins: any) => {
+    if (optins.id) {
+    } else {
+        getLocationByAddress();
+    }
+});
+// 获取当前经纬度返回地址
+const getLocationByAddress = async () => {
+    const info = await uni.getSystemInfo();
+    let locationEnabled = info.locationEnabled; //判断手机定位服务是否开启
+    let locationAuthorized = info.locationAuthorized; //判断定位服务是否允许微信授权
+    if (locationEnabled == false || locationAuthorized == false) {
+        //手机定位服务(GPS)未授权
+        uni.showModal({
+            title: '提示',
+            content: '请打开定位服务功能',
+            showCancel: false, // 不显示取消按钮
+        });
+        return;
+    }
+
+    const scope = await isOpenSetting('scope.userLocation');
+    if (!scope) return;
+    const location = await uni.getLocation({ type: 'gcj02', isHighAccuracy: true });
+    form.value.longitudeLatitude = {
+        lng: location.longitude,
+        lat: location.latitude,
+    };
+};
 </script>
 <style lang="scss" scoped>
 .z-paging-wrap {

+ 6 - 1
src/tools/map-draw-area/index.vue

@@ -1,13 +1,18 @@
 <template>
     <div>
-        <web-view src="https://dm.yujin.shuziyunyao.com/trainpage/pages/amap-draw/index" @message="messageChanged"></web-view>
+        <web-view :src="webviewurl" @message="messageChanged"></web-view>
     </div>
 </template>
 <script setup lang="ts">
+    const webviewurl = ref('https://dm.yujin.shuziyunyao.com/trainpage/pages/amap-draw/index');
+
     const messageChanged = (e: any) => {
         console.log('message changed', e);
         // 数组最后一项
         const lastItem = e.detail.data[e.detail.data.length - 1];
         uni.$emit('mapAreaData', lastItem);
     };
+    onLoad((options: any) => {
+       webviewurl.value += `?drawId=${options.drawId}&unit=${options.unit}`;
+    });
 </script>

+ 55 - 0
src/utils/common.ts

@@ -303,3 +303,58 @@ export function navigateToWithToken(url: string): void {
 		url: url
 	});
 }
+// 判断开启微信小程序权限功能,如果开启则返回true,否则先引导开启
+export const isOpenSetting = async (scope?: string): Promise<boolean> => {
+    // #ifdef MP-WEIXIN
+    try {
+        if (!scope || typeof scope !== 'string') {
+            return true;
+        }
+
+        const hasAuth = await new Promise<boolean>((resolve) => {
+            uni.getSetting({
+                success: (res) => {
+                    resolve(!!(res.authSetting && (res.authSetting as any)[scope as string]));
+                },
+                fail: () => resolve(false)
+            });
+        });
+        if (hasAuth) return true;
+
+        const authorized = await new Promise<boolean>((resolve) => {
+            uni.authorize({
+                scope,
+                success: () => resolve(true),
+                fail: () => resolve(false)
+            });
+        });
+        if (authorized) return true;
+
+        const goSetting = await new Promise<boolean>((resolve) => {
+            uni.showModal({
+                title: '提示',
+                content: '请打开手机自身定位并且点击右上角三个点,进入设置,允许小程序获取定位,并选择您的位置。',
+                confirmText: '去设置',
+                success: (mRes: UniApp.ShowModalRes) => resolve(!!mRes.confirm),
+                fail: () => resolve(false)
+            });
+        });
+        if (!goSetting) return false;
+
+        const finalAuth = await new Promise<boolean>((resolve) => {
+            uni.openSetting({
+                success: (setRes) => {
+                    resolve(!!(setRes.authSetting && (setRes.authSetting as any)[scope as string]));
+                },
+                fail: () => resolve(false)
+            });
+        });
+        return !!finalAuth;
+    } catch (e) {
+        return false;
+    }
+    // #endif
+
+    // 非微信小程序平台默认返回可用
+    return true;
+}

+ 7 - 0
src/utils/public.ts

@@ -109,3 +109,10 @@ export const makePhoneCall = (phoneNumber: string): void => {
         }
     });
 };
+
+// 生成一个随机id并且唯一
+export function generateUniqueId(): string {
+    const timestamp = Date.now().toString(36); // 将当前时间戳转换为36进制字符串
+    const randomNum = Math.floor(Math.random() * 1e8).toString(36); // 生成一个随机数并转换为36进制字符串
+    return `${timestamp}-${randomNum}`; // 拼接时间戳和随机数,形成唯一ID
+}

Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
stats.html


Някои файлове не бяха показани, защото твърде много файлове са промени