新增羊只,转群,修蹄,去势页面品种功能的完善

This commit is contained in:
zyh
2025-07-17 10:02:56 +08:00
parent 369ed7a052
commit 71076e0df0
6 changed files with 465 additions and 403 deletions

View File

@@ -1,13 +1,16 @@
<template>
<div class="app-container">
<!-- 顶部按钮 -->
<el-button type="warning" icon="Upload" @click="handleExportForm">导出</el-button>
<el-button type="primary" plain icon="Plus" @click="handleImport"
v-hasPermi="['produce:add_sheep:import']">导入</el-button>
<!-- 新增/编辑表单 -->
<el-form :model="form" ref="formRef" label-position="left" label-width="100px" style="margin-top:15px">
<el-row :gutter="20">
<el-col :span="10">
<el-form-item label="耳号" prop="earNumber">
<el-input v-model="form.earNumber" placeholder="请输入羊只id" />
<el-input v-model="form.earNumber" placeholder="请输入耳号" />
</el-form-item>
</el-col>
<el-col :span="10">
@@ -18,6 +21,7 @@
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="10">
<el-form-item label="父号" prop="father">
@@ -30,9 +34,10 @@
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="10">
<el-form-item label="出生体重" prop="bornWeight">
<el-form-item label="出生体重(kg)" prop="bornWeight">
<el-input v-model="form.bornWeight" placeholder="请输入出生体重" />
</el-form-item>
</el-col>
@@ -42,14 +47,15 @@
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="10">
<el-form-item label="性别" prop="gender">
<el-select v-model="form.gender" placeholder="请选择性别">
<el-option label="公" value="1" />
<el-option label="母" value="0" />
<el-option label="阉羊" value="2" />
<el-option label="兼性" value="3" />
<el-option label="公" :value="1" />
<el-option label="母" :value="0" />
<el-option label="阉羊" :value="2" />
<el-option label="兼性" :value="3" />
</el-select>
</el-form-item>
</el-col>
@@ -59,10 +65,18 @@
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="10">
<el-form-item label="品种" prop="varietyId">
<el-input v-model="form.varietyId" placeholder="请输入品种" />
<el-select v-model="form.varietyId" placeholder="请选择品种" clearable>
<el-option
v-for="item in varietyOptions"
:key="item.id"
:label="item.variety"
:value="Number(item.id)"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="10">
@@ -71,6 +85,7 @@
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="10">
<el-form-item label="技术员" prop="technician">
@@ -78,6 +93,7 @@
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="16">
<el-form-item label="备注" prop="comment">
@@ -93,10 +109,20 @@
</el-form>
</div>
<!-- 导入弹窗 -->
<el-dialog title="导入羊只信息" v-model="importOpen" width="400px" append-to-body>
<el-upload ref="uploadRef" :limit="1" accept=".xlsx,.xls" :action="importUrl" :headers="headers"
:auto-upload="false" :on-success="handleImportSuccess" :on-error="handleImportError" drag>
<i class="el-icon-upload"></i>
<el-upload
ref="uploadRef"
:limit="1"
accept=".xlsx,.xls"
:action="importUrl"
:headers="headers"
:auto-upload="false"
:on-success="handleImportSuccess"
:on-error="handleImportError"
drag
>
<i class="el-icon-upload" />
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
</el-upload>
<template #footer>
@@ -107,10 +133,15 @@
</template>
<script setup>
import { ref } from 'vue';
import { addSheep } from '@/api/produce/manage_sheep/add_sheep/add_sheep';
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management';
import { ref, onMounted } from 'vue'
import request from '@/utils/request'
import { addSheep, exportSheepForm } from '@/api/produce/manage_sheep/add_sheep/add_sheep'
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management'
import { getToken } from '@/utils/auth'
import { getCurrentInstance } from 'vue'
const { proxy } = getCurrentInstance()
/* -------------------- 表单 -------------------- */
const form = ref({
earNumber: '',
sheepfold: '',
@@ -123,50 +154,57 @@ const form = ref({
varietyId: '',
joinDate: '',
comment: '',
technician: '',
});
const formRef = ref(null);
technician: ''
})
const formRef = ref(null)
const rules = {
earNumber: [{ required: true, message: '请输入耳号', trigger: 'blur' }],
sheepfold: [{ required: true, message: '请输入羊舍', trigger: 'change' }],
father: [{ message: '请输入父号', trigger: 'blur' }],
mother: [{ message: '请输入母号', trigger: 'blur' }],
sheepfold: [{ required: true, message: '请选择羊舍', trigger: 'change' }],
bornWeight: [{ required: true, message: '请输入出生体重', trigger: 'blur' }],
birthday: [{ required: true, message: '请选择出生日期', trigger: 'change' }],
gender: [{ required: true, message: '请选择性别', trigger: 'change' }],
parity: [{ message: '请输入胎次', trigger: 'blur' }],
varietyId: [{ required: true, message: '请输入品种', trigger: 'blur' }],
joinDate: [{ message: '请选择入群日期', trigger: 'change' }],
technician: [{ message: '请输入技术员', trigger: 'blur' }],
};
varietyId: [{ required: true, message: '请选择品种', trigger: 'change' }]
}
/* -------------------- 下拉数据 -------------------- */
const sheepfoldOptions = ref([])
const varietyOptions = ref([])
//表单验证 提交表单数据
const submitForm = () => {
formRef.value.validate((valid) => {
if (valid) {
addSheep(form.value) // 调用 API 方法addSheep 应已在 @/api/sheep/sheep.js 中定义
.then(response => {
if (response.code === 200) {
alert('新增成功');
resetForm();
// 可以在这里添加刷新列表的逻辑,例如调用 list 方法
} else {
alert(response.msg || '新增失败');
}
})
.catch(error => {
console.error('新增失败:', error);
alert('新增失败,请稍后重试');
});
} else {
alert('请填写所有必填字段');
}
});
};
const resetForm = () => {
function getSheepfoldOptions() {
listSheepfold({ pageNum: 1, pageSize: 9999 }).then(res => {
sheepfoldOptions.value = res.rows || []
})
}
function getVarietyOptions() {
request({
url: '/base/variety/list',
method: 'get',
params: { pageNum: 1, pageSize: 9999 }
}).then(res => {
varietyOptions.value = res.rows || []
})
}
/* -------------------- 功能方法 -------------------- */
function submitForm() {
formRef.value.validate(valid => {
if (!valid) return
addSheep(form.value).then(res => {
if (res.code === 200) {
proxy.$modal.msgSuccess('新增成功')
resetForm()
} else {
proxy.$modal.msgError(res.msg || '新增失败') // 这里显示“耳号已存在”等后端报错
}
}).catch(() => {
proxy.$modal.msgError('请求异常,请稍后重试')
})
})
}
function resetForm() {
form.value = {
earNumber: '',
sheepfold: '',
@@ -179,63 +217,66 @@ const resetForm = () => {
varietyId: '',
joinDate: '',
comment: '',
technician: '',
};
};
//导出
import { exportSheepForm } from '@/api/produce/manage_sheep/add_sheep/add_sheep';
technician: ''
}
}
function handleExportForm() {
// 把当前表单数据直接传后端
exportSheepForm(form.value).then(res => {
// 使用 Ruoyi 自带的下载方法
const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
const fileName = `羊只信息_${new Date().getTime()}.xlsx`;
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = fileName;
link.click();
});
const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
const link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.download = `羊只信息_${Date.now()}.xlsx`
link.click()
})
}
/* -------------------- 导入 -------------------- */
const uploadRef = ref(null)
const importOpen = ref(false)
const importUrl = ref(import.meta.env.VITE_APP_BASE_API + '/produce/manage_sheep/add_sheep/importData')
const headers = ref({ Authorization: 'Bearer ' + getToken() })
//导入
import { getToken } from '@/utils/auth';
const uploadRef = ref();
const importOpen = ref(false);
const importUrl = ref(import.meta.env.VITE_APP_BASE_API + '/produce/manage_sheep/add_sheep/importData');
const headers = ref({ Authorization: 'Bearer ' + getToken() });
function handleImport() { importOpen.value = true; }
function handleImport() {
importOpen.value = true
}
function downloadTemplate() {
proxy.download('/produce/manage_sheep/add_sheep/importTemplate', {}, `羊只模板_${Date.now()}.xlsx`);
request({ url: '/produce/manage_sheep/add_sheep/importTemplate', method: 'get', responseType: 'blob' }).then(res => {
const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
const link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.download = `羊只模板_${Date.now()}.xlsx`
link.click()
})
}
function submitUpload() { uploadRef.value?.submit(); }
function submitUpload() {
uploadRef.value?.submit()
}
// 上传成功回调
function handleImportSuccess(res) {
proxy.$modal.msgSuccess(res.msg || '导入成功');
importOpen.value = false;
uploadRef.value?.clearFiles();
if (res.code === 200) {
proxy.$modal.msgSuccess(res.msg || '导入成功')
importOpen.value = false
uploadRef.value?.clearFiles()
} else {
// 业务失败
proxy.$modal.msgError('导入失败:' + (res.msg || '未知原因'))
}
}
// 上传失败(网络/服务器异常)
function handleImportError(err) {
proxy.$modal.msgError(JSON.parse(err.message)?.msg || '导入失败');
const msg = JSON.parse(err.message || '{}')?.msg || '网络异常'
proxy.$modal.msgError('导入失败:' + msg)
}
/**获取羊舍数据 */
const sheepfoldOptions = ref([]);
function getSheepfoldOptions() {
listSheepfold({ pageNum: 1, pageSize: 9999 }).then(res => {
sheepfoldOptions.value = res.rows;
});
}
/* -------------------- 初始化 -------------------- */
onMounted(() => {
getSheepfoldOptions();
});
getSheepfoldOptions()
getVarietyOptions()
})
</script>
<style scoped>