Files
zhyc-sheep-ui/src/views/produce/bodyManage/body_measure/index.vue
2026-02-09 20:22:46 +08:00

715 lines
28 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<!-- <el-form-item label="创建时间" style="width: 308px">
<el-date-picker v-model="daterangeCreateTime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</el-form-item> -->
<el-form-item label="测量日期" style="width: 308px">
<el-date-picker v-model="daterangeMeasureDate" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</el-form-item>
<el-form-item label="管理耳号" prop="manageTagsList">
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;">
<el-select v-model="queryParams.manageTagsList" multiple filterable remote reserve-keyword
placeholder="输入耳号搜索" :remote-method="searchEarNumber" :loading="earLoading" allow-create
default-first-option collapse-tags :max-collapse-tags="0" style="width:260px" @change="handleEarChange">
<el-option v-for="item in earOptions" :key="item" :label="item" :value="item" />
</el-select>
<el-input v-model="pasteText" placeholder="或粘贴多个耳号(空格/换行/逗号分隔)" style="width:260px" @paste="handlePaste"
@keyup.enter="handlePasteSubmit" clearable>
<template #append>
<el-button @click="handlePasteSubmit" :icon="Plus">添加</el-button>
</template>
</el-input>
<el-tag v-if="queryParams.manageTagsList.length" type="info" effect="plain" size="large">
已选: {{ queryParams.manageTagsList.length }}
</el-tag>
<el-button type="danger" plain :icon="Delete" @click="clearEarNumbers"
v-if="queryParams.manageTagsList.length">
清空全部
</el-button>
</div>
<div v-if="queryParams.manageTagsList.length" class="selected-ear-numbers">
<el-tag v-for="tag in displayedEarTags" :key="tag" closable @close="removeEarNumber(tag)" style="margin:4px"
type="success">
{{ tag }}
</el-tag>
<el-button v-if="queryParams.manageTagsList.length > defaultShowCount" type="primary" link
@click="toggleExpand">
{{ isExpanded ? '收起' : `展开剩余 ${queryParams.manageTagsList.length - defaultShowCount} ` }}
<el-icon class="el-icon--right">
<component :is="isExpanded ? ArrowUp : ArrowDown" />
</el-icon>
</el-button>
</div>
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-select v-model="queryParams.gender" placeholder="请选择性别" clearable style="min-width:120px">
<el-option label="母" value="1" />
<el-option label="公" value="2" />
<el-option label="阉羊" value="3" />
</el-select>
</el-form-item>
<el-form-item label="品种" prop="varietyId">
<el-select v-model="queryParams.varietyId" placeholder="请选择品种" style="min-width:150px" clearable>
<el-option v-for="item in varietyOptions" :key="item.id" :label="item.variety" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="月龄" style="width: 308px">
<div style="display: flex; align-items: center; gap: 8px;">
<el-input-number v-model="queryParams.monthAgeStart" :min="0" :max="300" placeholder="最小月龄"
style="width: 120px; flex-shrink: 0;" controls-position="right" />
<span>-</span>
<el-input-number v-model="queryParams.monthAgeEnd" :min="0" :max="300" placeholder="最大月龄"
style="width: 120px; flex-shrink: 0;" controls-position="right" />
</div>
</el-form-item>
<el-form-item label="羊只类型" prop="sheepTypeId">
<el-select v-model="queryParams.sheepTypeId" placeholder="请选择羊只类型" clearable style="min-width:150px">
<el-option v-for="type in sheepTypeList" :key="type.id" :label="type.name" :value="type.id" />
</el-select>
</el-form-item>
<el-form-item label="繁殖状态" prop="breedStatusName">
<el-select v-model="queryParams.breedStatusName" placeholder="请选择繁殖状态" clearable style="min-width:150px">
<el-option v-for="item in breedStatusOptions" :key="item.id" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="羊舍" prop="sheepfoldId">
<el-select v-model="queryParams.sheepfoldId" placeholder="请选择羊舍" style="min-width:150px" clearable>
<el-option v-for="item in sheepfoldOptions" :key="item.id" :label="item.sheepfoldName" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="技术员" prop="technician">
<el-select v-model="queryParams.technician" placeholder="请选择技术员" clearable filterable style="width: 150px">
<el-option v-for="item in technicalOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="是否在群" prop="isDelete">
<el-select v-model="queryParams.isDelete" placeholder="全部" clearable style="min-width:120px">
<el-option label="全部" value="" />
<el-option label="在群" :value="0" />
<el-option label="离群" :value="1" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<!-- <el-button icon="Refresh" @click="resetQuery">重置</el-button> -->
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd"
v-hasPermi="['body_measure:body_measure:add']">新增</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['body_measure:body_measure:edit']">修改</el-button>
</el-col> -->
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['body_measure:body_measure:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['body_measure:body_measure:export']">导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Upload" @click="handleImport"
v-hasPermi="['body_measure:body_measure:import']">导入</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="body_measureList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="管理耳号" align="center" prop="manageTags" width="100" fixed />
<el-table-column label="羊舍" align="center" prop="sheepfoldName" width="100" />
<el-table-column label="品种" align="center" prop="varietyName" width="100" />
<el-table-column label="事件类型" align="center" prop="eventType" width="120" />
<el-table-column label="测量日期" align="center" prop="measureDate" width="120">
<template #default="scope">
<span>{{ parseTime(scope.row.measureDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="测量时羊只类别" align="center" prop="sheepTypeName" width="100" />
<el-table-column label="性别" align="center" prop="gender" width="100">
<template #default="scope">
<span>{{ genderMap[scope.row.gender] || '未知' }}</span>
</template>
</el-table-column>
<el-table-column label="月龄" align="center" prop="monthAge" width="80" sortable />
<el-table-column label="胎次" align="center" prop="parity" width="100" />
<el-table-column label="出生体重(kg)" align="center" prop="birthWeight" width="150" sortable />
<el-table-column label="断奶体重(kg)" align="center" prop="weaningWeight" width="150" sortable />
<el-table-column label="当前体重(kg)" align="center" prop="currentWeight" width="150" sortable />
<el-table-column label="体高" align="center" prop="height" width="100" sortable />
<el-table-column label="胸围" align="center" prop="bust" width="100" sortable />
<el-table-column label="体斜长" align="center" prop="bodyLength" width="150" sortable />
<el-table-column label="管围" align="center" prop="pipeLength" width="100" sortable />
<el-table-column label="胸深" align="center" prop="chestDepth" width="100" sortable />
<el-table-column label="臀高" align="center" prop="hipHeight" width="100" sortable />
<el-table-column label="尻宽" align="center" prop="rumpWidth" width="100" sortable />
<el-table-column label="尻高" align="center" prop="rumpHeignt" width="100" sortable />
<el-table-column label="腰角宽" align="center" prop="hipWidth" width="150" sortable />
<el-table-column label="十字部高" align="center" prop="hipCrossHeight" width="150" sortable />
<el-table-column label="乳房深度" align="center" prop="breastDepth" width="100" />
<el-table-column label="乳头位置" align="center" prop="breastPosition" width="100" />
<el-table-column label="乳头长度" align="center" prop="breastLength" width="100" />
<el-table-column label="乳房附着" align="center" prop="breastAdbere" width="100" />
<el-table-column label="乳房间隔度" align="center" prop="breastSpacing" width="100" />
<el-table-column label="乳房评分" align="center" prop="breastScore" width="100" sortable />
<el-table-column label="繁育状态" align="center" prop="breedStatusName" width="100">
<template #default="scope">
<span>{{ scope.row.breedStatusName || '未设置' }}</span>
</template>
</el-table-column>
<el-table-column label="泌乳天数" align="center" prop="lactationDay" width="150" sortable />
<el-table-column label="怀孕天数" align="center" prop="gestationDay" width="150" sortable />
<el-table-column label="配后天数" align="center" prop="postMatingDay" width="150" sortable />
<el-table-column label="体况评分" align="center" prop="bodyScore" width="100" sortable />
<el-table-column label="技术员" align="center" prop="technician" width="100" />
<el-table-column label="创建人" align="center" prop="createBy" width="100" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}') }}</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="comment" width="180" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" min-width="130">
<template #default="scope">
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['body_measure:body_measure:edit']">修改</el-button> -->
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['body_measure:body_measure:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" :page-sizes="[20, 50, 100, 200, 500, 1000, 2000]" />
<!-- 添加或修改体尺测量对话框 -->
<el-dialog :title="title" v-model="open" width="700px" append-to-body>
<el-form ref="body_measureRef" :model="form" :rules="rules" label-width="100px" size="medium"
label-position="left">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="管理耳号" prop="manageTags">
<el-input v-model="form.manageTags" placeholder="请输入管理耳号" @blur="onManageTagsBlur" :disabled="!isAdd"
clearable />
</el-form-item>
<el-form-item label="测量日期" prop="measureDate">
<el-date-picker v-model="form.measureDate" value-format="YYYY-MM-DD" type="date" placeholder="请选择测量日期"
:disabled="!isAdd"></el-date-picker>
</el-form-item>
<el-form-item label="当前体重" prop="currentWeight">
<el-input-number v-model="form.currentWeight" :precision="2" :min="0" :max="200" placeholder="请输入当前体重(kg)"
style="width:100%" />
</el-form-item>
<el-form-item label="体高" prop="height">
<el-input v-model="form.height" placeholder="请输入体高" :disabled="!isAdd" clearable />
</el-form-item>
<el-form-item label="胸围" prop="bust">
<el-input v-model="form.bust" placeholder="请输入胸围" :disabled="!isAdd" clearable />
</el-form-item>
<el-form-item label="体斜长" prop="bodyLength">
<el-input v-model="form.bodyLength" placeholder="请输入体斜长" :disabled="!isAdd" clearable />
</el-form-item>
<el-form-item label="管围" prop="pipeLength">
<el-input v-model="form.pipeLength" placeholder="请输入管围" :disabled="!isAdd" clearable />
</el-form-item>
<el-form-item label="技术员" prop="technician">
<el-select v-model="form.technician" placeholder="请选择技术员" :disabled="!isAdd" clearable filterable
style="width: 100%">
<el-option v-for="item in technicalOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="臀高" prop="hipHeight">
<el-input v-model="form.hipHeight" placeholder="请输入臀高" :disabled="!isAdd" clearable />
</el-form-item>
<el-form-item label="尻宽" prop="rumpWidth">
<el-input v-model="form.rumpWidth" placeholder="请输入尻宽" :disabled="!isAdd" clearable />
</el-form-item>
<el-form-item label="尻高" prop="rumpHeignt">
<el-input v-model="form.rumpHeignt" placeholder="请输入尻高" :disabled="!isAdd" clearable />
</el-form-item>
<el-form-item label="腰角宽" prop="hipWidth">
<el-input v-model="form.hipWidth" placeholder="请输入腰角宽" :disabled="!isAdd" clearable />
</el-form-item>
<el-form-item label="十字部高" prop="hipCrossHeight">
<el-input v-model="form.hipCrossHeight" placeholder="请输入十字部高" :disabled="!isAdd" clearable />
</el-form-item>
<el-form-item label="胸深" prop="chestDepth">
<el-input v-model="form.chestDepth" placeholder="请输入胸深" :disabled="!isAdd" clearable />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注" prop="comment">
<el-input v-model="form.comment" placeholder="请输入备注" clearable type="textarea" rows="3" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
<!-- 导入对话框 -->
<el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
<el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url"
:disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
:auto-upload="false" drag>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<span>仅允许导入xlsxlsx格式文件</span>
</div>
</template>
</el-upload>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitFileForm"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Body_measure">
import { listBody_measure, getBody_measure, delBody_measure, addBody_measure, updateBody_measure, getSheepTypeList, searchEarNumbers, listBreedStatus } from "@/api/produce/bodyManage/body_measure"
import { getSheepByManageTags } from "@/api/produce/manage_sheep/changeVariety"
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management'
import { getVarietyOptions } from '@/api/produce/other/fixHoof'
import { getCurrentInstance } from 'vue'
import { getUserByPost } from '@/api/common/user'
import { Plus, Delete, ArrowUp, ArrowDown } from '@element-plus/icons-vue'
import { nextTick } from 'vue'
import dayjs from 'dayjs'
import { UploadFilled } from '@element-plus/icons-vue'
import { getToken } from "@/utils/auth"
// 技术员下拉选项
const technicalOptions = ref([])
// 获取技术员列表岗位编码techs
const fetchTechnicalList = () => {
getUserByPost({ postCode: "techs" })
.then(res => {
if (res.code === 200 && Array.isArray(res.data)) {
technicalOptions.value = res.data.map(item => ({
value: item.nickName,
label: item.nickName
}))
} else {
technicalOptions.value = []
}
})
.catch(() => {
technicalOptions.value = []
})
}
const { proxy } = getCurrentInstance()
const body_measureList = ref([])
const open = ref(false)
const loading = ref(true)
const showSearch = ref(true)
const ids = ref([])
const single = ref(true)
const multiple = ref(true)
const total = ref(0)
const title = ref("")
const daterangeCreateTime = ref([])
const isAdd = ref(false)
const daterangeMeasureDate = ref([]);
const breedStatusOptions = ref([])
const genderMap = {
1: '母',
2: '公',
3: '阉羊'
};
const pasteText = ref('')
const isExpanded = ref(false)
const defaultShowCount = 2
const displayedEarTags = computed(() => {
const list = queryParams.value.manageTagsList
if (isExpanded.value || list.length <= defaultShowCount) return list
return list.slice(0, defaultShowCount)
})
const upload = reactive({
open: false,
title: '',
isUploading: false,
headers: { Authorization: "Bearer " + getToken() },
url: import.meta.env.VITE_APP_BASE_API + '/body_measure/body_measure/import'
})
const data = reactive({
form: { manageTags: null, technician: null },
queryParams: {
pageNum: 1,
pageSize: 20,
sheepId: null,
sheepfoldId: null,
varietyId: null,
manageTags: null,
measureDate: null,
createTime: null,
manageTagsList: [],
gender: null,
technician: null,
isDelete: null,
breedStatusName: null,
},
rules: {
manageTags: [
{ required: true, message: '请输入管理耳号', trigger: 'blur' }
],
technician: [
{ required: true, message: '请输入技术员', trigger: 'blur' }
],
measureDate: [
{ required: true, message: '请选择测量日期', trigger: 'change' }
]
},
sheepfoldName: '',
varietyName: '',
})
const { queryParams, form, rules } = toRefs(data)
const earOptions = ref([])
const earLoading = ref(false)
//查询体尺测量列表
function getList() {
loading.value = true
queryParams.value.params = {}
if (daterangeCreateTime.value.length > 0) {
queryParams.value.params["beginCreateTime"] = daterangeCreateTime.value[0]
queryParams.value.params["endCreateTime"] = daterangeCreateTime.value[1]
}
if (daterangeMeasureDate.value.length > 0) {
queryParams.value.params["beginMeasureDate"] = daterangeMeasureDate.value[0];
queryParams.value.params["endMeasureDate"] = daterangeMeasureDate.value[1];
}
listBody_measure(queryParams.value).then(response => {
body_measureList.value = response.rows
total.value = response.total
loading.value = false
})
}
// 耳号脱焦验证
function onManageTagsBlur() {
const tag = form.value.manageTags?.trim();
if (!tag) {
form.value.sheepId = null;
return;
}
getSheepByManageTags(tag).then(res => {
if (res.code === 200 && res.data) {
form.value.sheepId = res.data.id;
} else {
form.value.sheepId = null;
proxy.$modal.msgWarning("未找到该管理耳号对应的羊只");
}
}).catch(err => {
console.error("耳号验证失败:", err);
form.value.sheepId = null;
proxy.$modal.msgError("查询失败,请重试");
});
}
// 取消按钮
function cancel() {
open.value = false
reset()
}
// 表单重置
function reset() {
form.value = {
id: null,
sheepId: null,
height: null,
bust: null,
bodyLength: null,
pipeLength: null,
chestDepth: null,
hipHeight: null,
rumpWidth: null,
rumpHeignt: null,
hipWidth: null,
hipCrossHeight: null,
comment: null,
technician: null,
createBy: null,
measureDate: null,
createTime: null
}
proxy.resetForm("body_measureRef")
}
/** 搜索按钮操作 */
function handleQuery() {
if (queryParams.value.monthAgeStart !== null) {
queryParams.value.params["monthAgeStart"] = queryParams.value.monthAgeStart
}
if (queryParams.value.monthAgeEnd !== null) {
queryParams.value.params["monthAgeEnd"] = queryParams.value.monthAgeEnd
}
if (queryParams.value.breedStatusName) {
queryParams.value.params = {
...queryParams.value.params,
breedStatusName: queryParams.value.breedStatusName
}
}
queryParams.value.pageNum = 1
getList()
}
/** 重置按钮操作 */
function resetQuery() {
daterangeCreateTime.value = [];
queryParams.value.sheepfoldId = null;
data.sheepfoldName = '';
queryParams.value.varietyId = null;
data.varietyName = '';
daterangeMeasureDate.value = [];
queryParams.value.manageTagsList = [];
queryParams.value.gender = null;
queryParams.value.technician = null;
queryParams.value.isDelete = null;
queryParams.value.monthAgeStart = null
queryParams.value.monthAgeEnd = null
proxy.resetForm("queryRef");
handleQuery();
}
// 多选框选中数据
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 新增按钮操作 */
function handleAdd() {
reset()
isAdd.value = true
open.value = true
title.value = "添加体尺测量"
form.value.measureDate = dayjs().format('YYYY-MM-DD')
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
isAdd.value = false
const _id = row.id || ids.value
getBody_measure(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改体尺测量"
})
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["body_measureRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateBody_measure(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
} else {
addBody_measure(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功")
open.value = false
getList()
})
}
}
})
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除这条记录数据').then(function () {
return delBody_measure(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => { })
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('body_measure/body_measure/export', {
...queryParams.value
}, `body_measure_${new Date().getTime()}.xlsx`)
}
//加载羊舍数据
const sheepfoldOptions = ref([])
function getSheepfoldOptions() {
listSheepfold({ pageNum: 1, pageSize: 9999 }).then(res => {
sheepfoldOptions.value = res.rows
})
}
//加载品种数据
const varietyOptions = ref([])
function loadVarietyOptions() {
getVarietyOptions({ pageNum: 1, pageSize: 9999 }).then(res => {
varietyOptions.value = res.rows;
})
}
// 加载羊只类别数据
const sheepTypeList = ref([]);
function loadSheepTypeList() {
getSheepTypeList().then(response => {
sheepTypeList.value = response.rows || [];
}).catch(error => {
console.error('加载羊只类别失败', error);
});
}
function searchEarNumber(query) {
if (!query) { earOptions.value = []; return }
earLoading.value = true
searchEarNumbers(query.trim()).then(res => {
earOptions.value = res.data || []
}).finally(() => earLoading.value = false)
}
function handlePaste() {
nextTick(() => handlePasteSubmit())
}
function handlePasteSubmit() {
if (!pasteText.value.trim()) return
const separators = /[\s,\n\r\t]+/
const raw = pasteText.value.trim().split(separators).filter(v => v)
const exist = new Set(queryParams.value.manageTagsList)
const adds = []
const dups = []
raw.forEach(v => {
if (!exist.has(v)) { adds.push(v); exist.add(v) }
else dups.push(v)
})
if (adds.length) {
queryParams.value.manageTagsList = [...queryParams.value.manageTagsList, ...adds]
proxy.$modal.msgSuccess(`成功添加 ${adds.length} 个耳号${dups.length ? `,已忽略 ${dups.length} 个重复` : ''}`)
} else if (dups.length) {
proxy.$modal.msgWarning('所有耳号均已存在')
}
pasteText.value = ''
}
function toggleExpand() {
isExpanded.value = !isExpanded.value
}
function handleEarChange(val) {
queryParams.value.manageTagsList = [...new Set(val)]
}
function clearEarNumbers() {
queryParams.value.manageTagsList = []
}
function removeEarNumber(tag) {
const idx = queryParams.value.manageTagsList.indexOf(tag)
if (idx > -1) queryParams.value.manageTagsList.splice(idx, 1)
}
/** 导入按钮操作 */
function handleImport() {
upload.title = "体尺测量数据导入"
upload.open = true
}
/** 下载模板 */
function importTemplate() {
proxy.download('body_measure/body_measure/importTemplate', {}, `体尺测量导入模板_${new Date().getTime()}.xlsx`)
}
/** 文件上传中处理 */
function handleFileUploadProgress(event, file, fileList) {
upload.isUploading = true
}
/** 文件上传成功处理 */
function handleFileSuccess(response, file, fileList) {
upload.open = false
upload.isUploading = false
proxy.$refs["uploadRef"].clearFiles()
proxy.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true })
getList()
}
/** 提交上传文件 */
function submitFileForm() {
proxy.$refs["uploadRef"].submit()
}
// 加载繁殖状态
function loadBreedStatusOptions() {
listBreedStatus().then(res => {
breedStatusOptions.value = res.data || []
})
}
onMounted(() => {
getSheepfoldOptions()
loadSheepTypeList()
loadVarietyOptions()
fetchTechnicalList()
loadBreedStatusOptions()
getList()
})
</script>
<style scoped>
.selected-ear-numbers {
max-height: 150px;
overflow-y: auto;
padding: 8px;
background: #f5f7fa;
border-radius: 4px;
border: 1px dashed #dcdfe6;
display: flex;
flex-wrap: wrap;
align-items: center;
}
.selected-ear-numbers::-webkit-scrollbar {
width: 6px;
}
.selected-ear-numbers::-webkit-scrollbar-thumb {
background-color: #dcdfe6;
border-radius: 3px;
}
</style>