Merge branch 'master' of http://139.196.74.78:10010/r/jagzwxm/ja_web
14 files modified
1 files added
| | |
| | | watch( |
| | | () => mapCurrentDetail, |
| | | newVal => { |
| | | const newDataMap=newVal |
| | | // 只有 workNavigationShow 为 true 且有经纬度时才添加标记 |
| | | if (workNavigationShow && newVal?.longitude && newVal?.latitude) { |
| | | addIncidentMarker(newVal) |
| | | mapCurrentDetailData.value = newVal |
| | | if (workNavigationShow && newDataMap?.longitude && newDataMap?.latitude) { |
| | | addIncidentMarker(newDataMap) |
| | | mapCurrentDetailData.value = newDataMap |
| | | } else if (!workNavigationShow && incidentMarker) { |
| | | // 当 workNavigationShow 变为 false 时,移除已添加的标记 |
| | | markersLayer.removeLayer(incidentMarker) |
| | |
| | | :workNavigationShow="true" |
| | | :mapCurrentDetail="mapCurrentDetail" |
| | | > |
| | | <!-- <template #eventNav>--> |
| | | <!-- <EventNavigation :mapCurrentDetail="mapCurrentDetail"></EventNavigation>--> |
| | | <!-- </template>--> |
| | | </WorkMap> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { getDeviceRegion } from '@/api/home/aggregation' |
| | | import WorkMap from '@/appComponents/workMap/index.vue' |
| | | import EventNavigation from '@/appPages/work/workDetail/mapWork/eventNavigation.vue' |
| | | import { useRoute } from 'vue-router' |
| | | import { showToast } from 'vant' |
| | | import { getList } from '/src/api/work/index.js' |
| | | import { useStore } from 'vuex' |
| | | const store = useStore() |
| | | const userInfo = computed(() => store?.state?.user?.userInfo) |
| | | const route = useRoute() |
| | | const mapCurrentDetail = ref({}) |
| | | const eventNum = ref('') |
| | | // 机巢数据 |
| | | let machineData = ref([]); |
| | | // 机巢数据 |
| | | const handleNodeClick = async data => { |
| | | const droneList = await getDeviceRegion({ areaCode: userInfo.value.detail.areaCode }); |
| | | machineData.value = droneList?.data?.data; |
| | | }; |
| | | const getDataList = async val => { |
| | | const params = { |
| | | current: 1, |
| | | size: 9999, |
| | | source: 1, |
| | | event_name: val, |
| | | } |
| | | const res = await getList(params) |
| | | const response = res.data.data.records |
| | | const matchedMachine = machineData.value.find(m => m.device_sn === response[0].device_sn); |
| | | const deviceNickname = matchedMachine?.nickname || '' |
| | | mapCurrentDetail.value = { |
| | | ...response[0], |
| | | processingDetail: response[0].processing_details, |
| | | update_photo_url: response[0].update_photo_url, |
| | | aiType: response[0].ai_type_key_list?.join(',') || '', |
| | | device_names:deviceNickname ? deviceNickname :'' |
| | | } |
| | | } |
| | | onMounted(async () => { |
| | | // handleNodeClick() |
| | | eventNum.value = route.query.currentItem |
| | | // await getDataList(eventNum.value) |
| | | mapCurrentDetail.value = JSON.parse(decodeURIComponent(route.query.currentItem)) |
| | | |
| | | }) |
| | | </script> |
| | | |
| | |
| | | |
| | | # 是否在打包时开启压缩,支持 gzip 和 brotli |
| | | VITE_BUILD_COMPRESS=gzip |
| | | |
| | | # xt接口地址 |
| | | VITE_APP_URL_XT=http://218.202.104.82:8200 |
| | |
| | | # VITE_APP_URL = https://wrj.shuixiongit.com/api |
| | | VITE_APP_URL= http://192.168.1.204 |
| | | |
| | | VITE_APP_URL_XT=http://218.202.104.82:8200 |
| | | |
| | | |
| | | #新大屏地址 |
| | | VITE_APP_DASHBOARD_URL = 'https://wrj.shuixiongit.com/command-center-dashboard/' |
| | |
| | | data:{"size":100,"current":1}, |
| | | }) |
| | | } |
| | | |
| | | // 获取飞手信息 |
| | | export const deviceFlyerApi = (data) => { |
| | | return request({ |
| | | url: `/deviceFlyer/deviceFlyer/queryList`, |
| | | method: 'post', |
| | | data: data, |
| | | }) |
| | | } |
| | | |
| | | // 获取航线列表 |
| | | export const airlineListApi = (data) => { |
| | | return request({ |
| | | url: `/webservice/webservice/airline/queryList`, |
| | | method: 'post', |
| | | data: data, |
| | | }) |
| | | } |
| | | |
| | | |
| | |
| | | $form-tips-gray: #A1A3D4; |
| | | |
| | | .gd-input { |
| | | --el-input-bg-color: #{$form-bg}; |
| | | --el-input-placeholder-color: #{$form-tips}; |
| | | --bg: #{$form-bg}; |
| | | --tips: #{$form-tips}; |
| | | |
| | | &.gray { |
| | | --el-input-bg-color: #{$form-bg-gray}; |
| | | --el-input-placeholder-color: #{$form-tips-gray}; |
| | | --bg: #{$form-bg-gray}; |
| | | --tips: #{$form-tips-gray}; |
| | | } |
| | | |
| | | .el-input__wrapper, .el-textarea__inner { |
| | | box-shadow: none !important; |
| | | background: var(--bg); |
| | | border: none; |
| | | } |
| | | .el-input__inner, .el-textarea__inner { |
| | | &::placeholder { |
| | | color: var(--tips); |
| | | } |
| | | } |
| | | |
| | | &.is-disabled { |
| | | .el-input__wrapper { |
| | | background: $form-bg; |
| | | background: var(--bg); |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | <template> |
| | | <basic-container>飞手</basic-container> |
| | | </template> |
| | | |
| | | <script setup></script> |
| | | |
| | | <style scoped lang="scss"></style> |
| | |
| | | |
| | | /* 左侧步骤条 */ |
| | | .detail-left { |
| | | width: 25%; |
| | | width: 35%; |
| | | padding-right: 20px; |
| | | border-right: 1px solid #e8e8e8; |
| | | } |
| | | |
| | | /* 右侧表单 */ |
| | | .detail-right { |
| | | width: 75%; |
| | | width: 65%; |
| | | .reject-reason { |
| | | margin-bottom: 20px; |
| | | background: #f2f3f5; |
| | |
| | | <template> |
| | | <div class="audit-record-container"> |
| | | <div class="label">审批记录</div> |
| | | <el-steps direction="vertical" :active="displayedSteps.length"> |
| | | <el-step v-for="step in displayedSteps" :key="step.status" :title="step.title" :description="`${step.person || ''}\n${step.time || ''}`" /> |
| | | </el-steps> |
| | | <el-timeline class="gd-timeline"> |
| | | <el-timeline-item |
| | | v-for="(step, index) in displayedSteps" |
| | | :key="step.status" |
| | | :icon="Check" |
| | | :type="index === displayedSteps.length - 1 ? 'success' : 'info'" |
| | | :timestamp="step.time" |
| | | > |
| | | <div class="item-content"> |
| | | <div class="flowName">{{ step.title }}</div> |
| | | <div >{{ step.person }}</div> |
| | | </div> |
| | | </el-timeline-item> |
| | | </el-timeline> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, watch } from 'vue' |
| | | import { Check } from '@element-plus/icons-vue' |
| | | import { gdSupplyDemandAuditListApi } from '@/views/orderView/orderDataManage/supplyAdd/supplyAddApi' |
| | | |
| | | const props = defineProps({ |
| | |
| | | |
| | | <style scoped lang="scss"> |
| | | .audit-record-container { |
| | | height: 95%; |
| | | .label { |
| | | font-weight: 500; |
| | | margin-bottom: 8px; |
| | | color: #333; |
| | | width:100%; |
| | | // height: 95%; |
| | | |
| | | } |
| | | |
| | | /* 时间线样式 */ |
| | | :deep(.gd-timeline) { |
| | | padding-left: 90px; |
| | | } |
| | | |
| | | :deep(.el-timeline-item) { |
| | | padding-bottom: 20px; |
| | | .item-content { |
| | | position: relative; |
| | | .flowName { |
| | | width: 80px; |
| | | position: absolute; |
| | | left: -120px; |
| | | top: 0px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /* 步骤条样式 */ |
| | | :deep(.el-steps) { |
| | | align-items: flex-start; |
| | | } |
| | | |
| | | :deep(.el-step) { |
| | | // margin-bottom: 20px; |
| | | } |
| | | |
| | | :deep(.el-step__title) { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | :deep(.el-step__description) { |
| | | font-size: 13px; |
| | | color: #666; |
| | | white-space: pre-wrap; |
| | | line-height: 1.4; |
| | | :deep(.el-timeline-item__timestamp) { |
| | | font-size: 12px; |
| | | color: #999; |
| | | margin-top: 2px; |
| | | } |
| | | </style> |
| | |
| | | import { gdWorkOrderPageApi } from '../orderManage/orderManageApi' |
| | | import { gdManageDeviceListApi } from '../orderManage/gdManageDeviceApi' |
| | | import { pxToRem } from '@/utils/rem' |
| | | import { airlineListApi } from '@/api/zkxt' |
| | | |
| | | // 初始化任务行 |
| | | const initTaskRow = () => ({ |
| | |
| | | deviceId: null, |
| | | taskDesc: '', |
| | | }) |
| | | |
| | | // todo 时间线 |
| | | const dictObj = inject('dictObj') |
| | | |
| | | const emit = defineEmits(['success']) |
| | |
| | | // 下拉选项 |
| | | const flyerListMap = ref({}) // 飞手列表,按行索引存储 |
| | | const deviceList = ref([]) // 设备列表 |
| | | const routeOptions = ref([ |
| | | { name: '航线1', id: '1' }, |
| | | { name: '航线2', id: '2' }, |
| | | { name: '航线3', id: '3' }, |
| | | ]) // 航线假数据 |
| | | const routeOptions = inject('routeOptions') |
| | | |
| | | // 子任务列表 |
| | | const taskList = ref([initTaskRow()]) |
| | |
| | | :close-on-click-modal="false" |
| | | > |
| | | <div class="content" style="display: flex"> |
| | | <div class="processBox" v-if="dialogMode !== 'add' && processList.length"> |
| | | <el-timeline class="gd-timeline"> |
| | | <el-timeline-item |
| | | v-for="(activity, index) in processList" |
| | | :key="index" |
| | | :icon="Check" |
| | | :type="index === processList.length - 1 ? 'success' : 'info'" |
| | | :color="activity.color" |
| | | :hollow="activity.hollow" |
| | | :timestamp="activity.flowDesc.split(' ')[1]" |
| | | > |
| | | <div class="item-content"> |
| | | <div>{{ activity.flowDesc.split(' ')[0] }}</div> |
| | | <div class="flowName">{{ activity.flowName }}</div> |
| | | </div> |
| | | </el-timeline-item> |
| | | </el-timeline> |
| | | </div> |
| | | <div class="leftBox"> |
| | | <!-- 查看模式 --> |
| | | <div class="detail-container" v-if="dialogReadonly"> |
| | |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="label">巡查任务航线</div> |
| | | <div class="val">{{ getRouteName(formData.patrolRouteUrl) }}</div> |
| | | <div class="val">{{ getAirName(formData.patrolRouteUrl) }}</div> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="label">推荐飞手</div> |
| | |
| | | import { ElMessage } from 'element-plus' |
| | | import { fieldRules, getDictLabel } from '@ztzf/utils' |
| | | import { gdPatrolTaskRepublish, gdFlyerPageApi, gdPatrolTaskAuditApi } from './inspectionRequestApi' |
| | | import { gdWorkOrderPageApi } from '../orderManage/orderManageApi' |
| | | import { gdWorkOrderFlowListApi, gdWorkOrderPageApi } from '../orderManage/orderManageApi' |
| | | import { gdManageDeviceListApi } from '../orderManage/gdManageDeviceApi' |
| | | import { pxToRem } from '@/utils/rem' |
| | | import CommonCesiumMap from '@/components/map-container/common-cesium-map.vue' |
| | | import { gdTaskResultListApi } from '@/views/orderView/orderManage/clueEvents/achievementApi' |
| | | import RefuseOrderDialog from '@/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue' |
| | | import RefuseOrderDialog1 from '@/views/orderView/orderManage/inspectionRequest/RefuseOrderDialog1.vue' |
| | | import { Check } from '@element-plus/icons-vue' |
| | | |
| | | // 初始化表单数据 |
| | | const initForm = () => ({ |
| | |
| | | const flyerList = ref([]) |
| | | const deviceList = ref([]) |
| | | const workOrderList = ref([]) |
| | | const routeOptions = ref([ |
| | | { name: '航线1', id: '1' }, |
| | | { name: '航线2', id: '2' }, |
| | | { name: '航线3', id: '3' }, |
| | | ]) |
| | | const routeOptions = inject('routeOptions') |
| | | const getAirName = inject('getAirName') |
| | | |
| | | const gdStatusObj = { |
| | | '0': { reason: '拒绝原因', operationType: '2' }, |
| | |
| | | deviceList.value = res?.data?.data ?? [] |
| | | } |
| | | |
| | | const processList = ref([]) |
| | | // 加载时间线list |
| | | function loadList() { |
| | | gdWorkOrderFlowListApi({ workOrderId: formData.value.id,type: '1' }).then(res => { |
| | | processList.value = res.data.data |
| | | }) |
| | | } |
| | | |
| | | // 提交编辑 |
| | | async function handleSubmit() { |
| | | const isValid = await formRef.value?.validate().catch(() => false) |
| | |
| | | async function open({ mode = 'view', row } = {}) { |
| | | dialogMode.value = mode |
| | | formData.value = { ...initForm(), ...row } |
| | | console.log(row) |
| | | ;['6', '7', '8'].includes(row.taskStatus) && getList() |
| | | loadList() |
| | | initMap() |
| | | } |
| | | |
| | |
| | | width: 100%; |
| | | height: 423px; |
| | | } |
| | | } |
| | | |
| | | } |
| | | .processBox { |
| | | width: 312px; |
| | | .item-content { |
| | | position: relative; |
| | | .flowName { |
| | | width: 80px; |
| | | position: absolute; |
| | | left: -120px; |
| | | top: 0px; |
| | | } |
| | | } |
| | | } |
| | | .imgBox { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | |
| | | import { gdPatrolTaskPageApi, gdPatrolTaskRemoveApi } from './inspectionRequestApi' |
| | | import ViewDiaLog from '@/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue' |
| | | import { useStore } from 'vuex' |
| | | import { airlineListApi } from '@/api/zkxt' |
| | | |
| | | const store = useStore() |
| | | const requester = computed(() => store.state.user.userInfo?.role_id === '2014158512610869250') |
| | |
| | | selectedIds.value = rows.map(item => item.id) |
| | | } |
| | | |
| | | const routeOptions = ref([]) |
| | | const getAirName = id => { |
| | | const item = routeOptions.value.find(item => item.id === id) |
| | | return item ? item.name : id |
| | | } |
| | | provide('routeOptions', routeOptions) |
| | | provide('getAirName', getAirName) |
| | | function getAirList() { |
| | | airlineListApi({}).then(res => { |
| | | routeOptions.value = res.data.data || [] |
| | | }) |
| | | } |
| | | |
| | | // 获取字典 |
| | | function getDictList() { |
| | | getDictionaryByCode('patrolTaskType,workOrderType,deviceLoadDemand,taskStatus').then(res => { |
| | |
| | | onMounted(() => { |
| | | getList() |
| | | getDictList() |
| | | getAirList() |
| | | }) |
| | | </script> |
| | | <style scoped lang="scss"></style> |
| | |
| | | |
| | | // 获取推荐设备列表 |
| | | async function getDeviceList() { |
| | | const all = ['11'].includes(gdStatus.value) |
| | | try { |
| | | const str = [...pointList.value, pointList.value[0]].map(item => `${item.longitude} ${item.latitude}`).join(',') |
| | | let geom = `POLYGON((${str}))` |
| | | const res = await gdManageDeviceListApi({ |
| | | deviceIds: formData.value.recommendDeviceIds, |
| | | deviceIds: all ? '' : formData.value.recommendDeviceIds, |
| | | devicePayload: dialogMode.value === 'add' ? formData.value.deviceLoadDemand : '', |
| | | geom: dialogMode.value === 'add' ? geom : '', |
| | | }) |
| | |
| | | |
| | | // 加载时间线list |
| | | function loadList() { |
| | | gdWorkOrderFlowListApi({ workOrderId: formData.value.id }).then(res => { |
| | | gdWorkOrderFlowListApi({ workOrderId: formData.value.id,type: '0' }).then(res => { |
| | | processList.value = res.data.data |
| | | }) |
| | | } |
| | |
| | | position: position, |
| | | billboard: { |
| | | image: droneIcon, |
| | | width: 40, |
| | | height: 40, |
| | | width: 20, |
| | | height: 20, |
| | | verticalOrigin: Cesium.VerticalOrigin.CENTER, |
| | | }, |
| | | label: { |
| | | text: item.nickname, |
| | | font: '12px/1.5 Microsoft YaHei', |
| | | style: Cesium.LabelStyle.FILL_AND_OUTLINE, |
| | | outlineWidth: 2, |
| | | outlineColor: Cesium.Color.WHITE, |
| | | horizontalOrigin: Cesium.HorizontalOrigin.CENTER, |
| | | verticalOrigin: Cesium.VerticalOrigin.BOTTOM, |
| | | pixelOffset: new Cesium.Cartesian2(0, -10) |
| | | } |
| | | }) |
| | | }) |
| | | } |
| | |
| | | hasPatrolTaskList.value && gdPatrolTaskPage() |
| | | dialogMode.value === 'edit' ? editPolygon() : viewPolygon() |
| | | } |
| | | // setMapDevice() |
| | | setMapDevice() |
| | | await nextTick() |
| | | await getDeviceList() |
| | | syncSelection() |
| | | } |
| | | |
| | |
| | | <div class="gd-table-container" v-loading="loading"> |
| | | <div class="gd-table-content gd-table-content-bg"> |
| | | <el-table class="gd-table" :data="list" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="46" /> |
| | | <el-table-column type="selection" width="46" v-if="requester"/> |
| | | <el-table-column type="index" width="64" label="序号" /> |
| | | <el-table-column prop="workOrderName" show-overflow-tooltip label="工单名称" /> |
| | | <el-table-column prop="workOrderCode" show-overflow-tooltip label="工单编号" /> |
| | |
| | | }) |
| | | // 跳转地图 |
| | | const jumpMap = item => { |
| | | const contactStr = encodeURIComponent(JSON.stringify(item)) |
| | | uni.navigateTo({ |
| | | url: `/subPackages/workDetail/mapWork/index?eventNum=${item.event_num}`, |
| | | url: `/subPackages/workDetail/mapWork/index?eventNum=${contactStr}`, |
| | | }) |
| | | } |
| | | // 退回 |