Merge branch 'master' of http://139.196.74.78:10010/r/drone/command-center-dashboard
18 files modified
1 files added
| | |
| | | # 航线文件地址 |
| | | VITE_APP_AIRLINE_URL = https://wrj.shuixiongit.com/minio/cloud-bucket |
| | | |
| | | #系统运维 |
| | | VITE_APP_ADMIN_URL = 'https://wrj.shuixiongit.com/manage' |
| | |
| | | VITE_BUILD_COMPRESS = gzip |
| | | # ws地址 |
| | | VITE_APP_WS_API_URL = wss://wrj.shuixiongit.com/drone-wss/api/v1/ws |
| | | # 管理后台地址 |
| | | VITE_APP_ADMIN_URL = ' https://aisky.org.cn/manage' |
| | |
| | | let timeClick = (item,index) => { |
| | | checked.value = item; |
| | | const newDateRange = dateRanges[item]; |
| | | store.commit('setEventTimeType', [checked.value, timeListEnum[index]]); |
| | | model.value = newDateRange; |
| | | emit('change', newDateRange, timeListEnum[index]); |
| | | emit('change', newDateRange, timeListEnum[index],checked.value); |
| | | }; |
| | | onMounted(() => { |
| | | // 如果父组件传入了值,就使用父组件的值 by cpz |
| | |
| | | if (arr.length !== 0) { |
| | | returnObj.childrens = arr |
| | | } |
| | | console.log(returnObj, '111111') |
| | | return returnObj |
| | | }) |
| | | } |
| | | |
| | | // 获取事件聚合 |
| | | function getMapEventCount (params) { |
| | | console.log(5555555) |
| | | return getMapEvents(params).then(res => { |
| | | const resData = res?.data?.data |
| | | if (resData?.data) { |
| | |
| | | eventList = [] |
| | | if (!areaCode) return |
| | | saveParams.area_code = areaCode |
| | | console.log(type, '444') |
| | | const list = type === 'device' ? await getDeviceCount(areaCode) : await getMapEventCount(saveParams) |
| | | const splashedList = type === 'device' |
| | | ? await getDeviceList(areaCode) |
| | |
| | | return |
| | | } |
| | | |
| | | handlerInit() |
| | | |
| | | if (newValue.eventTimeType) { |
| | | saveParams = { area_code: newValue.selectedAreaCode, date_enum: store.state.home.eventTimeParams } |
| | | } |
| | |
| | | |
| | | needFly = true |
| | | if (!viewer) return |
| | | handlerInit() |
| | | |
| | | viewer.scene.postRender.removeEventListener(determineScaling) |
| | | |
| | | initMapData(newValue.selectedAreaCode).then(() => { |
| | |
| | | import { useRouter, useRoute } from 'vue-router'; |
| | | import { Message } from '@element-plus/icons-vue'; |
| | | import { ElMessage } from 'element-plus'; |
| | | import { ELocalStorageKey } from '@/utils/http/enums'; |
| | | |
| | | const router = useRouter(); |
| | | const route = useRoute(); |
| | |
| | | ]); |
| | | |
| | | const handleClick = ({ path, name }) => { |
| | | if (['系统运维'].includes(name)) { |
| | | window.open(import.meta.env.VITE_APP_ADMIN_URL + '?token=' + localStorage.getItem(ELocalStorageKey.Token), '_blank'); |
| | | return; |
| | | } |
| | | if (!['首页', '任务管理'].includes(name)) return ElMessage.warning('正在加急开发中...'); |
| | | // 更新 leftList 的 active 状态 |
| | | leftList.value.forEach(item => { |
| | |
| | | dock.work_osd = info.host |
| | | } |
| | | }, |
| | | setEventTimeType : (state, data) => { |
| | | console.log('33333') |
| | | state.eventTimeType = data[0] |
| | | state.eventTimeParams = data[1] |
| | | setEventTimeType: (state, [timeType, timeParams]) => { |
| | | state.eventTimeType = timeType |
| | | state.eventTimeParams = timeParams |
| | | }, |
| | | setEventTimeRang : (state, time) => { |
| | | state.eventTimeRang = time |
| | |
| | | provide('eventOverviewParams', params) |
| | | |
| | | // 时间变化 |
| | | const timeChange = (value, date_enum) => { |
| | | const timeChange = (value, date_enum, type) => { |
| | | params.value = { |
| | | ...params.value, |
| | | date_enum, |
| | | } |
| | | store.commit('setEventTimeType', [type, date_enum]); |
| | | } |
| | | const goBack = () => { |
| | | store.commit('setIsEventOverviewDetail', false) |
| | |
| | | <el-dialog |
| | | class="inspection-rask-details-dialog ztzf-dialog" |
| | | v-model="isShowDetailsDialog" |
| | | :width="pxToRem(1000)" |
| | | :width="pxToRem(1500)" |
| | | :close-on-click-modal="false" |
| | | :destroy-on-close="true" |
| | | > |
| | |
| | | <el-table |
| | | :data="taskDetailData" |
| | | :row-class-name="tableRowClassName" |
| | | :row-style="{ height: '54px', fontSize: '14px', 'text-align': 'center' }" |
| | | :row-style="{ height: '45px', fontSize: '14px', 'text-align': 'center' }" |
| | | :header-cell-style="{ 'text-align': 'center', height: '36px', fontSize: '14px' }" |
| | | > |
| | | <el-table-column label="序号" type="index" width="60"> |
| | |
| | | </el-table> |
| | | </div> |
| | | <!-- 分页 --> |
| | | <div style="display: flex; justify-content: center"> |
| | | <div style="display: flex; justify-content: center;margin:15px 0;"> |
| | | <el-pagination |
| | | class="ztzf-pagination" |
| | | v-model:current-page="pageParams.current" |
| | |
| | | .tabledata { |
| | | padding: 0 16px; |
| | | overflow: hidden; |
| | | height: 640px; |
| | | // height: 640px; |
| | | overflow-y: scroll !important; |
| | | } |
| | | |
| | |
| | | color: #8cfea7; |
| | | } |
| | | </style> |
| | | <style lang="scss"> |
| | | .inspection-rask-details-dialog { |
| | | width: 1270px; |
| | | height: 856px; |
| | | } |
| | | </style> |
| | | |
| | |
| | | <div class="machine-nest-list"> |
| | | <MachineNestTotal @searchNickName="handleSearch" /> |
| | | <div class="content-wrapper"> |
| | | <div |
| | | <!-- <div |
| | | class="table-list" |
| | | v-if="tableList.length > 0" |
| | | infinite-scroll-distance="6" |
| | | v-infinite-scroll="loadMore" |
| | | :infinite-scroll-disabled="busy" |
| | | infinite-scroll-immediate="true" |
| | | > --> |
| | | <div |
| | | class="table-list" |
| | | v-if="tableList.length > 0" |
| | | > |
| | | <div |
| | | :class="[index % 2 === 1 ? 'table-itemeven' : 'table-item']" |
| | |
| | | // 分页参数 |
| | | const pageParams = ref({ |
| | | current: 1, |
| | | size: 8, |
| | | size: 99, |
| | | total: 0, |
| | | }) |
| | | |
| | |
| | | if (res.data.code !== 0) return |
| | | if (res.data.data.records.length === 0) return (isMore.value = false) |
| | | // pageParams.value.current += 1 |
| | | pageParams.value.size += 8 |
| | | // pageParams.value.size += 8 |
| | | tableList.value = res.data.data.records;// [...tableList.value, ...res.data.data.records] |
| | | busy.value = false |
| | | }) |
| | |
| | | <div class="name">机巢名称</div> |
| | | <div class="status">机巢状态</div> |
| | | </div> |
| | | <div |
| | | <!-- <div |
| | | class="table-body" |
| | | v-if="tableList.length > 0" |
| | | infinite-scroll-distance="6" |
| | | v-infinite-scroll="loadMore" |
| | | :infinite-scroll-disabled="busy" |
| | | infinite-scroll-immediate="true" |
| | | > |
| | | > --> |
| | | <div |
| | | class="table-body" |
| | | v-if="tableList.length > 0"> |
| | | <div |
| | | class="table-item" |
| | | :class="[index % 2 === 1 ? '' : 'table-item-odd']" |
| | |
| | | // 分页参数 |
| | | const pageParams = ref({ |
| | | current: 1, |
| | | size: 5, |
| | | size: 99, |
| | | total: 0, |
| | | }) |
| | | // 机巢列表 |
| | |
| | | if (res.data.code !== 0) return |
| | | if (res.data.data.records.length === 0) return (isMore.value = false) |
| | | // pageParams.value.current += 1 |
| | | pageParams.value.size += 5; |
| | | // pageParams.value.size += 5; |
| | | tableList.value = res.data.data.records;// [...tableList.value, ...res.data.data.records] |
| | | busy.value = false |
| | | }) |
| | | } |
| | | |
| | | // 加载更多数据 |
| | | const loadMore = async () => { |
| | | busy.value = true |
| | | if (!isMore.value) return |
| | | getTableList() |
| | | } |
| | | // const loadMore = async () => { |
| | | // busy.value = true |
| | | // if (!isMore.value) return |
| | | // getTableList() |
| | | // } |
| | | |
| | | // 搜索数据 |
| | | const handleSearch = name => { |
| | | searchText.value = name |
| | | pageParams.value.current = 1 |
| | | pageParams.value.size = 5; |
| | | // pageParams.value.size = 5; |
| | | tableList.value = [] |
| | | isMore.value = true |
| | | getTableList() |
| | |
| | | :load="load" |
| | | :props="props" |
| | | style="width: 240px" |
| | | @change="treeChange" |
| | | @node-click="handleNodeClick" |
| | | /> |
| | | </div> |
| | | </div> |
| | |
| | | const searchBoxRef = ref(null); |
| | | const selectDownRef = ref(null); |
| | | |
| | | function treeChange(value, node) { |
| | | areaValue.value = node.label; |
| | | store.commit('setSelectedAreaCode', value); |
| | | function handleNodeClick(data) { |
| | | areaValue.value = data.name; |
| | | store.commit('setSelectedAreaCode', data.code); |
| | | } |
| | | |
| | | const props = { |
| | |
| | | <div class="deviceevent-container"> |
| | | <div class="machineTableDetailsTitle"> |
| | | <p> |
| | | 相关事件<span>{{ total }}</span |
| | | >件 |
| | | 相关事件 |
| | | <span>{{ total }}</span> |
| | | 件 |
| | | </p> |
| | | </div> |
| | | <div class="deviceevent-table ztzf-table" > |
| | | <el-table :data="list" :row-class-name="tableRowClassName" |
| | | style="width: 100%;" |
| | | :row-style="{ height: '38px', fontSize: '14px', 'text-align': 'center' }" |
| | | :header-cell-style="{ 'text-align': 'center', height: '36px', fontSize: '14px' }"> |
| | | <el-table-column label="序号" type="index" width="60"> |
| | | <div class="deviceevent-table ztzf-table"> |
| | | <el-table |
| | | :data="list" |
| | | :row-class-name="tableRowClassName" |
| | | style="width: 100%" |
| | | :row-style="{ height: '35px', fontSize: '14px', 'text-align': 'center' }" |
| | | :header-cell-style="{ 'text-align': 'center', height: '30px', fontSize: '14px' }" |
| | | > |
| | | <el-table-column label="序号" type="index" width="60"> |
| | | <template #default="{ $index }"> |
| | | {{ ($index + 1).toString().padStart(2, '0') }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="id" label="事件编号" /> |
| | | <el-table-column prop="event_name" label="事件名称" /> |
| | | <el-table-column prop="create_user" label="所属单位 " /> |
| | | <el-table-column show-overflow-tooltip prop="remark" label="事件内容" /> |
| | | <el-table-column show-overflow-tooltip prop="ai_types" label="关联算法" /> |
| | | <el-table-column prop="status" label="事件状态"> |
| | | <template #default="scope"> |
| | | <div class="pending" v-if="scope.row.status === 0">待处理</div> |
| | | <div class="reviewed" v-if="scope.row.status === 2">待审核</div> |
| | | <div class="processing" v-if="scope.row.status === 3">处理中</div> |
| | | <div class="done" v-if="scope.row.status === 4">已完成</div> |
| | | <div class="ended" v-if="scope.row.status === 5">已完结</div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" width="80"> |
| | | <template #default="scope"> |
| | | <div class="ztzf-view" @click="distribution(scope.row)">查看</div> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-table-column prop="id" label="事件编号" /> |
| | | <el-table-column prop="event_name" label="事件名称" /> |
| | | <el-table-column prop="create_user" label="所属单位 " /> |
| | | <el-table-column show-overflow-tooltip prop="remark" label="事件内容" /> |
| | | <el-table-column show-overflow-tooltip prop="ai_types" label="关联算法" /> |
| | | <el-table-column prop="status" label="事件状态"> |
| | | <template #default="scope"> |
| | | <div class="pending" v-if="scope.row.status === 0">待处理</div> |
| | | <div class="reviewed" v-if="scope.row.status === 2">待审核</div> |
| | | <div class="processing" v-if="scope.row.status === 3">处理中</div> |
| | | <div class="done" v-if="scope.row.status === 4">已完成</div> |
| | | <div class="ended" v-if="scope.row.status === 5">已完结</div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" width="80"> |
| | | <template #default="scope"> |
| | | <div class="ztzf-view" @click="distribution(scope.row)">查看</div> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | <el-pagination |
| | | class="ztzf-pagination" |
| | | class="ztzf-pagination" |
| | | background |
| | | |
| | | v-model:current-page="sizeParams.current" |
| | | v-model:page-size="sizeParams.size" |
| | | layout="prev, pager, next, jumper" |
| | |
| | | const resData = res?.data?.data || {} |
| | | list.value = resData.records |
| | | total.value = resData.total |
| | | |
| | | }) |
| | | |
| | | |
| | | |
| | | } |
| | | const pageChange = val => { |
| | | sizeParams.value.current = val |
| | |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | |
| | | // 标题 |
| | | .machineTableDetailsTitle { |
| | | margin: 0 24px; |
| | | margin-bottom: 16px; |
| | | margin-bottom: 10px; |
| | | background: url('/src/assets/images/signMachineNest/machineRight/detailtitle.png') no-repeat center; |
| | | background-size: 100% 100%; |
| | | p { |
| | |
| | | } |
| | | // 表格 |
| | | .deviceevent-table { |
| | | padding: 0 17px; |
| | | |
| | | padding: 0 17px; |
| | | } |
| | | |
| | | // 分页 |
| | | :deep(.el-pagination) { |
| | | display: flex; |
| | | justify-content: center; |
| | | |
| | | } |
| | | :deep(.el-pagination button) { |
| | | background: center center no-repeat none !important; |
| | | color: #8eb8ea !important; |
| | | } |
| | | // 待处理 |
| | | .pending{ |
| | | color: #FF7411; |
| | | .pending { |
| | | color: #ff7411; |
| | | } |
| | | // 待审核 |
| | | .reviewed{ |
| | | color: #8CFEA7; |
| | | .reviewed { |
| | | color: #8cfea7; |
| | | } |
| | | // 处理中 |
| | | .processing{ |
| | | color: #FFC398; |
| | | .processing { |
| | | color: #ffc398; |
| | | } |
| | | // 已完成 |
| | | .done{ |
| | | color: #AFD9FB; |
| | | .done { |
| | | color: #afd9fb; |
| | | } |
| | | // 已完结 |
| | | .ended{ |
| | | color: #11C4FF; |
| | | .ended { |
| | | color: #11c4ff; |
| | | } |
| | | </style> |
| | |
| | | :data="list" |
| | | :row-class-name="tableRowClassName" |
| | | style="width: 100%" |
| | | :row-style="{ height: '38px', fontSize: '14px', 'text-align': 'center' }" |
| | | :header-cell-style="{ 'text-align': 'center', height: '36px', fontSize: '14px' }" |
| | | :row-style="{ height: '35px', fontSize: '14px', 'text-align': 'center' }" |
| | | :header-cell-style="{ 'text-align': 'center', height: '30px', fontSize: '14px' }" |
| | | > |
| | | <el-table-column label="序号" type="index" width="60"> |
| | | <template #default="{ $index }"> |
| | |
| | | // 标题 |
| | | .machineTableDetailsTitle { |
| | | margin: 0 24px; |
| | | margin-bottom: 16px; |
| | | margin-bottom: 10px; |
| | | background: url('/src/assets/images/signMachineNest/machineRight/detailtitle.png') no-repeat center; |
| | | background-size: 100% 100%; |
| | | p { |
| | |
| | | // 表格 |
| | | .devicelob-table { |
| | | padding: 0 17px; |
| | | // height: 280px; |
| | | // overflow: hidden; |
| | | // overflow-y: scroll !important; |
| | | |
| | | } |
| | | // :deep(::-webkit-scrollbar) { |
| | | // width: 0; |
| | | // display: none; |
| | | // background: none !important; |
| | | // } |
| | | |
| | | |
| | | // 分页 |
| | | :deep(.el-pagination) { |
| | |
| | | |
| | | <style lang="scss"> |
| | | .machineTableDetails { |
| | | width: 1270px; |
| | | height: 856px; |
| | | |
| | | .el-pagination { |
| | | text-align: left; |
| | | padding: 20px 20px 0 20px; |
| | | padding: 10px 20px 5px 10px; |
| | | } |
| | | .my-header { |
| | | display: inline-block; |
| | |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 14px; |
| | | margin-bottom: 10px; |
| | | font-size: 14px; |
| | | color: #ffffff; |
| | | .itemBox { |
| | |
| | | margin: 0 24px; |
| | | } |
| | | .machineTableDetailsTitle { |
| | | margin-bottom: 16px; |
| | | margin-bottom: 10px; |
| | | background: url('/src/assets/images/signMachineNest/machineRight/detailtitle.png') no-repeat center; |
| | | background-size: 100% 100%; |
| | | span { |
| | |
| | | <!-- 机巢列表详情 --> |
| | | <!-- 新建任务 --> |
| | | <template> |
| | | <el-dialog |
| | | class="ztzf-dialog" |
| | | modal-class="add-task" |
| | | v-model="isShowAddTask" |
| | | title="新建任务" |
| | | :width="pxToRem(1500)" |
| | | :close-on-click-modal="false" |
| | | :destroy-on-close="true"> |
| | | :destroy-on-close="true" |
| | | > |
| | | <!-- <el-divider content-position="left">新建任务</el-divider> --> |
| | | <div class="task-contain"> |
| | | <div class="left"> |
| | | <div class="search"> |
| | | <div class="item"><span class="required">*</span>任务名称:<el-input v-model="searchForm.name" placeholder="请输入任务名称"></el-input></div> |
| | | <div class="item"><span class="required">*</span>任务日期: |
| | | <div class="item"> |
| | | <el-input class="ztzf-input" v-model="searchForm.name" placeholder="请输入任务/机巢名称"></el-input> |
| | | </div> |
| | | <div class="item"> |
| | | <el-date-picker |
| | | class="ztzf-date-picker" |
| | | v-model="taskData" |
| | | format="YYYY-MM-DD" |
| | | type="daterange" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | value-format="YYYY-MM-DD" |
| | | :disabled-date="disabledDate" |
| | | @change="changeselect" |
| | | /> |
| | | </div> |
| | | <div class="item">任务时间: |
| | | <div class="item"> |
| | | <div class="itemchild">任务时间:</div> |
| | | <el-time-picker |
| | | class="ztzf-date-picker tasktimer" |
| | | v-model="timeSlot" |
| | | placeholder="选择时间" |
| | | placeholder="请选择" |
| | | format="HH:mm" |
| | | value-format="HH:mm"/> |
| | | value-format="HH:mm" |
| | | /> |
| | | </div> |
| | | <div class="item">选择航线: |
| | | <div class="item"> |
| | | <div class="itemchild">选择航线:</div> |
| | | |
| | | <el-select |
| | | class="ztzf-select" |
| | | v-model="searchForm.file_id" |
| | | @change="getWayLineFile" |
| | | placeholder="请选择航线" |
| | | clearable> |
| | | clearable |
| | | > |
| | | <el-option |
| | | v-for="item in routeOptions" |
| | | :key="item.wayline_id" |
| | | :label="item.name" |
| | | :value="item.wayline_id"/> |
| | | </el-select> |
| | | </div> |
| | | <div class="item">关联算法: |
| | | <TaskAlgorithmBusiness :showAlgorithm="true" @algorithmChange="algorithmChange"/> |
| | | </div> |
| | | <div class="item">任务描述:<el-input v-model="searchForm.remark" placeholder="请输入任务名称"></el-input></div> |
| | | :value="item.wayline_id" |
| | | /> |
| | | </el-select> |
| | | </div> |
| | | <div class="item"> |
| | | |
| | | <div class="itemchild">关联算法:</div> |
| | | <TaskAlgorithmBusiness :setWidth="200" :showAlgorithm="true" @algorithmChange="algorithmChange" /> |
| | | </div> |
| | | <div class="item"> |
| | | |
| | | <div class="itemchild">任务描述:</div> |
| | | <el-input class="ztzf-input" v-model="searchForm.remark" placeholder="请输入任务名称"></el-input> |
| | | </div> |
| | | </div> |
| | | <div class="lines"> |
| | | <div class="wayline-type"> |
| | |
| | | <el-radio :value="2" label="智能规划选区"></el-radio> |
| | | </el-radio-group> |
| | | </div> |
| | | <TaskMap class="wayline-map" |
| | | <TaskMap |
| | | class="wayline-map" |
| | | :wayLineFile="wayLineFile" |
| | | :checkedTableData="checkedTableData" |
| | | :waylineTypeTest="waylineType" |
| | | :waylineTypeTest="waylineType" |
| | | @clickPosition="clickSignPosition" |
| | | @saveWayline="savePlanerWayline" |
| | | /> |
| | | </div> |
| | | </div> |
| | | <div class="right"> |
| | | <TaskTable ref="taskTableRef" |
| | | :waylineId="waylineId" |
| | | :waylineType="waylineType" |
| | | <div class="right "> |
| | | <TaskTable |
| | | ref="taskTableRef" |
| | | :waylineId="waylineId" |
| | | :waylineType="waylineType" |
| | | :singlePoint="singlePoint" |
| | | :planarPoints="planarPoints" |
| | | @update:selected="handleSelected" |
| | | @update:selected="handleSelected" |
| | | /> |
| | | <div class="btn"> |
| | | <el-button type="primary" @click="cancel">取消</el-button> |
| | | <el-button type="primary" @click="submitClick">发布</el-button> |
| | | <img @click="cancel" style="margin-right:23px" src="@/assets/images/task/cancel.png" alt=""> |
| | | <img @click="submitClick" src="@/assets/images/task/publish.png" alt=""> |
| | | |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ElMessage } from 'element-plus'; |
| | | import { pxToRem } from '@/utils/rem'; |
| | | import { getWaylineList, createTask } from '@/api/home/task'; |
| | | import TaskAlgorithmBusiness from '../components/TaskAlgorithmBusiness.vue'; |
| | | import TaskMap from './TaskMap.vue'; |
| | | import TaskTable from './TaskTable.vue'; |
| | | import { ElMessage } from 'element-plus' |
| | | import { pxToRem } from '@/utils/rem' |
| | | import { getWaylineList, createTask } from '@/api/home/task' |
| | | import TaskAlgorithmBusiness from '../components/TaskAlgorithmBusiness.vue' |
| | | import TaskMap from './TaskMap.vue' |
| | | import TaskTable from './TaskTable.vue' |
| | | |
| | | const emit = defineEmits(['refresh']); |
| | | const emit = defineEmits(['refresh']) |
| | | |
| | | const rangDate = ref([]); |
| | | const rangDate = ref([]) |
| | | // 航线ID |
| | | const waylineId = ref(''); |
| | | const waylineId = ref('') |
| | | // 航线文件 |
| | | const wayLineFile = ref(''); |
| | | const wayLineFile = ref('') |
| | | // 航线类型 |
| | | const waylineType = ref(3); |
| | | const waylineType = ref(3) |
| | | // 添加子组件引用 |
| | | const taskTableRef = ref(null); |
| | | const taskData = ref(''); |
| | | const timeSlot = ref(''); |
| | | const taskTableRef = ref(null) |
| | | const taskData = ref('') |
| | | const timeSlot = ref('') |
| | | const searchForm = reactive({ |
| | | name: '', |
| | | ai_types: [], |
| | |
| | | longitude: '', |
| | | latitude: '', |
| | | polygon: [], |
| | | }); |
| | | const isShowAddTask = defineModel('show'); |
| | | }) |
| | | const isShowAddTask = defineModel('show') |
| | | |
| | | // 禁用当天之前的日期 |
| | | const disabledDate = (time) => { |
| | | return time.getTime() < Date.now() - 8.64e7; // 86400000 = 24 * 60 * 60 * 1000 |
| | | }; |
| | | const disabledDate = time => { |
| | | return time.getTime() < Date.now() - 8.64e7 // 86400000 = 24 * 60 * 60 * 1000 |
| | | } |
| | | |
| | | // 获取航线列表数据 |
| | | const routeOptions = ref([]); |
| | | const routeOptions = ref([]) |
| | | const getRouteList = async () => { |
| | | const res = await getWaylineList(); |
| | | if (res.data.code === 0) { |
| | | routeOptions.value = res.data.data; |
| | | } |
| | | }; |
| | | const res = await getWaylineList() |
| | | if (res.data.code === 0) { |
| | | routeOptions.value = res.data.data |
| | | } |
| | | } |
| | | // 关联算法 |
| | | const algorithmChange = (val) => { |
| | | searchForm.ai_types = val; |
| | | }; |
| | | const algorithmChange = val => { |
| | | searchForm.ai_types = val |
| | | } |
| | | |
| | | // 切换航线类型 |
| | | const radioChange = (val) => { |
| | | const radioChange = val => { |
| | | // 清空选中航线值 |
| | | searchForm.file_id = ''; |
| | | searchForm.file_id = '' |
| | | // 航线ID也清空 |
| | | waylineId.value = ''; |
| | | wayLineFile.value = ''; |
| | | waylineType.value = val; |
| | | searchForm.type = val; |
| | | waylineId.value = '' |
| | | wayLineFile.value = '' |
| | | waylineType.value = val |
| | | searchForm.type = val |
| | | // 清空列表数据 |
| | | nextTick(() => { |
| | | if (taskTableRef.value) { |
| | | taskTableRef.value.clearTableData(); |
| | | } |
| | | }); |
| | | }; |
| | | if (taskTableRef.value) { |
| | | taskTableRef.value.clearTableData() |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // 获取航线文件 |
| | | const getWayLineFile = async (val) => { |
| | | searchForm.type = 0; |
| | | waylineType.value = 0; |
| | | waylineId.value = val; |
| | | const currentRoute = routeOptions.value.find(item => item.wayline_id === val); |
| | | wayLineFile.value = currentRoute.object_key; |
| | | }; |
| | | const getWayLineFile = async val => { |
| | | searchForm.type = 0 |
| | | waylineType.value = 0 |
| | | waylineId.value = val |
| | | const currentRoute = routeOptions.value.find(item => item.wayline_id === val) |
| | | wayLineFile.value = currentRoute.object_key |
| | | } |
| | | |
| | | // 获取选中机场列表数据,并且发布 |
| | | let checkedTableData = ref([]); |
| | | const handleSelected = (val) => { |
| | | searchForm.dock_sns = val.map(item => item.device_sn); |
| | | checkedTableData.value = val; |
| | | }; |
| | | let checkedTableData = ref([]) |
| | | const handleSelected = val => { |
| | | searchForm.dock_sns = val.map(item => item.device_sn) |
| | | checkedTableData.value = val |
| | | } |
| | | |
| | | // 地图点击事件 表格重新刷新数据 |
| | | let singlePoint = ref({}); |
| | | const clickSignPosition = (val) => { |
| | | singlePoint.value = val; |
| | | searchForm.longitude = val.longitude; |
| | | searchForm.latitude = val.latitude; |
| | | }; |
| | | let singlePoint = ref({}) |
| | | const clickSignPosition = val => { |
| | | singlePoint.value = val |
| | | searchForm.longitude = val.longitude |
| | | searchForm.latitude = val.latitude |
| | | } |
| | | |
| | | // 保存面状航线 |
| | | let planarPoints = ref([]); |
| | | const savePlanerWayline = (val) => { |
| | | planarPoints.value = val; |
| | | const polygonArray = val.map(point => [point.longitude, point.latitude]); |
| | | searchForm.polygon = polygonArray; |
| | | }; |
| | | let planarPoints = ref([]) |
| | | const savePlanerWayline = val => { |
| | | planarPoints.value = val |
| | | const polygonArray = val.map(point => [point.longitude, point.latitude]) |
| | | searchForm.polygon = polygonArray |
| | | } |
| | | |
| | | // 提交 |
| | | const submitClick = () => { |
| | | if (!taskData.value) { |
| | | ElMessage({ |
| | | message: '请选择任务日期', |
| | | type: 'warning' |
| | | }); |
| | | return; |
| | | } |
| | | ElMessage({ |
| | | message: '请选择任务日期', |
| | | type: 'warning', |
| | | }) |
| | | return |
| | | } |
| | | if (!searchForm.name) { |
| | | ElMessage({ |
| | | message: '请输入任务名称', |
| | | type: 'warning' |
| | | }); |
| | | return; |
| | | } |
| | | ElMessage({ |
| | | message: '请输入任务名称', |
| | | type: 'warning', |
| | | }) |
| | | return |
| | | } |
| | | // 检查任务时间 |
| | | if (timeSlot.value) { |
| | | const now = new Date(); |
| | | const today = now.toDateString(); |
| | | const selectedDate = new Date(taskData.value).toDateString(); |
| | | |
| | | if (today === selectedDate) { |
| | | const [hours, minutes] = timeSlot.value.split(':'); |
| | | const selectedTime = new Date(); |
| | | selectedTime.setHours(parseInt(hours), parseInt(minutes)); |
| | | |
| | | if (selectedTime < now) { |
| | | ElMessage({ |
| | | message: '任务时间不能小于当前时间', |
| | | type: 'warning' |
| | | }); |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | if (timeSlot.value) { |
| | | const now = new Date() |
| | | const today = now.toDateString() |
| | | const selectedDate = new Date(taskData.value).toDateString() |
| | | |
| | | if (today === selectedDate) { |
| | | const [hours, minutes] = timeSlot.value.split(':') |
| | | const selectedTime = new Date() |
| | | selectedTime.setHours(parseInt(hours), parseInt(minutes)) |
| | | |
| | | if (selectedTime < now) { |
| | | ElMessage({ |
| | | message: '任务时间不能小于当前时间', |
| | | type: 'warning', |
| | | }) |
| | | return |
| | | } |
| | | } |
| | | } |
| | | if (searchForm.dock_sns.length === 0) { |
| | | ElMessage({ |
| | | message: '请选择机场', |
| | | type: 'warning' |
| | | }); |
| | | return; |
| | | type: 'warning', |
| | | }) |
| | | return |
| | | } |
| | | searchForm.begin_time = `${taskData.value} 00:00:00`; |
| | | searchForm.end_time = `${taskData.value} 23:59:59`; |
| | | searchForm.execute_time_arr = timeSlot.value ? [timeSlot.value] : []; |
| | | createTask(searchForm).then((res) => { |
| | | searchForm.begin_time = `${taskData.value} 00:00:00` |
| | | searchForm.end_time = `${taskData.value} 23:59:59` |
| | | searchForm.execute_time_arr = timeSlot.value ? [timeSlot.value] : [] |
| | | createTask(searchForm).then(res => { |
| | | if (res.data.code === 0) { |
| | | ElMessage.success('任务创建成功'); |
| | | ElMessage.success('任务创建成功') |
| | | // 关闭当前窗口,刷新任务管理列表 |
| | | isShowAddTask.value = false; |
| | | isShowAddTask.value = false |
| | | // 清除数据 |
| | | cancel(); |
| | | emit('refresh'); |
| | | cancel() |
| | | emit('refresh') |
| | | } |
| | | }); |
| | | }; |
| | | }) |
| | | } |
| | | const cancel = () => { |
| | | isShowAddTask.value = false; |
| | | isShowAddTask.value = false |
| | | // 清除搜索数据 |
| | | searchForm.name = ''; |
| | | searchForm.ai_types = []; |
| | | searchForm.file_id = ''; |
| | | searchForm.begin_time = ''; |
| | | searchForm.end_time = ''; |
| | | timeSlot.value = ''; |
| | | searchForm.remark = ''; |
| | | searchForm.dock_sns = []; |
| | | rangDate.value = []; |
| | | waylineId.value = ''; |
| | | wayLineFile.value = ''; |
| | | taskData.value = ''; |
| | | }; |
| | | searchForm.name = '' |
| | | searchForm.ai_types = [] |
| | | searchForm.file_id = '' |
| | | searchForm.begin_time = '' |
| | | searchForm.end_time = '' |
| | | timeSlot.value = '' |
| | | searchForm.remark = '' |
| | | searchForm.dock_sns = [] |
| | | rangDate.value = [] |
| | | waylineId.value = '' |
| | | wayLineFile.value = '' |
| | | taskData.value = '' |
| | | } |
| | | |
| | | onMounted(() => { |
| | | getRouteList(); |
| | | getRouteList() |
| | | }) |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | .add-task{ |
| | | .add-task { |
| | | .el-pagination { |
| | | text-align: left; |
| | | padding: 20px; |
| | |
| | | <style lang="scss" scoped> |
| | | .task-contain { |
| | | display: flex; |
| | | padding: 20px 32px 32px 27px; |
| | | .left { |
| | | width: 68%; |
| | | margin-right: 35px; |
| | | .search { |
| | | display: grid; |
| | | grid-template-columns: repeat(3, 1fr); |
| | | grid-template-rows: repeat(2, 1fr); |
| | | gap: 30px; // 增加间距使布局更合理 |
| | | margin-bottom: 8px; // 添加底部间距 |
| | | grid-template-columns: repeat(3, 1fr); |
| | | grid-template-rows: repeat(2, 1fr); |
| | | gap: 30px; // 增加间距使布局更合理 |
| | | margin-bottom: 8px; // 添加底部间距 |
| | | .item { |
| | | position: relative; |
| | | display: flex; |
| | | align-items: center; |
| | | :deep(.el-input), |
| | | :deep(.el-select), |
| | | :deep(.el-date-picker), |
| | | :deep(.el-time-picker) { |
| | | width: 240px; |
| | | // margin-left: 10px; |
| | | } |
| | | :deep(.el-date-editor.el-input__wrapper) { |
| | | width: 200px; // 调整日期选择器宽度 |
| | | } |
| | | .required { |
| | | color: #f56c6c; |
| | | margin-left: 4px; |
| | | position: absolute; |
| | | left: -10px; |
| | | top: 8px; |
| | | display: flex; |
| | | align-items: center; |
| | | font-size: 16px; |
| | | color: #ffffff; |
| | | .itemchild { |
| | | width: 68px; |
| | | white-space: nowrap; |
| | | margin-right: 5px; |
| | | } |
| | | } |
| | | :deep(.el-date-editor.el-input__wrapper) { |
| | | width: 200px; // 调整日期选择器宽度 |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | .right { |
| | | width: 32%; |
| | | display: flex; |
| | | flex-direction: column; |
| | | justify-content: space-between; |
| | | |
| | | .btn { |
| | | margin-top: 20px; |
| | | text-align: center; |
| | | |
| | | .el-button { |
| | | margin: 0 10px; |
| | | } |
| | | } |
| | | flex-direction: column; |
| | | justify-content: space-between; |
| | | |
| | | .btn { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | img { |
| | | width: 137px; |
| | | height: 32px; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | } |
| | | } |
| | | :deep(.tasktimer .el-input__wrapper) { |
| | | background: none !important; |
| | | color: #8ac3fd !important; |
| | | |
| | | } |
| | | :deep(.el-input__inner) { |
| | | color: #8ac3fd !important; |
| | | &::placeholder { |
| | | color: #8ac3fd !important; |
| | | } |
| | | } |
| | | :deep(.el-radio__inner){ |
| | | background: none !important; |
| | | border: 1px solid #1B5D9A !important; |
| | | } |
| | | :deep(.el-radio__label){ |
| | | color: #fff !important; |
| | | } |
| | | :deep(.el-radio__inner:after ){ |
| | | background: #65B5FF !important; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | import { getCenterPoint } from '@/utils/cesium/mapUtil' |
| | | import { getWaylineByArea } from '@/api/home/task'; |
| | | import { useStore } from 'vuex'; |
| | | |
| | | import { addBlueFilter } from '@/utils/cesium/common' |
| | | const store = useStore(); |
| | | const userAreaPosition = computed(() => store.state.home.userAreaPosition); |
| | | |
| | |
| | | fullscreenButton: false, |
| | | // sceneMode: Cesium.SceneMode.COLUMBUS_VIEW, |
| | | }) |
| | | viewer.imageryLayers.addImageryProvider(imageryProvider_ammapSL) |
| | | const gdLayer = viewer.imageryLayers.addImageryProvider(imageryProvider_ammapSL) |
| | | const options = { |
| | | bInvertColor: true, |
| | | bFilterColor: true, |
| | | filterColor: '#4e70a6' |
| | | } |
| | | // 添加蓝色滤镜 |
| | | addBlueFilter(options,viewer,gdLayer) |
| | | viewer.scene.morphTo2D(0); |
| | | //设置默认点 |
| | | const { longitude = 115.763819, latitude = 28.787374, height = 10 } = userAreaPosition.value || {}; |
| | |
| | | <template> |
| | | <div class="table-container"> |
| | | <el-table :data="tableData" style="width: 100%" height="400" |
| | | @selection-change="handleSelectionChange" |
| | | @select="handleSelect"> |
| | | <el-table-column type="selection" width="55" :selectable="checkSelectable" /> |
| | | <el-table-column type="index" label="序号" width="60" /> |
| | | <el-table-column prop="nickname" label="机巢名称" /> |
| | | <el-table-column prop="estimated_arrival_time" label="预计到达时间" /> |
| | | <el-table-column prop="exe_distance" label="执行里程" /> |
| | | </el-table> |
| | | <div class="pagination"> |
| | | <el-pagination |
| | | v-model:current-page="pagingParams.page" |
| | | v-model:page-size="pagingParams.size" |
| | | :page-sizes="[10, 20, 30]" |
| | | layout="total, sizes, prev, pager, next" |
| | | :total="total" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handleCurrentChange" |
| | | /> |
| | | </div> |
| | | </div> |
| | | <div class="table-container ztzf-table"> |
| | | <div class="taskTableTitle"><span>可飞行机巢列表</span></div> |
| | | <el-table |
| | | :data="tableData" |
| | | style="width: 100%" |
| | | height="400" |
| | | :row-style="{ height: '38px', fontSize: '14px', 'text-align': 'center' }" |
| | | :header-cell-style="{ 'text-align': 'center', height: '36px', fontSize: '14px' }" |
| | | @selection-change="handleSelectionChange" |
| | | @select="handleSelect" |
| | | > |
| | | <el-table-column type="selection" width="55" :selectable="checkSelectable" /> |
| | | <el-table-column type="index" label="序号" width="60" /> |
| | | <el-table-column show-overflow-tooltip prop="nickname" label="机巢名称" /> |
| | | <el-table-column show-overflow-tooltip width="120" prop="estimated_arrival_time" label="预计到达时间" /> |
| | | <el-table-column show-overflow-tooltip prop="exe_distance" label="执行里程" /> |
| | | </el-table> |
| | | <div class="pagination"> |
| | | <el-pagination |
| | | class="ztzf-pagination" |
| | | v-model:current-page="pagingParams.page" |
| | | v-model:page-size="pagingParams.size" |
| | | :page-sizes="[10, 20, 30]" |
| | | layout=" prev, pager, next" |
| | | :total="total" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handleCurrentChange" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { getFlyingNestBy } from '@/api/home/task'; |
| | | import { getFlyingNestBy } from '@/api/home/task' |
| | | |
| | | const props = defineProps({ |
| | | waylineId: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | waylineType: { |
| | | type: Number, |
| | | default: 3 |
| | | }, |
| | | singlePoint: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | planarPoints: { |
| | | type: Array, |
| | | default: () => ([]) |
| | | } |
| | | }); |
| | | waylineId: { |
| | | type: String, |
| | | default: '', |
| | | }, |
| | | waylineType: { |
| | | type: Number, |
| | | default: 3, |
| | | }, |
| | | singlePoint: { |
| | | type: Object, |
| | | default: () => ({}), |
| | | }, |
| | | planarPoints: { |
| | | type: Array, |
| | | default: () => [], |
| | | }, |
| | | }) |
| | | |
| | | // 选中的数据 |
| | | const selectedRows = ref([]); |
| | | const selectedRows = ref([]) |
| | | // 分页参数 |
| | | let pageParams = ref({ |
| | | wayline_id: props.waylineId, |
| | | type: props.waylineType, |
| | | longitude: props.singlePoint.longitude, |
| | | latitude: props.singlePoint.latitude, |
| | | polygon: [], |
| | | }); |
| | | wayline_id: props.waylineId, |
| | | type: props.waylineType, |
| | | longitude: props.singlePoint.longitude, |
| | | latitude: props.singlePoint.latitude, |
| | | polygon: [], |
| | | }) |
| | | let pagingParams = ref({ |
| | | current: 1, |
| | | size: 10 |
| | | }); |
| | | current: 1, |
| | | size: 10, |
| | | }) |
| | | // 获取可用机巢列表数据 |
| | | const total = ref(0); |
| | | const tableData = ref([]); |
| | | const total = ref(0) |
| | | const tableData = ref([]) |
| | | const getNestList = async () => { |
| | | tableData.value = []; |
| | | const res = await getFlyingNestBy(pageParams.value, pagingParams.value); |
| | | if (res.data.code === 0) { |
| | | tableData.value = res.data.data; |
| | | } |
| | | }; |
| | | tableData.value = [] |
| | | const res = await getFlyingNestBy(pageParams.value, pagingParams.value) |
| | | if (res.data.code === 0) { |
| | | tableData.value = res.data.data |
| | | } |
| | | } |
| | | // 分页大小改变 |
| | | const handleSizeChange = (val) => { |
| | | pagingParams.value.size = val; |
| | | getNestList(); |
| | | }; |
| | | const handleSizeChange = val => { |
| | | pagingParams.value.size = val |
| | | getNestList() |
| | | } |
| | | |
| | | // 页码改变 |
| | | const handleCurrentChange = (val) => { |
| | | pagingParams.value.current = val; |
| | | getNestList(); |
| | | }; |
| | | const handleCurrentChange = val => { |
| | | pagingParams.value.current = val |
| | | getNestList() |
| | | } |
| | | |
| | | // 刷新数据 |
| | | const refreshData = () => { |
| | | tableData.value = []; |
| | | pagingParams.value.current = 1; |
| | | getNestList(); |
| | | }; |
| | | tableData.value = [] |
| | | pagingParams.value.current = 1 |
| | | getNestList() |
| | | } |
| | | |
| | | const emit = defineEmits(['update:selected']); |
| | | const handleSelectionChange = (val) => { |
| | | // 如果不是智能规划选区模式,才更新所有选中数据 |
| | | if (props.waylineType !== 2) { |
| | | selectedRows.value = val; |
| | | emit('update:selected', val); |
| | | } |
| | | }; |
| | | const emit = defineEmits(['update:selected']) |
| | | const handleSelectionChange = val => { |
| | | // 如果不是智能规划选区模式,才更新所有选中数据 |
| | | if (props.waylineType !== 2) { |
| | | selectedRows.value = val |
| | | emit('update:selected', val) |
| | | } |
| | | } |
| | | |
| | | // 控制表格行是否可选 |
| | | const checkSelectable = (row) => { |
| | | if (props.waylineType === 2) { |
| | | // 如果已经有选中的行,且当前行未被选中,则不允许选择 |
| | | return selectedRows.value.length === 0 || selectedRows.value.some(selected => selected.device_sn === row.device_sn); |
| | | } |
| | | return true; |
| | | }; |
| | | const checkSelectable = row => { |
| | | if (props.waylineType === 2) { |
| | | // 如果已经有选中的行,且当前行未被选中,则不允许选择 |
| | | return selectedRows.value.length === 0 || selectedRows.value.some(selected => selected.device_sn === row.device_sn) |
| | | } |
| | | return true |
| | | } |
| | | |
| | | // 处理单行选择 |
| | | const handleSelect = (selection, row) => { |
| | | if (props.waylineType === 2) { |
| | | // 如果是智能规划选区模式,确保只能选中一行 |
| | | if (selection.length > 1) { |
| | | // 保留最后选中的那一行 |
| | | const lastSelected = selection[selection.length - 1]; |
| | | selectedRows.value = [lastSelected]; |
| | | // 触发更新事件 |
| | | emit('update:selected', selectedRows.value); |
| | | } |
| | | } |
| | | }; |
| | | if (props.waylineType === 2) { |
| | | // 如果是智能规划选区模式,确保只能选中一行 |
| | | if (selection.length > 1) { |
| | | // 保留最后选中的那一行 |
| | | const lastSelected = selection[selection.length - 1] |
| | | selectedRows.value = [lastSelected] |
| | | // 触发更新事件 |
| | | emit('update:selected', selectedRows.value) |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 监听航线ID变化 |
| | | watch(() => props.waylineId, (newVal) => { |
| | | pageParams.value.type = 0; |
| | | if (newVal) { |
| | | pageParams.value.wayline_id = newVal; |
| | | refreshData(); |
| | | } else { |
| | | // 数据为空时,清除列表数据 |
| | | tableData.value = []; |
| | | } |
| | | }, { deep: true }); |
| | | watch( |
| | | () => props.waylineId, |
| | | newVal => { |
| | | pageParams.value.type = 0 |
| | | if (newVal) { |
| | | pageParams.value.wayline_id = newVal |
| | | refreshData() |
| | | } else { |
| | | // 数据为空时,清除列表数据 |
| | | tableData.value = [] |
| | | } |
| | | }, |
| | | { deep: true } |
| | | ) |
| | | |
| | | // 监听单点返回的数据 |
| | | watch(() => props.singlePoint, (newVal) => { |
| | | pageParams.value.wayline_id = ''; |
| | | pageParams.value.type = 1; |
| | | if (newVal && newVal.latitude && newVal.longitude) { |
| | | pageParams.value.latitude = newVal.latitude; |
| | | pageParams.value.longitude = newVal.longitude; |
| | | refreshData(); |
| | | } |
| | | }, { deep: true }); |
| | | watch( |
| | | () => props.singlePoint, |
| | | newVal => { |
| | | pageParams.value.wayline_id = '' |
| | | pageParams.value.type = 1 |
| | | if (newVal && newVal.latitude && newVal.longitude) { |
| | | pageParams.value.latitude = newVal.latitude |
| | | pageParams.value.longitude = newVal.longitude |
| | | refreshData() |
| | | } |
| | | }, |
| | | { deep: true } |
| | | ) |
| | | |
| | | // 监听面状航线返回的数据 |
| | | watch(() => props.planarPoints, (newVal) => { |
| | | pageParams.value.wayline_id = ''; |
| | | pageParams.value.type = 2; |
| | | if (newVal && newVal.length > 0) { |
| | | const polygonArray = newVal.map(point => [point.longitude, point.latitude]); |
| | | pageParams.value.polygon = polygonArray; |
| | | refreshData(); |
| | | } |
| | | }, { deep: true }); |
| | | watch( |
| | | () => props.planarPoints, |
| | | newVal => { |
| | | pageParams.value.wayline_id = '' |
| | | pageParams.value.type = 2 |
| | | if (newVal && newVal.length > 0) { |
| | | const polygonArray = newVal.map(point => [point.longitude, point.latitude]) |
| | | pageParams.value.polygon = polygonArray |
| | | refreshData() |
| | | } |
| | | }, |
| | | { deep: true } |
| | | ) |
| | | |
| | | // 暴露给父组件的方法 |
| | | const clearTableData = () => { |
| | | tableData.value = []; |
| | | }; |
| | | tableData.value = [] |
| | | } |
| | | defineExpose({ |
| | | clearTableData |
| | | }); |
| | | |
| | | |
| | | onMounted(() => {}); |
| | | |
| | | clearTableData, |
| | | }) |
| | | // 表格隔行变色 |
| | | const tableRowClassName = ({ row, rowIndex }) => { |
| | | if (rowIndex % 2 === 1) { |
| | | return 'warning-row' |
| | | } else { |
| | | return 'success-row' |
| | | } |
| | | } |
| | | onMounted(() => {}) |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .table-container { |
| | | height: 500px; |
| | | // display: flex; |
| | | // flex-direction: column; |
| | | |
| | | .pagination { |
| | | margin-top: 10px; |
| | | } |
| | | |
| | | // :deep(.el-table) { |
| | | // flex: 1; |
| | | // background-color: transparent; |
| | | // --el-table-border-color: rgba(255, 255, 255, 0.1); |
| | | // --el-table-header-bg-color: rgba(31, 62, 122, 0.5); |
| | | // --el-table-header-text-color: #fff; |
| | | // --el-table-text-color: #fff; |
| | | // } |
| | | height: 500px; |
| | | .pagination { |
| | | margin-top: 10px; |
| | | } |
| | | |
| | | // 分页 |
| | | :deep(.el-pagination) { |
| | | display: flex; |
| | | justify-content: center; |
| | | } |
| | | .taskTableTitle { |
| | | margin-bottom: 16px; |
| | | background: url('/src/assets/images/signMachineNest/machineRight/detailtitle.png') no-repeat center; |
| | | background-size: 100% 100%; |
| | | span { |
| | | display: inline-block; |
| | | margin-left: 10px; |
| | | font-size: 16px; |
| | | color: #ddf0ff; |
| | | line-height: 20px; |
| | | text-align: left; |
| | | margin-bottom: 8px; |
| | | } |
| | | } |
| | | :deep(.el-checkbox__inner){ |
| | | background: none !important; |
| | | border: 1px solid #3194EF !important; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | |
| | | // 添加监听 |
| | | watch(() => store.state.task.taskSearchParams, (newVal) => { |
| | | console.log(newVal, '33333'); |
| | | if (newVal) { |
| | | getJobNumBar(newVal); |
| | | (newVal); |
| New file |
| | |
| | | // vite.config.mjs |
| | | import { |
| | | defineConfig, |
| | | loadEnv |
| | | } from "file:///E:/%E9%99%88%E7%91%B6/%E4%B8%AD%E5%9B%BE%E6%99%BA%E9%A3%9E/command-center-dashboard/node_modules/vite/dist/node/index.js"; |
| | | import { resolve } from "path"; |
| | | |
| | | // vite/plugins/index.js |
| | | import vue from "file:///E:/%E9%99%88%E7%91%B6/%E4%B8%AD%E5%9B%BE%E6%99%BA%E9%A3%9E/command-center-dashboard/node_modules/@vitejs/plugin-vue/dist/index.mjs"; |
| | | |
| | | // vite/plugins/auto-import.js |
| | | import autoImport from "file:///E:/%E9%99%88%E7%91%B6/%E4%B8%AD%E5%9B%BE%E6%99%BA%E9%A3%9E/command-center-dashboard/node_modules/unplugin-auto-import/dist/vite.js"; |
| | | function createAutoImport() { |
| | | return autoImport({ |
| | | imports: ["vue", "vue-router", "vuex"], |
| | | dts: false |
| | | }); |
| | | } |
| | | |
| | | // vite/plugins/compression.js |
| | | import compression from "file:///E:/%E9%99%88%E7%91%B6/%E4%B8%AD%E5%9B%BE%E6%99%BA%E9%A3%9E/command-center-dashboard/node_modules/vite-plugin-compression/dist/index.mjs"; |
| | | function createCompression(env) { |
| | | const { VITE_BUILD_COMPRESS } = env; |
| | | const plugin = []; |
| | | if (VITE_BUILD_COMPRESS) { |
| | | const compressList = VITE_BUILD_COMPRESS.split(","); |
| | | if (compressList.includes("gzip")) { |
| | | plugin.push( |
| | | compression({ |
| | | ext: ".gz", |
| | | deleteOriginFile: false |
| | | }) |
| | | ); |
| | | } |
| | | if (compressList.includes("brotli")) { |
| | | plugin.push( |
| | | compression({ |
| | | ext: ".br", |
| | | algorithm: "brotliCompress", |
| | | deleteOriginFile: false |
| | | }) |
| | | ); |
| | | } |
| | | } |
| | | return plugin; |
| | | } |
| | | |
| | | // vite/plugins/setup-extend.js |
| | | import setupExtend from "file:///E:/%E9%99%88%E7%91%B6/%E4%B8%AD%E5%9B%BE%E6%99%BA%E9%A3%9E/command-center-dashboard/node_modules/vite-plugin-vue-setup-extend/dist/index.mjs"; |
| | | function createSetupExtend() { |
| | | return setupExtend(); |
| | | } |
| | | |
| | | // vite/plugins/svg-plugin.js |
| | | import { createSvgIconsPlugin } from "file:///E:/%E9%99%88%E7%91%B6/%E4%B8%AD%E5%9B%BE%E6%99%BA%E9%A3%9E/command-center-dashboard/node_modules/vite-plugin-svg-icons/dist/index.mjs"; |
| | | import path from "path"; |
| | | function createSvgPlugin() { |
| | | return createSvgIconsPlugin({ |
| | | iconDirs: [path.resolve(process.cwd(), "src/assets/svg")], |
| | | //svg图片存放的目录 |
| | | symbolId: "icon-[name]", |
| | | // symbol的id |
| | | inject: "body-last", |
| | | // 插入的位置 |
| | | customDomId: "__svg__icons__dom__" |
| | | // svg的id |
| | | }); |
| | | } |
| | | |
| | | // vite/plugins/index.js |
| | | function createVitePlugins(viteEnv, isBuild = false) { |
| | | const vitePlugins = [vue()]; |
| | | vitePlugins.push(createAutoImport()); |
| | | vitePlugins.push(createSetupExtend()); |
| | | vitePlugins.push(createSvgPlugin()); |
| | | isBuild && vitePlugins.push(...createCompression(viteEnv)); |
| | | return vitePlugins; |
| | | } |
| | | |
| | | // vite.config.mjs |
| | | import postCssPxToRem from "file:///E:/%E9%99%88%E7%91%B6/%E4%B8%AD%E5%9B%BE%E6%99%BA%E9%A3%9E/command-center-dashboard/node_modules/postcss-pxtorem/index.js"; |
| | | var __vite_injected_original_dirname = "E:\\\u9648\u7476\\\u4E2D\u56FE\u667A\u98DE\\command-center-dashboard"; |
| | | var vite_config_default = ({ |
| | | mode, |
| | | command |
| | | }) => { |
| | | const env = loadEnv(mode, process.cwd()); |
| | | const { |
| | | VITE_APP_ENV, |
| | | VITE_APP_BASE, |
| | | VITE_APP_API_URL |
| | | } = env; |
| | | const isProd = VITE_APP_ENV === "production"; |
| | | const buildConfig = { |
| | | target: "esnext", |
| | | minify: isProd ? "terser" : "esbuild" |
| | | // 根据环境选择压缩工具 |
| | | }; |
| | | if (isProd) { |
| | | buildConfig.terserOptions = { |
| | | compress: { |
| | | drop_console: true, |
| | | // 删除 console |
| | | drop_debugger: true |
| | | // 删除 debugger |
| | | }, |
| | | format: { |
| | | comments: false |
| | | // 删除所有注释 |
| | | } |
| | | }; |
| | | buildConfig.rollupOptions = { |
| | | output: { |
| | | manualChunks: { |
| | | "element-plus": ["element-plus"], |
| | | "@smallwei/avue": ["@smallwei/avue"] |
| | | } |
| | | } |
| | | }; |
| | | } |
| | | return defineConfig({ |
| | | base: VITE_APP_BASE, |
| | | define: { |
| | | __VUE_I18N_FULL_INSTALL__: true, |
| | | __VUE_I18N_LEGACY_API__: true, |
| | | __INTLIFY_PROD_DEVTOOLS__: false |
| | | }, |
| | | server: { |
| | | // port: 2888, |
| | | proxy: { |
| | | "/api": { |
| | | target: VITE_APP_API_URL, |
| | | changeOrigin: true, |
| | | rewrite: (path2) => path2.replace(/^\/api/, "") |
| | | } |
| | | } |
| | | }, |
| | | resolve: { |
| | | alias: { |
| | | "~": resolve(__vite_injected_original_dirname, "./"), |
| | | "@": resolve(__vite_injected_original_dirname, "./src"), |
| | | components: resolve(__vite_injected_original_dirname, "./src/components"), |
| | | styles: resolve(__vite_injected_original_dirname, "./src/styles"), |
| | | utils: resolve(__vite_injected_original_dirname, "./src/utils") |
| | | } |
| | | }, |
| | | css: { |
| | | preprocessorOptions: { |
| | | scss: { |
| | | api: "modern-compiler", |
| | | additionalData: `@use "@/styles/variables.scss" as *;` |
| | | } |
| | | }, |
| | | postcss: { |
| | | plugins: [ |
| | | postCssPxToRem({ |
| | | rootValue: 10, |
| | | // 指定转换基准值,通常是设计稿宽度的1/10 |
| | | propList: ["*"], |
| | | // 可以从px转换为rem的属性,这里是所有属性 |
| | | unitPrecision: 5, |
| | | // 允许REM单位增长到的十进制数 |
| | | selectorBlackList: [], |
| | | // 选择器黑名单,忽略转换的选择器 |
| | | replace: true, |
| | | // 替换包含rem的规则,而不是添加回退 |
| | | mediaQuery: false, |
| | | // 允许在媒体查询中转换px |
| | | minPixelValue: 0 |
| | | // 设置要替换的最小像素值 |
| | | }) |
| | | ] |
| | | } |
| | | }, |
| | | plugins: createVitePlugins(env, command === "build"), |
| | | build: buildConfig, |
| | | optimizeDeps: { |
| | | esbuildOptions: { |
| | | target: "esnext" |
| | | } |
| | | } |
| | | }); |
| | | }; |
| | | export { |
| | | vite_config_default as default |
| | | }; |
| | | //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcubWpzIiwgInZpdGUvcGx1Z2lucy9pbmRleC5qcyIsICJ2aXRlL3BsdWdpbnMvYXV0by1pbXBvcnQuanMiLCAidml0ZS9wbHVnaW5zL2NvbXByZXNzaW9uLmpzIiwgInZpdGUvcGx1Z2lucy9zZXR1cC1leHRlbmQuanMiLCAidml0ZS9wbHVnaW5zL3N2Zy1wbHVnaW4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxcdTk2NDhcdTc0NzZcXFxcXHU0RTJEXHU1NkZFXHU2NjdBXHU5OERFXFxcXGNvbW1hbmQtY2VudGVyLWRhc2hib2FyZFwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRTpcXFxcXHU5NjQ4XHU3NDc2XFxcXFx1NEUyRFx1NTZGRVx1NjY3QVx1OThERVxcXFxjb21tYW5kLWNlbnRlci1kYXNoYm9hcmRcXFxcdml0ZS5jb25maWcubWpzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi8lRTklOTklODglRTclOTElQjYvJUU0JUI4JUFEJUU1JTlCJUJFJUU2JTk5JUJBJUU5JUEzJTlFL2NvbW1hbmQtY2VudGVyLWRhc2hib2FyZC92aXRlLmNvbmZpZy5tanNcIjtpbXBvcnQge1xyXG4gIGRlZmluZUNvbmZpZyxcclxuICBsb2FkRW52XHJcbn0gZnJvbSAndml0ZSc7XHJcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgY3JlYXRlVml0ZVBsdWdpbnMgZnJvbSAnLi92aXRlL3BsdWdpbnMnO1xyXG5pbXBvcnQgcG9zdENzc1B4VG9SZW0gZnJvbSAncG9zdGNzcy1weHRvcmVtJ1xyXG5cclxuLy8gaHR0cHM6Ly92aXRlanMuZGV2L2NvbmZpZy9cclxuZXhwb3J0IGRlZmF1bHQgKHtcclxuICBtb2RlLFxyXG4gIGNvbW1hbmRcclxufSkgPT4ge1xyXG4gIGNvbnN0IGVudiA9IGxvYWRFbnYobW9kZSwgcHJvY2Vzcy5jd2QoKSlcclxuICBjb25zdCB7XHJcbiAgICBWSVRFX0FQUF9FTlYsXHJcbiAgICBWSVRFX0FQUF9CQVNFLFxyXG4gICAgVklURV9BUFBfQVBJX1VSTFxyXG4gIH0gPSBlbnZcclxuICAvLyBcdTUyMjRcdTY1QURcdTY2MkZcdTYyNTNcdTc1MUZcdTRFQTdcdTczQUZcdTU4ODNcdTUzMDVcclxuICBjb25zdCBpc1Byb2QgPSBWSVRFX0FQUF9FTlYgPT09ICdwcm9kdWN0aW9uJ1xyXG5cclxuICAvLyBcdTY4MzlcdTYzNkVcdTY2MkZcdTU0MjZcdTc1MUZcdTRFQTdcdTczQUZcdTU4ODNcdUZGMENcdTUyQThcdTYwMDFcdThCQkVcdTdGNkVcdTUzOEJcdTdGMjlcdTkxNERcdTdGNkVcclxuICBjb25zdCBidWlsZENvbmZpZyA9IHtcclxuICAgIHRhcmdldDogJ2VzbmV4dCcsXHJcbiAgICBtaW5pZnk6IGlzUHJvZCA/ICd0ZXJzZXInIDogJ2VzYnVpbGQnLCAvLyBcdTY4MzlcdTYzNkVcdTczQUZcdTU4ODNcdTkwMDlcdTYyRTlcdTUzOEJcdTdGMjlcdTVERTVcdTUxNzdcclxuICB9O1xyXG5cclxuICAvLyBcdTU5ODJcdTY3OUNcdTY2MkZcdTc1MUZcdTRFQTdcdTczQUZcdTU4ODNcdUZGMENcdTZERkJcdTUyQTBUZXJzZXJcdTc2ODRcdTkxNERcdTdGNkVcclxuICBpZiAoaXNQcm9kKSB7XHJcbiAgICBidWlsZENvbmZpZy50ZXJzZXJPcHRpb25zID0ge1xyXG4gICAgICBjb21wcmVzczoge1xyXG4gICAgICAgIGRyb3BfY29uc29sZTogdHJ1ZSwgLy8gXHU1MjIwXHU5NjY0IGNvbnNvbGVcclxuICAgICAgICBkcm9wX2RlYnVnZ2VyOiB0cnVlLCAvLyBcdTUyMjBcdTk2NjQgZGVidWdnZXJcclxuICAgICAgfSxcclxuICAgICAgZm9ybWF0OiB7XHJcbiAgICAgICAgY29tbWVudHM6IGZhbHNlIC8vIFx1NTIyMFx1OTY2NFx1NjI0MFx1NjcwOVx1NkNFOFx1OTFDQVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgYnVpbGRDb25maWcucm9sbHVwT3B0aW9ucyA9IHtcclxuICAgICAgb3V0cHV0OiB7XHJcbiAgICAgICAgbWFudWFsQ2h1bmtzOiB7XHJcbiAgICAgICAgICAnZWxlbWVudC1wbHVzJzogWydlbGVtZW50LXBsdXMnXSxcclxuICAgICAgICAgICdAc21hbGx3ZWkvYXZ1ZSc6IFsnQHNtYWxsd2VpL2F2dWUnXVxyXG4gICAgICAgIH0sXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGRlZmluZUNvbmZpZyh7XHJcbiAgICBiYXNlOiBWSVRFX0FQUF9CQVNFLFxyXG4gICAgZGVmaW5lOiB7XHJcbiAgICAgIF9fVlVFX0kxOE5fRlVMTF9JTlNUQUxMX186IHRydWUsXHJcbiAgICAgIF9fVlVFX0kxOE5fTEVHQUNZX0FQSV9fOiB0cnVlLFxyXG4gICAgICBfX0lOVExJRllfUFJPRF9ERVZUT09MU19fOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHNlcnZlcjoge1xyXG4gICAgICAvLyBwb3J0OiAyODg4LFxyXG4gICAgICBwcm94eToge1xyXG4gICAgICAgICcvYXBpJzoge1xyXG4gICAgICAgICAgdGFyZ2V0OiBWSVRFX0FQUF9BUElfVVJMLFxyXG4gICAgICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxyXG4gICAgICAgICAgcmV3cml0ZTogcGF0aCA9PiBwYXRoLnJlcGxhY2UoL15cXC9hcGkvLCAnJyksXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICByZXNvbHZlOiB7XHJcbiAgICAgIGFsaWFzOiB7XHJcbiAgICAgICAgJ34nOiByZXNvbHZlKF9fZGlybmFtZSwgJy4vJyksXHJcbiAgICAgICAgJ0AnOiByZXNvbHZlKF9fZGlybmFtZSwgJy4vc3JjJyksXHJcbiAgICAgICAgY29tcG9uZW50czogcmVzb2x2ZShfX2Rpcm5hbWUsICcuL3NyYy9jb21wb25lbnRzJyksXHJcbiAgICAgICAgc3R5bGVzOiByZXNvbHZlKF9fZGlybmFtZSwgJy4vc3JjL3N0eWxlcycpLFxyXG4gICAgICAgIHV0aWxzOiByZXNvbHZlKF9fZGlybmFtZSwgJy4vc3JjL3V0aWxzJyksXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgY3NzOiB7XHJcbiAgICAgIHByZXByb2Nlc3Nvck9wdGlvbnM6IHtcclxuICAgICAgICBzY3NzOiB7XHJcbiAgICAgICAgICBhcGk6ICdtb2Rlcm4tY29tcGlsZXInLFxyXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IGBAdXNlIFwiQC9zdHlsZXMvdmFyaWFibGVzLnNjc3NcIiBhcyAqO2AsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAgcG9zdGNzczoge1xyXG4gICAgICAgIHBsdWdpbnM6IFtcclxuICAgICAgICAgIHBvc3RDc3NQeFRvUmVtKHtcclxuICAgICAgICAgICAgcm9vdFZhbHVlOiAxMCwgLy8gXHU2MzA3XHU1QjlBXHU4RjZDXHU2MzYyXHU1N0ZBXHU1MUM2XHU1MDNDXHVGRjBDXHU5MDFBXHU1RTM4XHU2NjJGXHU4QkJFXHU4QkExXHU3QTNGXHU1QkJEXHU1RUE2XHU3Njg0MS8xMFxyXG4gICAgICAgICAgICBwcm9wTGlzdDogWycqJ10sIC8vIFx1NTNFRlx1NEVFNVx1NEVDRXB4XHU4RjZDXHU2MzYyXHU0RTNBcmVtXHU3Njg0XHU1QzVFXHU2MDI3XHVGRjBDXHU4RkQ5XHU5MUNDXHU2NjJGXHU2MjQwXHU2NzA5XHU1QzVFXHU2MDI3XHJcbiAgICAgICAgICAgIHVuaXRQcmVjaXNpb246IDUsIC8vIFx1NTE0MVx1OEJCOFJFTVx1NTM1NVx1NEY0RFx1NTg5RVx1OTU3Rlx1NTIzMFx1NzY4NFx1NTM0MVx1OEZEQlx1NTIzNlx1NjU3MFxyXG4gICAgICAgICAgICBzZWxlY3RvckJsYWNrTGlzdDogW10sIC8vIFx1OTAwOVx1NjJFOVx1NTY2OFx1OUVEMVx1NTQwRFx1NTM1NVx1RkYwQ1x1NUZGRFx1NzU2NVx1OEY2Q1x1NjM2Mlx1NzY4NFx1OTAwOVx1NjJFOVx1NTY2OFxyXG4gICAgICAgICAgICByZXBsYWNlOiB0cnVlLCAvLyBcdTY2RkZcdTYzNjJcdTUzMDVcdTU0MkJyZW1cdTc2ODRcdTg5QzRcdTUyMTlcdUZGMENcdTgwMENcdTRFMERcdTY2MkZcdTZERkJcdTUyQTBcdTU2REVcdTkwMDBcclxuICAgICAgICAgICAgbWVkaWFRdWVyeTogZmFsc2UsIC8vIFx1NTE0MVx1OEJCOFx1NTcyOFx1NUE5Mlx1NEY1M1x1NjdFNVx1OEJFMlx1NEUyRFx1OEY2Q1x1NjM2MnB4XHJcbiAgICAgICAgICAgIG1pblBpeGVsVmFsdWU6IDAgLy8gXHU4QkJFXHU3RjZFXHU4OTgxXHU2NkZGXHU2MzYyXHU3Njg0XHU2NzAwXHU1QzBGXHU1MENGXHU3RDIwXHU1MDNDXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBwbHVnaW5zOiBjcmVhdGVWaXRlUGx1Z2lucyhlbnYsIGNvbW1hbmQgPT09ICdidWlsZCcpLFxyXG4gICAgYnVpbGQ6IGJ1aWxkQ29uZmlnLFxyXG4gICAgb3B0aW1pemVEZXBzOiB7XHJcbiAgICAgIGVzYnVpbGRPcHRpb25zOiB7XHJcbiAgICAgICAgdGFyZ2V0OiAnZXNuZXh0JyxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgfSk7XHJcbn07XHJcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRTpcXFxcXHU5NjQ4XHU3NDc2XFxcXFx1NEUyRFx1NTZGRVx1NjY3QVx1OThERVxcXFxjb21tYW5kLWNlbnRlci1kYXNoYm9hcmRcXFxcdml0ZVxcXFxwbHVnaW5zXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFxcdTk2NDhcdTc0NzZcXFxcXHU0RTJEXHU1NkZFXHU2NjdBXHU5OERFXFxcXGNvbW1hbmQtY2VudGVyLWRhc2hib2FyZFxcXFx2aXRlXFxcXHBsdWdpbnNcXFxcaW5kZXguanNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6LyVFOSU5OSU4OCVFNyU5MSVCNi8lRTQlQjglQUQlRTUlOUIlQkUlRTYlOTklQkElRTklQTMlOUUvY29tbWFuZC1jZW50ZXItZGFzaGJvYXJkL3ZpdGUvcGx1Z2lucy9pbmRleC5qc1wiO2ltcG9ydCB2dWUgZnJvbSAnQHZpdGVqcy9wbHVnaW4tdnVlJztcclxuXHJcbmltcG9ydCBjcmVhdGVBdXRvSW1wb3J0IGZyb20gJy4vYXV0by1pbXBvcnQnO1xyXG5pbXBvcnQgY3JlYXRlQ29tcHJlc3Npb24gZnJvbSAnLi9jb21wcmVzc2lvbic7XHJcbmltcG9ydCBjcmVhdGVTZXR1cEV4dGVuZCBmcm9tICcuL3NldHVwLWV4dGVuZCc7XHJcbmltcG9ydCBjcmVhdGVTdmdQbHVnaW4gZnJvbSAnLi9zdmctcGx1Z2luJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVZpdGVQbHVnaW5zKHZpdGVFbnYsIGlzQnVpbGQgPSBmYWxzZSkge1xyXG4gIGNvbnN0IHZpdGVQbHVnaW5zID0gW3Z1ZSgpXTtcclxuICB2aXRlUGx1Z2lucy5wdXNoKGNyZWF0ZUF1dG9JbXBvcnQoKSk7XHJcbiAgdml0ZVBsdWdpbnMucHVzaChjcmVhdGVTZXR1cEV4dGVuZCgpKTtcclxuICB2aXRlUGx1Z2lucy5wdXNoKGNyZWF0ZVN2Z1BsdWdpbigpKTtcclxuICBpc0J1aWxkICYmIHZpdGVQbHVnaW5zLnB1c2goLi4uY3JlYXRlQ29tcHJlc3Npb24odml0ZUVudikpO1xyXG4gIHJldHVybiB2aXRlUGx1Z2lucztcclxufVxyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXFx1OTY0OFx1NzQ3NlxcXFxcdTRFMkRcdTU2RkVcdTY2N0FcdTk4REVcXFxcY29tbWFuZC1jZW50ZXItZGFzaGJvYXJkXFxcXHZpdGVcXFxccGx1Z2luc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRTpcXFxcXHU5NjQ4XHU3NDc2XFxcXFx1NEUyRFx1NTZGRVx1NjY3QVx1OThERVxcXFxjb21tYW5kLWNlbnRlci1kYXNoYm9hcmRcXFxcdml0ZVxcXFxwbHVnaW5zXFxcXGF1dG8taW1wb3J0LmpzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi8lRTklOTklODglRTclOTElQjYvJUU0JUI4JUFEJUU1JTlCJUJFJUU2JTk5JUJBJUU5JUEzJTlFL2NvbW1hbmQtY2VudGVyLWRhc2hib2FyZC92aXRlL3BsdWdpbnMvYXV0by1pbXBvcnQuanNcIjtpbXBvcnQgYXV0b0ltcG9ydCBmcm9tICd1bnBsdWdpbi1hdXRvLWltcG9ydC92aXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUF1dG9JbXBvcnQoKSB7XHJcbiAgcmV0dXJuIGF1dG9JbXBvcnQoe1xyXG4gICAgaW1wb3J0czogWyd2dWUnLCAndnVlLXJvdXRlcicsICd2dWV4J10sXHJcbiAgICBkdHM6IGZhbHNlLFxyXG4gIH0pO1xyXG59XHJcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRTpcXFxcXHU5NjQ4XHU3NDc2XFxcXFx1NEUyRFx1NTZGRVx1NjY3QVx1OThERVxcXFxjb21tYW5kLWNlbnRlci1kYXNoYm9hcmRcXFxcdml0ZVxcXFxwbHVnaW5zXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFxcdTk2NDhcdTc0NzZcXFxcXHU0RTJEXHU1NkZFXHU2NjdBXHU5OERFXFxcXGNvbW1hbmQtY2VudGVyLWRhc2hib2FyZFxcXFx2aXRlXFxcXHBsdWdpbnNcXFxcY29tcHJlc3Npb24uanNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6LyVFOSU5OSU4OCVFNyU5MSVCNi8lRTQlQjglQUQlRTUlOUIlQkUlRTYlOTklQkElRTklQTMlOUUvY29tbWFuZC1jZW50ZXItZGFzaGJvYXJkL3ZpdGUvcGx1Z2lucy9jb21wcmVzc2lvbi5qc1wiO2ltcG9ydCBjb21wcmVzc2lvbiBmcm9tICd2aXRlLXBsdWdpbi1jb21wcmVzc2lvbic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVDb21wcmVzc2lvbihlbnYpIHtcclxuICBjb25zdCB7IFZJVEVfQlVJTERfQ09NUFJFU1MgfSA9IGVudjtcclxuICBjb25zdCBwbHVnaW4gPSBbXTtcclxuICBpZiAoVklURV9CVUlMRF9DT01QUkVTUykge1xyXG4gICAgY29uc3QgY29tcHJlc3NMaXN0ID0gVklURV9CVUlMRF9DT01QUkVTUy5zcGxpdCgnLCcpO1xyXG4gICAgaWYgKGNvbXByZXNzTGlzdC5pbmNsdWRlcygnZ3ppcCcpKSB7XHJcbiAgICAgIHBsdWdpbi5wdXNoKFxyXG4gICAgICAgIGNvbXByZXNzaW9uKHtcclxuICAgICAgICAgIGV4dDogJy5neicsXHJcbiAgICAgICAgICBkZWxldGVPcmlnaW5GaWxlOiBmYWxzZSxcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbXByZXNzTGlzdC5pbmNsdWRlcygnYnJvdGxpJykpIHtcclxuICAgICAgcGx1Z2luLnB1c2goXHJcbiAgICAgICAgY29tcHJlc3Npb24oe1xyXG4gICAgICAgICAgZXh0OiAnLmJyJyxcclxuICAgICAgICAgIGFsZ29yaXRobTogJ2Jyb3RsaUNvbXByZXNzJyxcclxuICAgICAgICAgIGRlbGV0ZU9yaWdpbkZpbGU6IGZhbHNlLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBwbHVnaW47XHJcbn1cclxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxcdTk2NDhcdTc0NzZcXFxcXHU0RTJEXHU1NkZFXHU2NjdBXHU5OERFXFxcXGNvbW1hbmQtY2VudGVyLWRhc2hib2FyZFxcXFx2aXRlXFxcXHBsdWdpbnNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFx1OTY0OFx1NzQ3NlxcXFxcdTRFMkRcdTU2RkVcdTY2N0FcdTk4REVcXFxcY29tbWFuZC1jZW50ZXItZGFzaGJvYXJkXFxcXHZpdGVcXFxccGx1Z2luc1xcXFxzZXR1cC1leHRlbmQuanNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6LyVFOSU5OSU4OCVFNyU5MSVCNi8lRTQlQjglQUQlRTUlOUIlQkUlRTYlOTklQkElRTklQTMlOUUvY29tbWFuZC1jZW50ZXItZGFzaGJvYXJkL3ZpdGUvcGx1Z2lucy9zZXR1cC1leHRlbmQuanNcIjtpbXBvcnQgc2V0dXBFeHRlbmQgZnJvbSAndml0ZS1wbHVnaW4tdnVlLXNldHVwLWV4dGVuZCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVTZXR1cEV4dGVuZCgpIHtcclxuICByZXR1cm4gc2V0dXBFeHRlbmQoKTtcclxufVxyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXFx1OTY0OFx1NzQ3NlxcXFxcdTRFMkRcdTU2RkVcdTY2N0FcdTk4REVcXFxcY29tbWFuZC1jZW50ZXItZGFzaGJvYXJkXFxcXHZpdGVcXFxccGx1Z2luc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRTpcXFxcXHU5NjQ4XHU3NDc2XFxcXFx1NEUyRFx1NTZGRVx1NjY3QVx1OThERVxcXFxjb21tYW5kLWNlbnRlci1kYXNoYm9hcmRcXFxcdml0ZVxcXFxwbHVnaW5zXFxcXHN2Zy1wbHVnaW4uanNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6LyVFOSU5OSU4OCVFNyU5MSVCNi8lRTQlQjglQUQlRTUlOUIlQkUlRTYlOTklQkElRTklQTMlOUUvY29tbWFuZC1jZW50ZXItZGFzaGJvYXJkL3ZpdGUvcGx1Z2lucy9zdmctcGx1Z2luLmpzXCI7aW1wb3J0IHsgY3JlYXRlU3ZnSWNvbnNQbHVnaW4gfSBmcm9tICd2aXRlLXBsdWdpbi1zdmctaWNvbnMnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlU3ZnUGx1Z2luKCkge1xyXG4gIHJldHVybiAgY3JlYXRlU3ZnSWNvbnNQbHVnaW4oe1xyXG4gICAgaWNvbkRpcnM6IFtwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgXCJzcmMvYXNzZXRzL3N2Z1wiKV0sIC8vc3ZnXHU1NkZFXHU3MjQ3XHU1QjU4XHU2NTNFXHU3Njg0XHU3NkVFXHU1RjU1XHJcbiAgICBzeW1ib2xJZDogXCJpY29uLVtuYW1lXVwiLCAvLyBzeW1ib2xcdTc2ODRpZFxyXG4gICAgaW5qZWN0OiBcImJvZHktbGFzdFwiLCAvLyBcdTYzRDJcdTUxNjVcdTc2ODRcdTRGNERcdTdGNkVcclxuICAgIGN1c3RvbURvbUlkOiBcIl9fc3ZnX19pY29uc19fZG9tX19cIiAvLyBzdmdcdTc2ODRpZFxyXG4gIH0pO1xyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBcVY7QUFBQSxFQUNuVjtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxlQUFlOzs7QUNKMFYsT0FBTyxTQUFTOzs7QUNBSixPQUFPLGdCQUFnQjtBQUV0WSxTQUFSLG1CQUFvQztBQUN6QyxTQUFPLFdBQVc7QUFBQSxJQUNoQixTQUFTLENBQUMsT0FBTyxjQUFjLE1BQU07QUFBQSxJQUNyQyxLQUFLO0FBQUEsRUFDUCxDQUFDO0FBQ0g7OztBQ1A4WCxPQUFPLGlCQUFpQjtBQUV2WSxTQUFSLGtCQUFtQyxLQUFLO0FBQzdDLFFBQU0sRUFBRSxvQkFBb0IsSUFBSTtBQUNoQyxRQUFNLFNBQVMsQ0FBQztBQUNoQixNQUFJLHFCQUFxQjtBQUN2QixVQUFNLGVBQWUsb0JBQW9CLE1BQU0sR0FBRztBQUNsRCxRQUFJLGFBQWEsU0FBUyxNQUFNLEdBQUc7QUFDakMsYUFBTztBQUFBLFFBQ0wsWUFBWTtBQUFBLFVBQ1YsS0FBSztBQUFBLFVBQ0wsa0JBQWtCO0FBQUEsUUFDcEIsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBQ0EsUUFBSSxhQUFhLFNBQVMsUUFBUSxHQUFHO0FBQ25DLGFBQU87QUFBQSxRQUNMLFlBQVk7QUFBQSxVQUNWLEtBQUs7QUFBQSxVQUNMLFdBQVc7QUFBQSxVQUNYLGtCQUFrQjtBQUFBLFFBQ3BCLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7OztBQzFCZ1ksT0FBTyxpQkFBaUI7QUFFelksU0FBUixvQkFBcUM7QUFDMUMsU0FBTyxZQUFZO0FBQ3JCOzs7QUNKNFgsU0FBUyw0QkFBNEI7QUFDamEsT0FBTyxVQUFVO0FBRUYsU0FBUixrQkFBbUM7QUFDeEMsU0FBUSxxQkFBcUI7QUFBQSxJQUMzQixVQUFVLENBQUMsS0FBSyxRQUFRLFFBQVEsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0FBQUE7QUFBQSxJQUN4RCxVQUFVO0FBQUE7QUFBQSxJQUNWLFFBQVE7QUFBQTtBQUFBLElBQ1IsYUFBYTtBQUFBO0FBQUEsRUFDZixDQUFDO0FBQ0g7OztBSkhlLFNBQVIsa0JBQW1DLFNBQVMsVUFBVSxPQUFPO0FBQ2xFLFFBQU0sY0FBYyxDQUFDLElBQUksQ0FBQztBQUMxQixjQUFZLEtBQUssaUJBQWlCLENBQUM7QUFDbkMsY0FBWSxLQUFLLGtCQUFrQixDQUFDO0FBQ3BDLGNBQVksS0FBSyxnQkFBZ0IsQ0FBQztBQUNsQyxhQUFXLFlBQVksS0FBSyxHQUFHLGtCQUFrQixPQUFPLENBQUM7QUFDekQsU0FBTztBQUNUOzs7QURSQSxPQUFPLG9CQUFvQjtBQU4zQixJQUFNLG1DQUFtQztBQVN6QyxJQUFPLHNCQUFRLENBQUM7QUFBQSxFQUNkO0FBQUEsRUFDQTtBQUNGLE1BQU07QUFDSixRQUFNLE1BQU0sUUFBUSxNQUFNLFFBQVEsSUFBSSxDQUFDO0FBQ3ZDLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixRQUFNLFNBQVMsaUJBQWlCO0FBR2hDLFFBQU0sY0FBYztBQUFBLElBQ2xCLFFBQVE7QUFBQSxJQUNSLFFBQVEsU0FBUyxXQUFXO0FBQUE7QUFBQSxFQUM5QjtBQUdBLE1BQUksUUFBUTtBQUNWLGdCQUFZLGdCQUFnQjtBQUFBLE1BQzFCLFVBQVU7QUFBQSxRQUNSLGNBQWM7QUFBQTtBQUFBLFFBQ2QsZUFBZTtBQUFBO0FBQUEsTUFDakI7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOLFVBQVU7QUFBQTtBQUFBLE1BQ1o7QUFBQSxJQUNGO0FBQ0EsZ0JBQVksZ0JBQWdCO0FBQUEsTUFDMUIsUUFBUTtBQUFBLFFBQ04sY0FBYztBQUFBLFVBQ1osZ0JBQWdCLENBQUMsY0FBYztBQUFBLFVBQy9CLGtCQUFrQixDQUFDLGdCQUFnQjtBQUFBLFFBQ3JDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTyxhQUFhO0FBQUEsSUFDbEIsTUFBTTtBQUFBLElBQ04sUUFBUTtBQUFBLE1BQ04sMkJBQTJCO0FBQUEsTUFDM0IseUJBQXlCO0FBQUEsTUFDekIsMkJBQTJCO0FBQUEsSUFDN0I7QUFBQSxJQUNBLFFBQVE7QUFBQTtBQUFBLE1BRU4sT0FBTztBQUFBLFFBQ0wsUUFBUTtBQUFBLFVBQ04sUUFBUTtBQUFBLFVBQ1IsY0FBYztBQUFBLFVBQ2QsU0FBUyxDQUFBQSxVQUFRQSxNQUFLLFFBQVEsVUFBVSxFQUFFO0FBQUEsUUFDNUM7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsT0FBTztBQUFBLFFBQ0wsS0FBSyxRQUFRLGtDQUFXLElBQUk7QUFBQSxRQUM1QixLQUFLLFFBQVEsa0NBQVcsT0FBTztBQUFBLFFBQy9CLFlBQVksUUFBUSxrQ0FBVyxrQkFBa0I7QUFBQSxRQUNqRCxRQUFRLFFBQVEsa0NBQVcsY0FBYztBQUFBLFFBQ3pDLE9BQU8sUUFBUSxrQ0FBVyxhQUFhO0FBQUEsTUFDekM7QUFBQSxJQUNGO0FBQUEsSUFDQSxLQUFLO0FBQUEsTUFDSCxxQkFBcUI7QUFBQSxRQUNuQixNQUFNO0FBQUEsVUFDSixLQUFLO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxRQUNsQjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLFNBQVM7QUFBQSxRQUNQLFNBQVM7QUFBQSxVQUNQLGVBQWU7QUFBQSxZQUNiLFdBQVc7QUFBQTtBQUFBLFlBQ1gsVUFBVSxDQUFDLEdBQUc7QUFBQTtBQUFBLFlBQ2QsZUFBZTtBQUFBO0FBQUEsWUFDZixtQkFBbUIsQ0FBQztBQUFBO0FBQUEsWUFDcEIsU0FBUztBQUFBO0FBQUEsWUFDVCxZQUFZO0FBQUE7QUFBQSxZQUNaLGVBQWU7QUFBQTtBQUFBLFVBQ2pCLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVMsa0JBQWtCLEtBQUssWUFBWSxPQUFPO0FBQUEsSUFDbkQsT0FBTztBQUFBLElBQ1AsY0FBYztBQUFBLE1BQ1osZ0JBQWdCO0FBQUEsUUFDZCxRQUFRO0FBQUEsTUFDVjtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsicGF0aCJdCn0K |