干奶录入查询修改

This commit is contained in:
ll
2026-02-02 00:03:45 +08:00
parent 5d9c7b56c8
commit a748ca994e
2 changed files with 179 additions and 188 deletions

View File

@@ -25,6 +25,24 @@ export function getSheepIdByManageTags(manageTags) {
})
}
// 远程搜索耳号列表
export function searchEarNumbers(query) {
return request({
url: '/drymilk/drymilk/searchEarNumbers',
method: 'get',
params: { query }
})
}
// 远程搜索技术员列表 (新增)
export function searchTechnicians(query) {
return request({
url: '/drymilk/drymilk/searchTechnicians',
method: 'get',
params: { query }
})
}
// 新增干奶记录
export function addDrymilk(data) {
return request({
@@ -49,20 +67,4 @@ export function delDrymilk(id) {
url: '/drymilk/drymilk/' + id,
method: 'delete'
})
}
// 查询羊舍列表下拉框
export function listSheepfoldOptions() {
return request({
url: '/drymilk/drymilk/sheepfoldList',
method: 'get'
})
}
// 查询技术员列表下拉框
export function listTechnicianOptions() {
return request({
url: '/drymilk/drymilk/technicianList',
method: 'get'
})
}
}

View File

@@ -1,14 +1,28 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
<el-form-item label="耳号" prop="manageTags">
<el-input
v-model="queryParams.manageTags"
placeholder="请输入耳号(空格隔开多个)"
<el-form-item label="耳号" prop="manageTagsList">
<el-select
v-model="queryParams.manageTagsList"
multiple
filterable
remote
reserve-keyword
placeholder="请输入耳号搜索"
:remote-method="searchEarNumber"
:loading="earNumberLoading"
style="width: 240px"
clearable
style="width: 220px"
@keyup.enter="handleQuery"
/>
@change="handleQuery"
>
<el-option
v-for="item in earNumberOptions"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item label="干奶日期" style="width: 308px">
@@ -22,13 +36,27 @@
></el-date-picker>
</el-form-item>
<el-form-item label="技术员" prop="tecahnician">
<el-input
v-model="queryParams.tecahnician"
placeholder="请输入技术员"
<el-form-item label="技术员" prop="technicianList">
<el-select
v-model="queryParams.technicianList"
multiple
filterable
remote
reserve-keyword
placeholder="请输入技术员搜索"
:remote-method="searchTechnician"
:loading="technicianLoading"
style="width: 200px"
clearable
@keyup.enter="handleQuery"
/>
@change="handleQuery"
>
<el-option
v-for="item in technicianOptions"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item label="封闭剂" prop="status">
@@ -46,42 +74,16 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['drymilk:drymilk:add']"
>新增</el-button>
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['drymilk:drymilk:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['drymilk:drymilk:edit']"
>修改</el-button>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['drymilk:drymilk:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['drymilk:drymilk:remove']"
>删除</el-button>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['drymilk:drymilk:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['drymilk:drymilk:export']"
>导出</el-button>
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['drymilk:drymilk:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
@@ -96,21 +98,12 @@
<el-table-column label="耳号" align="center" prop="manageTags" min-width="120" />
<el-table-column label="品种" align="center" prop="variety" />
<el-table-column label="事件类型" align="center" prop="eventType" />
<el-table-column label="乳头封闭剂" align="center" prop="status">
<template #default="scope">
<el-tag v-if="scope.row.status === 1" type="success"></el-tag>
<el-tag v-else type="info"></el-tag>
</template>
</el-table-column>
<el-table-column label="是否在群" align="center" prop="isInHerd">
<template #default="scope">
<el-tag v-if="scope.row.isInHerd == '1'"></el-tag>
<el-tag v-else type="danger"></el-tag>
</template>
</el-table-column>
<el-table-column label="转入羊舍" align="center" prop="sheepfoldName" />
<el-table-column label="技术员" align="center" prop="tecahnician" />
<el-table-column label="备注" align="center" prop="comment" show-overflow-tooltip />
@@ -132,7 +125,6 @@
<el-dialog :title="title" v-model="open" width="600px" append-to-body>
<el-form ref="drymilkRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="耳号" prop="manageTags">
<el-input
v-if="!form.id"
@@ -143,14 +135,9 @@
/>
<el-input v-else v-model="form.manageTags" placeholder="请输入耳号" disabled />
</el-form-item>
<el-form-item label="干奶日期" prop="datetime">
<el-date-picker clearable
v-model="form.datetime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择干奶日期">
</el-date-picker>
<el-date-picker clearable v-model="form.datetime" type="date" value-format="YYYY-MM-DD" placeholder="请选择干奶日期"></el-date-picker>
</el-form-item>
<el-form-item label="乳头封闭剂" prop="status">
@@ -161,36 +148,17 @@
</el-form-item>
<el-form-item label="转入羊舍" prop="sheepfold">
<el-select
v-model="form.sheepfold"
filterable
placeholder="请输入关键字选择"
style="width: 100%">
<el-option
v-for="item in sheepfoldOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
<el-select v-model="form.sheepfold" filterable placeholder="请输入关键字选择" style="width: 100%">
<el-option v-for="item in sheepfoldOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="技术员" prop="tecahnician">
<el-select
v-model="form.tecahnician"
filterable
allow-create
default-first-option
placeholder="请输入或选择技术员">
<el-option
v-for="user in userOptions"
:key="user.userName"
:label="user.nickName"
:value="user.nickName">
</el-option>
<el-select v-model="form.tecahnician" filterable allow-create default-first-option placeholder="请输入或选择技术员">
<el-option v-for="user in userOptions" :key="user.userName" :label="user.nickName" :value="user.nickName"></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="comment">
<el-input v-model="form.comment" type="textarea" placeholder="请输入备注" />
</el-form-item>
@@ -206,9 +174,10 @@
</template>
<script setup name="Drymilk">
import { listDrymilk, getDrymilk, delDrymilk, addDrymilk, updateDrymilk } from "@/api/drymilk/drymilk"
import { listUser } from "@/api/system/user"; // 引入用户查询API
import axios from 'axios'; // 如果没有封装好的羊舍API这里示意通常应有 api/base/sheepfold.js
import { listDrymilk, getDrymilk, delDrymilk, addDrymilk, updateDrymilk, searchEarNumbers, searchTechnicians } from "@/api/drymilk/drymilk"
import { listUser } from "@/api/system/user";
import axios from 'axios';
import { getToken } from "@/utils/auth";
const { proxy } = getCurrentInstance()
@@ -225,94 +194,117 @@ const dateRange = ref([])
const sheepfoldOptions = ref([])
const userOptions = ref([])
// 耳号搜索变量
const earNumberLoading = ref(false)
const earNumberOptions = ref([])
// 技术员搜索变量
const technicianLoading = ref(false)
const technicianOptions = ref([])
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
manageTags: null,
manageTags: null,
manageTagsList: [],
technicianList: [], // 技术员多选列表
tecahnician: null, // 兼容旧字段
variety: null,
status: null,
tecahnician: null,
},
rules: {
manageTags: [
{ required: true, message: "耳号不能为空", trigger: "blur" }
],
datetime: [
{ required: true, message: "干奶日期不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "请选择是否使用乳头封闭剂", trigger: "change" }
]
manageTags: [{ required: true, message: "耳号不能为空", trigger: "blur" }],
datetime: [{ required: true, message: "干奶日期不能为空", trigger: "blur" }],
status: [{ required: true, message: "请选择是否使用乳头封闭剂", trigger: "change" }]
}
})
const { queryParams, form, rules } = toRefs(data)
/** 远程搜索耳号 */
function searchEarNumber(query) {
if (query) {
earNumberLoading.value = true;
searchEarNumbers(query).then(res => {
earNumberLoading.value = false;
const list = res.data || res.msg || res;
earNumberOptions.value = Array.isArray(list) ? list : [];
}).catch(err => {
earNumberLoading.value = false;
earNumberOptions.value = [];
});
} else {
earNumberOptions.value = [];
}
}
/** 远程搜索技术员 */
function searchTechnician(query) {
if (query) {
technicianLoading.value = true;
searchTechnicians(query).then(res => {
technicianLoading.value = false;
const list = res.data || res.msg || res;
technicianOptions.value = Array.isArray(list) ? list : [];
}).catch(err => {
technicianLoading.value = false;
technicianOptions.value = [];
});
} else {
technicianOptions.value = [];
}
}
/** 查询干奶记录列表 */
function getList() {
loading.value = true
// 添加时间范围参数
// 正确:直接获取返回结果
queryParams.value = proxy.addDateRange(queryParams.value, dateRange.value);
listDrymilk(queryParams.value).then(response => {
drymilkList.value = response.rows
total.value = response.total
loading.value = false
})
.catch(() => {
// 降级处理,如果 proxy.addDateRange 不可用
let params = {...queryParams.value};
if (dateRange.value && dateRange.value.length === 2) {
params.params = {
beginTime: dateRange.value[0],
endTime: dateRange.value[1]
};
}
listDrymilk(params).then(response => {
drymilkList.value = response.rows
total.value = response.total
loading.value = false
})
const params = proxy.addDateRange(queryParams.value, dateRange.value);
// 处理技术员多选:转字符串传给后端
if (queryParams.value.technicianList && queryParams.value.technicianList.length > 0) {
params.tecahnician = queryParams.value.technicianList.join(',');
} else {
params.tecahnician = null;
}
// 处理耳号多选:转字符串传给后端
if (queryParams.value.manageTagsList && queryParams.value.manageTagsList.length > 0) {
params.manageTags = queryParams.value.manageTagsList.join(',');
} else {
params.manageTags = null;
}
listDrymilk(params).then(response => {
drymilkList.value = response.rows
total.value = response.total
loading.value = false
}).catch(() => {
loading.value = false;
});
}
/** 获取羊舍列表 */
function getSheepfoldList() {
// 假设路径请根据实际项目api调整
proxy.$http ? proxy.$http.get('/drymilk/drymilk/sheepfoldList').then(res => {
sheepfoldOptions.value = res.data || res;
}) : axios.get(import.meta.env.VITE_APP_BASE_API + '/drymilk/drymilk/sheepfoldList', {
headers: { 'Authorization': 'Bearer ' + getToken() }
}).then(res => {
sheepfoldOptions.value = res.data.data || res.data;
});
const url = '/drymilk/drymilk/sheepfoldList';
const req = proxy.$request ? proxy.$request : axios.create({ baseURL: import.meta.env.VITE_APP_BASE_API, headers: { 'Authorization': 'Bearer ' + getToken() } });
req.get(url).then(res => { sheepfoldOptions.value = res.data || res.rows || []; });
}
/** 获取用户列表(技术员) */
function getUserList() {
listUser({ pageNum: 1, pageSize: 1000 }).then(response => {
userOptions.value = response.rows;
});
listUser({ pageNum: 1, pageSize: 1000 }).then(response => { userOptions.value = response.rows; });
}
// 辅助函数获取token如果没有引入请自行处理
import { getToken } from "@/utils/auth";
// 取消按钮
function cancel() {
open.value = false
reset()
}
// 表单重置
function reset() {
form.value = {
id: null,
manageTags: null,
datetime: new Date().toISOString().split('T')[0], // 默认今天
status: 0, // 默认否
datetime: new Date().toISOString().split('T')[0],
status: 0,
sheepfold: null,
tecahnician: null,
comment: null
@@ -320,36 +312,35 @@ function reset() {
proxy.resetForm("drymilkRef")
}
/** 搜索按钮操作 */
function resetQuery() {
dateRange.value = []
queryParams.value.manageTagsList = []
queryParams.value.technicianList = []
earNumberOptions.value = []
technicianOptions.value = []
proxy.resetForm("queryRef")
handleQuery()
}
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
/** 重置按钮操作 */
function resetQuery() {
dateRange.value = []
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()
getSheepfoldList(); // 加载下拉数据
getUserList(); // 加载下拉数据
getSheepfoldList();
getUserList();
open.value = true
title.value = "添加干奶记录"
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
getSheepfoldList();
@@ -362,7 +353,6 @@ function handleUpdate(row) {
})
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["drymilkRef"].validate(valid => {
if (valid) {
@@ -374,12 +364,11 @@ function submitForm() {
})
} else {
addDrymilk(form.value).then(response => {
// 如果返回warn说明部分成功部分失败
if(response.code === 200) {
proxy.$modal.msgSuccess(response.msg || "新增成功")
} else {
proxy.$modal.msgWarning(response.msg)
}
if(response.code === 200 || response.code === undefined) {
proxy.$modal.msgSuccess(response.msg || "新增成功")
} else {
proxy.$modal.msgWarning(response.msg)
}
open.value = false
getList()
})
@@ -388,7 +377,6 @@ function submitForm() {
})
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除干奶记录编号为"' + _ids + '"的数据项?').then(function() {
@@ -399,18 +387,19 @@ function handleDelete(row) {
}).catch(() => {})
}
/** 导出按钮操作 */
function handleExport() {
// 处理导出时的日期范围
let params = {...queryParams.value};
if (dateRange.value && dateRange.value.length === 2) {
params.params = {
beginTime: dateRange.value[0],
endTime: dateRange.value[1]
};
}
let params = proxy.addDateRange(queryParams.value, dateRange.value);
if (params.manageTagsList && params.manageTagsList.length > 0) {
params.manageTags = params.manageTagsList.join(',');
}
if (params.technicianList && params.technicianList.length > 0) {
params.tecahnician = params.technicianList.join(',');
}
proxy.download('drymilk/drymilk/export', params, `drymilk_${new Date().getTime()}.xlsx`)
}
// 初始化
getList()
getSheepfoldList()
getUserList()
</script>