Files
zhyc-sheep-ui/src/views/produce/bodyManage/breast_rating/index.vue

406 lines
15 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="daterangeEventDate" 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">
<el-select v-model="queryParams.manageTagsList" multiple filterable remote reserve-keyword
placeholder="请输入耳号,支持多选" :remote-method="searchEarNumber" :loading="earLoading" allow-create
default-first-option style="width: 260px">
<el-option v-for="item in earOptions" :key="item" :label="item" :value="item" />
</el-select>
<el-button type="text" @click="clearEarNumbers"
v-if="queryParams.manageTagsList && queryParams.manageTagsList.length > 0" style="margin-left: 8px">
清空
</el-button>
</el-form-item>
<el-form-item label="品种" prop="varietyId">
<el-select v-model="queryParams.varietyId" placeholder="请选择品种" clearable style="min-width:150px">
<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="羊舍" 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>
<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="['breast_rating:breast_rating:add']">新增</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['breast_rating:breast_rating:edit']">修改</el-button>
</el-col> -->
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['breast_rating:breast_rating:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['breast_rating:breast_rating:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<div v-if="queryParams.manageTagsList && queryParams.manageTagsList.length > 0" class="selected-ear-numbers">
<span style="margin-right: 10px; color: #606266;">已选耳号</span>
<el-tag v-for="tag in queryParams.manageTagsList" :key="tag" closable @close="removeEarNumber(tag)"
style="margin-right: 8px;">
{{ tag }}
</el-tag>
</div>
<el-table v-loading="loading" :data="breast_ratingList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="管理耳号" align="center" prop="manageTags" min-width="100px" fixed />
<el-table-column label="品种" align="center" prop="varietyName" />
<el-table-column label="事件类型" align="center" prop="eventType" />
<el-table-column label="事件日期" align="center" prop="eventDate" min-width="120px">
<template #default="scope">
<span>{{ parseTime(scope.row.eventDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="羊舍" align="center" prop="sheepfoldName" min-width="120px" />
<el-table-column label="乳房深度" align="center" prop="depth" min-width="150px" sortable />
<el-table-column label="乳房长度" align="center" prop="length" min-width="150px" sortable />
<el-table-column label="乳房位置" align="center" prop="position" />
<el-table-column label="乳房附着" align="center" prop="adbere" />
<el-table-column label="乳房间隔度" align="center" prop="spacing" min-width="120px" />
<el-table-column label="乳房评分" align="center" prop="score" min-width="150px" sortable />
<el-table-column label="备注" align="center" prop="comment" />
<el-table-column label="技术员" align="center" prop="technician" />
<el-table-column label="创建人" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" min-width="150">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" min-width="120px" fixed="right">
<template #default="scope">
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['breast_rating:breast_rating:edit']">修改</el-button> -->
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['breast_rating:breast_rating: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="550px" append-to-body>
<el-form ref="breast_ratingRef" :model="form" :rules="rules" label-width="115px">
<el-form-item label="管理耳号" prop="manageTags">
<el-input v-model="form.manageTags" placeholder="请输入管理耳号" @blur="onManageTagsBlur" clearable
:disabled="!isAdd" />
</el-form-item>
<el-form-item label="事件日期" prop="eventDate">
<el-date-picker clearable v-model="form.eventDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择事件日期"
:disabled="!isAdd">
</el-date-picker>
</el-form-item>
<el-form-item label="乳房深度" prop="depth">
<el-input v-model="form.depth" placeholder="请输入乳房深度" :disabled="!isAdd" />
</el-form-item>
<el-form-item label="乳房长度" prop="length">
<el-input v-model="form.length" placeholder="请输入乳房长度" :disabled="!isAdd" />
</el-form-item>
<el-form-item label="乳房位置" prop="position">
<el-input v-model="form.position" placeholder="请输入乳房位置" :disabled="!isAdd" />
</el-form-item>
<el-form-item label="乳房附着" prop="adbere">
<el-input v-model="form.adbere" placeholder="请输入乳房附着" :disabled="!isAdd" />
</el-form-item>
<el-form-item label="乳房间隔度" prop="spacing">
<el-input v-model="form.spacing" placeholder="请输入乳房间隔度" :disabled="!isAdd" />
</el-form-item>
<el-form-item label="乳房评分" prop="score">
<el-input v-model="form.score" placeholder="请输入乳房评分" :disabled="!isAdd" />
</el-form-item>
<el-form-item label="羊只备注" v-if="!isAdd">
<el-input v-model="form.comment" type="textarea" :rows="2" placeholder="羊只备注" :disabled="!isAdd" />
</el-form-item>
<el-form-item label="技术员" prop="technician">
<el-input v-model="form.technician" placeholder="请输入技术员" :disabled="!isAdd" />
</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>
</div>
</template>
<script setup name="Breast_rating">
import { listBreast_rating, getBreast_rating, delBreast_rating, addBreast_rating, updateBreast_rating, searchEarNumbers } from "@/api/produce/bodyManage/breast_rating"
import { checkSheepByManageTags, getVarietyOptions } from "@/api/produce/other/fixHoof"
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management'
import { getCurrentInstance, reactive, ref } from "vue"
const { proxy } = getCurrentInstance()
const breast_ratingList = 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 daterangeEventDate = ref([]);
const isAdd = ref(false)
const data = reactive({
form: {
id: null,
manageTags: null,
eventDate: null,
depth: null,
length: null,
position: null,
adbere: null,
spacing: null,
score: null,
comment: null,
technician: null
},
queryParams: {
pageNum: 1,
pageSize: 20,
manageTags: null
},
rules: {
manageTags: [
{ required: true, message: '请输入管理耳号', trigger: 'blur' }
],
eventDate: [
{ required: true, message: '请选择事件日期', trigger: 'blur' }
],
score: [
{ required: true, message: '请输入乳房评分', trigger: 'blur' }
],
technician: [
{ required: true, message: '请输入技术员', trigger: 'blur' }
],
}
})
const { queryParams, form, rules } = toRefs(data)
const earOptions = ref([])
const earLoading = ref(false)
/** 查询乳房评分列表 */
function getList() {
loading.value = true
queryParams.value.params = {}
if (daterangeEventDate.value.length) {
queryParams.value.params["beginEventDate"] = daterangeEventDate.value[0]
queryParams.value.params["endEventDate"] = daterangeEventDate.value[1]
}
if (daterangeCreateTime.value.length) {
queryParams.value.params["beginCreateTime"] = daterangeCreateTime.value[0]
queryParams.value.params["endCreateTime"] = daterangeCreateTime.value[1]
}
listBreast_rating(queryParams.value).then(response => {
breast_ratingList.value = response.rows
total.value = response.total
loading.value = false
})
}
// 根据耳号查询羊只信息
function onManageTagsBlur() {
const tag = form.value.manageTags?.trim();
if (!tag) {
form.value.sheepId = null;
form.value.comment = null;
return;
}
checkSheepByManageTags(tag).then(res => {
if (res.code === 200 && res.data) {
form.value.sheepId = res.data.id;
form.value.comment = res.data.comment || '';
} else {
form.value.sheepId = null;
form.value.comment = null;
proxy.$modal.msgWarning("未找到该耳号对应的羊只");
}
}).catch(err => {
console.error("耳号查询失败:", err);
form.value.sheepId = null;
form.value.comment = null;
});
}
// 取消按钮
function cancel() {
open.value = false
reset()
}
// 表单重置
function reset() {
form.value = {
id: null,
manageTags: null,
sheepId: null,
depth: null,
length: null,
position: null,
adbere: null,
spacing: null,
score: null,
comment: null,
technician: null,
createBy: null,
createTime: null
}
proxy.resetForm("breast_ratingRef")
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
/** 重置按钮操作 */
function resetQuery() {
daterangeCreateTime.value = []
daterangeEventDate.value = [];
queryParams.value.manageTagsList = []
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 = "添加乳房评分"
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
isAdd.value = false
const _id = row.id || ids.value
getBreast_rating(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改乳房评分"
})
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["breast_ratingRef"].validate(valid => {
if (valid) {
if (!form.value.sheepId) {
proxy.$modal.msgError("请输入有效的管理耳号");
return;
}
if (form.value.id) {
updateBreast_rating(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
} else {
addBreast_rating(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 delBreast_rating(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => { })
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('breast_rating/breast_rating/export', {
...queryParams.value
}, `breast_rating_${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;
})
}
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 clearEarNumbers() {
queryParams.value.manageTagsList = []
}
function removeEarNumber(tag) {
const idx = queryParams.value.manageTagsList.indexOf(tag)
if (idx > -1) queryParams.value.manageTagsList.splice(idx, 1)
}
onMounted(() => {
loadVarietyOptions()
getSheepfoldOptions()
getList()
})
</script>
<style scoped>
.selected-ear-numbers {
margin-bottom: 16px;
padding: 10px;
background: #f5f7fa;
border-radius: 4px;
}
</style>