From 89380e6260a75d1d3b94de687ebcc2f50d50659d Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Tue, 03 Feb 2026 15:44:33 +0800
Subject: [PATCH] feat:环境变量配置调整

---
 uniapps/work-wx/src/subPackages/flightApplication/add.vue |  366 +++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 246 insertions(+), 120 deletions(-)

diff --git a/uniapps/work-wx/src/subPackages/flightApplication/add.vue b/uniapps/work-wx/src/subPackages/flightApplication/add.vue
index 02c5d54..9bccfe4 100644
--- a/uniapps/work-wx/src/subPackages/flightApplication/add.vue
+++ b/uniapps/work-wx/src/subPackages/flightApplication/add.vue
@@ -1,9 +1,8 @@
 <template>
 <view class="flightApplication-add">
-    <view class="title">
-        基本信息
-    </view>
+
     <u-form labelPosition="top" :model="formParams" :rules="rules" ref="formRef">
+         <view class="title form-title">基本信息</view>
         <u-form-item
                 label="飞行计划"
                 labelWidth="200rpx"
@@ -12,7 +11,7 @@
                 ref="item1"
                 required
         >
-            <u-input v-model="formParams.flightPlanName" border="none" placeholder="请输入飞行计划名称"></u-input>
+            <u-input v-model="formParams.flightPlanName" border="none" placeholder="请输入"></u-input>
         </u-form-item>
         <u-form-item
                 label="任务类型"
@@ -27,7 +26,7 @@
                 v-model="formParams.flightTaskTypeText"
                 disabled
                 disabledColor="#ffffff"
-                placeholder="请选择任务类型"
+                placeholder="请选择"
                 border="none"
             ></u-input>
             <template #right>
@@ -49,7 +48,7 @@
                 v-model="formParams.flightRuleText"
                 disabled
                 disabledColor="#ffffff"
-                placeholder="请选择飞行规则"
+                placeholder="请选择"
                 border="none"
             ></u-input>
             <template #right>
@@ -71,7 +70,7 @@
                 v-model="formParams.flightModeText"
                 disabled
                 disabledColor="#ffffff"
-                placeholder="请选择飞行方式"
+                placeholder="请选择"
                 border="none"
             ></u-input>
             <template #right>
@@ -102,7 +101,7 @@
         >
             <u-input v-model="formParams.flightEndTime" border="none" placeholder="请选择日期" suffixIcon="calendar"></u-input>
         </u-form-item>
-        
+
         <u-form-item
                 label="计划类型"
                 labelWidth="200rpx"
@@ -116,7 +115,7 @@
                 v-model="formParams.planTypeText"
                 disabled
                 disabledColor="#ffffff"
-                placeholder="请选择计划类型"
+                placeholder="请选择"
                 border="none"
             ></u-input>
             <template #right>
@@ -172,7 +171,13 @@
                 :borderBottom="true"
                 ref="item1"
         >
-            <u-input v-model="formParams.tempAirspaceApprovalText" border="none" readonly placeholder="(建议文件大小100M内,仅支持pdf、jpg、jpeg、png等格式)"></u-input>
+            <template #label>
+                <view class="custom-label">
+                    <text>临时空域批件</text>
+                    <text class="label-tip">(建议文件大小100M内,仅支持pdf、jpg、jpeg、png等格式)</text>
+                </view>
+            </template>
+            <u-input v-model="formParams.tempAirspaceApprovalText" border="none" readonly placeholder="请选择"></u-input>
             <template #right>
                 <u-upload
                     @afterRead="afterRead"
@@ -204,17 +209,17 @@
         <u-form-item
                 label="飞行器"
                 labelWidth="230rpx"
-                prop="aircraftId"
+                prop="spacecraftText"
                 :borderBottom="true"
                 required
                 ref="item2"
                 @click="isShowAircraftInfo = true"
         >
             <u-input
-                v-model="formParams.aircraftText"
+                v-model="formParams.spacecraftText"
                 disabled
                 disabledColor="#ffffff"
-                placeholder="请选择飞行器"
+                placeholder="请选择"
                 border="none"
             ></u-input>
             <template #right>
@@ -226,7 +231,7 @@
         <u-form-item
                 label="飞手"
                 labelWidth="230rpx"
-                prop="pilotId"
+                prop="pilotText"
                 :borderBottom="true"
                 ref="item2"
                 required
@@ -236,7 +241,7 @@
                 v-model="formParams.pilotText"
                 disabled
                 disabledColor="#ffffff"
-                placeholder="请选择飞手"
+                placeholder="请选择"
                 border="none"
             ></u-input>
             <template #right>
@@ -259,7 +264,7 @@
                 v-model="formParams.airspaceText"
                 disabled
                 disabledColor="#ffffff"
-                placeholder="请选择空域"
+                placeholder="请选择"
                 border="none"
             ></u-input>
             <template #right>
@@ -271,7 +276,7 @@
         <u-form-item
                 label="航线"
                 labelWidth="230rpx"
-                prop="routeId"
+                prop="selectedRouteId"
                 :borderBottom="true"
                 ref="item2"
                 required
@@ -281,7 +286,7 @@
                 v-model="formParams.routeText"
                 disabled
                 disabledColor="#ffffff"
-                placeholder="请选择航线"
+                placeholder="请选择"
                 border="none"
             ></u-input>
             <template #right>
@@ -324,38 +329,106 @@
         @confirm="onPickerPlanType"
         @cancel="isShowPlanType = false"
     />
-    <up-datetime-picker
+    <u-datetime-picker
             :show="isShowStartTime"
             v-model="startTime"
             mode="datetime"
+            :min-date="minDate"
+            :formatter="formatter"
             @confirm="onConfirmStartTime"
              @cancel="isShowStartTime = false"
-        ></up-datetime-picker>
-        <up-datetime-picker
+        ></u-datetime-picker>
+        <u-datetime-picker
             :show="isShowEndTime"
             v-model="endTime"
             mode="datetime"
+            :min-date="minDate"
+            :formatter="formatter"
             @confirm="onConfirmEndTime"
             @cancel="isShowEndTime = false"
-        ></up-datetime-picker>
+        ></u-datetime-picker>
     <!-- <u-calendar :show="isShowTimeRange" mode="date" @confirm="onConfirmTimeRange" @close="isShowTimeRange = false" :close-on-click-overlay="true"></u-calendar> -->
     <!-- <u-calendar :show="isShowTimeRange" mode="range" @confirm="onConfirmTimeRange" @close="isShowTimeRange = false" :close-on-click-overlay="true" :allow-same-day="true" :show-time="true" time-format="HH:mm:ss"></u-calendar> -->
     <!-- 飞行器 -->
-     <u-picker
+     <!-- <u-picker
         :show="isShowAircraftInfo"
         :columns="[aircraftInfoList]"
         keyName="label"
         @confirm="onPickerAircraftInfo"
         @cancel="isShowAircraftInfo = false"
-    />
+    /> -->
+    <u-popup
+    :show="isShowAircraftInfo"
+    mode="bottom"
+    round="20"
+    @close="isShowAircraftInfo = false"
+  >
+  <scroll-view scroll-y>
+    <view class="select-header">
+        <view>请选择飞行器</view>
+        <view class="select-header-btn">
+            <view class="cancel-btn" @click="isShowAircraftInfo = false">取消</view>
+            <view @click="onPickerAircraftInfo">确定</view>
+        </view>
+    </view>
+    <view class="select-content">
+          <up-checkbox-group
+            v-model="formParams.spacecraftId"
+            placement="column"
+            @change="checkboxChange"
+        >
+            <up-checkbox
+                :customStyle="{marginBottom: '8px'}"
+                v-for="(item, index) in aircraftInfoList"
+                :key="item.id"
+                :label="item.label"
+                :name="item.value"
+            >
+            </up-checkbox>
+        </up-checkbox-group>
+    </view>
+    </scroll-view>
+  </u-popup>
     <!-- 飞手 -->
-    <u-picker
+    <!-- <u-picker
         :show="isShowPilotInfo"
         :columns="[pilotInfoList]"
         keyName="label"
         @confirm="onPickerPilotInfo"
         @cancel="isShowPilotInfo = false"
-    />
+    /> -->
+    <u-popup
+    :show="isShowPilotInfo"
+    mode="bottom"
+    round="20"
+    @close="isShowPilotInfo = false"
+  >
+  <scroll-view scroll-y>
+    <view class="select-header">
+        <view>请选择飞手</view>
+        <view class="select-header-btn">
+            <view class="cancel-btn" @click="isShowPilotInfo = false">取消</view>
+            <view @click="onPickerPilotInfo">确定</view>
+        </view>
+    </view>
+    <view class="select-content">
+          <up-checkbox-group
+            v-model="formParams.pilotId"
+            placement="column"
+            @change="checkboxPilotChange"
+        >
+            <up-checkbox
+                :customStyle="{marginBottom: '8px'}"
+                v-for="(item, index) in pilotInfoList"
+                :key="item.id"
+                :label="item.label"
+                :name="item.value"
+            >
+            </up-checkbox>
+        </up-checkbox-group>
+    </view>
+    </scroll-view>
+  </u-popup>
     <!-- 空域 -->
     <u-picker
         :show="isShowAirspaceInfo"
@@ -373,7 +446,7 @@
         @cancel="isShowFlightRouteInfo = false"
     />
     </u-form>
-    <u-button @click="submitForm" color="#1D6FE9">飞行申请</u-button>
+    <u-button :disabled="isSubmitDisabled" @click="submitForm" color="#1D6FE9">飞行申请</u-button>
     <!-- 飞任务类型 -->
     <view class="attention">
         注:新增空域/航线/飞手等前往吉安市低空经济服务一体化
@@ -381,9 +454,20 @@
 </view>
 </template>
 <script setup>
-import { flightPlanSaveApi, flightRoutePageInfoApi, aircraftInfoPageInfoOfMyApi, pilotInfoPageInfoOfMyApi, flightAirspacePageInfoApi, uploadFileApi } from '@/api/index'
+import {
+    flightPlanSaveApi,
+    flightRoutePageInfoApi,
+    aircraftInfoPageInfoOfMyApi,
+    pilotInfoPageInfoOfMyApi,
+    droneFlightTaskApi,
+    uploadFileApi
+ } from '@/api/index'
 import { ref, computed, onMounted } from 'vue'
 import dayjs from 'dayjs'
+
+// 获取store中的数据 字典
+import { useAppStore, useUserStore } from "@/store";
+const appStore = useAppStore()
 
 const formRef = ref(null);
 const formParams = ref({
@@ -400,20 +484,20 @@
     planType: '', // 计划类型
     planTypeText: '', // 计划类型文本
     contactPerson: '', // 联系人
-    contactPhon: '', // 联系人电话
+    contactPhone: '', // 联系人电话
     undertaker: '', // 承办人
     undertakerPhone: '', // 承办人电话
     timeRange: '', // 时间范围
     flightStartTime: '', // 飞行活动开始时间
     flightEndTime: '', // 飞行活动结束时间
     weatherCondition: '', // 气象条件
-    spacecraftId: '', // 航天器id
+    spacecraftId: [], // 航天器id
     spacecraftText: '', // 航天器文本
-    pilotId: '', // 飞手id
+    pilotId: [], // 飞手id
     pilotText: '', // 飞手文本
     airspaceId: '', // 空域id
     airspaceText: '', // 空域文本
-    routeId: '', // 航线id
+    selectedRouteId: '', // 航线id
     routeText: '', // 航线文本
 })
 const rules = ref({
@@ -432,13 +516,37 @@
     contactPerson: [
         { required: true, message: '请输入联系人', trigger: 'blur' }
     ],
-    contactPhon: [
+    contactPhone: [
+        // 验证手机号码
+        {
+            validator: (rule, value, callback) => {
+                const reg = /^1[3456789]\d{9}$/
+                if (!reg.test(value)) {
+                    callback(new Error('请输入正确的手机号码'))
+                } else {
+                    callback()
+                }
+            },
+            trigger: 'blur'
+        },
         { required: true, message: '请输入联系人电话', trigger: 'blur' }
     ],
     undertaker: [
         { required: true, message: '请输入承办人', trigger: 'blur' }
     ],
     undertakerPhone: [
+        // 验证手机号码
+        {
+            validator: (rule, value, callback) => {
+                const reg = /^1[3456789]\d{9}$/
+                if (!reg.test(value)) {
+                    callback(new Error('请输入正确的手机号码'))
+                } else {
+                    callback()
+                }
+            },
+            trigger: 'blur'
+        },
         { required: true, message: '请输入承办人联系电话', trigger: 'blur' }
     ],
     startTime: [
@@ -447,47 +555,22 @@
     endTime: [
         { required: true, message: '请选择飞行活动结束时间', trigger: 'change' }
     ],
-    spacecraftId: [
+    spacecraftText: [
         { required: true, message: '请选择飞行器', trigger: 'change' }
     ],
-    pilotId: [
+    pilotText: [
         { required: true, message: '请选择飞手', trigger: 'change' }
     ],
     airspaceId: [
         { required: true, message: '请选择空域', trigger: 'change' }
     ],
-    routeId: [
+    selectedRouteId: [
         { required: true, message: '请选择航线', trigger: 'change' }
     ],
 })
 // 任务类型
 const isShowFlightTaskType = ref(false)
-const actionsFlightTaskType = [
-    {
-        label: '警务',
-        value: '警务',
-    },
-    {
-        label: '文旅',
-        value: '文旅',
-    },
-    {
-        label: '航拍',
-        value: '航拍',
-    },
-    {
-        label: '物流',
-        value: '物流',
-    },
-    {
-        label: '巡检',
-        value: '巡检',
-    },
-    {
-        label: '植保',
-        value: '植保',
-    },
-]
+const actionsFlightTaskType = ref(appStore.getTaskType)
 const onPickerFlightTaskType = (e) => {
   const selected = e.value[0]
   formParams.value.flightTaskType = selected.value
@@ -497,16 +580,7 @@
 
 // 飞行规则
 const isShowFlightRule = ref(false)
-const actionsFlightRule = [
-    {
-        label: '目视餡相飞行规则(VFR)',
-        value: '目视餡相飞行规则(VFR)',
-    },
-    {
-        label: '仪表飞行规则(IFR)',
-        value: '仪表飞行规则(IFR)',
-    },
-]
+const actionsFlightRule = ref(appStore.getFlightRules)
 const onPickerFlightRule = (e) => {
   const selected = e.value[0]
   formParams.value.flightRule = selected.value
@@ -515,16 +589,7 @@
 }
 // 飞行方式
 const isShowFlightMode = ref(false)
-const actionsFlightMode = [
-    {
-        label: '视距内飞行 (VLOS)',
-        value: '视距内飞行 (VLOS)',
-    },
-    {
-        label: '超视距飞行(BVLOS)',
-        value: '超视距飞行(BVLOS)',
-    },
-]
+const actionsFlightMode = ref(appStore.getFlightMode)
 const onPickerFlightMode = (e) => {
   const selected = e.value[0]
   formParams.value.flightMode = selected.value
@@ -533,16 +598,7 @@
 }
 // 计划类型
 const isShowPlanType = ref(false)
-const actionsPlanType = [
-    {
-        label: '一般',
-        value: '0',
-    },
-    {
-        label: '紧急',
-        value: '1',
-    }
-]
+const actionsPlanType = ref(appStore.getFlightPlan)
 const onPickerPlanType = (e) => {
   const selected = e.value[0]
   formParams.value.planType = selected.value
@@ -553,6 +609,7 @@
 const isShowStartTime = ref(false)
 // 是否显示结束时间选择器
 const isShowEndTime = ref(false)
+const minDate = ref(Date.now()); // 设置最小日期为当前时间戳
 const startTime = ref(Date.now()); // 设置默认值为当前时间戳
 const endTime = ref(Date.now()); // 设置默认值为当前时间戳
 
@@ -581,10 +638,17 @@
         }))
     })
 }
-const onPickerAircraftInfo = (e) => {
-  const selected = e.value[0]
-  formParams.value.aircraftId = selected.value
-  formParams.value.aircraftText = selected.label
+// const onPickerAircraftInfo = (e) => {
+//   const selected = e.value[0]
+//   formParams.value.spacecraftId = selected.value
+//   formParams.value.aircraftText = selected.label
+//   isShowAircraftInfo.value = false
+// }
+function checkboxChange(val) {
+    formParams.value.spacecraftId = val.join(',')
+    formParams.value.spacecraftText = aircraftInfoList.value.filter(item => val.includes(item.value)).map(item => item.label).join(',')
+}
+const onPickerAircraftInfo = () => {
   isShowAircraftInfo.value = false
 }
 // 获取飞手信息
@@ -601,22 +665,26 @@
         }))
     })
 }
+function checkboxPilotChange(val) {
+    formParams.value.pilotId = val.join(',')
+    formParams.value.pilotText = pilotInfoList.value.filter(item => val.includes(item.value)).map(item => item.label).join(',')
+}
 const onPickerPilotInfo = (e) => {
-  const selected = e.value[0]
-  formParams.value.pilotId = selected.value
-  formParams.value.pilotText = selected.label
+//   const selected = e.value[0]
+//   formParams.value.pilotId = selected.value
+//   formParams.value.pilotText = selected.label
   isShowPilotInfo.value = false
 }
 // 获取空域信息
 const isShowAirspaceInfo = ref(false)
 const airspaceInfoList = ref([])
 function getAirspaceInfo() {
-    flightAirspacePageInfoApi({
+    droneFlightTaskApi({
         current: 1,
         size: 1000,
     }).then(res => {
         airspaceInfoList.value = res.data.data.records.map(item => ({
-            label: item.airspaceName || '暂无',
+            label: item.taskName || '暂无',
             value: item.id,
         }))
     })
@@ -635,7 +703,6 @@
         current: 1,
         size: 1000,
     }).then(res => {
-        console.log(res.data.data, '0000')
         flightRouteInfoList.value = res.data.data.records.map(item => ({
             label: item.name,
             value: item.id,
@@ -644,7 +711,7 @@
 }
 const onPickerFlightRouteInfo = (e) => {
   const selected = e.value[0]
-  formParams.value.routeId = selected.value
+  formParams.value.selectedRouteId = selected.value
   formParams.value.routeText = selected.label
   isShowFlightRouteInfo.value = false
 }
@@ -654,36 +721,36 @@
     // 获取上传的文件对象
     const file = event.file;
     console.log('上传的文件:', file);
-    
+
     // 显示加载提示
     uni.showLoading({
         title: '上传中...'
     });
-    
+
     // 准备上传参数
     const uploadParams = {
         name: 'file', // 服务器端接收文件的字段名
         file: file, // 传入文件对象
         filePath: file.path || file.url, // 文件路径
     };
-    
+
     // 调用上传文件接口
     uploadFileApi(uploadParams).then(res => {
         uni.hideLoading();
-        
+
         console.log('上传成功结果:', res);
-        
+
         // 根据接口返回的数据结构处理结果
         if (res.data && res.data.code === 200) {
             // 假设接口返回的数据结构是 { url, fileName } 等
             const uploadResult = res.data.data;
-            
+
             // 更新表单数据,将上传结果展示在input内
             formParams.value.tempAirspaceApprovalText = uploadResult.fileName || uploadResult.url || '文件上传成功';
-            
+
             // 可以将完整的上传信息保存到表单中,以便提交时使用
             formParams.value.tempAirspaceApproval = uploadResult.fileUrl || '文件上传成功';
-            
+
             uni.showToast({
                 title: '上传成功',
                 icon: 'success'
@@ -703,12 +770,14 @@
         });
     });
 };
+const isSubmitDisabled = ref(false)
 // 提交表单
 const submitForm = async () => {
   await formRef.value.validate()
-  
+  isSubmitDisabled.value = true
   flightPlanSaveApi(formParams.value).then(res => {
     if (res.data.code === 200) {
+        isSubmitDisabled.value = true
       uni.showToast({
         title: '提交成功',
         icon: 'success',
@@ -725,9 +794,26 @@
         duration: 2000
       })
     }
+  }).finally(() => {
+    isSubmitDisabled.value = false
   })
 }
+
+const formatter = (type, value) => {
+    if (type === 'year') return `${value}年`;
+    if (type === 'month') return `${value}月`;
+    if (type === 'day') return `${value}日`;
+    if (type === 'hour') return `${value}时`;
+    if (type === 'minute') return `${value}分`;
+    return value;
+};
+
 onMounted(() => {
+    // getProTypeApi()
+    // getTaskType()
+    // getFlightMode()
+    // getFlightRules()
+    // getFlightPlan()
     getAircraftInfo()
     getPilotInfo()
     getAirspaceInfo()
@@ -755,20 +841,32 @@
         width: 80%;
         padding: 28rpx;
         border-radius: 8rpx 8rpx 8rpx 8rpx;
-        margin-bottom: 20rpx;
+        // margin-bottom: 20rpx;
     }
+    :deep(.u-toolbar__wrapper__confirm) {
+        color: #1D6FE9;
+    }
+    .custom-label {
+        .label-tip {
+            font-family: Source Han Sans CN, Source Han Sans CN;
+            font-weight: 400;
+            font-size: 18rpx;
+            color: #3A3A3A;
+        }
+    }
+
     .attention {
         font-family: Source Han Sans CN, Source Han Sans CN;
         font-weight: 400;
         font-size: 12px;
         color: #1D6FE9;
-        //  margin-top: 24rpx;
+         margin: 40rpx 0;
         text-align: center;
     }
     .select-wrapper {
         position: relative;
         width: 100%;
-        
+
         .select-icon {
             position: absolute;
             right: 20rpx;
@@ -801,7 +899,7 @@
         border-radius: 8rpx 8rpx 8rpx 8rpx;
     }
     :deep(.u-form-item) {
-        margin-bottom: 40rpx;
+        margin-bottom: 20rpx;
         padding: 16rpx 24rpx 18rpx 24rpx;
         border-radius: 6px 6px 6px 6px;
         background: white;
@@ -814,7 +912,7 @@
             border-radius: 8rpx;
             padding: 0 20rpx;
             background-color: #f5f5f5;
-            
+
             &::placeholder {
                 font-family: Source Han Sans CN, Source Han Sans CN;
                 font-weight: 400;
@@ -822,12 +920,12 @@
                 color: #D2D2D2;
             }
         }
-        
+
         .clickable-input {
             width: 100%;
             cursor: pointer;
         }
-        
+
         :deep(.u-form-item__label) {
             margin-bottom: 20rpx;
             // font-weight: bold;
@@ -837,11 +935,39 @@
             font-size: 30rpx;
             color: #222324;
         }
-        
+
         :deep(.u-form-item__required) {
             color: #FF2600;
             margin-right: 8rpx;
         }
     }
+
+    .uni-scroll-view {
+       display: flex;
+       flex-direction: column;
+    }
+
+    .select-header {
+        display: flex;
+        justify-content: space-between;
+        padding: 20rpx 20rpx;
+        font-size: 32rpx;
+        color: #222324;
+        .select-header-btn {
+            display: flex;
+            font-size: 28rpx;
+            color: #1D6FE9;
+            .cancel-btn {
+                color: #86909C;
+                margin-right: 20rpx;
+            }
+        }
+    }
+
+    .select-content {
+        height: 600rpx;
+        text-align: center;
+        padding: 20rpx 20rpx;
+    }
 }
 </style>

--
Gitblit v1.9.3