| | |
| | | <template> |
| | | <div class="search-box"> |
| | | <div class="search-box" :class="{ 'is-expand': isExpand }"> |
| | | <el-form :model="searchForm" inline> |
| | | <el-form-item label="任务名称"> |
| | | <el-input v-model="searchForm.name" placeholder="请输入任务名称" clearable /> |
| | | </el-form-item> |
| | | <el-form-item label="所属部门"> |
| | | <el-select |
| | | v-model="searchForm.deptId" |
| | | placeholder="请选择部门" |
| | | clearable |
| | | > |
| | | <el-tree-select |
| | | v-model="searchForm.deptId" |
| | | :data="deptTreeData" |
| | | node-key="id" |
| | | :props="{ |
| | | label: 'name', |
| | | children: 'children' |
| | | }" |
| | | check-strictly |
| | | clearable |
| | | <div class="search-row"> |
| | | <div class="search-items"> |
| | | <el-form-item label="名称/编号"> |
| | | <el-input v-model="searchForm.key_word" placeholder="请输入任务名称/编号" clearable /> |
| | | </el-form-item> |
| | | <el-form-item label="区域"> |
| | | <el-select v-model="searchForm.area_code" @change="deptChange" placeholder="请选择部门" clearable> |
| | | <el-option v-for="item in deptTreeData" :key="item.area_code" :label="item.area_name" :value="item.area_code" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="机巢"> |
| | | <el-select v-model="searchForm.device_sn" placeholder="请选择机巢" clearable> |
| | | <el-option v-for="item in machineData" :key="item.device_sn" :label="item.nickname" :value="item.device_sn" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="search-btns"> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleSearch">查询</el-button> |
| | | <el-button @click="handleReset">重置</el-button> |
| | | <el-button type="text" @click="toggleExpand"> |
| | | {{ isExpand ? '收起' : '展开' }} |
| | | <el-icon class="el-icon--right"> |
| | | <component :is="isExpand ? 'ArrowUp' : 'ArrowDown'" /> |
| | | </el-icon> |
| | | </el-button> |
| | | </el-form-item> |
| | | </div> |
| | | </div> |
| | | <!-- 展开后显示的更多搜索条件 --> |
| | | <div v-show="isExpand" class="search-more"> |
| | | <div class="search-row"> |
| | | <el-form-item label="周期类型"> |
| | | <el-select v-model="searchForm.date_enum" placeholder="请选择状态" clearable> |
| | | <el-option label="日" value="DAY" /> |
| | | <el-option label="周" value="CURRENT_WEEK" /> |
| | | <el-option label="月" value="CURRENT_MONTH" /> |
| | | <el-option label="年" value="CURRENT_YEAR" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="任务时间"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | type="daterange" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="周期"> |
| | | <el-select v-model="searchForm.status" placeholder="请选择状态" clearable> |
| | | <el-option label="日" value="日" /> |
| | | <el-option label="周" value="周" /> |
| | | <el-option label="月" value="月" /> |
| | | <el-option label="年" value="年" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="任务状态"> |
| | | <el-select v-model="searchForm.status" placeholder="请选择状态" clearable> |
| | | <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="任务时间"> |
| | | <el-date-picker |
| | | v-model="searchForm.dateRange" |
| | | type="daterange" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="任务算法"> |
| | | <el-select v-model="searchForm.status" placeholder="请选择状态" clearable> |
| | | <el-option label="识别火情" value="日" /> |
| | | <el-option label="识别车辆" value="周" /> |
| | | <el-option label="识别船只" value="月" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleSearch">查询</el-button> |
| | | <el-button @click="handleReset">重置</el-button> |
| | | </el-form-item> |
| | | </el-form-item> |
| | | <el-form-item label="任务算法"> |
| | | <el-select v-model="searchForm.ai_type" placeholder="请选择算法" clearable> |
| | | <el-option v-for="item in taskAlgorithm" :key="item.id" :label="item.dictValue" :value="item.dictKey" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="search-row"> |
| | | <el-form-item label="所属部门"> |
| | | <el-select v-model="searchForm.create_dept" placeholder="请选择部门" clearable> |
| | | <el-option v-for="item in deptData" :key="item.id" :label="item.deptName" :value="item.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="任务状态"> |
| | | <el-select v-model="searchForm.status" placeholder="请选择状态" clearable> |
| | | <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="任务类型"> |
| | | <el-select v-model="searchForm.industry_type" placeholder="请选择类型" clearable> |
| | | <el-option v-for="item in taskBusiness" :key="item.id" :label="item.dictValue" :value="item.dictKey" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </div> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </template> |
| | | <script setup> |
| | | import { getDictionary, deptsByAreaCode, getDockInfo } from '@/api/home/common'; |
| | | |
| | | const isExpand = ref(false); |
| | | const toggleExpand = () => { |
| | | isExpand.value = !isExpand.value; |
| | | }; |
| | | |
| | | const dateRange = ref([]); |
| | | const searchForm = reactive({ |
| | | name: '', |
| | | job_info_num: '', |
| | | status: '', |
| | | dateRange: [] |
| | | ai_type: '', // 算法类型 |
| | | area_code: '', // 区域code |
| | | create_dept: '', // 创建部门 |
| | | date_enum: '', // 日期枚举,可用值:TODAY,CURRENT_WEEK,CURRENT_MONTH,CURRENT_YEAR |
| | | device_sn: '', // 设备编号 |
| | | end_date: '', // 结束时间 |
| | | industry_type: '', // 行业key |
| | | key_word: '', // 模糊搜索关键词(匹配名称/昵称/设备sn) |
| | | start_date: '', // 开始时间 |
| | | status: '' // 作业状态 |
| | | }); |
| | | |
| | | const statusOptions = [ |
| | | { label: '待执行', value: 1 }, |
| | | { label: '执行中', value: 2 }, |
| | |
| | | { label: '执行失败', value: 5 } |
| | | ]; |
| | | |
| | | // 部门以及机巢 |
| | | const deptTreeData = ref([]); |
| | | |
| | | const emit = defineEmits(['search']); |
| | | |
| | | const handleSearch = () => { |
| | | emit('search', { |
| | | ...searchForm, |
| | | begin_time: searchForm.dateRange[0], |
| | | end_time: searchForm.dateRange[1] |
| | | start_date: `${dateRange.value[0]} 00:00:00`, |
| | | end_date: `${dateRange.value[1]} 23:59:59` |
| | | }); |
| | | }; |
| | | |
| | | const handleReset = () => { |
| | | searchForm.name = ''; |
| | | searchForm.job_info_num = ''; |
| | | searchForm.status = ''; |
| | | searchForm.dateRange = []; |
| | | dateRange.value = null; |
| | | Object.keys(searchForm).forEach(key => { |
| | | searchForm[key] = ''; |
| | | }); |
| | | handleSearch(); |
| | | }; |
| | | |
| | | let taskAlgorithm = ref([]); |
| | | let taskBusiness = ref([]); |
| | | |
| | | // 请求字典字段 |
| | | const requestDictionary = () => { |
| | | getDictionary('SF,HYLB').then((res) => { |
| | | if (res.data.code !== 0) { |
| | | if (res.code !== 0) { |
| | | // 处理数据 |
| | | console.log('111111',res.data) |
| | | taskAlgorithm.value = res.data.data['SF']; |
| | | taskBusiness.value = res.data.data['HYLB']; |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | |
| | | let deptData = ref([]); |
| | | // 所属部门信息 |
| | | const getDeptsByAreaCode = () => { |
| | | deptsByAreaCode(searchForm.area_code).then((res) => { |
| | | if (res.code !== 0) { |
| | | deptData.value = res.data.data; |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | // 部门 |
| | | let deptTreeData = ref([]); |
| | | // 机巢 |
| | | let machineData = ref([]); |
| | | |
| | | // 处理部门数据为树形结构 |
| | | const handleDeptData = (data) => { |
| | | const buildTree = (items, parentId = 0) => { |
| | | const result = []; |
| | | for (const item of items) { |
| | | if (item.parent_id === parentId) { |
| | | const children = buildTree(items, item.id); |
| | | if (children.length) { |
| | | item.children = children; |
| | | } |
| | | result.push(item); |
| | | } |
| | | deptTreeData.value = []; // 初始化数组 |
| | | data.forEach(item => { |
| | | let treeNode = { |
| | | id: item.area_code, |
| | | name: item.area_name, |
| | | children: [] |
| | | }; |
| | | // 处理设备子节点 |
| | | if (item.devices && item.devices.length > 0) { |
| | | item.devices.forEach(device => { |
| | | treeNode.children.push({ |
| | | id: device.device_sn, |
| | | name: device.nickname |
| | | }); |
| | | }); |
| | | } |
| | | return result; |
| | | }; |
| | | return buildTree(data); |
| | | }; |
| | | // 部门信息 |
| | | const getDeptsByAreaCode = () => { |
| | | deptsByAreaCode().then((res) => { |
| | | if (res.data.code !== 0) { |
| | | deptTreeData.value = res.data; |
| | | // 处理数据 |
| | | console.log('22222',res.data) |
| | | } |
| | | deptTreeData.value.push(treeNode); |
| | | }); |
| | | }; |
| | | |
| | | // 机巢信息 |
| | | // 部门下得机巢 |
| | | const requestDockInfo = () => { |
| | | getDockInfo().then((res) => { |
| | | if (res.data.code !== 0) { |
| | | // 处理数据 |
| | | console.log('33333',res.data) |
| | | } |
| | | if (res.data.code !== 0) return; |
| | | // handleDeptData(res.data.data); |
| | | deptTreeData.value = res.data.data; |
| | | }); |
| | | }; |
| | | const deptChange = (value) => { |
| | | // 处理机巢数据 |
| | | machineData.value = ''; |
| | | machineData.value = deptTreeData.value.find(item => item.area_code === value)?.devices || []; |
| | | // 所属部门重新请求值 |
| | | searchForm.create_dept = ''; |
| | | deptData.value = []; |
| | | getDeptsByAreaCode(); |
| | | }; |
| | | |
| | | |
| | | onMounted(() => { |
| | | requestDictionary(); |
| | | deptsByAreaCode(); |
| | | getDeptsByAreaCode(); |
| | | requestDockInfo(); |
| | | }); |
| | | </script> |
| | |
| | | top: 120px; |
| | | left: 450px; |
| | | width: calc(100% - 400px - 400px - 100px); |
| | | height:60px; |
| | | color: #fff; |
| | | background: rgba(31, 62, 122, 0.35); |
| | | height: 60px; |
| | | background: rgba(31, 62, 122, 0.95); |
| | | padding: 10px 20px; |
| | | transition: all 0.3s; |
| | | &.is-expand { |
| | | height: auto; |
| | | } |
| | | .search-row { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | |
| | | .search-items { |
| | | display: flex; |
| | | flex: 1; |
| | | } |
| | | |
| | | .search-btns { |
| | | margin-left: 20px; |
| | | white-space: nowrap; |
| | | } |
| | | } |
| | | |
| | | .search-more { |
| | | position: absolute; |
| | | top: 100%; |
| | | left: 0; |
| | | right: 0; |
| | | background: rgba(31, 62, 122, 0.95); |
| | | padding: 20px; |
| | | z-index: 10; |
| | | border-top: 1px solid rgba(255, 255, 255, 0.1); |
| | | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); |
| | | } |
| | | |
| | | :deep(.el-form) { |
| | | --el-text-color-regular: #fff; |
| | | |
| | | .el-form-item { |
| | | margin-bottom: 0; |
| | | margin-right: 20px; |
| | |
| | | } |
| | | } |
| | | } |
| | | :deep() { |
| | | .el-select__wrapper { |
| | | background: transparent; |
| | | height: 100%; |
| | | padding-left: 20px; |
| | | } |
| | | |
| | | .el-select__selected-item { |
| | | font-family: Source Han Sans CN, Source Han Sans CN, serif; |
| | | font-weight: 400; |
| | | font-size: 14px; |
| | | color: #ffffff; |
| | | line-height: 18px; |
| | | } |
| | | } |
| | | } |
| | | </style> |