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 @@