This commit is contained in:
ll 2025-07-29 22:31:03 +08:00
commit 52f355baff
37 changed files with 7115 additions and 2017 deletions

View File

@ -31,7 +31,7 @@
"nprogress": "0.2.0",
"pinia": "2.1.7",
"splitpanes": "3.1.5",
"vue": "3.4.31",
"vue": "^3.4.31",
"vue-cropper": "1.1.1",
"vue-router": "4.4.0",
"vuedraggable": "4.1.0",

View File

@ -42,3 +42,14 @@ export function delPregnancy_Test(id) {
method: 'delete'
})
}
// 根据耳号查询羊只信息
export function getSheepByManageTags(manageTags) {
return request({
url: '/Pregnancy_Test/Pregnancy_Test/getSheepByManageTags',
method: 'get',
params: {
manageTags: manageTags
}
})
}

View File

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询检疫记录列表
export function listQuarantine(query) {
return request({
url: '/bisosafety/quarantine/list',
url: '/biosafety/quarantine/list',
method: 'get',
params: query
})
@ -12,7 +12,7 @@ export function listQuarantine(query) {
// 查询检疫记录详细
export function getQuarantine(id) {
return request({
url: '/bisosafety/quarantine/' + id,
url: '/biosafety/quarantine/' + id,
method: 'get'
})
}
@ -20,7 +20,7 @@ export function getQuarantine(id) {
// 新增检疫记录
export function addQuarantine(data) {
return request({
url: '/bisosafety/quarantine',
url: '/biosafety/quarantine',
method: 'post',
data: data
})
@ -29,7 +29,7 @@ export function addQuarantine(data) {
// 修改检疫记录
export function updateQuarantine(data) {
return request({
url: '/bisosafety/quarantine',
url: '/biosafety/quarantine',
method: 'put',
data: data
})
@ -38,7 +38,7 @@ export function updateQuarantine(data) {
// 删除检疫记录
export function delQuarantine(id) {
return request({
url: '/bisosafety/quarantine/' + id,
url: '/biosafety/quarantine/' + id,
method: 'delete'
})
}

View File

@ -52,3 +52,12 @@ export function delSheep_grouping(id) {
method: 'delete'
})
}
// 根据耳号批量新增分组映射
export function addByEarTags(data) {
return request({
url: '/sheep_grouping/sheep_grouping/addByEarTags',
method: 'post',
data
})
}

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询体尺测量列表
export function listBody_measure(query) {
return request({
url: '/body_measure/body_measure/list',
method: 'get',
params: query
})
}
// 查询体尺测量详细
export function getBody_measure(id) {
return request({
url: '/body_measure/body_measure/' + id,
method: 'get'
})
}
// 新增体尺测量
export function addBody_measure(data) {
return request({
url: '/body_measure/body_measure',
method: 'post',
data: data
})
}
// 修改体尺测量
export function updateBody_measure(data) {
return request({
url: '/body_measure/body_measure',
method: 'put',
data: data
})
}
// 删除体尺测量
export function delBody_measure(id) {
return request({
url: '/body_measure/body_measure/' + id,
method: 'delete'
})
}

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询体况评分列表
export function listBody_score(query) {
return request({
url: '/body_score/body_score/list',
method: 'get',
params: query
})
}
// 查询体况评分详细
export function getBody_score(id) {
return request({
url: '/body_score/body_score/' + id,
method: 'get'
})
}
// 新增体况评分
export function addBody_score(data) {
return request({
url: '/body_score/body_score',
method: 'post',
data: data
})
}
// 修改体况评分
export function updateBody_score(data) {
return request({
url: '/body_score/body_score',
method: 'put',
data: data
})
}
// 删除体况评分
export function delBody_score(id) {
return request({
url: '/body_score/body_score/' + id,
method: 'delete'
})
}

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询乳房评分列表
export function listBreast_rating(query) {
return request({
url: '/breast_rating/breast_rating/list',
method: 'get',
params: query
})
}
// 查询乳房评分详细
export function getBreast_rating(id) {
return request({
url: '/breast_rating/breast_rating/' + id,
method: 'get'
})
}
// 新增乳房评分
export function addBreast_rating(data) {
return request({
url: '/breast_rating/breast_rating',
method: 'post',
data: data
})
}
// 修改乳房评分
export function updateBreast_rating(data) {
return request({
url: '/breast_rating/breast_rating',
method: 'put',
data: data
})
}
// 删除乳房评分
export function delBreast_rating(id) {
return request({
url: '/breast_rating/breast_rating/' + id,
method: 'delete'
})
}

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询改备注列表
export function listChangeComment(query) {
return request({
url: '/changeComment/changeComment/list',
method: 'get',
params: query
})
}
// 查询改备注详细
export function getChangeComment(id) {
return request({
url: '/changeComment/changeComment/' + id,
method: 'get'
})
}
// 新增改备注
export function addChangeComment(data) {
return request({
url: '/changeComment/changeComment',
method: 'post',
data: data
})
}
// 修改改备注
export function updateChangeComment(data) {
return request({
url: '/changeComment/changeComment',
method: 'put',
data: data
})
}
// 删除改备注
export function delChangeComment(id) {
return request({
url: '/changeComment/changeComment/' + id,
method: 'delete'
})
}

View File

@ -0,0 +1,71 @@
import request from '@/utils/request'
// 查询修改电子耳号记录列表
export function listChangeEar(query) {
return request({
url: '/changeEar/changeEar/list',
method: 'get',
params: query
})
}
// 查询修改电子耳号记录详细
export function getChangeEar(id) {
return request({
url: '/changeEar/changeEar/' + id,
method: 'get'
})
}
// 新增修改电子耳号记录
export function addChangeEar(data) {
return request({
url: '/changeEar/changeEar',
method: 'post',
data: data
})
}
// 修改修改电子耳号记录
export function updateChangeEar(data) {
return request({
url: '/changeEar/changeEar',
method: 'put',
data: data
})
}
// 删除修改电子耳号记录
export function delChangeEar(id) {
return request({
url: '/changeEar/changeEar/' + id,
method: 'delete'
})
}
// 根据羊只ID查询基本信息
export function getSheepById(id) {
return request({
url: '/sheep/sheep/' + id,
method: 'get'
});
}
//根据耳号(管理耳号或电子耳号)查询羊只信息
export function getSheepByEarNumber(earNumber, earType) {
return request({
url: '/sheep/sheep/byEarNumber',
method: 'get',
params: { earNumber, earType }
});
}
//校验新管理/电子耳号
export function checkTagExists(tag, earType) {
return request({
url: '/sheep/sheep/existsByTag',
method: 'get',
params: { tag, earType }
});
}

View File

@ -0,0 +1,52 @@
import request from '@/utils/request'
// 查询改品种记录列表
export function listChangeVariety(query) {
return request({
url: '/changeVariety/changeVariety/list',
method: 'get',
params: query
})
}
// 查询改品种记录详细
export function getChangeVariety(id) {
return request({
url: '/changeVariety/changeVariety/' + id,
method: 'get'
})
}
// 新增改品种记录
export function addChangeVariety(data) {
return request({
url: '/changeVariety/changeVariety',
method: 'post',
data: data
})
}
// 修改改品种记录
export function updateChangeVariety(data) {
return request({
url: '/changeVariety/changeVariety',
method: 'put',
data: data
})
}
// 删除改品种记录
export function delChangeVariety(id) {
return request({
url: '/changeVariety/changeVariety/' + id,
method: 'delete'
})
}
//通过管理耳号获取羊只信息
export function getSheepByManageTags(manageTags) {
return request({
url: `/sheep/sheep/byManageTags/${manageTags}`,
method: 'get'
});
}

View File

@ -50,3 +50,13 @@ export function listSheepfold() {
method: 'get',
});
}
//审批转群记录
export function approveScTransGroup(data) {
return request({
url: '/produce/manage_sheep/trans_group/approve',
method: 'put',
data
})
}

View File

@ -9,6 +9,23 @@ export function listTransition_info(query) {
})
}
// 查询牧场列表(用于下拉框)
export function listRanch() {
return request({
url: '/ranch/ranch/list',
method: 'get',
params: { pageNum: 1, pageSize: 9999 }
});
}
// 查询指定牧场下的所有羊只耳号
export function getSheepByRanchId(ranchId) {
return request({
url: `/ranch/ranch/getSheepByRanchId/${ranchId}`,
method: 'get'
});
}
// 查询转场详细
export function getTransition_info(id) {
return request({
@ -17,15 +34,15 @@ export function getTransition_info(id) {
})
}
// 新增转场
export function addTransition_info(data) {
return request({
url: 'produce/manage_sheep/transition_info',
url: '/produce/manage_sheep/transition_info/batch',
method: 'post',
data: data
data: data
})
}
// 修改转场
export function updateTransition_info(data) {
return request({
@ -42,3 +59,14 @@ export function delTransition_info(id) {
method: 'delete'
})
}
/**
* 审批转场记录
*/
export function approveTransitionInfo(data) {
return request({
url: '/produce/manage_sheep/transition_info/approve',
method: 'put',
data
})
}

View File

@ -45,7 +45,7 @@ export function exportFixHoof(query) {
url: '/produce/other/fixHoof/export',
method: 'post',
params: query,
responseType: 'blob' // 导出功能需要设置响应类型为blob
responseType: 'blob'
})
}
@ -67,4 +67,13 @@ export function getVarietyOptions(query){
})
}
//通过羊舍获取羊只
export function getSheepBySheepfoldId(id) {
return request({
url: `/sheepfold_management/sheepfold_management/getSheepById`,
method: 'get',
params:{ id: String(id) }
})
}

View File

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询羊只品种列表
export function listVariety(query) {
return request({
url: '/variety/variety/list',
url: '/base/variety/list',
method: 'get',
params: query
})
@ -12,7 +12,7 @@ export function listVariety(query) {
// 查询羊只品种详细
export function getVariety(id) {
return request({
url: '/variety/variety/' + id,
url: '/base/variety/' + id,
method: 'get'
})
}
@ -20,7 +20,7 @@ export function getVariety(id) {
// 新增羊只品种
export function addVariety(data) {
return request({
url: '/variety/variety',
url: '/base/variety',
method: 'post',
data: data
})
@ -29,7 +29,7 @@ export function addVariety(data) {
// 修改羊只品种
export function updateVariety(data) {
return request({
url: '/variety/variety',
url: '/base/variety',
method: 'put',
data: data
})
@ -38,7 +38,7 @@ export function updateVariety(data) {
// 删除羊只品种
export function delVariety(id) {
return request({
url: '/variety/variety/' + id,
url: '/base/variety/' + id,
method: 'delete'
})
}

View File

@ -1,45 +1,43 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="耳号" prop="manageTags">
<el-input
v-model="queryParams.manageTags"
placeholder="请输入耳号,多个耳号用逗号分隔"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="孕检日期" prop="datetime">
<el-date-picker clearable
v-model="queryParams.datetime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择孕检日期">
v-model="queryParams.datetime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择孕检日期">
</el-date-picker>
</el-form-item>
<el-form-item label="孕检结果" prop="result">
<el-input
v-model="queryParams.result"
placeholder="请输入孕检结果"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="${comment}" prop="number">
<el-input
v-model="queryParams.number"
placeholder="请输入${comment}"
clearable
@keyup.enter="handleQuery"
/>
<el-select v-model="queryParams.result" placeholder="请选择孕检结果" clearable>
<el-option label="怀孕" value="怀孕" />
<el-option label="未孕" value="未孕" />
<el-option label="流产" value="流产" />
</el-select>
</el-form-item>
<el-form-item label="技术员" prop="technician">
<el-input
v-model="queryParams.technician"
placeholder="请输入技术员"
clearable
@keyup.enter="handleQuery"
v-model="queryParams.technician"
placeholder="请输入技术员"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="${comment}" prop="way">
<el-input
v-model="queryParams.way"
placeholder="请输入${comment}"
clearable
@keyup.enter="handleQuery"
/>
<el-form-item label="孕检方式" prop="way">
<el-select v-model="queryParams.way" placeholder="请选择孕检方式" clearable>
<el-option label="B超" value="B超" />
<el-option label="试纸" value="试纸" />
<el-option label="血检" value="血检" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@ -50,40 +48,40 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['Pregnancy_Test:Pregnancy_Test:add']"
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['Pregnancy_Test:Pregnancy_Test:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['Pregnancy_Test:Pregnancy_Test:edit']"
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['Pregnancy_Test:Pregnancy_Test:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['Pregnancy_Test:Pregnancy_Test:remove']"
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['Pregnancy_Test:Pregnancy_Test:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['Pregnancy_Test:Pregnancy_Test:export']"
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['Pregnancy_Test:Pregnancy_Test:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
@ -91,55 +89,166 @@
<el-table v-loading="loading" :data="Pregnancy_TestList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="${comment}" align="center" prop="id" />
<el-table-column label="孕检日期" align="center" prop="datetime" width="180">
<el-table-column label="耳号" align="center" prop="manageTags" width="120" />
<el-table-column label="品种" align="center" prop="variety" width="100" />
<el-table-column label="事件类型" align="center" width="80">
<template #default="scope">
<span>孕检</span>
</template>
</el-table-column>
<el-table-column label="孕检日期" align="center" prop="datetime" width="120">
<template #default="scope">
<span>{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="孕检结果" align="center" prop="result" />
<el-table-column label="${comment}" align="center" prop="number" />
<el-table-column label="技术员" align="center" prop="technician" />
<el-table-column label="${comment}" align="center" prop="way" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="孕检结果" align="center" prop="result" width="80" />
<el-table-column label="配种公羊" align="center" prop="fatherManageTags" width="100" />
<el-table-column label="配种公羊品种" align="center" prop="fatherVariety" width="120" />
<el-table-column label="配种类型" align="center" prop="matingTypeName" width="80" />
<el-table-column label="配种日期" align="center" prop="matingDate" width="120">
<template #default="scope">
<span>{{ parseTime(scope.row.matingDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="胎儿数量" align="center" prop="fetusCount" width="80" />
<el-table-column label="月龄" align="center" prop="monthAge" width="60" />
<el-table-column label="孕检时羊只类别" align="center" prop="breedStatus" width="120" />
<el-table-column label="胎次" align="center" prop="parity" width="60" />
<el-table-column label="配次" align="center" prop="matingCounts" width="60" />
<el-table-column label="当前羊舍" align="center" prop="sheepfoldName" width="100" />
<el-table-column label="技术员" align="center" prop="technician" width="80" />
<el-table-column label="繁育状态" align="center" prop="breedStatus" width="80" />
<el-table-column label="预产日期" align="center" prop="expectedDate" width="120">
<template #default="scope">
<span>{{ parseTime(scope.row.expectedDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="上次事件日期" align="center" prop="lastEventDate" width="120">
<template #default="scope">
<span>{{ parseTime(scope.row.lastEventDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="孕检方式" align="center" prop="way" width="80" />
<el-table-column label="创建人" align="center" prop="createBy" width="80" />
<el-table-column label="创建日期" align="center" prop="createTime" width="120">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="所在牧场" align="center" prop="ranchName" width="100" />
<el-table-column label="备注" align="center" prop="remark" width="120" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150" fixed="right">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['Pregnancy_Test:Pregnancy_Test:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['Pregnancy_Test:Pregnancy_Test: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"
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="Pregnancy_TestRef" :model="form" :rules="rules" label-width="80px">
<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-form-item>
<el-form-item label="孕检结果" prop="result">
<el-input v-model="form.result" placeholder="请输入孕检结果" />
</el-form-item>
<el-form-item label="${comment}" prop="number">
<el-input v-model="form.number" placeholder="请输入${comment}" />
</el-form-item>
<el-form-item label="技术员" prop="technician">
<el-input v-model="form.technician" placeholder="请输入技术员" />
</el-form-item>
<el-form-item label="${comment}" prop="way">
<el-input v-model="form.way" placeholder="请输入${comment}" />
</el-form-item>
<el-dialog :title="title" v-model="open" width="800px" append-to-body>
<el-form ref="Pregnancy_TestRef" :model="form" :rules="rules" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="耳号" prop="manageTags">
<el-input v-model="form.manageTags" placeholder="请输入耳号" @blur="getSheepInfo" />
</el-form-item>
</el-col>
<el-col :span="12">
<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-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="孕检结果" prop="result">
<el-select v-model="form.result" placeholder="请选择孕检结果">
<el-option label="怀孕" value="怀孕" />
<el-option label="未孕" value="未孕" />
<el-option label="流产" value="流产" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="胎儿数量" prop="fetusCount">
<el-input-number v-model="form.fetusCount" :min="0" :max="10" placeholder="请输入胎儿数量" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="技术员" prop="technician">
<el-input v-model="form.technician" placeholder="请输入技术员" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="孕检方式" prop="way">
<el-select v-model="form.way" placeholder="请选择孕检方式">
<el-option label="B超" value="B超" />
<el-option label="试纸" value="试纸" />
<el-option label="血检" value="血检" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
<!-- 羊只信息显示 -->
<el-divider content-position="left">羊只信息</el-divider>
<el-row :gutter="20" v-if="sheepInfo.id">
<el-col :span="8">
<el-form-item label="品种">
<el-input v-model="sheepInfo.variety" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="月龄">
<el-input v-model="sheepInfo.monthAge" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="胎次">
<el-input v-model="sheepInfo.parity" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" v-if="sheepInfo.id">
<el-col :span="8">
<el-form-item label="配次">
<el-input v-model="sheepInfo.matingCounts" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="当前羊舍">
<el-input v-model="sheepInfo.sheepfoldName" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="繁育状态">
<el-input v-model="sheepInfo.breedStatus" disabled />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
@ -152,7 +261,7 @@
</template>
<script setup name="Pregnancy_Test">
import { listPregnancy_Test, getPregnancy_Test, delPregnancy_Test, addPregnancy_Test, updatePregnancy_Test } from "@/api/Pregnancy_Test/Pregnancy_Test"
import { listPregnancy_Test, getPregnancy_Test, delPregnancy_Test, addPregnancy_Test, updatePregnancy_Test, getSheepByManageTags } from "@/api/Pregnancy_Test/Pregnancy_Test"
const { proxy } = getCurrentInstance()
@ -165,19 +274,35 @@ const single = ref(true)
const multiple = ref(true)
const total = ref(0)
const title = ref("")
const sheepInfo = ref({})
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
manageTags: null,
datetime: null,
result: null,
number: null,
technician: null,
way: null,
},
rules: {
manageTags: [
{ required: true, message: "耳号不能为空", trigger: "blur" }
],
datetime: [
{ required: true, message: "孕检日期不能为空", trigger: "change" }
],
result: [
{ required: true, message: "孕检结果不能为空", trigger: "change" }
],
technician: [
{ required: true, message: "技术员不能为空", trigger: "blur" }
],
way: [
{ required: true, message: "孕检方式不能为空", trigger: "change" }
]
}
})
@ -193,6 +318,22 @@ function getList() {
})
}
/** 根据耳号获取羊只信息 */
function getSheepInfo() {
if (form.value.manageTags) {
getSheepByManageTags(form.value.manageTags).then(response => {
if (response.data) {
sheepInfo.value = response.data
form.value.sheepId = response.data.id
} else {
proxy.$modal.msgError("未找到该耳号的羊只信息")
sheepInfo.value = {}
form.value.sheepId = null
}
})
}
}
//
function cancel() {
open.value = false
@ -203,14 +344,18 @@ function cancel() {
function reset() {
form.value = {
id: null,
sheepId: null,
manageTags: null,
datetime: null,
result: null,
number: null,
fetusCount: null,
technician: null,
way: null,
remark: null,
createBy: null,
createTime: null
}
sheepInfo.value = {}
proxy.resetForm("Pregnancy_TestRef")
}
@ -246,6 +391,11 @@ function handleUpdate(row) {
const _id = row.id || ids.value
getPregnancy_Test(_id).then(response => {
form.value = response.data
form.value.manageTags = response.data.manageTags
//
if (response.data.manageTags) {
getSheepInfo()
}
open.value = true
title.value = "修改孕检记录"
})
@ -292,3 +442,12 @@ function handleExport() {
getList()
</script>
<style scoped>
.el-table {
font-size: 12px;
}
.el-table .cell {
padding: 0 5px;
}
</style>

View File

@ -1,31 +1,16 @@
<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"
/>
<!-- 1. 搜索 -->
<el-form :model="queryParams" ref="queryRef" inline v-show="showSearch" label-width="68px">
<el-form-item label="羊只耳号" prop="sheepNo">
<el-input v-model="queryParams.sheepNo" placeholder="请输入羊只耳号" clearable @keyup.enter="getList" />
</el-form-item>
<el-form-item label="驱虫日期" style="width: 308px">
<el-date-picker
v-model="daterangeDatetime"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
<el-form-item label="驱虫日期">
<el-date-picker v-model="daterangeDatetime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
<el-form-item label="技术员" prop="technical">
<el-input
v-model="queryParams.technical"
placeholder="请输入技术员"
clearable
@keyup.enter="handleQuery"
/>
<el-input v-model="queryParams.technical" placeholder="请输入技术员" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@ -33,277 +18,518 @@
</el-form-item>
</el-form>
<!-- 2. 按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['biosafety:deworm:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['biosafety:deworm:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['biosafety:deworm:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['biosafety:deworm:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
<el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate">修改</el-button>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete">删除</el-button>
<el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
</el-row>
<!-- 3. 列表 -->
<el-table v-loading="loading" :data="dewormList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="${comment}" align="center" prop="id" />
<el-table-column label="羊只id" align="center" prop="sheepId" />
<el-table-column label="药品使用记录" align="center" prop="usageId" />
<el-table-column label="羊只耳号" align="center" prop="sheepNo" />
<el-table-column label="品种" align="center" prop="variety" />
<el-table-column label="羊只类别" align="center" prop="sheepType" />
<el-table-column label="性别" align="center" prop="gender" />
<el-table-column label="性别" align="center" prop="gender">
<template #default="scope">
<dict-tag :options="sheep_gender" :value="scope.row.gender" />
</template>
</el-table-column>
<el-table-column label="月龄" align="center" prop="monthAge" />
<el-table-column label="胎次" align="center" prop="parity" />
<el-table-column label="繁殖状态" align="center" prop="breed" />
<el-table-column label="驱虫日期" align="center" prop="datetime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</span>
</template>
<template #default="scope">{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</template>
</el-table-column>
<el-table-column label="技术员" align="center" prop="technical" />
<el-table-column label="备注" align="center" prop="comment" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" width="200">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['biosafety:deworm:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['biosafety:deworm:remove']">删除</el-button>
<el-button link type="primary" @click="handleUpdate(scope.row)">修改</el-button>
<el-button link type="danger" @click="handleDelete(scope.row)">删除</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="dewormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="羊只id" prop="sheepId">
<el-input v-model="form.sheepId" placeholder="请输入羊只id" />
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 4. 新增弹窗羊舍多选 + 无卡片 + 自动剔除 -->
<el-dialog title="新增驱虫记录" v-model="addOpen" width="60%" top="5vh" append-to-body>
<el-form ref="addFormRef" :model="addForm" :rules="addRules" label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
<!-- 耳号追加 -->
<el-form-item label="耳号">
<el-input v-model="sheepInput" placeholder="输入耳号回车添加" style="width: 220px" @keyup.enter="validateSheep" />
</el-form-item>
</el-col>
<el-col :span="12">
<!-- 羊舍多选 -->
<el-form-item label="羊舍" prop="barnIds">
<el-select v-model="selectedBarnIds" multiple collapse-tags placeholder="请选择羊舍" style="width: 100%"
@change="handleBarnChange">
<el-option v-for="b in barns" :key="b.id" :label="b.sheepfoldName" :value="b.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- 已选耳号 -->
<el-form-item label="已选耳号">
<el-tag v-for="(tag, idx) in selectedSheepList" :key="tag.sheepId" closable @close="removeSheep(idx)"
style="margin-right: 6px">
{{ tag.sheepNo }}
</el-tag>
</el-form-item>
<el-form-item label="药品使用记录" prop="usageId">
<el-input v-model="form.usageId" placeholder="请输入药品使用记录" />
</el-form-item>
<el-form-item label="品种" prop="variety">
<el-input v-model="form.variety" placeholder="请输入品种" />
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-input v-model="form.gender" placeholder="请输入性别" />
</el-form-item>
<el-form-item label="月龄" prop="monthAge">
<el-input v-model="form.monthAge" placeholder="请输入月龄" />
</el-form-item>
<el-form-item label="胎次" prop="parity">
<el-input v-model="form.parity" placeholder="请输入胎次" />
</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-form-item>
<el-form-item label="技术员" prop="technical">
<el-input v-model="form.technical" placeholder="请输入技术员" />
</el-form-item>
<el-form-item label="备注" prop="comment">
<el-input v-model="form.comment" placeholder="请输入备注" />
<!-- 驱虫信息 -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="驱虫日期" prop="datetime">
<el-date-picker v-model="addForm.datetime" type="date" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="处方">
<el-select v-model="addForm.prescriptionId" filterable clearable placeholder="请选择处方" style="width: 100%"
@change="handleSelectPrescription">
<el-option v-for="p in presOptions" :key="p.id" :label="p.label" :value="p.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="技术员">
<el-input v-model="addForm.technical" placeholder="请输入技术员姓名" />
</el-form-item>
</el-col>
</el-row>
<div style="margin: 8px 5px;">
<!-- 药品明细 -->
<el-button type="primary" icon="Plus" size="small" @click="handleAddDetail">添加药品</el-button>
<el-table :data="usageDetails" border stripe style="margin-top: 8px">
<el-table-column label="药品">
<template #default="scope">
<el-select v-model="scope.row.mediId" filterable placeholder="请选择药品">
<el-option v-for="m in medicines" :key="m.value" :label="m.label" :value="m.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用量" width="160">
<template #default="scope">
<el-input-number v-model="scope.row.dosage" :min="0" :precision="1" />
</template>
</el-table-column>
<el-table-column label="单位" width="120">
<template #default="scope">
<el-select v-model="scope.row.unit" placeholder="单位">
<el-option v-for="u in units" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用法" width="120">
<template #default="scope">
<el-select v-model="scope.row.usageId" placeholder="用法">
<el-option v-for="u in usages" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="生产厂家">
<template #default="scope">
<el-input v-model="scope.row.manufacturer" placeholder="生产厂家" />
</template>
</el-table-column>
<el-table-column label="生产批号">
<template #default="scope">
<el-input v-model="scope.row.batchNumber" placeholder="批号" />
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button link type="danger" icon="Delete" @click="usageDetails.splice(scope.$index, 1)" />
</template>
</el-table-column>
</el-table>
</div>
<el-form-item label="备注">
<el-input type="textarea" :rows="3" v-model="addForm.comment" placeholder="请输入备注" />
</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>
<el-button @click="addOpen = false"> </el-button>
<el-button type="primary" @click="submitAddForm"> </el-button>
</template>
</el-dialog>
<!-- 5. 修改弹窗羊舍只读下拉 -->
<el-dialog title="修改驱虫记录" v-model="editOpen" width="60%" top="5vh" append-to-body>
<el-form ref="editFormRef" :model="editForm" :rules="editRules" label-width="100px">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="羊只耳号">
<span>{{ editForm.sheepNo }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="品种">
<span>{{ editForm.variety }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="羊只类别">
<span>{{ editForm.sheepType }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别">
<span> <dict-tag :options="sheep_gender" :value="editForm.gender" /></span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="繁殖状态">
<span>{{ editForm.breed }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="驱虫日期" prop="datetime">
<el-date-picker v-model="editForm.datetime" type="date" style="width: 100%" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="技术员">
<el-input v-model="editForm.technical" placeholder="请输入技术员姓名" />
</el-form-item>
</el-col>
</el-row>
<div style="margin: 10px 10px;">
<el-button type="primary" icon="Plus" size="small" @click="handleAddDetail">添加药品</el-button>
<el-table :data="usageDetails" border stripe style="margin-top: 8px">
<el-table-column label="药品">
<template #default="scope">
<el-select v-model="scope.row.mediId" filterable placeholder="请选择药品">
<el-option v-for="m in medicines" :key="m.value" :label="m.label" :value="m.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用量" width="160">
<template #default="scope">
<el-input-number v-model="scope.row.dosage" :min="0" :precision="1" style="width: 120px;"/>
</template>
</el-table-column>
<el-table-column label="单位" width="120">
<template #default="scope">
<el-select v-model="scope.row.unit" placeholder="单位">
<el-option v-for="u in units" :key="u.value" :label="u.label" :value="u.value+''" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用法" width="120">
<template #default="scope">
<el-select v-model="scope.row.usageId" placeholder="用法">
<el-option v-for="u in usages" :key="u.value" :label="u.label" :value="u.value+''" />
</el-select>
</template>
</el-table-column>
<el-table-column label="生产厂家">
<template #default="scope">
<el-input v-model="scope.row.manufacturer" placeholder="生产厂家" />
</template>
</el-table-column>
<el-table-column label="生产批号">
<template #default="scope">
<el-input v-model="scope.row.batchNumber" placeholder="批号" />
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button link type="danger" icon="Delete" @click="usageDetails.splice(scope.$index, 1)" />
</template>
</el-table-column>
</el-table>
</div>
<el-form-item label="备注">
<el-input type="textarea" :rows="3" v-model="editForm.comment" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="editOpen = false"> </el-button>
<el-button type="primary" @click="submitEditForm"> </el-button>
</template>
</el-dialog>
</div>
</template>
<script setup name="Deworm">
import { listDeworm, getDeworm, delDeworm, addDeworm, updateDeworm } from "@/api/biosafety/deworm"
<script setup name="Deworm">
import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
import { listDeworm, getDeworm, delDeworm, addDeworm, updateDeworm } from '@/api/biosafety/deworm'
import { listPrescription, getPrescription } from '@/api/biosafety/prescription'
import { listUnit } from '@/api/biosafety/unit'
import { listUsage } from '@/api/biosafety/usage'
import { listMedicine } from '@/api/biosafety/medicine'
import request from '@/utils/request'
import { parseTime } from '@/utils/ruoyi'
const { proxy } = getCurrentInstance()
const { proxy } = getCurrentInstance()
const { sheep_gender } = proxy.useDict('sheep_gender')
const dewormList = 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 daterangeDatetime = ref([])
/* ------------------ 列表 ------------------ */
const loading = ref(true)
const showSearch = ref(true)
const total = ref(0)
const dewormList = ref([])
const daterangeDatetime = ref([])
const data = reactive({
form: {},
queryParams: {
const queryParams = reactive({
pageNum: 1,
pageSize: 10,
sheepId: null,
datetime: null,
technical: null,
},
rules: {
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询驱虫列表 */
function getList() {
loading.value = true
queryParams.value.params = {}
if (null != daterangeDatetime && '' != daterangeDatetime) {
queryParams.value.params["beginDatetime"] = daterangeDatetime.value[0]
queryParams.value.params["endDatetime"] = daterangeDatetime.value[1]
}
listDeworm(queryParams.value).then(response => {
dewormList.value = response.rows
total.value = response.total
loading.value = false
sheepNo: null,
technical: null
})
}
//
function cancel() {
open.value = false
reset()
}
const ids = ref([])
const single = ref(true)
const multiple = ref(true)
//
function reset() {
form.value = {
id: null,
sheepId: null,
usageId: null,
variety: null,
sheepType: null,
gender: null,
monthAge: null,
parity: null,
datetime: null,
technical: null,
comment: null,
updateBy: null,
updateTime: null,
createBy: null,
createTime: null
function getList() {
loading.value = true
const qp = { ...queryParams }
qp.params = {}
if (daterangeDatetime.value?.length) {
qp.params.beginDatetime = daterangeDatetime.value[0]
qp.params.endDatetime = daterangeDatetime.value[1]
}
listDeworm(qp).then(res => {
dewormList.value = res.rows
total.value = res.total
loading.value = false
})
}
proxy.resetForm("dewormRef")
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id)
single.value = selection.length !== 1
multiple.value = !selection.length
}
/** 重置按钮操作 */
function resetQuery() {
daterangeDatetime.value = []
proxy.resetForm("queryRef")
handleQuery()
}
function handleQuery() {
queryParams.pageNum = 1
getList()
}
function resetQuery() {
daterangeDatetime.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()
open.value = true
title.value = "添加驱虫"
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
const _id = row.id || ids.value
getDeworm(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改驱虫"
/* ------------------ 新增 ------------------ */
const addOpen = ref(false)
const addForm = reactive({
datetime: new Date(),
technical: '',
comment: '',
prescriptionId: null
})
}
const addRules = {
datetime: [{ required: true, message: '请选择日期', trigger: 'change' }]
}
const selectedBarnIds = ref([])
const selectedSheepList = ref([])
const barns = ref([])
const sheepInput = ref('')
/** 提交按钮 */
function submitForm() {
proxy.$refs["dewormRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateDeworm(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
function getBarns() {
request({ url: '/sheepfold_management/sheepfold_management/list', method: 'get' })
.then(res => (barns.value = res.rows))
}
function handleBarnChange(barnIds) {
// 1. id
const currentIds = new Set(barnIds || [])
// 2.
selectedSheepList.value = selectedSheepList.value.filter(
s => currentIds.has(s.barnId)
)
// 3.
const taskArr = [...currentIds].filter(id =>
!selectedSheepList.value.some(s => s.barnId === id)
)
if (!taskArr.length) return
Promise.all(
taskArr.map(id =>
request({ url: `/sheepfold_management/sheepfold_management/getSheepById`, params: { id } })
)
).then(resArr => {
const list = resArr.flatMap(r => (r.data || []).map(s => ({
sheepNo: s.manageTags,
sheepId: s.id,
barnId: s.barnId
})))
const map = new Map(selectedSheepList.value.map(s => [s.sheepId, s]))
list.forEach(item => map.set(item.sheepId, item))
selectedSheepList.value = [...map.values()]
})
}
function validateSheep() {
const no = sheepInput.value.trim()
if (!no) return
if (selectedSheepList.value.some(s => s.sheepNo === no)) {
proxy.$modal.msgWarning('该耳号已存在')
sheepInput.value = ''
return
}
request.get(`/sheep_file/sheep_file/byNo/${no}`).then(res => {
if (!res.data) {
proxy.$modal.msgError('羊只耳号不存在')
} else {
addDeworm(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功")
open.value = false
getList()
selectedSheepList.value.push({
sheepNo: res.data.sheepNo || res.data.bsManageTags,
sheepId: res.data.id
})
}
}
})
}
sheepInput.value = ''
})
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除驱虫编号为"' + _ids + '"的数据项?').then(function() {
return delDeworm(_ids)
}).then(() => {
function removeSheep(index) {
selectedSheepList.value.splice(index, 1)
}
function handleAdd() {
Object.assign(addForm, {
datetime: new Date(),
technical: '',
comment: '',
prescriptionId: null
})
selectedBarnIds.value = []
selectedSheepList.value = []
usageDetails.value = [{ mediId: null, dosage: 0, unit: null, usageId: null,manufacturer:null,batchNumber:null }]
getBarns()
addOpen.value = true
}
function submitAddForm() {
proxy.$refs.addFormRef.validate(valid => {
if (!valid || !selectedSheepList.value.length) {
proxy.$modal.msgError('请完善表单并至少选择一只羊')
return
}
addDeworm({
...addForm,
datetime: new Date(addForm.datetime).getTime(),
sheepIds: selectedSheepList.value.map(s => s.sheepId),
usageDetails: usageDetails.value
}).then(() => {
proxy.$modal.msgSuccess('新增成功')
addOpen.value = false
getList()
})
})
}
/* ------------------ 修改 ------------------ */
const editOpen = ref(false)
const editForm = reactive({})
const editRules = {
datetime: [{ required: true, message: '请选择日期', trigger: 'change' }]
}
function handleUpdate(row) {
getDeworm(row.id).then(res => {
Object.assign(editForm, res.data)
selectedSheepList.value = [{ sheepNo: res.data.sheepNo, sheepId: res.data.sheepId }]
usageDetails.value = res.data.usageDetails || []
editOpen.value = true
})
}
function submitEditForm() {
proxy.$refs.editFormRef.validate(valid => {
if (!valid) return
updateDeworm({
...editForm,
datetime: new Date(editForm.datetime).getTime(),
usageDetails: usageDetails.value
}).then(() => {
proxy.$modal.msgSuccess('修改成功')
editOpen.value = false
getList()
})
})
}
/* ------------------ 功能函数 ------------------ */
function handleDelete(row) {
const id = row.id || ids.value
proxy.$modal.confirm('确认删除?')
.then(() => delDeworm(id))
.then(() => {
getList()
proxy.$modal.msgSuccess('删除成功')
})
}
function handleExport() {
proxy.download('biosafety/deworm/export', { ...queryParams }, `deworm_${Date.now()}.xlsx`)
}
/* ------------------ 药品/处方/下拉 ------------------ */
const usageDetails = ref([])
const presOptions = ref([])
const units = ref([])
const usages = ref([])
const medicines = ref([])
function handleSelectPrescription(id) {
if (!id) return
getPrescription(id).then(res => {
usageDetails.value = res.data?.swPresDetailList?.map(i => ({
mediId: i.mediId,
dosage: i.dosage,
unit: i.unitId,
usageId: i.usageId
})) || []
})
}
function handleAddDetail() {
usageDetails.value.push({ mediId: null, dosage: 0, unit: null, usageId: null,manufacturer:null,batchNumber:null })
}
/* ------------------ 初始化 ------------------ */
onMounted(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => {})
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('biosafety/deworm/export', {
...queryParams.value
}, `deworm_${new Date().getTime()}.xlsx`)
}
getList()
</script>
getBarns()
listPrescription({ status: 1, persType: 1 }).then(res => {
presOptions.value = res.rows.map(item => ({ id: item.id, label: item.name }))
})
listUnit().then(res => {
units.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
listUsage().then(res => {
usages.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
listMedicine().then(res => {
medicines.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
})
</script>

View File

@ -0,0 +1,400 @@
<template>
<div class="add-treatment">
<el-container style="height: 100vh; display: flex; flex-direction: column;">
<el-main style="padding: 0; flex: 1; display: flex; flex-direction: column;">
<div class="content-wrapper">
<h2 class="page-title">添加治疗记录</h2>
<div class="treatment-container">
<!-- 羊只信息只读展示 -->
<div class="sheep-info-section">
<el-row :gutter="20">
<el-col :span="6">
<div class="info-item">
<strong>耳号</strong>{{ sheepInfo.sheepNo || '' }}
</div>
</el-col>
<el-col :span="6">
<div class="info-item">
<strong>性别</strong>{{ sheepInfo.gender }}
</div>
</el-col>
<el-col :span="6">
<div class="info-item">
<strong>品种</strong>{{ sheepInfo.variety || '' }}
</div>
</el-col>
<el-col :span="6">
<div class="info-item">
<strong>羊只类别</strong>{{ sheepInfo.sheepType || '' }}
</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<div class="info-item">
<strong>月龄</strong>{{ sheepInfo.monthAge ?? '' }} &nbsp;
</div>
</el-col>
<el-col :span="6">
<div class="info-item">
<strong>胎次</strong>{{ sheepInfo.parity ?? '' }}
</div>
</el-col>
</el-row>
</div>
<el-form ref="treatmentRef" :model="form" :rules="rules" label-width="140px" status-icon
size="large" class="treatment-form">
<!-- 疾病和诊疗信息 -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="事件日期" prop="datetime">
<el-date-picker v-model="form.datetime" type="date" placeholder="选择日期"
style="width: 100%;" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发病日期" prop="begindate">
<el-date-picker v-model="form.begindate" type="date" placeholder="选择日期"
style="width: 100%;" :disabled="true" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="疾病类型" prop="diseasePName">
<span>{{ form.diseasePName }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="疾病子类型" prop="diseaseName">
<span>{{ form.diseaseName }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="治疗结束日期" prop="enddate">
<el-date-picker v-model="form.enddate" type="date" placeholder="选择日期"
style="width: 100%" :disabled-date="disabledDate" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="治疗天数">
<span>{{ treatDay || 0}} </span>
<!-- <el-input :value="treatDay" readonly style="width: 100%;" /> -->
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="治疗结果" prop="result">
<el-select v-model="form.result" placeholder="请选择治疗结果" style="width: 100%;">
<el-option v-for="item in diag_status" :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="sheepfoldId">
<el-select v-model="form.sheepfoldId" placeholder="请选择转入羊舍"
style="width: 100%;">
<el-option v-for="item in sheepfolds" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注" prop="comments">
<el-input type="textarea" :rows="3" v-model="form.comments" placeholder="请输入备注" />
</el-form-item>
<div class="form-footer">
<el-button @click="goBack">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
</div>
</el-form>
</div>
</div>
</el-main>
</el-container>
</div>
</template>
<script setup>
import { ref, reactive, onMounted, computed, getCurrentInstance } from 'vue'
import { ElMessage } from 'element-plus'
import { useRoute, useRouter } from 'vue-router'
import useTagsViewStore from "@/store/modules/tagsView.js"
import request from '@/utils/request'
import { listDisease } from '@/api/biosafety/disease'
import { getTreatment } from '@/api/biosafety/treatment'
import { listSheepfold_management } from "@/api/fileManagement/sheepfold_management"
import { addDiagnosis } from "@/api/biosafety/diagnosis"
const { proxy } = getCurrentInstance()
const { diag_status } = proxy.useDict( "diag_status")
const route = useRoute()
const router = useRouter()
const { tId, sId } = route.query
const sheepInfo = ref({
sheepNo: null,
gender: '',
variety: '',
sheepType: '',
monthAge: null,
parity: null,
breed: '',
lactDay: null,
gestDay: null
})
const sheepfolds = ref([])
function getSheepInfo() {
if (!sId) return
request.get(`/sheep_file/sheep_file/${sId}`).then(response => {
const data = response.data
sheepInfo.value = {
sheepNo: data.bsManageTags,
gender: data.gender,
variety: data.variety,
sheepType: data.name,
monthAge: data.monthAge,
parity: data.parity,
breed: data.breed,
}
})
}
function getTreatmentInfo() {
if (!tId) return
getTreatment(tId).then(response => {
const data = response.data
form.treatId = tId
form.datetime = new Date()
form.begindate = new Date(data.datetime)
form.diseasePName = data.diseasePName
form.diseaseId = data.diseaseId
form.diseasePid = data.diseasePid
form.diseaseName = data.diseaseName
})
}
const parentDiseaseOptions = ref([])
const childDiseaseOptions = ref([])
function getDiseases() {
listDisease().then(response => {
const diseases = proxy.handleTree(response.data, "id", "pid")
parentDiseaseOptions.value = diseases.filter(item => item.pid === 0)
})
}
function handleDiseaseTypeChange(parentId) {
if (!parentId) {
childDiseaseOptions.value = []
form.diseaseName = null
return
}
listDisease({ pid: parentId }).then(response => {
childDiseaseOptions.value = response.data
form.diseaseName = null
})
}
const form = reactive({
datetime: new Date(),
begindate: null,
eventType: '',
diseasePName: null,
diseaseName: null,
result: '',
enddate: null,
comments: '',
sheepId: sId
})
const rules = {
datetime: { required: true, message: '事件日期不能为空', trigger: 'change' },
enddate: { required: true, message: '治疗日期不能为空', trigger: 'change' },
sheepfoldId: { required: true, message: '转入羊舍不能为空', trigger: 'change' },
result: { required: true, message: '治疗结果不能为空', trigger: 'change' }
}
const treatDay = computed(() => {
if (!form.begindate || !form.enddate) return ''
const onset = new Date(form.begindate)
const end = new Date(form.enddate)
const diffTime = end.getTime() - onset.getTime()
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24))
return diffDays
})
function submitForm() {
proxy.$refs.treatmentRef.validate((valid) => {
if (valid) {
const submitData = {
...form,
datetime: form.datetime ? new Date(form.datetime).getTime() : null,
begindate: form.begindate ? new Date(form.begindate).getTime() : null,
endDate: form.endDate ? new Date(form.endDate).getTime() : null,
treatDay: treatDay.value
}
addDiagnosis(submitData).then(response => {
proxy.$modal.msgSuccess("诊断成功")
open.value = false
goBack()
})
} else {
ElMessage.error("请完整填写表单信息!")
return false
}
})
}
//
const disabledDate = (time) => {
return time.getTime() < Date.now() - 8.64e7 // 8.64e7 = 24*60*60*1000
}
const useTagsStore = useTagsViewStore()
const currentTag = router.currentRoute.value
const goBack = () => {
router.go(-1)
useTagsStore.delVisitedView(currentTag)
}
onMounted(() => {
getDiseases()
getTreatmentInfo()
getSheepInfo()
listSheepfold_management().then(res => {
sheepfolds.value = res.rows.map(item => ({ id: item.id, name: item.sheepfoldName }))
})
})
</script>
<style scoped>
.add-treatment {
height: 100vh;
display: flex;
flex-direction: column;
overflow: hidden;
}
.el-container {
height: 100%;
display: flex;
flex-direction: column;
}
.content-wrapper {
flex: 1;
overflow-y: auto;
padding: 20px;
display: flex;
flex-direction: column;
}
.page-title {
margin: 0 0 24px;
font-size: 24px;
font-weight: 600;
color: #303133;
text-align: center;
}
.treatment-container {
max-width: 1200px;
margin: 0 auto;
width: 100%;
padding: 20px;
box-sizing: border-box;
}
.sheep-info-section {
background-color: #f5f7fa;
padding: 20px;
border-radius: 8px;
margin-bottom: 32px;
}
.info-item {
display: flex;
align-items: center;
margin-bottom: 8px;
}
.info-item strong {
color: #606266;
font-weight: 500;
margin-right: 8px;
width: 100px;
}
.info-item span {
color: #303133;
flex: 1;
}
.treatment-form {
margin: 0 auto;
padding: 0 20px;
flex: 1;
display: flex;
flex-direction: column;
}
.el-form-item {
margin-bottom: 24px;
}
.el-input,
.el-textarea,
.el-select {
width: 100%;
}
.form-footer {
margin-top: 40px;
text-align: center;
}
.form-footer .el-button {
padding: 12px 40px;
font-size: 16px;
border-radius: 6px;
}
@media (max-width: 768px) {
.el-col {
margin-bottom: 16px;
}
.el-row {
margin-bottom: 16px;
}
.info-item {
flex-direction: column;
align-items: flex-start;
margin-bottom: 12px;
}
.info-item strong {
margin-bottom: 6px;
}
}
</style>

View File

@ -1,222 +1,217 @@
<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 :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
<el-form-item label="羊只" prop="sheepId">
<el-input v-model="queryParams.sheepNo" placeholder="请输入羊只耳号" clearable />
</el-form-item>
<el-form-item label="时间日期" style="width: 308px">
<el-date-picker
v-model="daterangeDatetime"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
<el-date-picker v-model="daterangeDatetime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
<el-form-item label="疾病类型" prop="diseasePid">
<el-input
v-model="queryParams.diseasePid"
placeholder="请输入疾病类型"
clearable
@keyup.enter="handleQuery"
/>
<el-select v-model="queryParams.diseasePid" clearable placeholder="请选择疾病类型" style="width: 120px;" filterable
@change="handleDiseaseTypeChange">
<el-option v-for="d in pDiseaseOptions" :key="d.id" :label="d.name" :value="d.id" />
</el-select>
</el-form-item>
<el-form-item label="子疾病" prop="diseaseId">
<el-input
v-model="queryParams.diseaseId"
placeholder="请输入子疾病"
clearable
@keyup.enter="handleQuery"
/>
<el-select v-model="queryParams.diseaseId" :disabled="!queryParams.diseasePid" clearable placeholder="请选择疾病类型"
style="width: 120px;" filterable>
<el-option v-for="d in cDiseaseOptions" :key="d.id" :label="d.name" :value="d.id" />
</el-select>
</el-form-item>
<el-form-item label="诊疗结果" prop="result">
<el-input
v-model="queryParams.result"
placeholder="请输入诊疗结果"
clearable
@keyup.enter="handleQuery"
/>
<el-select v-model="queryParams.result" clearable placeholder="请选择诊疗结果" style="width: 120px;">
<el-option v-for="r in diag_result" :key="r.value" :label="r.label" :value="r.value" />
</el-select>
</el-form-item>
<el-form-item label="治疗天数" prop="treatDay">
<el-input
v-model="queryParams.treatDay"
placeholder="请输入治疗天数"
clearable
@keyup.enter="handleQuery"
/>
<el-input v-model="queryParams.treatDay" placeholder="请输入治疗天数" clearable />
</el-form-item>
<el-form-item label="羊舍id" prop="sheepfoldId">
<el-input
v-model="queryParams.sheepfoldId"
placeholder="请输入羊舍id"
clearable
@keyup.enter="handleQuery"
/>
<el-form-item label="羊舍" prop="sheepfoldId">
<el-select v-model="queryParams.sheepfoldId" clearable placeholder="请选择羊舍" style="width: 120px;" filterable>
<el-option v-for="s in sheepfoldOptions" :key="s.value" :label="s.label" :value="s.value" />
</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="['diagnosis:diagnosis:add']"
>新增</el-button>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['diagnosis:diagnosis:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['diagnosis:diagnosis:edit']"
>修改</el-button>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['diagnosis:diagnosis:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['diagnosis:diagnosis:remove']"
>删除</el-button>
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['diagnosis:diagnosis:export']">导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['diagnosis:diagnosis:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row>
<!-- 列表 -->
<el-table v-loading="loading" :data="diagnosisList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="治疗记录id" align="center" prop="treatId" />
<el-table-column label="羊只id" align="center" prop="sheepId" />
<el-table-column label="耳号" align="center" prop="sheepNo" />
<el-table-column label="时间日期" align="center" prop="datetime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="羊只类别" align="center" prop="sheepType" />
<el-table-column label="性别" align="center" prop="gender" />
<el-table-column label="性别" align="center" prop="gender">
<template #default="scope"><dict-tag :options="sheep_gender" :value="scope.row.gender" /></template>
</el-table-column>
<el-table-column label="胎次" align="center" prop="parity" />
<el-table-column label="疾病类型" align="center" prop="diseasePid" />
<el-table-column label="子疾病" align="center" prop="diseaseId" />
<el-table-column label="诊疗结果" align="center" prop="result" />
<el-table-column label="开始时间" align="center" prop="begindate" width="180">
<el-table-column label="疾病类型" align="center" prop="diseasePName" />
<el-table-column label="子疾病" align="center" prop="diseaseName" />
<el-table-column label="诊疗结果" align="center" prop="result">
<template #default="scope"><dict-tag :options="diag_result" :value="scope.row.result" /></template>
</el-table-column>
<el-table-column label="开始时间" align="center" prop="begindate">
<template #default="scope">
<span>{{ parseTime(scope.row.begindate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="结束时间" align="center" prop="enddate" width="180">
<el-table-column label="结束时间" align="center" prop="enddate">
<template #default="scope">
<span>{{ parseTime(scope.row.enddate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="治疗天数" align="center" prop="treatDay" />
<el-table-column label="羊舍id" align="center" prop="sheepfoldId" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="羊舍" align="center" prop="sheepfold" width="100px" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="100px">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['diagnosis:diagnosis:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['diagnosis:diagnosis:remove']">删除</el-button>
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['diagnosis:diagnosis:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['diagnosis:diagnosis: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="diagnosisRef" :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="datetime">
<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="gender">
<el-input v-model="form.gender" placeholder="请输入性别" />
</el-form-item>
<el-form-item label="胎次" prop="parity">
<el-input v-model="form.parity" placeholder="请输入胎次" />
</el-form-item>
<el-form-item label="疾病类型" prop="diseasePid">
<el-input v-model="form.diseasePid" placeholder="请输入疾病类型" />
</el-form-item>
<el-form-item label="子疾病" prop="diseaseId">
<el-input v-model="form.diseaseId" placeholder="请输入子疾病" />
</el-form-item>
<el-form-item label="诊疗结果" prop="result">
<el-input v-model="form.result" placeholder="请输入诊疗结果" />
</el-form-item>
<el-form-item label="开始时间" prop="begindate">
<el-date-picker clearable
v-model="form.begindate"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择开始时间">
</el-date-picker>
</el-form-item>
<el-form-item label="结束时间" prop="enddate">
<el-date-picker clearable
v-model="form.enddate"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择结束时间">
</el-date-picker>
</el-form-item>
<el-form-item label="治疗天数" prop="treatDay">
<el-input v-model="form.treatDay" placeholder="请输入治疗天数" />
</el-form-item>
<el-form-item label="羊舍id" prop="sheepfoldId">
<el-input v-model="form.sheepfoldId" placeholder="请输入羊舍id" />
</el-form-item>
<!-- 分页 -->
<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="45%" append-to-body>
<el-form ref="diagnosisRef" :model="form" :rules="rules" label-width="90px">
<!-- 只读信息 -->
<el-row :gutter="20" class="info-block">
<el-col :span="12">
<el-form-item label="羊只耳号">
<span class="readonly-text">{{ form.sheepNo }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="时间日期">
<span class="readonly-text">{{ form.datetime }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="性别">
<span class="readonly-text"> <dict-tag :options="sheep_gender"
:value="form.gender" /></span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="胎次">
<span class="readonly-text">{{ form.parity }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="月龄">
<span class="readonly-text">{{ form.monthAge }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="疾病类型">
<span class="readonly-text">{{ form.diseasePName }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="子疾病">
<span class="readonly-text">{{ form.diseaseName }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="开始时间">
<span class="readonly-text">{{ form.begindate }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结束时间" prop="enddate">
<el-date-picker v-model="form.enddate" type="date" value-format="YYYY-MM-DD" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="治疗天数">
<span class="readonly-text">{{ form.treatDay }} </span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="诊疗结果">
<el-select v-model="form.result" clearable placeholder="请选择诊疗结果">
<el-option v-for="r in diag_result" :key="r.value" :label="r.label" :value="r.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="羊舍">
<el-select v-model="form.sheepfoldId" clearable placeholder="请选择羊舍" filterable>
<el-option v-for="s in sheepfoldOptions" :key="s.value" :label="s.label" :value="s.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" :rows="3" placeholder="请输入备注信息" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Diagnosis">
import { listDiagnosis, getDiagnosis, delDiagnosis, addDiagnosis, updateDiagnosis } from "@/api/diagnosis/diagnosis"
import { listDiagnosis, getDiagnosis, delDiagnosis, updateDiagnosis } from '@/api/biosafety/diagnosis'
import { listSheepfold_management } from "@/api/fileManagement/sheepfold_management"
import { getCurrentInstance, onMounted, reactive, ref, toRefs, watch } from 'vue'
import { listDisease } from '@/api/biosafety/disease'
const { proxy } = getCurrentInstance()
const { sheep_gender, diag_result } = proxy.useDict("sheep_gender", "diag_result")
/* 列表数据 */
const diagnosisList = ref([])
const open = ref(false)
const loading = ref(true)
@ -225,50 +220,86 @@ const ids = ref([])
const single = ref(true)
const multiple = ref(true)
const total = ref(0)
const title = ref("")
const title = ref('')
const daterangeDatetime = ref([])
/* 下拉数据源 */
const sheepfoldOptions = ref([])
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
sheepId: null,
sheepNo: null,
datetime: null,
diseasePid: null,
diseaseId: null,
result: null,
treatDay: null,
sheepfoldId: null,
sheepfoldId: null
},
rules: {
enddate: [
{
validator: (rule, value, callback) => {
if (!value) {
callback(new Error('请选择结束时间'))
} else if (new Date(value) < new Date(form.value.begindate)) {
callback(new Error('结束时间不能早于开始时间'))
} else {
callback()
}
},
trigger: 'change'
}
]
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询诊疗结果列表 */
const pDiseaseOptions = ref([])
const cDiseaseOptions = ref([])
/* 疾病下拉 */
function getDiseases() {
listDisease().then(response => {
const diseases = proxy.handleTree(response.data, "id", "pid")
pDiseaseOptions.value = diseases.filter(item => item.pid === 0)
})
}
function handleDiseaseTypeChange(parentId) {
if (!parentId) {
cDiseaseOptions.value = []
return
}
listDisease({ pid: parentId }).then(response => {
cDiseaseOptions.value = response.data
})
}
/* 查询列表 */
function getList() {
loading.value = true
queryParams.value.params = {}
if (null != daterangeDatetime && '' != daterangeDatetime) {
queryParams.value.params["beginDatetime"] = daterangeDatetime.value[0]
queryParams.value.params["endDatetime"] = daterangeDatetime.value[1]
if (daterangeDatetime.value && daterangeDatetime.value.length) {
queryParams.value.params.beginDatetime = daterangeDatetime.value[0]
queryParams.value.params.endDatetime = daterangeDatetime.value[1]
}
listDiagnosis(queryParams.value).then(response => {
listDiagnosis(queryParams.value).then((response) => {
diagnosisList.value = response.rows
total.value = response.total
loading.value = false
})
}
//
/* 取消/重置 */
function cancel() {
open.value = false
reset()
}
//
function reset() {
form.value = {
id: null,
@ -280,93 +311,108 @@ function reset() {
parity: null,
diseasePid: null,
diseaseId: null,
result: null,
result: '',
begindate: null,
enddate: null,
treatDay: null,
sheepfoldId: null,
createBy: null,
createTime: null
sheepfoldId: null
}
proxy.resetForm("diagnosisRef")
proxy.resetForm('diagnosisRef')
}
/** 搜索按钮操作 */
/* 搜索 / 重置 */
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
/** 重置按钮操作 */
function resetQuery() {
daterangeDatetime.value = []
proxy.resetForm("queryRef")
proxy.resetForm('queryRef')
handleQuery()
}
//
/* 多选 */
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id)
single.value = selection.length != 1
ids.value = selection.map((item) => item.id)
single.value = selection.length !== 1
multiple.value = !selection.length
}
/** 新增按钮操作 */
function handleAdd() {
reset()
open.value = true
title.value = "添加诊疗结果"
}
/** 修改按钮操作 */
/* 修改 */
function handleUpdate(row) {
reset()
const _id = row.id || ids.value
getDiagnosis(_id).then(response => {
getDiagnosis(_id).then((response) => {
form.value = response.data
open.value = true
title.value = "修改诊疗结果"
title.value = '修改诊疗结果'
})
}
/** 提交按钮 */
/* 提交 */
function submitForm() {
proxy.$refs["diagnosisRef"].validate(valid => {
proxy.$refs.diagnosisRef.validate((valid) => {
if (valid) {
if (form.value.id != null) {
updateDiagnosis(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
} else {
addDiagnosis(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功")
open.value = false
getList()
})
}
updateDiagnosis(form.value).then(() => {
proxy.$modal.msgSuccess('修改成功')
open.value = false
getList()
})
}
})
}
/** 删除按钮操作 */
/* 删除 */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除诊疗结果编号为"' + _ids + '"的数据项?').then(function() {
return delDiagnosis(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => {})
proxy
.$modal.confirm('是否确认删除诊疗结果编号为"' + _ids + '"的数据项?')
.then(() => delDiagnosis(_ids))
.then(() => {
getList()
proxy.$modal.msgSuccess('删除成功')
})
.catch(() => { })
}
/** 导出按钮操作 */
/* 导出 */
function handleExport() {
proxy.download('diagnosis/diagnosis/export', {
...queryParams.value
}, `diagnosis_${new Date().getTime()}.xlsx`)
proxy.download(
'diagnosis/diagnosis/export',
{ ...queryParams.value },
`diagnosis_${new Date().getTime()}.xlsx`
)
}
getList()
</script>
/* 🔥 监听 enddate 变化,自动计算治疗天数 */
watch(() => form.value.enddate, (newVal) => {
if (newVal && form.value.begindate) {
const start = new Date(form.value.begindate)
const end = new Date(newVal)
const diffTime = Math.abs(end - start)
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24))
form.value.treatDay = diffDays
} else {
form.value.treatDay = 0
}
})
/* 🔥 可选:监听 begindate 变化,重新计算天数 */
watch(() => form.value.begindate, () => {
if (form.value.enddate) {
const start = new Date(form.value.begindate)
const end = new Date(form.value.enddate)
const diffTime = Math.abs(end - start)
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24))
form.value.treatDay = diffDays
}
})
onMounted(() => {
getList()
getDiseases()
listSheepfold_management().then(res => {
sheepfoldOptions.value = res.rows.map(item => ({ value: item.id, label: item.sheepfoldName }))
})
})
</script>

View File

@ -1,324 +1,516 @@
<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="sheepfoldId">
<el-input
v-model="queryParams.sheepfoldId"
placeholder="请输入羊舍id"
clearable
@keyup.enter="handleQuery"
/>
<!-- 搜索栏 -->
<el-form :model="queryParams" ref="queryRef" inline v-show="showSearch" label-width="80px">
<el-form-item label="羊舍" prop="sheepfoldId">
<el-select v-model="queryParams.sheepfoldId" clearable placeholder="请选择羊舍" filterable style="width: 200px">
<el-option v-for="b in barns" :key="b.id" :label="b.sheepfoldName" :value="b.id" />
</el-select>
</el-form-item>
<el-form-item label="消毒日期" prop="datetime">
<el-date-picker clearable
v-model="queryParams.datetime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择消毒日期">
</el-date-picker>
<el-form-item label="消毒日期">
<el-date-picker v-model="daterangeDatetime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
<el-form-item label="技术员" prop="technician">
<el-input
v-model="queryParams.technician"
placeholder="请输入技术员"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="消毒方式" prop="way">
<el-input
v-model="queryParams.way"
placeholder="请输入消毒方式"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="药品使用记录id" prop="usageId">
<el-input
v-model="queryParams.usageId"
placeholder="请输入药品使用记录id"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="比例" prop="ratio">
<el-input
v-model="queryParams.ratio"
placeholder="请输入比例"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="备注" prop="comment">
<el-input
v-model="queryParams.comment"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
/>
<el-input v-model="queryParams.technician" placeholder="请输入技术员" clearable />
</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="['biosafety:disinfect:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['biosafety:disinfect:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['biosafety:disinfect:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['biosafety:disinfect:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
<el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate">修改</el-button>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete">删除</el-button>
<el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
</el-row>
<!-- 列表 -->
<el-table v-loading="loading" :data="disinfectList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="id" align="center" prop="id" />
<el-table-column label="羊舍id" align="center" prop="sheepfoldId" />
<el-table-column label="羊舍" align="center" prop="sheepfoldName"/>
<el-table-column label="消毒日期" align="center" prop="datetime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</span>
</template>
<template #default="scope">{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</template>
</el-table-column>
<el-table-column label="技术员" align="center" prop="technician" />
<el-table-column label="消毒方式" align="center" prop="way" />
<el-table-column label="药品使用记录id" align="center" prop="usageId" />
<el-table-column label="比例" align="center" prop="ratio" />
<el-table-column label="备注" align="center" prop="comment" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" width="200">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['biosafety:disinfect:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['biosafety:disinfect:remove']">删除</el-button>
<el-button link type="primary" @click="handleUpdate(scope.row)">修改</el-button>
<el-button link type="danger" @click="handleDelete(scope.row)">删除</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="disinfectRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="羊舍id" prop="sheepfoldId">
<el-input v-model="form.sheepfoldId" placeholder="请输入羊舍id" />
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- ==================== 新增弹窗 ==================== -->
<el-dialog :title="titleAdd" v-model="openAdd" width="60%" top="5vh" append-to-body>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="羊舍" prop="sheepfoldIds">
<el-select v-model="form.sheepfoldIds" multiple collapse-tags placeholder="请选择羊舍" filterable
style="width: 100%">
<el-option v-for="b in barns" :key="b.id" :label="b.sheepfoldName" :value="b.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="消毒日期" prop="datetime">
<el-date-picker v-model="form.datetime" type="date" value-format="YYYY-MM-DD" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="处方">
<el-select v-model="form.prescriptionId" filterable clearable placeholder="请选择处方"
@change="handleSelectPrescription">
<el-option v-for="p in presOptions" :key="p.id" :label="p.label" :value="p.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="技术员">
<el-input v-model="form.technician" placeholder="请输入技术员姓名" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="消毒方式">
<el-input v-model="form.way" placeholder="请输入消毒方式" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="比例">
<el-input v-model="form.ratio" placeholder="请输入比例" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="药品明细">
<el-button type="primary" icon="Plus" size="small" @click="handleAddDetail">添加药品</el-button>
<el-table :data="usageDetails" border stripe style="margin-top: 8px">
<el-table-column label="药品">
<template #default="scope">
<el-select v-model="scope.row.mediId" filterable placeholder="请选择药品">
<el-option v-for="m in medicines" :key="m.value" :label="m.label" :value="m.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用量" width="160">
<template #default="scope">
<el-input-number v-model="scope.row.dosage" :min="0" :precision="1" />
</template>
</el-table-column>
<el-table-column label="单位" width="120">
<template #default="scope">
<el-select v-model="scope.row.unit" placeholder="单位">
<el-option v-for="u in units" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用法" width="120">
<template #default="scope">
<el-select v-model="scope.row.usageId" placeholder="用法">
<el-option v-for="u in usages" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="生产厂家">
<template #default="scope">
<el-input v-model="scope.row.manufacturer" placeholder="生产厂家" />
</template>
</el-table-column>
<el-table-column label="生产批号">
<template #default="scope">
<el-input v-model="scope.row.batchNumber" placeholder="批号" />
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button link type="danger" icon="Delete" @click="usageDetails.splice(scope.$index, 1)" />
</template>
</el-table-column>
</el-table>
</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-form-item>
<el-form-item label="技术员" prop="technician">
<el-input v-model="form.technician" placeholder="请输入技术员" />
</el-form-item>
<el-form-item label="消毒方式" prop="way">
<el-input v-model="form.way" placeholder="请输入消毒方式" />
</el-form-item>
<el-form-item label="药品使用记录id" prop="usageId">
<el-input v-model="form.usageId" placeholder="请输入药品使用记录id" />
</el-form-item>
<el-form-item label="比例" prop="ratio">
<el-input v-model="form.ratio" placeholder="请输入比例" />
</el-form-item>
<el-form-item label="备注" prop="comment">
<el-input v-model="form.comment" placeholder="请输入备注" />
<el-form-item label="备注">
<el-input type="textarea" :rows="3" v-model="form.comment" placeholder="请输入备注" />
</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>
<el-button @click="cancelAdd"> </el-button>
<el-button type="primary" @click="submitAdd"> </el-button>
</template>
</el-dialog>
<!-- ==================== 修改弹窗 ==================== -->
<el-dialog :title="titleEdit" v-model="openEdit" width="60%" top="5vh" append-to-body>
<el-form ref="editFormRef" :model="editForm" :rules="rules" label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="羊舍" >
<span>{{ editForm.sheepfoldName }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="消毒日期" prop="datetime">
<el-date-picker v-model="editForm.datetime" type="date" value-format="YYYY-MM-DD" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="技术员">
<el-input v-model="editForm.technician" placeholder="请输入技术员姓名" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="消毒方式">
<el-input v-model="editForm.way" placeholder="请输入消毒方式" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="比例">
<el-input v-model="editForm.ratio" placeholder="请输入比例" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="药品明细">
<el-button type="primary" icon="Plus" size="small" @click="handleAddDetailEdit">添加药品</el-button>
<el-table :data="editDetails" border stripe style="margin-top: 8px">
<el-table-column label="药品">
<template #default="scope">
<el-select v-model="scope.row.mediId" filterable placeholder="请选择药品">
<el-option v-for="m in medicines" :key="m.value" :label="m.label" :value="m.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用量" width="160">
<template #default="scope">
<el-input-number v-model="scope.row.dosage" :min="0" :precision="1" />
</template>
</el-table-column>
<el-table-column label="单位" width="120">
<template #default="scope">
<el-select v-model="scope.row.unit" placeholder="单位">
<el-option v-for="u in units" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用法" width="120">
<template #default="scope">
<el-select v-model="scope.row.usageId" placeholder="用法">
<el-option v-for="u in usages" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="生产厂家">
<template #default="scope">
<el-input v-model="scope.row.manufacturer" placeholder="生产厂家" />
</template>
</el-table-column>
<el-table-column label="生产批号">
<template #default="scope">
<el-input v-model="scope.row.batchNumber" placeholder="批号" />
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button link type="danger" icon="Delete" @click="editDetails.splice(scope.$index, 1)" />
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-form-item label="备注">
<el-input type="textarea" :rows="3" v-model="editForm.comment" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="cancelEdit"> </el-button>
<el-button type="primary" @click="submitEdit"> </el-button>
</template>
</el-dialog>
</div>
</template>
<script setup name="Disinfect">
import { listDisinfect, getDisinfect, delDisinfect, addDisinfect, updateDisinfect } from "@/api/biosafety/disinfect"
import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
import { listDisinfect, getDisinfect, delDisinfect, addDisinfect, updateDisinfect } from '@/api/biosafety/disinfect'
import { listPrescription, getPrescription } from '@/api/biosafety/prescription'
import { listUnit } from '@/api/biosafety/unit'
import { listUsage } from '@/api/biosafety/usage'
import { listMedicine } from '@/api/biosafety/medicine'
import request from '@/utils/request'
import { parseTime } from '@/utils/ruoyi'
const { proxy } = getCurrentInstance()
const disinfectList = ref([])
const open = ref(false)
/* ------------------ 列表 ------------------ */
const loading = ref(true)
const showSearch = ref(true)
const total = ref(0)
const disinfectList = ref([])
const daterangeDatetime = ref([])
const queryParams = reactive({
pageNum: 1,
pageSize: 10,
sheepfoldId: null,
technician: null
})
const ids = ref([])
const single = ref(true)
const multiple = ref(true)
const total = ref(0)
const title = ref("")
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
sheepfoldId: null,
datetime: null,
technician: null,
way: null,
usageId: null,
ratio: null,
comment: null,
},
rules: {
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询消毒记录列表 */
function getList() {
loading.value = true
listDisinfect(queryParams.value).then(response => {
disinfectList.value = response.rows
total.value = response.total
const qp = { ...queryParams }
qp.params = {}
if (daterangeDatetime.value?.length) {
qp.params.beginDatetime = daterangeDatetime.value[0]
qp.params.endDatetime = daterangeDatetime.value[1]
}
listDisinfect(qp).then(res => {
disinfectList.value = res.rows
total.value = res.total
loading.value = false
})
}
//
function cancel() {
open.value = false
reset()
}
//
function reset() {
form.value = {
id: null,
sheepfoldId: null,
datetime: null,
technician: null,
way: null,
usageId: null,
ratio: null,
comment: null,
updateBy: null,
updateTime: null,
createBy: null,
createTime: null
}
proxy.resetForm("disinfectRef")
}
/** 搜索按钮操作 */
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
single.value = selection.length !== 1
multiple.value = !selection.length
}
/** 新增按钮操作 */
function handleQuery() {
queryParams.pageNum = 1
getList()
}
function resetQuery() {
daterangeDatetime.value = []
proxy.resetForm('queryRef')
handleQuery()
}
/* ------------------ 新增弹窗 ------------------ */
const openAdd = ref(false)
const titleAdd = ref('新增消毒记录')
const form = reactive({
id: null,
technician: '',
datetime: new Date().toISOString().split('T')[0],
way: '',
ratio: '',
comment: '',
prescriptionId: null,
sheepfoldIds: []
})
const usageDetails = ref([])
function resetAdd() {
Object.assign(form, {
id: null,
technician: '',
datetime: new Date().toISOString().split('T')[0],
way: '',
ratio: '',
comment: '',
prescriptionId: null,
sheepfoldIds: []
})
usageDetails.value = []
}
function handleAdd() {
reset()
open.value = true
title.value = "添加消毒记录"
resetAdd()
openAdd.value = true
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
const _id = row.id || ids.value
getDisinfect(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改消毒记录"
})
function cancelAdd() {
openAdd.value = false
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["disinfectRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateDisinfect(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
} else {
addDisinfect(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功")
open.value = false
getList()
})
}
function submitAdd() {
proxy.$refs.formRef.validate(valid => {
if (!valid) return
const data = {
...form,
datetime: new Date(form.datetime).getTime(),
usageDetails: usageDetails.value
}
addDisinfect(data).then(() => {
proxy.$modal.msgSuccess('新增成功')
openAdd.value = false
getList()
})
})
}
/** 删除按钮操作 */
/* ------------------ 修改弹窗 ------------------ */
const openEdit = ref(false)
const titleEdit = ref('修改消毒记录')
const editForm = reactive({
id: null,
technician: '',
datetime: new Date().toISOString().split('T')[0],
way: '',
ratio: '',
comment: '',
prescriptionId: null,
sheepfoldIds: []
})
const editDetails = ref([])
function resetEdit() {
Object.assign(editForm, {
id: null,
technician: '',
datetime: new Date().toISOString().split('T')[0],
way: '',
ratio: '',
comment: '',
prescriptionId: null,
sheepfoldIds: []
})
editDetails.value = []
}
function handleUpdate(row) {
resetEdit()
const id = row.id || ids.value[0]
getDisinfect(id).then(res => {
Object.assign(editForm, res.data)
editDetails.value = res.data.usageDetails || []
openEdit.value = true
})
}
function cancelEdit() {
openEdit.value = false
}
function submitEdit() {
proxy.$refs.editFormRef.validate(valid => {
if (!valid) return
const data = {
...editForm,
datetime: new Date(editForm.datetime).getTime(),
usageDetails: editDetails.value
}
updateDisinfect(data).then(() => {
proxy.$modal.msgSuccess('修改成功')
openEdit.value = false
getList()
})
})
}
/* ------------------ 功能 ------------------ */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除消毒记录编号为"' + _ids + '"的数据项?').then(function() {
return delDisinfect(_ids)
}).then(() => {
proxy.$modal.confirm('是否确认删除选中的数据?').then(() => delDisinfect(_ids)).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => {})
proxy.$modal.msgSuccess('删除成功')
})
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('biosafety/disinfect/export', {
...queryParams.value
}, `disinfect_${new Date().getTime()}.xlsx`)
proxy.download('biosafety/disinfect/export', { ...queryParams }, `disinfect_${Date.now()}.xlsx`)
}
getList()
</script>
/* ------------------ 下拉数据 ------------------ */
const barns = ref([])
const presOptions = ref([])
const units = ref([])
const usages = ref([])
const medicines = ref([])
/* 校验规则 */
const rules = {
sheepfoldIds: [{ required: true, message: '请选择羊舍', trigger: 'change' }],
datetime: [{ required: true, message: '请选择日期', trigger: 'change' }]
}
/* 处方选择事件 - 新增 */
function handleSelectPrescription(id) {
if (!id) return
getPrescription(id).then(res => {
usageDetails.value = res.data?.swPresDetailList?.map(i => ({
mediId: i.mediId,
dosage: i.dosage,
unit: i.unitId,
usageId: i.usageId
})) || []
})
}
/* 处方选择事件 - 修改 */
function handleSelectPrescriptionEdit(id) {
if (!id) return
getPrescription(id).then(res => {
editDetails.value = res.data?.swPresDetailList?.map(i => ({
mediId: i.mediId,
dosage: i.dosage,
unit: i.unitId,
usageId: i.usageId
})) || []
})
}
/* 明细添加行 - 新增 */
function handleAddDetail() {
usageDetails.value.push({ mediId: null, dosage: 0, unit: null, usageId: null, manufacturer: null, batchNumber: null })
}
/* 明细添加行 - 修改 */
function handleAddDetailEdit() {
editDetails.value.push({ mediId: null, dosage: 0, unit: null, usageId: null, manufacturer: null, batchNumber: null })
}
/* ------------------ 初始加载 ------------------ */
onMounted(() => {
getList()
/* 加载本地羊舍 */
request({ url: '/sheepfold_management/sheepfold_management/list', method: 'get' }).then(res => {
barns.value = res.rows
})
listPrescription({ status: 1, persType: 1 }).then(res => {
presOptions.value = res.rows.map(item => ({ id: item.id, label: item.name }))
})
listUnit().then(res => {
units.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
listUsage().then(res => {
usages.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
listMedicine().then(res => {
medicines.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
})
</script>

View File

@ -1,21 +1,16 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="保健日期" prop="datetime">
<el-date-picker clearable
v-model="queryParams.datetime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择保健日期">
</el-date-picker>
<!-- 1. 搜索 -->
<el-form :model="queryParams" ref="queryRef" inline v-show="showSearch" label-width="68px">
<el-form-item label="羊只耳号" prop="sheepNo">
<el-input v-model="queryParams.sheepNo" placeholder="请输入羊只耳号" clearable @keyup.enter="getList" />
</el-form-item>
<el-form-item label="保健日期">
<el-date-picker v-model="daterangeDatetime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
<el-form-item label="技术员" prop="technical">
<el-input
v-model="queryParams.technical"
placeholder="请输入技术员"
clearable
@keyup.enter="handleQuery"
/>
<el-input v-model="queryParams.technical" placeholder="请输入技术员" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@ -23,274 +18,518 @@
</el-form-item>
</el-form>
<!-- 2. 按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['biosafety:health:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['biosafety:health:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['biosafety:health:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['biosafety:health:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
<el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate">修改</el-button>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete">删除</el-button>
<el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
</el-row>
<el-table v-loading="loading" :data="healthList" @selection-change="handleSelectionChange">
<!-- 3. 列表 -->
<el-table v-loading="loading" :data="dewormList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="${comment}" align="center" prop="id" />
<el-table-column label="保健日期" align="center" prop="datetime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="羊只id" align="center" prop="sheepId" />
<el-table-column label="用药记录" align="center" prop="usageId" />
<el-table-column label="羊只耳号" align="center" prop="sheepNo" />
<el-table-column label="品种" align="center" prop="variety" />
<el-table-column label="羊只类别" align="center" prop="sheepType" />
<el-table-column label="性别" align="center" prop="gender" />
<el-table-column label="性别" align="center" prop="gender">
<template #default="scope">
<dict-tag :options="sheep_gender" :value="scope.row.gender" />
</template>
</el-table-column>
<el-table-column label="月龄" align="center" prop="monthAge" />
<el-table-column label="胎次" align="center" prop="parity" />
<el-table-column label="羊舍id" align="center" prop="sheepfoldId" />
<el-table-column label="繁殖状态" align="center" prop="breed" />
<el-table-column label="保健日期" align="center" prop="datetime" width="180">
<template #default="scope">{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</template>
</el-table-column>
<el-table-column label="技术员" align="center" prop="technical" />
<el-table-column label="备注" align="center" prop="comment" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" width="200">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['biosafety:health:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['biosafety:health:remove']">删除</el-button>
<el-button link type="primary" @click="handleUpdate(scope.row)">修改</el-button>
<el-button link type="danger" @click="handleDelete(scope.row)">删除</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="healthRef" :model="form" :rules="rules" label-width="80px">
<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>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 4. 新增弹窗羊舍多选 + 无卡片 + 自动剔除 -->
<el-dialog title="新增保健记录" v-model="addOpen" width="60%" top="5vh" append-to-body>
<el-form ref="addFormRef" :model="addForm" :rules="addRules" label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
<!-- 耳号追加 -->
<el-form-item label="耳号">
<el-input v-model="sheepInput" placeholder="输入耳号回车添加" style="width: 220px" @keyup.enter="validateSheep" />
</el-form-item>
</el-col>
<el-col :span="12">
<!-- 羊舍多选 -->
<el-form-item label="羊舍" prop="barnIds">
<el-select v-model="selectedBarnIds" multiple collapse-tags placeholder="请选择羊舍" style="width: 100%"
@change="handleBarnChange">
<el-option v-for="b in barns" :key="b.id" :label="b.sheepfoldName" :value="b.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- 已选耳号 -->
<el-form-item label="已选耳号">
<el-tag v-for="(tag, idx) in selectedSheepList" :key="tag.sheepId" closable @close="removeSheep(idx)"
style="margin-right: 6px">
{{ tag.sheepNo }}
</el-tag>
</el-form-item>
<el-form-item label="羊只id" prop="sheepId">
<el-input v-model="form.sheepId" placeholder="请输入羊只id" />
</el-form-item>
<el-form-item label="用药记录" prop="usageId">
<el-input v-model="form.usageId" placeholder="请输入用药记录" />
</el-form-item>
<el-form-item label="品种" prop="variety">
<el-input v-model="form.variety" placeholder="请输入品种" />
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-input v-model="form.gender" placeholder="请输入性别" />
</el-form-item>
<el-form-item label="月龄" prop="monthAge">
<el-input v-model="form.monthAge" placeholder="请输入月龄" />
</el-form-item>
<el-form-item label="胎次" prop="parity">
<el-input v-model="form.parity" placeholder="请输入胎次" />
</el-form-item>
<el-form-item label="羊舍id" prop="sheepfoldId">
<el-input v-model="form.sheepfoldId" placeholder="请输入羊舍id" />
</el-form-item>
<el-form-item label="技术员" prop="technical">
<el-input v-model="form.technical" placeholder="请输入技术员" />
</el-form-item>
<el-form-item label="备注" prop="comment">
<el-input v-model="form.comment" placeholder="请输入备注" />
<!-- 保健信息 -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="保健日期" prop="datetime">
<el-date-picker v-model="addForm.datetime" type="date" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="处方">
<el-select v-model="addForm.prescriptionId" filterable clearable placeholder="请选择处方" style="width: 100%"
@change="handleSelectPrescription">
<el-option v-for="p in presOptions" :key="p.id" :label="p.label" :value="p.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="技术员">
<el-input v-model="addForm.technical" placeholder="请输入技术员姓名" />
</el-form-item>
</el-col>
</el-row>
<div style="margin: 8px 5px;">
<!-- 药品明细 -->
<el-button type="primary" icon="Plus" size="small" @click="handleAddDetail">添加药品</el-button>
<el-table :data="usageDetails" border stripe style="margin-top: 8px">
<el-table-column label="药品">
<template #default="scope">
<el-select v-model="scope.row.mediId" filterable placeholder="请选择药品">
<el-option v-for="m in medicines" :key="m.value" :label="m.label" :value="m.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用量" width="160">
<template #default="scope">
<el-input-number v-model="scope.row.dosage" :min="0" :precision="1" />
</template>
</el-table-column>
<el-table-column label="单位" width="120">
<template #default="scope">
<el-select v-model="scope.row.unit" placeholder="单位">
<el-option v-for="u in units" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用法" width="120">
<template #default="scope">
<el-select v-model="scope.row.usageId" placeholder="用法">
<el-option v-for="u in usages" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="生产厂家">
<template #default="scope">
<el-input v-model="scope.row.manufacturer" placeholder="生产厂家" />
</template>
</el-table-column>
<el-table-column label="生产批号">
<template #default="scope">
<el-input v-model="scope.row.batchNumber" placeholder="批号" />
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button link type="danger" icon="Delete" @click="usageDetails.splice(scope.$index, 1)" />
</template>
</el-table-column>
</el-table>
</div>
<el-form-item label="备注">
<el-input type="textarea" :rows="3" v-model="addForm.comment" placeholder="请输入备注" />
</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>
<el-button @click="addOpen = false"> </el-button>
<el-button type="primary" @click="submitAddForm"> </el-button>
</template>
</el-dialog>
<!-- 5. 修改弹窗羊舍只读下拉 -->
<el-dialog title="修改保健记录" v-model="editOpen" width="60%" top="5vh" append-to-body>
<el-form ref="editFormRef" :model="editForm" :rules="editRules" label-width="100px">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="羊只耳号">
<span>{{ editForm.sheepNo }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="品种">
<span>{{ editForm.variety }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="羊只类别">
<span>{{ editForm.sheepType }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别">
<span> <dict-tag :options="sheep_gender" :value="editForm.gender" /></span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="繁殖状态">
<span>{{ editForm.breed }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="保健日期" prop="datetime">
<el-date-picker v-model="editForm.datetime" type="date" style="width: 100%" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="技术员">
<el-input v-model="editForm.technical" placeholder="请输入技术员姓名" />
</el-form-item>
</el-col>
</el-row>
<div style="margin: 10px 10px;">
<el-button type="primary" icon="Plus" size="small" @click="handleAddDetail">添加药品</el-button>
<el-table :data="usageDetails" border stripe style="margin-top: 8px">
<el-table-column label="药品">
<template #default="scope">
<el-select v-model="scope.row.mediId" filterable placeholder="请选择药品">
<el-option v-for="m in medicines" :key="m.value" :label="m.label" :value="m.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用量" width="160">
<template #default="scope">
<el-input-number v-model="scope.row.dosage" :min="0" :precision="1" style="width: 120px;" />
</template>
</el-table-column>
<el-table-column label="单位" width="120">
<template #default="scope">
<el-select v-model="scope.row.unit" placeholder="单位">
<el-option v-for="u in units" :key="u.value" :label="u.label" :value="u.value + ''" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用法" width="120">
<template #default="scope">
<el-select v-model="scope.row.usageId" placeholder="用法">
<el-option v-for="u in usages" :key="u.value" :label="u.label" :value="u.value + ''" />
</el-select>
</template>
</el-table-column>
<el-table-column label="生产厂家">
<template #default="scope">
<el-input v-model="scope.row.manufacturer" placeholder="生产厂家" />
</template>
</el-table-column>
<el-table-column label="生产批号">
<template #default="scope">
<el-input v-model="scope.row.batchNumber" placeholder="批号" />
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button link type="danger" icon="Delete" @click="usageDetails.splice(scope.$index, 1)" />
</template>
</el-table-column>
</el-table>
</div>
<el-form-item label="备注">
<el-input type="textarea" :rows="3" v-model="editForm.comment" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="editOpen = false"> </el-button>
<el-button type="primary" @click="submitEditForm"> </el-button>
</template>
</el-dialog>
</div>
</template>
<script setup name="Health">
import { listHealth, getHealth, delHealth, addHealth, updateHealth } from "@/api/biosafety/health"
import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
import { listHealth, getHealth, delHealth, addHealth, updateHealth } from '@/api/biosafety/health'
import { listPrescription, getPrescription } from '@/api/biosafety/prescription'
import { listUnit } from '@/api/biosafety/unit'
import { listUsage } from '@/api/biosafety/usage'
import { listMedicine } from '@/api/biosafety/medicine'
import request from '@/utils/request'
import { parseTime } from '@/utils/ruoyi'
const { proxy } = getCurrentInstance()
const { sheep_gender } = proxy.useDict('sheep_gender')
const healthList = ref([])
const open = ref(false)
/* ------------------ 列表 ------------------ */
const loading = ref(true)
const showSearch = ref(true)
const total = ref(0)
const dewormList = ref([])
const daterangeDatetime = ref([])
const queryParams = reactive({
pageNum: 1,
pageSize: 10,
sheepNo: null,
technical: null
})
const ids = ref([])
const single = ref(true)
const multiple = ref(true)
const total = ref(0)
const title = ref("")
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
datetime: null,
technical: null,
},
rules: {
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询保健列表 */
function getList() {
loading.value = true
listHealth(queryParams.value).then(response => {
healthList.value = response.rows
total.value = response.total
const qp = { ...queryParams }
qp.params = {}
if (daterangeDatetime.value?.length) {
qp.params.beginDatetime = daterangeDatetime.value[0]
qp.params.endDatetime = daterangeDatetime.value[1]
}
listHealth(qp).then(res => {
dewormList.value = res.rows
total.value = res.total
loading.value = false
})
}
//
function cancel() {
open.value = false
reset()
}
//
function reset() {
form.value = {
id: null,
datetime: null,
sheepId: null,
usageId: null,
variety: null,
sheepType: null,
gender: null,
monthAge: null,
parity: null,
sheepfoldId: null,
technical: null,
comment: null,
updateBy: null,
updateTime: null,
createBy: null,
createTime: null
}
proxy.resetForm("healthRef")
}
/** 搜索按钮操作 */
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
single.value = selection.length !== 1
multiple.value = !selection.length
}
/** 新增按钮操作 */
function handleAdd() {
reset()
open.value = true
title.value = "添加保健"
function handleQuery() {
queryParams.pageNum = 1
getList()
}
function resetQuery() {
daterangeDatetime.value = []
proxy.resetForm('queryRef')
handleQuery()
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
const _id = row.id || ids.value
getHealth(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改保健"
/* ------------------ 新增 ------------------ */
const addOpen = ref(false)
const addForm = reactive({
datetime: new Date(),
technical: '',
comment: '',
prescriptionId: null
})
const addRules = {
datetime: [{ required: true, message: '请选择日期', trigger: 'change' }]
}
const selectedBarnIds = ref([])
const selectedSheepList = ref([])
const barns = ref([])
const sheepInput = ref('')
function getBarns() {
request({ url: '/sheepfold_management/sheepfold_management/list', method: 'get' })
.then(res => (barns.value = res.rows))
}
function handleBarnChange(barnIds) {
// 1. id
const currentIds = new Set(barnIds || [])
// 2.
selectedSheepList.value = selectedSheepList.value.filter(
s => currentIds.has(s.barnId)
)
// 3.
const taskArr = [...currentIds].filter(id =>
!selectedSheepList.value.some(s => s.barnId === id)
)
if (!taskArr.length) return
Promise.all(
taskArr.map(id =>
request({ url: `/sheepfold_management/sheepfold_management/getSheepById`, params: { id } })
)
).then(resArr => {
const list = resArr.flatMap(r => (r.data || []).map(s => ({
sheepNo: s.manageTags,
sheepId: s.id,
barnId: s.barnId
})))
const map = new Map(selectedSheepList.value.map(s => [s.sheepId, s]))
list.forEach(item => map.set(item.sheepId, item))
selectedSheepList.value = [...map.values()]
})
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["healthRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateHealth(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
} else {
addHealth(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功")
open.value = false
getList()
})
}
function validateSheep() {
const no = sheepInput.value.trim()
if (!no) return
if (selectedSheepList.value.some(s => s.sheepNo === no)) {
proxy.$modal.msgWarning('该耳号已存在')
sheepInput.value = ''
return
}
request.get(`/sheep_file/sheep_file/byNo/${no}`).then(res => {
if (!res.data) {
proxy.$modal.msgError('羊只耳号不存在')
} else {
selectedSheepList.value.push({
sheepNo: res.data.sheepNo || res.data.bsManageTags,
sheepId: res.data.id
})
}
sheepInput.value = ''
})
}
/** 删除按钮操作 */
function removeSheep(index) {
selectedSheepList.value.splice(index, 1)
}
function handleAdd() {
Object.assign(addForm, {
datetime: new Date(),
technical: '',
comment: '',
prescriptionId: null
})
selectedBarnIds.value = []
selectedSheepList.value = []
usageDetails.value = [{ mediId: null, dosage: 0, unit: null, usageId: null, manufacturer: null, batchNumber: null }]
getBarns()
addOpen.value = true
}
function submitAddForm() {
proxy.$refs.addFormRef.validate(valid => {
if (!valid || !selectedSheepList.value.length) {
proxy.$modal.msgError('请完善表单并至少选择一只羊')
return
}
addHealth({
...addForm,
datetime: new Date(addForm.datetime).getTime(),
sheepIds: selectedSheepList.value.map(s => s.sheepId),
usageDetails: usageDetails.value
}).then(() => {
proxy.$modal.msgSuccess('新增成功')
addOpen.value = false
getList()
})
})
}
/* ------------------ 修改 ------------------ */
const editOpen = ref(false)
const editForm = reactive({})
const editRules = {
datetime: [{ required: true, message: '请选择日期', trigger: 'change' }]
}
function handleUpdate(row) {
getHealth(row.id).then(res => {
Object.assign(editForm, res.data)
selectedSheepList.value = [{ sheepNo: res.data.sheepNo, sheepId: res.data.sheepId }]
usageDetails.value = res.data.usageDetails || []
editOpen.value = true
})
}
function submitEditForm() {
proxy.$refs.editFormRef.validate(valid => {
if (!valid) return
updateHealth({
...editForm,
datetime: new Date(editForm.datetime).getTime(),
usageDetails: usageDetails.value
}).then(() => {
proxy.$modal.msgSuccess('修改成功')
editOpen.value = false
getList()
})
})
}
/* ------------------ 功能函数 ------------------ */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除保健编号为"' + _ids + '"的数据项?').then(function() {
return delHealth(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => {})
const id = row.id || ids.value
proxy.$modal.confirm('确认删除?')
.then(() => delHealth(id))
.then(() => {
getList()
proxy.$modal.msgSuccess('删除成功')
})
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('biosafety/health/export', {
...queryParams.value
}, `health_${new Date().getTime()}.xlsx`)
proxy.download('biosafety/deworm/export', { ...queryParams }, `deworm_${Date.now()}.xlsx`)
}
getList()
</script>
/* ------------------ 药品/处方/下拉 ------------------ */
const usageDetails = ref([])
const presOptions = ref([])
const units = ref([])
const usages = ref([])
const medicines = ref([])
function handleSelectPrescription(id) {
if (!id) return
getPrescription(id).then(res => {
usageDetails.value = res.data?.swPresDetailList?.map(i => ({
mediId: i.mediId,
dosage: i.dosage,
unit: i.unitId,
usageId: i.usageId
})) || []
})
}
function handleAddDetail() {
usageDetails.value.push({ mediId: null, dosage: 0, unit: null, usageId: null, manufacturer: null, batchNumber: null })
}
/* ------------------ 初始化 ------------------ */
onMounted(() => {
getList()
getBarns()
listPrescription({ status: 1, persType: 2 }).then(res => {
presOptions.value = res.rows.map(item => ({ id: item.id, label: item.name }))
})
listUnit().then(res => {
units.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
listUsage().then(res => {
usages.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
listMedicine().then(res => {
medicines.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
})
</script>

View File

@ -1,31 +1,16 @@
<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"
/>
<!-- 1. 搜索 -->
<el-form :model="queryParams" ref="queryRef" inline v-show="showSearch" label-width="68px">
<el-form-item label="羊只耳号" prop="sheepNo">
<el-input v-model="queryParams.sheepNo" placeholder="请输入羊只耳号" clearable @keyup.enter="getList" />
</el-form-item>
<el-form-item label="免疫日期" style="width: 308px">
<el-date-picker
v-model="daterangeDatetime"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
<el-form-item label="免疫日期">
<el-date-picker v-model="daterangeDatetime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
<el-form-item label="技术员" prop="technical">
<el-input
v-model="queryParams.technical"
placeholder="请输入技术员"
clearable
@keyup.enter="handleQuery"
/>
<el-input v-model="queryParams.technical" placeholder="请输入技术员" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@ -33,280 +18,518 @@
</el-form-item>
</el-form>
<!-- 2. 按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['biosafety:immunity:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['biosafety:immunity:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['biosafety:immunity:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['biosafety:immunity:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
<el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate">修改</el-button>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete">删除</el-button>
<el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
</el-row>
<el-table v-loading="loading" :data="immunityList" @selection-change="handleSelectionChange">
<!-- 3. 列表 -->
<el-table v-loading="loading" :data="dewormList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="${comment}" align="center" prop="id" />
<el-table-column label="羊只id" align="center" prop="sheepId" />
<el-table-column label="使用记录" align="center" prop="usageId" />
<el-table-column label="羊只耳号" align="center" prop="sheepNo" />
<el-table-column label="品种" align="center" prop="variety" />
<el-table-column label="羊只类型" align="center" prop="sheepType" />
<el-table-column label="羊只性别" align="center" prop="gender" />
<el-table-column label="羊只类别" align="center" prop="sheepType" />
<el-table-column label="性别" align="center" prop="gender">
<template #default="scope">
<dict-tag :options="sheep_gender" :value="scope.row.gender" />
</template>
</el-table-column>
<el-table-column label="月龄" align="center" prop="monthAge" />
<el-table-column label="胎次" align="center" prop="parity" />
<el-table-column label="羊舍id" align="center" prop="sheepfoldId" />
<el-table-column label="繁殖状态" align="center" prop="breed" />
<el-table-column label="免疫日期" align="center" prop="datetime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</span>
</template>
<template #default="scope">{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</template>
</el-table-column>
<el-table-column label="技术员" align="center" prop="technical" />
<el-table-column label="备注" align="center" prop="comment" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" width="200">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['biosafety:immunity:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['biosafety:immunity:remove']">删除</el-button>
<el-button link type="primary" @click="handleUpdate(scope.row)">修改</el-button>
<el-button link type="danger" @click="handleDelete(scope.row)">删除</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="immunityRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="羊只id" prop="sheepId">
<el-input v-model="form.sheepId" placeholder="请输入羊只id" />
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 4. 新增弹窗羊舍多选 + 无卡片 + 自动剔除 -->
<el-dialog title="新增免疫记录" v-model="addOpen" width="60%" top="5vh" append-to-body>
<el-form ref="addFormRef" :model="addForm" :rules="addRules" label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
<!-- 耳号追加 -->
<el-form-item label="耳号">
<el-input v-model="sheepInput" placeholder="输入耳号回车添加" style="width: 220px" @keyup.enter="validateSheep" />
</el-form-item>
</el-col>
<el-col :span="12">
<!-- 羊舍多选 -->
<el-form-item label="羊舍" prop="barnIds">
<el-select v-model="selectedBarnIds" multiple collapse-tags placeholder="请选择羊舍" style="width: 100%"
@change="handleBarnChange">
<el-option v-for="b in barns" :key="b.id" :label="b.sheepfoldName" :value="b.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- 已选耳号 -->
<el-form-item label="已选耳号">
<el-tag v-for="(tag, idx) in selectedSheepList" :key="tag.sheepId" closable @close="removeSheep(idx)"
style="margin-right: 6px">
{{ tag.sheepNo }}
</el-tag>
</el-form-item>
<el-form-item label="品种" prop="variety">
<el-input v-model="form.variety" placeholder="请输入品种" />
</el-form-item>
<el-form-item label="羊只性别" prop="gender">
<el-input v-model="form.gender" placeholder="请输入羊只性别" />
</el-form-item>
<el-form-item label="月龄" prop="monthAge">
<el-input v-model="form.monthAge" placeholder="请输入月龄" />
</el-form-item>
<el-form-item label="胎次" prop="parity">
<el-input v-model="form.parity" placeholder="请输入胎次" />
</el-form-item>
<el-form-item label="羊舍id" prop="sheepfoldId">
<el-input v-model="form.sheepfoldId" placeholder="请输入羊舍id" />
</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-form-item>
<el-form-item label="技术员" prop="technical">
<el-input v-model="form.technical" placeholder="请输入技术员" />
</el-form-item>
<el-form-item label="备注" prop="comment">
<el-input v-model="form.comment" placeholder="请输入备注" />
<!-- 免疫信息 -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="免疫日期" prop="datetime">
<el-date-picker v-model="addForm.datetime" type="date" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="处方">
<el-select v-model="addForm.prescriptionId" filterable clearable placeholder="请选择处方" style="width: 100%"
@change="handleSelectPrescription">
<el-option v-for="p in presOptions" :key="p.id" :label="p.label" :value="p.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="技术员">
<el-input v-model="addForm.technical" placeholder="请输入技术员姓名" />
</el-form-item>
</el-col>
</el-row>
<div style="margin: 8px 5px;">
<!-- 药品明细 -->
<el-button type="primary" icon="Plus" size="small" @click="handleAddDetail">添加药品</el-button>
<el-table :data="usageDetails" border stripe style="margin-top: 8px">
<el-table-column label="药品">
<template #default="scope">
<el-select v-model="scope.row.mediId" filterable placeholder="请选择药品">
<el-option v-for="m in medicines" :key="m.value" :label="m.label" :value="m.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用量" width="160">
<template #default="scope">
<el-input-number v-model="scope.row.dosage" :min="0" :precision="1" />
</template>
</el-table-column>
<el-table-column label="单位" width="120">
<template #default="scope">
<el-select v-model="scope.row.unit" placeholder="单位">
<el-option v-for="u in units" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用法" width="120">
<template #default="scope">
<el-select v-model="scope.row.usageId" placeholder="用法">
<el-option v-for="u in usages" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="生产厂家">
<template #default="scope">
<el-input v-model="scope.row.manufacturer" placeholder="生产厂家" />
</template>
</el-table-column>
<el-table-column label="生产批号">
<template #default="scope">
<el-input v-model="scope.row.batchNumber" placeholder="批号" />
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button link type="danger" icon="Delete" @click="usageDetails.splice(scope.$index, 1)" />
</template>
</el-table-column>
</el-table>
</div>
<el-form-item label="备注">
<el-input type="textarea" :rows="3" v-model="addForm.comment" placeholder="请输入备注" />
</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>
<el-button @click="addOpen = false"> </el-button>
<el-button type="primary" @click="submitAddForm"> </el-button>
</template>
</el-dialog>
<!-- 5. 修改弹窗羊舍只读下拉 -->
<el-dialog title="修改免疫记录" v-model="editOpen" width="60%" top="5vh" append-to-body>
<el-form ref="editFormRef" :model="editForm" :rules="editRules" label-width="100px">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="羊只耳号">
<span>{{ editForm.sheepNo }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="品种">
<span>{{ editForm.variety }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="羊只类别">
<span>{{ editForm.sheepType }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别">
<span> <dict-tag :options="sheep_gender" :value="editForm.gender" /></span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="繁殖状态">
<span>{{ editForm.breed }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="免疫日期" prop="datetime">
<el-date-picker v-model="editForm.datetime" type="date" style="width: 100%" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="技术员">
<el-input v-model="editForm.technical" placeholder="请输入技术员姓名" />
</el-form-item>
</el-col>
</el-row>
<div style="margin: 10px 10px;">
<el-button type="primary" icon="Plus" size="small" @click="handleAddDetail">添加药品</el-button>
<el-table :data="usageDetails" border stripe style="margin-top: 8px">
<el-table-column label="药品">
<template #default="scope">
<el-select v-model="scope.row.mediId" filterable placeholder="请选择药品">
<el-option v-for="m in medicines" :key="m.value" :label="m.label" :value="m.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用量" width="160">
<template #default="scope">
<el-input-number v-model="scope.row.dosage" :min="0" :precision="1" style="width: 120px;" />
</template>
</el-table-column>
<el-table-column label="单位" width="120">
<template #default="scope">
<el-select v-model="scope.row.unit" placeholder="单位">
<el-option v-for="u in units" :key="u.value" :label="u.label" :value="u.value + ''" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用法" width="120">
<template #default="scope">
<el-select v-model="scope.row.usageId" placeholder="用法">
<el-option v-for="u in usages" :key="u.value" :label="u.label" :value="u.value + ''" />
</el-select>
</template>
</el-table-column>
<el-table-column label="生产厂家">
<template #default="scope">
<el-input v-model="scope.row.manufacturer" placeholder="生产厂家" />
</template>
</el-table-column>
<el-table-column label="生产批号">
<template #default="scope">
<el-input v-model="scope.row.batchNumber" placeholder="批号" />
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button link type="danger" icon="Delete" @click="usageDetails.splice(scope.$index, 1)" />
</template>
</el-table-column>
</el-table>
</div>
<el-form-item label="备注">
<el-input type="textarea" :rows="3" v-model="editForm.comment" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="editOpen = false"> </el-button>
<el-button type="primary" @click="submitEditForm"> </el-button>
</template>
</el-dialog>
</div>
</template>
<script setup name="Immunity">
import { listImmunity, getImmunity, delImmunity, addImmunity, updateImmunity } from "@/api/biosafety/immunity"
import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
import { listImmunity, getImmunity, delImmunity, addImmunity, updateImmunity } from '@/api/biosafety/immunity'
import { listPrescription, getPrescription } from '@/api/biosafety/prescription'
import { listUnit } from '@/api/biosafety/unit'
import { listUsage } from '@/api/biosafety/usage'
import { listMedicine } from '@/api/biosafety/medicine'
import request from '@/utils/request'
import { parseTime } from '@/utils/ruoyi'
const { proxy } = getCurrentInstance()
const { sheep_gender } = proxy.useDict('sheep_gender')
const immunityList = ref([])
const open = ref(false)
/* ------------------ 列表 ------------------ */
const loading = ref(true)
const showSearch = ref(true)
const total = ref(0)
const dewormList = ref([])
const daterangeDatetime = ref([])
const queryParams = reactive({
pageNum: 1,
pageSize: 10,
sheepNo: null,
technical: null
})
const ids = ref([])
const single = ref(true)
const multiple = ref(true)
const total = ref(0)
const title = ref("")
const daterangeDatetime = ref([])
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
sheepId: null,
sheepType: null,
datetime: null,
technical: null,
},
rules: {
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询免疫列表 */
function getList() {
loading.value = true
queryParams.value.params = {}
if (null != daterangeDatetime && '' != daterangeDatetime) {
queryParams.value.params["beginDatetime"] = daterangeDatetime.value[0]
queryParams.value.params["endDatetime"] = daterangeDatetime.value[1]
const qp = { ...queryParams }
qp.params = {}
if (daterangeDatetime.value?.length) {
qp.params.beginDatetime = daterangeDatetime.value[0]
qp.params.endDatetime = daterangeDatetime.value[1]
}
listImmunity(queryParams.value).then(response => {
immunityList.value = response.rows
total.value = response.total
listImmunity(qp).then(res => {
dewormList.value = res.rows
total.value = res.total
loading.value = false
})
}
//
function cancel() {
open.value = false
reset()
}
//
function reset() {
form.value = {
id: null,
sheepId: null,
usageId: null,
variety: null,
sheepType: null,
gender: null,
monthAge: null,
parity: null,
sheepfoldId: null,
datetime: null,
technical: null,
comment: null,
updateBy: null,
updateTime: null,
createBy: null,
createTime: null
}
proxy.resetForm("immunityRef")
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
/** 重置按钮操作 */
function resetQuery() {
daterangeDatetime.value = []
proxy.resetForm("queryRef")
handleQuery()
}
//
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id)
single.value = selection.length != 1
single.value = selection.length !== 1
multiple.value = !selection.length
}
/** 新增按钮操作 */
function handleAdd() {
reset()
open.value = true
title.value = "添加免疫"
function handleQuery() {
queryParams.pageNum = 1
getList()
}
function resetQuery() {
daterangeDatetime.value = []
proxy.resetForm('queryRef')
handleQuery()
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
const _id = row.id || ids.value
getImmunity(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改免疫"
/* ------------------ 新增 ------------------ */
const addOpen = ref(false)
const addForm = reactive({
datetime: new Date(),
technical: '',
comment: '',
prescriptionId: null
})
const addRules = {
datetime: [{ required: true, message: '请选择日期', trigger: 'change' }]
}
const selectedBarnIds = ref([])
const selectedSheepList = ref([])
const barns = ref([])
const sheepInput = ref('')
function getBarns() {
request({ url: '/sheepfold_management/sheepfold_management/list', method: 'get' })
.then(res => (barns.value = res.rows))
}
function handleBarnChange(barnIds) {
// 1. id
const currentIds = new Set(barnIds || [])
// 2.
selectedSheepList.value = selectedSheepList.value.filter(
s => currentIds.has(s.barnId)
)
// 3.
const taskArr = [...currentIds].filter(id =>
!selectedSheepList.value.some(s => s.barnId === id)
)
if (!taskArr.length) return
Promise.all(
taskArr.map(id =>
request({ url: `/sheepfold_management/sheepfold_management/getSheepById`, params: { id } })
)
).then(resArr => {
const list = resArr.flatMap(r => (r.data || []).map(s => ({
sheepNo: s.manageTags,
sheepId: s.id,
barnId: s.barnId
})))
const map = new Map(selectedSheepList.value.map(s => [s.sheepId, s]))
list.forEach(item => map.set(item.sheepId, item))
selectedSheepList.value = [...map.values()]
})
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["immunityRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateImmunity(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
} else {
addImmunity(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功")
open.value = false
getList()
})
}
function validateSheep() {
const no = sheepInput.value.trim()
if (!no) return
if (selectedSheepList.value.some(s => s.sheepNo === no)) {
proxy.$modal.msgWarning('该耳号已存在')
sheepInput.value = ''
return
}
request.get(`/sheep_file/sheep_file/byNo/${no}`).then(res => {
if (!res.data) {
proxy.$modal.msgError('羊只耳号不存在')
} else {
selectedSheepList.value.push({
sheepNo: res.data.sheepNo || res.data.bsManageTags,
sheepId: res.data.id
})
}
sheepInput.value = ''
})
}
/** 删除按钮操作 */
function removeSheep(index) {
selectedSheepList.value.splice(index, 1)
}
function handleAdd() {
Object.assign(addForm, {
datetime: new Date(),
technical: '',
comment: '',
prescriptionId: null
})
selectedBarnIds.value = []
selectedSheepList.value = []
usageDetails.value = [{ mediId: null, dosage: 0, unit: null, usageId: null, manufacturer: null, batchNumber: null }]
getBarns()
addOpen.value = true
}
function submitAddForm() {
proxy.$refs.addFormRef.validate(valid => {
if (!valid || !selectedSheepList.value.length) {
proxy.$modal.msgError('请完善表单并至少选择一只羊')
return
}
addImmunity({
...addForm,
datetime: new Date(addForm.datetime).getTime(),
sheepIds: selectedSheepList.value.map(s => s.sheepId),
usageDetails: usageDetails.value
}).then(() => {
proxy.$modal.msgSuccess('新增成功')
addOpen.value = false
getList()
})
})
}
/* ------------------ 修改 ------------------ */
const editOpen = ref(false)
const editForm = reactive({})
const editRules = {
datetime: [{ required: true, message: '请选择日期', trigger: 'change' }]
}
function handleUpdate(row) {
getImmunity(row.id).then(res => {
Object.assign(editForm, res.data)
selectedSheepList.value = [{ sheepNo: res.data.sheepNo, sheepId: res.data.sheepId }]
usageDetails.value = res.data.usageDetails || []
editOpen.value = true
})
}
function submitEditForm() {
proxy.$refs.editFormRef.validate(valid => {
if (!valid) return
updateImmunity({
...editForm,
datetime: new Date(editForm.datetime).getTime(),
usageDetails: usageDetails.value
}).then(() => {
proxy.$modal.msgSuccess('修改成功')
editOpen.value = false
getList()
})
})
}
/* ------------------ 功能函数 ------------------ */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除免疫编号为"' + _ids + '"的数据项?').then(function() {
return delImmunity(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => {})
const id = row.id || ids.value
proxy.$modal.confirm('确认删除?')
.then(() => delImmunity(id))
.then(() => {
getList()
proxy.$modal.msgSuccess('删除成功')
})
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('biosafety/immunity/export', {
...queryParams.value
}, `immunity_${new Date().getTime()}.xlsx`)
proxy.download('biosafety/deworm/export', { ...queryParams }, `deworm_${Date.now()}.xlsx`)
}
getList()
</script>
/* ------------------ 药品/处方/下拉 ------------------ */
const usageDetails = ref([])
const presOptions = ref([])
const units = ref([])
const usages = ref([])
const medicines = ref([])
function handleSelectPrescription(id) {
if (!id) return
getPrescription(id).then(res => {
usageDetails.value = res.data?.swPresDetailList?.map(i => ({
mediId: i.mediId,
dosage: i.dosage,
unit: i.unitId,
usageId: i.usageId
})) || []
})
}
function handleAddDetail() {
usageDetails.value.push({ mediId: null, dosage: 0, unit: null, usageId: null, manufacturer: null, batchNumber: null })
}
/* ------------------ 初始化 ------------------ */
onMounted(() => {
getList()
getBarns()
listPrescription({ status: 1, persType: 0 }).then(res => {
presOptions.value = res.rows.map(item => ({ id: item.id, label: item.name }))
})
listUnit().then(res => {
units.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
listUsage().then(res => {
usages.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
listMedicine().then(res => {
medicines.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
})
</script>

View File

@ -51,7 +51,7 @@
<template #default="scope"><dict-tag :options="quar_status" :value="scope.row.status" /></template>
</el-table-column>
<el-table-column label="备注" align="center" prop="comment" />
<el-table-column label="操作" align="center" width="200">
<el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['bisosafety:quarantine:edit']">检疫</el-button>

View File

@ -29,7 +29,7 @@
<el-row :gutter="20">
<el-col :span="8">
<div class="info-item">
<strong>羊只类别</strong>{{ sheepInfo.name || '' }}
<strong>羊只类别</strong>{{ sheepInfo.sheepType || '' }}
</div>
</el-col>
<el-col :span="8">
@ -52,12 +52,12 @@
</el-col>
<el-col :span="8">
<div class="info-item">
<strong>怀孕天数</strong>{{ sheepInfo.gestationDay ?? '' }} &nbsp;
<strong>怀孕天数</strong>{{ sheepInfo.gestDay ?? '' }} &nbsp;
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<strong>泌乳天数</strong>{{ sheepInfo.lactationDay ?? '' }} &nbsp;
<strong>泌乳天数</strong>{{ sheepInfo.lactDay ?? '' }} &nbsp;
</div>
</el-col>
</el-row>
@ -67,8 +67,8 @@
class="treatment-form">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="事件日期" prop="eventDate">
<el-date-picker v-model="form.eventDate" type="date" placeholder="选择日期" style="width:100%" />
<el-form-item label="事件日期" prop="datetime">
<el-date-picker v-model="form.datetime" type="date" placeholder="选择日期" style="width:100%" />
</el-form-item>
</el-col>
<el-col :span="12">
@ -218,12 +218,12 @@ const sheepInfo = ref({
sheepNo: null,
gender: '',
variety: '',
name: '',
sheepType: '',
monthAge: null,
parity: null,
breed: '',
lactationDay: null,
gestationDay: null
lactDay: null,
gestDay: null
})
const units = ref([]) //
@ -265,12 +265,12 @@ function getSheepInfo() {
sheepNo: data.bsManageTags,
gender: data.gender,
variety: data.variety,
name: data.name,
sheepType: data.name,
monthAge: data.monthAge,
parity: data.parity,
breed: data.breed,
lactationDay: data.lactationDay,
gestationDay: data.gestationDay,
lactDay: data.lactationDay,
gestDay: data.gestationDay,
}
})
}
@ -332,7 +332,7 @@ function handleDiseaseTypeChange(parentId) {
const form = reactive({
eventType: '诊疗',
eventDate: new Date(), //
datetime: new Date(), //
diseaseParentId: null, //
diseaseSubtype: null, //
veterinarian: '',
@ -374,7 +374,7 @@ function submitForm() {
const submitData = {
...sheepInfo.value,
...form,
eventDate: form.eventDate ? new Date(form.eventDate).getTime() : null,
datetime: form.datetime ? new Date(form.datetime).getTime() : null,
usageDetails: swPresDetailList.value.map(item => ({
mediId: item.mediId,
dosage: item.dosage,

View File

@ -1,31 +1,16 @@
<template>
<div class="app-container">
<!-- 搜索栏 -->
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="羊只耳号" prop="sheepId">
<el-input
v-model="queryParams.sheepId"
placeholder="请输入羊只耳号"
clearable
@keyup.enter="handleQuery"
/>
<el-form-item label="羊只耳号" prop="sheepNo">
<el-input v-model="queryParams.sheepNo" placeholder="请输入羊只耳号" clearable />
</el-form-item>
<el-form-item label="治疗日期" style="width: 308px">
<el-date-picker
v-model="daterangeDatetime"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
<el-date-picker v-model="daterangeDatetime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
<el-form-item label="兽医" prop="veterinary">
<el-input
v-model="queryParams.veterinary"
placeholder="请输入兽医"
clearable
@keyup.enter="handleQuery"
/>
<el-input v-model="queryParams.veterinary" placeholder="请输入兽医" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@ -33,55 +18,33 @@
</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="['treatment:treatment:add']"
>新增</el-button>
<el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['treatment:treatment:edit']"
>修改</el-button>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['treatment:treatment:remove']"
>删除</el-button>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['treatment:treatment:export']"
>导出</el-button>
<el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row>
<!-- 列表 -->
<el-table v-loading="loading" :data="treatmentList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="羊只耳号" align="center" prop="sheepId" />
<el-table-column label="羊只耳号" align="center" prop="sheepNo" />
<el-table-column label="品种" align="center" prop="variety" />
<el-table-column label="羊只类别" align="center" prop="sheepType" />
<el-table-column label="月龄" align="center" prop="monthAge" />
<el-table-column label="性别" align="center" prop="gender" />
<el-table-column label="羊只性别" align="center" prop="gender">
<template #default="scope"><dict-tag :options="sheep_gender" :value="scope.row.gender" /></template>
</el-table-column>
<el-table-column label="胎次" align="center" prop="parity" />
<el-table-column label="繁殖状态" align="center" prop="breed" />
<el-table-column label="泌乳天数" align="center" prop="lactDay" />
@ -91,241 +54,620 @@
<span>{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="疾病类型" align="center" prop="diseaseId" />
<el-table-column label="父疾病" align="center" prop="diseasePid" />
<el-table-column label="疾病类型" align="center" prop="diseaseName" />
<el-table-column label="兽医" align="center" prop="veterinary" />
<el-table-column label="备注" align="center" prop="comment" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['treatment:treatment:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['treatment:treatment:remove']">删除</el-button>
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)">修改</el-button>
<el-button link type="primary" @click="gotDiag(scope.row)">诊断</el-button>
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)">删除</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="treatmentRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="羊只耳号" prop="sheepId">
<el-input v-model="form.sheepId" placeholder="请输入羊只耳号" />
</el-form-item>
<el-form-item label="品种" prop="variety">
<el-input v-model="form.variety" placeholder="请输入品种" />
</el-form-item>
<el-form-item label="月龄" prop="monthAge">
<el-input v-model="form.monthAge" placeholder="请输入月龄" />
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-input v-model="form.gender" placeholder="请输入性别" />
</el-form-item>
<el-form-item label="胎次" prop="parity">
<el-input v-model="form.parity" placeholder="请输入胎次" />
</el-form-item>
<el-form-item label="繁殖状态" prop="breed">
<el-input v-model="form.breed" placeholder="请输入繁殖状态" />
</el-form-item>
<el-form-item label="泌乳天数" prop="lactDay">
<el-input v-model="form.lactDay" placeholder="请输入泌乳天数" />
</el-form-item>
<el-form-item label="怀孕天数" prop="gestDay">
<el-input v-model="form.gestDay" placeholder="请输入怀孕天数" />
</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-form-item>
<el-form-item label="父疾病" prop="diseasePid">
<el-input v-model="form.diseasePid" placeholder="请输入父疾病" />
</el-form-item>
<el-form-item label="兽医" prop="veterinary">
<el-input v-model="form.veterinary" placeholder="请输入兽医" />
</el-form-item>
<el-form-item label="药品使用记录id" prop="usageId">
<el-input v-model="form.usageId" placeholder="请输入药品使用记录id" />
</el-form-item>
<el-form-item label="备注" prop="comment">
<el-input v-model="form.comment" placeholder="请输入备注" />
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 新增弹窗 -->
<el-dialog title="添加治疗记录" v-model="addDialog" width="65%" top="5vh" append-to-body destroy-on-close>
<el-form ref="addFormRef" :model="addForm" :rules="rules" label-width="140px" size="large">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="羊只耳号" required>
<el-input v-model="sheepInput" placeholder="输入耳号后按回车验证" style="width: 300px"
@keyup.enter="validateSheep" />
</el-form-item>
</el-col>
<el-col :span="24">
<div style="margin-bottom: 10px;margin-left: 60px;">
<el-tag v-for="(item, index) in selectedSheepList" :key="item.sheepNo" closable
@close="removeSheep(index)" style="margin-right: 10px">
{{ item.sheepNo }}{{ item.barnName }}
</el-tag>
</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="事件日期" prop="datetime">
<el-date-picker v-model="addForm.datetime" type="date" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="处方">
<el-select v-model="selectedPresId" filterable clearable placeholder="请选择处方" style="width: 100%"
@change="handleSelectPrescription">
<el-option v-for="item in presOptions" :key="item.id" :label="item.label" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="疾病大类" prop="diseasePid">
<el-select v-model="addForm.diseasePid" placeholder="请选择" style="width: 100%"
@change="handleDiseaseTypeChange">
<el-option v-for="item in parentDiseaseOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="疾病子类型" prop="diseaseId">
<el-select v-model="addForm.diseaseId" :disabled="!addForm.diseasePid" placeholder="请选择"
style="width: 100%">
<el-option v-for="item in childDiseaseOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-divider content-position="left">治疗记录</el-divider>
<div class="mb20">
<el-button type="primary" icon="Plus" @click="handleAddSwPresDetail">添加药品</el-button>
</div>
<el-table :data="swPresDetailList" border stripe>
<el-table-column label="序号" width="60">
<template #default="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column label="药品">
<template #default="scope">
<el-select v-model="scope.row.mediId" filterable placeholder="请选择药品">
<el-option v-for="m in medicines" :key="m.value" :label="m.label" :value="m.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用量">
<template #default="scope">
<el-input-number v-model="scope.row.dosage" :min="0" :precision="1" />
</template>
</el-table-column>
<el-table-column label="单位">
<template #default="scope">
<el-select v-model="scope.row.unit" placeholder="单位">
<el-option v-for="u in units" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="使用方法">
<template #default="scope">
<el-select v-model="scope.row.usageId" placeholder="用法">
<el-option v-for="u in usages" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="生产厂家">
<template #default="scope">
<el-input v-model="scope.row.manufacturer" placeholder="生产厂家" />
</template>
</el-table-column>
<el-table-column label="生产批号">
<template #default="scope">
<el-input v-model="scope.row.batchNumber" placeholder="批号" />
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button link type="danger" icon="Delete" @click="deletePresDetail(scope.row)" />
</template>
</el-table-column>
</el-table>
<el-row :gutter="20" style="margin-top:20px;">
<el-col :span="12">
<el-form-item label="兽医">
<el-input v-model="addForm.veterinarian" placeholder="请输入兽医姓名" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注">
<el-input type="textarea" :rows="3" v-model="addForm.comment" placeholder="请输入备注" />
</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>
<el-button @click="addDialog = false"> </el-button>
<el-button type="primary" @click="submitAddForm"> </el-button>
</div>
</template>
</el-dialog>
<!-- 修改弹窗 -->
<el-dialog title="修改治疗记录" v-model="editDialog" width="70%" top="5vh" append-to-body destroy-on-close>
<el-form ref="editFormRef" :model="editForm" :rules="rules" label-width="140px" size="large">
<!-- 羊只基本信息展示只读 -->
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="羊只耳号:">
<el-text>{{ editForm.sheepNo }}</el-text>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="羊只性别:">
<el-text>{{ editForm.gender }}</el-text>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="品种:">
<el-text>{{ editForm.variety }}</el-text>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="羊只类别:">
<el-text>{{ editForm.sheepType }}</el-text>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="月龄">
<el-text>{{ editForm.monthAge }}</el-text>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="胎次">
<el-text>{{ editForm.parity }}</el-text>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="繁殖状态">
<el-text>{{ editForm.breed }}</el-text>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="泌乳天数">
<el-text>{{ editForm.lactDay }}</el-text>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="怀孕天数">
<el-text>{{ editForm.gestDay }}</el-text>
</el-form-item>
</el-col>
</el-row>
<!-- 可编辑内容 -->
<el-divider content-position="left">治疗记录</el-divider>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="治疗日期" prop="datetime">
<el-date-picker v-model="editForm.datetime" type="date" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="处方">
<el-select v-model="selectedPresId" filterable clearable placeholder="请选择处方" style="width: 100%"
@change="handleSelectPrescription">
<el-option v-for="item in presOptions" :key="item.id" :label="item.label" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="疾病大类" prop="diseasePid">
<el-select v-model="editForm.diseasePid" placeholder="请选择" style="width: 100%"
@change="handleDiseaseTypeChange">
<el-option v-for="item in parentDiseaseOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="疾病子类型" prop="diseaseId">
<el-select v-model="editForm.diseaseId" :disabled="!editForm.diseasePid" placeholder="请选择"
style="width: 100%">
<el-option v-for="item in childDiseaseOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<div class="mb20">
<el-button type="primary" icon="Plus" @click="handleAddSwPresDetail">添加药品</el-button>
</div>
<el-table :data="swPresDetailList" border stripe>
<el-table-column label="序号" width="60">
<template #default="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column label="药品">
<template #default="scope">
<el-select v-model="scope.row.mediId" filterable placeholder="请选择药品">
<el-option v-for="m in medicines" :key="m.value" :label="m.label" :value="m.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用量" width="160">
<template #default="scope">
<el-input-number v-model="scope.row.dosage" :min="0" :precision="1" style="width: 120px;" />
</template>
</el-table-column>
<el-table-column label="单位">
<template #default="scope">
<el-select v-model="scope.row.unit" placeholder="单位">
<el-option v-for="u in units" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="使用方法">
<template #default="scope">
<el-select v-model="scope.row.usageId" placeholder="用法">
<el-option v-for="u in usages" :key="u.value" :label="u.label" :value="u.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="生产厂家">
<template #default="scope">
<el-input v-model="scope.row.manufacturer" placeholder="生产厂家" />
</template>
</el-table-column>
<el-table-column label="生产批号">
<template #default="scope">
<el-input v-model="scope.row.batchNumber" placeholder="批号" />
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button link type="danger" icon="Delete" @click="deletePresDetail(scope.row)" />
</template>
</el-table-column>
</el-table>
<el-row :gutter="20" style="margin-top:20px;">
<el-col :span="12">
<el-form-item label="兽医">
<el-input v-model="editForm.veterinarian" placeholder="请输入兽医姓名" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注">
<el-input type="textarea" :rows="3" v-model="editForm.comment" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="editDialog = false"> </el-button>
<el-button type="primary" @click="submitEditForm"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Treatment">
import { listTreatment, getTreatment, delTreatment, addTreatment, updateTreatment } from "@/api/biosafety/treatment"
<script setup>
import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
import { listTreatment, getTreatment, delTreatment, addTreatment, updateTreatment } from '@/api/biosafety/treatment'
import { listDisease } from '@/api/biosafety/disease'
import { listPrescription, getPrescription } from '@/api/biosafety/prescription'
import { listUnit } from '@/api/biosafety/unit'
import { listUsage } from '@/api/biosafety/usage'
import { listMedicine } from '@/api/biosafety/medicine'
import request from '@/utils/request'
import { useRouter } from 'vue-router'
const router = useRouter()
const { proxy } = getCurrentInstance()
const { sheep_gender } = proxy.useDict("sheep_gender")
/* ---------- 列表区域 ---------- */
const treatmentList = 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 daterangeDatetime = ref([])
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
sheepId: null,
datetime: null,
diseaseId: null,
veterinary: null,
},
rules: {
}
const queryParams = reactive({
pageNum: 1,
pageSize: 10,
sheepNo: null,
veterinary: null
})
const { queryParams, form, rules } = toRefs(data)
/* ---------- 弹窗控制 ---------- */
const addDialog = ref(false)
const editDialog = ref(false)
/** 查询治疗记录列表 */
/* ---------- 表单与数据 ---------- */
const sheepInput = ref('')
const selectedSheepList = ref([])
const selectedPresId = ref()
const presOptions = ref([])
const parentDiseaseOptions = ref([])
const childDiseaseOptions = ref([])
const units = ref([])
const usages = ref([])
const medicines = ref([])
const addForm = reactive({
id: null,
eventType: '诊疗',
datetime: new Date(),
diseasePid: null,
diseaseId: null,
veterinarian: '',
comment: ''
})
const editForm = reactive({
id: null,
eventType: '诊疗',
datetime: new Date(),
diseasePid: null,
diseaseId: null,
veterinarian: '',
comment: '',
sheepNo: '',
barnName: '',
variety: '',
sheepType: '',
monthAge: '',
gender: '',
parity: '',
breed: '',
lactDay: '',
gestDay: ''
})
const rules = {
datetime: [{ required: true, message: '请选择日期', trigger: 'change' }],
diseasePid: [{ required: true, message: '请选择疾病大类', trigger: 'change' }],
diseaseId: [{ required: true, message: '请选择疾病子类型', trigger: 'change' }]
}
const swPresDetailList = ref([
{ mediId: null, dosage: 0, unit: null, usageId: null, manufacturer: '', batchNumber: '' }
])
/* ---------- 列表查询 ---------- */
function getList() {
loading.value = true
queryParams.value.params = {}
if (null != daterangeDatetime && '' != daterangeDatetime) {
queryParams.value.params["beginDatetime"] = daterangeDatetime.value[0]
queryParams.value.params["endDatetime"] = daterangeDatetime.value[1]
const qp = { ...queryParams }
qp.params = {}
if (daterangeDatetime.value && daterangeDatetime.value.length) {
qp.params.beginDatetime = daterangeDatetime.value[0]
qp.params.endDatetime = daterangeDatetime.value[1]
}
listTreatment(queryParams.value).then(response => {
treatmentList.value = response.rows
total.value = response.total
listTreatment(qp).then(res => {
treatmentList.value = res.rows
total.value = res.total
loading.value = false
})
}
//
function cancel() {
open.value = false
reset()
}
//
function reset() {
form.value = {
id: null,
diagId: null,
sheepId: null,
variety: null,
sheepType: null,
monthAge: null,
gender: null,
parity: null,
breed: null,
lactDay: null,
gestDay: null,
datetime: null,
diseaseId: null,
diseasePid: null,
veterinary: null,
usageId: null,
comment: null,
updateBy: null,
updateTime: null,
createBy: null,
createTime: null
/* ---------- 疾病联动 ---------- */
function handleDiseaseTypeChange(pid) {
if (!pid) {
childDiseaseOptions.value = []
addForm.diseaseId = null
editForm.diseaseId = null
return
}
proxy.resetForm("treatmentRef")
listDisease({ pid }).then(res => (childDiseaseOptions.value = res.data))
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1
getList()
/* ---------- 处方联动 ---------- */
function handleSelectPrescription(id) {
if (!id) return
getPrescription(id).then(res => {
swPresDetailList.value = res.data.swPresDetailList?.map(i => ({
mediId: i.mediId,
dosage: i.dosage,
unit: i.unitId,
usageId: i.usageId,
manufacturer: '',
batchNumber: ''
})) || []
})
}
/** 重置按钮操作 */
/* ---------- 药品明细 ---------- */
function handleAddSwPresDetail() {
swPresDetailList.value.push({ mediId: null, dosage: 0, unit: null, usageId: null, manufacturer: '', batchNumber: '' })
}
function deletePresDetail(row) {
swPresDetailList.value.splice(swPresDetailList.value.indexOf(row), 1)
}
/* ---------- 羊只验证 ---------- */
function validateSheep() {
const no = sheepInput.value.trim()
if (!no) return
request.get(`/sheep_file/sheep_file/byNo/${no}`).then(res => {
if (!res.data) {
proxy.$modal.msgError('羊只耳号不存在'); return
}
if (selectedSheepList.value.some(s => s.sheepNo === no)) {
proxy.$modal.msgWarning('该羊只已添加'); return
}
selectedSheepList.value.push({
sheepNo: res.data.bsManageTags,
sheepId: res.data.id,
barnName: res.data.sheepfoldName
})
sheepInput.value = ''
})
}
function removeSheep(index) {
selectedSheepList.value.splice(index, 1)
}
/* ---------- 新增 ---------- */
function handleAdd() {
resetForm(addForm)
addDialog.value = true
}
function submitAddForm() {
proxy.$refs.addFormRef.validate(valid => {
if (!valid) return
if (!selectedSheepList.value.length) {
proxy.$modal.msgError('请至少添加一只羊'); return
}
const data = {
...addForm,
datetime: addForm.datetime ? new Date(addForm.datetime).getTime() : null,
usageDetails: swPresDetailList.value,
sheepIds: selectedSheepList.value.map(s => s.sheepId)
}
addTreatment(data).then(() => {
proxy.$modal.msgSuccess('新增成功')
addDialog.value = false
getList()
})
})
}
/* ---------- 修改 ---------- */
function handleUpdate(row) {
resetForm(editForm)
getTreatment(row.id).then(res => {
Object.assign(editForm, {
id: res.data.id,
datetime: res.data.datetime ? new Date(res.data.datetime) : new Date(),
diseasePid: res.data.diseasePid,
diseaseId: res.data.diseaseId,
usageId: res.data.usageId,
veterinarian: res.data.veterinarian,
comment: res.data.comment,
sheepNo: res.data.sheepNo,
barnName: res.data.sheepfoldName,
variety: res.data.variety,
sheepType: res.data.sheepType,
monthAge: res.data.monthAge,
gender: res.data.gender,
parity: res.data.parity,
breed: res.data.breed,
lactDay: res.data.lactDay,
gestDay: res.data.gestDay
})
swPresDetailList.value = res.data.usageDetails || []
selectedPresId.value = res.data.prescriptionId || null
if (editForm.diseasePid) handleDiseaseTypeChange(editForm.diseasePid)
editDialog.value = true
})
}
function submitEditForm() {
proxy.$refs.editFormRef.validate(valid => {
if (!valid) return
const data = {
...editForm,
datetime: editForm.datetime ? new Date(editForm.datetime).getTime() : null,
usageDetails: swPresDetailList.value
}
updateTreatment(data).then(() => {
proxy.$modal.msgSuccess('修改成功')
editDialog.value = false
getList()
})
})
}
/* ---------- 通用 ---------- */
function resetQuery() {
daterangeDatetime.value = []
proxy.resetForm("queryRef")
proxy.resetForm('queryRef')
handleQuery()
}
//
function handleQuery() {
queryParams.pageNum = 1
getList()
}
function handleDelete(row) {
const id = row.id || ids.value
proxy.$modal.confirm('是否确认删除治疗记录编号为"' + id + '"的数据项?')
.then(() => delTreatment(id))
.then(() => { getList(); proxy.$modal.msgSuccess('删除成功') })
}
function handleExport() {
proxy.download('treatment/treatment/export', { ...queryParams }, `treatment_${Date.now()}.xlsx`)
}
function resetForm(formObj) {
Object.assign(formObj, {
id: null,
datetime: new Date(),
diseasePid: null,
diseaseId: null,
veterinarian: '',
comment: '',
sheepNo: '',
barnName: '',
variety: '',
sheepType: '',
monthAge: '',
gender: '',
parity: '',
breed: '',
lactDay: '',
gestDay: ''
})
selectedPresId.value = null
swPresDetailList.value = [{ mediId: null, dosage: 0, unit: null, usageId: null, manufacturer: '', batchNumber: '' }]
}
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id)
single.value = selection.length != 1
single.value = selection.length !== 1
multiple.value = !selection.length
}
/** 新增按钮操作 */
function handleAdd() {
reset()
open.value = true
title.value = "添加治疗记录"
/* 跳转诊疗 */
function gotDiag(row) {
router.push({ path: '/biosafety/diagnosis/add', query: { tId: row.id, sId: row.sheepId } })
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
const _id = row.id || ids.value
getTreatment(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改治疗记录"
/* ---------- 初始化 ---------- */
onMounted(() => {
getList()
listDisease().then(res => {
parentDiseaseOptions.value = res.data.filter(item => item.pid === 0)
})
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["treatmentRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateTreatment(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
} else {
addTreatment(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功")
open.value = false
getList()
})
}
}
listPrescription({ status: 1, persType: 4 }).then(res => {
presOptions.value = res.rows.map(item => ({ id: item.id, label: item.name }))
})
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除治疗记录编号为"' + _ids + '"的数据项?').then(function() {
return delTreatment(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => {})
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('treatment/treatment/export', {
...queryParams.value
}, `treatment_${new Date().getTime()}.xlsx`)
}
getList()
listUnit().then(res => {
units.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
listUsage().then(res => {
usages.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
listMedicine().then(res => {
medicines.value = res.rows.map(item => ({ value: item.id, label: item.name }))
})
})
</script>

View File

@ -1,14 +1,14 @@
<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-form-item label="羊只ID" prop="sheepId">
<el-input
v-model="queryParams.sheepId"
placeholder="请输入羊只ID"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
</el-form-item> -->
<el-form-item label="耳号" prop="bsManageTags">
<el-input
v-model="queryParams.bsManageTags"
@ -82,9 +82,9 @@
<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="主键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) }}
@ -127,8 +127,11 @@
<!-- 添加或修改羊只分组关联对话框 -->
<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-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>
@ -155,7 +158,7 @@
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()
@ -172,7 +175,11 @@ const leafGroupOptions = ref([])
const { sheep_gender } = proxy.useDict('sheep_gender')
const data = reactive({
form: {},
form: {
earTags: '',
groupId: null,
earTagsDisabled: false //
},
queryParams: {
pageNum: 1,
pageSize: 10,
@ -182,12 +189,12 @@ const data = reactive({
},
leafGroupOptions: [],
rules: {
sheepId: [
{ required: true, message: "羊只ID不能为空", trigger: "blur" }
earTags: [
{ required: true, message: "耳号不能为空", trigger: "blur" }
],
groupId: [
{ required: true, message: "分组ID不能为空", trigger: "change" }
]
{ required: true, message: "分组不能为空", trigger: "change" }
],
}
})
@ -205,22 +212,16 @@ const { queryParams, form, rules } = toRefs(data)
import { getSheep_file } from '@/api/fileManagement/sheep_file'
async function getList() {
loading.value = true
try {
// 1.
const params = {
...queryParams.value,
bsManageTags: queryParams.value.bsManageTags
? String(queryParams.value.bsManageTags)
.split(/[,\s]+/)
.map(s => s.trim())
.filter(Boolean)
: undefined
bsManageTags: queryParams.value.bsManageTags || undefined
}
console.log(params)
const { rows, total: t } = await listSheep_grouping_join(params)
console.log(rows)
sheep_groupingList.value = rows
total.value = t
} finally {
@ -266,6 +267,8 @@ function handleSelectionChange(selection) {
/** 新增按钮操作 */
function handleAdd() {
reset()
form.value.earTagsDisabled = false //
form.value.earTags = '' //
open.value = true
title.value = "添加羊只分组关联"
}
@ -273,35 +276,98 @@ function handleAdd() {
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
const _id = row.id || ids.value
getSheep_grouping(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改羊只分组关联"
})
}
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) {
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()
})
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

View File

@ -0,0 +1,340 @@
<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="manageTags">
<el-input v-model="queryParams.manageTags" placeholder="请输入管理耳号" clearable @keyup.enter="handleQuery"
style="max-width: 160px;" />
</el-form-item>
<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>
<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>
<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="${comment}" align="center" prop="id" /> -->
<!-- <el-table-column label="羊只id" align="center" prop="sheepId" /> -->
<el-table-column label="管理耳号" align="center" prop="manageTags" fixed min-width="100px" />
<el-table-column label="体高" align="center" prop="height" />
<el-table-column label="胸围" align="center" prop="bust" />
<el-table-column label="体斜长" align="center" prop="bodyLength" />
<el-table-column label="管围" align="center" prop="pipeLength" />
<el-table-column label="胸深" align="center" prop="chestDepth" />
<el-table-column label="臀高" align="center" prop="hipHeight" />
<el-table-column label="尻宽" align="center" prop="rumpWidth" />
<el-table-column label="尻高" align="center" prop="rumpHeignt" />
<el-table-column label="腰角宽" align="center" prop="hipWidth" />
<el-table-column label="十字部高" align="center" prop="hipCrossHeight" />
<el-table-column label="备注" align="center" prop="comment" min-width="100px" />
<el-table-column label="技术员" align="center" prop="technician" />
<el-table-column label="创建人" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" min-width="130px">
<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" />
<!-- 添加或修改体尺测量对话框 -->
<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="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="chestDepth">
<el-input v-model="form.chestDepth" placeholder="请输入胸深" :disabled="!isAdd" clearable />
</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="technician">
<el-input v-model="form.technician" placeholder="请输入技术员" :disabled="!isAdd" clearable />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注" prop="comment" v-if="!isAdd">
<el-input v-model="form.comment" placeholder="请输入备注" :disabled="!isAdd" 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>
</div>
</template>
<script setup name="Body_measure">
import { listBody_measure, getBody_measure, delBody_measure, addBody_measure, updateBody_measure } from "@/api/produce/bodyManage/body_measure"
import { getCurrentInstance } from 'vue'
import { getSheepByManageTags } from "@/api/produce/manage_sheep/changeVariety"
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 data = reactive({
form: { manageTags: null, technician: null },
queryParams: {
pageNum: 1,
pageSize: 10,
sheepId: null,
manageTags: null,
createTime: null
},
rules: {
manageTags: [
{ required: true, message: '请输入管理耳号', trigger: 'blur' }
],
technician: [
{ required: true, message: '请输入技术员', trigger: 'blur' }
],
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询体尺测量列表 */
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]
}
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;
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;
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,
createTime: null
}
proxy.resetForm("body_measureRef")
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
/** 重置按钮操作 */
function resetQuery() {
daterangeCreateTime.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()
isAdd.value = true
open.value = true
title.value = "添加体尺测量"
}
/** 修改按钮操作 */
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('是否确认删除体尺测量编号为"' + _ids + '"的数据项?').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`)
}
getList()
</script>

View File

@ -0,0 +1,355 @@
<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="manageTags">
<el-input v-model="queryParams.manageTags" placeholder="请输入管理耳号" clearable @keyup.enter="handleQuery"
style="max-width: 160px;" />
</el-form-item>
<el-form-item label="事件日期" style="width: 308px">
<el-date-picker v-model="daterangeDatetime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</el-form-item>
<el-form-item label="体况评分" prop="score">
<el-input v-model="queryParams.score" placeholder="请输入体况评分" clearable @keyup.enter="handleQuery"
style="max-width: 150px;" />
</el-form-item>
<el-form-item label="羊舍" prop="sheepfold">
<el-select v-model="queryParams.sheepfold" placeholder="请选择羊舍" clearable filterable @keyup.enter="handleQuery">
<el-option v-for="item in sheepfoldList" :key="item.id" :label="item.sheepfoldName" :value="item.id" />
</el-select>
</el-form-item>
<!-- <el-form-item label="羊舍id" prop="sheepfold">
<el-input v-model="queryParams.sheepfold" placeholder="请输入羊舍id" clearable @keyup.enter="handleQuery" />
</el-form-item> -->
<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>
<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_score:body_score:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['body_score:body_score:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['body_score:body_score:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['body_score:body_score:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="body_scoreList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="${comment}" align="center" prop="id" /> -->
<!-- <el-table-column label="羊只id" align="center" prop="sheepId" /> -->
<el-table-column label="管理耳号" align="center" prop="manageTags" fixed />
<el-table-column label="事件日期" align="center" prop="datetime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="体况评分" align="center" prop="score" />
<!-- <el-table-column label="羊舍id" align="center" prop="sheepfold" /> -->
<el-table-column label="羊舍" align="center" prop="sheepfoldName" />
<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" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" min-width="150px">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['body_score:body_score:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['body_score:body_score: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="body_scoreRef" :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="manageTags">
<el-input v-model="form.manageTags" placeholder="请输入管理耳号" @blur="onManageTagsBlur" :disabled="!isAdd"
clearable />
</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="请选择事件日期"
:disabled="!isAdd">
</el-date-picker>
</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-select v-model="form.sheepfold" disabled>
<el-option v-for="item in sheepfoldList" :key="item.id" :label="item.sheepfoldName" :value="item.id" />
</el-select>
</el-form-item>
<!-- <el-form-item label="羊舍id" prop="sheepfold">
<el-input v-model="form.sheepfold" placeholder="请输入羊舍id" :disabled="!isAdd" />
</el-form-item> -->
<el-form-item label="备注" v-if="!isAdd">
<el-input v-model="form.comment" disabled type="textarea" rows="2" />
</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="Body_score">
import { listBody_score, getBody_score, delBody_score, addBody_score, updateBody_score } from "@/api/produce/bodyManage/body_score"
import { listSheepfold } from "@/api/produce/manage_sheep/trans_group"
import { checkSheepByManageTags } from "@/api/produce/other/fixHoof"
import { getCurrentInstance, ref, reactive, toRefs } from 'vue'
const { proxy } = getCurrentInstance()
const body_scoreList = 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 daterangeDatetime = ref([])
const daterangeCreateTime = ref([])
const sheepfoldList = ref([])
const isAdd = ref(false)
const data = reactive({
form: {
id: null,
sheepId: null,
manageTags: null,
datetime: null,
score: null,
comment: null,
technician: null
},
queryParams: {
pageNum: 1,
pageSize: 10,
manageTags: null,
score: null,
createTime: null
},
rules: {
manageTags: [
{ required: true, message: '请输入管理耳号', trigger: 'blur' }
],
score: [
{ required: true, message: '请输入体况评分', trigger: 'blur' }
],
technician: [
{ required: true, message: '请输入技术员', trigger: 'blur' }
]
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询体况评分列表 */
function getList() {
loading.value = true
queryParams.value.params = {}
if (null != daterangeDatetime && '' != daterangeDatetime) {
queryParams.value.params["beginDatetime"] = daterangeDatetime.value[0]
queryParams.value.params["endDatetime"] = daterangeDatetime.value[1]
}
if (null != daterangeCreateTime && '' != daterangeCreateTime) {
queryParams.value.params["beginCreateTime"] = daterangeCreateTime.value[0]
queryParams.value.params["endCreateTime"] = daterangeCreateTime.value[1]
}
listBody_score(queryParams.value).then(response => {
body_scoreList.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.sheepfold = null;
form.value.comment = null;
return;
}
checkSheepByManageTags(tag).then(res => {
if (res.code === 200 && res.data) {
form.value.sheepId = res.data.id;
form.value.sheepfold = res.data.sheepfoldId;
form.value.comment = res.data.comment || '';
} else {
form.value.sheepId = null;
form.value.sheepfold = null;
form.value.comment = null;
proxy.$modal.msgWarning("未找到该管理耳号对应的羊只");
}
}).catch(err => {
console.error("耳号验证失败:", err);
form.value.sheepId = null;
form.value.sheepfold = null;
form.value.comment = null;
proxy.$modal.msgError("查询失败,请重试");
});
}
//
function loadSheepfoldList() {
listSheepfold().then(response => {
sheepfoldList.value = response.rows || [];
}).catch(err => {
console.error("加载羊舍列表失败:", err);
proxy.$modal.msgError("加载羊舍列表失败,请刷新页面重试");
});
}
//
function cancel() {
open.value = false
reset()
}
//
function reset() {
form.value = {
id: null,
sheepId: null,
datetime: null,
score: null,
sheepfold: null,
comment: null,
technician: null,
createBy: null,
createTime: null
}
proxy.resetForm("body_scoreRef")
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
/** 重置按钮操作 */
function resetQuery() {
daterangeDatetime.value = []
daterangeCreateTime.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()
isAdd.value = true
open.value = true
title.value = "添加体况评分"
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
isAdd.value = false
const _id = row.id || ids.value
getBody_score(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改体况评分"
})
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["body_scoreRef"].validate(valid => {
if (valid) {
if (!form.value.id && !form.value.sheepId) {
proxy.$modal.msgError("请输入有效的管理耳号");
return;
}
if (form.value.id != null) {
updateBody_score(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
} else {
addBody_score(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功")
open.value = false
getList()
})
}
}
})
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除体况评分编号为"' + _ids + '"的数据项?').then(function () {
return delBody_score(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => { })
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('body_score/body_score/export', {
...queryParams.value
}, `body_score_${new Date().getTime()}.xlsx`)
}
getList()
loadSheepfoldList();
</script>

View File

@ -0,0 +1,319 @@
<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="manageTags">
<el-input v-model="queryParams.manageTags" placeholder="请输入耳号搜索" clearable @keyup.enter="handleQuery"
style="max-width: 160px;" />
</el-form-item>
<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>
<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>
<el-table v-loading="loading" :data="breast_ratingList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="${comment}" align="center" prop="id" /> -->
<!-- <el-table-column label="羊只id" align="center" prop="sheepId" /> -->
<el-table-column label="管理耳号" align="center" prop="manageTags" />
<el-table-column label="乳房深度" align="center" prop="depth" />
<el-table-column label="乳房长度" align="center" prop="length" />
<el-table-column label="乳房位置" align="center" prop="position" />
<el-table-column label="乳房附着" align="center" prop="adbere" />
<el-table-column label="乳房间隔度" align="center" prop="spacing" />
<el-table-column label="乳房评分" align="center" prop="score" />
<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" width="150">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" min-width="120px">
<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" />
<!-- 添加或修改乳房评分对话框 -->
<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="羊只id" prop="sheepId">
<el-input v-model="form.sheepId" placeholder="请输入羊只id" />
</el-form-item> -->
<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="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 } from "@/api/produce/bodyManage/breast_rating"
import { checkSheepByManageTags } from "@/api/produce/other/fixHoof"
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 isAdd = ref(false)
const data = reactive({
form: {
id: null,
manageTags: null,
depth: null,
length: null,
position: null,
adbere: null,
spacing: null,
score: null,
comment: null,
technician: null
},
queryParams: {
pageNum: 1,
pageSize: 10,
manageTags: null
},
rules: {
manageTags: [
{ required: true, message: '请输入管理耳号', trigger: 'blur' }
],
score: [
{ required: true, message: '请输入乳房评分', trigger: 'blur' }
],
technician: [
{ required: true, message: '请输入技术员', trigger: 'blur' }
],
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询乳房评分列表 */
function getList() {
loading.value = true
queryParams.value.params = {}
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 = []
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('是否确认删除乳房评分编号为"' + _ids + '"的数据项?').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`)
}
getList()
</script>

View File

@ -6,11 +6,12 @@
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-form :model="form" ref="formRef" label-position="left" label-width="120px" style="margin-top:15px"
:rules="rules">
<el-row :gutter="20">
<el-col :span="10">
<el-form-item label="耳号" prop="earNumber">
<el-input v-model="form.earNumber" placeholder="请输入耳号" />
<el-input v-model="form.earNumber" placeholder="请输入耳号" @blur="handleEarNumberBlur" />
</el-form-item>
</el-col>
<el-col :span="10">
@ -52,10 +53,9 @@
<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="2" />
<el-option label="母" :value="1" />
<el-option label="阉羊" :value="3" />
</el-select>
</el-form-item>
</el-col>
@ -127,7 +127,6 @@ import { getToken } from '@/utils/auth'
const { proxy } = getCurrentInstance()
/* -------------------- 表单 -------------------- */
const form = ref({
earNumber: '',
sheepfold: '',
@ -145,24 +144,63 @@ const form = ref({
const formRef = ref(null)
const rules = {
earNumber: [{ required: true, message: '请输入耳号', trigger: 'blur' }],
earNumber: [
{ required: true, message: '请输入耳号', trigger: 'blur' },
{ validator: checkEarNumberExists, 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' }],
varietyId: [{ required: true, message: '请选择品种', trigger: 'change' }]
varietyId: [{ required: true, message: '请选择品种', trigger: 'change' }],
joinDate:[{ required: true, message: '请选择入群日期', trigger: 'change' }],
technician:[{ required: true, message: '请输入技术员', trigger: 'change' }],
}
/* -------------------- 下拉数据 -------------------- */
//
function checkEarNumberExists(rule, value, callback) {
if (!value.trim()) {
return callback(new Error('请输入耳号'))
}
request({
url: `/sheep/sheep/existsByManageTags/${value.trim()}`,
method: 'get'
})
.then(response => {
if (response.data === true) {
callback(new Error('耳号已存在,无法新增'))
} else {
callback()
}
})
.catch(error => {
const status = error.response?.status;
const errorMsg = error.response?.data?.msg || '';
if (status === 404) {
callback();
} else {
callback(new Error('请求异常,请稍后重试'));
}
});
}
function handleEarNumberBlur() {
formRef.value.validateField('earNumber')
}
const sheepfoldOptions = ref([])
const varietyOptions = ref([])
//
function getSheepfoldOptions() {
listSheepfold({ pageNum: 1, pageSize: 9999 }).then(res => {
sheepfoldOptions.value = res.rows || []
})
}
//
function getVarietyOptions() {
request({
url: '/base/variety/list',
@ -173,21 +211,38 @@ function getVarietyOptions() {
})
}
/* -------------------- 功能方法 -------------------- */
//
function formatDate(date) {
if (!date) return null;
const d = new Date(date);
const yyyy = d.getFullYear();
const mm = String(d.getMonth() + 1).padStart(2, '0');
const dd = String(d.getDate()).padStart(2, '0');
return `${yyyy}-${mm}-${dd}`;
}
//
function submitForm() {
formRef.value.validate(valid => {
if (!valid) return
addSheep(form.value).then(res => {
if (!valid) return;
const formData = JSON.parse(JSON.stringify(form.value));
formData.birthday = formatDate(formData.birthday);
formData.joinDate = formatDate(formData.joinDate);
if (formData.bornWeight) {
formData.bornWeight = Number(formData.bornWeight);
}
addSheep(formData).then(res => {
if (res.code === 200) {
proxy.$modal.msgSuccess('新增成功')
resetForm()
proxy.$modal.msgSuccess('新增成功');
resetForm();
} else {
proxy.$modal.msgError(res.msg || '新增失败') //
proxy.$modal.msgError(res.msg || '新增失败');
}
}).catch(() => {
proxy.$modal.msgError('请求异常,请稍后重试')
})
})
});
});
}
function resetForm() {
@ -206,7 +261,7 @@ function resetForm() {
technician: ''
}
}
//
function handleExportForm() {
exportSheepForm(form.value).then(res => {
const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
@ -239,29 +294,27 @@ function submitUpload() {
uploadRef.value?.submit()
}
//
//
function handleImportSuccess(res) {
if (res.code === 200) {
proxy.$modal.msgSuccess(res.msg || '导入成功')
importOpen.value = false
uploadRef.value?.clearFiles()
} else {
//
//
proxy.$modal.msgError('导入失败:' + (res.msg || '未知原因'))
}
}
// /
// /
function handleImportError(err) {
const msg = JSON.parse(err.message || '{}')?.msg || '网络异常'
proxy.$modal.msgError('导入失败:' + msg)
}
/* -------------------- 初始化 -------------------- */
getSheepfoldOptions()
getVarietyOptions()
getSheepfoldOptions()
getVarietyOptions()
</script>

View File

@ -0,0 +1,289 @@
<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="manageTags">
<el-input v-model="queryParams.manageTags" placeholder="请输入管理耳号" clearable @keyup.enter="handleQuery"
style="max-width: 160px;" />
</el-form-item>
<el-form-item label="新备注" prop="newComment">
<el-input v-model="queryParams.newComment" placeholder="请输入新备注" clearable @keyup.enter="handleQuery"
style="max-width: 160px;" />
</el-form-item>
<el-form-item label="原备注" prop="oldComment">
<el-input v-model="queryParams.oldComment" placeholder="请输入原备注" clearable @keyup.enter="handleQuery"
style="max-width: 160px;" />
</el-form-item>
<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>
<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="['changeComment:changeComment:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['changeComment:changeComment:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['changeComment:changeComment:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['changeComment:changeComment:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="changeCommentList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="${comment}" align="center" prop="id" /> -->
<!-- <el-table-column label="羊只id" align="center" prop="sheepId" /> -->
<el-table-column label="管理耳号" align="center" prop="manageTags" />
<el-table-column label="新备注" align="center" prop="newComment" />
<el-table-column label="原备注" align="center" prop="oldComment" />
<el-table-column label="创建人" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<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="['changeComment:changeComment:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['changeComment:changeComment: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="changeCommentRef" :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="manageTags">
<el-input v-model="form.manageTags" placeholder="请输入管理耳号" @blur="onManageTagsBlur" :disabled="!isAddMode" />
</el-form-item>
<el-form-item label="新备注" prop="newComment">
<el-input v-model="form.newComment" placeholder="请输入新备注" :disabled="!isAddMode" />
</el-form-item>
<el-form-item label="原备注" prop="oldComment">
<el-input v-model="form.oldComment" placeholder="请输入原备注" :disabled="!isAddMode" />
</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="ChangeComment">
import { listChangeComment, getChangeComment, delChangeComment, addChangeComment, updateChangeComment } from "@/api/produce/manage_sheep/changeComment"
import { getSheepByManageTags } from "@/api/produce/manage_sheep/changeVariety"
const { proxy } = getCurrentInstance()
const changeCommentList = 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 isAddMode = ref(true);
const data = reactive({
form: { manageTags: null, },
queryParams: {
pageNum: 1,
pageSize: 10,
sheepId: null,
manageTags: null,
newComment: null,
oldComment: null,
createTime: null
},
rules: {
manageTags: [
{ required: true, message: "请输入管理耳号", trigger: "blur" }
],
newComment: [
{ required: true, message: "请输入新备注", trigger: "blur" }
]
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询改备注列表 */
function getList() {
loading.value = true
queryParams.value.params = {}
if (null != daterangeCreateTime && '' != daterangeCreateTime) {
queryParams.value.params["beginCreateTime"] = daterangeCreateTime.value[0]
queryParams.value.params["endCreateTime"] = daterangeCreateTime.value[1]
}
listChangeComment(queryParams.value).then(response => {
changeCommentList.value = response.rows
total.value = response.total
loading.value = false
})
}
//
function onManageTagsBlur() {
const tag = form.value.manageTags?.trim();
if (!tag) return;
getSheepByManageTags(tag).then(res => {
const sheep = res.data;
if (sheep) {
form.value.sheepId = sheep.id;
form.value.oldComment = sheep.comment || "";
} else {
proxy.$modal.msgWarning("未找到该管理耳号对应的羊只");
form.value.sheepId = null;
form.value.oldComment = "";
}
}).catch(err => {
console.error("查询羊只失败:", err);
proxy.$modal.msgError("查询失败,请重试");
});
}
//
function cancel() {
open.value = false
reset()
}
//
function reset() {
form.value = {
id: null,
sheepId: null,
newComment: null,
oldComment: null,
createBy: null,
createTime: null
}
proxy.resetForm("changeCommentRef")
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
/** 重置按钮操作 */
function resetQuery() {
daterangeCreateTime.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()
isAddMode.value = true;
open.value = true
title.value = "添加改备注"
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
isAddMode.value = false
const _id = row.id || ids.value
getChangeComment(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改改备注"
})
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["changeCommentRef"].validate(valid => {
if (valid) {
if (!form.value.id) {
if (!form.value.sheepId) {
proxy.$modal.msgError('未找到对应的羊只,请检查耳号');
return;
}
}
if (form.value.id != null) {
updateChangeComment(form.value).then(() => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
} else {
addChangeComment(form.value).then(() => {
proxy.$modal.msgSuccess("新增成功")
open.value = false
getList()
})
}
}
})
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除改备注编号为"' + _ids + '"的数据项?').then(function () {
return delChangeComment(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => { })
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('changeComment/changeComment/export', {
...queryParams.value
}, `changeComment_${new Date().getTime()}.xlsx`)
}
getList()
</script>

View File

@ -0,0 +1,369 @@
<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="manageTag">
<el-input v-model="queryParams.manageTags" placeholder="请输入耳号" clearable @keyup.enter="handleQuery"
style="max-width: 160px;" />
</el-form-item>
<el-form-item label="新耳号" prop="newTag">
<el-input v-model="queryParams.newTag" placeholder="请输入新耳号" clearable @keyup.enter="handleQuery"
style="max-width: 160px;" />
</el-form-item>
<el-form-item label="旧耳号" prop="oldTag">
<el-input v-model="queryParams.oldTag" placeholder="请输入旧耳号" clearable @keyup.enter="handleQuery"
style="max-width: 160px;" />
</el-form-item>
<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>
<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="['changeEar:changeEar:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['changeEar:changeEar:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['changeEar:changeEar:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['changeEar:changeEar:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="changeEarList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="id" align="center" prop="id" />
<el-table-column label="羊只id" align="center" prop="sheepId" /> -->
<el-table-column label="耳号" align="center" prop="manageTags" />
<el-table-column label="耳号类型" align="center" prop="earType">
<template #default="scope">
{{ scope.row.earType === 0 ? '电子耳号' : '管理耳号' }}
</template>
</el-table-column>
<el-table-column label="新耳号" align="center" prop="newTag" />
<el-table-column label="旧耳号" align="center" prop="oldTag" />
<el-table-column label="备注" align="center" prop="comment" />
<el-table-column label="创建人" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<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="['changeEar:changeEar:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['changeEar:changeEar: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="changeEarRef" :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="earNumber">
<el-input v-model="form.earNumber" placeholder="请输入管理耳号或电子耳号" @change="fetchOldTag" :disabled="!isAddMode" />
</el-form-item>
<el-form-item label="耳号类型" prop="earType">
<el-select v-model="form.earType" placeholder="请选择耳号类型" @change="fetchOldTag" :disabled="!isAddMode">
<el-option label="电子耳号" :value="0"></el-option>
<el-option label="管理耳号" :value="1"></el-option>
</el-select>
</el-form-item>
<el-form-item label="新耳号" prop="newTag" @blur="checkNewTagExists">
<el-input v-model="form.newTag" placeholder="请输入新耳号/电子耳号" @blur="checkNewTagExists" :disabled="!isAddMode" />
</el-form-item>
<el-form-item label="旧耳号" prop="oldTag">
<el-input v-model="form.oldTag" placeholder="请输入旧耳号/电子耳号" :disabled="!isAddMode" />
</el-form-item>
<el-form-item label="备注" prop="comment" v-if="!isAddMode">
<el-input v-model="form.comment" type="textarea" placeholder="请输入内容" :disabled="!isAddMode" />
</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="ChangeEar">
import { listChangeEar, getChangeEar, delChangeEar, addChangeEar, updateChangeEar, getSheepByEarNumber,checkTagExists } from "@/api/produce/manage_sheep/changeEar"
const { proxy } = getCurrentInstance()
const changeEarList = 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 isAddMode = ref(true);
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
manageTags: null,
// sheepId: null,
earType: null,
newTag: null,
oldTag: null,
createTime: null
},
rules: {
earNumber: [
{ required: true, message: "请输入管理耳号或电子耳号", trigger: "blur" }
],
earType: [
{ required: true, message: "请选择耳号类型", trigger: "change" }
],
newTag: [
{ required: true, message: "请输入新耳号", trigger: "blur" }
],
oldTag: [
{ required: true, message: "请输入旧耳号", trigger: "change" }
],
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询修改电子耳号记录列表 */
async function getList() {
loading.value = true;
queryParams.value.params = {};
if (queryParams.value.manageTags) {
queryParams.value.params["manageTags"] = queryParams.value.manageTags;
}
if (daterangeCreateTime.value && daterangeCreateTime.value.length > 0) {
queryParams.value.params["beginCreateTime"] = daterangeCreateTime.value[0];
queryParams.value.params["endCreateTime"] = daterangeCreateTime.value[1];
}
const response = await listChangeEar(queryParams.value);
changeEarList.value = response.rows.map(item => {
item.earTypeName = item.earType === 0 ? '电子耳号' : '管理耳号';
return item;
});
total.value = response.total;
loading.value = false;
}
//
function cancel() {
open.value = false
reset()
}
//
function reset() {
form.value = {
// id: null,
// sheepId: null,
manageTags: null,
earType: null,
newTag: null,
oldTag: null,
comment: null,
createBy: null,
createTime: null
}
proxy.resetForm("changeEarRef")
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
/** 重置按钮操作 */
function resetQuery() {
daterangeCreateTime.value = []
queryParams.value.manageTags = null
queryParams.value.newTag = null
queryParams.value.oldTag = null
queryParams.value.earType = 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()
isAddMode.value = true;
open.value = true
title.value = "添加耳号记录"
}
//
function handleUpdate(row) {
reset();
isAddMode.value = false;
const _id = row.id || ids.value;
getChangeEar(_id).then(response => {
response.data.earNumber = response.data.manageTags;
form.value = response.data;
open.value = true;
title.value = "修改电子耳号记录";
});
}
//
function submitForm() {
proxy.$refs["changeEarRef"].validate(valid => {
if (valid) {
if (!form.value.id) {
if (!form.value.sheepId) {
proxy.$modal.msgError('未找到对应的羊只,请检查耳号');
return;
}
}
if (form.value.id) {
updateChangeEar(form.value).then(() => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addChangeEar(form.value).then(() => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}
//
function checkNewTagExists() {
if (!form.value.newTag || form.value.earType === null) {
console.log("新耳号或耳号类型为空");
return;
}
const tagValue = form.value.newTag.trim();
if (!tagValue) {
console.log("新耳号为空");
return;
}
console.log("调用后端接口,参数:", { tag: tagValue, earType: form.value.earType });
checkTagExists(tagValue, form.value.earType).then(res => {
console.log("后端返回结果:", res);
if (res.data.exists) {
proxy.$modal.msgError('该耳号已存在,请更换');
form.value.newTag = '';
}
}).catch(error => {
console.error('校验耳号失败:', error);
proxy.$modal.msgWarning('校验耳号失败,请重试');
});
}
//
function fetchOldTag() {
const earNumber = form.value.earNumber.trim();
const earType = form.value.earType;
if (!earNumber || earType === null) {
form.value.oldTag = '';
form.value.sheepId = null;
form.value.comment = '';
return;
}
getSheepByEarNumber(earNumber, earType).then(response => {
const data = response.data;
const sheep = data.sheep;
const oldTag = data.oldTag;
if (!sheep || !sheep.id) {
form.value.oldTag = '';
form.value.sheepId = null;
form.value.comment = '';
proxy.$modal.warning("未找到对应的羊只");
return;
}
form.value.oldTag = oldTag;
form.value.sheepId = sheep.id;
form.value.comment = sheep.comment || '';
}).catch(error => {
console.error("查询失败:", error);
form.value.oldTag = '';
form.value.sheepId = null;
form.value.comment = '';
proxy.$modal.error("查询耳号失败,请重试");
});
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除修改电子耳号记录编号为"' + _ids + '"的数据项?').then(function () {
return delChangeEar(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => { })
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('changeEar/changeEar/export', {
...queryParams.value
}, `changeEar_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,320 @@
<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="manageTags">
<el-input v-model="queryParams.manageTags" placeholder="请输入管理耳号" clearable @keyup.enter="handleQuery"
style="width: 150px;" />
</el-form-item>
<el-form-item label="原品种" prop="varietyOld">
<el-select v-model="queryParams.varietyOld" placeholder="请选择原品种" clearable filterable>
<el-option v-for="item in varietyOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="新品种" prop="varietyNew">
<el-select v-model="queryParams.varietyNew" placeholder="请选择新品种" clearable filterable>
<el-option v-for="item in varietyOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<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>
<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="['changeVariety:changeVariety:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['changeVariety:changeVariety:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['changeVariety:changeVariety:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['changeVariety:changeVariety:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="changeVarietyList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="${comment}" align="center" prop="id" />
<el-table-column label="羊只id" align="center" prop="sheepId" /> -->
<el-table-column label="管理耳号" align="center" prop="manageTags" />
<el-table-column label="原品种" align="center" prop="varietyOld" />
<el-table-column label="新品种" align="center" prop="varietyNew" />
<el-table-column label="备注" align="center" prop="comment" />
<el-table-column label="创建人" align="center" prop="createBy" />
<el-table-column label="创建日期" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<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="['changeVariety:changeVariety:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['changeVariety:changeVariety: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="changeVarietyRef" :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="manageTags">
<el-input v-model="form.manageTags" placeholder="请输入管理耳号" @blur="onManageTagsBlur" :disabled="!isAdd" />
</el-form-item>
<el-form-item label="原品种" prop="varietyOld">
<el-input v-model="form.varietyOld" placeholder="请输入原品种" :disabled="!isAdd" />
</el-form-item>
<el-form-item label="新品种" prop="varietyNew">
<el-select v-model="form.varietyNew" placeholder="请选择新品种" clearable filterable :disabled="!isAdd">
<el-option v-for="item in varietyOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="备注" prop="comment" v-if="!isAdd">
<el-input v-model="form.comment" 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="ChangeVariety">
import { listChangeVariety, getChangeVariety, delChangeVariety, addChangeVariety, updateChangeVariety, getSheepByManageTags } from "@/api/produce/manage_sheep/changeVariety"
import { listVariety } from '@/api/variety/variety'
const { proxy } = getCurrentInstance()
const changeVarietyList = 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 varietyOptions = ref([])
const data = reactive({
form: {
manageTags: null,
},
queryParams: {
pageNum: 1,
pageSize: 10,
// sheepId: null,
manageTags: null,
varietyOld: null,
varietyNew: null,
createTime: null
},
rules: {
manageTags: [
{ required: true, message: "请输入管理耳号", trigger: "blur" }
],
varietyOld: [
{ required: true, message: "请选择原品种", trigger: "blur" }
],
varietyNew: [
{ required: true, message: "请选择新品种", trigger: "blur" }
],
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询改品种记录列表 */
function getList() {
loading.value = true
queryParams.value.params = {}
if (null != daterangeCreateTime && '' != daterangeCreateTime) {
queryParams.value.params["beginCreateTime"] = daterangeCreateTime.value[0]
queryParams.value.params["endCreateTime"] = daterangeCreateTime.value[1]
}
listChangeVariety(queryParams.value).then(response => {
changeVarietyList.value = response.rows
total.value = response.total
loading.value = false
})
}
function onManageTagsBlur() {
const tag = form.value.manageTags?.trim();
if (!tag) return;
getSheepByManageTags(tag).then(res => {
const sheep = res.data;
if (sheep) {
form.value.varietyOld = sheep.varietyName || "";
form.value.sheepId = sheep.id;
form.value.comment = sheep.comment || "";
} else {
proxy.$modal.msgWarning("未找到该管理耳号对应的羊只");
form.value.varietyOld = "";
form.value.sheepId = null;
form.value.comment = "";
}
}).catch(err => {
console.error("查询羊只失败:", err);
proxy.$modal.msgError("查询失败,请重试");
});
}
function loadVarietyOptions() {
listVariety().then(res => {
varietyOptions.value = res.rows.map(item => ({
label: item.variety,
value: item.variety
}))
})
}
//
function cancel() {
open.value = false
reset()
}
//
function reset() {
form.value = {
id: null,
sheepId: null,
varietyOld: null,
varietyNew: null,
comment: null,
createBy: null,
createTime: null
}
proxy.resetForm("changeVarietyRef")
}
/** 搜索按钮操作 */
function handleQuery() {
loadVarietyOptions()
queryParams.value.pageNum = 1
getList()
}
/** 重置按钮操作 */
function resetQuery() {
daterangeCreateTime.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()
isAdd.value = true
loadVarietyOptions()
open.value = true
title.value = "添加改品种记录"
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
isAdd.value = false
loadVarietyOptions()
const _id = row.id || ids.value
getChangeVariety(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改改品种记录"
})
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["changeVarietyRef"].validate(valid => {
if (valid) {
if (!form.value.id) {
if (!form.value.sheepId) {
proxy.$modal.msgError('未找到对应的羊只,请检查耳号');
return;
}
}
if (form.value.id != null) {
updateChangeVariety(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
} else {
addChangeVariety(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功")
open.value = false
getList()
})
}
}
})
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除改品种记录编号为"' + _ids + '"的数据项?').then(function () {
return delChangeVariety(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => { })
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('changeVariety/changeVariety/export', {
...queryParams.value
}, `changeVariety_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
loadVarietyOptions();
getList();
});
</script>

View File

@ -1,8 +1,9 @@
<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 label="管理耳号" prop="manageTags">
<el-input v-model="queryParams.manageTags" placeholder="请输入耳号" clearable @keyup.enter="handleQuery"
style="width: 150px;" />
</el-form-item>
<el-form-item label="转出羊舍" prop="foldFrom">
<el-select v-model="queryParams.foldFrom" placeholder="请选择转出羊舍" style="min-width:150px" clearable>
@ -56,14 +57,17 @@
<el-table v-loading="loading" :data="trans_groupList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="${comment}" align="center" prop="id" /> -->
<el-table-column label="羊只id" align="center" prop="sheepId" />
<el-table-column label="管理耳号" align="center" prop="manageTags" />
<el-table-column label="转出羊舍" align="center" prop="foldFromName" />
<el-table-column label="转入羊舍" align="center" prop="foldToName" />
<el-table-column label="品种" align="center" prop="varietyName" />
<el-table-column label="转群原因" align="center" prop="reasonText" />
<el-table-column label="技术员" align="center" prop="technician" />
<el-table-column label="状态" align="center" prop="statusText" />
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="status" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="comment" />
<el-table-column label="创建人" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime">
@ -91,22 +95,27 @@
<!-- 添加或修改转群记录对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="trans_groupRef" :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 label="管理耳号" prop="manageTags">
<el-select v-model="form.manageTags" placeholder="请输入或选择耳号" multiple filterable allow-create
style="width: 100%" @change="loadSheepInfo" :disabled="!isAdd">
<el-option v-for="sheep in sheepOptions" :key="sheep.id" :label="sheep.manageTags"
:value="sheep.manageTags" />
</el-select>
</el-form-item>
<el-form-item label="转出羊舍" prop="foldFrom">
<el-select v-model="form.foldFrom" placeholder="请选择转出羊舍" clearable>
<el-select v-model="form.foldFrom" placeholder="请选择转出羊舍" clearable @change="handleSheepFilter"
:disabled="!isAdd">
<el-option v-for="fold in sheepfoldOptions" :key="fold.id" :label="fold.sheepfoldName" :value="fold.id" />
</el-select>
</el-form-item>
<el-form-item label="转入羊舍" prop="foldTo">
<el-select v-model="form.foldTo" placeholder="请选择转入羊舍" clearable>
<el-select v-model="form.foldTo" placeholder="请选择转入羊舍" clearable :disabled="!isAdd">
<el-option v-for="fold in sheepfoldOptions" :key="fold.id" :label="fold.sheepfoldName" :value="fold.id" />
</el-select>
</el-form-item>
<el-form-item label="品种" prop="varietyId">
<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-form-item v-if="isAdd" label="羊只类型" prop="sheepTypeId">
<el-select v-model="form.sheepTypeId" placeholder="请选择羊只类型" clearable @change="handleSheepFilter">
<el-option v-for="type in sheepTypeOptions" :key="type.id" :label="type.name" :value="type.id" />
</el-select>
</el-form-item>
<el-form-item label="转群原因" prop="reason">
@ -118,9 +127,6 @@
<el-form-item label="技术员" prop="technician">
<el-input v-model="form.technician" placeholder="请输入技术员" />
</el-form-item>
<el-form-item label="备注" prop="comment">
<el-input v-model="form.comment" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
@ -134,8 +140,8 @@
<!-- 审批对话框 -->
<el-dialog :title="'审批转群记录'" v-model="approveDialog" width="500px" append-to-body>
<el-form ref="approveFormRef" :model="approveForm" label-width="120px">
<el-form-item label="羊只id">
<el-input v-model="approveForm.sheepId" disabled />
<el-form-item label="耳号">
<el-input v-model="displayManageTags" disabled />
</el-form-item>
<el-form-item label="转出羊舍">
<el-input :value="sheepfoldNameMap[approveForm.foldFrom] || approveForm.foldFrom" disabled />
@ -169,208 +175,477 @@
</template>
<script setup name="Trans_group">
import { listTrans_group, getTrans_group, delTrans_group, addTrans_group, updateTrans_group } from '@/api/produce/manage_sheep/trans_group'
import { listTrans_group, getTrans_group, delTrans_group, addTrans_group, updateTrans_group, approveScTransGroup } from '@/api/produce/manage_sheep/trans_group'
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management'
import { checkSheepByManageTags, getSheepBySheepfoldId } from '@/api/produce/other/fixHoof'
import request from '@/utils/request'
const { proxy } = getCurrentInstance()
const { trans_group_reason, status } = proxy.useDict('trans_group_reason', 'status')
const { proxy } = getCurrentInstance();
const { trans_group_reason, status } = proxy.useDict('trans_group_reason', 'status');
/* -------------------- 响应式变量 -------------------- */
const trans_groupList = 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 trans_groupList = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(false);
const total = ref(0);
const title = ref('');
const daterangeCreateTime = ref([]);
const approveDialog = ref(false)
const approveForm = ref({})
const approveDialog = ref(false);
const approveForm = ref({});
const displayManageTags = ref('');
const sheepOptions = ref([]);
const sheepfoldOptions = ref([]);
const sheepfoldNameMap = ref({});
const varietyOptions = ref([]);
const sheepTypeOptions = ref([]);
const isAdd = ref(false);
const sheepfoldOptions = ref([])
const sheepfoldNameMap = ref({})
const varietyOptions = ref([])
/* -------------------- 表单 & 查询 -------------------- */
const data = reactive({
form: {},
form: {
manageTags: [],
tagDetails: {},
},
queryParams: {
pageNum: 1,
pageSize: 10,
sheepId: null,
manageTags: null,
foldTo: null,
foldFrom: null,
varietyId: null, //
varietyId: null,
status: null,
createTime: null
createTime: null,
},
rules: {
sheepId: [{ required: true, message: '羊只id不能为空', trigger: 'blur' }],
foldFrom: [{ required: true, message: '转出羊舍不能为空', trigger: 'change' }],
foldTo: [{ required: true, message: '转入羊舍不能为空', trigger: 'change' }],
varietyId: [{ required: true, message: '品种不能为空', trigger: 'change' }],
reason: [{ required: true, message: '转群原因不能为空', trigger: 'change' }],
technician: [{ required: true, message: '技术员不能为空', trigger: 'blur' }]
}
})
const { queryParams, form, rules } = toRefs(data)
manageTags: [{ required: true, message: '请输入耳号', trigger: 'blur' }],
foldTo: [{ required: true, message: '请选择转入羊舍', trigger: 'change' }],
varietyId: [{ required: true, message: '请选择品种', trigger: 'change' }],
reason: [{ required: true, message: '请选择转群原因', trigger: 'change' }],
technician: [{ required: true, message: '请输入技术员', trigger: 'blur' }],
},
});
const { queryParams, form, rules } = toRefs(data);
/* -------------------- 业务函数 -------------------- */
/** 查询转群记录列表 */
function getList() {
loading.value = true
queryParams.value.params = {}
loading.value = true;
queryParams.value.params = {};
if (daterangeCreateTime.value?.length) {
queryParams.value.params.beginCreateTime = daterangeCreateTime.value[0]
queryParams.value.params.endCreateTime = daterangeCreateTime.value[1]
queryParams.value.params.beginCreateTime = daterangeCreateTime.value[0];
queryParams.value.params.endCreateTime = daterangeCreateTime.value[1];
}
listTrans_group(queryParams.value).then(res => {
trans_groupList.value = res.rows
total.value = res.total
loading.value = false
})
listTrans_group(queryParams.value).then((res) => {
trans_groupList.value = res.rows;
total.value = res.total;
loading.value = false;
});
}
//
function reset() {
form.value = {
id: null,
sheepId: null,
foldFrom: null,
foldTo: null,
varietyId: null, //
varietyId: null,
reason: null,
technician: null,
status: null,
comment: null,
createBy: null,
createTime: null
createTime: null,
manageTags: [],
tagDetails: {},
sheepTypeId: null,
};
proxy.resetForm('trans_groupRef');
}
//
async function handleSheepFilter() {
const { foldFrom, sheepTypeId } = form.value;
let isOnlySheepfold = false;
let isOnlyTypeOrCombined = false;
if (foldFrom && !sheepTypeId) {
isOnlySheepfold = true;
} else if (!foldFrom && sheepTypeId) {
isOnlyTypeOrCombined = true;
} else if (foldFrom && sheepTypeId) {
isOnlyTypeOrCombined = true;
} else {
form.value.manageTags = [];
sheepOptions.value = [];
return;
}
if (isOnlySheepfold) {
await loadSheepBySheepfoldOnly(foldFrom);
}
else if (isOnlyTypeOrCombined) {
form.value.manageTags = [];
let loadedSheep = [];
if (foldFrom && sheepTypeId) {
loadedSheep = await loadSheepBySheepfoldAndType(foldFrom, sheepTypeId);
} else if (sheepTypeId) {
loadedSheep = await loadSheepByTypeOnly(sheepTypeId);
}
if (loadedSheep.length > 0) {
form.value.manageTags = loadedSheep.map((sheep) => sheep.manageTags);
await loadSheepInfo();
}
}
proxy.resetForm('trans_groupRef')
}
//
function getSheepTypeList() {
return new Promise((resolve, reject) => {
request({
url: '/base/base/list',
method: 'get',
params: { pageNum: 1, pageSize: 9999 },
}).then((res) => {
sheepTypeOptions.value = res.rows.map(item => ({
id: Number(item.id),
name: item.name || item.typeName
})) || [];
resolve();
}).catch((error) => {
console.error('获取羊只类型失败', error);
proxy.$modal.msgError('加载羊只类型失败,请重试');
reject(error);
});
});
}
//
async function loadSheepBySheepfoldOnly(sheepfoldId) {
try {
const res = await getSheepBySheepfoldId(String(sheepfoldId));
const newSheepList = (res.data || []).map((sheep) => ({
id: sheep.id,
manageTags: sheep.manageTags,
sheepfoldId: sheepfoldId,
}));
const existingTags = new Set(sheepOptions.value.map((item) => item.manageTags));
const mergedSheep = newSheepList.filter((item) => !existingTags.has(item.manageTags));
sheepOptions.value.push(...mergedSheep);
return mergedSheep;
} catch (error) {
console.error('根据羊舍加载耳号失败', error);
proxy.$modal.msgError('加载羊舍耳号失败,请重试');
return [];
}
}
//
async function loadSheepBySheepfoldAndType(sheepfoldId, typeId) {
try {
const res = await request({
url: '/sheep/sheep/listBySheepfoldAndType',
method: 'get',
params: { sheepfoldId, typeId, _t: Date.now() },
});
const sheepList = res.rows || [];
const formattedSheep = sheepList.map((sheep) => ({
id: sheep.id,
manageTags: sheep.manageTags,
sheepfoldId: sheepfoldId,
}));
sheepOptions.value = formattedSheep;
return formattedSheep;
} catch (error) {
console.error('根据羊舍+类型加载耳号失败', error);
proxy.$modal.msgError('加载耳号失败,请重试');
return [];
}
}
//
async function loadSheepByTypeOnly(typeId) {
try {
const res = await request({
url: '/sheep/sheep/listByTypeId',
method: 'get',
params: { typeId },
});
const sheepList = res.rows || [];
const formattedSheep = sheepList.map((sheep) => ({
id: sheep.id,
manageTags: sheep.manageTags,
sheepfoldId: sheep.sheepfoldId,
}));
sheepOptions.value = formattedSheep;
return formattedSheep;
} catch (error) {
console.error('根据类型加载耳号失败', error);
proxy.$modal.msgError('加载耳号失败,请重试');
return [];
}
}
//
async function loadSheepInfo() {
const tags = form.value.manageTags;
if (!tags || tags.length === 0) return;
const tagDetails = {};
const validResults = [];
let firstSheepfoldId = null;
for (const tag of tags) {
try {
const { data: sheepData } = await checkSheepByManageTags(tag.trim());
if (!sheepData) {
validResults.push(false);
proxy.$modal.msgError(`耳号 ${tag} 不存在或信息异常`);
} else {
validResults.push(true);
tagDetails[tag] = {
comment: sheepData.comment || '',
varietyId: sheepData.varietyId,
sheepId: sheepData.id,
sheepfoldId: sheepData.sheepfoldId,
};
if (!firstSheepfoldId) {
firstSheepfoldId = sheepData.sheepfoldId;
}
}
} catch (error) {
console.error('获取耳号信息失败:', error);
proxy.$modal.msgError(`耳号 ${tag} 验证失败,请重试`);
validResults.push(false);
}
}
if (validResults.includes(false)) {
form.value.manageTags = tags.filter((_, index) => validResults[index]);
proxy.$message.warning('部分耳号不合法,已自动过滤');
}
form.value.tagDetails = tagDetails;
if (firstSheepfoldId && isAdd.value) {
form.value.foldFrom = Number(firstSheepfoldId);
}
}
//
function cancel() {
open.value = false
reset()
open.value = false;
reset();
}
//
function handleQuery() {
queryParams.value.pageNum = 1
getList()
queryParams.value.pageNum = 1;
getList();
}
//
function resetQuery() {
daterangeCreateTime.value = []
proxy.resetForm('queryRef')
handleQuery()
daterangeCreateTime.value = [];
proxy.resetForm('queryRef');
handleQuery();
}
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id)
single.value = selection.length !== 1
multiple.value = !selection.length
ids.value = selection.map((item) => item.id);
single.value = selection.length !== 1;
multiple.value = !selection.length;
}
//
function handleAdd() {
reset()
open.value = true
title.value = '添加转群记录'
reset();
open.value = true;
title.value = '添加转群记录';
isAdd.value = true;
sheepOptions.value = [];
form.value.manageTags = [];
}
function handleUpdate(row) {
reset()
const _id = row.id || ids.value
getTrans_group(_id).then(res => {
const d = res.data
// Number undefined
d.foldFrom = Number(d.foldFrom ?? 0)
d.foldTo = Number(d.foldTo ?? 0)
d.reason = Number(d.reason ?? 0)
d.status = Number(d.status ?? 0)
d.varietyId = Number(d.varietyId ?? 0)
form.value = d
open.value = true
title.value = '修改转群记录'
})
//
async function handleUpdate(row) {
reset();
const _id = row.id || ids.value;
loading.value = true;
isAdd.value = false;
const { data: d } = await getTrans_group(_id);
try {
await Promise.all([
sheepfoldOptions.value.length === 0 ? loadSheepfold() : Promise.resolve(),
sheepTypeOptions.value.length === 0 ? getSheepTypeList() : Promise.resolve()
]);
const { data: d } = await getTrans_group(_id);
const manageTags = Array.isArray(d.manageTags)
? d.manageTags
: d.manageTags ? [d.manageTags] : [];
const formData = {
...d,
manageTags: manageTags,
foldFrom: Number(d.foldFrom || 0),
foldTo: Number(d.foldTo || 0),
sheepTypeId: Number(d.sheepTypeId || 0),
reason: Number(d.reason || 0),
status: Number(d.status || 0),
varietyId: Number(d.varietyId || 0),
isEdit: true
};
// 5.
// const foldFromItem = sheepfoldOptions.value.find(item => item.id === formData.foldFrom);
// const foldToItem = sheepfoldOptions.value.find(item => item.id === formData.foldTo);
// const sheepTypeItem = sheepTypeOptions.value.find(item => item.id === formData.sheepTypeId);
// console.log(":", foldFromItem ? foldFromItem.sheepfoldName : "");
// console.log(":", foldToItem ? foldToItem.sheepfoldName : "");
// console.log(":", sheepTypeItem ? sheepTypeItem.name : "");
form.value = formData;
if (manageTags.length > 0) {
await loadSheepInfo();
}
open.value = true;
title.value = '修改转群记录';
} catch (error) {
console.error('修改加载失败:', error);
proxy.$modal.msgError('加载数据失败');
} finally {
loading.value = false;
}
}
//
function submitForm() {
proxy.$refs.trans_groupRef.validate(valid => {
if (!valid) return
const api = form.value.id ? updateTrans_group : addTrans_group
api(form.value).then(() => {
proxy.$modal.msgSuccess(form.value.id ? '修改成功' : '新增成功')
open.value = false
getList()
})
})
}
proxy.$refs.trans_groupRef.validate((valid) => {
if (!valid) return;
const allTags = form.value.manageTags;
const tagDetails = form.value.tagDetails || {};
if (!allTags || allTags.length === 0) {
proxy.$modal.msgError('请选择或输入至少一个耳号');
return;
}
const requests = allTags.map(async (tag) => {
const formData = { ...form.value };
const details = tagDetails[tag] || {};
formData.manageTags = tag;
formData.sheepId = details.sheepId;
formData.foldFrom = details.sheepfoldId;
formData.comment = details.comment || '';
formData.varietyId = details.varietyId || formData.varietyId;
if (formData.id) {
return updateTrans_group(formData);
} else {
return addTrans_group(formData);
}
});
Promise.all(requests)
.then(() => {
proxy.$modal.msgSuccess('操作成功');
open.value = false;
getList();
})
.catch((error) => {
proxy.$modal.msgError(`处理失败:${error.message}`);
});
});
}
//
function handleDelete(row) {
const _ids = row.id || ids.value
const _ids = row.id || ids.value;
proxy.$modal.confirm(`是否确认删除转群记录编号为“${_ids}”的数据项?`)
.then(() => delTrans_group(_ids))
.then(() => {
getList()
proxy.$modal.msgSuccess('删除成功')
})
getList();
proxy.$modal.msgSuccess('删除成功');
});
}
//
function handleExport() {
proxy.download(
'/produce/manage_sheep/trans_group/export',
{ ...queryParams.value },
`trans_group_${Date.now()}.xlsx`
)
);
}
/* -------------------- 审批 -------------------- */
//
function handleApprove(row) {
approveForm.value = { ...row }
approveDialog.value = true
}
function handleApproveAgree() {
approveForm.value.status = 1
updateTrans_group(approveForm.value).then(() => {
approveDialog.value = false
proxy.$modal.msgSuccess('审批成功,状态已更新为同意')
getList()
})
}
function handleApproveReject() {
approveForm.value.status = 2
updateTrans_group(approveForm.value).then(() => {
approveDialog.value = false
proxy.$modal.msgSuccess('审批成功,状态已更新为驳回')
getList()
})
approveForm.value = { ...row };
approveDialog.value = true;
displayManageTags.value = row.manageTags;
}
/* -------------------- 下拉数据 -------------------- */
function loadSheepfold() {
listSheepfold({ pageNum: 1, pageSize: 9999 }).then(res => {
sheepfoldOptions.value = res.rows
sheepfoldNameMap.value = res.rows.reduce((acc, item) => {
acc[item.id] = item.sheepfoldName
return acc
}, {})
})
//
function handleApproveAgree() {
if (typeof approveForm.value.foldTo !== 'number') {
approveForm.value.foldTo = Number(approveForm.value.foldTo);
}
approveForm.value.status = 1;
approveScTransGroup(approveForm.value).then(() => {
approveDialog.value = false;
proxy.$modal.msgSuccess('审批通过,羊只所在羊舍已更新');
getList();
}).catch(error => {
proxy.$modal.msgError(`审批失败:${error.message}`);
});
}
function handleApproveReject() {
approveForm.value.status = 2;
approveScTransGroup(approveForm.value).then(() => {
approveDialog.value = false;
proxy.$modal.msgSuccess('审批已驳回');
getList();
}).catch(error => {
proxy.$modal.msgError(`审批失败:${error.message}`);
});
}
function loadSheepfold() {
listSheepfold({ pageNum: 1, pageSize: 9999 }).then((res) => {
sheepfoldOptions.value = res.rows;
sheepfoldNameMap.value = res.rows.reduce((acc, item) => {
acc[item.id] = item.sheepfoldName;
return acc;
}, {});
});
}
function getVarietyOptions() {
request({
url: '/base/variety/list',
method: 'get',
params: { pageNum: 1, pageSize: 9999 }
}).then(res => {
varietyOptions.value = res.rows || []
})
params: { pageNum: 1, pageSize: 9999 },
}).then((res) => {
varietyOptions.value = res.rows || [];
});
}
/* -------------------- 初始化 -------------------- */
loadSheepfold()
getVarietyOptions()
getList()
onMounted(() => {
loadSheepfold();
getVarietyOptions();
getSheepTypeList();
getList();
});
</script>

View File

@ -1,36 +1,34 @@
<template>
<div class="app-container">
<!-- 查询表单 -->
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
<el-form-item label="羊只id" prop="sheepId">
<el-input v-model="queryParams.sheepId" placeholder="请输入羊只id" clearable @keyup.enter="handleQuery" />
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="管理耳号" prop="manageTags">
<el-input v-model="queryParams.manageTags" placeholder="请输入管理耳号" clearable @keyup.enter="handleQuery" style="width: 150px;"/>
</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="转入牧场" prop="transTo">
<el-input v-model="queryParams.transTo" placeholder="请输入转入牧场" clearable @keyup.enter="handleQuery" />
<el-select v-model="queryParams.transTo" placeholder="请选择转入牧场" clearable style="min-width:150px">
<el-option v-for="ranch in ranchOptions" :key="ranch.id" :label="ranch.ranchName" :value="ranch.ranchName" />
</el-select>
</el-form-item>
<el-form-item label="当前牧场" prop="transFrom">
<el-input v-model="queryParams.transFrom" placeholder="请输入当前牧场" clearable @keyup.enter="handleQuery" />
<el-select v-model="queryParams.transFrom" placeholder="请选择当前牧场" clearable style="min-width:150px">
<el-option v-for="ranch in ranchOptions" :key="ranch.id" :label="ranch.ranchName" :value="ranch.ranchName" />
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" style="width: 150px" placeholder="请选择状态" clearable>
<el-option v-for="dict in status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<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 v-model="daterangeCreateTime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
@ -41,19 +39,19 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd"
v-hasPermi="['transition_info:transition_info:add']">新增</el-button>
v-hasPermi="['transition_info:transition_info:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['transition_info:transition_info:edit']">修改</el-button>
v-hasPermi="['transition_info:transition_info:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['transition_info:transition_info:remove']">删除</el-button>
v-hasPermi="['transition_info:transition_info:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['transition_info:transition_info:export']">导出</el-button>
v-hasPermi="['transition_info:transition_info:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row>
@ -61,21 +59,17 @@
<!-- 列表 -->
<el-table v-loading="loading" :data="transition_infoList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="羊只id" align="center" prop="sheepId" />
<el-table-column label="品种" align="center" prop="varietyName" />
<el-table-column label="耳号" align="center" prop="manageTags" />
<el-table-column label="品种" align="center" prop="varietyName" />
<el-table-column label="转入牧场" align="center" prop="transTo" />
<el-table-column label="当前牧场" align="center" prop="transFrom" />
<el-table-column label="转场类型" align="center" prop="transType">
<template #default="scope">
<dict-tag :options="trans_type" :value="scope.row.transType" />
</template>
</el-table-column>
<el-table-column label="技术员" align="center" prop="technician" />
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="status" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="技术员" align="center" prop="technician" />
<el-table-column label="状态" align="center" prop="statusText" />
<el-table-column label="备注" align="center" prop="comment" />
<el-table-column label="创建人" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
@ -86,52 +80,50 @@
<el-table-column label="操作" align="center" min-width="180">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleApprove(scope.row)"
v-hasPermi="['transition_info:transition_info:approve']">审批</el-button>
v-hasPermi="['transition_info:transition_info:approve']">审批</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['transition_info:transition_info:remove']">删除</el-button>
v-hasPermi="['transition_info:transition_info: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" />
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 新增/修改 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="transition_infoRef" :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="varietyId">
<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-form-item label="管理耳号" prop="manageTags">
<el-select v-model="form.manageTags" placeholder="请输入或选择耳号" filterable multiple allow-create
@change="loadSheepInfo" :disabled="!isAdd" >
<el-option v-for="sheep in sheepOptions" :key="sheep.id" :label="sheep.manageTags"
:value="sheep.manageTags" />
</el-select>
</el-form-item>
<el-form-item label="转入牧场" prop="transTo">
<el-input v-model="form.transTo" placeholder="请输入转入牧场" />
<el-select v-model="form.transTo" placeholder="请选择转入牧场" clearable :disabled="!isAdd" >
<el-option v-for="ranch in ranchOptions" :key="ranch.id" :label="ranch.ranchName"
:value="ranch.ranchName" />
</el-select>
</el-form-item>
<el-form-item label="当前牧场" prop="transFrom">
<el-input v-model="form.transFrom" placeholder="请输入当前牧场" />
<el-select v-model="form.transFrom" placeholder="请选择当前牧场" clearable @change="handleRanchChange" :disabled="!isAdd" >
<el-option v-for="ranch in ranchOptions" :key="ranch.id" :label="ranch.ranchName"
:value="ranch.ranchName" />
</el-select>
</el-form-item>
<el-form-item label="转场类型" prop="transType">
<el-select v-model="form.transType" placeholder="请选择转场类型">
<el-option v-for="dict in trans_type" :key="dict.value"
:label="dict.label" :value="parseInt(dict.value)" />
<el-option v-for="dict in trans_type" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" />
</el-select>
</el-form-item>
<el-form-item label="技术员" prop="technician">
<el-input v-model="form.technician" placeholder="请输入技术员" />
</el-form-item>
<el-form-item label="备注" prop="comment">
<el-input v-model="form.comment" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
@ -145,15 +137,30 @@
<!-- 审批对话框 -->
<el-dialog :title="'审批转场记录'" v-model="approveDialog" width="500px" append-to-body>
<el-form ref="approveFormRef" :model="approveForm" label-width="120px">
<el-form-item label="羊只id"><el-input v-model="approveForm.sheepId" disabled /></el-form-item>
<el-form-item label="品种"><el-input :value="approveForm.varietyName" disabled /></el-form-item>
<el-form-item label="转入牧场"><el-input v-model="approveForm.transTo" disabled /></el-form-item>
<el-form-item label="当前牧场"><el-input v-model="approveForm.transFrom" disabled /></el-form-item>
<el-form-item label="转场类型">
<el-input :value="getTransTypeLabel(approveForm.transType)" disabled />
<el-form-item label="管理耳号">
<el-input v-model="displayManageTags" disabled />
</el-form-item>
<el-form-item label="品种">
<el-input :value="approveForm.varietyName" disabled />
</el-form-item>
<el-form-item label="转入牧场">
<el-input :value="approveForm.transTo" disabled />
</el-form-item>
<el-form-item label="当前牧场">
<el-input :value="approveForm.transFrom" disabled />
</el-form-item>
<el-form-item label="转场类型">
<el-input :value="approveForm.transTypeText || '未知类型'" disabled />
</el-form-item>
<el-form-item label="技术员">
<el-input v-model="approveForm.technician" disabled />
</el-form-item>
<el-form-item label="备注">
<el-input v-model="approveForm.comment" disabled />
</el-form-item>
<el-form-item label="状态">
<el-input :value="getStatusLabel(approveForm.status)" disabled />
</el-form-item>
<el-form-item label="技术员"><el-input v-model="approveForm.technician" disabled /></el-form-item>
<el-form-item label="备注"><el-input v-model="approveForm.comment" disabled /></el-form-item>
</el-form>
<template #footer>
@ -167,36 +174,47 @@
</template>
<script setup name="Transition_info">
import { listTransition_info, getTransition_info, delTransition_info, addTransition_info, updateTransition_info } from "@/api/produce/manage_sheep/transition_info"
import { listTransition_info, getTransition_info, delTransition_info, addTransition_info, getSheepByRanchId, updateTransition_info, listRanch,approveTransitionInfo } from "@/api/produce/manage_sheep/transition_info"
import { checkSheepByManageTags, getSheepBySheepfoldId } from '@/api/produce/other/fixHoof'
import request from '@/utils/request'
const { proxy } = getCurrentInstance()
const { status, trans_type } = proxy.useDict('status', 'trans_type')
/* -------------------- 响应式数据 -------------------- */
const transition_infoList = 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 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 approveDialog = ref(false)
const approveForm = ref({})
const approveForm = ref({})
const displayManageTags = ref('')
const varietyOptions = ref([])
const ranchOptions = ref([]);
const sheepOptions = ref([]);
const isAdd = ref(true);
const isEdit = ref(false);
/* -------------------- 查询 / 表单 -------------------- */
const data = reactive({
form: {},
form: {
id: null,
manageTags: [],
transTo: null,
transFrom: null,
transType: null,
technician: null,
tagDetails: {}
},
queryParams: {
pageNum: 1,
pageSize: 10,
sheepId: null,
manageTags: [],
varietyId: null,
transTo: null,
transFrom: null,
@ -204,103 +222,384 @@ const data = reactive({
createTime: null
},
rules: {
sheepId: [
{ required: true, message: "羊只id不能为空", trigger: "blur" }
],
varietyId: [
{ required: true, message: "品种不能为空", trigger: "change" }
manageTags:[
{ required: true, message: "请输入管理耳号", trigger: "blur" }
],
transTo: [
{ required: true, message: "转入牧场不能为空", trigger: "blur" }
{ required: true, message: "请输入转入牧场", trigger: "blur" }
],
transFrom: [
{ required: true, message: "当前牧场不能为空", trigger: "blur" }
{ required: false, message: "请选择当前牧场", trigger: "blur" }
],
transType: [
{ required: true, message: "转场类型不能为空", trigger: "change" }
{ required: true, message: "请选择转场类型", trigger: "change" }
],
technician: [
{ required: true, message: "技术员不能为空", trigger: "blur" }
{ required: true, message: "请输入技术员", trigger: "blur" }
]
}
})
const { queryParams, form, rules } = toRefs(data)
/* -------------------- 基础方法 -------------------- */
//
function getList() {
loading.value = true
queryParams.value.params = {}
if (daterangeCreateTime.value?.length) {
queryParams.value.params.beginCreateTime = daterangeCreateTime.value[0]
queryParams.value.params.endCreateTime = daterangeCreateTime.value[1]
queryParams.value.params.endCreateTime = daterangeCreateTime.value[1]
}
listTransition_info(queryParams.value).then(res => {
transition_infoList.value = res.rows
total.value = res.total
loading.value = false
total.value = res.total
loading.value = false
})
}
//
function reset() {
form.value = {
id: null,
sheepId: null,
varietyId: null,
manageTags: [],
transTo: null,
transFrom: null,
transType: null,
technician: null,
status: null,
comment: null,
createBy: null,
createTime: null
}
proxy.resetForm("transition_infoRef")
createBy:null,
tagDetails: {}
};
sheepOptions.value = [];
proxy.resetForm("transition_infoRef");
isAdd.value = true;
isEdit.value = false;
}
//
function loadRanchOptions() {
return listRanch()
.then((res) => {
if (res.rows && Array.isArray(res.rows)) {
const mapped = res.rows.map((ranch) => ({
id: Number(ranch.id),
ranchName: ranch.ranch || '未知牧场',
}));
ranchOptions.value = mapped;
} else {
}
})
.catch((error) => {
proxy.$modal.msgError('获取牧场数据失败');
});
}
//
function loadSheepOptions() {
getSheepBySheepfoldId().then(res => {
sheepOptions.value = res.data?.map(sheep => ({
id: sheep.id,
manageTags: sheep.manageTags
})) || [];
}).catch(error => {
console.error('加载耳号选项失败', error);
});
}
// ID
async function getRanchNameByRanchId(ranchId) {
if (!ranchId) return '';
try {
if (ranchOptions.value.length === 0) {
await loadRanchOptions();
}
const matchedRanch = ranchOptions.value.find(
(item) => item.id === Number(ranchId)
);
return matchedRanch ? matchedRanch.ranchName : '';
} catch (error) {
console.error('通过 ranchId 查询牧场名称失败:', error);
return '';
}
}
function handleRanchChange(ranchName) {
if (!ranchName) {
sheepOptions.value = [];
form.value.manageTags = [];
return;
}
const matchedRanch = ranchOptions.value.find(
(ranch) => ranch.ranchName === ranchName
);
if (!matchedRanch) {
proxy.$modal.msgError('未找到该牧场信息,请重新选择');
return;
}
const ranchIdNum = matchedRanch.id;
getSheepByRanchId(ranchIdNum)
.then((res) => {
if (res.code === 200) {
if (res.data && res.data.length > 0) {
sheepOptions.value = res.data.map((sheep) => ({
id: sheep.id,
manageTags: sheep.manageTags,
}));
} else {
sheepOptions.value = [];
proxy.$message.error('该牧场暂无羊只数据');
}
} else {
sheepOptions.value = [];
proxy.$modal.msgError('获取羊只数据失败,请重试');
}
})
.catch((error) => {
console.error('羊只列表加载失败:', error);
sheepOptions.value = [];
proxy.$modal.msgError('获取羊只信息失败,请重试');
});
}
async function loadSheepInfo() {
if (isEdit.value) {
return;
}
const tags = form.value.manageTags;
if (!tags || tags.length === 0) return;
const tagDetails = {};
const validResults = [];
for (const tag of tags) {
try {
const { data: sheepData } = await checkSheepByManageTags(tag.trim());
if (!sheepData) {
validResults.push(false);
proxy.$modal.msgError(`耳号 ${tag} 不存在`);
continue;
}
const ranchName = await getRanchNameByRanchId(sheepData.ranchId);
tagDetails[tag] = {
sheepId: sheepData.id,
varietyId: sheepData.varietyId,
varietyName: sheepData.varietyName || '',
ranchName: ranchName,
comment: sheepData.comment || ''
};
validResults.push(true);
if (!form.value.transFrom && tags.indexOf(tag) === 0) {
form.value.transFrom = ranchName;
}
} catch (error) {
console.error('获取耳号信息失败:', error);
validResults.push(false);
proxy.$modal.msgError(`耳号 ${tag} 验证失败`);
}
}
if (validResults.includes(false)) {
form.value.manageTags = tags.filter((_, index) => validResults[index]);
proxy.$message.warning('部分耳号不合法,已过滤');
}
form.value.tagDetails = tagDetails;
}
//
function handleExport() {
proxy.download(
'/produce/manage_sheep/transition_info/export',
{ ...queryParams.value },
`transition_info_${Date.now()}.xlsx`
);
}
//
function handleApprove(row) {
approveForm.value = { ...row };
approveDialog.value = true;
displayManageTags.value = Array.isArray(row.manageTags)
? row.manageTags.join(',')
: row.manageTags || '';
}
//
function handleApproveAgree() {
if (!approveForm.value.transTo) {
proxy.$modal.msgError('转入牧场不能为空');
return;
}
approveForm.value.status = 1;
approveTransitionInfo(approveForm.value).then(() => {
approveDialog.value = false;
proxy.$modal.msgSuccess('审批通过,已更新羊只所在牧场');
getList();
}).catch(error => {
proxy.$modal.msgError(`审批失败:${error.message}`);
});
}
//
function handleApproveReject() {
approveForm.value.status = 2;
updateTransition_info(approveForm.value).then(() => {
approveDialog.value = false;
proxy.$modal.msgSuccess('审批成功,状态已更新为驳回');
getList();
});
}
//
function getTransTypeLabel(value) {
const transTypeArray = trans_type.value;
if (!Array.isArray(transTypeArray)) {
return '未知类型';
}
const item = transTypeArray.find(item => item.value === value);
return item ? item.label : '未知类型';
}
//
function getStatusLabel(value) {
const statusArray = status.value;
if (!Array.isArray(statusArray)) {
return '未知状态';
}
const item = statusArray.find(item => item.value === value);
return item ? item.label : '未知状态';
}
//
function cancel() {
open.value = false
reset()
}
//
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
//
function resetQuery() {
daterangeCreateTime.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()
open.value = true
title.value = "添加转场"
reset();
open.value = true;
title.value = "添加转场";
isAdd.value = true;
isEdit.value = false;
sheepOptions.value = [];
form.value.manageTags = [];
}
function handleUpdate(row) {
reset()
const _id = row.id || ids.value
//
async function handleUpdate(row) {
reset();
const _id = row.id || ids.value;
getTransition_info(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改转场"
})
form.value = {
...response.data,
manageTags: [response.data.manageTags]
};
open.value = true;
title.value = "修改转场";
isAdd.value = false;
isEdit.value = true;
}).catch(error => {
console.error('获取转场详情失败:', error);
proxy.$modal.msgError('加载数据失败,请重试');
});
}
function submitForm() {
proxy.$refs["transition_infoRef"].validate(valid => {
if (!valid) return
const api = form.value.id ? updateTransition_info : addTransition_info
api(form.value).then(() => {
proxy.$modal.msgSuccess(form.value.id ? "修改成功" : "新增成功")
open.value = false
getList()
})
})
//
async function submitForm() {
proxy.$refs.transition_infoRef.validate(async (valid) => {
if (!valid) return;
const allTags = form.value.manageTags;
let validTags = [];
if (isAdd.value) {
if (!allTags || allTags.length === 0) {
proxy.$modal.msgError('请选择至少一个耳号');
return;
}
const tagDetails = form.value.tagDetails || {};
validTags = allTags.filter(tag => tagDetails[tag]);
if (validTags.length === 0) {
proxy.$modal.msgError('所有耳号均无效,请重新输入');
return;
}
} else {
validTags = allTags;
}
let submitData = {};
if (isAdd.value) {
submitData = validTags.map(tag => ({
sheepId: form.value.tagDetails[tag].sheepId,
varietyId: form.value.tagDetails[tag].varietyId,
varietyName: form.value.tagDetails[tag].varietyName,
manageTags: tag,
transTo: form.value.transTo,
transFrom: form.value.tagDetails[tag].ranchName,
transType: form.value.transType,
technician: form.value.technician,
comment: form.value.tagDetails[tag].comment,
status: 0,
}));
} else {
submitData = {
...form.value,
manageTags: validTags.join(','),
};
}
try {
if (isAdd.value) {
await addTransition_info(submitData);
} else {
await updateTransition_info(submitData);
}
proxy.$modal.msgSuccess(isAdd.value ? '提交成功' : '修改成功');
open.value = false;
getList();
} catch (error) {
proxy.$modal.msgError(isAdd.value ? '提交失败,请重试' : '修改失败,请重试');
}
});
}
//
function getVarietyOptions() {
request({
url: '/base/variety/list',
method: 'get',
params: { pageNum: 1, pageSize: 9999 },
}).then((res) => {
varietyOptions.value = res.rows || [];
});
}
//
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除转场编号为"' + _ids + '"的数据项?')
@ -311,6 +610,11 @@ function handleDelete(row) {
})
}
getList()
</script>
onMounted(() => {
loadRanchOptions();
getVarietyOptions();
loadSheepOptions();
getList();
});
</script>

View File

@ -2,8 +2,8 @@
<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 label="管理耳号" prop="manageTags">
<el-input v-model="queryParams.manageTags" placeholder="请输入管理耳号" clearable @keyup.enter="handleQuery" style="width: 150px;"/>
</el-form-item>
<el-form-item label="羊舍" prop="sheepfold">
@ -35,10 +35,11 @@
<el-button type="primary" plain icon="Plus" @click="handleAdd"
v-hasPermi="['produce:castrate:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<!-- 按需添加 是否需要修改功能 -->
<!-- <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['produce:castrate:edit']">修改</el-button>
</el-col>
</el-col> -->
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['produce:castrate:remove']">删除</el-button>
@ -53,11 +54,13 @@
<!-- 列表表格 -->
<el-table v-loading="loading" :data="castrateList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="羊只id" align="center" prop="sheepId" />
<!-- <el-table-column label="羊只id" align="center" prop="sheepId" /> -->
<el-table-column label="耳号" align="center" prop="manageTags" />
<el-table-column label="羊舍名称" align="center" prop="sheepfoldName" />
<el-table-column label="品种" align="center" prop="varietyName" />
<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" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
@ -65,8 +68,9 @@
</el-table-column>
<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="['produce:castrate:edit']">修改</el-button>
<!-- 按需添加 是否需要修改功能 -->
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['produce:castrate:edit']">修改</el-button> -->
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['produce:castrate:remove']">删除</el-button>
</template>
@ -79,25 +83,21 @@
<!-- 新增/修改弹窗 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="castrateRef" :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="sheepfold">
<el-select v-model="form.sheepfold" placeholder="请选择羊舍" clearable>
<el-option v-for="fold in sheepfoldOptions" :key="fold.id" :label="fold.sheepfoldName" :value="fold.id" />
<el-form-item label="管理耳号" prop="manageTags">
<el-select v-model="form.manageTags" placeholder="请输入或选择耳号" multiple filterable allow-create
style="width: 100%" @change="loadSheepInfo" @blur="loadSheepInfo">
<el-option v-for="sheep in sheepOptions" :key="sheep.id" :label="sheep.manageTags"
:value="sheep.manageTags" />
</el-select>
</el-form-item>
<el-form-item label="品种" prop="varietyId">
<el-select v-model="form.varietyId" placeholder="请选择品种" clearable>
<el-option v-for="item in varietyOptions" :key="item.id" :label="item.variety" :value="item.id" />
<el-form-item label="羊舍" prop="sheepfold">
<el-select v-model="form.sheepfold" placeholder="请选择羊舍" clearable @change="loadSheepBySheepfold">
<el-option v-for="fold in sheepfoldOptions" :key="fold.id" :label="fold.sheepfoldName" :value="fold.id" />
</el-select>
</el-form-item>
<el-form-item label="技术员" prop="technician">
<el-input v-model="form.technician" placeholder="请输入技术员" />
</el-form-item>
<el-form-item label="备注" prop="comment">
<el-input v-model="form.comment" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
@ -111,8 +111,8 @@
<script setup name="castrate">
import { listCastrate, getCastrate, delCastrate, addCastrate, updateCastrate } from '@/api/produce/other/castrate'
import { checkSheepByManageTags, getVarietyOptions, getSheepBySheepfoldId } from '@/api/produce/other/fixHoof'
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management'
import request from '@/utils/request'
const { proxy } = getCurrentInstance()
@ -126,75 +126,171 @@ const multiple = ref(true)
const total = ref(0)
const title = ref('')
const daterangeCreateTime = ref([])
const sheepOptions = ref([])
const varietyOptions = ref([])
const data = reactive({
form: {},
form: {
manageTags: [],
sheepfold: null,
technician: null,
tagDetails: {}
},
queryParams: {
pageNum: 1,
pageSize: 10,
sheepId: null,
manageTags: null,
// sheepId: null,
sheepfold: null,
varietyId: null,
technician: null,
createTime: null
},
rules: {
sheepId: [
{ required: true, message: '羊只id不能为空', trigger: 'blur' }
// sheepId: [
// { required: true, message: 'id', trigger: 'blur' }
// ],
manageTags: [
{ required: true, message: '请输入管理耳号', trigger: 'blur' }
],
sheepfold: [
{ required: true, message: '羊舍不能为空', trigger: 'change' }
],
varietyId: [
{ required: true, message: '品种不能为空', trigger: 'change' }
{ required: true, message: '请选择羊舍', trigger: 'change' }
],
technician: [
{ required: true, message: '技术员不能为空', trigger: 'blur' }
{ required: true, message: '请输入技术员', trigger: 'blur' }
]
}
})
const { queryParams, form, rules } = toRefs(data)
//
function loadSheepBySheepfold() {
const sheepfoldId = form.value.sheepfold;
if (!sheepfoldId) {
sheepOptions.value = [];
return;
}
getSheepBySheepfoldId(sheepfoldId)
.then(res => {
let sheepList = res.data || [];
sheepList = sheepList.filter(sheep => sheep.gender === 2);
if (sheepList.length === 0) {
proxy.$modal.msgInfo('该羊舍下暂无性别为公的羊只');
sheepOptions.value = [];
return;
}
sheepOptions.value = sheepList.map(sheep => ({
id: sheep.id,
manageTags: sheep.manageTags,
gender: sheep.gender
}));
})
.catch(error => {
console.error('加载羊舍耳号失败', error);
proxy.$modal.msgError('加载耳号失败,请重试');
sheepOptions.value = [];
});
}
// /
async function loadSheepInfo() {
const tags = form.value.manageTags;
if (!tags || tags.length === 0) return;
const tagDetails = {};
const validResults = [];
for (const tag of tags) {
try {
const { data: sheepData } = await checkSheepByManageTags(tag.trim());
if (!sheepData) {
validResults.push(false);
proxy.$modal.msgError(`耳号 ${tag} 不存在`);
} else if (sheepData.gender !== 2) {
validResults.push(false);
proxy.$modal.msgError(`耳号 ${tag} 对应的羊只性别不是公,无法添加`);
} else {
validResults.push(true);
tagDetails[tag] = {
sheepId: sheepData.id,
gender: sheepData.gender,
sheepfoldId: sheepData.sheepfoldId,
varietyId: sheepData.varietyId,
comment: sheepData.comment || ''
};
if (validResults.length === 1) {
form.value.sheepfold = sheepData.sheepfoldId;
}
}
} catch (error) {
console.error(`耳号 ${tag} 校验失败`, error);
validResults.push(false);
proxy.$modal.msgError(`耳号 ${tag} 校验异常,请重试`);
}
}
form.value.manageTags = tags.filter((_, index) => validResults[index]);
form.value.tagDetails = tagDetails;
if (validResults.includes(false)) {
proxy.$message.warning('部分耳号不符合条件(不存在或非公羊),已自动过滤');
}
}
/** 查询列表 */
function getList() {
loading.value = true
queryParams.value.params = {}
if (daterangeCreateTime.value && daterangeCreateTime.value.length === 2) {
queryParams.value.params.beginCreateTime = daterangeCreateTime.value[0]
queryParams.value.params.endCreateTime = daterangeCreateTime.value[1]
loading.value = true;
const q = { ...queryParams.value };
if (q.manageTags === '') q.manageTags = null;
q.params = {};
if (daterangeCreateTime.value?.length) {
q.params.beginCreateTime = daterangeCreateTime.value[0];
q.params.endCreateTime = daterangeCreateTime.value[1];
}
listCastrate(queryParams.value).then(res => {
castrateList.value = res.rows
total.value = res.total
loading.value = false
listCastrate(q).then(res => {
castrateList.value = res.rows;
total.value = res.total;
loading.value = false;
});
getVarietyOptions({ pageNum: 1, pageSize: 9999 }).then(res => {
varietyOptions.value = res.rows || []
})
}
//
function cancel() {
open.value = false
reset()
}
//
function reset() {
form.value = {
id: null,
sheepId: null,
manageTags: [],
sheepfold: null,
varietyId: null,
comment: null,
technician: null,
createBy: null,
createTime: null
}
proxy.resetForm('castrateRef')
};
sheepOptions.value = [];
proxy.resetForm('castrateRef');
}
//
function handleQuery() {
queryParams.value.pageNum = 1
getList()
queryParams.value.pageNum = 1;
getList();
}
//
function resetQuery() {
daterangeCreateTime.value = []
proxy.resetForm('queryRef')
@ -207,41 +303,105 @@ function handleSelectionChange(selection) {
multiple.value = !selection.length
}
//
function handleAdd() {
reset()
open.value = true
title.value = '添加去势'
}
//
function handleUpdate(row) {
reset()
const _id = row.id || ids.value
reset();
const _id = row.id || ids.value;
getCastrate(_id).then(res => {
form.value = res.data
open.value = true
title.value = '修改去势'
})
const data = res.data;
const manageTags = Array.isArray(data.manageTags)
? data.manageTags
: [data.manageTags || ''];
form.value = {
...data,
manageTags: manageTags.filter(tag => tag),
};
if (form.value.sheepfold) {
loadSheepBySheepfold();
}
validateAllTags();
open.value = true;
title.value = '修改去势';
});
}
//
async function validateAllTags() {
const tags = form.value.manageTags || [];
if (tags.length === 0) return;
for (const tag of tags) {
try {
const { data } = await checkSheepByManageTags(tag.trim());
if (!data) {
proxy.$modal.msgWarning(`耳号 ${tag} 不存在,已移除`);
form.value.manageTags = form.value.manageTags.filter(t => t !== tag);
}
} catch (error) {
console.error(`校验耳号 ${tag} 失败`, error);
form.value.manageTags = form.value.manageTags.filter(t => t !== tag);
}
}
}
//
function submitForm() {
proxy.$refs.castrateRef.validate(valid => {
if (!valid) return
if (form.value.id) {
updateCastrate(form.value).then(() => {
proxy.$modal.msgSuccess('修改成功')
open.value = false
getList()
})
} else {
addCastrate(form.value).then(() => {
proxy.$modal.msgSuccess('新增成功')
open.value = false
getList()
})
if (!valid) return;
const allTags = form.value.manageTags;
const tagDetails = form.value.tagDetails || {};
if (!allTags || allTags.length === 0) {
proxy.$modal.msgError('请选择有效的公羊耳号');
return;
}
})
const invalidTags = allTags.filter(tag => {
const details = tagDetails[tag];
return !details || details.gender !== 2;
});
if (invalidTags.length > 0) {
proxy.$modal.msgError(`耳号 ${invalidTags.join(',')} 性别不符合要求,无法提交`);
return;
}
const requests = allTags.map(tag => {
const details = tagDetails[tag];
return addCastrate({
manageTags: tag,
sheepId: details.sheepId,
sheepfold: details.sheepfoldId || form.value.sheepfold,
technician: form.value.technician,
varietyId: details.varietyId,
comment: details.comment
});
});
Promise.all(requests)
.then(() => {
proxy.$modal.msgSuccess('新增成功');
open.value = false;
getList();
})
.catch(error => {
proxy.$modal.msgError(`新增失败:${error.message}`);
});
});
}
//
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm(`是否确认删除去势编号为"${_ids}"的数据项?`).then(() => {
@ -252,10 +412,12 @@ function handleDelete(row) {
})
}
//
function handleExport() {
proxy.download('/produce/other/castrate/export', { ...queryParams.value }, `castrate_${new Date().getTime()}.xlsx`)
}
//
const sheepfoldOptions = ref([])
function getSheepfoldOptions() {
listSheepfold({ pageNum: 1, pageSize: 9999 }).then(res => {
@ -263,22 +425,9 @@ function getSheepfoldOptions() {
})
}
const varietyOptions = ref([])
function getVarietyOptions() {
request({
url: '/base/variety/list',
method: 'get',
params: { pageNum: 1, pageSize: 9999 }
}).then(res => {
varietyOptions.value = res.rows || []
console.log(varietyOptions.value);
})
}
onMounted(() => {
getList()
getSheepfoldOptions()
getVarietyOptions()
})
</script>

View File

@ -1,9 +1,9 @@
<template>
<div class="app-container">
<!-- 搜索 -->
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="管理耳号" prop="manageTags">
<el-input v-model="queryParams.manageTags" placeholder="请输入管理耳号" clearable @keyup.enter="handleQuery" />
<el-input v-model="queryParams.manageTags" placeholder="请输入管理耳号" clearable @keyup.enter="handleQuery"
style="width: 150px;" />
</el-form-item>
<el-form-item label="羊舍" prop="sheepfold">
@ -11,7 +11,6 @@
<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="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" />
@ -35,10 +34,11 @@
<el-button type="primary" plain icon="Plus" @click="handleAdd"
v-hasPermi="['fixHoof:fixHoof:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<!-- 按需添加 是否需要修改功能 -->
<!-- <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['fixHoof:fixHoof:edit']">修改</el-button>
</el-col>
</el-col> -->
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['fixHoof:fixHoof:remove']">删除</el-button>
@ -66,8 +66,9 @@
</el-table-column>
<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="['fixHoof:fixHoof:edit']">修改</el-button>
<!-- 按需添加 是否需要修改功能 -->
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['fixHoof:fixHoof:edit']">修改</el-button> -->
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['fixHoof:fixHoof:remove']">删除</el-button>
</template>
@ -81,21 +82,17 @@
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="fixHoofRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="耳号" prop="manageTags">
<el-input v-model="form.manageTags" placeholder="请输入耳号" @blur="validateSheep" />
<el-select v-model="form.manageTags" placeholder="请输入或选择耳号" multiple filterable allow-create
style="width: 100%" @change="loadSheepInfo">
<el-option v-for="sheep in sheepOptions" :key="sheep.id" :label="sheep.manageTags"
:value="sheep.manageTags" />
</el-select>
</el-form-item>
<el-form-item label="羊舍" prop="sheepfold">
<el-select v-model="form.sheepfold" placeholder="请选择羊舍" clearable>
<el-form-item label="羊舍" prop="sheepfolds">
<el-select v-model="form.sheepfold" filterable style="width: 100%" @change="loadSheepBySheepfold">
<el-option v-for="fold in sheepfoldOptions" :key="fold.id" :label="fold.sheepfoldName" :value="fold.id" />
</el-select>
</el-form-item>
<el-form-item label="品种" prop="varietyId">
<el-select v-model="form.varietyId" placeholder="请选择品种" 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="备注" prop="comment">
<el-input v-model="form.comment" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="技术员" prop="technician">
<el-input v-model="form.technician" placeholder="请输入技术员" />
</el-form-item>
@ -111,9 +108,8 @@
</template>
<script setup name="FixHoof">
import { listFixHoof, getFixHoof, delFixHoof, addFixHoof, updateFixHoof, checkSheepByManageTags, getVarietyOptions } from '@/api/produce/other/fixHoof'
import { listFixHoof, getFixHoof, delFixHoof, addFixHoof, updateFixHoof, checkSheepByManageTags, getVarietyOptions, getSheepBySheepfoldId } from '@/api/produce/other/fixHoof'
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management'
// import request from '@/utils/request'
const { proxy } = getCurrentInstance()
@ -128,9 +124,14 @@ const total = ref(0)
const title = ref('')
const daterangeCreateTime = ref([])
const varietyOptions = ref([])
const sheepOptions = ref([])
const data = reactive({
form: {},
form: {
sheepfold: null,
manageTags: [],
tagDetails: {},
},
queryParams: {
pageNum: 1,
pageSize: 10,
@ -141,32 +142,96 @@ const data = reactive({
createTime: null
},
rules: {
// sheepId: [
// { required: true, message: '', trigger: 'blur' }
// ],
manageTags: [
{ required: true, message: '耳号不能为空', trigger: 'blur' }
{ required: true, message: '请输入管理耳号', trigger: 'blur' }
],
sheepfold: [
{ required: true, message: '羊舍id不能为空', trigger: 'change' }
],
varietyId: [
{ required: true, message: '品种不能为空', trigger: 'change' }
{ required: true, message: '请选择羊舍', trigger: 'change' }
],
technician: [
{ required: true, message: '技术员不能为空', trigger: 'blur' }
{ required: true, message: '请输入技术员', trigger: 'blur' }
]
}
})
const { queryParams, form, rules } = toRefs(data)
/* 列表 */
//
function loadSheepBySheepfold() {
const currentSheepfoldId = form.value.sheepfold;
if (!currentSheepfoldId) {
sheepOptions.value = [];
return;
}
getSheepBySheepfoldId(currentSheepfoldId)
.then(res => {
const newSheepList = res.data || [];
sheepOptions.value = newSheepList.map(sheep => ({
id: sheep.id,
manageTags: sheep.manageTags,
sheepfoldId: currentSheepfoldId
}));
})
.catch(error => {
console.error('加载新羊舍耳号失败', error);
proxy.$modal.msgError('切换羊舍失败,请重试');
sheepOptions.value = [];
});
}
async function loadSheepInfo() {
const tags = form.value.manageTags;
if (!tags || tags.length === 0) return;
const tagDetails = {};
const validResults = [];
const validTags = [];
for (const tag of tags) {
try {
const { data: sheepData } = await checkSheepByManageTags(tag.trim());
if (!sheepData) {
validResults.push(false);
proxy.$modal.msgError(`耳号 ${tag} 不存在`);
} else {
validResults.push(true);
validTags.push(tag);
tagDetails[tag] = {
comment: sheepData.comment || '',
varietyId: sheepData.varietyId,
sheepfoldId: sheepData.sheepfoldId,
sheepId: sheepData.id
};
}
} catch (error) {
console.error('获取耳号信息失败:', error);
proxy.$modal.msgError(`耳号 ${tag} 验证失败`);
validResults.push(false);
}
}
if (validResults.includes(false)) {
form.value.manageTags = tags.filter((_, index) => validResults[index]);
proxy.$message.warning('部分耳号不合法,已过滤');
}
form.value.tagDetails = tagDetails;
if (validTags.length > 0) {
const firstValidTag = validTags[0]; 耳号
const firstSheepfoldId = tagDetails[firstValidTag].sheepfoldId;
form.value.sheepfold = firstSheepfoldId;
}
}
//
function getList() {
loading.value = true
const q = { ...queryParams.value }
if (q.sheepId === '') q.sheepId = null
if (q.sheepfold === '') q.sheepfold = null
if (q.varietyId === '') q.varietyId = null
q.params = {}
if (daterangeCreateTime.value?.length) {
q.params.beginCreateTime = daterangeCreateTime.value[0]
@ -177,37 +242,40 @@ function getList() {
total.value = res.total
loading.value = false
})
getVarietyOptions({ pageNum: 1, pageSize: 9999 }).then(res => {
getVarietyOptions({ pageNum: 1, pageSize: 9999 }).then(res => {
varietyOptions.value = res.rows || []
})
}
//
function cancel() {
open.value = false
reset()
}
//
function reset() {
form.value = {
id: null,
sheepId: null,
sheepfold: null,
manageTags: [],
varietyId: null,
comment: null,
technician: null,
createBy: null,
createTime: null
varietyName: null
}
sheepOptions.value = [];
proxy.resetForm('fixHoofRef')
}
//
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
//
function resetQuery() {
daterangeCreateTime.value = []
queryParams.value.varietyId = null
proxy.resetForm('queryRef')
handleQuery()
}
@ -218,41 +286,63 @@ function handleSelectionChange(selection) {
multiple.value = !selection.length
}
//
function handleAdd() {
reset()
open.value = true
title.value = '添加修蹄'
}
//
function handleUpdate(row) {
reset()
const _id = row.id || ids.value
getFixHoof(_id).then(res => {
form.value = res.data
const fixHoofData = res.data;
fixHoofData.manageTags = fixHoofData.manageTags ? [fixHoofData.manageTags] : [];
form.value = fixHoofData;
open.value = true
title.value = '修改修蹄'
})
}
//
function submitForm() {
proxy.$refs.fixHoofRef.validate(valid => {
if (!valid) return
if (form.value.id) {
updateFixHoof(form.value).then(() => {
proxy.$modal.msgSuccess('修改成功')
open.value = false
getList()
})
} else {
addFixHoof(form.value).then(() => {
proxy.$modal.msgSuccess('新增成功')
open.value = false
getList()
})
if (!valid) return;
const allTags = form.value.manageTags;
const tagDetails = form.value.tagDetails || {};
if (!allTags || allTags.length === 0) {
proxy.$modal.msgError('请选择至少一个耳号');
return;
}
})
const fixHoofList = allTags.map(tag => {
const details = tagDetails[tag] || {};
return {
...form.value,
manageTags: tag,
comment: details.comment || '',
sheepId: details.sheepId,
varietyId: details.varietyId,
sheepfold: details.sheepfoldId || form.value.sheepfold
};
});
addFixHoof(fixHoofList)
.then(() => {
proxy.$modal.msgSuccess('操作成功');
open.value = false;
getList();
})
.catch(error => {
proxy.$modal.msgError(`处理失败:${error.message}`);
});
});
}
//
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm(`是否确认删除修蹄编号为"${_ids}"的数据项?`).then(() => {
@ -263,11 +353,12 @@ function handleDelete(row) {
})
}
//
function handleExport() {
proxy.download('/produce/other/fixHoof/export', { ...queryParams.value }, `fixHoof_${new Date().getTime()}.xlsx`)
}
/* 羊舍 */
//
const sheepfoldOptions = ref([])
function getSheepfoldOptions() {
listSheepfold({ pageNum: 1, pageSize: 9999 }).then(res => {
@ -275,34 +366,9 @@ function getSheepfoldOptions() {
})
}
//
async function validateSheep() {
if (!form.value.manageTags) return;
try {
const { data } = await checkSheepByManageTags(form.value.manageTags.trim())
if (!data) {
proxy.$modal.msgError('该管理耳号不存在');
//
form.value.manageTags = null;
form.value.sheepId = null;
form.value.sheepfold = null;
form.value.varietyId = null;
} else {
//
form.value.sheepId = data.id;
//
form.value.sheepfold = data.sheepfoldId;
form.value.varietyId = data.varietyId;
}
} catch {
proxy.$modal.msgError('校验失败');
}
}
/* 只保留一个 onMounted */
getList()
onMounted(() => {
getSheepfoldOptions()
getVarietyOptions()
getList()
})
</script>