多耳号查询与模糊查询

This commit is contained in:
ll
2026-01-19 20:40:15 +08:00
parent 0280c3d013
commit c6be490aa2
4 changed files with 225 additions and 29 deletions

View File

@@ -8,6 +8,15 @@ export function listMilkProdclasses(query) {
}) })
} }
// 修改处:新增耳号模糊查询接口
export function searchEarNumbers(query) {
return request({
url: '/milkProdclasses/milkProdclasses/search_ear_numbers',
method: 'get',
params: { query }
})
}
export function importMilkProdclasses(data) { export function importMilkProdclasses(data) {
return request({ return request({
url: '/milkProdclasses/milkProdclasses/import', url: '/milkProdclasses/milkProdclasses/import',

View File

@@ -9,6 +9,15 @@ export function listSheepMilkAnalysis(query) {
}) })
} }
// 修改处:新增模糊查询耳号接口
export function searchEarNumbers(query) {
return request({
url: '/dairyProducts/sheepMilkAnalysis/search_ear_numbers',
method: 'get',
params: { query }
})
}
// 查询单个羊奶产量分析详细信息 // 查询单个羊奶产量分析详细信息
export function getSheepMilkAnalysis(sheepId) { export function getSheepMilkAnalysis(sheepId) {
return request({ return request({

View File

@@ -12,8 +12,36 @@
clearable /> clearable />
</el-form-item> </el-form-item>
<el-form-item label="管理耳号"> <el-form-item label="管理耳号" prop="allEarNumbers">
<el-input v-model="queryParams.manageEarNo" placeholder="请输入管理耳号" clearable /> <el-select
v-model="queryParams.allEarNumbers"
multiple
filterable
remote
reserve-keyword
placeholder="输入耳号搜索"
:remote-method="searchEarNumber"
:loading="earNumberLoading"
allow-create
default-first-option
style="width: 300px"
@change="handleEarNumberChange"
>
<el-option
v-for="item in earNumberOptions"
:key="item"
:label="item"
:value="item"
/>
</el-select>
<el-button
type="text"
@click="clearEarNumbers"
v-if="queryParams.allEarNumbers && queryParams.allEarNumbers.length > 0"
style="margin-left: 10px"
>
清空
</el-button>
</el-form-item> </el-form-item>
<el-form-item label="厂区"> <el-form-item label="厂区">
@@ -39,6 +67,19 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<div v-if="queryParams.allEarNumbers && queryParams.allEarNumbers.length > 0" class="selected-ear-numbers">
<span style="margin-right: 10px; color: #606266;">已选择耳号</span>
<el-tag
v-for="earNumber in queryParams.allEarNumbers"
:key="earNumber"
closable
@close="removeEarNumber(earNumber)"
style="margin-right: 8px;"
>
{{ earNumber }}
</el-tag>
</div>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="info" plain @click="handleImport" v-hasPermi="['milkProdclasses:milkProdclasses:import']"> <el-button type="info" plain @click="handleImport" v-hasPermi="['milkProdclasses:milkProdclasses:import']">
@@ -94,7 +135,8 @@
<script setup> <script setup>
import { ref, reactive, onMounted, getCurrentInstance } from 'vue' import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
import { listMilkProdclasses, importMilkProdclasses, exportMilkProdclasses } from '@/api/dairyProducts/milkProdclasses/milkProdclasses' // 修改处:引入 searchEarNumbers
import { listMilkProdclasses, importMilkProdclasses, exportMilkProdclasses, searchEarNumbers } from '@/api/dairyProducts/milkProdclasses/milkProdclasses'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import { getRanchList } from '@/api/dairyProducts/ranch/ranch.js' import { getRanchList } from '@/api/dairyProducts/ranch/ranch.js'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
@@ -104,6 +146,10 @@ import { parseTime } from '@/utils/ruoyi'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const ranchOptions = ref([]) const ranchOptions = ref([])
// 修改处:新增耳号搜索相关变量
const earNumberOptions = ref([])
const earNumberLoading = ref(false)
onMounted(() => { onMounted(() => {
getRanchList().then(res => { getRanchList().then(res => {
ranchOptions.value = res.data.map(item => ({ ranchOptions.value = res.data.map(item => ({
@@ -117,26 +163,60 @@ onMounted(() => {
const queryParams = reactive({ const queryParams = reactive({
pageNum: 1, pageNum: 1,
pageSize: 20, // 默认20条 pageSize: 20,
datetimeStart: null, // 开始日期 datetimeStart: null,
datetimeEnd: null, // 结束日期 datetimeEnd: null,
manageEarNo: '', // 管理耳号 allEarNumbers: [], // 修改处:改为数组
factory: null, // 厂区 factory: null,
classes: null // 班次 classes: null
}) })
const dateRange = ref([]) // 新增:日期范围变量 const dateRange = ref([])
const tableData = ref([]) // 表格数据 const tableData = ref([])
const total = ref(0) // 总数据条数 const total = ref(0)
const loading = ref(false) // 加载状态 const loading = ref(false)
const openImport = ref(false) // 导入弹窗显示状态 const openImport = ref(false)
const uploadUrl = import.meta.env.VITE_APP_BASE_API + '/milkProdclasses/milkProdclasses/import'; const uploadUrl = import.meta.env.VITE_APP_BASE_API + '/milkProdclasses/milkProdclasses/import';
const headers = { Authorization: 'Bearer ' + getToken() }; const headers = { Authorization: 'Bearer ' + getToken() };
// 修改处:新增耳号搜索相关方法
/** 远程搜索耳号 */
function searchEarNumber(query) {
if (query !== '') {
earNumberLoading.value = true
searchEarNumbers(query).then(response => {
earNumberOptions.value = response.data || []
earNumberLoading.value = false
}).catch(() => {
earNumberOptions.value = []
earNumberLoading.value = false
})
} else {
earNumberOptions.value = []
}
}
/** 耳号变化处理 */
function handleEarNumberChange(value) {
console.log('已选择的耳号:', value)
}
/** 清空耳号 */
function clearEarNumbers() {
queryParams.allEarNumbers = []
}
/** 移除单个耳号 */
function removeEarNumber(earNumber) {
const index = queryParams.allEarNumbers.indexOf(earNumber)
if (index > -1) {
queryParams.allEarNumbers.splice(index, 1)
}
}
function getList() { function getList() {
loading.value = true loading.value = true
// 处理日期范围参数
if (dateRange.value && dateRange.value.length === 2) { if (dateRange.value && dateRange.value.length === 2) {
queryParams.datetimeStart = dateRange.value[0]; queryParams.datetimeStart = dateRange.value[0];
queryParams.datetimeEnd = dateRange.value[1]; queryParams.datetimeEnd = dateRange.value[1];
@@ -161,11 +241,11 @@ function handleQuery() {
} }
function resetQuery() { function resetQuery() {
dateRange.value = []; // 清空日期范围 dateRange.value = [];
// 显式重置所有字段
queryParams.datetimeStart = null; queryParams.datetimeStart = null;
queryParams.datetimeEnd = null; queryParams.datetimeEnd = null;
queryParams.manageEarNo = ''; queryParams.allEarNumbers = []; // 修改处:清空数组
earNumberOptions.value = []; // 修改处:清空选项
queryParams.factory = null; queryParams.factory = null;
queryParams.classes = null; queryParams.classes = null;
queryParams.pageNum = 1; queryParams.pageNum = 1;
@@ -189,7 +269,6 @@ function uploadError(err) {
} }
function handleExport() { function handleExport() {
// 导出时同样需要处理日期参数
if (dateRange.value && dateRange.value.length === 2) { if (dateRange.value && dateRange.value.length === 2) {
queryParams.datetimeStart = dateRange.value[0]; queryParams.datetimeStart = dateRange.value[0];
queryParams.datetimeEnd = dateRange.value[1]; queryParams.datetimeEnd = dateRange.value[1];
@@ -225,3 +304,13 @@ function handleExport() {
getList(); getList();
</script> </script>
<style scoped>
/* 修改处:新增样式 */
.selected-ear-numbers {
margin-bottom: 16px;
padding: 10px;
background-color: #f5f7fa;
border-radius: 4px;
}
</style>

View File

@@ -1,9 +1,38 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :inline="true" :model="queryParams" class="filter-form"> <el-form :inline="true" :model="queryParams" ref="queryRef" class="filter-form">
<el-form-item label="耳号"> <el-form-item label="耳号" prop="allEarNumbers">
<el-input v-model="queryParams.manageEarTag" placeholder="请输入耳号" clearable /> <el-select
v-model="queryParams.allEarNumbers"
multiple
filterable
remote
reserve-keyword
placeholder="输入耳号搜索"
:remote-method="searchEarNumber"
:loading="earNumberLoading"
allow-create
default-first-option
style="width: 300px"
@change="handleEarNumberChange"
>
<el-option
v-for="item in earNumberOptions"
:key="item"
:label="item"
:value="item"
/>
</el-select>
<el-button
type="text"
@click="clearEarNumbers"
v-if="queryParams.allEarNumbers && queryParams.allEarNumbers.length > 0"
style="margin-left: 10px"
>
清空
</el-button>
</el-form-item> </el-form-item>
<el-form-item label="筛选天数"> <el-form-item label="筛选天数">
<el-input-number v-model="queryParams.screenDays" :min="1" placeholder="请输入天数" /> <el-input-number v-model="queryParams.screenDays" :min="1" placeholder="请输入天数" />
</el-form-item> </el-form-item>
@@ -13,6 +42,19 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<div v-if="queryParams.allEarNumbers && queryParams.allEarNumbers.length > 0" class="selected-ear-numbers">
<span style="margin-right: 10px; color: #606266;">已选择耳号</span>
<el-tag
v-for="earNumber in queryParams.allEarNumbers"
:key="earNumber"
closable
@close="removeEarNumber(earNumber)"
style="margin-right: 8px;"
>
{{ earNumber }}
</el-tag>
</div>
<div class="button-group"> <div class="button-group">
<el-popover placement="bottom" width="400" trigger="click"> <el-popover placement="bottom" width="400" trigger="click">
<el-checkbox-group v-model="selectedFields" class="checkbox-columns"> <el-checkbox-group v-model="selectedFields" class="checkbox-columns">
@@ -51,7 +93,8 @@
</template> </template>
<script> <script>
import { listSheepMilkAnalysis } from "@/api/dairyProducts/sheepMilkAnalysis/sheepMilkAnalysis.js"; // 修改处:导入 searchEarNumbers
import { listSheepMilkAnalysis, searchEarNumbers } from "@/api/dairyProducts/sheepMilkAnalysis/sheepMilkAnalysis.js";
import { format } from 'date-fns'; import { format } from 'date-fns';
import * as XLSX from 'xlsx'; // 导入xlsx库 import * as XLSX from 'xlsx'; // 导入xlsx库
@@ -62,14 +105,17 @@ export default {
loading: false, loading: false,
total: 0, total: 0,
list: [], list: [],
// 修改处:新增耳号搜索相关状态
earNumberOptions: [],
earNumberLoading: false,
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 20, // 修改默认每页条数 pageSize: 20,
manageEarTag: null, allEarNumbers: [], // 修改:改为数组
screenDays: 100 // 默认筛选天数 screenDays: 100
}, },
selectedFields: [], selectedFields: [],
// 修改:为数字字段添加 sortable: true
allColumns: [ allColumns: [
{ label: "耳号", prop: "manageEarTag" }, { label: "耳号", prop: "manageEarTag" },
{ label: "品种", prop: "variety" }, { label: "品种", prop: "variety" },
@@ -122,6 +168,41 @@ export default {
} }
}, },
methods: { methods: {
// 修改处:新增耳号搜索与处理方法
/** 远程搜索耳号 */
searchEarNumber(query) {
if (query !== '') {
this.earNumberLoading = true
searchEarNumbers(query).then(response => {
this.earNumberOptions = response.data || []
this.earNumberLoading = false
}).catch(() => {
this.earNumberOptions = []
this.earNumberLoading = false
})
} else {
this.earNumberOptions = []
}
},
/** 耳号变更处理 */
handleEarNumberChange(value) {
// 可选:添加日志或额外逻辑
},
/** 清空所有耳号 */
clearEarNumbers() {
this.queryParams.allEarNumbers = []
},
/** 移除单个耳号 */
removeEarNumber(earNumber) {
const index = this.queryParams.allEarNumbers.indexOf(earNumber)
if (index > -1) {
this.queryParams.allEarNumbers.splice(index, 1)
}
},
getList() { getList() {
this.loading = true; this.loading = true;
listSheepMilkAnalysis(this.queryParams).then(response => { listSheepMilkAnalysis(this.queryParams).then(response => {
@@ -139,9 +220,10 @@ export default {
this.queryParams = { this.queryParams = {
pageNum: 1, pageNum: 1,
pageSize: 20, pageSize: 20,
manageEarTag: null, allEarNumbers: [], // 修改:重置为空数组
screenDays: 100 screenDays: 100
}; };
this.earNumberOptions = []; // 修改:清空选项
this.selectedFields = this.allColumns.map(c => c.prop); this.selectedFields = this.allColumns.map(c => c.prop);
this.getList(); this.getList();
}, },
@@ -199,4 +281,11 @@ export default {
max-height: 300px; max-height: 300px;
overflow-y: auto; overflow-y: auto;
} }
/* 修改处:新增样式 */
.selected-ear-numbers {
margin-bottom: 16px;
padding: 10px;
background-color: #f5f7fa;
border-radius: 4px;
}
</style> </style>