吉安感知网项目-前端
shuishen
2026-02-02 49a51084f3fea6831c82185d2bb5c24295bc5e63
Merge branch 'master' of http://139.196.74.78:10010/r/jagzwxm/ja_web
5 files modified
414 ■■■■ changed files
uniapps/work-wx/src/api/index.js 16 ●●●●● patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/deviceRegistration/add.vue 96 ●●●●● patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/flightApplication/add.vue 151 ●●●● patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/flightApplication/details.vue 74 ●●●● patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/flightApplication/index.vue 77 ●●●● patch | view | raw | blame | history
uniapps/work-wx/src/api/index.js
@@ -61,6 +61,22 @@
    method: 'get'
  })
}
export const takeoffOperationApi = data => {
  return request({
    url: `/webservice/flightPlan/takeoffOperation`,
    method: 'post',
    data,
  })
}
export const flightApprovalApi = data => {
  return request({
    url: `/webservice/flightPlan/flightApproval`,
    method: 'post',
    data,
  })
}
// 航空器注册
export const aircraftInfoSaveApi = data => {
uniapps/work-wx/src/subPackages/deviceRegistration/add.vue
@@ -199,7 +199,6 @@
            <template #right>
                <u-upload
                    @afterRead="afterReadImage"
                    @delete="deletePic"
                    name="6"
                    multiple
                    :maxCount="1"
@@ -231,13 +230,50 @@
            @cancel="showType = false"
        />
        <!-- 飞行器厂商 -->
        <u-picker
        <!-- <u-picker
            :show="showManufacturer"
            :columns="[manufacturerList]"
            keyName="label"
            @confirm="onPickerConfirmManufacturer"
            @cancel="showManufacturer = false"
        />
        /> -->
        <u-popup
            :show="showManufacturer"
            mode="bottom"
            round="20"
            @close="showManufacturer = false"
        >
        <scroll-view scroll-y>
            <view class="select-header">
                <u-search
                    v-model="searchFacturerName"
                    placeholder="请输入飞行器厂商名称关键字"
                    @custom="getManufacturerInfoApi"
                ></u-search>
            </view>
            <view class="select-content">
                <!-- 加载状态 -->
            <view v-if="loadingManufacturer" class="loading-container">
                <u-loading-icon></u-loading-icon>
            </view>
                <u-radio-group
                v-if="!loadingManufacturer"
                    v-model="formParams.spacecraftId"
                    placement="column"
                    @change="radioChange"
                >
                    <u-radio
                        :customStyle="{marginBottom: '8px'}"
                        v-for="(item, index) in manufacturerList"
                        :key="item.id"
                        :label="item.label"
                        :name="item.value"
                    >
                </u-radio>
            </u-radio-group>
            </view>
            </scroll-view>
        </u-popup>
        <u-picker
            :show="showIsModified"
            :columns="[actionsModified]"
@@ -335,6 +371,10 @@
    ],
})
// 搜索飞行器厂商
const searchFacturerName = ref('')
// 是否改装
const actionsModified = ref([
    {
@@ -411,12 +451,17 @@
// 飞行器厂商
const showManufacturer = ref(false);
const manufacturerList = ref([])
const loadingManufacturer = ref(false)
// 选择飞行器厂商
const onPickerConfirmManufacturer = (e) => {
  const selected = e.value[0]
  formParams.value.manufacturer = selected.value
  formParams.value.manufacturerText = selected.label
  showManufacturer.value = false
}
function radioChange(value) {
    formParams.value.manufacturer = value
    formParams.value.manufacturerText = manufacturerList.value.find(item => item.value === value)?.label || ''
}
// 飞行器类型
const showType = ref(false);
@@ -589,10 +634,20 @@
// }
// 获取无人机厂商
function getManufacturerInfoApi() {
    if (searchFacturerName.value === '') {
        uni.showToast({
            title: '请输入搜索内容',
            icon: 'none'
        })
        return
    }
    loadingManufacturer.value = true
    manufacturerInfoApi({
        unitName: searchFacturerName.value,
        current: 1,
        size: 1000,
    }).then(res => {
        loadingManufacturer.value = false
        manufacturerList.value = res.data.data.records.map(item => ({
            ...item,
            label: item.unitName,
@@ -601,7 +656,7 @@
    })
}
onMounted(async () => {
    getManufacturerInfoApi()
    // getManufacturerInfoApi()
    // 动态从外部URL导入xzqhData,确保在使用前已初始化
    // 注意:直接动态导入外部URL可能会有跨域或构建问题,建议检查服务器CORS设置
    const response = await fetch('https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/xzqh/index.json')
@@ -711,5 +766,38 @@
            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: 400rpx;
        text-align: center;
        padding: 20rpx 20rpx;
        .loading-container {
            height: 400rpx;
            display: flex;
            align-items: center;
            justify-content: center;
        }
    }
}
</style>
uniapps/work-wx/src/subPackages/flightApplication/add.vue
@@ -209,14 +209,14 @@
        <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="请选择"
@@ -231,7 +231,7 @@
        <u-form-item
                label="飞手"
                labelWidth="230rpx"
                prop="pilotId"
                prop="pilotText"
                :borderBottom="true"
                ref="item2"
                required
@@ -276,7 +276,7 @@
        <u-form-item
                label="航线"
                labelWidth="230rpx"
                prop="routeId"
                prop="selectedRouteId"
                :borderBottom="true"
                ref="item2"
                required
@@ -350,21 +350,85 @@
    <!-- <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"
@@ -427,13 +491,13 @@
    flightStartTime: '', // 飞行活动开始时间
    flightEndTime: '', // 飞行活动结束时间
    weatherCondition: '', // 气象条件
    spacecraftId: '', // 航天器id
    spacecraftId: [], // 航天器id
    spacecraftText: '', // 航天器文本
    pilotId: '', // 飞手id
    pilotId: [], // 飞手id
    pilotText: '', // 飞手文本
    airspaceId: '', // 空域id
    airspaceText: '', // 空域文本
    routeId: '', // 航线id
    selectedRouteId: '', // 航线id
    routeText: '', // 航线文本
})
const rules = ref({
@@ -491,16 +555,16 @@
    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' }
    ],
})
@@ -550,11 +614,11 @@
const endTime = ref(Date.now()); // 设置默认值为当前时间戳
const onConfirmStartTime = (e) => {
    formParams.value.flightStartTime = dayjs(e.value).format('YYYY-MM-DD HH:mm')
    formParams.value.flightStartTime = dayjs(e.value).format('YYYY-MM-DD HH:mm:ss')
    isShowStartTime.value = false
}
const onConfirmEndTime = (e) => {
    formParams.value.flightEndTime = dayjs(e.value).format('YYYY-MM-DD HH:mm')
    formParams.value.flightEndTime = dayjs(e.value).format('YYYY-MM-DD HH:mm:ss')
    isShowEndTime.value = false
}
@@ -574,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
}
// 获取飞手信息
@@ -594,10 +665,14 @@
        }))
    })
}
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
}
// 获取空域信息
@@ -636,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
}
@@ -866,5 +941,33 @@
            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: 400rpx;
        text-align: center;
        padding: 20rpx 20rpx;
    }
}
</style>
uniapps/work-wx/src/subPackages/flightApplication/details.vue
@@ -136,7 +136,7 @@
                ref="item1"
        >
            <u-input
                    v-model="formParams.weatherCondition"
                    v-model="formParams.weatherCondition"
                    readonly
                    border="none"
            ></u-input>
@@ -185,39 +185,39 @@
        <u-form-item
                label="航线"
                labelWidth="230rpx"
                prop="routeId"
                prop="selectedRouteId"
                :borderBottom="true"
                ref="item2"
        >
            <u-input
                v-model="formParams.routeId"
                v-model="formParams.selectedRouteId"
                readonly
                border="none"
            ></u-input>
        </u-form-item>
        <u-popup :show="applyShow" :round="10" mode="center" @close="close" :closeable="true" :mask-close-able="true">
         <u-form labelPosition="top" :model="formParams" :rules="rules" ref="formRef">
         <u-form labelPosition="top" :model="formParamsTime" :rules="rulesTime" ref="formTimeRef">
            <u-form-item
                label="计划申请起飞时间"
                labelWidth="260rpx"
                prop="actualTakeoffTime"
                prop="takeOffStartTime"
                :borderBottom="true"
                ref="item1"
                @click="isShowStartTime = true"
                required
        >
            <u-input v-model="formParams.actualTakeoffTime" border="none" placeholder="请选择" suffixIcon="calendar"></u-input>
            <u-input v-model="formParamsTime.takeOffStartTime" border="none" placeholder="请选择" suffixIcon="calendar"></u-input>
        </u-form-item>
         <u-form-item
                label="计划申请结束时间"
                labelWidth="260rpx"
                prop="actualLandingTime"
                prop="takeOffEndTime"
                :borderBottom="true"
                ref="item1"
                @click="isShowEndTime = true"
                required
        >
            <u-input v-model="formParams.actualLandingTime" border="none" placeholder="请选择" suffixIcon="calendar"></u-input>
            <u-input v-model="formParamsTime.takeOffEndTime" border="none" placeholder="请选择" suffixIcon="calendar"></u-input>
        </u-form-item>
        <u-datetime-picker
@@ -239,10 +239,10 @@
            @cancel="isShowEndTime = false">
        </u-datetime-picker>
         </u-form>
         <u-button @click="submitApply" color="#1D6FE9">确定</u-button>
         <u-button @click="submitSure" color="#1D6FE9">确定</u-button>
    </u-popup>
    </u-form>
    <u-button v-if="formParams.planApprovalStatus === '99'" @click="submitApply" color="#1D6FE9">申请</u-button>
    <u-button v-if="formParams.planApprovalStatus === '99' && (formParams.planStatus === '0')" @click="submitApply" color="#1D6FE9">申请</u-button>
</view>
</template>
<script setup>
@@ -252,6 +252,7 @@
    aircraftInfoPageInfoOfMyApi,
    pilotInfoPageInfoOfMyApi,
    flightAirspacePageInfoApi,
    flightApprovalApi
 } from '@/api/index'
import { ref, computed, onMounted } from 'vue'
import dayjs from 'dayjs'
@@ -261,8 +262,20 @@
const appStore = useAppStore()
const formRef = ref(null);
const formTimeRef = ref(null);
const formParams = ref({})
const rules = ref({})
const formParamsTime = ref({
    id: '',
    takeOffStartTime: '',
    takeOffEndTime: '',
    planStatus: '1',
})
const rulesTime = ref({
    takeOffStartTime: [{ required: true, message: '请选择计划申请起飞时间', trigger: ['blur'] }],
    takeOffEndTime: [{ required: true, message: '请选择计划申请结束时间', trigger: ['blur'] }],
})
// 任务类型
const actionsFlightTaskType = ref(appStore.getTaskType)
@@ -284,11 +297,11 @@
const endTime = ref(Date.now()); // 设置默认值为当前时间戳
const onConfirmStartTime = (e) => {
    formParams.value.actualTakeoffTime = dayjs(e.value).format('YYYY-MM-DD HH:mm')
    formParamsTime.value.takeOffStartTime = dayjs(e.value).format('YYYY-MM-DD HH:mm:ss')
    isShowStartTime.value = false
}
const onConfirmEndTime = (e) => {
    formParams.value.actualLandingTime = dayjs(e.value).format('YYYY-MM-DD HH:mm')
    formParamsTime.value.takeOffEndTime = dayjs(e.value).format('YYYY-MM-DD HH:mm:ss')
    isShowEndTime.value = false
}
@@ -370,10 +383,28 @@
   applyShow.value = true
}
async function submitSure() {
    // 校验时间
    await formTimeRef.value.validate()
    formParamsTime.value.id = formParams.value.id
    flightApprovalApi(formParamsTime.value).then(res => {
        if (res.data.code === 200) {
            uni.showToast({
                title: '操作成功',
                icon: 'success',
            })
            // 跳转申请列表页
            uni.navigateTo({
                url: '/subPackages/flightApplication/index',
            })
        }
    })
}
function close() {
    // 清空时间
    formParams.value.actualTakeoffTime = ''
    formParams.value.actualLandingTime = ''
    formParamsTime.value.takeOffStartTime = ''
    formParamsTime.value.takeOffEndTime = ''
    applyShow.value = false
}
@@ -381,7 +412,6 @@
     flightPlanDetailsApi(options.id).then(res => {
        // return
        const result = res.data.data
        console.log(result, '7777')
        formParams.value = result
        // 字典
        formParams.value.flightRule = actionsFlightRule.value.find(item => item.dictValue === result.flightRule)?.dictLabel || '无'
@@ -389,11 +419,19 @@
        formParams.value.planType = actionsPlanType.value.find(item => item.dictValue === result.planType)?.dictLabel || '无'
        formParams.value.flightTaskType = actionsFlightTaskType.value.find(item => item.dictValue === result.flightTaskType)?.dictLabel || '无'
        // 数据
        formParams.value.routeId = result?.routeInfo?.name || '无'
        // 航线
        formParams.value.selectedRouteId = result?.routeInfo?.name || '无'
        // 空域
        formParams.value.airspaceId = result?.airspaceInfo?.taskName || '无'
        formParams.value.aircraftId = result?.airspaceInfo?.aircraftInfoList?.map(item => item.name).join(',') || '无'
        // 飞行器
        formParams.value.aircraftId = result?.aircraftInfoList?.map(item => item.name).join(',') || '无'
        // 飞手
        formParams.value.pilotId = result?.operatorInfoList?.map(item => item.name).join(',') || '无'
        // 日期赋值
        formParamsTime.value.takeOffStartTime = dayjs(result.flightStartTime).format('YYYY-MM-DD HH:mm:ss')
        formParamsTime.value.takeOffEndTime = dayjs(result.flightEndTime).format('YYYY-MM-DD HH:mm:ss')
    })
})
onMounted(() => {
uniapps/work-wx/src/subPackages/flightApplication/index.vue
@@ -25,11 +25,9 @@
                            <u-image :src="spSvg" class="icon" width="16" height="16"></u-image>
                            <view class="name">{{approvalRecord.flightPlanName}}</view>
                        </view>
                        <view class="status" :class="getStatusClass(approvalRecord.planApprovalStatus)">
                            {{ approvalRecord.planApprovalStatusLabel || ''}}
                        </view>
                    </view>
                    <view class="txt">计划起飞状态:{{approvalRecord.fly_activity_takeoff_status || ''}}</view>
                     <view class="txt">审批状态: <span :class="getStatusClass(approvalRecord.planApprovalStatus)">{{approvalRecord.planApprovalStatusLabel || ''}}</span></view>
                    <view class="txt">计划起飞状态:<span :class="getPlanStatusClass(approvalRecord.planStatus)">{{approvalRecord.flyActivityTakeoffStatusLabel || ''}}</span></view>
                    <view class="txt">飞行器:{{approvalRecord.spacecraftLabel || '无'}}</view>
                    <view class="txt">飞行任务:{{approvalRecord.flightTaskTypeLabel || ''}}</view>
                    <view class="txt">飞行起飞时间:{{approvalRecord.flightStartTime || ''}}</view>
@@ -81,6 +79,27 @@
    }
}
const getPlanStatusClass = (status) => {
    switch (status) {
        case '0':
            return 'Sred'
        case '1':
            return 'Ssqz'
        case '2':
            return 'Sjz'
        case '3':
            return 'SOrange'
            case '99':
            return 'Syzz'
            case '-1':
            return 'Ssqbh'
            case '-2':
            return 'Sysx'
        default:
            return ''
    }
}
// 获取飞行器信息
const aircraftInfoList = ref([])
async function getAircraftInfo() {
@@ -114,9 +133,12 @@
        const newData = res.data.data.records || []
        // 处理字典数据
        newData.forEach(item => {
            item.spacecraftLabel = aircraftInfoList.value.find(info => info.value === item.spacecraftId)?.label || '无'
            item.spacecraftLabel = aircraftInfoList?.value.filter(info => item.spacecraftId?.split(',').includes(info.value)).map(info => info.label).join('、') || '无'
            // 审批状态
            item.planApprovalStatusLabel = appStore.flyActivityStatus.find(status => status.dictValue === item.planApprovalStatus)?.dictLabel || '无'
            // 计划起飞状态
            item.flyActivityTakeoffStatusLabel = appStore.flyActivityTakeoffStatus.find(status => status.dictValue === item.planStatus)?.dictLabel || '无'
            // 飞行任务
            item.flightTaskTypeLabel = appStore.taskType.find(type => type.dictValue === item.flightTaskType)?.dictLabel || '无'
        })
        // 如果是第一页,直接替换数据;否则追加数据
@@ -275,18 +297,7 @@
            color: #FFFFFF;
            padding: 0 6rpx;
            &.Sorange {
                background: #FF9604;
            }
            &.Sred {
                background: #F8422A;
            }
            &.Sgreen {
                background: #17A836;
            }
            &.Sblue {
                background: #1D6FE9;
            }
        }
    }
@@ -295,6 +306,38 @@
        font-size: 12px;
        color: #86909C;
        margin-bottom: 14rpx;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }
    .Sorange {
        color: #FF9604;
    }
    .Sred {
        color: #F8422A;
    }
    .Sgreen {
        color: #17A836;
    }
    .Sblue {
        color: #1D6FE9;
    }
    .Sjz {
        color: #0088FF;
    }
    .Syzz {
        color: #002BFF;
    }
    .Ssqbh {
        color: #FF383C;
    }
    .Sysx {
        color:#414141;
    }
    .Ssqz {
        color: #FF9500;
    }
}
</style>