| src/api/tickets/orderLog.js | ●●●●● patch | view | raw | blame | history | |
| src/views/tickets/component/AddEditDetails.vue | ●●●●● patch | view | raw | blame | history | |
| src/views/tickets/component/SearchBox.vue | ●●●●● patch | view | raw | blame | history | |
| src/views/tickets/orderLog.vue | ●●●●● patch | view | raw | blame | history | |
| src/views/tickets/orderLogCopy.vue | ●●●●● patch | view | raw | blame | history |
src/api/tickets/orderLog.js
@@ -68,6 +68,14 @@ }); }; // 智飞工单 统计数替换上面接口 // export const jobStatusNum = (data) => { // return request({ // url: '/drone-device-core/wayline/orderLog/jobStatusNum', // method: 'post', // data // }); // }; // 草稿转发布 export const userPublish = (id) => { src/views/tickets/component/AddEditDetails.vue
@@ -8,21 +8,20 @@ :close-on-click-modal="false" :destroy-on-close="true" @close="cancel" :before-close="handleBeforeClose" > <div class="add-edit-details"> <div class="process"> <div>{{ formParams.name }}}</div> <div class="process" v-if="txtTitle !=='新建工单'"> <div class="order_title">{{ formParams.name }}</div> <div class="custom-steps-container"> <!-- 标题行 --> <div class="steps-titles" v-if="filters.status !== '0'"> <div v-for="(record, index) in formParams.record_list" :class="{ active: record.user_id >= 0 }" :key="index" class="step-title"> <div class="steps-titles"> <div class="step-title" v-for="(record, index) in formParams.record_list" :class="{ active: record.user_id >= 0 }" :key="index"> {{ record.status_str }} </div> </div> <!-- Element Steps 组件 --> <el-steps :active="formParams.active" align-center class="custom-steps" v-if="filters.status !== '0'"> <el-steps :active="formParams.active" align-center class="custom-steps"> <el-step v-for="(record, index) in formParams.record_list" :key="index"> <template #description> <span class="step-description" style="position: relative; display: inline-block"> @@ -43,12 +42,12 @@ <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="工单名称" prop="name"> <el-input v-model="formParams.name" placeholder="请输入工单名称" maxlength="100" show-word-limit></el-input> <el-input v-model="formParams.name" placeholder="请输入工单名称" maxlength="100" show-word-limit :disabled="txtTitle === '审核工单' || txtTitle === '工单详情'"></el-input> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="关联航线" prop="file_id"> <el-select v-model="formParams.file_id" placeholder="请选择航线" filterable @change="getFlyingNest"> <el-select v-model="formParams.file_id" placeholder="请选择航线" filterable @change="getFlyingNest" :disabled="txtTitle === '审核工单' || txtTitle === '工单详情'"> <el-option v-for="item in lineList" :key="item.wayline_id" :label="item.name" :value="item.wayline_id" /> </el-select> @@ -56,21 +55,21 @@ </el-col> <el-col :span="6"> <el-form-item label="安全返航真高" prop="rth_altitude" class="safe-height"> <el-input-number v-model="formParams.rth_altitude" :min="50" :max="500"></el-input-number> <el-input-number v-model="formParams.rth_altitude" :min="50" :max="500" :disabled="txtTitle === '审核工单' || txtTitle === '工单详情'"></el-input-number> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="关联机巢" prop="device_sns"> <el-select v-model="formParams.device_sns" placeholder="请选择机巢" multiple :disabled="!drone_sns.length"> <el-select v-model="formParams.device_sns" placeholder="请选择机巢" multiple :disabled="(txtTitle === '审核工单' || txtTitle === '工单详情')"> <el-option v-for="item in drone_sns" :key="item.device_sn" :label="item.nickname" :value="item.device_sn" /> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="关联算法" prop="ai_types"> <el-select v-model="formParams.ai_types" placeholder="请选择关联算法" multiple> <el-select v-model="formParams.ai_types" placeholder="请选择关联算法" multiple :disabled="txtTitle === '审核工单' || txtTitle === '工单详情'"> <el-option v-for="item in aiTypeList" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" /> </el-select> </el-form-item> @@ -78,15 +77,21 @@ </el-row> <el-row :gutter="20"> <el-col :span="12"> <el-col :span="12" v-if="txtTitle === '新建工单'"> <el-form-item label="工单内容" prop="content"> <el-input type="textarea" v-model="formParams.content" rows="4" placeholder="请输入工单内容" maxlength="255" show-word-limit></el-input> <el-input type="textarea" v-model="formParams.content" rows="4" placeholder="请输入工单内容" maxlength="255" show-word-limit :disabled="txtTitle === '审核工单' || txtTitle === '工单详情'"></el-input> </el-form-item> </el-col> <el-col :span="8"> <el-col :span="12" prop="statusStr" v-else> <el-form-item label="当前状态"> {{ getOrderStatus(formParams.status) }} </el-form-item> </el-col> <el-col :span="7"> <el-form-item label="周期频次" prop="date_range"> <el-date-picker <el-date-picker :disabled="txtTitle === '审核工单' || txtTitle === '工单详情'" v-model="formParams.date_range" type="daterange" range-separator="至" @@ -95,20 +100,27 @@ :disabled-date="disabledDate" /> </el-form-item> </el-col> <el-col :span="4"> <div class="week_pc"> <div class="week_pc_one week-r"> <el-select v-model="formParams.rep_fre_type" placeholder="请选择频次"> <el-option v-for="item in weeks" :key="item" :label="item" :value="item" /> </el-select> </div> <div class="week_pc_one"> <el-time-picker style="width: 100px" v-model="formParams.deal_time" prop="deal_time" value-format="HH:mm" :picker-options="{ selectableRange: '00:00 - 23:59', }" /> </div> </div> <el-col :span="2"> <el-select v-model="formParams.rep_fre_type" placeholder="请选择频次" :disabled="txtTitle === '审核工单' || txtTitle === '工单详情'"> <el-option v-for="item in weeks" :key="item" :label="item" :value="item" /> </el-select> </el-col> <el-col :span="3"> <el-time-picker :style="{ width: pxToRem(140) }" v-model="formParams.deal_time" :disabled="txtTitle === '审核工单' || txtTitle === '工单详情'" prop="deal_time" value-format="HH:mm" :picker-options="{ selectableRange: '00:00 - 23:59'}" /> </el-col> </el-row> <el-row :gutter="20" v-if="txtTitle === '审核工单' || txtTitle === '工单详情' || txtTitle === '工单编辑'"> <el-col :span="12"> <el-form-item label="工单内容" prop="content"> <el-input type="textarea" v-model="formParams.content" rows="4" placeholder="请输入工单内容" maxlength="255" show-word-limit :disabled="txtTitle === '审核工单' || txtTitle === '工单详情'"></el-input> </el-form-item> </el-col> </el-row> @@ -122,7 +134,7 @@ <template #footer v-if="txtTitle === '新建工单'"> <div class="dialog-footer"> <el-button type="danger" @click="submitForm(1)" icon="el-icon-position">发起</el-button> <el-button type="primary" @click="submitForm(0)" icon="el-icon-document-add">存草稿</el-button> <!-- <el-button type="primary" @click="submitForm(0)" icon="el-icon-document-add">存草稿</el-button>--> <el-button @click="cancel" icon="el-icon-circle-close">取消</el-button> </div> </template> @@ -139,10 +151,20 @@ <el-button @click="cancel" icon="el-icon-circle-close">取消</el-button> </div> </template> <template #footer v-if="txtTitle === '工单编辑'"> <div class="dialog-footer"> <el-button type="danger" v-if="formParams.status == 0 || (formParams.status == 2 && userInfo.user_id === formParams.create_user)" @click="submitForm(1)" icon="el-icon-position">发布 </el-button> <el-button @click="cancel" icon="el-icon-circle-close">取消</el-button> </div> </template> </el-dialog> </template> <script setup> import { pxToRem, pxToRemNum } from '@/utils/rem' import { ref, shallowRef, onMounted, computed } from 'vue'; import { newGetWorkspacesPage } from '@/api/resource/wayline' import { getDictionaryByCode } from '@/api/system/dictbiz' @@ -209,6 +231,16 @@ }) } function getOrderStatus (status) { const statusTextMap = { 0: '草稿', 1: '待审核', 2: '已驳回', 3: '已通过' } return statusTextMap[status] || '未知状态' } // 关联机巢 const drone_sns = ref([]) function getFlyingNest (waylineId) { @@ -220,6 +252,9 @@ wayline_id: waylineId, polygon } // 重置 formParams.value.device_sns = [] drone_sns.value = [] getFlyingNestBy(params).then(res => { drone_sns.value = res.data.data initMapLine() @@ -328,22 +363,27 @@ } // 监听txtTitle watch(txtTitle, async (newVal, oldVal) => { watch(isShowAddEditDetails, async (newVal, oldVal) => { console.log('txtTitle 发生变化:', newVal, oldVal) if (newVal === '工单审核') { formParams.value = {} if (txtTitle.value === '工单审核' || txtTitle.value === '工单详情' || txtTitle.value === '工单编辑') { const response = await orderLogDetails(rowObj.value.id) const data = response.data.data formParams.value = { ...data } console.log(formParams.value, '898789') drone_sns.value = data.device_list initMapLine(data.device_map_infos) } }, { immediate: true // 立即执行一次 }) function handleBeforeClose() { cancel() } function cancel() { formParams.value = {} isShowAddEditDetails.value = false emit('refresh'); } @@ -365,9 +405,6 @@ width: 180px !important; } } .week_pc { display: flex; } .week_pc_one { flex: 1; @@ -379,5 +416,60 @@ width: 100% !important; } } .process { .order_title { height: 30px; line-height: 30px; text-align: center; font-size: 20px; font-weight: bold; color: #333; } .custom-steps-container { width: 100%; margin: 7px 0; } .steps-titles { display: flex; justify-content: space-between; margin-bottom: 16px; position: relative; } .step-title { text-align: center; flex: 1; font-size: 16px; color: #999; position: relative; padding-bottom: 10px; } .step-title.active { color: #409eff; font-weight: bold; } .custom-steps { margin-top: -20px; /* 向上移动与标题重叠 */ } .el-step__head { margin-top: 0; } .el-step__description { margin-top: 8px; padding: 0 20px; } .step-description { font-size: 14px; color: #666; line-height: 1.5; } } } </style> src/views/tickets/component/SearchBox.vue
@@ -61,8 +61,8 @@ <el-date-picker v-model="cycleDateRange" type="daterange" range-separator="至" start-placeholder="工单周期开始日期" end-placeholder="工单周期结束日期" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" :default-value="datePickerDefaultVal" /> </el-form-item> <el-form-item label="选择频次:"> @@ -100,7 +100,7 @@ deal_time: "", file_id: "", key_word: "", status: 0, status: '', rep_fre_type: '', }) @@ -133,7 +133,6 @@ const cycles = ref(['每天', '周一', '周二', '周三', '周四', '周五', '周六', '周末', '周天', '工作日']) // 工单状态 const orderStatus = ref([ { label: '草稿', value: '0' }, { label: '待审核', value: '1' }, { label: '已驳回', value: '2' }, { label: '已通过', value: '3' } @@ -184,6 +183,7 @@ // } // } .search-box-test { margin-bottom: 16px; transition: all 0.3s; .search-first { @@ -276,7 +276,7 @@ .el-form-item { margin-bottom: 0; width: 233px; width: 280px; margin-right: 20px; .el-form-item__label { src/views/tickets/orderLog.vue
@@ -16,7 +16,7 @@ '0') }} </template> </el-table-column> <el-table-column prop="job_info_num" label="工单编号" width="160"> <el-table-column prop="job_info_num" label="工单编号" width="170"> <template #default="scope"> <el-tooltip-copy :content="scope.row.job_info_num" :showCopyText="true"> {{scope.row.job_info_num}} @@ -30,39 +30,46 @@ </el-tooltip-copy> </template> </el-table-column> <el-table-column prop="dept_name" label="工单状态"> <template #default="scope"> <el-tag :type="getStatusTagType(scope.row.status)">{{ getOrderStatus(scope.row.status) }}</el-tag> </template> </el-table-column> <el-table-column prop="dept_name" label="所属单位" show-overflow-tooltip/> <el-table-column prop="create_time" label="创建时间" show-overflow-tooltip/> <el-table-column prop="job_num" label="已执行次数" show-overflow-tooltip align="center" /> <el-table-column prop="job_num" label="已执行次数" width="90" align="center" /> <el-table-column prop="content" label="工单内容" show-overflow-tooltip align="center" /> <el-table-column prop="wayline_name" label="关联航线" show-overflow-tooltip /> <el-table-column prop="ai_type_str" label="关联算法" width="200" align="center" /> <el-table-column prop="device_names" label="关联机巢" width="200" align="center" /> <el-table-column prop="creator_name" label="创建人" align="center" show-overflow-tooltip /> <el-table-column prop="cycle_time_value" label="工单周期频次" align="center" show-overflow-tooltip /> <el-table-column label="操作" width="200" align="center"> <el-table-column label="操作" width="200" fixed="right" align="center"> <template #default="scope"> {{scope.row.status}} <template v-if="scope.row.status === 1"> <el-button type="text" icon="el-icon-view" v-if="permission.order_log_review" @click="handleCheckDetail(scope.row, '工单审核')">审核</el-button> <!--待审核状态--> <el-button type="text" icon="el-icon-warning" v-if="permission.order_log_recall" @click="revokeOrder(scope.row.id)">撤回 </el-button> <el-button type="text" icon="el-icon-warning" v-if="permission.order_log_recall" @click="revokeOrder(scope.row.id)">撤回</el-button> <el-button type="text" icon="el-icon-view" @click="handleViewDetail(scope.row, '工单详情')">详情</el-button> </template> <!--已驳回--> <template v-if="scope.row.status === 2"> <el-button type="text" icon="el-icon-warning" @click="rejectReason(scope.row.id)">驳回原因</el-button> <el-button type="text" icon="el-icon-view" v-if="userInfo.user_id === scope.row.create_user" @click="handleViewDetail(scope.row, '工单编辑')">编辑</el-button> <el-button type="text" icon="el-icon-view" v-else @click="handleViewDetail(scope.row, '工单详情')">详情</el-button> <el-button type="text" icon="el-icon-warning" @click="rejectReason(scope.row.id, scope.row)">驳回原因</el-button> <el-button type="text" icon="el-icon-view" @click="handleViewDetail(scope.row, '工单详情')">详情</el-button> <!-- <el-button type="text" icon="el-icon-view" v-if="userInfo.user_id === scope.row.create_user" @click="handleViewDetail(scope.row, '工单编辑')">编辑</el-button>--> <!-- <el-button type="text" icon="el-icon-view" v-else @click="handleViewDetail(scope.row, '工单详情')">详情</el-button>--> </template> <!-- 已通过 --> <template v-if="scope.row.status === 3"> <el-button type="text" icon="el-icon-view" @click="handleViewDetail(scope.row, '工单详情')">详情</el-button> </template> <!--草稿--> <template v-if="scope.row.status === 0"> <el-button type="text" icon="el-icon-edit" @click="handleViewDetail(scope.row, '工单编辑')">编辑</el-button> <el-button type="text" icon="el-icon-position" @click="userPublishPush(scope.row.id)">发布</el-button> <el-button type="text" icon="el-icon-delete" @click="deleteOrder(scope.row.id)">删除</el-button> </template> <!-- <template v-if="scope.row.status === 0">--> <!-- <el-button type="text" icon="el-icon-edit" @click="handleViewDetail(scope.row, '工单编辑')">编辑</el-button>--> <!-- <el-button type="text" icon="el-icon-position" @click="userPublishPush(scope.row.id)">发布</el-button>--> <!-- <el-button type="text" icon="el-icon-delete" @click="deleteOrder(scope.row.id)">删除</el-button>--> <!-- </template>--> </template> </el-table-column> </el-table> @@ -112,36 +119,93 @@ const isShowAddEditDetails = ref(false) const activeTab = ref('all') // tab切换 function handleTabChange (tab) { let tabsList = ref([ // { label: '我的工单', name: 'my_order', value: null, count: 0 }, // { label: '全部工单', name: 'all', value: null, count: 0 }, // { label: '待审核', name: 'WAIT_AUDIT', value: 1, count: 0 }, // { label: '已驳回', name: 'REJECTED', value: 2, count: 0 }, // { label: '已通过', name: 'PASS', value: 3, count: 0 }, // { label: '草稿', name: 'DRAFT', value: 0, count: 0 } ]) function filteredTabs () { if (permission?.value.orderLog_tab_allOrders) { tabsList.value.push({ label: '全部工单', name: 'all', value: null, count: 0 }) } if (permission?.value.orderLog_tab_pending) { tabsList.value.push({ label: '待审核', name: 'WAIT_AUDIT', value: 1, count: 0 }) } if (permission?.value.orderLog_tab_reject) { tabsList.value.push({ label: '已驳回', name: 'REJECTED', value: 2, count: 0 }) } if (permission?.value.orderLog_tab_pass) { tabsList.value.push({ label: '已通过', name: 'PASS', value: 3, count: 0 }) } activeTab.value = tabsList.value[0].name console.log('8878797', tabsList.value) // tabsList.value // .map(tab => { // if (tab.name === 'all') { // return { ...tab, isShow: permission?.value.orderLog_tab_allOrders } // } // if (tab.name === 'WAIT_AUDIT') { // return { ...tab, isShow: permission?.value.orderLog_tab_pending } // } // if (tab.name === 'REJECTED') { // return { ...tab, isShow: permission?.value.orderLog_tab_reject } // } // if (tab.name === 'PASS') { // return { ...tab, isShow: permission?.value.orderLog_tab_pass } // } // // return { ...tab, isShow: true } // }) // .filter(tab => tab.isShow) } let tabsList = ref([ { label: '全部工单', name: 'all', value: null, count: 0 }, { label: '待审核', name: 'WAIT_AUDIT', value: 1, count: 0 }, { label: '已驳回', name: 'REJECTED', value: 2, count: 0 }, { label: '已通过', name: 'PASS', value: 3, count: 0 }, { label: '草稿', name: 'DRAFT', value: 0, count: 0 } ]) // tab切换 function handleTabChange (tab) { activeTab.value = tab.paneName orderListParams.status = '' if (tab.paneName === 'WAIT_AUDIT') { orderListParams.status = '1' } else if (tab.paneName === 'REJECTED') { orderListParams.status = '2' } else if (tab.paneName === 'PASS') { orderListParams.status = '3' } else if (tab.paneName === 'DRAFT') { orderListParams.status = '0' } refreshGetOrderList() } // 更新统计数 async function updateGlobalCounts() { let res = await jobStatusNum() res.data.data.forEach(item => { const tab = tabsList.value.find(t => t.name === item.dict_key) if (tab) { tab.count = item.num } }) } const total = ref(0) const orderListParams = reactive({ current: 1, size: 10, searchParams: {}, status: '' }) const orderListTable = ref([]) function getTableList() { const apiParams = { ...cloneDeep(orderListParams), searchParams: { ...cloneDeep(orderListParams.searchParams) }, ...cloneDeep(orderListParams.searchParams) } getList(apiParams).then(res => { orderListTable.value = res.data.data.records total.value = res.data.data.total // updateGlobalCounts() }) } @@ -161,6 +225,7 @@ const searchClick = params => { orderListParams.current = 1 orderListParams.size = 10 console.log('333', params) orderListParams.searchParams = params getTableList() } @@ -171,20 +236,42 @@ getTableList() } function getOrderStatus (status) { const statusTextMap = { // 0: '草稿', 1: '待审核', 2: '已驳回', 3: '已通过' } return statusTextMap[status] || '未知状态' } function getStatusTagType (status) { const statusMap = { 1: 'warning', 2: 'info', 3: 'primary', 4: 'success', 5: 'danger' } return statusMap[status] || 'info' } // 新增按钮 和 导出按钮 // function hasAddBtnPermission () { // return permission && permission?.value.order_log_add // } // 新建工单、编辑、详情 const txtTitle = ref('新建工单') const rowObj = ref({}) provide('txtTitle', txtTitle) provide('rowObj', rowObj) function handleAddOrder() { txtTitle.value = '新建工单' isShowAddEditDetails.value = true } // 详情、编辑 function handleViewDetail(row, txt) { rowObj.value = row txtTitle.value = txt isShowAddEditDetails.value = true } @@ -231,13 +318,14 @@ // 撤回工单 async function revokeOrder(id) { try { await ElMessageBox.confirm('确定撤回到草稿箱?', '是否撤回', { await ElMessageBox.confirm('撤回会删除本工单,需重新提交?', '是否撤回', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }) // 用户点击确定,执行撤回操作 await orderLogRecall(id) // await orderLogRecall(id) await deleteOrderLog(id) // 显示成功消息 ElMessage.success('撤回成功') // 触发搜索刷新 @@ -252,7 +340,7 @@ } // 驳回原因 async function rejectReason(id) { async function rejectReason(id, row) { try { const res = await orderLogDetails(id) const data = res.data.data @@ -265,7 +353,7 @@ // 用户点击确定后的逻辑 TODO // form.value = { ...res.data.data } // handleViewDetail(data) handleViewDetail(row, userInfo.value.user_id === row.create_user ? '工单编辑':'工单详情') } catch (error) { // 用户点击取消,不执行任何操作 @@ -297,7 +385,9 @@ } onMounted(() => { filteredTabs() getTableList() updateGlobalCounts() }) </script> src/views/tickets/orderLogCopy.vue
@@ -1203,9 +1203,7 @@ this.device_sns = data.device_map_infos;// data.device_list; this.permission && (this.permission.order_log_review || this.permission.order_log_recall) && (data.status == 1 || data.status == 3 || (data.status == 2 && this.userInfo.user_id !== this.form.create_user)) (data.status == 1 || data.status == 3 || (data.status == 2 && this.userInfo.user_id !== this.form.create_user)) ? (this.detailTitle = '工单详情') : (this.detailTitle = '编辑工单')