Compare commits

..

2 Commits

Author SHA1 Message Date
ll
df88846432 Merge branch 'main' of http://118.182.97.76:3000/admin/zhyc-sheep-ui 2026-01-19 20:40:25 +08:00
ll
c6be490aa2 多耳号查询与模糊查询 2026-01-19 20:40:15 +08:00
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) {
return request({
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) {
return request({

View File

@@ -12,8 +12,36 @@
clearable />
</el-form-item>
<el-form-item label="管理耳号">
<el-input v-model="queryParams.manageEarNo" placeholder="请输入管理耳号" clearable />
<el-form-item label="管理耳号" prop="allEarNumbers">
<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 label="厂区">
@@ -39,6 +67,19 @@
</el-form-item>
</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-col :span="1.5">
<el-button type="info" plain @click="handleImport" v-hasPermi="['milkProdclasses:milkProdclasses:import']">
@@ -94,7 +135,8 @@
<script setup>
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 { getRanchList } from '@/api/dairyProducts/ranch/ranch.js'
import { ElMessage } from 'element-plus'
@@ -104,6 +146,10 @@ import { parseTime } from '@/utils/ruoyi'
const { proxy } = getCurrentInstance()
const ranchOptions = ref([])
// 修改处:新增耳号搜索相关变量
const earNumberOptions = ref([])
const earNumberLoading = ref(false)
onMounted(() => {
getRanchList().then(res => {
ranchOptions.value = res.data.map(item => ({
@@ -117,26 +163,60 @@ onMounted(() => {
const queryParams = reactive({
pageNum: 1,
pageSize: 20, // 默认20条
datetimeStart: null, // 开始日期
datetimeEnd: null, // 结束日期
manageEarNo: '', // 管理耳号
factory: null, // 厂区
classes: null // 班次
pageSize: 20,
datetimeStart: null,
datetimeEnd: null,
allEarNumbers: [], // 修改处:改为数组
factory: null,
classes: null
})
const dateRange = ref([]) // 新增:日期范围变量
const tableData = ref([]) // 表格数据
const total = ref(0) // 总数据条数
const loading = ref(false) // 加载状态
const openImport = ref(false) // 导入弹窗显示状态
const dateRange = ref([])
const tableData = ref([])
const total = ref(0)
const loading = ref(false)
const openImport = ref(false)
const uploadUrl = import.meta.env.VITE_APP_BASE_API + '/milkProdclasses/milkProdclasses/import';
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() {
loading.value = true
// 处理日期范围参数
if (dateRange.value && dateRange.value.length === 2) {
queryParams.datetimeStart = dateRange.value[0];
queryParams.datetimeEnd = dateRange.value[1];
@@ -161,11 +241,11 @@ function handleQuery() {
}
function resetQuery() {
dateRange.value = []; // 清空日期范围
// 显式重置所有字段
dateRange.value = [];
queryParams.datetimeStart = null;
queryParams.datetimeEnd = null;
queryParams.manageEarNo = '';
queryParams.allEarNumbers = []; // 修改处:清空数组
earNumberOptions.value = []; // 修改处:清空选项
queryParams.factory = null;
queryParams.classes = null;
queryParams.pageNum = 1;
@@ -189,7 +269,6 @@ function uploadError(err) {
}
function handleExport() {
// 导出时同样需要处理日期参数
if (dateRange.value && dateRange.value.length === 2) {
queryParams.datetimeStart = dateRange.value[0];
queryParams.datetimeEnd = dateRange.value[1];
@@ -224,4 +303,14 @@ function handleExport() {
}
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>
<div class="app-container">
<el-form :inline="true" :model="queryParams" class="filter-form">
<el-form-item label="耳号">
<el-input v-model="queryParams.manageEarTag" placeholder="请输入耳号" clearable />
<el-form :inline="true" :model="queryParams" ref="queryRef" class="filter-form">
<el-form-item label="耳号" prop="allEarNumbers">
<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 label="筛选天数">
<el-input-number v-model="queryParams.screenDays" :min="1" placeholder="请输入天数" />
</el-form-item>
@@ -13,6 +42,19 @@
</el-form-item>
</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">
<el-popover placement="bottom" width="400" trigger="click">
<el-checkbox-group v-model="selectedFields" class="checkbox-columns">
@@ -51,7 +93,8 @@
</template>
<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 * as XLSX from 'xlsx'; // 导入xlsx库
@@ -62,14 +105,17 @@ export default {
loading: false,
total: 0,
list: [],
// 修改处:新增耳号搜索相关状态
earNumberOptions: [],
earNumberLoading: false,
queryParams: {
pageNum: 1,
pageSize: 20, // 修改默认每页条数
manageEarTag: null,
screenDays: 100 // 默认筛选天数
pageSize: 20,
allEarNumbers: [], // 修改:改为数组
screenDays: 100
},
selectedFields: [],
// 修改:为数字字段添加 sortable: true
allColumns: [
{ label: "耳号", prop: "manageEarTag" },
{ label: "品种", prop: "variety" },
@@ -122,6 +168,41 @@ export default {
}
},
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() {
this.loading = true;
listSheepMilkAnalysis(this.queryParams).then(response => {
@@ -139,9 +220,10 @@ export default {
this.queryParams = {
pageNum: 1,
pageSize: 20,
manageEarTag: null,
allEarNumbers: [], // 修改:重置为空数组
screenDays: 100
};
this.earNumberOptions = []; // 修改:清空选项
this.selectedFields = this.allColumns.map(c => c.prop);
this.getList();
},
@@ -199,4 +281,11 @@ export default {
max-height: 300px;
overflow-y: auto;
}
/* 修改处:新增样式 */
.selected-ear-numbers {
margin-bottom: 16px;
padding: 10px;
background-color: #f5f7fa;
border-radius: 4px;
}
</style>