| uniapps/work-wx/src/api/index.js | ●●●●● patch | view | raw | blame | history | |
| uniapps/work-wx/src/subPackages/deviceRegistration/add.vue | ●●●●● patch | view | raw | blame | history | |
| uniapps/work-wx/src/subPackages/flightApplication/add.vue | ●●●●● patch | view | raw | blame | history | |
| uniapps/work-wx/src/subPackages/flightApplication/details.vue | ●●●●● patch | view | raw | blame | history | |
| uniapps/work-wx/src/subPackages/flightApplication/index.vue | ●●●●● 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>