This commit is contained in:
wyt 2025-07-18 13:01:33 +08:00
commit 5d89202b7b
14 changed files with 1660 additions and 511 deletions

View File

@ -38,7 +38,7 @@ export function updateDisease(data) {
// 删除疾病 // 删除疾病
export function delDisease(id) { export function delDisease(id) {
return request({ return request({
url: '/disease/disease/' + id, url: '/biosafety/disease/' + id,
method: 'delete' method: 'delete'
}) })
} }

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询酸奶生产,成品检疫记录列表
export function listYogurtTest(query) {
return request({
url: '/yogurtTest/yogurtTest/list',
method: 'get',
params: query
})
}
// 查询酸奶生产,成品检疫记录详细
export function getYogurtTest(id) {
return request({
url: '/yogurtTest/yogurtTest/' + id,
method: 'get'
})
}
// 新增酸奶生产,成品检疫记录
export function addYogurtTest(data) {
return request({
url: '/yogurtTest/yogurtTest',
method: 'post',
data: data
})
}
// 修改酸奶生产,成品检疫记录
export function updateYogurtTest(data) {
return request({
url: '/yogurtTest/yogurtTest',
method: 'put',
data: data
})
}
// 删除酸奶生产,成品检疫记录
export function delYogurtTest(id) {
return request({
url: '/yogurtTest/yogurtTest/' + id,
method: 'delete'
})
}

View File

@ -48,3 +48,23 @@ export function exportFixHoof(query) {
responseType: 'blob' // 导出功能需要设置响应类型为blob responseType: 'blob' // 导出功能需要设置响应类型为blob
}) })
} }
// 按管理耳号查羊只
export function checkSheepByManageTags(manageTags) {
return request({
url: '/sheep/sheep/byManageTags/' + encodeURIComponent(manageTags),
method: 'get'
})
}
//获取品种
export function getVarietyOptions(query){
return request({
url:'/base/variety/list',
method:'get',
params:query
})
}

View File

@ -1,151 +0,0 @@
<!-- QuarantineFormDialog.vue -->
<template>
<el-dialog :title="title" v-model="visible" width="500px" append-to-body @close="reset">
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="羊只耳号" prop="sheepNo">
<el-input v-model="form.sheepNo" placeholder="请输入耳号" @blur="fetchSheepInfo" />
</el-form-item>
<el-form-item label="羊只性别">
<el-input v-model="form.gender" readonly />
</el-form-item>
<el-form-item label="羊只类别">
<el-input v-model="form.sheepType" readonly />
</el-form-item>
<el-form-item label="月龄">
<el-input v-model="form.monthAge" readonly />
</el-form-item>
<el-form-item label="繁育状态">
<el-input v-model="form.breed" readonly />
</el-form-item>
<el-form-item label="检疫日期" prop="datetime">
<el-date-picker v-model="form.datetime" type="date" value-format="YYYY-MM-DD" placeholder="请选择日期" />
</el-form-item>
<el-form-item label="检疫结果" prop="result">
<el-select v-model="form.result" placeholder="请选择">
<el-option v-for="dict in quar_result" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in quar_status" :key="dict.value" :label="parseInt(dict.value)">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</template>
</el-dialog>
</template>
<script setup name="QuarantineFormDialog">
import { ref, reactive, nextTick } from 'vue'
import { getQuarantine, addQuarantine, updateQuarantine } from '@/api/biosafety/quarantine'
const { proxy } = getCurrentInstance()
const { pres_status, pres_type } = proxy.useDict('pres_status', 'pres_type')
const emit = defineEmits(['success'])
const visible = ref(false)
const title = ref('')
const formRef = ref()
const form = reactive({
id: null,
sheepId: null,
sheepNo: '',
gender: '',
sheepType: '',
monthAge: '',
breed: '',
datetime: '',
result: null,
status: null
})
const rules = {
sheepNo: [{ required: true, message: '请输入耳号', trigger: 'blur' }],
datetime: [{ required: true, message: '请选择日期', trigger: 'change' }],
result: [{ required: true, message: '请选择结果', trigger: 'change' }],
status: [{ required: true, message: '请选择状态', trigger: 'change' }]
}
function open(row = null) {
reset()
if (row && row.id) {
title.value = '修改检疫记录'
getQuarantine(row.id).then(res => {
Object.assign(form, res.data)
visible.value = true
})
} else {
title.value = '新增检疫记录'
visible.value = true
}
}
function fetchSheepInfo() {
if (!form.sheepNo) return
getSheepByEarNo(form.sheepNo).then(res => {
if (res.data) {
Object.assign(form, {
sheepId: res.data.id,
gender: res.data.gender,
sheepType: res.data.sheepType,
monthAge: res.data.monthAge,
breed: res.data.breed
})
} else {
proxy.$modal.msgError('未找到该耳号对应的羊只')
}
})
}
function submit() {
formRef.value.validate(valid => {
if (!valid) return
const api = form.id ? updateQuarantine : addQuarantine
api(form).then(() => {
proxy.$modal.msgSuccess(form.id ? '修改成功' : '新增成功')
visible.value = false
emit('success')
})
})
}
function reset() {
Object.assign(form, {
id: null,
sheepId: null,
sheepNo: '',
gender: '',
sheepType: '',
monthAge: '',
breed: '',
datetime: '',
result: null,
status: null
})
nextTick(() => formRef.value?.clearValidate())
}
function cancel() {
visible.value = false
}
defineExpose({ open })
</script>

View File

@ -1,13 +1,12 @@
<!-- QuarantineList.vue -->
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="羊只" prop="sheepId"> <el-form-item label="羊只" prop="sheepId">
<el-input v-model="queryParams.sheepId" placeholder="请输入耳号" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.sheepId" placeholder="请输入羊只" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="检疫日期" style="width: 308px"> <el-form-item label="检疫日期" style="width: 308px">
<el-date-picker v-model="daterangeDatetime" value-format="YYYY-MM-DD" type="daterange" range-separator="-" <el-date-picker v-model="daterangeDatetime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" /> start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@ -17,8 +16,22 @@
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="openDialog()">新增</el-button> <el-button type="primary" plain icon="Plus" @click="handleAdd"
v-hasPermi="['bisosafety:quarantine:add']">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['bisosafety:quarantine:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['bisosafety:quarantine:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['bisosafety:quarantine:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
<el-table v-loading="loading" :data="quarantineList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="quarantineList" @selection-change="handleSelectionChange">
@ -30,6 +43,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="羊只性别" align="center" prop="gender" /> <el-table-column label="羊只性别" align="center" prop="gender" />
<el-table-column label="羊只类别" align="center" prop="sheepType" /> <el-table-column label="羊只类别" align="center" prop="sheepType" />
<el-table-column label="月龄" align="center" prop="monthAge" /> <el-table-column label="月龄" align="center" prop="monthAge" />
<el-table-column label="繁育状态" align="center" prop="breed" /> <el-table-column label="繁育状态" align="center" prop="breed" />
@ -47,69 +61,226 @@
<dict-tag :options="quar_status" :value="scope.row.status" /> <dict-tag :options="quar_status" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" width="200"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200px">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" @click="openDialog(scope.row)">检疫</el-button> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['bisosafety:quarantine:edit']">检疫</el-button>
<el-button link type="success" @click="gotoTreatment(scope.row)" v-if="scope.row.result == 1">治疗</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['bisosafety:quarantine:remove']">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
v-model:limit="queryParams.pageSize" @pagination="getList" /> @pagination="getList" />
<!-- 弹窗组件 --> <!-- 添加或修改检疫记录对话框 -->
<add ref="dialogRef" @success="getList" /> <el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="quarantineRef" :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="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-select v-model="form.result" placeholder="请选择检疫结果">
<el-option v-for="dict in quar_result" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)"></el-option>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in quar_status" :key="dict.value"
:label="parseInt(dict.value)">{{ dict.label }}</el-radio>
</el-radio-group>
</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> </div>
</template> </template>
<script setup name="QuarantineList"> <script setup name="Quarantine">
import { listQuarantine } from '@/api/biosafety/quarantine' import { listQuarantine, getQuarantine, delQuarantine, addQuarantine, updateQuarantine } from "@/api/biosafety/quarantine"
import add from './add.vue' import { listItems } from "@/api/biosafety/items"
import { listSample } from "@/api/biosafety/sample"
import { useRoute, useRouter } from "vue-router"
const route = useRoute()
const router = useRouter()
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const { quar_result, quar_status } = proxy.useDict('quar_result', 'quar_status') const { quar_result, quar_status } = proxy.useDict('quar_result', 'quar_status')
const dialogRef = ref()
const quarantineList = ref([]) const quarantineList = ref([])
const open = ref(false)
const loading = ref(true) const loading = ref(true)
const showSearch = ref(true) const showSearch = ref(true)
const ids = ref([])
const single = ref(true)
const multiple = ref(true)
const total = ref(0) const total = ref(0)
const title = ref("")
const daterangeDatetime = ref([]) const daterangeDatetime = ref([])
const queryParams = reactive({ const data = reactive({
pageNum: 1, form: {},
pageSize: 10, queryParams: {
sheepId: null, pageNum: 1,
params: {} pageSize: 10,
sheepId: null,
datetime: null,
quarItem: null,
sampleType: null,
sampler: null,
quarOfficer: null,
result: null,
status: null,
},
rules: {
sheepId: [
{ required: true, message: "羊只不能为空", trigger: "blur" }
],
quarItem: [
{ required: true, message: "检疫项目不能为空", trigger: "change" }
],
sampleType: [
{ required: true, message: "样品类型不能为空", trigger: "change" }
],
}
}) })
const { queryParams, form, rules } = toRefs(data)
/** 查询检疫记录列表 */
function getList() { function getList() {
loading.value = true loading.value = true
queryParams.params = {} queryParams.value.params = {}
if (daterangeDatetime.value && daterangeDatetime.value.length === 2) { if (null != daterangeDatetime && '' != daterangeDatetime) {
queryParams.params.beginDatetime = daterangeDatetime.value[0] queryParams.value.params["beginDatetime"] = daterangeDatetime.value[0]
queryParams.params.endDatetime = daterangeDatetime.value[1] queryParams.value.params["endDatetime"] = daterangeDatetime.value[1]
} }
listQuarantine(queryParams).then(res => { listQuarantine(queryParams.value).then(response => {
quarantineList.value = res.rows quarantineList.value = response.rows
total.value = res.total total.value = response.total
loading.value = false loading.value = false
}) })
} }
function openDialog(row = null) { //
dialogRef.value.open(row) function cancel() {
open.value = false
reset()
} }
//
function reset() {
form.value = {
id: null,
sheepId: null,
datetime: null,
quarItem: null,
sampleType: null,
sampler: null,
quarOfficer: null,
result: null,
status: null,
updateBy: null,
updateTime: null,
createBy: null,
createTime: null
}
proxy.resetForm("quarantineRef")
}
/** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
queryParams.pageNum = 1 queryParams.value.pageNum = 1
getList() getList()
} }
/** 重置按钮操作 */
function resetQuery() { function resetQuery() {
proxy.resetForm('queryRef')
daterangeDatetime.value = [] daterangeDatetime.value = []
proxy.resetForm("queryRef")
handleQuery() 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
getQuarantine(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改检疫记录"
})
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["quarantineRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateQuarantine(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
} else {
addQuarantine(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 delQuarantine(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => { })
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('bisosafety/quarantine/export', {
...queryParams.value
}, `quarantine_${new Date().getTime()}.xlsx`)
}
function gotoTreatment(row) {
router.push({ path: '/biosafety/treatment/add', query: { qId: row.id,sId:row.sheepId } })
}
getList() getList()
</script> </script>

View File

@ -0,0 +1,567 @@
<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="8">
<div class="info-item">
<strong>耳号</strong>{{ sheepInfo.sheepNo || '' }}
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<strong>性别</strong>{{ sheepInfo.gender || '' }}
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<strong>品种</strong>{{ sheepInfo.variety || '' }}
</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<div class="info-item">
<strong>羊只类别</strong>{{ sheepInfo.name || '' }}
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<strong>月龄</strong>{{ sheepInfo.monthAge ?? '' }} &nbsp;
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<strong>胎次</strong>{{ sheepInfo.parity ?? '' }}
</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<div class="info-item">
<strong>繁殖状态</strong>{{ sheepInfo.breed || '' }}
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<strong>怀孕天数</strong>{{ sheepInfo.gestationDay ?? '' }} &nbsp;
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<strong>泌乳天数</strong>{{ sheepInfo.lactationDay ?? '' }} &nbsp;
</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="eventDate">
<el-date-picker v-model="form.eventDate" type="date" placeholder="选择日期" style="width:100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="处方" prop="prescription">
<el-select v-model="selectedPresId" placeholder="请选择处方" style="width:100%" filterable clearable
@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="form.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 :disabled="!form.diseasePid" v-model="form.diseaseId" 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="medication-actions mb20">
<el-button type="primary" icon="Plus" @click="handleAddSwPresDetail">
添加药品
</el-button>
</div>
<div style="margin-bottom:30px;">
<el-table :data="swPresDetailList" border stripe style="width:100%;">
<el-table-column label="序号" align="center" width="80">
<template #default="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column label="药品" prop="mediId">
<template #default="scope">
<el-select v-model="scope.row.mediId" filterable placeholder="请选择药品" style="width:100%">
<el-option v-for="item in medicines" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="用量" prop="dosage">
<template #default="scope">
<el-input-number v-model="scope.row.dosage" :min="0" :precision="1" placeholder="请输入用量"
controls-position="right" style="width:100%" />
</template>
</el-table-column>
<el-table-column label="单位" prop="unit">
<template #default="scope">
<el-select v-model="scope.row.unitId" placeholder="请选择单位">
<el-option v-for="item in units" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="使用方法" prop="usageId">
<template #default="scope">
<el-select v-model="scope.row.usageId" placeholder="请选择使用方法" style="width:100%">
<el-option v-for="item in usages" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="生产厂家" prop="manufacturer">
<template #default="scope">
<el-input v-model="scope.row.manufacturer" placeholder="请输入生产厂家" style="width:100%" />
</template>
</el-table-column>
<el-table-column label="生产批号" prop="batchNumber">
<template #default="scope">
<el-input v-model="scope.row.batchNumber" placeholder="生产批号" style="width:100%" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100">
<template #default="scope">
<el-button link type="danger" icon="Delete" @click="deletePresDetail(scope.row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="兽医">
<el-input v-model="form.veterinarian" placeholder="请输入兽医姓名" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注">
<el-input type="textarea" :rows="3" v-model="form.comment" 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 } from 'vue'
import useTagsViewStore from "@/store/modules/tagsView.js"
import request from '@/utils/request';
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 { addTreatment } from '@/api/biosafety/treatment' // API
import { ElMessage } from 'element-plus'
import { useRoute, useRouter } from 'vue-router'
const { proxy } = getCurrentInstance()
const route = useRoute()
const router = useRouter()
const { qId, sId } = route.query;
const sheepInfo = ref({
sheepNo: null,
gender: '',
variety: '',
name: '',
monthAge: null,
parity: null,
breed: '',
lactationDay: null,
gestationDay: null
})
const units = ref([]) //
const usages = ref([]) // 使
const medicines = ref([]) //
function getMedicines() {
listMedicine().then(response => {
medicines.value = response.rows.map(item => ({
value: item.id,
label: item.name
}))
})
}
function getUnit() {
listUnit().then(response => {
units.value = response.rows.map(item => ({
value: item.id,
label: item.name
}))
})
}
function getUsageOptions() {
listUsage().then(response => {
usages.value = response.rows.map(item => ({
value: item.id,
label: item.name
}))
})
}
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,
name: data.name,
monthAge: data.monthAge,
parity: data.parity,
breed: data.breed,
lactationDay: data.lactationDay,
gestationDay: data.gestationDay,
}
})
}
const selectedPresId = ref(null)
const presOptions = ref([])
function getPrescriptions() {
const queryParams = {
status: 1, //
persType: 4 //
}
listPrescription(queryParams).then(response => {
presOptions.value = response.rows.map(item => ({
id: item.id,
label: item.name
}))
})
}
function handleSelectPrescription(id) {
if (!id) return
getPrescription(id).then(response => {
const data = response.data
swPresDetailList.value = data.swPresDetailList.map(item => ({
mediId: item.mediId,
dosage: item.dosage,
unitId: item.unitId,
usageId: item.usageId,
}))
})
}
/* 疾病相关 */
const parentDiseaseOptions = ref([]) //
const childDiseaseOptions = ref([]) //
function getDiseases() {
listDisease().then(response => {
const diseases = proxy.handleTree(response.data, "id", "pid")
// pid0
parentDiseaseOptions.value = diseases.filter(item => item.pid === 0)
})
}
function handleDiseaseTypeChange(parentId) {
if (!parentId) {
childDiseaseOptions.value = []
form.diseaseSubtype = null
return
}
//
listDisease({ pid: parentId }).then(response => {
childDiseaseOptions.value = response.data
form.diseaseSubtype = null
})
}
const form = reactive({
eventType: '诊疗',
eventDate: new Date(), //
diseaseParentId: null, //
diseaseSubtype: null, //
veterinarian: '',
comment: '',
sheepId: sId // ID
})
const rules = {
diseasePid: { required: true, message: '疾病大类不能为空', trigger: 'change' },
diseaseId: { required: true, message: '疾病子类型不能为空', trigger: 'change' }
}
const swPresDetailList = ref([
{ mediId: null, dosage: 0, unitId: null, usageId: null, manufacturer: '', batchNumber: '' }
])
const handleAddSwPresDetail = () => {
swPresDetailList.value.push({ mediId: null, dosage: 0, unitId: null, usageId: null, manufacturer: '', batchNumber: '' })
}
const deletePresDetail = (row) => {
const index = swPresDetailList.value.indexOf(row)
if (index !== -1) swPresDetailList.value.splice(index, 1)
}
function submitForm() {
//
if (!form.diseasePid || !form.diseaseId) {
ElMessage.error("请完整填写疾病信息!");
return;
}
if (swPresDetailList.value.length === 0 || swPresDetailList.value.some(item => !item.mediId)) {
ElMessage.error("请至少添加一个药品!");
return;
}
//
const submitData = {
...sheepInfo.value,
...form,
eventDate: form.eventDate ? new Date(form.eventDate).getTime() : null,
usageDetails: swPresDetailList.value.map(item => ({
mediId: item.mediId,
dosage: item.dosage,
unit: item.unitId,
usageId: item.usageId,
manufacturer: item.manufacturer,
batchNumber: item.batchNumber
}))
};
//
addTreatment(submitData).then(response => {
if (response.code === 200) {
ElMessage.success(response.message || "治疗记录添加成功!");
goBack();
} else {
ElMessage.error(response.message || "添加治疗记录失败!");
}
}).catch(error => {
ElMessage.error("请求失败:" + (error.message || "未知错误"));
console.error("提交表单时出错:", error);
});
}
//
const useTagsStore = useTagsViewStore()
const currentTag = router.currentRoute.value;
const goBack = () => {
router.go(-1);
useTagsStore.delVisitedView(currentTag);
};
//
getUnit() //
getUsageOptions() // 使
getMedicines() //
getSheepInfo() //
getPrescriptions() //
getDiseases() //
</script>
<style scoped>
/* ===== 全屏极简样式 ===== */
html,
body,
#app {
height: 100%;
margin: 0;
padding: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
}
.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 {
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;
}
/* 表格样式 */
.el-table {
border-radius: 8px;
overflow: hidden;
margin-top: 16px;
}
/* 分隔线样式 */
.el-divider {
margin: 32px 0 24px;
}
.el-divider__text {
background: transparent;
color: #606266;
font-size: 16px;
font-weight: 500;
}
/* 药品添加按钮 */
.medication-actions {
display: flex;
justify-content: flex-start;
margin-bottom: 16px;
}
/* 响应式设计 */
@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,15 +0,0 @@
<template>
<div>
hanld
</div>
</template>
<script>
export default {
}
</script>
<style>
</style>

View File

@ -170,7 +170,7 @@
</template> </template>
<script setup name="Treatment"> <script setup name="Treatment">
import { listTreatment, getTreatment, delTreatment, addTreatment, updateTreatment } from "@/api/treatment/treatment" import { listTreatment, getTreatment, delTreatment, addTreatment, updateTreatment } from "@/api/biosafety/treatment"
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()

View File

@ -0,0 +1,575 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
<el-form-item label="来源" prop="source">
<el-input
v-model="queryParams.source"
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="请选择检测日期">
</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="['yogurtTest:yogurtTest:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['yogurtTest:yogurtTest:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['yogurtTest:yogurtTest:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['yogurtTest:yogurtTest:export']"
>导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="Operation"
@click="columnShowDialogVisible = true"
>列显示</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="yogurtTestList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column
label="来源"
align="center"
prop="source"
v-if="selectedColumns.includes('source')" />
<el-table-column
label="检测日期"
align="center"
prop="datetime"
width="180"
v-if="selectedColumns.includes('datetime')">
<template #default="scope">
<span>{{ formatDate(scope.row.datetime) }}</span>
</template>
</el-table-column>
<el-table-column
label="脂肪g/100g"
align="center"
prop="fat"
v-if="selectedColumns.includes('fat')" />
<el-table-column
label="蛋白质g/100g"
align="center"
prop="protein"
v-if="selectedColumns.includes('protein')" />
<el-table-column
label="非脂g/100g"
align="center"
prop="nonFat"
v-if="selectedColumns.includes('nonFat')" />
<el-table-column
label="酸度oT"
align="center"
prop="acidity"
v-if="selectedColumns.includes('acidity')" />
<el-table-column
label="菌落总数1"
align="center"
prop="bacterialColony1"
v-if="selectedColumns.includes('bacterialColony1')" />
<el-table-column
label="菌落总数2"
align="center"
prop="bacterialClony2"
v-if="selectedColumns.includes('bacterialClony2')" />
<el-table-column
label="菌落总数3"
align="center"
prop="bacterialClony3"
v-if="selectedColumns.includes('bacterialClony3')" />
<el-table-column
label="菌落总数4"
align="center"
prop="bacterialClony4"
v-if="selectedColumns.includes('bacterialClony4')" />
<el-table-column
label="菌落总数5"
align="center"
prop="bacterialClony5"
v-if="selectedColumns.includes('bacterialClony5')" />
<el-table-column
label="酵母菌(CFU/g)"
align="center"
prop="yeast"
v-if="selectedColumns.includes('yeast')" />
<el-table-column
label="霉菌(CFU/g)"
align="center"
prop="mould"
v-if="selectedColumns.includes('mould')" />
<el-table-column
label="乳酸菌(CFU/g)"
align="center"
prop="lacto"
v-if="selectedColumns.includes('lacto')" />
<el-table-column
label="备注"
align="center"
prop="comment"
v-if="selectedColumns.includes('comment')" />
<el-table-column
label="创建人"
align="center"
prop="createBy"
v-if="selectedColumns.includes('createBy')" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
width="180"
v-if="selectedColumns.includes('createTime')">
<template #default="scope">
<span>{{ formatDateTime(scope.row.createTime) }}</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="['yogurtTest:yogurtTest:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['yogurtTest:yogurtTest: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="yogurtTestRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="来源" prop="source">
<el-input v-model="form.source" 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="请选择检测日期"
style="width: 100%">
</el-date-picker>
</el-form-item>
<el-form-item label="脂肪g/100g" prop="fat">
<el-input v-model="form.fat" placeholder="请输入脂肪g/100g" />
</el-form-item>
<el-form-item label="蛋白质g/100g" prop="protein">
<el-input v-model="form.protein" placeholder="请输入蛋白质g/100g" />
</el-form-item>
<el-form-item label="非脂g/100g" prop="nonFat">
<el-input v-model="form.nonFat" placeholder="请输入非脂g/100g" />
</el-form-item>
<el-form-item label="酸度oT" prop="acidity">
<el-input v-model="form.acidity" placeholder="请输入酸度oT" />
</el-form-item>
<el-form-item label="菌落总数1" prop="bacterialColony1">
<el-input v-model="form.bacterialColony1" placeholder="请输入菌落总数1" />
</el-form-item>
<el-form-item label="菌落总数2" prop="bacterialClony2">
<el-input v-model="form.bacterialClony2" placeholder="请输入菌落总数2" />
</el-form-item>
<el-form-item label="菌落总数3" prop="bacterialClony3">
<el-input v-model="form.bacterialClony3" placeholder="请输入菌落总数3" />
</el-form-item>
<el-form-item label="菌落总数4" prop="bacterialClony4">
<el-input v-model="form.bacterialClony4" placeholder="请输入菌落总数4" />
</el-form-item>
<el-form-item label="菌落总数5" prop="bacterialClony5">
<el-input v-model="form.bacterialClony5" placeholder="请输入菌落总数5" />
</el-form-item>
<el-form-item label="酵母菌(CFU/g)" prop="yeast">
<el-input v-model="form.yeast" placeholder="请输入酵母菌(CFU/g)" />
</el-form-item>
<el-form-item label="霉菌(CFU/g)" prop="mould">
<el-input v-model="form.mould" placeholder="请输入霉菌(CFU/g)" />
</el-form-item>
<el-form-item label="乳酸菌(CFU/g)" prop="lacto">
<el-input v-model="form.lacto" placeholder="请输入乳酸菌(CFU/g)" />
</el-form-item>
<el-form-item label="备注" prop="comment">
<el-input v-model="form.comment" placeholder="请输入备注" type="textarea" />
</el-form-item>
<el-form-item label="创建人" v-if="form.id">
<el-input v-model="form.createBy" disabled />
</el-form-item>
<el-form-item label="创建时间" v-if="form.id">
<el-input v-model="form.createTime" disabled />
</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>
<el-dialog title="列显示设置" v-model="columnShowDialogVisible" width="500px">
<el-checkbox-group v-model="selectedColumns">
<el-checkbox label="source">来源</el-checkbox>
<el-checkbox label="datetime">检测日期</el-checkbox>
<el-checkbox label="fat">脂肪g/100g</el-checkbox>
<el-checkbox label="protein">蛋白质g/100g</el-checkbox>
<el-checkbox label="nonFat">非脂g/100g</el-checkbox>
<el-checkbox label="acidity">酸度oT</el-checkbox>
<el-checkbox label="bacterialColony1">菌落总数1</el-checkbox>
<el-checkbox label="bacterialClony2">菌落总数2</el-checkbox>
<el-checkbox label="bacterialClony3">菌落总数3</el-checkbox>
<el-checkbox label="bacterialClony4">菌落总数4</el-checkbox>
<el-checkbox label="bacterialClony5">菌落总数5</el-checkbox>
<el-checkbox label="yeast">酵母菌(CFU/g)</el-checkbox>
<el-checkbox label="mould">霉菌(CFU/g)</el-checkbox>
<el-checkbox label="lacto">乳酸菌(CFU/g)</el-checkbox>
<el-checkbox label="comment">备注</el-checkbox>
<el-checkbox label="createBy">创建人</el-checkbox>
<el-checkbox label="createTime">创建时间</el-checkbox>
</el-checkbox-group>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="columnShowDialogVisible = false"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue';
import { listYogurtTest, getYogurtTest, delYogurtTest, addYogurtTest, updateYogurtTest } from "@/api/dairyProducts/yogurtTest/yogurtTest.js";
import { ElMessage, ElMessageBox } from 'element-plus';
//
const yogurtTestList = 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 columnShowDialogVisible = ref(false);
const yogurtTestRef = ref(null);
//
const selectedColumns = ref([
'source', 'datetime', 'fat', 'protein', 'nonFat', 'acidity',
'bacterialColony1', 'bacterialClony2', 'bacterialClony3',
'bacterialClony4', 'bacterialClony5', 'yeast', 'mould',
'lacto', 'comment', 'createBy', 'createTime'
]);
//
const queryParams = reactive({
pageNum: 1,
pageSize: 10,
source: null,
datetime: null,
});
//
const form = reactive({
id: null,
source: null,
datetime: null,
fat: null,
protein: null,
nonFat: null,
acidity: null,
bacterialColony1: null,
bacterialClony2: null,
bacterialClony3: null,
bacterialClony4: null,
bacterialClony5: null,
yeast: null,
mould: null,
lacto: null,
comment: null,
createBy: null,
createTime: null
});
//
const rules = reactive({
source: [
{ required: true, message: "来源不能为空", trigger: "blur" }
],
datetime: [
{ required: true, message: "检测日期不能为空", trigger: "blur" }
]
});
/** 获取当前用户名 */
const getCurrentUsername = () => {
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
return userInfo.userName || userInfo.username || userInfo.nickName || 'admin'
}
/** 查询列表 */
function getList() {
loading.value = true;
listYogurtTest(queryParams).then(response => {
yogurtTestList.value = response.rows || [];
total.value = response.total || 0;
loading.value = false;
}).catch(error => {
console.error("获取数据失败:", error);
loading.value = false;
ElMessage.error("获取数据失败");
});
}
//
function formatDate(dateString) {
if (!dateString) return '';
try {
const date = new Date(dateString);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
} catch (e) {
console.error("日期格式化错误:", e);
return dateString;
}
}
//
function formatDateTime(dateString) {
if (!dateString) return '';
try {
const date = new Date(dateString);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
} catch (e) {
console.error("日期时间格式化错误:", e);
return dateString;
}
}
//
function cancel() {
open.value = false;
resetForm();
}
//
function resetForm() {
Object.assign(form, {
id: null,
source: null,
datetime: null,
fat: null,
protein: null,
nonFat: null,
acidity: null,
bacterialColony1: null,
bacterialClony2: null,
bacterialClony3: null,
bacterialClony4: null,
bacterialClony5: null,
yeast: null,
mould: null,
lacto: null,
comment: null,
createBy: null,
createTime: null
});
if (yogurtTestRef.value) {
yogurtTestRef.value.resetFields();
}
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
Object.assign(queryParams, {
source: null,
datetime: null,
});
handleQuery();
}
//
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id);
single.value = selection.length !== 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
function handleAdd() {
resetForm();
open.value = true;
title.value = "添加酸奶检疫记录";
//
form.createBy = getCurrentUsername();
form.createTime = new Date().toISOString().replace('T', ' ').substring(0, 19);
}
/** 修改按钮操作 */
function handleUpdate(row) {
resetForm();
const id = row.id || (ids.value.length ? ids.value[0] : null);
if (!id) {
ElMessage.error("请选择要修改的数据");
return;
}
getYogurtTest(id).then(response => {
Object.assign(form, response.data);
open.value = true;
title.value = "修改酸奶检疫记录";
}).catch(error => {
console.error("获取详情失败:", error);
ElMessage.error("获取详情失败");
});
}
/** 提交按钮 */
function submitForm() {
yogurtTestRef.value.validate(valid => {
if (valid) {
//
const submitData = { ...form };
if (!submitData.id) {
submitData.createBy = getCurrentUsername();
submitData.createTime = new Date().toISOString().replace('T', ' ').substring(0, 19);
} else {
delete submitData.createBy;
delete submitData.createTime;
}
const request = submitData.id
? updateYogurtTest(submitData)
: addYogurtTest(submitData);
request.then(response => {
ElMessage.success(submitData.id ? "修改成功" : "新增成功");
open.value = false;
getList();
}).catch(error => {
console.error("操作失败:", error);
ElMessage.error("操作失败");
});
}
});
}
/** 删除按钮操作 */
function handleDelete(row) {
const deleteIds = row.id ? [row.id] : ids.value;
if (!deleteIds.length) {
ElMessage.error("请选择要删除的数据");
return;
}
ElMessageBox.confirm('是否确认删除选中的记录?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
return delYogurtTest(deleteIds);
}).then(() => {
getList();
ElMessage.success("删除成功");
}).catch(error => {
console.error("删除失败:", error);
if (error !== 'cancel') {
ElMessage.error("删除失败");
}
});
}
/** 导出按钮操作 */
function handleExport() {
const params = new URLSearchParams();
for (const key in queryParams) {
if (queryParams[key] !== null && queryParams[key] !== undefined) {
params.append(key, queryParams[key]);
}
}
const url = `/yogurtTest/yogurtTest/export?${params.toString()}`;
window.location.href = url;
}
//
onMounted(() => {
getList();
});
</script>
<style scoped>
.app-container {
padding: 20px;
}
.el-form-item {
margin-bottom: 15px;
}
.el-dialog__body {
padding: 15px 20px;
}
</style>

View File

@ -70,12 +70,7 @@
<el-col :span="10"> <el-col :span="10">
<el-form-item label="品种" prop="varietyId"> <el-form-item label="品种" prop="varietyId">
<el-select v-model="form.varietyId" placeholder="请选择品种" clearable> <el-select v-model="form.varietyId" placeholder="请选择品种" clearable>
<el-option <el-option v-for="item in varietyOptions" :key="item.id" :label="item.variety" :value="Number(item.id)" />
v-for="item in varietyOptions"
:key="item.id"
:label="item.variety"
:value="Number(item.id)"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -111,17 +106,8 @@
<!-- 导入弹窗 --> <!-- 导入弹窗 -->
<el-dialog title="导入羊只信息" v-model="importOpen" width="400px" append-to-body> <el-dialog title="导入羊只信息" v-model="importOpen" width="400px" append-to-body>
<el-upload <el-upload ref="uploadRef" :limit="1" accept=".xlsx,.xls" :action="importUrl" :headers="headers"
ref="uploadRef" :auto-upload="false" :on-success="handleImportSuccess" :on-error="handleImportError" drag>
:limit="1"
accept=".xlsx,.xls"
:action="importUrl"
:headers="headers"
:auto-upload="false"
:on-success="handleImportSuccess"
:on-error="handleImportError"
drag
>
<i class="el-icon-upload" /> <i class="el-icon-upload" />
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div> <div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
</el-upload> </el-upload>
@ -133,12 +119,12 @@
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from 'vue' import { ref, onMounted, getCurrentInstance } from 'vue'
import request from '@/utils/request' import request from '@/utils/request'
import { addSheep, exportSheepForm } from '@/api/produce/manage_sheep/add_sheep/add_sheep' import { addSheep, exportSheepForm } from '@/api/produce/manage_sheep/add_sheep/add_sheep'
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management' import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import { getCurrentInstance } from 'vue'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
/* -------------------- 表单 -------------------- */ /* -------------------- 表单 -------------------- */
@ -169,7 +155,7 @@ const rules = {
/* -------------------- 下拉数据 -------------------- */ /* -------------------- 下拉数据 -------------------- */
const sheepfoldOptions = ref([]) const sheepfoldOptions = ref([])
const varietyOptions = ref([]) const varietyOptions = ref([])
function getSheepfoldOptions() { function getSheepfoldOptions() {
listSheepfold({ pageNum: 1, pageSize: 9999 }).then(res => { listSheepfold({ pageNum: 1, pageSize: 9999 }).then(res => {

View File

@ -169,13 +169,7 @@
</template> </template>
<script setup name="Trans_group"> <script setup name="Trans_group">
import { import { listTrans_group, getTrans_group, delTrans_group, addTrans_group, updateTrans_group } from '@/api/produce/manage_sheep/trans_group/trans_group'
listTrans_group,
getTrans_group,
delTrans_group,
addTrans_group,
updateTrans_group
} from '@/api/produce/manage_sheep/trans_group/trans_group'
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management' import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management'
import request from '@/utils/request' import request from '@/utils/request'

View File

@ -1,113 +1,79 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <!-- 查询表单 -->
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
<el-form-item label="羊只id" prop="sheepId"> <el-form-item label="羊只id" prop="sheepId">
<el-input <el-input v-model="queryParams.sheepId" placeholder="请输入羊只id" clearable @keyup.enter="handleQuery" />
v-model="queryParams.sheepId"
placeholder="请输入羊只id"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item label="转入牧场" prop="transTo">
<el-input <el-form-item label="品种" prop="varietyId">
v-model="queryParams.transTo" <el-select v-model="queryParams.varietyId" placeholder="请选择品种" style="min-width:150px" clearable>
placeholder="请输入转入牧场" <el-option v-for="item in varietyOptions" :key="item.id" :label="item.variety" :value="item.id" />
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="当前牧场" prop="transFrom">
<el-input
v-model="queryParams.transFrom"
placeholder="请输入当前牧场"
clearable
@keyup.enter="handleQuery"
/>
</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-select>
</el-form-item> </el-form-item>
<el-form-item label="创建时间" style="width: 308px">
<el-date-picker <el-form-item label="转入牧场" prop="transTo">
v-model="daterangeCreateTime" <el-input v-model="queryParams.transTo" placeholder="请输入转入牧场" clearable @keyup.enter="handleQuery" />
value-format="YYYY-MM-DD"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="当前牧场" prop="transFrom">
<el-input v-model="queryParams.transFrom" placeholder="请输入当前牧场" clearable @keyup.enter="handleQuery" />
</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-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<!-- 按钮行 -->
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="primary" plain icon="Plus" @click="handleAdd"
type="primary" v-hasPermi="['transition_info:transition_info:add']">新增</el-button>
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['transition_info:transition_info:add']"
>新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
type="success" v-hasPermi="['transition_info:transition_info:edit']">修改</el-button>
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['transition_info:transition_info:edit']"
>修改</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
type="danger" v-hasPermi="['transition_info:transition_info:remove']">删除</el-button>
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['transition_info:transition_info:remove']"
>删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="warning" plain icon="Download" @click="handleExport"
type="warning" v-hasPermi="['transition_info:transition_info:export']">导出</el-button>
plain
icon="Download"
@click="handleExport"
v-hasPermi="['transition_info:transition_info:export']"
>导出</el-button>
</el-col> </el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row> </el-row>
<!-- 列表 -->
<el-table v-loading="loading" :data="transition_infoList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="transition_infoList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="" align="center" prop="id" /> --> <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="varietyName" />
<el-table-column label="转入牧场" align="center" prop="transTo" /> <el-table-column label="转入牧场" align="center" prop="transTo" />
<el-table-column label="当前牧场" align="center" prop="transFrom" /> <el-table-column label="当前牧场" align="center" prop="transFrom" />
<el-table-column label="转场类型" align="center" prop="transType"> <el-table-column label="转场类型" align="center" prop="transType">
<template #default="scope"> <template #default="scope">
<dict-tag :options="trans_type" :value="scope.row.transType"/> <dict-tag :options="trans_type" :value="scope.row.transType" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="技术员" align="center" prop="technician" /> <el-table-column label="技术员" align="center" prop="technician" />
<el-table-column label="状态" align="center" prop="status"> <el-table-column label="状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<dict-tag :options="status" :value="scope.row.status"/> <dict-tag :options="status" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="备注" align="center" prop="comment" /> <el-table-column label="备注" align="center" prop="comment" />
@ -117,51 +83,57 @@
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" min-width="180"> <el-table-column label="操作" align="center" min-width="180">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleApprove(scope.row)" v-hasPermi="['transition_info:transition_info:approve']">审批</el-button> <el-button link type="primary" icon="Edit" @click="handleApprove(scope.row)"
<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:approve']">审批</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['transition_info:transition_info:remove']">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改转场对话框 --> <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-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 ref="transition_infoRef" :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-input v-model="form.sheepId" placeholder="请输入羊只id" />
</el-form-item> </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-select>
</el-form-item>
<el-form-item label="转入牧场" prop="transTo"> <el-form-item label="转入牧场" prop="transTo">
<el-input v-model="form.transTo" placeholder="请输入转入牧场" /> <el-input v-model="form.transTo" placeholder="请输入转入牧场" />
</el-form-item> </el-form-item>
<el-form-item label="当前牧场" prop="transFrom"> <el-form-item label="当前牧场" prop="transFrom">
<el-input v-model="form.transFrom" placeholder="请输入当前牧场" /> <el-input v-model="form.transFrom" placeholder="请输入当前牧场" />
</el-form-item> </el-form-item>
<el-form-item label="转场类型" prop="transType"> <el-form-item label="转场类型" prop="transType">
<el-select v-model="form.transType" placeholder="请选择转场类型"> <el-select v-model="form.transType" placeholder="请选择转场类型">
<el-option <el-option v-for="dict in trans_type" :key="dict.value"
v-for="dict in trans_type" :label="dict.label" :value="parseInt(dict.value)" />
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="技术员" prop="technician"> <el-form-item label="技术员" prop="technician">
<el-input v-model="form.technician" placeholder="请输入技术员" /> <el-input v-model="form.technician" placeholder="请输入技术员" />
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="comment"> <el-form-item label="备注" prop="comment">
<el-input v-model="form.comment" placeholder="请输入备注" /> <el-input v-model="form.comment" placeholder="请输入备注" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button> <el-button type="primary" @click="submitForm"> </el-button>
@ -169,81 +141,75 @@
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
</div>
<!-- 审批对话框 --> <!-- 审批对话框 -->
<el-dialog :title="'审批转场记录'" v-model="approveDialog" width="500px" append-to-body> <el-dialog :title="'审批转场记录'" v-model="approveDialog" width="500px" append-to-body>
<el-form ref="approveFormRef" :model="approveForm" label-width="120px"> <el-form ref="approveFormRef" :model="approveForm" label-width="120px">
<el-form-item label="羊只id"> <el-form-item label="羊只id"><el-input v-model="approveForm.sheepId" disabled /></el-form-item>
<el-input v-model="approveForm.sheepId" disabled /> <el-form-item label="品种"><el-input :value="approveForm.varietyName" disabled /></el-form-item>
</el-form-item> <el-form-item label="转入牧场"><el-input v-model="approveForm.transTo" disabled /></el-form-item>
<el-form-item label="转入牧场"> <el-form-item label="当前牧场"><el-input v-model="approveForm.transFrom" disabled /></el-form-item>
<el-input v-model="approveForm.transTo" disabled /> <el-form-item label="转场类型">
</el-form-item> <el-input :value="getTransTypeLabel(approveForm.transType)" disabled />
<el-form-item label="当前牧场"> </el-form-item>
<el-input v-model="approveForm.transFrom" disabled /> <el-form-item label="技术员"><el-input v-model="approveForm.technician" disabled /></el-form-item>
</el-form-item> <el-form-item label="备注"><el-input v-model="approveForm.comment" disabled /></el-form-item>
<el-form-item label="转场类型"> </el-form>
<el-select v-model="approveForm.transType" disabled>
<el-option <template #footer>
v-for="dict in trans_type" <div class="dialog-footer">
:key="dict.value" <el-button type="primary" @click="handleApproveAgree">同意</el-button>
:label="dict.label" <el-button type="danger" @click="handleApproveReject">驳回</el-button>
:value="dict.value" </div>
/> </template>
</el-select> </el-dialog>
</el-form-item> </div>
<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>
<div class="dialog-footer">
<el-button type="primary" @click="handleApproveAgree">同意</el-button>
<el-button type="danger" @click="handleApproveReject">驳回</el-button>
</div>
</template>
</el-dialog>
</template> </template>
<script setup name="Transition_info"> <script setup name="Transition_info">
import { listTransition_info, getTransition_info, delTransition_info, addTransition_info, updateTransition_info } from "@/api/produce/manage_sheep/transition_info/transition_info" import { listTransition_info, getTransition_info, delTransition_info, addTransition_info, updateTransition_info } from "@/api/produce/manage_sheep/transition_info/transition_info"
import request from '@/utils/request'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const { status, trans_type } = proxy.useDict('status', 'trans_type') const { status, trans_type } = proxy.useDict('status', 'trans_type')
/* -------------------- 响应式数据 -------------------- */
const transition_infoList = ref([]) const transition_infoList = ref([])
const open = ref(false) const open = ref(false)
const loading = ref(true) const loading = ref(true)
const showSearch = ref(true) const showSearch = ref(true)
const ids = ref([]) const ids = ref([])
const single = ref(true) const single = ref(true)
const multiple = ref(true) const multiple = ref(true)
const total = ref(0) const total = ref(0)
const title = ref("") const title = ref('')
const daterangeCreateTime = ref([]) const daterangeCreateTime = ref([])
const approveDialog = ref(false)
const approveForm = ref({})
const varietyOptions = ref([])
/* -------------------- 查询 / 表单 -------------------- */
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
sheepId: null, sheepId: null,
varietyId: null,
transTo: null, transTo: null,
transFrom: null, transFrom: null,
status: null, status: null,
createTime: null createTime: null
}, },
rules: { rules: {
id: [
{ required: true, message: "不能为空", trigger: "blur" }
],
sheepId: [ sheepId: [
{ required: true, message: "羊只id不能为空", trigger: "blur" } { required: true, message: "羊只id不能为空", trigger: "blur" }
], ],
varietyId: [
{ required: true, message: "品种不能为空", trigger: "change" }
],
transTo: [ transTo: [
{ required: true, message: "转入牧场不能为空", trigger: "blur" } { required: true, message: "转入牧场不能为空", trigger: "blur" }
], ],
@ -255,38 +221,31 @@ const data = reactive({
], ],
technician: [ technician: [
{ required: true, message: "技术员不能为空", trigger: "blur" } { required: true, message: "技术员不能为空", trigger: "blur" }
], ]
} }
}) })
const { queryParams, form, rules } = toRefs(data) const { queryParams, form, rules } = toRefs(data)
/** 查询转场列表 */ /* -------------------- 基础方法 -------------------- */
function getList() { function getList() {
loading.value = true loading.value = true
queryParams.value.params = {} queryParams.value.params = {}
if (null != daterangeCreateTime && '' != daterangeCreateTime) { if (daterangeCreateTime.value?.length) {
queryParams.value.params["beginCreateTime"] = daterangeCreateTime.value[0] 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(response => { listTransition_info(queryParams.value).then(res => {
transition_infoList.value = response.rows transition_infoList.value = res.rows
total.value = response.total total.value = res.total
loading.value = false loading.value = false
}) })
} }
//
function cancel() {
open.value = false
reset()
}
//
function reset() { function reset() {
form.value = { form.value = {
id: null, id: null,
sheepId: null, sheepId: null,
varietyId: null,
transTo: null, transTo: null,
transFrom: null, transFrom: null,
transType: null, transType: null,
@ -299,34 +258,29 @@ function reset() {
proxy.resetForm("transition_infoRef") proxy.resetForm("transition_infoRef")
} }
/** 搜索按钮操作 */ function cancel() {
open.value = false
reset()
}
function handleQuery() { function handleQuery() {
queryParams.value.pageNum = 1 queryParams.value.pageNum = 1
getList() getList()
} }
/** 重置按钮操作 */
function resetQuery() { function resetQuery() {
daterangeCreateTime.value = [] daterangeCreateTime.value = []
proxy.resetForm("queryRef") proxy.resetForm("queryRef")
handleQuery() handleQuery()
} }
//
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id) ids.value = selection.map(item => item.id)
single.value = selection.length != 1 single.value = selection.length !== 1
multiple.value = !selection.length multiple.value = !selection.length
} }
/** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset() reset()
open.value = true open.value = true
title.value = "添加转场" title.value = "添加转场"
} }
/** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset() reset()
const _id = row.id || ids.value const _id = row.id || ids.value
@ -336,78 +290,70 @@ function handleUpdate(row) {
title.value = "修改转场" title.value = "修改转场"
}) })
} }
/** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["transition_infoRef"].validate(valid => { proxy.$refs["transition_infoRef"].validate(valid => {
if (valid) { if (!valid) return
if (form.value.id != null) { const api = form.value.id ? updateTransition_info : addTransition_info
updateTransition_info(form.value).then(response => { api(form.value).then(() => {
proxy.$modal.msgSuccess("修改成功") proxy.$modal.msgSuccess(form.value.id ? "修改成功" : "新增成功")
open.value = false open.value = false
getList() getList()
}) })
} else { })
addTransition_info(form.value).then(response => { }
proxy.$modal.msgSuccess("新增成功") function handleDelete(row) {
open.value = false const _ids = row.id || ids.value
getList() proxy.$modal.confirm('是否确认删除转场编号为"' + _ids + '"的数据项?')
}) .then(() => delTransition_info(_ids))
} .then(() => {
} getList()
proxy.$modal.msgSuccess("删除成功")
})
}
function handleExport() {
proxy.download('/produce/manage_sheep/transition_info/export',
{ ...queryParams.value },
`transition_info_${new Date().getTime()}.xlsx`)
}
/* -------------------- 审批 -------------------- */
function handleApprove(row) {
approveForm.value = { ...row }
approveDialog.value = true
}
function getTransTypeLabel(val) {
const hit = trans_type.value.find(item => Number(item.value) === val)
return hit ? hit.label : val
}
function handleApproveAgree() {
approveForm.value.status = 1
updateTransition_info(approveForm.value).then(() => {
approveDialog.value = false
proxy.$modal.msgSuccess("审批成功,状态已更新为同意")
getList()
})
}
function handleApproveReject() {
approveForm.value.status = 2
updateTransition_info(approveForm.value).then(() => {
approveDialog.value = false
proxy.$modal.msgSuccess("审批成功,状态已更新为驳回")
getList()
}) })
} }
/** 删除按钮操作 */ /* -------------------- 下拉 -------------------- */
function handleDelete(row) { function getVarietyOptions() {
const _ids = row.id || ids.value request({
proxy.$modal.confirm('是否确认删除转场编号为"' + _ids + '"的数据项?').then(function() { url: '/base/variety/list',
return delTransition_info(_ids) method: 'get',
}).then(() => { params: { pageNum: 1, pageSize: 9999 }
getList() }).then(res => { varietyOptions.value = res.rows || [] })
proxy.$modal.msgSuccess("删除成功")
}).catch(() => {})
} }
/** 导出按钮操作 */ /* -------------------- 入口 -------------------- */
function handleExport() { onMounted(() => {
proxy.download('/produce/manage_sheep/transition_info/export', { getVarietyOptions()
...queryParams.value getList()
}, `transition_info_${new Date().getTime()}.xlsx`) })
} </script>
//
const approveDialog = ref(false);
const approveForm = ref({});
//
function handleApprove(row) {
//
approveForm.value = { ...row };
approveDialog.value = true;
}
//
function handleApproveAgree() {
approveForm.value.status = 1; //
updateTransition_info(approveForm.value).then(() => {
approveDialog.value = false;
proxy.$modal.msgSuccess("审批成功,状态已更新为同意");
getList();
}).catch((error) => {
proxy.$modal.msgError(`审批失败:${error}`);
});
}
//
function handleApproveReject() {
approveForm.value.status = 2; //
updateTransition_info(approveForm.value).then(() => {
approveDialog.value = false;
proxy.$modal.msgSuccess("审批成功,状态已更新为驳回");
getList();
}).catch((error) => {
proxy.$modal.msgError(`审批失败:${error}`);
});
}
getList()
</script>

View File

@ -2,8 +2,8 @@
<div class="app-container"> <div class="app-container">
<!-- 搜索 --> <!-- 搜索 -->
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <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="管理耳号" prop="manageTags">
<el-input v-model="queryParams.sheepId" placeholder="请输入羊只id" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.manageTags" placeholder="请输入管理耳号" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="羊舍" prop="sheepfold"> <el-form-item label="羊舍" prop="sheepfold">
@ -19,12 +19,8 @@
</el-form-item> </el-form-item>
<el-form-item label="创建时间" style="width: 308px"> <el-form-item label="创建时间" style="width: 308px">
<el-date-picker v-model="daterangeCreateTime" <el-date-picker v-model="daterangeCreateTime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
value-format="YYYY-MM-DD" start-placeholder="开始日期" end-placeholder="结束日期" />
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -37,19 +33,19 @@
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" <el-button type="primary" plain icon="Plus" @click="handleAdd"
v-hasPermi="['fixHoof:fixHoof:add']">新增</el-button> v-hasPermi="['fixHoof:fixHoof:add']">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['fixHoof:fixHoof:edit']">修改</el-button> v-hasPermi="['fixHoof:fixHoof:edit']">修改</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['fixHoof:fixHoof:remove']">删除</el-button> v-hasPermi="['fixHoof:fixHoof:remove']">删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" <el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['fixHoof:fixHoof:export']">导出</el-button> v-hasPermi="['fixHoof:fixHoof:export']">导出</el-button>
</el-col> </el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" /> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row> </el-row>
@ -57,7 +53,7 @@
<!-- 列表 --> <!-- 列表 -->
<el-table v-loading="loading" :data="fixHoofList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="fixHoofList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <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="manageTags" />
<el-table-column label="羊舍名称" align="center" prop="sheepfoldName" /> <el-table-column label="羊舍名称" align="center" prop="sheepfoldName" />
<el-table-column label="品种" align="center" prop="varietyName" /> <el-table-column label="品种" align="center" prop="varietyName" />
<el-table-column label="备注" align="center" prop="comment" /> <el-table-column label="备注" align="center" prop="comment" />
@ -71,24 +67,21 @@
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['fixHoof:fixHoof:edit']">修改</el-button> v-hasPermi="['fixHoof:fixHoof:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['fixHoof:fixHoof:remove']">删除</el-button> v-hasPermi="['fixHoof:fixHoof:remove']">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
:total="total" v-model:limit="queryParams.pageSize" @pagination="getList" />
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-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="fixHoofRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="fixHoofRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="羊只id" prop="sheepId"> <el-form-item label="耳号" prop="manageTags">
<el-input v-model="form.sheepId" placeholder="请输入羊只id" /> <el-input v-model="form.manageTags" placeholder="请输入耳号" @blur="validateSheep" />
</el-form-item> </el-form-item>
<el-form-item label="羊舍" prop="sheepfold"> <el-form-item label="羊舍" prop="sheepfold">
<el-select v-model="form.sheepfold" placeholder="请选择羊舍" clearable> <el-select v-model="form.sheepfold" placeholder="请选择羊舍" clearable>
@ -118,9 +111,9 @@
</template> </template>
<script setup name="FixHoof"> <script setup name="FixHoof">
import { listFixHoof, getFixHoof, delFixHoof, addFixHoof, updateFixHoof } from '@/api/produce/other/fixHoof/fixHoof' import { listFixHoof, getFixHoof, delFixHoof, addFixHoof, updateFixHoof, checkSheepByManageTags, getVarietyOptions } from '@/api/produce/other/fixHoof/fixHoof'
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management' import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management'
import request from '@/utils/request' // import request from '@/utils/request'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
@ -134,6 +127,7 @@ const multiple = ref(true)
const total = ref(0) const total = ref(0)
const title = ref('') const title = ref('')
const daterangeCreateTime = ref([]) const daterangeCreateTime = ref([])
const varietyOptions = ref([])
const data = reactive({ const data = reactive({
form: {}, form: {},
@ -147,8 +141,11 @@ const data = reactive({
createTime: null createTime: null
}, },
rules: { rules: {
sheepId: [ // sheepId: [
{ required: true, message: '羊只id不能为空', trigger: 'blur' } // { required: true, message: '', trigger: 'blur' }
// ],
manageTags: [
{ required: true, message: '耳号不能为空', trigger: 'blur' }
], ],
sheepfold: [ sheepfold: [
{ required: true, message: '羊舍id不能为空', trigger: 'change' } { required: true, message: '羊舍id不能为空', trigger: 'change' }
@ -165,7 +162,7 @@ const data = reactive({
const { queryParams, form, rules } = toRefs(data) const { queryParams, form, rules } = toRefs(data)
/* 列表 */ /* 列表 */
function getList () { function getList() {
loading.value = true loading.value = true
const q = { ...queryParams.value } const q = { ...queryParams.value }
if (q.sheepId === '') q.sheepId = null if (q.sheepId === '') q.sheepId = null
@ -180,14 +177,17 @@ function getList () {
total.value = res.total total.value = res.total
loading.value = false loading.value = false
}) })
getVarietyOptions({ pageNum: 1, pageSize: 9999 }).then(res => {
varietyOptions.value = res.rows || []
})
} }
function cancel () { function cancel() {
open.value = false open.value = false
reset() reset()
} }
function reset () { function reset() {
form.value = { form.value = {
id: null, id: null,
sheepId: null, sheepId: null,
@ -201,30 +201,30 @@ function reset () {
proxy.resetForm('fixHoofRef') proxy.resetForm('fixHoofRef')
} }
function handleQuery () { function handleQuery() {
queryParams.value.pageNum = 1 queryParams.value.pageNum = 1
getList() getList()
} }
function resetQuery () { function resetQuery() {
daterangeCreateTime.value = [] daterangeCreateTime.value = []
proxy.resetForm('queryRef') proxy.resetForm('queryRef')
handleQuery() handleQuery()
} }
function handleSelectionChange (selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id) ids.value = selection.map(item => item.id)
single.value = selection.length !== 1 single.value = selection.length !== 1
multiple.value = !selection.length multiple.value = !selection.length
} }
function handleAdd () { function handleAdd() {
reset() reset()
open.value = true open.value = true
title.value = '添加修蹄' title.value = '添加修蹄'
} }
function handleUpdate (row) { function handleUpdate(row) {
reset() reset()
const _id = row.id || ids.value const _id = row.id || ids.value
getFixHoof(_id).then(res => { getFixHoof(_id).then(res => {
@ -234,7 +234,7 @@ function handleUpdate (row) {
}) })
} }
function submitForm () { function submitForm() {
proxy.$refs.fixHoofRef.validate(valid => { proxy.$refs.fixHoofRef.validate(valid => {
if (!valid) return if (!valid) return
if (form.value.id) { if (form.value.id) {
@ -253,7 +253,7 @@ function submitForm () {
}) })
} }
function handleDelete (row) { function handleDelete(row) {
const _ids = row.id || ids.value const _ids = row.id || ids.value
proxy.$modal.confirm(`是否确认删除修蹄编号为"${_ids}"的数据项?`).then(() => { proxy.$modal.confirm(`是否确认删除修蹄编号为"${_ids}"的数据项?`).then(() => {
return delFixHoof(_ids) return delFixHoof(_ids)
@ -263,33 +263,45 @@ function handleDelete (row) {
}) })
} }
function handleExport () { function handleExport() {
proxy.download('/produce/other/fixHoof/export', { ...queryParams.value }, `fixHoof_${new Date().getTime()}.xlsx`) proxy.download('/produce/other/fixHoof/export', { ...queryParams.value }, `fixHoof_${new Date().getTime()}.xlsx`)
} }
/* 下拉数据 */ /* 羊舍 */
const sheepfoldOptions = ref([]) const sheepfoldOptions = ref([])
function getSheepfoldOptions () { function getSheepfoldOptions() {
listSheepfold({ pageNum: 1, pageSize: 9999 }).then(res => { listSheepfold({ pageNum: 1, pageSize: 9999 }).then(res => {
sheepfoldOptions.value = res.rows sheepfoldOptions.value = res.rows
}) })
} }
const varietyOptions = ref([]) //
function getVarietyOptions () { async function validateSheep() {
request({ if (!form.value.manageTags) return;
url: '/base/variety/list', try {
method: 'get', const { data } = await checkSheepByManageTags(form.value.manageTags.trim())
params: { pageNum: 1, pageSize: 9999 } if (!data) {
}).then(res => { proxy.$modal.msgError('该管理耳号不存在');
varietyOptions.value = res.rows || [] //
}) 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 */
onMounted(() => { onMounted(() => {
getList()
getSheepfoldOptions() getSheepfoldOptions()
getVarietyOptions() getVarietyOptions()
getList()
}) })
</script> </script>