applications/drone-command/src/styles/common/cockpit.scss
@@ -204,6 +204,42 @@ color: #fff !important; .el-date-range-picker__time-header { .el-time-panel { background: #1A1A2A !important; border-radius: 0px 0px 8px 8px; border: none !important; // 将 time-picker-popper 的样式移到这里 .el-time-panel__header { background: #161B2C !important; color: #ffffff !important; border-bottom: 1px solid rgba(71, 157, 255, 0.3) !important; } .el-time-panel__content { .el-time-spinner__item { &:hover { background: transparent !important; } &.active { color: #479dff !important; font-weight: bold; } } } .el-time-panel__footer { .el-time-panel__btn { color: #fff; } .el-time-panel__btn:first-child { color: #86909C; } } } .el-input__wrapper { box-shadow: none; background: #2E2E48 !important; applications/drone-command/src/views/areaManage/defenseZone/FormDiaLog.vue
@@ -138,7 +138,7 @@ const rules = { zoneName: fieldRules(true, 50), defenseSceneIds: fieldRules(true), defenseSceneIds: fieldRules(false), zoneArea: fieldRules(true), } applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue
@@ -116,6 +116,7 @@ <el-date-picker class="command-date-picker" popper-class="command-date-picker-popper" v-model="flyDateRange" type="datetimerange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" :disabled-date="disabledFlyDate" :disabled-time="disabledFlyTime" value-format="YYYY-MM-DD HH:mm:ss" clearable /> </el-form-item> <el-form-item label="关联派出所" prop="policeStationId"> @@ -223,7 +224,39 @@ controlLevel: fieldRules(true), flyDateStart: fieldRules(true), policeStationId: fieldRules(true), deviceIds: fieldRules(true), deviceIds: fieldRules(false), } function isSameDay (left, right) { return ( left.getFullYear() === right.getFullYear() && left.getMonth() === right.getMonth() && left.getDate() === right.getDate() ) } const disabledFlyDate = time => { const startOfToday = new Date() startOfToday.setHours(0, 0, 0, 0) return time.getTime() < startOfToday.getTime() } const disabledFlyTime = date => { if (!date) return {} const now = new Date() if (!isSameDay(date, now)) return {} const currentHour = now.getHours() const currentMinute = now.getMinutes() const currentSecond = now.getSeconds() return { disabledHours: () => Array.from({ length: currentHour }, (_, index) => index), disabledMinutes: hour => hour === currentHour ? Array.from({ length: currentMinute }, (_, index) => index) : [], disabledSeconds: (hour, minute) => hour === currentHour && minute === currentMinute ? Array.from({ length: currentSecond }, (_, index) => index) : [], } } // 关闭弹框 applications/drone-command/src/views/areaManage/sceneConfig/FormDiaLog.vue
@@ -191,7 +191,7 @@ leaderPhone: fieldRules(true, 50), deviceMode: fieldRules(true), longitude: fieldRules(true), areaDivideIds: fieldRules(true), areaDivideIds: fieldRules(false), } // 关闭弹框 applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
@@ -68,8 +68,7 @@ </el-form> <div class="gd-table-toolbar"> <el-button color="#F2F3F5" @click="requester = !requester">我是{{ requester ? '需求方' : '服务方' }}</el-button> <!-- <el-button color="#F2F3F5" @click="requester = !requester">我是{{ requester ? '需求方' : '服务方' }}</el-button>--> <el-button :icon="Plus" color="#4C34FF" type="primary" @click="openForm('add')">新增</el-button> <!-- <el-button :icon="Delete" color="#4C34FF" :disabled="!selectedIds.length" @click="handleDelete()">删除</el-button>--> </div> @@ -129,7 +128,10 @@ import FormDiaLog from './FormDiaLog.vue' import { gdPatrolTaskPageApi, gdPatrolTaskRemoveApi } from './inspectionRequestApi' import ViewDiaLog from '@/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue' import { useStore } from 'vuex' const store = useStore() const requester = computed(() => store.state.user.userInfo?.role_id === '2014158512610869250') // 初始化查询参数 const initSearchParams = () => ({ patrolTaskName: '', // 任务名称 @@ -151,7 +153,6 @@ const viewDiaLogRef = ref(null) const dialogVisible = ref(false) const viewDiaLogVisible = ref(false) const requester = ref(true) const dictObj = ref({ patrolTaskType: [], // 巡查任务类型 workOrderType: [], // 工单类型 applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
@@ -9,7 +9,7 @@ :close-on-click-modal="false" > <div class="content" style="display: flex"> <div class="processBox" v-if="dialogMode !== 'add'"> <div class="processBox" v-if="dialogMode !== 'add' && processList.length"> <el-steps direction="vertical" :active="processList.length"> <el-step v-for="item in processList" :title="item.flowName" :description="item.flowDesc" /> </el-steps> @@ -72,7 +72,6 @@ </el-table-column> </el-table> </template> </div> <el-form class="gd-dialog-form" @@ -129,6 +128,7 @@ v-model="formData.deviceLoadDemand" placeholder="请选择" clearable @change="loadDemandChange" > <el-option v-for="item in dictObj.deviceLoadDemand" @@ -161,12 +161,20 @@ </div> <div class="rightBox" v-if="!dialogReadonly"> <div class="detail-title">推荐设备</div> <el-table ref="deviceTableRef" :data="deviceList" row-key="id" @selection-change="handleDeviceSelectionChange"> <template v-if="formData.deviceLoadDemand && pointList.length"> <el-table ref="deviceTableRef" :data="deviceList" row-key="id" @selection-change="handleDeviceSelectionChange" > <el-table-column type="selection" width="55" :reserve-selection="true" /> <el-table-column prop="nickname" label="设备名称" /> <el-table-column prop="deviceName" label="设备型号" /> <el-table-column prop="devicePayload" label="设备负载" /> </el-table> </template> <div v-else>请先选择设备需求并绘制范围</div> </div> </div> @@ -194,14 +202,14 @@ > 发布 </el-button> <el-button color="#F2F3F5" v-if="gdStatus === '11'">拒单原因</el-button> <el-button color="#F2F3F5" v-if="gdStatus === '11'" @click="addDescription(2, 'view')">拒单原因</el-button> <el-button color="#F2F3F5" @click="statusChange(3)" v-if="gdStatus === '20'">申请取消</el-button> <el-button color="#4C34FF" @click="requestModification" v-if="gdStatus === '20'" class="save-btn"> 申请修改 </el-button> </template> <template v-else> <el-button color="#F2F3F5" v-if="gdStatus === '10'" @click="rejectOrders">拒绝接单</el-button> <el-button color="#F2F3F5" v-if="gdStatus === '10'" @click="addDescription(2)">拒绝接单</el-button> <el-button color="#4C34FF" v-if="gdStatus === '10'" @click="statusChange(1)" class="save-btn">接单</el-button> <el-button color="#F2F3F5" v-if="gdStatus === '22'" @click="statusChange(7)">同意修改</el-button> <el-button color="#4C34FF" v-if="gdStatus === '22'" @click="statusChange(8)" class="save-btn"> @@ -211,6 +219,7 @@ <el-button color="#4C34FF" v-if="gdStatus === '21'" @click="statusChange(6)" class="save-btn"> 不同意取消 </el-button> <el-button color="#F2F3F5" v-if="gdStatus === '30'" @click="addDescription(9)">协商修改</el-button> </template> </template> </template> @@ -275,9 +284,13 @@ const refuseOrderDialogRef = ref(null) let viewer let drawPolygonExample let pointList = [] let pointList = ref([]) const requester = inject('requester') const editStatus = inject('editStatus') const suddenlyEdit = ref(false) const processList = ref([]) let viewPlane const hasPatrolTaskList = computed(() => ['30', '40', '50', '60'].includes(String(formData.value.workOrderStatus))) // 工单状态:0草稿、10发布中_接单中、11发布中_拒绝接单、20响应中_待拆分、21响应中_申请取消、22响应中_申请修改、23响应中_已取消、 // 24响应中_拒绝取消、25响应中_拒绝修改 30执行中_待全部完成、31执行中_协商修改、40完成待验_待全部验收、50验收通过_待结算、60结算完成_已结算 @@ -289,7 +302,7 @@ executeStartTime: fieldRules(true), deviceLoadDemand: fieldRules(true), } // 操作类型:1接单,2拒接接单,3申请取消,4申请修改, 5同意取消 6不同意取消 7.同意修改 7.不同意修改 // 操作类型:1接单,2拒接接单,3申请取消,4申请修改, 5同意取消 6不同意取消 7.同意修改 8.不同意修改 9.协商修改 function statusChange(operationType) { gdWorkOrderHandleStatusApi({ operationType: operationType, workOrderId: formData.value.id }).then(res => { visible.value = false @@ -297,7 +310,6 @@ }) } const suddenlyEdit = ref(false) function requestModification() { suddenlyEdit.value = true dialogMode.value = 'edit' @@ -313,12 +325,24 @@ emit('success') } function rejectOrders() { // 填写说明 function addDescription(type, mode = 'add') { let formLabel = '' switch (type) { case 2: formLabel = '拒绝原因' break case 9: formLabel = '修改原因' break } rejectVisible.value = true nextTick(() => { refuseOrderDialogRef.value.open({ mode: 'add', mode, row: { workOrderId: formData.value.id }, type, formLabel, }) }) } @@ -326,11 +350,25 @@ // 获取推荐设备列表 async function getDeviceList() { try { const res = await gdManageDeviceListApi({ current: 1, size: 1000, ids: formData.value.recommendDeviceIds }) const str = [...pointList.value, pointList.value[0]].map(item => `${item.longitude} ${item.latitude}`).join(',') let geom = `POLYGON((${str}))` const res = await gdManageDeviceListApi({ current: 1, size: 1000, ids: formData.value.recommendDeviceIds, devicePayload: dialogMode.value === 'add' ? formData.value.deviceLoadDemand : '', geom: dialogMode.value === 'add' ? geom : '', }) deviceList.value = res?.data?.data ?? [] } catch (error) { console.error('获取设备列表失败:', error) } } function loadDemandChange() { formData.value.recommendDeviceIds = '' getDeviceList() syncSelection() } // 设备选择变化 @@ -343,13 +381,13 @@ async function handleSubmit() { const isValid = await formRef.value?.validate().catch(() => false) if (!isValid) return if (!pointList.length) { if (!pointList.value.length) { ElMessage.warning('请绘制范围') return } submitting.value = true try { const str = [...pointList, pointList[0]].map(item => `${item.longitude} ${item.latitude}`).join(',') const str = [...pointList.value, pointList.value[0]].map(item => `${item.longitude} ${item.latitude}`).join(',') formData.value.geom = `POLYGON((${str}))` if (!formData.value.id) { formData.value.workOrderStatus = '10' @@ -372,7 +410,6 @@ } ) const processList = ref([]) function loadList() { gdWorkOrderFlowListApi({ workOrderId: formData.value.id }).then(res => { processList.value = res.data.data @@ -397,19 +434,21 @@ // 绘制完成回调 const drawFinished = async data => { pointList = _.cloneDeep(data).map(item => { pointList.value = _.cloneDeep(data).map(item => { const val = cartesian3Convert(item, viewer) return { ...val, lng: val.longitude, lat: val.latitude } }) await getDeviceList() syncSelection() } // 编辑面 function editPolygon() { if (!formData.value?.geom) return pointList = geomAnalysis(formData.value.geom) pointList.value = geomAnalysis(formData.value.geom) drawPolygonExample?.destroy() drawPolygonExample = new DrawPolygon(viewer) let noClosedList = _.cloneDeep(pointList) let noClosedList = _.cloneDeep(pointList.value) noClosedList.pop() drawPolygonExample.initPolygon( viewer, @@ -418,12 +457,11 @@ drawPolygonExample.subscribe('getPolygonPositions', drawFinished) } let viewPlane // 查看面 function viewPolygon() { if (!formData.value?.geom) return pointList = geomAnalysis(formData.value.geom) const result = pointList.map(item => [item.longitude, item.latitude]).flat() pointList.value = geomAnalysis(formData.value.geom) const result = pointList.value.map(item => [item.longitude, item.latitude]).flat() viewPlane = viewer.entities?.add({ customType: 'control_group', position: Cesium.Cartesian3.fromDegrees(result[0], result[1]), @@ -435,7 +473,7 @@ }, }) flyVisual({ positionsData: pointList.map(i => [i.longitude, i.latitude, i.height || 0]), positionsData: pointList.value.map(i => [i.longitude, i.latitude, i.height || 0]), viewer, }) } @@ -452,7 +490,6 @@ }) } const hasPatrolTaskList = computed(() => ['30','40','50','60'].includes(String(formData.value.workOrderStatus))) function gdPatrolTaskPage() { gdPatrolTaskPageApi({ current: 1, size: 1000, workOrderId: formData.value.id }).then(res => { applications/task-work-order/src/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue
@@ -2,7 +2,7 @@ <el-dialog class="gd-dialog" v-model="visible" :title="titleEnum[dialogMode]" title="编辑" @closed="visible = false" destroy-on-close :close-on-click-modal="false" @@ -17,7 +17,7 @@ > <el-row> <el-col :span="24"> <el-form-item label="拒绝原因" prop="rejectReason"> <el-form-item :label="formLabelStr" prop="rejectReason"> <el-input class="gd-input" v-model="formData.rejectReason" @@ -54,7 +54,7 @@ // 初始化表单数据 const initForm = () => ({ operationType: 2, operationType: null, rejectReason: '', workOrderId: null, }) @@ -79,7 +79,7 @@ submitting.value = true gdWorkOrderHandleStatusApi(formData.value) .then(res => { ElMessage.success('拒绝接单成功') ElMessage.success('提交成功') visible.value = false emit('success') }) @@ -88,10 +88,19 @@ }) } function loadDetail() { } let formLabelStr = ref('原因') // 打开弹框 async function open({ mode = 'add', row } = {}) { async function open({ mode = 'add', row, formLabel, type } = {}) { dialogMode.value = mode formData.value = {...formData.value,...row} formLabelStr.value = formLabel formData.value = { ...initForm(), ...row, operationType: type } if (mode === 'view'){ await loadDetail() } } defineExpose({ open }) applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
@@ -1,6 +1,6 @@ <template> <basic-container> <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick"> <el-tabs class="gd-tabs" v-model="activeName" @tab-click="tabsClick"> <el-tab-pane label="全部 " name="all"></el-tab-pane> <el-tab-pane label="我的任务工单" name="my"></el-tab-pane> </el-tabs> @@ -108,7 +108,7 @@ </template> </el-table-column> <el-table-column prop="serviceParty" show-overflow-tooltip label="服务方名称" /> <el-table-column prop="createDeptName" show-overflow-tooltip label="需求方名称" /> <el-table-column prop="createUserName" show-overflow-tooltip label="需求方名称" /> <el-table-column prop="createTime" show-overflow-tooltip label="工单创建时间" /> <el-table-column label="操作" class-name="operation-btns"> <template v-slot="{ row }"> @@ -193,7 +193,7 @@ ...searchParams.value, startTime: range[0], endTime: range[1], createUser: activeName.value === 'user' ? store.state.user.userInfo.user_id : '', createUser: activeName.value === 'my' ? store.state.user.userInfo.user_id : '', }) list.value = res?.data?.data?.records ?? [] total.value = res?.data?.data?.total ?? 0 @@ -216,7 +216,9 @@ getList() } function handleClick(tab,event) { function tabsClick(tab, event) { activeName.value = tab.props.name resetForm() handleSearch() }