|
|
<template> <div class="app-container"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px"> <el-form-item label="疫苗标题" prop="title"> <el-input v-model="queryParams.title" placeholder="请输入疫苗标题" clearable @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="牲畜类型" prop="livestockType"> <el-select v-model="queryParams.livestockType" placeholder="请选择牲畜类型" clearable> <el-option v-for="dict in dict.type.livestock_type" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item><!-- <el-form-item label="疫苗类型" prop="vaccineType">--><!-- <el-select v-model="queryParams.vaccineType" placeholder="请选择疫苗类型" clearable>--><!-- <el-option--><!-- v-for="dict in dict.type.vaccine_type"--><!-- :key="dict.value"--><!-- :label="dict.label"--><!-- :value="dict.value"--><!-- />--><!-- </el-select>--><!-- </el-form-item>--> <el-form-item label="状态" prop="status"> <el-select v-model="queryParams.status" placeholder="请选择状态" clearable> <el-option v-for="dict in dict.type.vaccine_info_status" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> <el-form-item label="接种日期" prop="vaccinationDate"> <el-date-picker clearable v-model="queryParams.vaccinationDate" type="date" value-format="yyyy-MM-dd" placeholder="请选择接种日期"> </el-date-picker> </el-form-item> <el-form-item label="接种地点" prop="vaccinationLocation"> <el-input v-model="queryParams.vaccinationLocation" placeholder="请输入接种地点" clearable @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="报名截止时间" prop="endTime"> <el-date-picker clearable v-model="queryParams.endTime" type="date" value-format="yyyy-MM-dd" placeholder="请选择报名截止时间"> </el-date-picker> </el-form-item> <el-form-item label="可预约数量" prop="availableSlots"> <el-input v-model="queryParams.availableSlots" placeholder="请输入可预约数量" clearable @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="总数量" prop="totalSlots"> <el-input v-model="queryParams.totalSlots" placeholder="请输入总数量" clearable @keyup.enter.native="handleQuery" /> </el-form-item><!-- <el-form-item label="发布时间" prop="publishTime">--><!-- <el-date-picker clearable--><!-- v-model="queryParams.publishTime"--><!-- type="date"--><!-- value-format="yyyy-MM-dd"--><!-- placeholder="请选择发布时间">--><!-- </el-date-picker>--><!-- </el-form-item>--> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <el-button icon="el-icon-refresh" size="mini" @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="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:vacInfo:add']" >新增</el-button> </el-col> <el-col :span="1.5"> <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate" v-hasPermi="['system:vacInfo:edit']" >修改</el-button> </el-col> <el-col :span="1.5"> <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:vacInfo:remove']" >删除</el-button> </el-col> <el-col :span="1.5"> <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['system:vacInfo:export']" >导出</el-button> </el-col> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> </el-row>
<el-table v-loading="loading" :data="vacInfoList" @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="疫苗标题" align="center" prop="title" width="200px" :show-overflow-tooltip="true"/> <el-table-column label="牲畜类型" align="center" prop="livestockType" width="100px"> <template slot-scope="scope"> <dict-tag :options="dict.type.livestock_type" :value="scope.row.livestockType"/> </template> </el-table-column><!-- <el-table-column label="疫苗类型" align="center" prop="vaccineType" width="200px">--><!-- <template slot-scope="scope">--><!-- <dict-tag :options="dict.type.vaccine_type" :value="scope.row.vaccineType"/>--><!-- </template>--><!-- </el-table-column>--> <el-table-column label="疫苗类型" align="center" prop="vaccineType" width="200px" :show-overflow-tooltip="true"/> <el-table-column label="详细描述" align="center" prop="description" width="300px" :show-overflow-tooltip="true"/> <el-table-column label="接种日期" align="center" prop="vaccinationDate" width="180"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.vaccinationDate, '{y}-{m}-{d}') }}</span> </template> </el-table-column> <el-table-column label="接种地点" align="center" prop="vaccinationLocation" width="200px"/> <el-table-column label="可预约数量" align="center" prop="availableSlots" width="200px"/> <el-table-column label="总数量" align="center" prop="totalSlots" width="200px"/> <el-table-column label="状态" align="center" prop="status"> <template slot-scope="scope"> <dict-tag :options="dict.type.vaccine_info_status" :value="scope.row.status"/> </template> </el-table-column> <el-table-column label="发布时间" align="center" prop="publishTime" width="180"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.publishTime, '{y}-{m}-{d}') }}</span> </template> </el-table-column> <el-table-column label="报名截止时间" align="center" prop="endTime" width="180"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d}') }}</span> </template> </el-table-column> <el-table-column label="备注" align="center" prop="remark" /> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="300"> <template slot-scope="scope"> <el-button size="mini" type="text" icon="el-icon-edit" style="color: #42B983" class="info-btn alter-btn" @click="handleUpdate(scope.row)" v-hasPermi="['system:vacInfo:edit']" >修改</el-button> <el-button size="mini" type="text" icon="el-icon-delete" style="color: #f56c6c" class="info-btn delete-btn" @click="handleDelete(scope.row)" v-hasPermi="['system:vacInfo:remove']" >删除</el-button> <el-button size="mini" type="text" icon="el-icon-s-order" style="color: rgb(92 169 179)" class="info-btn reservation-btn" @click="handleRegistrationList(scope.row)" v-hasPermi="['system:vacInfo:list']" >预约列表</el-button> </template> </el-table-column> </el-table>
<div class="pagestyle"> <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> </div>
<!-- 添加或修改疫苗信息对话框 --> <el-dialog :title="title" :visible.sync="open" width="80%" append-to-body> <el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-row> <el-col :span="12"> <el-form-item label="疫苗标题" prop="title"> <el-input v-model="form.title" placeholder="请输入疫苗标题" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="牲畜类型" prop="livestockType"> <el-select v-model="form.livestockType" placeholder="请选择牲畜类型" clearable @change="handleLivestockTypeChange"> <el-option v-for="dict in dict.type.livestock_type" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> </el-col> </el-row>
<el-row> <el-col :span="12"> <el-form-item label="疫苗类型" prop="vaccineType"> <el-select v-model="form.vaccineType" placeholder="请先选择牲畜类型" clearable :disabled="!form.livestockType" @change="handleVaccineTypeChange" @focus="handleVaccineTypeFocus" filterable > <el-option v-for="item in vaccineTypeOptions" :key="item.id" :label="getVaccineDisplayName(item)" :value="item.id" /> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="状态" prop="status"> <el-select v-model="form.status" placeholder="请选择状态"> <el-option v-for="dict in dict.type.vaccine_info_status" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" /> </el-select> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="接种日期" prop="vaccinationDate"> <el-date-picker clearable v-model="form.vaccinationDate" type="date" value-format="yyyy-MM-dd" placeholder="请选择接种日期" style="width: 100%;"> </el-date-picker> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="接种地点" prop="vaccinationLocation"> <el-input v-model="form.vaccinationLocation" placeholder="请输入接种地点" /> </el-form-item> </el-col> </el-row>
<el-row> <el-col :span="12"> <el-form-item label="可预约数量" prop="availableSlots"> <el-input v-model="form.availableSlots" placeholder="请输入可预约数量" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="总数量" prop="totalSlots"> <el-input v-model="form.totalSlots" placeholder="请输入总数量" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="报名截止期" prop="endTime"> <el-date-picker clearable v-model="form.endTime" type="date" value-format="yyyy-MM-dd" placeholder="请选择报名截止时间" style="width: 100%;"> </el-date-picker> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="发布时间" prop="publishTime"> <el-date-picker clearable v-model="form.publishTime" type="date" value-format="yyyy-MM-dd" placeholder="请选择发布时间" style="width: 100%;"> </el-date-picker> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="详细描述"> <editor v-model="form.description" :min-height="192"/> </el-form-item> </el-col> </el-row>
<!-- 疫苗详细信息展示 --> <div v-if="selectedVaccine" style="margin: 20px 0; border: 1px solid #ebeef5; border-radius: 4px; padding: 15px;"> <div style="font-weight: bold; margin-bottom: 10px; color: #409EFF;">疫苗详细信息</div> <el-descriptions :column="2" border size="small"> <el-descriptions-item label="通用名称">{{ selectedVaccine.genericName || '暂无' }}</el-descriptions-item> <el-descriptions-item label="商品名称">{{ selectedVaccine.tradeName || '暂无' }}</el-descriptions-item> <el-descriptions-item label="兽药批准文号">{{ selectedVaccine.approvalNumber || '暂无' }}</el-descriptions-item> <el-descriptions-item label="产品批号">{{ selectedVaccine.batchNumber || '暂无' }}</el-descriptions-item> <el-descriptions-item label="规格">{{ selectedVaccine.specification || '暂无' }}</el-descriptions-item> <el-descriptions-item label="生产厂家">{{ selectedVaccine.manufacturer || '暂无' }}</el-descriptions-item> <el-descriptions-item label="生产日期">{{ parseTime(selectedVaccine.manufactureDate, '{y}-{m}-{d}') || '暂无' }}</el-descriptions-item> <el-descriptions-item label="有效期至">{{ parseTime(selectedVaccine.expiryDate, '{y}-{m}-{d}') || '暂无' }}</el-descriptions-item> <el-descriptions-item label="适用动物" :span="2"> <dict-tag :options="dict.type.livestock_type" :value="selectedVaccine.livestockType"/> </el-descriptions-item> <el-descriptions-item label="预防疫病">{{ selectedVaccine.preventDisease || '暂无' }}</el-descriptions-item> <el-descriptions-item label="是否强制免疫">{{ selectedVaccine.isMandatory === '1' ? '是' : '否' }}</el-descriptions-item> <el-descriptions-item label="免疫期(天)">{{ selectedVaccine.immunePeriod || '暂无' }}</el-descriptions-item> <el-descriptions-item label="用法用量">{{ selectedVaccine.dosage || '暂无' }}</el-descriptions-item> <el-descriptions-item label="接种途径">{{ selectedVaccine.administrationRoute || '暂无' }}</el-descriptions-item> <el-descriptions-item label="贮藏条件">{{ selectedVaccine.storageCondition || '暂无' }}</el-descriptions-item> <el-descriptions-item label="注意事项">{{ selectedVaccine.precautions || '暂无' }}</el-descriptions-item> <el-descriptions-item label="库存数量">{{ selectedVaccine.stockQuantity || '暂无' }}</el-descriptions-item> <el-descriptions-item label="已使用数量">{{ selectedVaccine.usedQuantity || '暂无' }}</el-descriptions-item> </el-descriptions> </div>
<el-row> <el-col :span="12"> <el-form-item label="删除标志" prop="delFlag"> <el-input v-model="form.delFlag" placeholder="请输入删除标志" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="创建者" prop="createBy"> <el-input v-model="form.createBy" placeholder="请输入创建者" :disabled="true" /> </el-form-item> </el-col> </el-row>
<el-row> <el-col :span="24"> <el-form-item label="备注" prop="remark"> <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" :rows="3" /> </el-form-item> </el-col> </el-row> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="submitForm">确 定</el-button> <el-button @click="cancel">取 消</el-button> </div> </el-dialog>
<!-- 疫苗预约列表弹窗 --> <el-dialog :title="registrationDialogTitle" :visible.sync="registrationDialogVisible" width="80%" append-to-body @close="handleRegistrationClose" class="registration-dialog" > <div v-if="registrationDialogVisible" style="height: 70vh; overflow-y: auto;"> <VacRegistration :key="currentVaccineId" ref="registrationComponent" /> </div>
<div slot="footer" class="dialog-footer"> <el-button @click="handleRegistrationClose">关 闭</el-button> </div> </el-dialog> </div></template>
<script>import { listVacInfo, getVacInfo, delVacInfo, addVacInfo, updateVacInfo } from "@/api/system/vacInfo"import { getVacCategorylist } from "@/api/system/vacInfo"import VacRegistration from '@/views/system/VacRegistration/index.vue'
export default { name: "VacInfo", components: { VacRegistration }, dicts: ['vaccine_type', 'vaccine_info_status', 'livestock_type'], data() { return { // 遮罩层
loading: true, // 选中数组
ids: [], // 非单个禁用
single: true, // 非多个禁用
multiple: true, // 显示搜索条件
showSearch: true, // 总条数
total: 0, // 疫苗信息表格数据
vacInfoList: [], // 弹出层标题
title: "", // 是否显示弹出层
open: false, // 疫苗类型选项(联动获取)
vaccineTypeOptions: [], // 选中的疫苗详细信息
selectedVaccine: null,
// 新增预约列表弹窗相关数据
registrationDialogVisible: false, currentVaccineId: null, registrationDialogTitle: "",
// 查询参数
queryParams: { pageNum: 1, pageSize: 10, title: null, livestockType: null, vaccineType: null, description: null, vaccinationDate: null, vaccinationLocation: null, availableSlots: null, totalSlots: null, status: null, publishTime: null, endTime: null, }, // 表单参数
form: {}, // 表单校验
rules: { title: [ { required: true, message: "疫苗标题不能为空", trigger: "blur" } ], livestockType: [ { required: true, message: "牲畜类型不能为空", trigger: "change" } ], vaccineType: [ { required: true, message: "疫苗类型不能为空", trigger: "change" } ], description: [ { required: true, message: "详细描述不能为空", trigger: "blur" } ], vaccinationDate: [ { required: true, message: "接种日期不能为空", trigger: "blur" } ], vaccinationLocation: [ { required: true, message: "接种地点不能为空", trigger: "blur" } ], availableSlots: [ { required: true, message: "可预约数量不能为空", trigger: "blur" } ], totalSlots: [ { required: true, message: "总数量不能为空", trigger: "blur" } ], status: [ { required: true, message: "状态:1-进行中 2-已结束 3-已取消不能为空", trigger: "change" } ], publishTime: [ { required: true, message: "发布时间不能为空", trigger: "blur" } ], endTime: [ { required: true, message: "报名截止时间不能为空", trigger: "blur" } ], } } }, created() { this.getList() }, methods: { /** 查询疫苗信息列表 */ getList() { this.loading = true listVacInfo(this.queryParams).then(response => { this.vacInfoList = response.rows this.total = response.total this.loading = false }) }, /** 获取疫苗显示名称 */ getVaccineDisplayName(vaccine) { if (!vaccine) return ''; let displayName = vaccine.genericName || vaccine.tradeName || '未知疫苗'; if (vaccine.approvalNumber) { displayName += ` (${vaccine.approvalNumber})`; } if (vaccine.batchNumber) { displayName += ` - ${vaccine.batchNumber}`; } return displayName; }, /** 牲畜类型变化时处理 */ handleLivestockTypeChange(livestockType) { if (livestockType) { // 清空疫苗相关数据
this.form.vaccineType = null; this.selectedVaccine = null; this.vaccineTypeOptions = []; } else { this.form.vaccineType = null; this.selectedVaccine = null; this.vaccineTypeOptions = []; } }, /** 疫苗类型获得焦点时加载选项 */ handleVaccineTypeFocus() { if (this.form.livestockType && this.vaccineTypeOptions.length === 0) { this.loadVaccineOptions(this.form.livestockType); } }, /** 疫苗类型变化时更新详细信息 */ handleVaccineTypeChange(vaccineId) { if (vaccineId) { this.updateSelectedVaccine(vaccineId); } else { this.selectedVaccine = null; } }, /** 加载疫苗选项 */ loadVaccineOptions(livestockType) { const query = { livestockType: livestockType }; return getVacCategorylist(query).then(response => { this.vaccineTypeOptions = response.rows || []; return this.vaccineTypeOptions; }).catch(() => { this.vaccineTypeOptions = []; this.$message.error('获取疫苗列表失败'); return []; }); }, /** 更新选中的疫苗详细信息 */ updateSelectedVaccine(vaccineId) { if (vaccineId) { const vaccine = this.vaccineTypeOptions.find(item => item.id == vaccineId); this.selectedVaccine = vaccine || null; } else { this.selectedVaccine = null; } }, /** 预约列表按钮操作 */ handleRegistrationList(row) { this.currentVaccineId = row.id; this.registrationDialogTitle = `疫苗预约列表 - ${row.title}`; this.registrationDialogVisible = true;
// 等组件渲染后设置查询条件,过滤该疫苗的预约记录
this.$nextTick(() => { if (this.$refs.registrationComponent) { this.$refs.registrationComponent.queryParams.vaccineId = row.id; this.$refs.registrationComponent.getList(); } }); },
/** 关闭预约列表弹窗 */ handleRegistrationClose() { this.registrationDialogVisible = false; this.currentVaccineId = null; // 重置预约组件的查询条件
if (this.$refs.registrationComponent) { this.$refs.registrationComponent.queryParams.vaccineId = null; } }, // 取消按钮
cancel() { this.open = false this.reset() }, // 表单重置
reset() { this.form = { id: null, title: null, livestockType: null, vaccineType: null, description: null, vaccinationDate: null, vaccinationLocation: null, availableSlots: null, totalSlots: null, status: null, publishTime: null, endTime: null, delFlag: null, createBy: null, createTime: null, updateBy: null, updateTime: null, remark: null } this.vaccineTypeOptions = []; this.selectedVaccine = null; this.resetForm("form") }, /** 搜索按钮操作 */ handleQuery() { this.queryParams.pageNum = 1 this.getList() }, /** 重置按钮操作 */ resetQuery() { this.resetForm("queryForm") this.handleQuery() }, // 多选框选中数据
handleSelectionChange(selection) { this.ids = selection.map(item => item.id) this.single = selection.length!==1 this.multiple = !selection.length }, /** 新增按钮操作 */ handleAdd() { this.reset() this.open = true this.title = "添加疫苗信息" }, /** 修改按钮操作 */ handleUpdate(row) { this.reset() const id = row.id || this.ids getVacInfo(id).then(response => { this.form = response.data this.open = true this.title = "修改疫苗信息"
// 如果表单中有牲畜类型和疫苗类型,需要更新选中的疫苗详细信息
if (this.form.livestockType && this.form.vaccineType) { // 先加载疫苗选项
this.loadVaccineOptions(this.form.livestockType).then(() => { // 然后更新选中的疫苗详细信息
this.updateSelectedVaccine(this.form.vaccineType); }); } }) }, /** 提交按钮 */ submitForm() { this.$refs["form"].validate(valid => { if (valid) { if (this.form.id != null) { updateVacInfo(this.form).then(response => { this.$modal.msgSuccess("修改成功") this.open = false this.getList() }) } else { addVacInfo(this.form).then(response => { this.$modal.msgSuccess("新增成功") this.open = false this.getList() }) } } }) }, /** 删除按钮操作 */ handleDelete(row) { const ids = row.id || this.ids this.$modal.confirm('是否确认删除疫苗信息编号为"' + ids + '"的数据项?').then(function() { return delVacInfo(ids) }).then(() => { this.getList() this.$modal.msgSuccess("删除成功") }).catch(() => {}) }, /** 导出按钮操作 */ handleExport() { this.download('system/vacInfo/export', { ...this.queryParams }, `vacInfo_${new Date().getTime()}.xlsx`) } }}</script>
<style>/* 调整弹窗样式 */.registration-dialog .el-dialog__body { padding: 20px; max-height: 70vh; overflow-y: auto;}</style>
<style scoped>::v-deep .pagestyle .el-input{ width: auto !important;}</style>
<style scoped lang="scss">// 操作按钮样式
.info-btn { padding: 6px 10px; border-radius: 4px; margin: 0 10px; transition: all 0.3s ease;}
.alter-btn:hover{ background-color: rgb(230, 255, 238); transform: translateY(-1px);}
.delete-btn:hover { background-color: rgba(245, 108, 108, 0.1); transform: translateY(-1px);}
.reservation-btn:hover { background-color: rgb(219, 244, 244); transform: translateY(-1px);}
// 新增/修改的弹窗
::v-deep .el-dialog { border-radius: 12px; overflow: hidden; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.12); animation: dialogFadeIn 0.3s ease;}
::v-deep .el-dialog__header { background: linear-gradient(135deg, #2c7a4d 0%, #42b983 100%); padding: 18px 24px; border-bottom: none; position: relative;}
::v-deep .el-dialog__title { font-size: 17px; font-weight: 600; color: white; letter-spacing: 0.5px;}
::v-deep .el-dialog__headerbtn:hover .el-dialog__close { color: #ffd04b; transform: rotate(90deg);}
::v-deep .el-dialog__body { padding: 28px 24px 20px; background-color: #f8fafc; max-height: 70vh; overflow-y: auto;}
::v-deep .el-form-item { margin-bottom: 20px; transition: all 0.3s;}
::v-deep .el-form-item__label { font-weight: 500; color: #2d3748; font-size: 14px; transition: color 0.3s;}
::v-deep .el-input,::v-deep .el-textarea,::v-deep .el-select { width: 100%;}
::v-deep .el-input__inner,::v-deep .el-textarea__inner { border-radius: 8px; border: 1px solid #dcdfe6; font-size: 14px; transition: all 0.3s; background-color: #fcfdfe;}
::v-deep .el-input__inner:focus,::v-deep .el-textarea__inner:focus { border-color: #42B983; box-shadow: 0 0 0 3px rgb(230, 255, 238); background-color: white;}
::v-deep .el-select .el-input__inner { padding-right: 35px;}
::v-deep .el-dialog__footer { padding: 20px 24px; background-color: #f8fafc; border-top: 1px solid #eef2f7; border-radius: 0 0 12px 12px;}</style>
<style scoped>::v-deep .el-descriptions-item__cell{ width: 90px;}
::v-deep .pagestyle .el-input{ width: auto !important;}
::v-deep .el-descriptions-row th{ text-align: center !important;color: #7b7c7f; background: #faf7f7;}
::v-deep .el-descriptions .is-bordered .el-descriptions-item__cell { border: 1px solid #bcbbbb; padding: 12px 10px;}</style>
|