407 lines
13 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="羊只ID" prop="sheepId">
<el-input
v-model="queryParams.sheepId"
placeholder="请输入羊只ID"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item> -->
<el-form-item label="耳号" prop="bsManageTags">
<el-input
v-model="queryParams.bsManageTags"
placeholder="请输入耳号"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="分组" prop="groupId">
<el-select
v-model="queryParams.groupId"
placeholder="请选择分组"
clearable
style="width: 200px"
>
<el-option
v-for="g in leafGroupOptions"
:key="g.groupId"
:label="g.groupName"
:value="g.groupId"
/>
</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="['sheep_grouping:sheep_grouping:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['sheep_grouping:sheep_grouping:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['sheep_grouping:sheep_grouping:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['sheep_grouping:sheep_grouping:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="sheep_groupingList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center"/>
<!-- <el-table-column label="主键ID" align="center" prop="id" sortable/> -->
<!-- <el-table-column label="羊只ID" align="center" prop="sheep_id" sortable/>
<el-table-column label="分组ID" align="center" prop="group_id" sortable/> -->
<el-table-column label="分组名称" align="center" prop="groupName" sortable>
<template #default="scope">
{{ getGroupName(scope.row.group_id) }}
</template>
</el-table-column>
<el-table-column label="耳号" align="center" prop="bs_manage_tags" sortable/>
<el-table-column label="品种" align="center" prop="variety" sortable/>
<el-table-column label="性别" align="center" prop="gender" sortable>
<template #default="scope">
<dict-tag :options="sheep_gender" :value="scope.row.gender"/>
</template>
</el-table-column>
<el-table-column label="羊只类型" align="center" prop="name" sortable/>
<el-table-column label="出生日期" align="center" prop="birthday" sortable/>
<el-table-column label="胎次" align="center" prop="parity" sortable/>
<el-table-column label="月龄" align="center" prop="month_age" sortable/>
<el-table-column label="繁殖状态" align="center" prop="breed" sortable/>
<el-table-column label="出生体重" align="center" prop="birth_weight" sortable/>
<el-table-column label="断奶体重" align="center" prop="weaning_weight" sortable/>
<el-table-column label="当前体重" align="center" prop="current_weight" sortable/>
<el-table-column label="父号" align="center" prop="father_manage_tags" sortable/>
<el-table-column label="母号" align="center" prop="mother_manage_tags" sortable/>
<el-table-column label="家系" align="center" prop="family" sortable/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['sheep_grouping:sheep_grouping:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['sheep_grouping:sheep_grouping: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"
/>
<!-- 添加或修改羊只分组关联对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="sheep_groupingRef" :model="form" :rules="rules" label-width="80px">
<!-- <el-form-item label="羊只ID" prop="sheepId">
<el-input v-model="form.sheepId" placeholder="请输入羊只ID" />
</el-form-item> -->
<el-form-item label="耳号列表" prop="earTags">
<el-input type="textarea" :rows="4" v-model="form.earTags" :disabled="form.earTagsDisabled" placeholder="请输入耳号,多个耳号用逗号或换行分隔"/>
</el-form-item>
<el-form-item label="分组" prop="groupId">
<el-select v-model="form.groupId" placeholder="请选择分组" clearable>
<el-option
v-for="g in leafGroupOptions"
:key="g.groupId"
:label="g.groupName"
:value="g.groupId"
/>
</el-select>
</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="Sheep_grouping">
import { listSheep_grouping, getSheep_grouping, delSheep_grouping, addSheep_grouping, updateSheep_grouping } from "@/api/fileManagement/sheep_grouping"
import {listLeafGroup} from "@/api/fileManagement/group_management"
import {listSheep_grouping_join} from "@/api/fileManagement/sheep_grouping"
import { addByEarTags } from '@/api/fileManagement/sheep_grouping'
const { proxy } = getCurrentInstance()
const sheep_groupingList = 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 leafGroupOptions = ref([])
const { sheep_gender } = proxy.useDict('sheep_gender')
const data = reactive({
form: {
earTags: '',
groupId: null,
earTagsDisabled: false // 新增字段:是否禁用耳号输入框
},
queryParams: {
pageNum: 1,
pageSize: 10,
sheepId: null,
groupId: null,
bsManageTags: ''
},
leafGroupOptions: [],
rules: {
earTags: [
{ required: true, message: "耳号不能为空", trigger: "blur" }
],
groupId: [
{ required: true, message: "分组不能为空", trigger: "change" }
],
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询羊只分组关联列表 */
// function getList() {
// loading.value = true
// listSheep_grouping(queryParams.value).then(response => {
// sheep_groupingList.value = response.rows
// total.value = response.total
// loading.value = false
// })
// }
import { getSheep_file } from '@/api/fileManagement/sheep_file'
async function getList() {
loading.value = true
try {
const params = {
...queryParams.value,
bsManageTags: queryParams.value.bsManageTags || undefined
}
const { rows, total: t } = await listSheep_grouping_join(params)
sheep_groupingList.value = rows
total.value = t
} finally {
loading.value = false
}
}
// 取消按钮
function cancel() {
open.value = false
reset()
}
// 表单重置
function reset() {
form.value = {
id: null,
sheepId: null,
groupId: null
}
proxy.resetForm("sheep_groupingRef")
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
/** 重置按钮操作 */
function resetQuery() {
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()
form.value.earTagsDisabled = false // 允许输入耳号
form.value.earTags = '' // 确保新增时输入框为空
open.value = true
title.value = "添加羊只分组关联"
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
form.value = {...row,
earTags: row.bs_manage_tags,
groupId: row.group_id,
originalGroupId: row.group_id, // 用于前端预校验
earTagsDisabled: true
}
open.value = true
title.value = "修改羊只分组关联"
}
// /** 提交按钮 */
// function submitForm() {
// proxy.$refs["sheep_groupingRef"].validate(valid => {
// if (valid) {
// if (form.value.id != null) {
// updateSheep_grouping(form.value).then(response => {
// proxy.$modal.msgSuccess("修改成功")
// open.value = false
// getList()
// })
// } else {
// addSheep_grouping(form.value).then(response => {
// proxy.$modal.msgSuccess("新增成功")
// open.value = false
// getList()
// })
// }
// }
// })
// }
function submitForm() {
proxy.$refs["sheep_groupingRef"].validate(valid => {
if (!valid) return;
// ── 1. 修改模式(单条) ──
if (form.value.id != null) {
// 前端预校验:是否已在此分组
if (form.value.groupId === form.value.originalGroupId) {
proxy.$modal.msgWarning("该羊已在此分组,无需修改");
return;
}
// 只需要更新分组
console.log(form.value)
const data = {
id: form.value.id,
sheepId:form.value.sheep_id,
groupId: form.value.groupId
};
updateSheep_grouping(data).then(() => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
return;
}
// ── 2. 新增模式(耳号批量) ──
const earTags = form.value.earTags
.split(/[,\n\s]+/)
.map(tag => tag.trim())
.filter(tag => tag);
const data = { earTags, groupId: form.value.groupId };
addByEarTags(data)
.then(res => {
if (res.data?.success) {
proxy.$modal.msgSuccess(`新增成功,共 ${res.data.inserted}`);
open.value = false;
getList();
} else {
const missing = res.data?.missing || [];
const already = res.data?.alreadyInGroup || [];
if (missing.length) {
proxy.$modal.alertError(`以下耳号不存在:${missing.join(", ")}`);
} else if (already.length) {
proxy.$modal.alertWarning(`以下耳号已在该分组:${already.join(", ")}`);
} else {
proxy.$modal.alertWarning("所有羊只已存在于该分组");
}
}
})
.catch(() => proxy.$modal.msgError("系统异常,请联系管理员"));
});
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除羊只分组关联编号为"' + _ids + '"的数据项?').then(function() {
return delSheep_grouping(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => {})
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('sheep_grouping/sheep_grouping/export', {
...queryParams.value
}, `sheep_grouping_${new Date().getTime()}.xlsx`)
}
loadLeafGroups()
getList()
// 调用示例
function loadLeafGroups() {
listLeafGroup().then(res => {
leafGroupOptions.value = res.data
})
}
// 根据 groupId 获取分组名称
function getGroupName(id) {
const group = leafGroupOptions.value.find(g => g.groupId === id)
return group ? group.groupName : ''
}
</script>