From 1d821764fd590cc443ebd590f8883bd656626bb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BC=82=E6=B3=8A?= <1913856125@qq.com> Date: Tue, 27 Jan 2026 23:41:51 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E7=94=9F=E7=89=A9=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E5=A4=9A=E7=BE=8A=E5=8F=AA=E8=80=B3=E5=8F=B7=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/common/sheep.js | 10 + src/views/biosafety/deworm/index.vue | 253 +++++++++++++++++++- src/views/biosafety/diagnosis/index.vue | 254 +++++++++++++++++++- src/views/biosafety/health/index.vue | 253 +++++++++++++++++++- src/views/biosafety/immunity/index.vue | 254 +++++++++++++++++++- src/views/biosafety/quarantine/index.vue | 254 +++++++++++++++++++- src/views/biosafety/treatment/index.vue | 252 +++++++++++++++++++- src/views/biosafety/usageInfo/index.vue | 256 ++++++++++++++++++++- src/views/feed/FeedStatistic/index.vue | 2 +- src/views/feed/FormulaManagement/index.vue | 4 +- src/views/feed/material/index.vue | 2 +- 11 files changed, 1768 insertions(+), 26 deletions(-) create mode 100644 src/api/common/sheep.js diff --git a/src/api/common/sheep.js b/src/api/common/sheep.js new file mode 100644 index 0000000..8dcdb81 --- /dev/null +++ b/src/api/common/sheep.js @@ -0,0 +1,10 @@ +import request from '@/utils/request' + +// 模糊查询母羊耳号列表 +export function searchEarNumbers(query) { + return request({ + url: '/sheep/sheep/earNumbers', + method: 'get', + params: { query } + }) +} diff --git a/src/views/biosafety/deworm/index.vue b/src/views/biosafety/deworm/index.vue index bb4d54a..8581e40 100644 --- a/src/views/biosafety/deworm/index.vue +++ b/src/views/biosafety/deworm/index.vue @@ -2,9 +2,70 @@
- - + +
+ + + + + + + + + + + + + + + + 已选: {{ queryParams.allEarNumbers.length }} 个 + + + + + + 清空全部 + + +
+ + + +
+ + + {{ tag }} + + + + + + {{ isExpanded ? '收起' : `展开剩余 ${queryParams.allEarNumbers.length - defaultShowCount} 个` }} + + + + + + +
+
+ + @@ -261,8 +322,6 @@
- - @@ -283,6 +342,7 @@ import { listUnit } from '@/api/biosafety/unit' import { listUsage } from '@/api/biosafety/usage' import { listMedicine } from '@/api/biosafety/medicine' + import { searchEarNumbers } from '@/api/common/sheep' import request from '@/utils/request' import { parseTime } from '@/utils/ruoyi' @@ -301,10 +361,151 @@ pageSize: 20, sheepNo: null, technical: null, + orderByColumn: null, // 新增 isAsc: null // 新增 }) + // 响应式数据 + const pasteInput = ref('') // 批量粘贴输入框 + const earNumberOptions = ref([]) // 耳号下拉选项 + const earNumberLoading = ref(false) // 耳号加载状态 + const isExpanded = ref(false) // 控制耳号展开/折叠状态 + const defaultShowCount = 2 // 默认显示的耳号数量 + + // 计算属性:控制显示的耳号列表 + const displayedEarNumbers = computed(() => { + if (!queryParams.allEarNumbers || queryParams.allEarNumbers.length === 0) { + return [] + } + + // 如果展开或总数<=2,显示全部;否则只显示前2个 + if (isExpanded.value || queryParams.allEarNumbers.length <= defaultShowCount) { + return queryParams.allEarNumbers + } else { + return queryParams.allEarNumbers.slice(0, defaultShowCount) + } + }) + /** 处理粘贴事件 */ + function handlePaste(event) { + nextTick(() => { + handlePasteSubmit() + }) + } + + /** 处理粘贴内容提交 */ + function handlePasteSubmit() { + if (!pasteInput.value || pasteInput.value.trim() === '') { + return + } + + // 支持多种分隔符: 空格、换行、逗号、制表符 + const separators = /[\s,,\n\r\t]+/ + const earNumbers = pasteInput.value + .trim() + .split(separators) + .filter(item => item.trim() !== '') + .map(item => item.trim()) + + if (earNumbers.length === 0) { + return + } + + // 去重并添加到已选列表 + const existingSet = new Set(queryParams.value.allEarNumbers || []) + const newEarNumbers = [] + const duplicates = [] + + earNumbers.forEach(earNumber => { + if (!existingSet.has(earNumber)) { + newEarNumbers.push(earNumber) + existingSet.add(earNumber) + } else { + duplicates.push(earNumber) + } + }) + + // 添加新耳号 + if (newEarNumbers.length > 0) { + queryParams.value.allEarNumbers = [ + ...(queryParams.value.allEarNumbers || []), + ...newEarNumbers + ] + + const message = `成功添加 ${newEarNumbers.length} 个耳号,当前共 ${queryParams.value.allEarNumbers.length} 个` + + (duplicates.length > 0 ? `,已忽略 ${duplicates.length} 个重复耳号` : '') + + proxy.$modal.msgSuccess(message) + } else if (duplicates.length > 0) { + proxy.$modal.msgWarning(`所有耳号均已存在,当前共 ${queryParams.value.allEarNumbers.length} 个`) + } + + // 清空输入框 + pasteInput.value = '' + } + + /** 远程搜索耳号 */ + function searchEarNumber(query) { + if (query !== '') { + earNumberLoading.value = true + + const queries = query.trim().split(/[\s,,]+/).filter(q => q) + + if (queries.length === 1) { + // 单个耳号模糊搜索 + searchEarNumbers(query).then(response => { + earNumberOptions.value = response.data || [] + earNumberLoading.value = false + }).catch(() => { + earNumberOptions.value = [] + earNumberLoading.value = false + }) + } else { + // 多个耳号直接作为选项 + earNumberOptions.value = queries + earNumberLoading.value = false + } + } else { + earNumberOptions.value = [] + } + } + + /** 耳号选择变化处理 */ + function handleEarNumberChange(value) { + queryParams.value.allEarNumbers = [...new Set(value)] + console.log(`已选择 ${queryParams.value.allEarNumbers.length} 个耳号:`, queryParams.value.allEarNumbers) + } + + /** 切换展开/收起状态 */ + function toggleExpand() { + isExpanded.value = !isExpanded.value + } + + /** 移除单个耳号 */ + function handleRemoveEarNumber(tag) { + const index = queryParams.value.allEarNumbers.indexOf(tag) + if (index > -1) { + queryParams.value.allEarNumbers.splice(index, 1) + proxy.$modal.msgSuccess('已移除该耳号') + } + + // 如果删除后剩余<=2个,自动收起 + if (queryParams.value.allEarNumbers.length <= defaultShowCount) { + isExpanded.value = false + } + } + + /** 清空所有耳号 */ + function clearAllEarNumbers() { + proxy.$modal.confirm('确定要清空所有已选择的耳号吗?').then(() => { + queryParams.value.allEarNumbers = [] + pasteInput.value = '' + earNumberOptions.value = [] + isExpanded.value = false // 重置展开状态 + proxy.$modal.msgSuccess('已清空所有耳号') + }).catch(() => { }) + } + const ids = ref([]) const single = ref(true) const multiple = ref(true) @@ -547,4 +748,46 @@ medicines.value = res.rows.map(item => ({ value: item.id, label: item.name })) }) }) - \ No newline at end of file + + diff --git a/src/views/biosafety/diagnosis/index.vue b/src/views/biosafety/diagnosis/index.vue index 314dc73..72dd0d8 100644 --- a/src/views/biosafety/diagnosis/index.vue +++ b/src/views/biosafety/diagnosis/index.vue @@ -2,9 +2,72 @@
- + + +
+ + + + + + + + + + + + + + + + 已选: {{ queryParams.allEarNumbers.length }} 个 + + + + + + 清空全部 + + +
+ + + +
+ + + {{ tag }} + + + + + + {{ isExpanded ? '收起' : `展开剩余 ${queryParams.allEarNumbers.length - defaultShowCount} 个` }} + + + + + + +
+ +
+ + @@ -210,6 +273,7 @@ import { import { listSheepfold_management } from '@/api/fileManagement/sheepfold_management' import { listDisease } from '@/api/biosafety/disease' import { getCurrentInstance, onMounted, ref, watch } from 'vue' +import { searchEarNumbers } from '@/api/common/sheep' /* ---------- 基础依赖 ---------- */ const { proxy } = getCurrentInstance() @@ -230,6 +294,7 @@ const queryParams = ref({ pageNum: 1, pageSize: 20, sheepNo: null, + allEarNumbers: null, datetime: null, diseasePid: null, diseaseId: null, @@ -273,6 +338,146 @@ const rules = { ], } +// 响应式数据 +const pasteInput = ref('') // 批量粘贴输入框 +const earNumberOptions = ref([]) // 耳号下拉选项 +const earNumberLoading = ref(false) // 耳号加载状态 +const isExpanded = ref(false) // 控制耳号展开/折叠状态 +const defaultShowCount = 2 // 默认显示的耳号数量 + +// 计算属性:控制显示的耳号列表 +const displayedEarNumbers = computed(() => { + if (!queryParams.allEarNumbers || queryParams.allEarNumbers.length === 0) { + return [] + } + + // 如果展开或总数<=2,显示全部;否则只显示前2个 + if (isExpanded.value || queryParams.allEarNumbers.length <= defaultShowCount) { + return queryParams.allEarNumbers + } else { + return queryParams.allEarNumbers.slice(0, defaultShowCount) + } +}) +/** 处理粘贴事件 */ +function handlePaste(event) { + nextTick(() => { + handlePasteSubmit() + }) +} + +/** 处理粘贴内容提交 */ +function handlePasteSubmit() { + if (!pasteInput.value || pasteInput.value.trim() === '') { + return + } + + // 支持多种分隔符: 空格、换行、逗号、制表符 + const separators = /[\s,,\n\r\t]+/ + const earNumbers = pasteInput.value + .trim() + .split(separators) + .filter(item => item.trim() !== '') + .map(item => item.trim()) + + if (earNumbers.length === 0) { + return + } + + // 去重并添加到已选列表 + const existingSet = new Set(queryParams.value.allEarNumbers || []) + const newEarNumbers = [] + const duplicates = [] + + earNumbers.forEach(earNumber => { + if (!existingSet.has(earNumber)) { + newEarNumbers.push(earNumber) + existingSet.add(earNumber) + } else { + duplicates.push(earNumber) + } + }) + + // 添加新耳号 + if (newEarNumbers.length > 0) { + queryParams.value.allEarNumbers = [ + ...(queryParams.value.allEarNumbers || []), + ...newEarNumbers + ] + + const message = `成功添加 ${newEarNumbers.length} 个耳号,当前共 ${queryParams.value.allEarNumbers.length} 个` + + (duplicates.length > 0 ? `,已忽略 ${duplicates.length} 个重复耳号` : '') + + proxy.$modal.msgSuccess(message) + } else if (duplicates.length > 0) { + proxy.$modal.msgWarning(`所有耳号均已存在,当前共 ${queryParams.value.allEarNumbers.length} 个`) + } + + // 清空输入框 + pasteInput.value = '' +} + +/** 远程搜索耳号 */ +function searchEarNumber(query) { + if (query !== '') { + earNumberLoading.value = true + + const queries = query.trim().split(/[\s,,]+/).filter(q => q) + + if (queries.length === 1) { + // 单个耳号模糊搜索 + searchEarNumbers(query).then(response => { + earNumberOptions.value = response.data || [] + earNumberLoading.value = false + }).catch(() => { + earNumberOptions.value = [] + earNumberLoading.value = false + }) + } else { + // 多个耳号直接作为选项 + earNumberOptions.value = queries + earNumberLoading.value = false + } + } else { + earNumberOptions.value = [] + } +} + +/** 耳号选择变化处理 */ +function handleEarNumberChange(value) { + queryParams.value.allEarNumbers = [...new Set(value)] + console.log(`已选择 ${queryParams.value.allEarNumbers.length} 个耳号:`, queryParams.value.allEarNumbers) +} + +/** 切换展开/收起状态 */ +function toggleExpand() { + isExpanded.value = !isExpanded.value +} + +/** 移除单个耳号 */ +function handleRemoveEarNumber(tag) { + const index = queryParams.value.allEarNumbers.indexOf(tag) + if (index > -1) { + queryParams.value.allEarNumbers.splice(index, 1) + proxy.$modal.msgSuccess('已移除该耳号') + } + + // 如果删除后剩余<=2个,自动收起 + if (queryParams.value.allEarNumbers.length <= defaultShowCount) { + isExpanded.value = false + } +} + +/** 清空所有耳号 */ +function clearAllEarNumbers() { + proxy.$modal.confirm('确定要清空所有已选择的耳号吗?').then(() => { + queryParams.value.allEarNumbers = [] + pasteInput.value = '' + earNumberOptions.value = [] + isExpanded.value = false // 重置展开状态 + proxy.$modal.msgSuccess('已清空所有耳号') + }).catch(() => { }) +} + /* ---------- 下拉数据源 ---------- */ const pDiseaseOptions = ref([]) const cDiseaseOptions = ref([]) @@ -450,4 +655,47 @@ onMounted(() => { })) }) }) - \ No newline at end of file + + + diff --git a/src/views/biosafety/health/index.vue b/src/views/biosafety/health/index.vue index 918cc08..e0ab762 100644 --- a/src/views/biosafety/health/index.vue +++ b/src/views/biosafety/health/index.vue @@ -2,9 +2,72 @@
- + + +
+ + + + + + + + + + + + + + + + 已选: {{ queryParams.allEarNumbers.length }} 个 + + + + + + 清空全部 + + +
+ + + +
+ + + {{ tag }} + + + + + + {{ isExpanded ? '收起' : `展开剩余 ${queryParams.allEarNumbers.length - defaultShowCount} 个` }} + + + + + + +
+ +
+ + @@ -288,6 +351,7 @@ import { listUsage } from '@/api/biosafety/usage' import { listMedicine } from '@/api/biosafety/medicine' import request from '@/utils/request' import { parseTime } from '@/utils/ruoyi' +import { searchEarNumbers } from '@/api/common/sheep' const { proxy } = getCurrentInstance() const { sheep_gender } = proxy.useDict('sheep_gender') @@ -303,11 +367,152 @@ const queryParams = reactive({ pageNum: 1, pageSize: 20, sheepNo: null, + allEarNumbers: [], // 修改:改为数组,支持多耳号 technical: null, orderByColumn: null, // 新增 isAsc: null // 新增 }) +// 响应式数据 +const pasteInput = ref('') // 批量粘贴输入框 +const earNumberOptions = ref([]) // 耳号下拉选项 +const earNumberLoading = ref(false) // 耳号加载状态 +const isExpanded = ref(false) // 控制耳号展开/折叠状态 +const defaultShowCount = 2 // 默认显示的耳号数量 + +// 计算属性:控制显示的耳号列表 +const displayedEarNumbers = computed(() => { + if (!queryParams.allEarNumbers || queryParams.allEarNumbers.length === 0) { + return [] + } + + // 如果展开或总数<=2,显示全部;否则只显示前2个 + if (isExpanded.value || queryParams.allEarNumbers.length <= defaultShowCount) { + return queryParams.allEarNumbers + } else { + return queryParams.allEarNumbers.slice(0, defaultShowCount) + } +}) +/** 处理粘贴事件 */ +function handlePaste(event) { + nextTick(() => { + handlePasteSubmit() + }) +} + +/** 处理粘贴内容提交 */ +function handlePasteSubmit() { + if (!pasteInput.value || pasteInput.value.trim() === '') { + return + } + + // 支持多种分隔符: 空格、换行、逗号、制表符 + const separators = /[\s,,\n\r\t]+/ + const earNumbers = pasteInput.value + .trim() + .split(separators) + .filter(item => item.trim() !== '') + .map(item => item.trim()) + + if (earNumbers.length === 0) { + return + } + + // 去重并添加到已选列表 + const existingSet = new Set(queryParams.value.allEarNumbers || []) + const newEarNumbers = [] + const duplicates = [] + + earNumbers.forEach(earNumber => { + if (!existingSet.has(earNumber)) { + newEarNumbers.push(earNumber) + existingSet.add(earNumber) + } else { + duplicates.push(earNumber) + } + }) + + // 添加新耳号 + if (newEarNumbers.length > 0) { + queryParams.value.allEarNumbers = [ + ...(queryParams.value.allEarNumbers || []), + ...newEarNumbers + ] + + const message = `成功添加 ${newEarNumbers.length} 个耳号,当前共 ${queryParams.value.allEarNumbers.length} 个` + + (duplicates.length > 0 ? `,已忽略 ${duplicates.length} 个重复耳号` : '') + + proxy.$modal.msgSuccess(message) + } else if (duplicates.length > 0) { + proxy.$modal.msgWarning(`所有耳号均已存在,当前共 ${queryParams.value.allEarNumbers.length} 个`) + } + + // 清空输入框 + pasteInput.value = '' +} + +/** 远程搜索耳号 */ +function searchEarNumber(query) { + if (query !== '') { + earNumberLoading.value = true + + const queries = query.trim().split(/[\s,,]+/).filter(q => q) + + if (queries.length === 1) { + // 单个耳号模糊搜索 + searchEarNumbers(query).then(response => { + earNumberOptions.value = response.data || [] + earNumberLoading.value = false + }).catch(() => { + earNumberOptions.value = [] + earNumberLoading.value = false + }) + } else { + // 多个耳号直接作为选项 + earNumberOptions.value = queries + earNumberLoading.value = false + } + } else { + earNumberOptions.value = [] + } +} + +/** 耳号选择变化处理 */ +function handleEarNumberChange(value) { + queryParams.value.allEarNumbers = [...new Set(value)] + console.log(`已选择 ${queryParams.value.allEarNumbers.length} 个耳号:`, queryParams.value.allEarNumbers) +} + +/** 切换展开/收起状态 */ +function toggleExpand() { + isExpanded.value = !isExpanded.value +} + +/** 移除单个耳号 */ +function handleRemoveEarNumber(tag) { + const index = queryParams.value.allEarNumbers.indexOf(tag) + if (index > -1) { + queryParams.value.allEarNumbers.splice(index, 1) + proxy.$modal.msgSuccess('已移除该耳号') + } + + // 如果删除后剩余<=2个,自动收起 + if (queryParams.value.allEarNumbers.length <= defaultShowCount) { + isExpanded.value = false + } +} + +/** 清空所有耳号 */ +function clearAllEarNumbers() { + proxy.$modal.confirm('确定要清空所有已选择的耳号吗?').then(() => { + queryParams.value.allEarNumbers = [] + pasteInput.value = '' + earNumberOptions.value = [] + isExpanded.value = false // 重置展开状态 + proxy.$modal.msgSuccess('已清空所有耳号') + }).catch(() => { }) +} + const ids = ref([]) const single = ref(true) const multiple = ref(true) @@ -550,4 +755,46 @@ onMounted(() => { medicines.value = res.rows.map(item => ({ value: item.id, label: item.name })) }) }) - \ No newline at end of file + + diff --git a/src/views/biosafety/immunity/index.vue b/src/views/biosafety/immunity/index.vue index a025b19..d0c7826 100644 --- a/src/views/biosafety/immunity/index.vue +++ b/src/views/biosafety/immunity/index.vue @@ -2,13 +2,75 @@
+ +
+ + + + + + + + + + + + + + + + 已选: {{ queryParams.allEarNumbers.length }} 个 + + + + + + 清空全部 + + +
+ + + +
+ + + {{ tag }} + + + + + + {{ isExpanded ? '收起' : `展开剩余 ${queryParams.allEarNumbers.length - defaultShowCount} 个` }} + + + + + + +
+ +
+ - + @@ -286,6 +348,7 @@ import { listUsage } from '@/api/biosafety/usage' import { listMedicine } from '@/api/biosafety/medicine' import request from '@/utils/request' import { parseTime } from '@/utils/ruoyi' +import { searchEarNumbers } from '@/api/common/sheep' const { proxy } = getCurrentInstance() const { sheep_gender } = proxy.useDict('sheep_gender') @@ -301,11 +364,153 @@ const queryParams = reactive({ pageNum: 1, pageSize: 20, sheepNo: null, + allEarNumbers: [], // 修改:改为数组,支持多耳号 technical: null, orderByColumn: null, // 新增 isAsc: null // 新增 }) +// 响应式数据 +const pasteInput = ref('') // 批量粘贴输入框 +const earNumberOptions = ref([]) // 耳号下拉选项 +const earNumberLoading = ref(false) // 耳号加载状态 +const isExpanded = ref(false) // 控制耳号展开/折叠状态 +const defaultShowCount = 2 // 默认显示的耳号数量 + +// 计算属性:控制显示的耳号列表 +const displayedEarNumbers = computed(() => { + if (!queryParams.allEarNumbers || queryParams.allEarNumbers.length === 0) { + return [] + } + + // 如果展开或总数<=2,显示全部;否则只显示前2个 + if (isExpanded.value || queryParams.allEarNumbers.length <= defaultShowCount) { + return queryParams.allEarNumbers + } else { + return queryParams.allEarNumbers.slice(0, defaultShowCount) + } +}) +/** 处理粘贴事件 */ +function handlePaste(event) { + nextTick(() => { + handlePasteSubmit() + }) +} + +/** 处理粘贴内容提交 */ +function handlePasteSubmit() { + if (!pasteInput.value || pasteInput.value.trim() === '') { + return + } + + // 支持多种分隔符: 空格、换行、逗号、制表符 + const separators = /[\s,,\n\r\t]+/ + const earNumbers = pasteInput.value + .trim() + .split(separators) + .filter(item => item.trim() !== '') + .map(item => item.trim()) + + if (earNumbers.length === 0) { + return + } + + // 去重并添加到已选列表 + const existingSet = new Set(queryParams.value.allEarNumbers || []) + const newEarNumbers = [] + const duplicates = [] + + earNumbers.forEach(earNumber => { + if (!existingSet.has(earNumber)) { + newEarNumbers.push(earNumber) + existingSet.add(earNumber) + } else { + duplicates.push(earNumber) + } + }) + + // 添加新耳号 + if (newEarNumbers.length > 0) { + queryParams.value.allEarNumbers = [ + ...(queryParams.value.allEarNumbers || []), + ...newEarNumbers + ] + + const message = `成功添加 ${newEarNumbers.length} 个耳号,当前共 ${queryParams.value.allEarNumbers.length} 个` + + (duplicates.length > 0 ? `,已忽略 ${duplicates.length} 个重复耳号` : '') + + proxy.$modal.msgSuccess(message) + } else if (duplicates.length > 0) { + proxy.$modal.msgWarning(`所有耳号均已存在,当前共 ${queryParams.value.allEarNumbers.length} 个`) + } + + // 清空输入框 + pasteInput.value = '' +} + +/** 远程搜索耳号 */ +function searchEarNumber(query) { + if (query !== '') { + earNumberLoading.value = true + + const queries = query.trim().split(/[\s,,]+/).filter(q => q) + + if (queries.length === 1) { + // 单个耳号模糊搜索 + searchEarNumbers(query).then(response => { + earNumberOptions.value = response.data || [] + earNumberLoading.value = false + }).catch(() => { + earNumberOptions.value = [] + earNumberLoading.value = false + }) + } else { + // 多个耳号直接作为选项 + earNumberOptions.value = queries + earNumberLoading.value = false + } + } else { + earNumberOptions.value = [] + } +} + +/** 耳号选择变化处理 */ +function handleEarNumberChange(value) { + queryParams.value.allEarNumbers = [...new Set(value)] + console.log(`已选择 ${queryParams.value.allEarNumbers.length} 个耳号:`, queryParams.value.allEarNumbers) +} + +/** 切换展开/收起状态 */ +function toggleExpand() { + isExpanded.value = !isExpanded.value +} + +/** 移除单个耳号 */ +function handleRemoveEarNumber(tag) { + const index = queryParams.value.allEarNumbers.indexOf(tag) + if (index > -1) { + queryParams.value.allEarNumbers.splice(index, 1) + proxy.$modal.msgSuccess('已移除该耳号') + } + + // 如果删除后剩余<=2个,自动收起 + if (queryParams.value.allEarNumbers.length <= defaultShowCount) { + isExpanded.value = false + } +} + +/** 清空所有耳号 */ +function clearAllEarNumbers() { + proxy.$modal.confirm('确定要清空所有已选择的耳号吗?').then(() => { + queryParams.value.allEarNumbers = [] + pasteInput.value = '' + earNumberOptions.value = [] + isExpanded.value = false // 重置展开状态 + proxy.$modal.msgSuccess('已清空所有耳号') + }).catch(() => { }) +} + + const ids = ref([]) const single = ref(true) const multiple = ref(true) @@ -548,4 +753,47 @@ onMounted(() => { medicines.value = res.rows.map(item => ({ value: item.id, label: item.name })) }) }) - \ No newline at end of file + + + diff --git a/src/views/biosafety/quarantine/index.vue b/src/views/biosafety/quarantine/index.vue index 2d0b0db..a273d71 100644 --- a/src/views/biosafety/quarantine/index.vue +++ b/src/views/biosafety/quarantine/index.vue @@ -2,9 +2,71 @@
- + +
+ + + + + + + + + + + + + + + + 已选: {{ queryParams.allEarNumbers.length }} 个 + + + + + + 清空全部 + + +
+ + + +
+ + + {{ tag }} + + + + + + {{ isExpanded ? '收起' : `展开剩余 ${queryParams.allEarNumbers.length - defaultShowCount} 个` }} + + + + + + +
+ +
+ + @@ -300,6 +362,7 @@ import { listSample } from '@/api/biosafety/sample' import request from '@/utils/request' import { parseTime } from '@/utils/ruoyi' import { useRouter } from 'vue-router' +import { searchEarNumbers } from '@/api/common/sheep' const { proxy } = getCurrentInstance() const { quar_result, quar_status, sheep_gender } = proxy.useDict( @@ -321,10 +384,152 @@ const queryParams = reactive({ pageNum: 1, pageSize: 20, sheepId: null, + allEarNumbers: [], // 修改:改为数组,支持多耳号 orderByColumn: null, // 新增 isAsc: null // 新增 }) + +// 响应式数据 +const pasteInput = ref('') // 批量粘贴输入框 +const earNumberOptions = ref([]) // 耳号下拉选项 +const earNumberLoading = ref(false) // 耳号加载状态 +const isExpanded = ref(false) // 控制耳号展开/折叠状态 +const defaultShowCount = 2 // 默认显示的耳号数量 + +// 计算属性:控制显示的耳号列表 +const displayedEarNumbers = computed(() => { + if (!queryParams.allEarNumbers || queryParams.allEarNumbers.length === 0) { + return [] + } + + // 如果展开或总数<=2,显示全部;否则只显示前2个 + if (isExpanded.value || queryParams.allEarNumbers.length <= defaultShowCount) { + return queryParams.allEarNumbers + } else { + return queryParams.allEarNumbers.slice(0, defaultShowCount) + } +}) +/** 处理粘贴事件 */ +function handlePaste(event) { + nextTick(() => { + handlePasteSubmit() + }) +} + +/** 处理粘贴内容提交 */ +function handlePasteSubmit() { + if (!pasteInput.value || pasteInput.value.trim() === '') { + return + } + + // 支持多种分隔符: 空格、换行、逗号、制表符 + const separators = /[\s,,\n\r\t]+/ + const earNumbers = pasteInput.value + .trim() + .split(separators) + .filter(item => item.trim() !== '') + .map(item => item.trim()) + + if (earNumbers.length === 0) { + return + } + + // 去重并添加到已选列表 + const existingSet = new Set(queryParams.value.allEarNumbers || []) + const newEarNumbers = [] + const duplicates = [] + + earNumbers.forEach(earNumber => { + if (!existingSet.has(earNumber)) { + newEarNumbers.push(earNumber) + existingSet.add(earNumber) + } else { + duplicates.push(earNumber) + } + }) + + // 添加新耳号 + if (newEarNumbers.length > 0) { + queryParams.value.allEarNumbers = [ + ...(queryParams.value.allEarNumbers || []), + ...newEarNumbers + ] + + const message = `成功添加 ${newEarNumbers.length} 个耳号,当前共 ${queryParams.value.allEarNumbers.length} 个` + + (duplicates.length > 0 ? `,已忽略 ${duplicates.length} 个重复耳号` : '') + + proxy.$modal.msgSuccess(message) + } else if (duplicates.length > 0) { + proxy.$modal.msgWarning(`所有耳号均已存在,当前共 ${queryParams.value.allEarNumbers.length} 个`) + } + + // 清空输入框 + pasteInput.value = '' +} + +/** 远程搜索耳号 */ +function searchEarNumber(query) { + if (query !== '') { + earNumberLoading.value = true + + const queries = query.trim().split(/[\s,,]+/).filter(q => q) + + if (queries.length === 1) { + // 单个耳号模糊搜索 + searchEarNumbers(query).then(response => { + earNumberOptions.value = response.data || [] + earNumberLoading.value = false + }).catch(() => { + earNumberOptions.value = [] + earNumberLoading.value = false + }) + } else { + // 多个耳号直接作为选项 + earNumberOptions.value = queries + earNumberLoading.value = false + } + } else { + earNumberOptions.value = [] + } +} + +/** 耳号选择变化处理 */ +function handleEarNumberChange(value) { + queryParams.value.allEarNumbers = [...new Set(value)] + console.log(`已选择 ${queryParams.value.allEarNumbers.length} 个耳号:`, queryParams.value.allEarNumbers) +} + +/** 切换展开/收起状态 */ +function toggleExpand() { + isExpanded.value = !isExpanded.value +} + +/** 移除单个耳号 */ +function handleRemoveEarNumber(tag) { + const index = queryParams.value.allEarNumbers.indexOf(tag) + if (index > -1) { + queryParams.value.allEarNumbers.splice(index, 1) + proxy.$modal.msgSuccess('已移除该耳号') + } + + // 如果删除后剩余<=2个,自动收起 + if (queryParams.value.allEarNumbers.length <= defaultShowCount) { + isExpanded.value = false + } +} + +/** 清空所有耳号 */ +function clearAllEarNumbers() { + proxy.$modal.confirm('确定要清空所有已选择的耳号吗?').then(() => { + queryParams.value.allEarNumbers = [] + pasteInput.value = '' + earNumberOptions.value = [] + isExpanded.value = false // 重置展开状态 + proxy.$modal.msgSuccess('已清空所有耳号') + }).catch(() => { }) +} + /* 多选 */ const ids = ref([]) const single = ref(true) @@ -569,4 +774,47 @@ getItems() getSample() getBarns() getSheepType() - \ No newline at end of file + + + diff --git a/src/views/biosafety/treatment/index.vue b/src/views/biosafety/treatment/index.vue index 98b4bdd..b0911d9 100644 --- a/src/views/biosafety/treatment/index.vue +++ b/src/views/biosafety/treatment/index.vue @@ -2,9 +2,71 @@
- + +
+ + + + + + + + + + + + + + + + 已选: {{ queryParams.allEarNumbers.length }} 个 + + + + + + 清空全部 + + +
+ + + +
+ + + {{ tag }} + + + + + + {{ isExpanded ? '收起' : `展开剩余 ${queryParams.allEarNumbers.length - defaultShowCount} 个` }} + + + + + + +
+ +
+ + @@ -445,6 +507,7 @@ import { listUsage } from '@/api/biosafety/usage' import { listMedicine } from '@/api/biosafety/medicine' import request from '@/utils/request' import { useRouter } from 'vue-router' +import { searchEarNumbers } from '@/api/common/sheep' const router = useRouter() @@ -467,11 +530,153 @@ const queryParams = reactive({ pageNum: 1, pageSize: 20, sheepNo: null, + allEarNumbers: [], veterinary: null, orderByColumn: null, // 新增 isAsc: null }) +// 响应式数据 +const pasteInput = ref('') // 批量粘贴输入框 +const earNumberOptions = ref([]) // 耳号下拉选项 +const earNumberLoading = ref(false) // 耳号加载状态 +const isExpanded = ref(false) // 控制耳号展开/折叠状态 +const defaultShowCount = 2 // 默认显示的耳号数量 + +// 计算属性:控制显示的耳号列表 +const displayedEarNumbers = computed(() => { + if (!queryParams.allEarNumbers || queryParams.allEarNumbers.length === 0) { + return [] + } + + // 如果展开或总数<=2,显示全部;否则只显示前2个 + if (isExpanded.value || queryParams.allEarNumbers.length <= defaultShowCount) { + return queryParams.allEarNumbers + } else { + return queryParams.allEarNumbers.slice(0, defaultShowCount) + } +}) +/** 处理粘贴事件 */ +function handlePaste(event) { + nextTick(() => { + handlePasteSubmit() + }) +} + +/** 处理粘贴内容提交 */ +function handlePasteSubmit() { + if (!pasteInput.value || pasteInput.value.trim() === '') { + return + } + + // 支持多种分隔符: 空格、换行、逗号、制表符 + const separators = /[\s,,\n\r\t]+/ + const earNumbers = pasteInput.value + .trim() + .split(separators) + .filter(item => item.trim() !== '') + .map(item => item.trim()) + + if (earNumbers.length === 0) { + return + } + + // 去重并添加到已选列表 + const existingSet = new Set(queryParams.value.allEarNumbers || []) + const newEarNumbers = [] + const duplicates = [] + + earNumbers.forEach(earNumber => { + if (!existingSet.has(earNumber)) { + newEarNumbers.push(earNumber) + existingSet.add(earNumber) + } else { + duplicates.push(earNumber) + } + }) + + // 添加新耳号 + if (newEarNumbers.length > 0) { + queryParams.value.allEarNumbers = [ + ...(queryParams.value.allEarNumbers || []), + ...newEarNumbers + ] + + const message = `成功添加 ${newEarNumbers.length} 个耳号,当前共 ${queryParams.value.allEarNumbers.length} 个` + + (duplicates.length > 0 ? `,已忽略 ${duplicates.length} 个重复耳号` : '') + + proxy.$modal.msgSuccess(message) + } else if (duplicates.length > 0) { + proxy.$modal.msgWarning(`所有耳号均已存在,当前共 ${queryParams.value.allEarNumbers.length} 个`) + } + + // 清空输入框 + pasteInput.value = '' +} + +/** 远程搜索耳号 */ +function searchEarNumber(query) { + if (query !== '') { + earNumberLoading.value = true + + const queries = query.trim().split(/[\s,,]+/).filter(q => q) + + if (queries.length === 1) { + // 单个耳号模糊搜索 + searchEarNumbers(query).then(response => { + earNumberOptions.value = response.data || [] + earNumberLoading.value = false + }).catch(() => { + earNumberOptions.value = [] + earNumberLoading.value = false + }) + } else { + // 多个耳号直接作为选项 + earNumberOptions.value = queries + earNumberLoading.value = false + } + } else { + earNumberOptions.value = [] + } +} + +/** 耳号选择变化处理 */ +function handleEarNumberChange(value) { + queryParams.value.allEarNumbers = [...new Set(value)] + console.log(`已选择 ${queryParams.value.allEarNumbers.length} 个耳号:`, queryParams.value.allEarNumbers) +} + +/** 切换展开/收起状态 */ +function toggleExpand() { + isExpanded.value = !isExpanded.value +} + +/** 移除单个耳号 */ +function handleRemoveEarNumber(tag) { + const index = queryParams.value.allEarNumbers.indexOf(tag) + if (index > -1) { + queryParams.value.allEarNumbers.splice(index, 1) + proxy.$modal.msgSuccess('已移除该耳号') + } + + // 如果删除后剩余<=2个,自动收起 + if (queryParams.value.allEarNumbers.length <= defaultShowCount) { + isExpanded.value = false + } +} + +/** 清空所有耳号 */ +function clearAllEarNumbers() { + proxy.$modal.confirm('确定要清空所有已选择的耳号吗?').then(() => { + queryParams.value.allEarNumbers = [] + pasteInput.value = '' + earNumberOptions.value = [] + isExpanded.value = false // 重置展开状态 + proxy.$modal.msgSuccess('已清空所有耳号') + }).catch(() => { }) +} + + /* ---------- 弹窗控制 ---------- */ const addDialog = ref(false) const editDialog = ref(false) @@ -804,3 +1009,46 @@ onMounted(() => { }) }) + + diff --git a/src/views/biosafety/usageInfo/index.vue b/src/views/biosafety/usageInfo/index.vue index 6903f2e..cce7fba 100644 --- a/src/views/biosafety/usageInfo/index.vue +++ b/src/views/biosafety/usageInfo/index.vue @@ -2,9 +2,72 @@
- + + +
+ + + + + + + + + + + + + + + + 已选: {{ queryParams.allEarNumbers.length }} 个 + + + + + + 清空全部 + + +
+ + + +
+ + + {{ tag }} + + + + + + {{ isExpanded ? '收起' : `展开剩余 ${queryParams.allEarNumbers.length - defaultShowCount} 个` }} + + + + + + +
+ +
+ + { + if (!queryParams.allEarNumbers || queryParams.allEarNumbers.length === 0) { + return [] + } + + // 如果展开或总数<=2,显示全部;否则只显示前2个 + if (isExpanded.value || queryParams.allEarNumbers.length <= defaultShowCount) { + return queryParams.allEarNumbers + } else { + return queryParams.allEarNumbers.slice(0, defaultShowCount) + } +}) +/** 处理粘贴事件 */ +function handlePaste(event) { + nextTick(() => { + handlePasteSubmit() + }) +} + +/** 处理粘贴内容提交 */ +function handlePasteSubmit() { + if (!pasteInput.value || pasteInput.value.trim() === '') { + return + } + + // 支持多种分隔符: 空格、换行、逗号、制表符 + const separators = /[\s,,\n\r\t]+/ + const earNumbers = pasteInput.value + .trim() + .split(separators) + .filter(item => item.trim() !== '') + .map(item => item.trim()) + + if (earNumbers.length === 0) { + return + } + + // 去重并添加到已选列表 + const existingSet = new Set(queryParams.value.allEarNumbers || []) + const newEarNumbers = [] + const duplicates = [] + + earNumbers.forEach(earNumber => { + if (!existingSet.has(earNumber)) { + newEarNumbers.push(earNumber) + existingSet.add(earNumber) + } else { + duplicates.push(earNumber) + } + }) + + // 添加新耳号 + if (newEarNumbers.length > 0) { + queryParams.value.allEarNumbers = [ + ...(queryParams.value.allEarNumbers || []), + ...newEarNumbers + ] + + const message = `成功添加 ${newEarNumbers.length} 个耳号,当前共 ${queryParams.value.allEarNumbers.length} 个` + + (duplicates.length > 0 ? `,已忽略 ${duplicates.length} 个重复耳号` : '') + + proxy.$modal.msgSuccess(message) + } else if (duplicates.length > 0) { + proxy.$modal.msgWarning(`所有耳号均已存在,当前共 ${queryParams.value.allEarNumbers.length} 个`) + } + + // 清空输入框 + pasteInput.value = '' +} + +/** 远程搜索耳号 */ +function searchEarNumber(query) { + if (query !== '') { + earNumberLoading.value = true + + const queries = query.trim().split(/[\s,,]+/).filter(q => q) + + if (queries.length === 1) { + // 单个耳号模糊搜索 + searchEarNumbers(query).then(response => { + earNumberOptions.value = response.data || [] + earNumberLoading.value = false + }).catch(() => { + earNumberOptions.value = [] + earNumberLoading.value = false + }) + } else { + // 多个耳号直接作为选项 + earNumberOptions.value = queries + earNumberLoading.value = false + } + } else { + earNumberOptions.value = [] + } +} + +/** 耳号选择变化处理 */ +function handleEarNumberChange(value) { + queryParams.value.allEarNumbers = [...new Set(value)] + console.log(`已选择 ${queryParams.value.allEarNumbers.length} 个耳号:`, queryParams.value.allEarNumbers) +} + +/** 切换展开/收起状态 */ +function toggleExpand() { + isExpanded.value = !isExpanded.value +} + +/** 移除单个耳号 */ +function handleRemoveEarNumber(tag) { + const index = queryParams.value.allEarNumbers.indexOf(tag) + if (index > -1) { + queryParams.value.allEarNumbers.splice(index, 1) + proxy.$modal.msgSuccess('已移除该耳号') + } + + // 如果删除后剩余<=2个,自动收起 + if (queryParams.value.allEarNumbers.length <= defaultShowCount) { + isExpanded.value = false + } +} + +/** 清空所有耳号 */ +function clearAllEarNumbers() { + proxy.$modal.confirm('确定要清空所有已选择的耳号吗?').then(() => { + queryParams.value.allEarNumbers = [] + pasteInput.value = '' + earNumberOptions.value = [] + isExpanded.value = false // 重置展开状态 + proxy.$modal.msgSuccess('已清空所有耳号') + }).catch(() => { }) +} + + + const { queryParams, form, rules } = toRefs(data) const units = ref([]) @@ -293,4 +501,46 @@ getUsageOptions() .usage-detail-dialog .card-header .el-icon { margin-right: 6px; } - \ No newline at end of file + + diff --git a/src/views/feed/FeedStatistic/index.vue b/src/views/feed/FeedStatistic/index.vue index 7af6432..c82fafb 100644 --- a/src/views/feed/FeedStatistic/index.vue +++ b/src/views/feed/FeedStatistic/index.vue @@ -201,7 +201,7 @@ import { listFeedStatistic, getFeedStatistic, delFeedStatistic, addFeedStatistic, updateFeedStatistic, initFeedStatistic } from "@/api/feed/FeedStatistic" import { listFormulaManagement } from "@/api/feed/FormulaManagement" import { listSheepfold } from "@/api/produce/manage_sheep/trans_group.js"; - import { listMaterial } from "@/api/feed/material" + import { listMaterial } from "@/api/feed/Material" import { ref } from "vue"; const { proxy } = getCurrentInstance() diff --git a/src/views/feed/FormulaManagement/index.vue b/src/views/feed/FormulaManagement/index.vue index 8e12f86..12c337c 100644 --- a/src/views/feed/FormulaManagement/index.vue +++ b/src/views/feed/FormulaManagement/index.vue @@ -282,8 +282,8 @@ import { listFormulaManagement, getFormulaManagement, delFormulaManagement, addFormulaManagement, updateFormulaManagement } from "@/api/feed/FormulaManagement" import { ref, reactive, toRefs, getCurrentInstance } from 'vue' import { listFormulaList, getFormulaList, delFormulaList, addFormulaList, updateFormulaList } from "@/api/feed/FormulaList" - import { listMaterial } from "@/api/feed/material" - import { fa } from "element-plus/es/locales.mjs" + import { listMaterial } from "@/api/feed/Material" + const { proxy } = getCurrentInstance() const { pres_status } = proxy.useDict('pres_status') // Data and refs diff --git a/src/views/feed/material/index.vue b/src/views/feed/material/index.vue index 44df173..c033fb2 100644 --- a/src/views/feed/material/index.vue +++ b/src/views/feed/material/index.vue @@ -131,7 +131,7 @@