Browse Source

1.资质上传新增列表页面,接口联调

2.入驻审核基本信息和资质证书信息只做一个提交审核并给出提示
3.入驻审核结果意见做显示隐藏,去除保存审核功能
master
ZhaoYang 4 weeks ago
parent
commit
7fdc9b4ab1
  1. 9
      chenhai-ui/src/api/system/vetAduit.js
  2. 13
      chenhai-ui/src/api/vet/info.js
  3. 9
      chenhai-ui/src/api/vet/qualification.js
  4. 4
      chenhai-ui/src/views/login.vue
  5. 268
      chenhai-ui/src/views/muhu/trend/index.vue
  6. 361
      chenhai-ui/src/views/muhu/warning/index.vue
  7. 65
      chenhai-ui/src/views/syd.vue
  8. 26
      chenhai-ui/src/views/system/interpretation/index.vue
  9. 288
      chenhai-ui/src/views/system/slaughterInfo/index.vue
  10. 627
      chenhai-ui/src/views/system/vet/aduit/index.vue
  11. 263
      chenhai-ui/src/views/vet/info/index.vue
  12. 803
      chenhai-ui/src/views/vet/qualification/index.vue
  13. 4
      chenhai-ui/vue.config.js

9
chenhai-ui/src/api/system/vetAduit.js

@ -51,3 +51,12 @@ export function auditCertificate(data) {
data: data data: data
}) })
} }
// 删除
export function delvetInfo(id) {
return request({
url: '/system/vetInfo/' + id,
method: 'delete'
})
}

13
chenhai-ui/src/api/vet/info.js

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询兽医个人信息列表 // 查询兽医个人信息列表
export function listInfo(query) { export function listInfo(query) {
return request({ return request({
url: '/vet/info/list',
url: '/vet/unified/list',
method: 'get', method: 'get',
params: query params: query
}) })
@ -12,18 +12,11 @@ export function listInfo(query) {
// 查询兽医个人信息详细 // 查询兽医个人信息详细
export function getInfo(id) { export function getInfo(id) {
return request({ return request({
url: '/vet/info/' + id,
url: '/vet/unified/' + id,
method: 'get' method: 'get'
}) })
} }
// 兽医个人信息详情
export function getfull(id) {
return request({
url: '/vet/info/full/' + id,
method: 'get'
})
}
// 新增兽医个人信息 // 新增兽医个人信息
export function addInfo(data) { export function addInfo(data) {
@ -37,7 +30,7 @@ export function addInfo(data) {
// 修改兽医个人信息 // 修改兽医个人信息
export function updateInfo(data) { export function updateInfo(data) {
return request({ return request({
url: '/vet/info',
url: '/vet/unified',
method: 'put', method: 'put',
data: data data: data
}) })

9
chenhai-ui/src/api/vet/qualification.js

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 资质+审核 // 资质+审核
export function submitAuditQualification(data) { export function submitAuditQualification(data) {
return request({ return request({
url: '/vet/qualification/submit',
url: '/vet/unified/submitAudit',
method: 'post', method: 'post',
data: data, data: data,
}) })
@ -26,13 +26,6 @@ export function resubmitQualification(data) {
}) })
} }
// 兽医资质提交审核
// export function submitAuditQualification(qualificationId) {
// return request({
// url: '/vet/qualification/submitAudit/' + qualificationId,
// method: 'post',
// })
// }
// 审核 // 审核
export function auditQualification(data) { export function auditQualification(data) {

4
chenhai-ui/src/views/login.vue

@ -31,7 +31,7 @@
</div> </div>
<!-- 注册弹窗 --> <!-- 注册弹窗 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body class="register-dialog">
<el-dialog :title="title" :visible.sync="open" width="500px" :close-on-click-modal="false" append-to-body class="register-dialog">
<el-form ref="registerForm" :model="registerForm" :rules="registerRules"> <el-form ref="registerForm" :model="registerForm" :rules="registerRules">
<el-form-item prop="phone"> <el-form-item prop="phone">
<el-input <el-input
@ -238,7 +238,7 @@ export default {
registerRules: { registerRules: {
phone: [ phone: [
{required: true, trigger: "blur", message: "请输入您的电话号码"}, {required: true, trigger: "blur", message: "请输入您的电话号码"},
{ pattern: /^1[3-9]\d{9}$/, message: "请输入正确的手机号码格式", trigger: "blur" }
{pattern: /^(?!1(\d)\1{9}$)(?!\d*(\d)\2{5,}\d*)(?!\d*0{4,}\d*)(?!\d*1{4,}\d*)(?!\d*2{4,}\d*)(?!\d*3{4,}\d*)(?!\d*4{4,}\d*)(?!\d*5{4,}\d*)(?!\d*6{4,}\d*)(?!\d*7{4,}\d*)(?!\d*8{4,}\d*)(?!\d*9{4,}\d*)1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/, message: "请输入正确的手机号码格式", trigger: "blur" }
], ],
password: [ password: [
{required: true, trigger: "blur", message: "请输入您的密码"}, {required: true, trigger: "blur", message: "请输入您的密码"},

268
chenhai-ui/src/views/muhu/trend/index.vue

@ -1,6 +1,6 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
<el-form-item label="标题" prop="title"> <el-form-item label="标题" prop="title">
<el-input <el-input
v-model="queryParams.title" v-model="queryParams.title"
@ -10,12 +10,14 @@
/> />
</el-form-item> </el-form-item>
<el-form-item label="趋势类型" prop="category"> <el-form-item label="趋势类型" prop="category">
<el-input
v-model="queryParams.category"
placeholder="请选择趋势类型"
clearable
@keyup.enter.native="handleQuery"
/>
<el-select v-model="queryParams.category" placeholder="请选择趋势类型" clearable>
<el-option
v-for="dict in dict.type.category_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@ -71,22 +73,32 @@
<el-table v-loading="loading" :data="trendList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="trendList" @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="title" />
<el-table-column label="趋势类型" align="center" prop="category" />
<el-table-column label="信息来源" align="center" prop="source" />
<el-table-column label="内容" align="center" prop="content" />
<el-table-column label="标签" align="center" prop="tags" />
<el-table-column label="标题" align="center" prop="title" width="200px" :show-overflow-tooltip="true"/>
<el-table-column label="趋势类型" align="center" prop="category" width="200px">
<template slot-scope="scope">
<dict-tag :options="dict.type.category_type" :value="scope.row.category"/>
</template>
</el-table-column>
<el-table-column label="信息来源" align="center" prop="source" width="200px"/>
<el-table-column label="内容" align="center" prop="content" width="300px" :show-overflow-tooltip="true"/>
<el-table-column label="标签" align="center" prop="tags" width="200px">
<template slot-scope="scope">
<dict-tag :options="dict.type.tags_type" :value="scope.row.tags"/>
</template>
</el-table-column>
<el-table-column label="发布日期" align="center" prop="publishDate" width="180"> <el-table-column label="发布日期" align="center" prop="publishDate" width="180">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.publishDate, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.publishDate, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="300">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
size="mini" size="mini"
type="text" type="text"
icon="el-icon-edit" icon="el-icon-edit"
style="color: #42B983"
class="info-btn alter-btn"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
v-hasPermi="['muhu:trend:edit']" v-hasPermi="['muhu:trend:edit']"
>修改</el-button> >修改</el-button>
@ -94,6 +106,8 @@
size="mini" size="mini"
type="text" type="text"
icon="el-icon-delete" icon="el-icon-delete"
style="color: #f56c6c"
class="info-btn delete-btn"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
v-hasPermi="['muhu:trend:remove']" v-hasPermi="['muhu:trend:remove']"
>删除</el-button> >删除</el-button>
@ -101,44 +115,80 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<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="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="标题" prop="title">
<el-input v-model="form.title" placeholder="请输入标题" />
</el-form-item>
<el-form-item label="趋势类型" prop="category">
<el-select v-model="form.category" placeholder="请选择趋势类型" clearable>
<el-option v-for="dict in dict.type.category_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="信息来源" prop="source">
<el-input v-model="form.source" placeholder="请输入信息来源" />
</el-form-item>
<el-form-item label="内容">
<editor v-model="form.content" :min-height="192"/>
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-select v-model="form.tags" placeholder="请选择标签" clearable>
<el-option v-for="dict in dict.type.tags_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="发布日期" prop="publishDate">
<el-date-picker clearable
v-model="form.publishDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择发布日期">
</el-date-picker>
</el-form-item>
<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="category">
<el-select v-model="form.category" placeholder="请选择趋势类型" clearable>
<el-option
v-for="dict in dict.type.category_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="source">
<el-input v-model="form.source" placeholder="请输入信息来源" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="标签" prop="tags">
<el-select v-model="form.tags" placeholder="请选择标签" clearable>
<el-option
v-for="dict in dict.type.tags_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="publishDate">
<el-date-picker clearable
v-model="form.publishDate"
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.content" :min-height="192"/>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button> <el-button type="primary" @click="submitForm"> </el-button>
@ -199,6 +249,12 @@ export default {
form: {}, form: {},
// //
rules: { rules: {
title: [
{ required: true, message: "标题不能为空", trigger: "blur" }
],
category: [
{ required: true, message: "趋势类型不能为空", trigger: "change" }
]
} }
} }
}, },
@ -314,3 +370,117 @@ export default {
} }
} }
</script> </script>
<style scoped>
/* 操作按钮样式 */
.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);
}
/* 新增/修改的弹窗 */
::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;
}
::v-deep .pagestyle .el-input{
width: auto !important;
}
@keyframes dialogFadeIn {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
</style>

361
chenhai-ui/src/views/muhu/warning/index.vue

@ -1,38 +1,22 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="90px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="90px">
<el-form-item label="预警类型" prop="warningType"> <el-form-item label="预警类型" prop="warningType">
<el-select v-model="queryParams.warningType" placeholder="请选择预警类型" clearable> <el-select v-model="queryParams.warningType" placeholder="请选择预警类型" clearable>
<el-option
v-for="dict in dict.type.warning_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
@keyup.enter.native="handleQuery"
/>
<el-option v-for="dict in dict.type.warning_type" :key="dict.value" :label="dict.label" :value="dict.value"
@keyup.enter.native="handleQuery" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="预警级别" prop="warningLevel"> <el-form-item label="预警级别" prop="warningLevel">
<el-select v-model="queryParams.warningLevel" placeholder="请选择预警级别" clearable> <el-select v-model="queryParams.warningLevel" placeholder="请选择预警级别" clearable>
<el-option
v-for="dict in dict.type.warning_level"
:key="dict.value"
:label="dict.label"
:value="dict.value"
@keyup.enter.native="handleQuery"
/>
<el-option v-for="dict in dict.type.warning_level" :key="dict.value" :label="dict.label" :value="dict.value"
@keyup.enter.native="handleQuery" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="预警标题" prop="title"> <el-form-item label="预警标题" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入预警标题"
clearable
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.title" placeholder="请输入预警标题" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -43,119 +27,131 @@
<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="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['muhu:warning:add']"
>新增</el-button>
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['muhu:warning:add']">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['muhu:warning:edit']"
>修改</el-button>
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
v-hasPermi="['muhu:warning:edit']">修改</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['muhu:warning:remove']"
>删除</el-button>
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
v-hasPermi="['muhu:warning:remove']">删除</el-button>
</el-col> </el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="warning"-->
<!-- plain-->
<!-- icon="el-icon-download"-->
<!-- size="mini"-->
<!-- @click="handleExport"-->
<!-- v-hasPermi="['muhu:warning:export']"-->
<!-- >导出</el-button>-->
<!-- </el-col>-->
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
<el-table v-loading="loading" :data="warningList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="warningList" @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="warningType" />
<el-table-column label="预警级别" align="center" prop="warningLevel" />
<el-table-column label="预警标题" align="center" prop="title" />
<el-table-column label="简要内容" align="center" prop="briefContent" />
<el-table-column label="详细内容" align="center" prop="detailContent" />
<el-table-column label="应对措施" align="center" prop="responseMeasures" />
<el-table-column label="影响区域" align="center" prop="affectedRegions" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="预警类型" align="center" prop="warningType" width="120px">
<template slot-scope="scope">
<dict-tag :options="dict.type.warning_type" :value="scope.row.warningType" />
</template>
</el-table-column>
<el-table-column label="预警级别" align="center" prop="warningLevel" width="120px">
<template slot-scope="scope">
<dict-tag :options="dict.type.warning_level" :value="scope.row.warningLevel" />
</template>
</el-table-column>
<el-table-column label="预警标题" align="center" prop="title" width="200px" :show-overflow-tooltip="true" />
<el-table-column label="简要内容" align="center" prop="briefContent" width="250px" :show-overflow-tooltip="true">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
style="color: #42B983"
class = "warning-btn alter-btn"
@click="handleUpdate(scope.row)"
v-hasPermi="['muhu:warning:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
style="color: #f28888"
class = "warning-btn delete-btn"
@click="handleDelete(scope.row)"
v-hasPermi="['muhu:warning:remove']"
>删除</el-button>
<div style="
display: -webkit-box;
-webkit-line-clamp: 3; /* 显示的行数 */
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;" v-html="scope.row.briefContent"></div>
</template>
</el-table-column>
<el-table-column label="详细内容" align="center" prop="detailContent" width="250px" :show-overflow-tooltip="true">
<template slot-scope="scope">
<div style="
display: -webkit-box;
-webkit-line-clamp: 3; /* 显示的行数 */
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;" v-html="scope.row.detailContent"></div>
</template>
</el-table-column>
<el-table-column label="应对措施" align="center" prop="responseMeasures":show-overflow-tooltip="true" />
<el-table-column label="影响区域" align="center" prop="affectedRegions" :show-overflow-tooltip="true" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="200">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" style="color: #42B983" class="warning-btn alter-btn"
@click="handleUpdate(scope.row)" v-hasPermi="['muhu:warning:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" style="color: #f56c6c" class="warning-btn delete-btn"
@click="handleDelete(scope.row)" v-hasPermi="['muhu:warning:remove']">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<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="800px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="预警类型" prop="warningType">
<el-select v-model="form.warningType" placeholder="请选择预警类型" clearable>
<el-option v-for="dict in dict.type.warning_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="预警级别" prop="warningLevel">
<el-select v-model="form.warningLevel" placeholder="请选择预警级别" clearable>
<el-option v-for="dict in dict.type.warning_level" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="预警标题" prop="title">
<el-input v-model="form.title" placeholder="请输入预警标题" />
</el-form-item>
<el-form-item label="简要内容">
<editor v-model="form.briefContent" :min-height="192"/>
</el-form-item>
<el-form-item label="详细内容">
<editor v-model="form.detailContent" :min-height="192"/>
</el-form-item>
<el-form-item label="应对措施" prop="responseMeasures">
<el-input v-model="form.responseMeasures" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="影响区域" prop="affectedRegions">
<el-input v-model="form.affectedRegions" placeholder="请输入影响区域" />
</el-form-item>
<el-dialog :title="title" :visible.sync="open" width="60%" 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="warningType">
<el-select v-model="form.warningType" placeholder="请选择预警类型" clearable style="width: 100%;">
<el-option v-for="dict in dict.type.warning_type" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预警级别" prop="warningLevel">
<el-select v-model="form.warningLevel" placeholder="请选择预警级别" clearable style="width: 100%;">
<el-option v-for="dict in dict.type.warning_level" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="预警标题" prop="title">
<el-input v-model="form.title" placeholder="请输入预警标题" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="简要内容">
<editor v-model="form.briefContent" :min-height="192" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="详细内容">
<editor v-model="form.detailContent" :min-height="192" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="应对措施" prop="responseMeasures">
<el-input v-model="form.responseMeasures" type="textarea" placeholder="请输入内容" :rows="3" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="影响区域" prop="affectedRegions">
<el-input v-model="form.affectedRegions" placeholder="请输入影响区域" />
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button> <el-button type="primary" @click="submitForm"> </el-button>
@ -211,10 +207,10 @@ export default {
// //
rules: { rules: {
warningType: [ warningType: [
{ required: true, message: "预警类型:天气/疫病/环境不能为空", trigger: "change" }
{ required: true, message: "请选择预警类型", trigger: "change" }
], ],
warningLevel: [ warningLevel: [
{ required: true, message: "预警级别:蓝/黄/橙/红不能为空", trigger: "blur" }
{ required: true, message: "请选择预警级别", trigger: "change" }
], ],
title: [ title: [
{ required: true, message: "预警标题不能为空", trigger: "blur" } { required: true, message: "预警标题不能为空", trigger: "blur" }
@ -273,7 +269,7 @@ export default {
// //
handleSelectionChange(selection) { handleSelectionChange(selection) {
this.ids = selection.map(item => item.id) this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.single = selection.length !== 1
this.multiple = !selection.length this.multiple = !selection.length
}, },
/** 新增按钮操作 */ /** 新增按钮操作 */
@ -315,12 +311,12 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const ids = row.id || this.ids const ids = row.id || this.ids
this.$modal.confirm('是否确认删除灾害预警信息编号为"' + ids + '"的数据项?').then(function() {
this.$modal.confirm('是否确认删除灾害预警信息编号为"' + ids + '"的数据项?').then(function () {
return delWarning(ids) return delWarning(ids)
}).then(() => { }).then(() => {
this.getList() this.getList()
this.$modal.msgSuccess("删除成功") this.$modal.msgSuccess("删除成功")
}).catch(() => {})
}).catch(() => { })
}, },
/** 导出按钮操作 */ /** 导出按钮操作 */
handleExport() { handleExport() {
@ -332,17 +328,26 @@ export default {
} }
</script> </script>
<style>
/* 调整分页样式 */
.pagestyle .el-input {
width: auto !important;
}
.el-tooltip__popper{
width: 300px !important;
}
</style>
<style scoped lang="scss"> <style scoped lang="scss">
/* 操作按钮样式 */
//
.warning-btn { .warning-btn {
padding: 6px 10px;
border-radius: 4px;
margin: 0 10px;
transition: all 0.3s ease;
padding: 6px 10px;
border-radius: 4px;
margin: 0 10px;
transition: all 0.3s ease;
} }
.alter-btn:hover{
.alter-btn:hover {
background-color: rgb(230, 255, 238); background-color: rgb(230, 255, 238);
transform: translateY(-1px); transform: translateY(-1px);
} }
@ -351,4 +356,102 @@ export default {
background-color: rgba(245, 108, 108, 0.1); background-color: rgba(245, 108, 108, 0.1);
transform: translateY(-1px); 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;
}
//
::v-deep .el-table {
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
}
::v-deep .el-table--enable-row-hover .el-table__body tr:hover>td {
background-color: #f0f9eb;
}
</style>
<style scoped>
::v-deep .pagestyle .el-input {
width: auto !important;
}
</style> </style>

65
chenhai-ui/src/views/syd.vue

@ -254,8 +254,8 @@
</div> </div>
</div> </div>
<!-- 资质弹窗 -->
<el-dialog :title="title" :visible.sync="flag" width="80%" append-to-body>
<!-- 资质弹窗-->
<el-dialog :title="title" :visible.sync="flag" :close-on-click-modal="false" width="80%" append-to-body>
<el-steps :active="activeStep" finish-status="success" simple style="margin-bottom: 40px;"> <el-steps :active="activeStep" finish-status="success" simple style="margin-bottom: 40px;">
<el-step title="选择经营范围"></el-step> <el-step title="选择经营范围"></el-step>
<el-step title="上传资质"></el-step> <el-step title="上传资质"></el-step>
@ -539,14 +539,8 @@
</template> </template>
<script> <script>
// 使API
import {
getQualificationTypeOptions,
getScopeOptions,
checkNeedQualification, // 使
saveVetInfo // 使
} from "@/api/vet/qualification";
import { getStatsCard } from "@/api/vet/notification";
import { submitAuditQualification, getQualificationTypeOptions, getScopeOptions, getQualificationStatus } from "../api/vet/qualification";
import { getStatsCard } from "../api/vet/notification";
import * as echarts from 'echarts'; import * as echarts from 'echarts';
export default { export default {
@ -587,12 +581,12 @@ export default {
{ pattern: /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}(\d|X|x)$/, message: "身份证号码不合法", trigger: "blur" }, { pattern: /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}(\d|X|x)$/, message: "身份证号码不合法", trigger: "blur" },
{ min: 1, max: 18, message: "长度在18个字符", trigger: "blur" }, { min: 1, max: 18, message: "长度在18个字符", trigger: "blur" },
], ],
// qualificationType: [
// {required: true, message: "", trigger: "change"}
// ],
// scopeIds: [
// {required: true, type: 'array', message: "", trigger: "change"}
// ],
qualificationType: [
{required: true, message: "请选择资质类型", trigger: "change"}
],
scopeIds: [
{required: true, type: 'array', message: "请选择至少一个经营范围", trigger: "change"}
],
}, },
// //
trendTimeRange: "7", trendTimeRange: "7",
@ -606,15 +600,6 @@ export default {
herdsmanCount: "456/2", herdsmanCount: "456/2",
vetCount: 89.50, vetCount: 89.50,
shopCount: 521, shopCount: 521,
//
qualificationTypeData: [
{ name: '执业兽医', value: 120 },
{ name: '乡村兽医', value: 85 },
{ name: '官方兽医', value: 45 },
{ name: '高级兽医师', value: 32 },
{ name: '中级兽医师', value: 68 }
]
} }
}, },
created() { created() {
@ -708,21 +693,18 @@ export default {
} }
}, },
/** 获取资质状态 - 使用新接口 */
/** 获取资质状态 */
getQualStatusAndHandle() { getQualStatusAndHandle() {
checkNeedQualification() // 使
getQualificationStatus()
.then(res => { .then(res => {
const statusData = res.data || {}; const statusData = res.data || {};
if (statusData.needPopup === true || !statusData.hasQualification) {
if (statusData.needPopup === true || statusData.status === 'empty') {
this.flag = true; this.flag = true;
} }
}) })
.catch(error => {
console.error('获取资质状态失败:', error);
})
}, },
/** 提交审核 - 使用新接口 */
/** 提交审核 */
submitQualification() { submitQualification() {
this.loading = true; this.loading = true;
@ -743,8 +725,7 @@ export default {
certificates: certificates, certificates: certificates,
}; };
// 使 saveVetInfo submitAuditQualification
saveVetInfo(requestData).then(response => {
submitAuditQualification(requestData).then(response => {
this.$message.success('提交成功,请等待审核'); this.$message.success('提交成功,请等待审核');
this.flag = false; this.flag = false;
setTimeout(() => { setTimeout(() => {
@ -754,13 +735,13 @@ export default {
}); });
}, 300); }, 300);
}) })
.catch(error => {
console.error('提交失败:', error);
this.$message.error(error.response?.data?.message || '提交失败,请重试');
})
.finally(() => {
this.loading = false;
});
.catch(error => {
console.error('提交失败:', error);
this.$message.error(error.response?.data?.message || '提交失败,请重试');
})
.finally(() => {
this.loading = false;
});
}, },
// //
@ -1621,7 +1602,7 @@ export default {
.summary-item { .summary-item {
display: flex; display: flex;
align-items: flex-start;
align-items: center;
margin-bottom: 10px; margin-bottom: 10px;
&:last-child { &:last-child {

26
chenhai-ui/src/views/system/interpretation/index.vue

@ -112,18 +112,6 @@
<el-table v-loading="loading" :data="interpretationList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="interpretationList" @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="title" width="100" :show-overflow-tooltip="true"/> <el-table-column label="标题" align="center" prop="title" width="100" :show-overflow-tooltip="true"/>
<el-table-column label="政策文件" align="center" prop="policyFile" width="120">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-download"
@click="handleDownload(scope.row)"
v-if="scope.row.policyFile"
>下载文件</el-button>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="发布日期" align="center" prop="releaseDate" width="180"> <el-table-column label="发布日期" align="center" prop="releaseDate" width="180">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.releaseDate, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.releaseDate, '{y}-{m}-{d}') }}</span>
@ -145,12 +133,24 @@
<dict-tag :options="dict.type.sys_publish_status" :value="scope.row.publishStatus"/> <dict-tag :options="dict.type.sys_publish_status" :value="scope.row.publishStatus"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="政策文件" align="center" prop="policyFile" width="120">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-download"
@click="handleDownload(scope.row)"
v-if="scope.row.policyFile"
>下载文件</el-button>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="下架原因" align="center" prop="removalReason" width="100" :show-overflow-tooltip="true"> <el-table-column label="下架原因" align="center" prop="removalReason" width="100" :show-overflow-tooltip="true">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ scope.row.removalReason || '-' }}</span> <span>{{ scope.row.removalReason || '-' }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="300">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" >
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
size="mini" size="mini"

288
chenhai-ui/src/views/system/slaughterInfo/index.vue

@ -1,6 +1,6 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
<el-form-item label="标题" prop="title"> <el-form-item label="标题" prop="title">
<el-input <el-input
v-model="queryParams.title" v-model="queryParams.title"
@ -97,25 +97,26 @@
<el-table v-loading="loading" :data="slaughterInfoList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="slaughterInfoList" @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="id" />-->
<el-table-column label="标题" align="center" prop="title" />
<el-table-column label="内容详情" align="center" prop="content" />
<el-table-column label="联系人" align="center" prop="contactPerson" />
<el-table-column label="联系电话" align="center" prop="contactPhone" />
<el-table-column label="详细地址" align="center" prop="address" />
<el-table-column label="服务时间" align="center" prop="serviceTime" />
<el-table-column label="状态" align="center" prop="status">
<el-table-column label="标题" align="center" prop="title" width="200px" :show-overflow-tooltip="true"/>
<el-table-column label="内容详情" align="center" prop="content" width="300px" :show-overflow-tooltip="true"/>
<el-table-column label="联系人" align="center" prop="contactPerson" width="100px"/>
<el-table-column label="联系电话" align="center" prop="contactPhone" width="120px"/>
<el-table-column label="详细地址" align="center" prop="address" width="200px" :show-overflow-tooltip="true"/>
<el-table-column label="服务时间" align="center" prop="serviceTime" width="150px"/>
<el-table-column label="状态" align="center" prop="status" width="100px">
<template slot-scope="scope"> <template slot-scope="scope">
<dict-tag :options="dict.type.sys_notice_status" :value="scope.row.status"/> <dict-tag :options="dict.type.sys_notice_status" :value="scope.row.status"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="备注" align="center" prop="remark" width="200px" :show-overflow-tooltip="true"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="200">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
size="mini" size="mini"
type="text" type="text"
icon="el-icon-edit" icon="el-icon-edit"
style="color: #42B983"
class="info-btn alter-btn"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
v-hasPermi="['system:slaughterInfo:edit']" v-hasPermi="['system:slaughterInfo:edit']"
>修改</el-button> >修改</el-button>
@ -123,6 +124,8 @@
size="mini" size="mini"
type="text" type="text"
icon="el-icon-delete" icon="el-icon-delete"
style="color: #f56c6c"
class="info-btn delete-btn"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
v-hasPermi="['system:slaughterInfo:remove']" v-hasPermi="['system:slaughterInfo:remove']"
>删除</el-button> >删除</el-button>
@ -130,50 +133,82 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<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="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="标题" prop="title">
<el-input v-model="form.title" placeholder="请输入标题" />
</el-form-item>
<el-form-item label="内容详情">
<editor v-model="form.content" :min-height="192"/>
</el-form-item>
<el-form-item label="联系人" prop="contactPerson">
<el-input v-model="form.contactPerson" placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="联系电话" prop="contactPhone">
<el-input v-model="form.contactPhone" placeholder="请输入联系电话" />
</el-form-item>
<el-form-item label="详细地址" prop="address">
<el-input v-model="form.address" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="服务时间" prop="serviceTime">
<el-input v-model="form.serviceTime" placeholder="请输入服务时间" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in dict.type.sys_notice_status"
:key="dict.value"
:label="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<!-- <el-form-item label="删除标志" prop="delFlag">-->
<!-- <el-input v-model="form.delFlag" placeholder="请输入删除标志" />-->
<!-- </el-form-item>-->
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
<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="contactPerson">
<el-input v-model="form.contactPerson" placeholder="请输入联系人" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="联系电话" prop="contactPhone">
<el-input v-model="form.contactPhone" placeholder="请输入联系电话" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="服务时间" prop="serviceTime">
<el-input v-model="form.serviceTime" placeholder="请输入服务时间" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in dict.type.sys_notice_status"
:key="dict.value"
:label="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="详细地址" prop="address">
<el-input v-model="form.address" type="textarea" placeholder="请输入内容" :rows="3" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="内容详情">
<editor v-model="form.content" :min-height="192"/>
</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> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button> <el-button type="primary" @click="submitForm"> </el-button>
@ -340,3 +375,150 @@ export default {
} }
} }
</script> </script>
<style scoped>
/* 操作按钮样式 */
.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);
}
/* 分页样式 */
::v-deep .pagestyle .el-input{
width: auto !important;
}
::v-deep .pagestyle {
margin-top: 20px;
display: flex;
justify-content: flex-end;
}
/* 弹窗样式 */
::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;
}
/* 搜索区域样式优化 */
::v-deep .el-form--inline .el-form-item {
margin-right: 15px;
}
::v-deep .el-form--inline .el-form-item__label {
padding-right: 12px;
}
/* 表格样式优化 */
::v-deep .el-table {
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
}
/* 按钮组样式优化 */
.el-row.mb8 {
margin-bottom: 15px;
}
.el-button--mini {
border-radius: 6px;
}
/* 动画 */
@keyframes dialogFadeIn {
0% {
opacity: 0;
transform: translateY(-20px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
</style>

627
chenhai-ui/src/views/system/vet/aduit/index.vue

@ -49,27 +49,6 @@
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <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="['vet:info: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="['vet:info:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button
type="danger" type="danger"
@ -98,32 +77,19 @@
<!-- 表格部分 --> <!-- 表格部分 -->
<el-table v-loading="loading" :data="infoList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="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="nickName" width="200px"/>
<el-table-column label="真实姓名" align="center" prop="realName" width="200px"/>
<el-table-column label="性别" align="center" prop="gender" width="100px"/>
<el-table-column label="出生日期" align="center" prop="birthday" width="200px">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.birthday, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="身份证号" align="center" prop="idCard" width="200px"/>
<el-table-column label="擅长领域" align="center" prop="specialty" width="300px" :show-overflow-tooltip="true"/>
<!-- <el-table-column label="工作经验" align="center" prop="workExperience" width="100px"/>-->
<el-table-column label="职称" align="center" prop="title" width="200px"/>
<el-table-column label="联系电话" align="center" prop="phone" width="200px"/>
<!-- <el-table-column label="电子邮箱" align="center" prop="email"/>-->
<el-table-column label="专家类型" align="center" prop="expertType" width="200px"/>
<el-table-column label="所属医院" align="center" prop="hospital" width="300px" :show-overflow-tooltip="true"/>
<!-- <el-table-column label="联系地址" align="center" prop="address" />-->
<!-- <el-table-column label="个人简介" align="center" prop="introduction" />-->
<el-table-column label="用户昵称" align="center" prop="nickName" />
<el-table-column label="真实姓名" align="center" prop="realName" />
<el-table-column label="擅长领域" align="center" prop="specialty" :show-overflow-tooltip="true"/>
<el-table-column label="职称" align="center" prop="title"/>
<el-table-column label="专家类型" align="center" prop="expertType" />
<el-table-column label="所属医院" align="center" prop="hospital" :show-overflow-tooltip="true"/>
<el-table-column label="个人简介" align="center" prop="introduction" :show-overflow-tooltip="true" />
<el-table-column label="审核状态" align="center" prop="auditStatus" width="100" class-name="audit-status-column"> <el-table-column label="审核状态" align="center" prop="auditStatus" width="100" class-name="audit-status-column">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag :type="getAuditStatusTagType(scope.row.auditStatus)" size="small">
{{ getAuditStatusText(scope.row.auditStatus) }}
</el-tag>
<dict-tag :options="dict.type.audit_status" :value="scope.row.auditStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="220">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" >
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
size="mini" size="mini"
@ -164,8 +130,9 @@
append-to-body append-to-body
:close-on-click-modal="false" :close-on-click-modal="false"
class="audit-dialog" class="audit-dialog"
@close="closeAuditDialog"
> >
<el-tabs v-model="activeAuditTab" type="border-card" @tab-click="handleTabClick">
<el-tabs v-model="activeAuditTab" type="border-card">
<!-- 基本信息审核标签页 --> <!-- 基本信息审核标签页 -->
<el-tab-pane label="基本信息审核" name="basic"> <el-tab-pane label="基本信息审核" name="basic">
<div v-if="loadingBasicData" class="tab-loading"> <div v-if="loadingBasicData" class="tab-loading">
@ -191,9 +158,7 @@
<el-descriptions-item label="联系地址" :span="2">{{ basicInfo.address || '-' }}</el-descriptions-item> <el-descriptions-item label="联系地址" :span="2">{{ basicInfo.address || '-' }}</el-descriptions-item>
<el-descriptions-item label="个人简介" :span="2">{{ basicInfo.introduction || '-' }}</el-descriptions-item> <el-descriptions-item label="个人简介" :span="2">{{ basicInfo.introduction || '-' }}</el-descriptions-item>
<el-descriptions-item label="当前审核状态"> <el-descriptions-item label="当前审核状态">
<el-tag :type="getAuditStatusTagType(basicInfo.auditStatus)" size="small">
{{ getAuditStatusText(basicInfo.auditStatus) }}
</el-tag>
<dict-tag :options="dict.type.audit_status" :value="basicInfo.auditStatus" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="审核人">{{ basicInfo.auditor || '-' }}</el-descriptions-item> <el-descriptions-item label="审核人">{{ basicInfo.auditor || '-' }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ parseTime(basicInfo.auditTime) || '-' }}</el-descriptions-item> <el-descriptions-item label="审核时间">{{ parseTime(basicInfo.auditTime) || '-' }}</el-descriptions-item>
@ -205,17 +170,15 @@
<h3>基本信息审核</h3> <h3>基本信息审核</h3>
<el-form ref="basicAuditForm" :model="basicAuditForm" :rules="basicAuditRules" label-width="100px"> <el-form ref="basicAuditForm" :model="basicAuditForm" :rules="basicAuditRules" label-width="100px">
<el-form-item label="审核结果" prop="auditStatus"> <el-form-item label="审核结果" prop="auditStatus">
<el-radio-group v-model="basicAuditForm.auditStatus">
<el-radio-group v-model="basicAuditForm.auditStatus" @change="handleBasicAuditChange">
<el-radio label="1">审核通过</el-radio> <el-radio label="1">审核通过</el-radio>
<el-radio label="2">审核不通过</el-radio> <el-radio label="2">审核不通过</el-radio>
</el-radio-group> </el-radio-group>
<span v-if="basicInfo.auditStatus && basicInfo.auditStatus !== '0'" class="audit-status-tag"> <span v-if="basicInfo.auditStatus && basicInfo.auditStatus !== '0'" class="audit-status-tag">
<el-tag :type="getAuditStatusTagType(basicInfo.auditStatus)" size="small">
{{ getAuditStatusText(basicInfo.auditStatus) }}
</el-tag>
<dict-tag :options="dict.type.audit_status" :value="basicInfo.auditStatus" />
</span> </span>
</el-form-item> </el-form-item>
<el-form-item label="审核意见" prop="auditDesc">
<el-form-item label="审核意见" prop="auditDesc" v-if="basicAuditForm.auditStatus === '2'">
<el-input <el-input
v-model="basicAuditForm.auditDesc" v-model="basicAuditForm.auditDesc"
type="textarea" type="textarea"
@ -231,7 +194,7 @@
</el-tab-pane> </el-tab-pane>
<!-- 资质证书审核标签页 --> <!-- 资质证书审核标签页 -->
<el-tab-pane label="资质证书审核" name="certificate" v-if="showCertificateTab">
<el-tab-pane label="资质证书审核" name="certificate">
<div v-if="loadingCertData" class="tab-loading"> <div v-if="loadingCertData" class="tab-loading">
<i class="el-icon-loading"></i> <i class="el-icon-loading"></i>
<div>加载证书信息...</div> <div>加载证书信息...</div>
@ -268,26 +231,14 @@
<div class="cert-header"> <div class="cert-header">
<div class="cert-title"> <div class="cert-title">
<span>{{ cert.certName || cert.qualificationType || '未命名证书' }}</span> <span>{{ cert.certName || cert.qualificationType || '未命名证书' }}</span>
<el-tag
v-if="cert.auditStatus === '1'"
type="success"
size="small"
<dict-tag
v-if="cert.auditStatus && cert.auditStatus !== '0'"
:options="dict.type.audit_status"
:value="cert.auditStatus"
class="cert-status-tag" class="cert-status-tag"
effect="dark"
>
<i class="el-icon-success"></i> 已通过
</el-tag>
/>
<el-tag <el-tag
v-if="cert.auditStatus === '2'"
type="danger"
size="small"
class="cert-status-tag"
effect="dark"
>
<i class="el-icon-error"></i> 未通过
</el-tag>
<el-tag
v-if="!cert.auditStatus || cert.auditStatus === '0'"
v-else
type="warning" type="warning"
size="small" size="small"
class="cert-status-tag" class="cert-status-tag"
@ -353,11 +304,11 @@
<el-radio label="1">审核通过</el-radio> <el-radio label="1">审核通过</el-radio>
<el-radio label="2">审核不通过</el-radio> <el-radio label="2">审核不通过</el-radio>
</el-radio-group> </el-radio-group>
<span v-if="certAuditForms[cert.qualificationId].submitted" class="audit-saved-tag">
<el-tag type="success" size="small">已保存</el-tag>
<span v-if="cert.auditStatus && cert.auditStatus !== '0'" class="audit-status-tag">
<dict-tag :options="dict.type.audit_status" :value="cert.auditStatus" />
</span> </span>
</el-form-item> </el-form-item>
<el-form-item label="审核意见" prop="auditOpinion">
<el-form-item label="审核意见" prop="auditOpinion" v-if="certAuditForms[cert.qualificationId].auditStatus === '2'">
<el-input <el-input
v-model="certAuditForms[cert.qualificationId].auditOpinion" v-model="certAuditForms[cert.qualificationId].auditOpinion"
type="textarea" type="textarea"
@ -365,19 +316,8 @@
placeholder="请输入审核意见" placeholder="请输入审核意见"
:maxlength="200" :maxlength="200"
show-word-limit show-word-limit
@blur="saveCertificateAudit(cert.qualificationId)"
/> />
</el-form-item> </el-form-item>
<el-form-item>
<el-button
type="primary"
@click="saveCertificateAudit(cert.qualificationId)"
:loading="certAuditForms[cert.qualificationId] && certAuditForms[cert.qualificationId].saving"
>
保存审核
</el-button>
<el-button @click="resetCertAudit(cert.qualificationId)">重置</el-button>
</el-form-item>
</el-form> </el-form>
</div> </div>
</div> </div>
@ -389,7 +329,7 @@
</el-tabs> </el-tabs>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitAllAudit" :loading="submittingAll">
<el-button type="primary" @click="submitAllAudit" :loading="submittingAll" :disabled="!isAllAuditSelected">
{{ submittingAll ? '提交中...' : '提交审核' }} {{ submittingAll ? '提交中...' : '提交审核' }}
</el-button> </el-button>
<el-button @click="auditVisible = false"> </el-button> <el-button @click="auditVisible = false"> </el-button>
@ -431,9 +371,7 @@
<el-descriptions-item label="工作经验">{{ detailData.workExperience || '-' }}</el-descriptions-item> <el-descriptions-item label="工作经验">{{ detailData.workExperience || '-' }}</el-descriptions-item>
<el-descriptions-item label="个人简介" :span="2">{{ detailData.introduction || '-' }}</el-descriptions-item> <el-descriptions-item label="个人简介" :span="2">{{ detailData.introduction || '-' }}</el-descriptions-item>
<el-descriptions-item label="当前审核状态"> <el-descriptions-item label="当前审核状态">
<el-tag :type="getAuditStatusTagType(detailData.auditStatus)" size="small">
{{ getAuditStatusText(detailData.auditStatus) }}
</el-tag>
<dict-tag :options="dict.type.audit_status" :value="detailData.auditStatus" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="审核人">{{ detailData.auditor || '-' }}</el-descriptions-item> <el-descriptions-item label="审核人">{{ detailData.auditor || '-' }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ parseTime(detailData.auditTime) || '-' }}</el-descriptions-item> <el-descriptions-item label="审核时间">{{ parseTime(detailData.auditTime) || '-' }}</el-descriptions-item>
@ -457,33 +395,11 @@
<div class="cert-header"> <div class="cert-header">
<div class="cert-title"> <div class="cert-title">
<span>{{ cert.certName || cert.qualificationType || '未命名证书' }}</span> <span>{{ cert.certName || cert.qualificationType || '未命名证书' }}</span>
<el-tag
v-if="cert.auditStatus === '1'"
type="success"
size="small"
class="cert-status-tag"
effect="dark"
>
<i class="el-icon-success"></i> 已通过
</el-tag>
<el-tag
v-if="cert.auditStatus === '2'"
type="danger"
size="small"
class="cert-status-tag"
effect="dark"
>
<i class="el-icon-error"></i> 未通过
</el-tag>
<el-tag
v-if="!cert.auditStatus || cert.auditStatus === '0'"
type="warning"
size="small"
<dict-tag
:options="dict.type.audit_status"
:value="cert.auditStatus"
class="cert-status-tag" class="cert-status-tag"
effect="dark"
>
<i class="el-icon-time"></i> 待审核
</el-tag>
/>
</div> </div>
<div class="cert-info"> <div class="cert-info">
<span><strong>证书编号</strong>{{ cert.certificateNo || '-' }}</span> <span><strong>证书编号</strong>{{ cert.certificateNo || '-' }}</span>
@ -493,11 +409,6 @@
<span><strong>颁发日期</strong>{{ parseTime(cert.issueDate, '{y}-{m}-{d}') || '-' }}</span> <span><strong>颁发日期</strong>{{ parseTime(cert.issueDate, '{y}-{m}-{d}') || '-' }}</span>
<span><strong>到期日期</strong>{{ parseTime(cert.expireDate, '{y}-{m}-{d}') || '-' }}</span> <span><strong>到期日期</strong>{{ parseTime(cert.expireDate, '{y}-{m}-{d}') || '-' }}</span>
<span><strong>证书状态</strong>{{ cert.certStatus || '-' }}</span> <span><strong>证书状态</strong>{{ cert.certStatus || '-' }}</span>
<span><strong>审核状态</strong>
<el-tag :type="getAuditStatusTagType(cert.auditStatus)" size="small">
{{ getAuditStatusText(cert.auditStatus) }}
</el-tag>
</span>
<span><strong>审核意见</strong>{{ cert.auditOpinion || '-' }}</span> <span><strong>审核意见</strong>{{ cert.auditOpinion || '-' }}</span>
<span><strong>审核时间</strong>{{ parseTime(cert.auditTime) || '-' }}</span> <span><strong>审核时间</strong>{{ parseTime(cert.auditTime) || '-' }}</span>
</div> </div>
@ -553,12 +464,12 @@
</template> </template>
<script> <script>
import { listInfo, getInfo, auditBasicInfo, auditCertificate, listQualification } from "@/api/system/vetAduit"
import { listInfo, getInfo, auditBasicInfo, auditCertificate, listQualification, delvetInfo } from "@/api/system/vetAduit"
import axios from 'axios' import axios from 'axios'
export default { export default {
name: "Info", name: "Info",
dicts: ['expert_type'],
dicts: ['expert_type', 'audit_status'],
data() { data() {
return { return {
loading: true, loading: true,
@ -585,9 +496,9 @@ export default {
activeCertTab: null, activeCertTab: null,
currentVetId: null, currentVetId: null,
currentUserId: null, currentUserId: null,
showCertificateTab: true,
loadingBasicData: false, loadingBasicData: false,
loadingCertData: false,
submittingAll: false, submittingAll: false,
basicInfo: {}, basicInfo: {},
basicAuditForm: { basicAuditForm: {
@ -600,7 +511,6 @@ export default {
] ]
}, },
loadingCertData: false,
certificateList: [], certificateList: [],
certAuditForms: {}, certAuditForms: {},
certAuditRules: { certAuditRules: {
@ -612,8 +522,6 @@ export default {
imagePreviewVisible: false, imagePreviewVisible: false,
previewImageUrl: "", previewImageUrl: "",
certAuditTimer: null,
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
@ -641,14 +549,47 @@ export default {
} }
}, },
computed: { computed: {
canCompleteAudit() {
if (this.basicInfo.auditStatus && this.basicInfo.auditStatus !== '0') {
return true
//
isAllAuditSelected() {
// 12
if (!this.basicAuditForm.auditStatus ||
(this.basicAuditForm.auditStatus !== '1' && this.basicAuditForm.auditStatus !== '2')) {
return false
} }
if (this.basicAuditForm.auditStatus) {
return true
// 12
if (this.certificateList && this.certificateList.length > 0) {
for (let i = 0; i < this.certificateList.length; i++) {
const cert = this.certificateList[i]
const form = this.certAuditForms[cert.qualificationId]
if (!form || !form.auditStatus ||
(form.auditStatus !== '1' && form.auditStatus !== '2')) {
return false
}
}
} }
return false
return true
}
},
watch: {
//
'basicAuditForm.auditStatus': {
handler() {
this.$nextTick(() => {
//
})
},
deep: true
},
//
certAuditForms: {
handler() {
this.$nextTick(() => {
//
})
},
deep: true
} }
}, },
created() { created() {
@ -677,213 +618,236 @@ export default {
this.auditVisible = true this.auditVisible = true
this.activeAuditTab = "basic" this.activeAuditTab = "basic"
this.loadBasicData(id)
//
this.loadAllData(id)
}, },
handleTabClick(tab) {
if (tab.name === 'certificate' && (!this.certificateList || this.certificateList.length === 0)) {
if (this.basicInfo && this.basicInfo.userId) {
this.loadCertificateData(this.basicInfo.userId)
} else {
this.$message.warning('无法获取用户信息')
}
}
},
loadBasicData(id) {
//
async loadAllData(vetId) {
this.loadingBasicData = true this.loadingBasicData = true
this.loadingCertData = true
getInfo(id).then(response => {
if (response.code === 200) {
this.basicInfo = response.data || {}
try {
//
const basicResponse = await getInfo(vetId)
if (basicResponse.code === 200) {
this.basicInfo = basicResponse.data || {}
this.currentUserId = this.basicInfo.userId this.currentUserId = this.basicInfo.userId
this.basicAuditForm = {
auditStatus: this.basicInfo.auditStatus || "",
auditDesc: this.basicInfo.auditDesc || ""
// 12
if (this.basicInfo.auditStatus && this.basicInfo.auditStatus !== '0') {
this.basicAuditForm = {
auditStatus: this.basicInfo.auditStatus,
auditDesc: this.basicInfo.auditDesc || ""
}
} else {
this.basicAuditForm = {
auditStatus: "",
auditDesc: ""
}
} }
} else { } else {
this.$message.error(response.msg || '加载失败')
this.$message.error(basicResponse.msg || '加载基本信息失败')
} }
}).catch(error => {
console.error('加载失败:', error)
this.$message.error('加载失败')
}).finally(() => {
this.loadingBasicData = false
})
},
loadCertificateData(userId) {
this.loadingCertData = true
const queryParams = {
userId: userId,
pageNum: 1,
pageSize: 1000
}
//
if (this.currentUserId) {
const queryParams = {
userId: this.currentUserId,
pageNum: 1,
pageSize: 1000
}
listQualification(queryParams).then(response => {
if (response.code === 200) {
this.certificateList = response.rows || []
const certResponse = await listQualification(queryParams)
if (certResponse.code === 200) {
this.certificateList = certResponse.rows || []
if (this.certificateList.length === 0) {
this.$message.info('该兽医暂无资质证书')
} else {
if (this.certificateList.length > 0) { if (this.certificateList.length > 0) {
this.activeCertTab = 'cert' + this.certificateList[0].qualificationId
}
}
const forms = {}
this.certificateList.forEach(cert => {
forms[cert.qualificationId] = {
qualificationId: cert.qualificationId,
auditStatus: cert.auditStatus || "",
auditOpinion: cert.auditOpinion || "",
submitted: !!cert.auditStatus && cert.auditStatus !== '0',
saving: false
if (this.certificateList.length > 0) {
this.activeCertTab = 'cert' + this.certificateList[0].qualificationId
}
} }
})
this.certAuditForms = forms
} else {
this.$message.error(response.msg || '加载证书列表失败')
const forms = {}
this.certificateList.forEach(cert => {
// 12
if (cert.auditStatus && cert.auditStatus !== '0') {
forms[cert.qualificationId] = {
qualificationId: cert.qualificationId,
auditStatus: cert.auditStatus,
auditOpinion: cert.auditOpinion || "",
audited: true
}
} else {
forms[cert.qualificationId] = {
qualificationId: cert.qualificationId,
auditStatus: "",
auditOpinion: "",
audited: false
}
}
})
this.certAuditForms = forms
} else {
this.$message.error(certResponse.msg || '加载证书列表失败')
}
} }
}).catch(error => {
console.error('加载证书列表失败:', error)
this.$message.error('加载证书列表失败')
}).finally(() => {
} catch (error) {
console.error('加载数据失败:', error)
this.$message.error('加载数据失败')
} finally {
this.loadingBasicData = false
this.loadingCertData = false this.loadingCertData = false
})
}
}, },
handleCertAuditChange(qualificationId) {
if (this.certAuditForms[qualificationId]) {
this.certAuditForms[qualificationId].submitted = false
handleBasicAuditChange(e) {
console.log(e);
//
if (this.basicAuditForm.auditStatus === '1') {
this.basicAuditForm.auditDesc = ''
} }
}, },
saveCertificateAudit(qualificationId) {
const formRef = this.$refs['certForm' + qualificationId]
if (!formRef || !formRef[0]) return
handleCertAuditChange(qualificationId) {
//
if (this.certAuditForms[qualificationId].auditStatus === '1') {
this.certAuditForms[qualificationId].auditOpinion = ''
}
//
this.certAuditForms[qualificationId].audited = true
},
formRef[0].validate(valid => {
if (valid) {
const form = this.certAuditForms[qualificationId]
if (!form.auditStatus) {
this.$message.warning('请选择审核结果')
return
}
submitAllAudit() {
//
if (!this.basicAuditForm.auditStatus ||
(this.basicAuditForm.auditStatus !== '1' && this.basicAuditForm.auditStatus !== '2')) {
this.$message.warning('请选择基本信息审核结果')
this.activeAuditTab = 'basic'
return
}
form.saving = true
//
if (this.basicAuditForm.auditStatus === '2' && !this.basicAuditForm.auditDesc) {
this.$message.warning('审核不通过时,请填写审核意见')
this.activeAuditTab = 'basic'
return
}
const auditData = {
qualificationId: qualificationId,
auditStatus: form.auditStatus,
auditOpinion: form.auditOpinion || ''
//
if (this.certificateList && this.certificateList.length > 0) {
let unselectedCertNames = []
let invalidOpinionCertNames = []
for (let i = 0; i < this.certificateList.length; i++) {
const cert = this.certificateList[i]
const form = this.certAuditForms[cert.qualificationId]
const certName = cert.certName || cert.qualificationType || `证书${i + 1}`
if (!form || !form.auditStatus ||
(form.auditStatus !== '1' && form.auditStatus !== '2')) {
unselectedCertNames.push(certName)
} else if (form.auditStatus === '2' && !form.auditOpinion) {
invalidOpinionCertNames.push(certName)
} }
auditCertificate(auditData).then(response => {
if (response.code === 200) {
form.submitted = true
const certIndex = this.certificateList.findIndex(c => c.qualificationId === qualificationId)
if (certIndex !== -1) {
this.certificateList[certIndex].auditStatus = form.auditStatus
this.certificateList[certIndex].auditOpinion = form.auditOpinion
}
this.$message.success('证书审核已保存')
} else {
this.$message.error(response.msg || '保存失败')
}
}).catch(error => {
console.error('保存证书审核失败:', error)
this.$message.error('保存失败')
}).finally(() => {
form.saving = false
})
}
})
},
resetCertAudit(qualificationId) {
const cert = this.certificateList.find(c => c.qualificationId === qualificationId)
if (cert) {
this.certAuditForms[qualificationId] = {
qualificationId: cert.qualificationId,
auditStatus: cert.auditStatus || "",
auditOpinion: cert.auditOpinion || "",
submitted: !!cert.auditStatus && cert.auditStatus !== '0',
saving: false
} }
this.$message.info('已重置审核表单')
}
},
submitAllAudit() {
this.$refs.basicAuditForm.validate(valid => {
if (!valid) {
this.$message.warning('请完成基本信息审核')
this.activeAuditTab = 'basic'
//
if (unselectedCertNames.length > 0) {
const message = `请为以下证书选择审核结果:${unselectedCertNames.join('、')}`
this.$message.warning(message)
this.activeAuditTab = 'certificate'
//
const firstUnselectedCert = this.certificateList.find(cert => {
const form = this.certAuditForms[cert.qualificationId]
return !form || !form.auditStatus ||
(form.auditStatus !== '1' && form.auditStatus !== '2')
})
if (firstUnselectedCert) {
this.activeCertTab = 'cert' + firstUnselectedCert.qualificationId
}
return return
} }
let allCertAudited = true
if (this.certificateList.length > 0) {
for (let i = 0; i < this.certificateList.length; i++) {
const cert = this.certificateList[i]
//
if (invalidOpinionCertNames.length > 0) {
const message = `以下证书审核不通过,请填写审核意见:${invalidOpinionCertNames.join('、')}`
this.$message.warning(message)
this.activeAuditTab = 'certificate'
//
const firstInvalidCert = this.certificateList.find(cert => {
const form = this.certAuditForms[cert.qualificationId] const form = this.certAuditForms[cert.qualificationId]
if (!form || !form.submitted) {
allCertAudited = false
break
}
}
if (!allCertAudited) {
this.$message.warning('请完成所有证书的审核')
this.activeAuditTab = 'certificate'
return
return form && form.auditStatus === '2' && !form.auditOpinion
})
if (firstInvalidCert) {
this.activeCertTab = 'cert' + firstInvalidCert.qualificationId
} }
return
} }
}
this.submittingAll = true
this.submittingAll = true
const auditData = {
id: this.currentVetId,
auditStatus: this.basicAuditForm.auditStatus,
auditDesc: this.basicAuditForm.auditDesc
}
//
const basicAuditData = {
id: this.currentVetId,
auditStatus: this.basicAuditForm.auditStatus,
auditDesc: this.basicAuditForm.auditDesc
}
auditBasicInfo(auditData).then(response => {
if (response.code === 200) {
this.$message.success('审核提交成功')
this.auditVisible = false
this.getList()
} else {
this.$message.error(response.msg || '提交失败')
auditBasicInfo(basicAuditData).then(response => {
if (response.code === 200) {
//
if (this.certificateList && this.certificateList.length > 0) {
const certPromises = []
this.certificateList.forEach(cert => {
const form = this.certAuditForms[cert.qualificationId]
const certAuditData = {
qualificationId: cert.qualificationId,
auditStatus: form.auditStatus,
auditOpinion: form.auditOpinion || ''
}
certPromises.push(auditCertificate(certAuditData))
})
return Promise.all(certPromises)
} }
}).catch(error => {
console.error('提交失败:', error)
this.$message.error('提交失败')
}).finally(() => {
this.submittingAll = false
})
return Promise.resolve()
} else {
throw new Error(response.msg || '基本信息审核提交失败')
}
}).then(results => {
this.$message.success('审核提交成功')
this.auditVisible = false
this.getList()
}).catch(error => {
console.error('提交失败:', error)
this.$message.error(error.message || '提交失败')
}).finally(() => {
this.submittingAll = false
}) })
}, },
getCertSummaryText() { getCertSummaryText() {
if (this.certificateList.length === 0) {
if (!this.certificateList || this.certificateList.length === 0) {
return '暂无资质证书' return '暂无资质证书'
} }
const total = this.certificateList.length
const audited = Object.values(this.certAuditForms).filter(f => f.submitted).length
const passed = this.certificateList.filter(c => c.auditStatus === '1').length
const failed = this.certificateList.filter(c => c.auditStatus === '2').length
let selectedCount = 0
this.certificateList.forEach(cert => {
const form = this.certAuditForms[cert.qualificationId]
if (form && form.auditStatus &&
(form.auditStatus === '1' || form.auditStatus === '2')) {
selectedCount++
}
})
return `${total} 个证书,已审核 ${audited} 个,其中通过 ${passed} 个,不通过 ${failed}`
const totalCount = this.certificateList.length
if (selectedCount === totalCount) {
return `${totalCount} 个证书,所有证书均已选择审核结果`
} else {
return `${totalCount} 个证书,已选择审核结果 ${selectedCount} 个,还有 ${totalCount - selectedCount} 个证书未选择`
}
}, },
resetAuditData() { resetAuditData() {
@ -897,10 +861,12 @@ export default {
this.currentVetId = null this.currentVetId = null
this.currentUserId = null this.currentUserId = null
this.activeCertTab = null this.activeCertTab = null
if (this.certAuditTimer) {
clearTimeout(this.certAuditTimer)
this.certAuditTimer = null
}
this.loadingBasicData = false
this.loadingCertData = false
},
closeAuditDialog() {
this.resetAuditData()
}, },
handleView(row) { handleView(row) {
@ -1000,13 +966,14 @@ export default {
}) })
}, },
//
handleDelete(row) { handleDelete(row) {
const ids = row.id || this.ids const ids = row.id || this.ids
this.$modal.confirm('是否确认删除兽医个人信息编号为"' + ids + '"的数据项?').then(() => { this.$modal.confirm('是否确认删除兽医个人信息编号为"' + ids + '"的数据项?').then(() => {
this.$axios.delete('/system/vetInfo/' + ids).then(response => {
this.getList()
this.$modal.msgSuccess("删除成功")
})
return delvetInfo(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {}) }).catch(() => {})
}, },
@ -1085,7 +1052,7 @@ export default {
axios({ axios({
method: 'get', method: 'get',
url: fullUrl, url: fullUrl,
responseType: 'blob', // blob
responseType: 'blob',
headers: { headers: {
} }
}).then(response => { }).then(response => {
@ -1120,10 +1087,17 @@ export default {
} }
</script> </script>
<style>
.el-tooltip__popper{
width: 300px !important;
}
</style>
<style scoped> <style scoped>
::v-deep .pagestyle .el-input{ ::v-deep .pagestyle .el-input{
width: auto !important; width: auto !important;
} }
</style> </style>
<style scoped lang="scss"> <style scoped lang="scss">
@ -1256,27 +1230,7 @@ export default {
font-size: 13px; font-size: 13px;
font-weight: 600; font-weight: 600;
color: #303133; color: #303133;
//flex: 1;
} }
//.el-tag {
// font-weight: 500;
//
// &.el-tag--success {
// background-color: rgba(103, 194, 58, 0.1);
// border-color: rgba(103, 194, 58, 0.2);
// }
//
// &.el-tag--danger {
// background-color: rgba(245, 108, 108, 0.1);
// border-color: rgba(245, 108, 108, 0.2);
// }
//
// &.el-tag--warning {
// background-color: rgba(230, 162, 60, 0.1);
// border-color: rgba(230, 162, 60, 0.2);
// }
//}
} }
.cert-info { .cert-info {
@ -1364,7 +1318,6 @@ export default {
color: #606266; color: #606266;
font-size: 13px; font-size: 13px;
//
.download-btn { .download-btn {
color: #409EFF; color: #409EFF;
padding: 0; padding: 0;
@ -1418,31 +1371,6 @@ export default {
} }
} }
//.info-btn {
// padding: 6px 12px;
// border-radius: 4px;
// margin: 0 4px;
// transition: all 0.3s ease;
// font-weight: 500;
//
// &:hover {
// transform: translateY(-2px);
// box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
// }
//}
//
//.view-btn:hover {
// background-color: rgba(243, 239, 231, 0.9);
// border-color: #e6a23c;
// color: #e6a23c;
//}
//
//.audit-btn:hover {
// background-color: rgba(64, 158, 255, 0.15);
// border-color: #409eff;
// color: #409eff;
//}
:deep(.dialog-footer) { :deep(.dialog-footer) {
.el-button { .el-button {
min-width: 100px; min-width: 100px;
@ -1483,7 +1411,6 @@ export default {
} }
} }
//
.info-btn { .info-btn {
padding: 6px 10px; padding: 6px 10px;
border-radius: 4px; border-radius: 4px;
@ -1501,7 +1428,6 @@ export default {
transform: translateY(-1px); transform: translateY(-1px);
} }
// /
::v-deep .el-dialog { ::v-deep .el-dialog {
border-radius: 12px; border-radius: 12px;
overflow: hidden; overflow: hidden;
@ -1580,7 +1506,6 @@ export default {
border-radius: 0 0 12px 12px; border-radius: 0 0 12px 12px;
} }
//
.cert-status-tag { .cert-status-tag {
min-width: 70px; min-width: 70px;
display: inline-flex; display: inline-flex;

263
chenhai-ui/src/views/vet/info/index.vue

@ -3,44 +3,29 @@
<!-- 搜索部分 --> <!-- 搜索部分 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="90px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="90px">
<el-form-item label="真实姓名" prop="realName"> <el-form-item label="真实姓名" prop="realName">
<el-input
v-model="queryParams.realName"
placeholder="请输入真实姓名"
clearable
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.realName" placeholder="请输入真实姓名" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<!-- <el-form-item label="性别" prop="gender">-->
<!-- <el-input-->
<!-- v-model="queryParams.gender"-->
<!-- placeholder="请输入性别"-->
<!-- clearable-->
<!-- @keyup.enter.native="handleQuery"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="性别" prop="gender">-->
<!-- <el-input-->
<!-- v-model="queryParams.gender"-->
<!-- placeholder="请输入性别"-->
<!-- clearable-->
<!-- @keyup.enter.native="handleQuery"-->
<!-- />-->
<!-- </el-form-item>-->
<el-form-item label="身份证号" prop="idCard"> <el-form-item label="身份证号" prop="idCard">
<el-input
v-model="queryParams.idCard"
placeholder="请输入身份证号"
clearable
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.idCard" placeholder="请输入身份证号" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<!-- <el-form-item label="工作经验" prop="workExperience">-->
<!-- <el-input-->
<!-- v-model="queryParams.workExperience"-->
<!-- placeholder="请输入工作经验"-->
<!-- clearable-->
<!-- @keyup.enter.native="handleQuery"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="工作经验" prop="workExperience">-->
<!-- <el-input-->
<!-- v-model="queryParams.workExperience"-->
<!-- placeholder="请输入工作经验"-->
<!-- clearable-->
<!-- @keyup.enter.native="handleQuery"-->
<!-- />-->
<!-- </el-form-item>-->
<el-form-item label="所属医院" prop="hospital"> <el-form-item label="所属医院" prop="hospital">
<el-input
v-model="queryParams.hospital"
placeholder="请输入所属医院"
clearable
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.hospital" placeholder="请输入所属医院" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@ -49,37 +34,17 @@
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <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="['vet:info:add']">新增</el-button>
</el-col> -->
<el-col :span="1.5"> <el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['vet:info:add']"
>新增</el-button>
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
v-hasPermi="['vet:info:edit']">修改</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['vet:info: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="['vet:info:remove']"
>删除</el-button>
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
v-hasPermi="['vet:info:remove']">删除</el-button>
</el-col> </el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
@ -89,77 +54,55 @@
<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="avatar" width="100"> <el-table-column label="头像" align="center" prop="avatar" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<image-preview :src="scope.row.avatar" :width="50" :height="50"/>
<image-preview :src="scope.row.avatar" :width="50" :height="50" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="用户昵称" align="center" prop="nickName" /> <el-table-column label="用户昵称" align="center" prop="nickName" />
<el-table-column label="真实姓名" align="center" prop="realName" width="150" :show-overflow-tooltip="true"/>
<el-table-column label="性别" align="center" prop="gender" />
<el-table-column label="真实姓名" align="center" prop="realName" width="150" :show-overflow-tooltip="true" />
<!-- <el-table-column label="性别" align="center" prop="gender" />
<el-table-column label="出生日期" align="center" prop="birthday" width="100"> <el-table-column label="出生日期" align="center" prop="birthday" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.birthday, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.birthday, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="身份证号" align="center" prop="idCard" width="200"/>
<el-table-column label="擅长领域" align="center" prop="specialty" width="150" :show-overflow-tooltip="true"/>
<el-table-column label="工作经验" align="center" prop="workExperience"/>
<el-table-column label="职称" align="center" prop="title" width="150"/>
<el-table-column label="联系电话" align="center" prop="phone" width="200"/>
<el-table-column label="电子邮箱" align="center" prop="email" width="200"/>
<el-table-column label="专家类型" align="center" prop="expertType" width="150"/>
<el-table-column label="所属医院" align="center" prop="hospital" width="150" :show-overflow-tooltip="true"/>
<el-table-column label="联系地址" align="center" prop="address" width="150" :show-overflow-tooltip="true"/>
<el-table-column label="个人简介" align="center" prop="introduction" width="150" :show-overflow-tooltip="true"/>
<el-table-column label="身份证号" align="center" prop="idCard" width="200" /> -->
<el-table-column label="擅长领域" align="center" prop="specialty" :show-overflow-tooltip="true" />
<el-table-column label="工作经验" align="center" prop="workExperience" />
<el-table-column label="职称" align="center" prop="title" />
<!-- <el-table-column label="联系电话" align="center" prop="phone" width="200" />
<el-table-column label="电子邮箱" align="center" prop="email" width="200" /> -->
<el-table-column label="专家类型" align="center" prop="expertType" width="150" />
<!-- <el-table-column label="所属医院" align="center" prop="hospital" width="150" :show-overflow-tooltip="true" />
<el-table-column label="联系地址" align="center" prop="address" width="150" :show-overflow-tooltip="true" />
<el-table-column label="个人简介" align="center" prop="introduction" width="150" :show-overflow-tooltip="true" /> -->
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="300"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="300">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-view"
class = "info-btn view-btn"
@click="handleView(scope.row)"
v-hasPermi="['vet:info:view']"
>详情</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
style="color: #42B983"
class = "info-btn alter-btn"
@click="handleUpdate(scope.row)"
v-hasPermi="['vet:info:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
style="color: #f28888"
class = "info-btn delete-btn"
@click="handleDelete(scope.row)"
v-hasPermi="['vet:info:remove']"
>删除</el-button>
<el-button size="mini" type="text" icon="el-icon-view" class="info-btn view-btn" @click="handleView(scope.row)"
v-hasPermi="['vet:info:view']">详情</el-button>
<el-button size="mini" type="text" icon="el-icon-edit" style="color: #42B983" class="info-btn alter-btn"
@click="handleUpdate(scope.row)" v-hasPermi="['vet:info:edit']">完善信息</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" style="color: #f28888" class="info-btn delete-btn"
@click="handleDelete(scope.row)" v-hasPermi="['vet:info:remove']">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="pagestyle"> <div class="pagestyle">
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
</div> </div>
<!-- 添加或修改兽医个人信息对话框 --> <!-- 添加或修改兽医个人信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
<el-dialog :title="title" :visible.sync="open" width="80%" :close-on-click-modal="false" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="头像" prop="avatar"> <el-form-item label="头像" prop="avatar">
<image-upload v-model="form.avatar" :limit='1'/>
<image-upload v-model="form.avatar" :limit='1' />
</el-form-item>
<el-form-item label="用户昵称" prop="nickName">
<el-input v-model="form.nickName" placeholder="请输入用户昵称" minlength="2" maxlength="10" />
</el-form-item> </el-form-item>
<el-form-item label="真实姓名" prop="realName"> <el-form-item label="真实姓名" prop="realName">
<el-input v-model="form.realName" placeholder="请输入真实姓名" minlength="2" maxlength="10"/>
<el-input v-model="form.realName" placeholder="请输入真实姓名" minlength="2" maxlength="10" />
</el-form-item> </el-form-item>
<el-form-item label="性别" prop="gender"> <el-form-item label="性别" prop="gender">
<el-select v-model="form.gender" placeholder="请选择性别" clearable> <el-select v-model="form.gender" placeholder="请选择性别" clearable>
@ -168,11 +111,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="出生日期" prop="birthday"> <el-form-item label="出生日期" prop="birthday">
<el-date-picker clearable
v-model="form.birthday"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择出生日期">
<el-date-picker clearable v-model="form.birthday" type="date" value-format="yyyy-MM-dd" placeholder="请选择出生日期">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="职称" prop="title"> <el-form-item label="职称" prop="title">
@ -186,7 +125,7 @@
</el-form-item> </el-form-item>
<el-form-item label="专家类型" prop="expertType"> <el-form-item label="专家类型" prop="expertType">
<el-select v-model="form.expertType" placeholder="请选择专家类型" clearable> <el-select v-model="form.expertType" placeholder="请选择专家类型" clearable>
<el-option v-for="dict in dict.type.expert_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
<el-option v-for="dict in dict.type.expert_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="身份证号" prop="idCard" minlength="18" maxlength="18"> <el-form-item label="身份证号" prop="idCard" minlength="18" maxlength="18">
@ -220,16 +159,18 @@
<!-- 显示兽医基本信息 --> <!-- 显示兽医基本信息 -->
<el-descriptions title="兽医基本信息" :column="2" border> <el-descriptions title="兽医基本信息" :column="2" border>
<el-descriptions-item label="真实姓名">{{ detailData.realName || '-' }}</el-descriptions-item> <el-descriptions-item label="真实姓名">{{ detailData.realName || '-' }}</el-descriptions-item>
<el-descriptions-item label="用户昵称">{{ detailData.realName || '-' }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ detailData.gender || '-' }}</el-descriptions-item> <el-descriptions-item label="性别">{{ detailData.gender || '-' }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ detailData.birthday || '-' }}</el-descriptions-item> <el-descriptions-item label="出生日期">{{ detailData.birthday || '-' }}</el-descriptions-item>
<el-descriptions-item label="身份证号">{{ detailData.idCard || '-' }}</el-descriptions-item> <el-descriptions-item label="身份证号">{{ detailData.idCard || '-' }}</el-descriptions-item>
<el-descriptions-item label="擅长领域">{{ detailData.specialty || '-' }}</el-descriptions-item> <el-descriptions-item label="擅长领域">{{ detailData.specialty || '-' }}</el-descriptions-item>
<el-descriptions-item label="工作经验">{{ detailData.workExperience ? detailData.workExperience + '年' : '-' }}</el-descriptions-item>
<el-descriptions-item label="工作经验">{{ detailData.workExperience ? detailData.workExperience + '年' : '-'
}}</el-descriptions-item>
<el-descriptions-item label="职称">{{ detailData.title || '-' }}</el-descriptions-item> <el-descriptions-item label="职称">{{ detailData.title || '-' }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ detailData.phone || '-' }}</el-descriptions-item> <el-descriptions-item label="联系电话">{{ detailData.phone || '-' }}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{ detailData.email || '-' }}</el-descriptions-item> <el-descriptions-item label="电子邮箱">{{ detailData.email || '-' }}</el-descriptions-item>
<el-descriptions-item label="专家类型"> <el-descriptions-item label="专家类型">
<dict-tag :options="dict.type.expert_type" :value="detailData.expertType"/>
<dict-tag :options="dict.type.expert_type" :value="detailData.expertType" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="所属医院">{{ detailData.hospital || '-' }}</el-descriptions-item> <el-descriptions-item label="所属医院">{{ detailData.hospital || '-' }}</el-descriptions-item>
<el-descriptions-item label="联系地址" :span="2">{{ detailData.address || '-' }}</el-descriptions-item> <el-descriptions-item label="联系地址" :span="2">{{ detailData.address || '-' }}</el-descriptions-item>
@ -237,17 +178,11 @@
</el-descriptions> </el-descriptions>
<!-- 显示资质证书信息 --> <!-- 显示资质证书信息 -->
<div style="margin-top: 30px;">
<!-- <div style="margin-top: 30px;">
<h3 style="margin-bottom: 15px;color: #303133;font-weight: bold;">资质证书信息</h3> <h3 style="margin-bottom: 15px;color: #303133;font-weight: bold;">资质证书信息</h3>
<el-alert
v-if="!certificateList || certificateList.length === 0"
title="暂无资质证书"
type="info"
:closable="false"
style="margin-bottom: 20px;"
/>
<el-alert v-if="!certificateList || certificateList.length === 0" title="暂无资质证书" type="info" :closable="false"
style="margin-bottom: 20px;" />
<el-table v-else :data="certificateList" border style="width: 100%"> <el-table v-else :data="certificateList" border style="width: 100%">
<!-- <el-table-column prop="qualificationName" label="资质名称" align="center" width="180"></el-table-column>-->
<el-table-column prop="certName" label="证书名称" align="center"></el-table-column> <el-table-column prop="certName" label="证书名称" align="center"></el-table-column>
<el-table-column prop="certificateNo" label="证书编号" align="center"></el-table-column> <el-table-column prop="certificateNo" label="证书编号" align="center"></el-table-column>
<el-table-column prop="issueDate" label="颁发日期" align="center"> <el-table-column prop="issueDate" label="颁发日期" align="center">
@ -275,7 +210,7 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div>
</div> -->
</div> </div>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="closeDetail"> </el-button> <el-button @click="closeDetail"> </el-button>
@ -285,7 +220,7 @@
</template> </template>
<script> <script>
import { listInfo, getInfo, getfull, delInfo, addInfo, updateInfo } from "@/api/vet/info"
import { listInfo, getInfo, delInfo, addInfo, updateInfo } from "@/api/vet/info"
import request from '@/utils/request' import request from '@/utils/request'
export default { export default {
@ -340,15 +275,30 @@ export default {
form: {}, form: {},
// //
rules: { rules: {
// avatar: [
// { required: true, message: "", trigger: "change" }
// ],
// nickName: [
// { required: true, message: "", trigger: "change" }
// ],
realName: [ realName: [
{required: true, message: "真实姓名不能为空", trigger: "blur"},
{ required: true, message: "真实姓名不能为空", trigger: "blur" },
{ min: 2, max: 10, message: "长度在2到10个字符", trigger: "blur" }, { min: 2, max: 10, message: "长度在2到10个字符", trigger: "blur" },
], ],
gender: [
{ required: true, message: "性别不能为空", trigger: "change" }
specialty: [
{ required: true, message: "擅长领域不能为空", trigger: "blur" },
],
phone: [
{ required: true, message: "手机号不能为空", trigger: "blur" },
],
workExperience: [
{ required: true, message: "工作经验不能为空", trigger: "blur" },
],
expertType: [
{ required: true, message: "专家类型不能为空", trigger: "change" }
], ],
idCard: [ idCard: [
{required: true, message: "身份证号不能为空", trigger: "blur"},
{ required: true, message: "身份证号不能为空", trigger: "blur" },
{ pattern: /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}(\d|X|x)$/, message: "身份证号码不合法", trigger: "blur" }, { pattern: /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}(\d|X|x)$/, message: "身份证号码不合法", trigger: "blur" },
{ min: 1, max: 18, message: "长度在18个字符", trigger: "blur" }, { min: 1, max: 18, message: "长度在18个字符", trigger: "blur" },
] ]
@ -394,6 +344,7 @@ export default {
this.form = { this.form = {
id: null, id: null,
userId: null, userId: null,
nickName: null,
realName: null, realName: null,
avatar: null, avatar: null,
gender: null, gender: null,
@ -427,8 +378,8 @@ export default {
}, },
// //
handleSelectionChange(selection) { handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.ids = selection.map(item => item.userId)
this.single = selection.length !== 1
this.multiple = !selection.length this.multiple = !selection.length
}, },
/** 详情按钮操作 */ /** 详情按钮操作 */
@ -436,8 +387,8 @@ export default {
this.detailVisible = true this.detailVisible = true
this.detailTitle = "兽医详情信息" this.detailTitle = "兽医详情信息"
const id = row.id || this.ids
getfull(id).then(response => {
const id = row.userId || this.ids
getInfo(id).then(response => {
if (response.code === 200) { if (response.code === 200) {
const data = response.data const data = response.data
console.log('详情返回数据:', data) console.log('详情返回数据:', data)
@ -477,13 +428,6 @@ export default {
/** 加载当前用户信息 */ /** 加载当前用户信息 */
loadCurrentUserInfo() { loadCurrentUserInfo() {
// 1使API
// listInfo 仿
// 2使request
// request
request({ request({
url: '/vet/info/current', url: '/vet/info/current',
method: 'get', method: 'get',
@ -517,6 +461,9 @@ export default {
this.form.phone = response.data.phonenumber this.form.phone = response.data.phonenumber
console.log('从用户资料设置手机号:', this.form.phone) console.log('从用户资料设置手机号:', this.form.phone)
} }
if (response.data.avatar && !this.form.avatar) {
this.form.avatar = response.data.avatar
}
// //
if (response.data.nickName && !this.form.nickName) { if (response.data.nickName && !this.form.nickName) {
@ -525,9 +472,6 @@ export default {
if (response.data.email && !this.form.email) { if (response.data.email && !this.form.email) {
this.form.email = response.data.email this.form.email = response.data.email
} }
if (response.data.sex && !this.form.gender) {
this.form.gender = response.data.sex
}
} }
}).catch(error => { }).catch(error => {
console.error('获取用户资料失败:', error) console.error('获取用户资料失败:', error)
@ -572,6 +516,9 @@ export default {
if (personalInfo.gender) { if (personalInfo.gender) {
this.form.gender = personalInfo.gender this.form.gender = personalInfo.gender
} }
if (personalInfo.avatar) {
this.form.avatar = personalInfo.avatar
}
// //
if (data.hasQualifications) { if (data.hasQualifications) {
@ -581,7 +528,7 @@ export default {
/** 修改按钮操作 */ /** 修改按钮操作 */
handleUpdate(row) { handleUpdate(row) {
this.reset() this.reset()
const id = row.id || this.ids
const id = row.userId || this.ids
getInfo(id).then(response => { getInfo(id).then(response => {
this.form = response.data this.form = response.data
this.open = true this.open = true
@ -592,12 +539,11 @@ export default {
submitForm() { submitForm() {
this.$refs["form"].validate(valid => { this.$refs["form"].validate(valid => {
if (valid) { if (valid) {
if (this.form.id != null) {
if (this.form.userId != null) {
updateInfo(this.form).then(response => { updateInfo(this.form).then(response => {
this.$modal.msgSuccess("修改成功") this.$modal.msgSuccess("修改成功")
this.open = false this.open = false
this.getList() this.getList()
this.$router.go(0)
}) })
} else { } else {
addInfo(this.form).then(response => { addInfo(this.form).then(response => {
@ -612,12 +558,12 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const ids = row.id || this.ids const ids = row.id || this.ids
this.$modal.confirm('是否确认删除兽医个人信息编号为"' + ids + '"的数据项?').then(function() {
this.$modal.confirm('是否确认删除兽医个人信息编号为"' + ids + '"的数据项?').then(function () {
return delInfo(ids) return delInfo(ids)
}).then(() => { }).then(() => {
this.getList() this.getList()
this.$modal.msgSuccess("删除成功") this.$modal.msgSuccess("删除成功")
}).catch(() => {})
}).catch(() => { })
}, },
// //
@ -664,16 +610,17 @@ export default {
</script> </script>
<style scoped> <style scoped>
::v-deep .el-descriptions-item__cell{
::v-deep .el-descriptions-item__cell {
width: 90px; width: 90px;
} }
::v-deep .pagestyle .el-input{
::v-deep .pagestyle .el-input {
width: auto !important; width: auto !important;
} }
::v-deep .el-descriptions-row th{
text-align: center !important;color: #7b7c7f;
::v-deep .el-descriptions-row th {
text-align: center !important;
color: #7b7c7f;
} }
::v-deep .el-descriptions .is-bordered .el-descriptions-item__cell { ::v-deep .el-descriptions .is-bordered .el-descriptions-item__cell {
@ -696,7 +643,7 @@ export default {
transform: translateY(-1px); transform: translateY(-1px);
} }
.alter-btn:hover{
.alter-btn:hover {
background-color: rgb(230, 255, 238); background-color: rgb(230, 255, 238);
transform: translateY(-1px); transform: translateY(-1px);
} }

803
chenhai-ui/src/views/vet/qualification/index.vue

@ -2,44 +2,38 @@
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="真实姓名" prop="realName"> <el-form-item label="真实姓名" prop="realName">
<el-input
v-model="queryParams.realName"
placeholder="请输入真实姓名"
clearable
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.realName" placeholder="请输入真实姓名" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="身份证号" prop="idCard"> <el-form-item label="身份证号" prop="idCard">
<el-input
v-model="queryParams.idCard"
placeholder="请输入身份证号"
clearable
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.idCard" placeholder="请输入身份证号" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="资质类型" prop="qualificationType"> <el-form-item label="资质类型" prop="qualificationType">
<el-select
v-model="queryParams.qualificationType"
placeholder="请选择资质类型"
style="width: 100%;"
@keyup.enter.native="handleQuery"
>
<el-option
v-for="dict in dict.type.qualification_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-select v-model="queryParams.qualificationType" placeholder="请选择资质类型" style="width: 100%;"
@keyup.enter.native="handleQuery">
<el-option v-for="dict in dict.type.qualification_type" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- <el-form-item label="资质类型" prop="qualificationType">-->
<!-- <el-input-->
<!-- v-model="queryParams.qualificationType"-->
<!-- placeholder="请输入资质类型"-->
<!-- clearable-->
<!-- @keyup.enter.native="handleQuery"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="证书编号" prop="certificateNo">-->
<!-- <el-input-->
<!-- v-model="queryParams.certificateNo"-->
<!-- placeholder="请输入证书编号"-->
<!-- clearable-->
<!-- @keyup.enter.native="handleQuery"-->
<!-- />-->
<!-- </el-form-item>-->
<el-form-item label="审核状态" prop="auditStatus"> <el-form-item label="审核状态" prop="auditStatus">
<el-select v-model="queryParams.auditStatus" placeholder="审核状态" clearable style="width: 100px">
<el-option
v-for="dict in dict.type.qualification_shenhe"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-select v-model="queryParams.auditStatus" placeholder="审核状态" clearable>
<el-option v-for="dict in dict.type.qualification_shenhe" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -49,298 +43,125 @@
</el-form> </el-form>
<!-- 表格 --> <!-- 表格 -->
<el-table v-loading="loading" :data="qualificationList" @selection-change="handleSelectionChange">
<el-table v-loading="loading" :data="qualificationList" border style="width: 100%">
<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="realName" width="150" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span v-if="scope.row.realName">{{ scope.row.realName }}</span>
<span v-else style="color: #909399">-</span>
</template>
</el-table-column>
<el-table-column label="身份证号" align="center" prop="idCard" width="200">
<template slot-scope="scope">
<span v-if="scope.row.idCard">{{ scope.row.idCard }}</span>
<span v-else style="color: #909399">-</span>
</template>
</el-table-column>
<el-table-column label="资质类型" align="center" prop="qualificationType" width="150">
<template slot-scope="scope">
<span>{{ formatQualificationType(scope.row.qualificationType) }}</span>
</template>
<el-table-column prop="certName" label="证书名称" align="center" width="150" :show-overflow-tooltip="true"/>
<el-table-column prop="certificateNo" label="证书编号" align="center" width="150" :show-overflow-tooltip="true"/>
<el-table-column label="发证机构" align="center" prop="issueOrg" width="150" :show-overflow-tooltip="true" />
<el-table-column label="资质类型" align="center" prop="issueOrg" width="150" :show-overflow-tooltip="true" >
</el-table-column> </el-table-column>
<el-table-column label="申请时间" align="center" prop="applyTime" width="180">
<el-table-column prop="issueDate" label="发证日期" align="center" width="150">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.applyTime">{{ parseTime(scope.row.applyTime, '{y}-{m}-{d}') }}</span>
<span v-else style="color: #909399">-</span>
<span>{{ parseTime(scope.row.issueDate, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="审核时间" align="center" prop="auditTime" width="180">
<el-table-column prop="expireDate" label="到期日期" align="center" width="150">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.auditTime">{{ parseTime(scope.row.auditTime, '{y}-{m}-{d}') }}</span>
<span v-else style="color: #909399">-</span>
<span>{{ parseTime(scope.row.expireDate, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="审核状态" align="center" prop="auditStatus" width="100">
<el-table-column label="证书状态" align="center" prop="certStatus" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag :type="getAuditStatusType(scope.row.auditStatus)" size="small">
{{ getDictLabel('qualification_shenhe', scope.row.auditStatus) }}
<el-tag :type="getCertStatusType(scope.row.certStatus)" size="small">
{{ getCertStatusLabel(scope.row.certStatus) }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="备注" align="center" prop="remark" width="150" :show-overflow-tooltip="true"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="300"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="300">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleView(scope.row)"
v-hasPermi="['vet:qualification:query']"
class="info-btn view-btn"
>详情</el-button>
<el-button v-if="!detailData.auditStatus || detailData.auditStatus === '0' || detailData.auditStatus === '2'"
size="mini" type="text" icon="el-icon-edit" style="color: #42B983" @click="handleUpdate(scope.row)"
v-hasPermi="['vet:qualification:edit']" class="info-btn alter-btn">修改</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </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="openDetail" width="80%" append-to-body>
<div v-if="detailData" style="padding: 20px;">
<!-- 显示实名信息摘要 -->
<el-card class="auth-info-card" style="margin-bottom: 20px; background-color: #f0f9eb;" v-if="authInfo">
<div slot="header" class="clearfix">
<span><i class="el-icon-success" style="color: #67C23A;"></i> 实名认证信息</span>
</div>
<div class="auth-info-content">
<el-row :gutter="20">
<el-col :span="8">
<span class="auth-label">真实姓名</span>
<span class="auth-value">{{ authInfo.realName || detailData.realName || '-' }}</span>
</el-col>
<el-col :span="16">
<span class="auth-label">身份证号</span>
<span class="auth-value">{{ authInfo.maskedIdCard || detailData.idCard || '-' }}</span>
</el-col>
</el-row>
</div>
</el-card>
<div>
<el-alert
v-if="!certificateList || certificateList.length === 0"
title="暂无资质证书"
type="info"
:closable="false"
style="margin-bottom: 20px;"
/>
<el-table v-else :data="certificateList" border style="width: 100%">
<el-table-column type="selection" width="55" align="center" />
<el-table-column prop="certificateNo" label="证书编号" align="center" width="150" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span>{{ scope.row.certificateNo }}</span>
</template>
</el-table-column>
<el-table-column prop="certName" label="证书名称" align="center" width="150" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span>{{ scope.row.certName }}</span>
</template>
</el-table-column>
<el-table-column label="发证机构" align="center" prop="issueOrg" width="150" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span v-if="scope.row.issueOrg">{{ scope.row.issueOrg }}</span>
<span v-else style="color: #909399">-</span>
</template>
</el-table-column>
<el-table-column label="证书文件" prop="certificateFiles" align="center" width="100">
<template slot-scope="scope">
<span v-if="scope.row.certificateFiles">
<template v-if="isImageFile(scope.row.certificateFiles)">
<el-button
type="text"
icon="el-icon-view"
@click="previewCertificate(scope.row.certificateFiles)"
style="color: #409EFF;font-size: 20px"
>
</el-button>
</template>
<template v-else-if="isPdfFile(scope.row.certificateFiles)">
<el-button
type="text"
icon="el-icon-download"
@click="downloadFile(scope.row.certificateFiles)"
style="color: #287c07;font-size: 20px"
>
</el-button>
</template>
<template v-else>
{{ getImageUrl(scope.row.certificateFiles) }}
</template>
</span>
<span v-else style="color: #909399">-</span>
</template>
</el-table-column>
<el-table-column prop="issueDate" label="发证日期" align="center" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.issueDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column prop="expireDate" label="到期日期" align="center" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.expireDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="证书状态" align="center" prop="certStatus" width="100">
<template slot-scope="scope">
<el-tag :type="getCertStatusType(scope.row.certStatus)" size="small">
{{ getCertStatusLabel(scope.row.certStatus) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="300">
<template slot-scope="scope">
<el-button
v-if="!detailData.auditStatus || detailData.auditStatus === '0' || detailData.auditStatus === '2'"
size="mini"
type="text"
icon="el-icon-edit"
style="color: #42B983"
@click="handleUpdate(scope.row)"
v-hasPermi="['vet:qualification:edit']"
class="info-btn alter-btn"
>修改</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="closeDetail"> </el-button>
</div>
</el-dialog>
<!-- 图片预览弹窗 -->
<el-dialog :visible.sync="previewDialogVisible" width="80%" append-to-body>
<div style="text-align: center; padding: 20px;">
<img
:src="getImageUrl(previewFileUrl)"
style="max-width: 100%; max-height: 70vh; height: auto;"
preview-teleported
:preview-src-list="[getImageUrl(previewFileUrl)]"
/>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="closeimage"> </el-button>
</div>
</el-dialog>
<!-- 添加或修改兽医资质弹窗 -->
<el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
<!-- 实名认证提示 -->
<el-alert
v-if="authInfo"
type="success"
:closable="false"
show-icon
style="margin-bottom: 20px;"
>
<span>已通过实名认证姓名和身份证已自动填充并锁定</span>
</el-alert>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<!-- 真实姓名 - 根据实名认证状态决定是否只读 -->
<el-form-item label="真实姓名" prop="realName">
<el-input
v-model="form.realName"
placeholder="请输入真实姓名"
:readonly="realNameReadOnly"
:disabled="realNameReadOnly"
>
<template v-if="realNameReadOnly" slot="suffix">
<el-tooltip content="已通过实名认证" placement="top">
<i class="el-icon-success" style="color: #67C23A; line-height: 32px;"></i>
</el-tooltip>
</template>
</el-input>
</el-form-item>
<!-- 身份证号 - 根据实名认证状态决定是否只读 -->
<el-form-item label="身份证号" prop="idCard">
<el-input
v-model="form.idCard"
placeholder="请输入身份证号"
:readonly="idCardReadOnly"
:disabled="idCardReadOnly"
>
<template v-if="idCardReadOnly" slot="suffix">
<el-tooltip content="已通过实名认证" placement="top">
<i class="el-icon-success" style="color: #67C23A; line-height: 32px;"></i>
</el-tooltip>
</template>
</el-input>
</el-form-item>
<el-form-item label="证书编号" prop="certificateNo">
<el-input v-model="form.certificateNo" placeholder="请输入证书编号" />
</el-form-item>
<el-form-item label="证书名称" prop="certName">
<el-input v-model="form.certName" placeholder="请输入证书名称" />
</el-form-item>
<el-form-item label="发证机构" prop="issueOrg">
<el-input v-model="form.issueOrg" placeholder="请输入发证机构" />
</el-form-item>
<el-form-item label="发证日期" prop="issueDate">
<el-date-picker clearable
v-model="form.issueDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择发证日期"
style="width: 100%">
</el-date-picker>
</el-form-item>
<el-form-item label="到期日期" prop="expireDate">
<el-date-picker clearable
v-model="form.expireDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择到期日期"
style="width: 100%">
</el-date-picker>
</el-form-item>
<el-form-item label="证书文件" prop="certificateFiles">
<file-upload
v-model="form.certificateFiles"
:limit="1"
:file-type="['pdf','png','jpg','jpeg']"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="resubmitForm">重新提交审核</el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<div class="pagestyle">
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
</div> </div>
<!-- 图片预览弹窗 -->
<el-dialog :visible.sync="previewDialogVisible" width="80%" append-to-body>
<div style="text-align: center; padding: 20px;">
<img :src="getImageUrl(previewFileUrl)" style="max-width: 100%; max-height: 70vh; height: auto;" preview-teleported
:preview-src-list="[getImageUrl(previewFileUrl)]" />
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="closeimage"> </el-button>
</div>
</el-dialog>
<!-- 添加或修改兽医资质弹窗-->
<el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<!-- <el-form-item label="真实姓名" prop="realName">-->
<!-- <el-input v-model="form.realName" placeholder="请输入真实姓名" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="身份证号" prop="idCard">-->
<!-- <el-input v-model="form.idCard" placeholder="请输入身份证号" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="资质类型" prop="qualificationType">-->
<!-- <el-select-->
<!-- v-model="form.qualificationType"-->
<!-- placeholder="请选择资质类型"-->
<!-- style="width: 100%;"-->
<!-- >-->
<!-- <el-option-->
<!-- v-for="dict in dict.type.qualification_type"-->
<!-- :key="dict.value"-->
<!-- :label="dict.label"-->
<!-- :value="dict.value"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="证书编号" prop="certificateNo">
<el-input v-model="form.certificateNo" placeholder="请输入证书编号" />
</el-form-item>
<el-form-item label="证书名称" prop="certName">
<el-input v-model="form.certName" placeholder="请输入证书名称" />
</el-form-item>
<el-form-item label="发证机构" prop="issueOrg">
<el-input v-model="form.issueOrg" placeholder="请输入发证机构" />
</el-form-item>
<el-form-item label="发证日期" prop="issueDate">
<el-date-picker clearable v-model="form.issueDate" type="date" value-format="yyyy-MM-dd" placeholder="请选择发证日期"
style="width: 100%">
</el-date-picker>
</el-form-item>
<el-form-item label="到期日期" prop="expireDate">
<el-date-picker clearable v-model="form.expireDate" type="date" value-format="yyyy-MM-dd" placeholder="请选择到期日期"
style="width: 100%">
</el-date-picker>
</el-form-item>
<!-- <el-form-item label="证书图片" prop="certImage">-->
<!-- <image-upload v-model="form.certImage"/>-->
<!-- </el-form-item>-->
<el-form-item label="证书文件" prop="certificateFiles">
<!--&lt;!&ndash; <el-input v-model="form.certificateFiles" type="textarea" placeholder="请输入内容" />&ndash;&gt;-->
<file-upload v-model="form.certificateFiles" :limit="1" :file-type="['pdf', 'png', 'jpg', 'jpeg']" />
</el-form-item>
<!-- <el-form-item label="提前提醒天数" prop="remindDays">-->
<!-- <el-input v-model="form.remindDays" placeholder="请输入提前提醒天数" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="备注" prop="remark">-->
<!-- <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />-->
<!-- </el-form-item>-->
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="resubmitForm">重新提交审核</el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template> </template>
<script> <script>
import {
listQualification,
getQualificationCertificate,
delQualification,
getQualificationCertificates,
updateAndSubmitQualification,
listQualificationCertificates
} from "@/api/vet/qualification"
import { getUserInfo } from "@/api/system/user"
import { listQualification, getQualificationCertificate, delQualification, getQualificationCertificates, updateAndSubmitQualification, listQualificationCertificates } from "@/api/vet/qualification"
export default { export default {
name: "Qualification", name: "Qualification",
@ -375,16 +196,6 @@ export default {
open: false, open: false,
openDetail: false, openDetail: false,
previewDialogVisible: false, previewDialogVisible: false,
// ========== ==========
//
authInfo: null,
//
realNameReadOnly: false,
idCardReadOnly: false,
//
authInfoFetched: false,
// //
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
@ -401,8 +212,17 @@ export default {
}, },
// //
form: {}, form: {},
// -
//
rules: { rules: {
// realName: [
// { required: true, message: "", trigger: "blur" }
// ],
// idCard: [
// { required: true, message: "", trigger: "blur" }
// ],
// qualificationType: [
// { required: true, message: "", trigger: "change" }
// ],
certificateNo: [ certificateNo: [
{ required: true, message: "证书编号不能为空", trigger: "blur" } { required: true, message: "证书编号不能为空", trigger: "blur" }
], ],
@ -424,77 +244,16 @@ export default {
} }
} }
}, },
created() { created() {
this.getList() this.getList()
this.getUserAuthInfo() //
}, },
// ========== watch ==========
watch: {
open(val) {
if (val) {
//
this.$nextTick(() => {
this.fillAuthInfoToForm()
})
}
}
},
methods: { methods: {
// ========== ==========
async getUserAuthInfo() {
if (this.authInfoFetched) return //
try {
const res = await getUserInfo()
if (res.code === 200) {
const userInfo = res.data
//
if (userInfo.authStatus === '已认证' && userInfo.authInfo) {
this.authInfo = userInfo.authInfo
this.realNameReadOnly = true
this.idCardReadOnly = true
this.authInfoFetched = true
console.log('已获取实名认证信息:', this.authInfo)
//
if (this.open) {
this.fillAuthInfoToForm()
}
} else if (userInfo.authStatus === '未认证') {
console.log('用户未完成实名认证')
this.authInfoFetched = true
}
}
} catch (error) {
console.error('获取用户实名信息失败:', error)
}
},
// ========== ==========
fillAuthInfoToForm() {
if (this.authInfo) {
// 使 Vue.set
this.$set(this.form, 'realName', this.authInfo.realName)
this.$set(this.form, 'idCard', this.authInfo.idCard)
//
// this.authInfo.idCard
console.log('已填充实名信息到表单:', this.form.realName, this.form.idCard)
}
},
// //
getList() { getList() {
this.loading = true this.loading = true
listQualification(this.queryParams).then(response => { listQualification(this.queryParams).then(response => {
this.qualificationList = response.rows
this.qualificationList = response.rows[0].certificates
console.log(2222, this.qualificationList);
this.total = response.total this.total = response.total
this.loading = false this.loading = false
}) })
@ -523,10 +282,10 @@ export default {
// //
getAuditStatusType(status) { getAuditStatusType(status) {
const map = { const map = {
'0': 'info',
'1': 'success',
'2': 'danger',
'3': 'warning'
'0': 'info', // -
'1': 'success', // - 绿
'2': 'danger', // -
'3': 'warning' // -
} }
return map[status] || 'info' return map[status] || 'info'
}, },
@ -550,7 +309,7 @@ export default {
// //
isImageFile(filePath) { isImageFile(filePath) {
if (!filePath) return false; if (!filePath) return false;
const imageExts = ['.png','.jpg','.jpeg'];
const imageExts = ['.png', '.jpg', '.jpeg'];
const ext = filePath.substring(filePath.lastIndexOf('.')).toLowerCase(); const ext = filePath.substring(filePath.lastIndexOf('.')).toLowerCase();
return imageExts.includes(ext); return imageExts.includes(ext);
}, },
@ -573,14 +332,108 @@ export default {
const fullUrl = this.getImageUrl(filePath); const fullUrl = this.getImageUrl(filePath);
const link = document.createElement('a'); const link = document.createElement('a');
link.href = fullUrl; link.href = fullUrl;
const fileName = filePath.substring(filePath.lastIndexOf('/') + 1); const fileName = filePath.substring(filePath.lastIndexOf('/') + 1);
link.download = fileName; link.download = fileName;
document.body.appendChild(link); document.body.appendChild(link);
link.click(); link.click();
document.body.removeChild(link); document.body.removeChild(link);
this.$modal.msgSuccess('开始下载文件'); this.$modal.msgSuccess('开始下载文件');
}, },
/** 下架操作 */
// handleUnshelf(row) {
// this.$prompt('', '', {
// confirmButtonText: '',
// cancelButtonText: '',
// inputPlaceholder: '',
// inputValidator: (value) => {
// if (!value || value.trim().length < 2) {
// return '2'
// }
// if (value.trim().length > 200) {
// return '200'
// }
// return true
// }
// }).then(({ value }) => {
// this.loading = true
// unshelfQualification(row.qualificationId, value).then(response => {
// this.loading = false
// if (response.code === 200) {
// this.$modal.msgSuccess('')
// this.getList() //
// } else {
// this.$modal.msgError(response.msg || '')
// }
// }).catch(error => {
// this.loading = false
// this.$modal.msgError(error.msg || '')
// })
// }).catch(() => {
// //
// })
// },
/** 上架操作 */
// handleShelf(row) {
// this.$confirm('', '', {
// confirmButtonText: '',
// cancelButtonText: '',
// type: 'warning'
// }).then(() => {
// this.loading = true
// shelfQualification(row.qualificationId).then(response => {
// this.loading = false
// if (response.code === 200) {
// this.$modal.msgSuccess('')
// this.getList() //
// } else {
// this.$modal.msgError(response.msg || '')
// }
// }).catch(error => {
// this.loading = false
// this.$modal.msgError(error.msg || '')
// })
// }).catch(() => {
// //
// })
// },
/** 提交审核操作 */
// handleSubmitAudit(row) {
// this.$modal.confirm(' "' + row.realName + '" ').then(() => {
// //
// const submitData = {
// qualificationId: row.qualificationId,
// realName: row.realName,
// idCard: row.idCard,
// qualificationType: row.qualificationType,
// certificateNo: row.certificateNo,
// certName: row.certName,
// issueOrg: row.issueOrg,
// issueDate: row.issueDate,
// expireDate: row.expireDate,
// certImage: row.certImage,
// certificateFiles: row.certificateFiles,
// remark: row.remark,
// // (0)
// auditStatus: '0'
// }
//
// return submitQualification(submitData)
// }).then(response => {
// if (response.code === 200) {
// this.$modal.msgSuccess("")
// this.getList()
// } else {
// this.$modal.msgError(response.msg || "")
// }
// }).catch(() => {
// })
// },
// //
resubmitForm() { resubmitForm() {
this.$refs["form"].validate(valid => { this.$refs["form"].validate(valid => {
@ -598,8 +451,8 @@ export default {
const submitData = { const submitData = {
certId: certId, certId: certId,
qualificationId: this.form.qualificationId, qualificationId: this.form.qualificationId,
realName: this.form.realName || (this.authInfo ? this.authInfo.realName : null),
idCard: this.form.idCard || (this.authInfo ? this.authInfo.idCard : null),
realName: this.form.realName,
idCard: this.form.idCard,
qualificationType: this.form.qualificationType, qualificationType: this.form.qualificationType,
certificateNo: this.form.certificateNo, certificateNo: this.form.certificateNo,
certName: this.form.certName, certName: this.form.certName,
@ -652,8 +505,66 @@ export default {
}) })
}, },
/** 查看详情 */
// handleView(row) {
// //
// let detailContent = `
// <table style="width:100%; border-collapse: collapse;">
// <tr>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee; color: #666;"></td>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee;">${row.realName || '-'}</td>
// </tr>
// <tr>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee; color: #666;"></td>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee;">${row.idCard || '-'}</td>
// </tr>
// <tr>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee; color: #666;"></td>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee;">${row.certificateNo || '-'}</td>
// </tr>
// <tr>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee; color: #666;"></td>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee;">${row.certName || '-'}</td>
// </tr>
// <tr>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee; color: #666;"></td>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee;">${row.issueOrg || '-'}</td>
// </tr>
// <tr>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee; color: #666;"></td>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee;">${row.expireDate ? this.parseTime(row.expireDate, '{y}-{m}-{d}') : '-'}</td>
// </tr>
// <tr>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee; color: #666;"></td>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee;">${this.getCertStatusLabel(row.certStatus)}</td>
// </tr>
// <tr>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee; color: #666;"></td>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee;">${this.getDictLabel('qualification_shenhe', row.auditStatus) || '-'}</td>
// </tr>`
//
// //
// if (row.auditOpinion) {
// detailContent += `
// <tr>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee; color: #666;"></td>
// <td style="padding:8px 5px; border-bottom: 1px solid #eee;">${row.auditOpinion}</td>
// </tr>`
// }
//
// detailContent += `</table>`
//
// this.$alert(detailContent, '', {
// dangerouslyUseHTMLString: true,
// confirmButtonText: '',
// width: '550px',
// customClass: 'qualification-detail-dialog'
// })
// },
// //
handleView(row) { handleView(row) {
console.log(1111, row);
this.openDetail = true this.openDetail = true
this.detailData = row this.detailData = row
this.title = "资质证书详情" this.title = "资质证书详情"
@ -674,22 +585,18 @@ export default {
}, },
// //
closeDetail(){
closeDetail() {
this.openDetail = false this.openDetail = false
this.reset() this.reset()
}, },
// closeimage // closeimage
closeimage(){
closeimage() {
this.previewDialogVisible = false this.previewDialogVisible = false
}, },
// ========== reset ==========
//
reset() { reset() {
//
const currentRealName = this.form?.realName
const currentIdCard = this.form?.idCard
this.form = { this.form = {
qualificationId: null, qualificationId: null,
userId: null, userId: null,
@ -716,15 +623,7 @@ export default {
scopeIds: null, scopeIds: null,
scopeNames: null scopeNames: null
} }
this.resetForm("form") this.resetForm("form")
//
if (this.authInfo) {
this.$nextTick(() => {
this.fillAuthInfoToForm()
})
}
}, },
// //
@ -746,30 +645,16 @@ export default {
this.multiple = !selection.length this.multiple = !selection.length
}, },
// ========== handleAdd ==========
async handleAdd() {
//
handleAdd() {
this.reset() this.reset()
this.open = true this.open = true
this.title = "添加兽医资质" this.title = "添加兽医资质"
this.form.auditStatus = null this.form.auditStatus = null
//
if (!this.authInfoFetched) {
await this.getUserAuthInfo()
}
//
this.fillAuthInfoToForm()
if (this.authInfo) {
this.$nextTick(() => {
this.$message.success('已自动填充实名信息')
})
}
}, },
// ========== handleUpdate ==========
async handleUpdate(row) {
//
handleUpdate(row) {
this.reset() this.reset()
let certId = row.certId || row.certificateId || row.id let certId = row.certId || row.certificateId || row.id
if (certId && typeof certId === 'object') { if (certId && typeof certId === 'object') {
@ -782,41 +667,60 @@ export default {
return return
} }
try {
const response = await getQualificationCertificate(certId)
getQualificationCertificate(certId).then(response => {
if (response.code === 200 && response.data) { if (response.code === 200 && response.data) {
this.form = response.data this.form = response.data
//
if (!this.authInfoFetched) {
await this.getUserAuthInfo()
}
//
this.fillAuthInfoToForm()
this.open = true this.open = true
this.title = "修改兽医资质证书信息" this.title = "修改兽医资质证书信息"
} else { } else {
this.$modal.msgError(response.msg || "获取证书信息失败") this.$modal.msgError(response.msg || "获取证书信息失败")
} }
} catch (error) {
}).catch(error => {
console.error('获取证书信息失败:', error) console.error('获取证书信息失败:', error)
this.$modal.msgError("获取证书信息失败") this.$modal.msgError("获取证书信息失败")
}
})
}, },
/** 提交按钮 */
// submitForm() {
// this.$refs["form"].validate(valid => {
// if (valid) {
// if (this.form.qualificationId != null) {
// updateQualification(this.form).then(response => {
// this.$modal.msgSuccess("")
// this.open = false
// this.getList()
// })
// } else {
// this.form.auditStatus = null
// addQualification(this.form).then(response => {
// this.$modal.msgSuccess("")
// this.open = false
// this.getList()
// })
// }
// }
// })
// },
// //
handleDelete(row) { handleDelete(row) {
const qualificationIds = row.qualificationId || this.ids const qualificationIds = row.qualificationId || this.ids
this.$modal.confirm('是否确认删除兽医资质编号为"' + qualificationIds + '"的数据项?').then(function() {
this.$modal.confirm('是否确认删除兽医资质编号为"' + qualificationIds + '"的数据项?').then(function () {
return delQualification(qualificationIds) return delQualification(qualificationIds)
}).then(() => { }).then(() => {
this.getList() this.getList()
this.$modal.msgSuccess("删除成功") this.$modal.msgSuccess("删除成功")
}).catch(() => {})
}).catch(() => { })
}, },
//
// handleExport() {
// this.download('vet/qualification/export', {
// ...this.queryParams
// }, `qualification_${new Date().getTime()}.xlsx`)
// },
// //
getDictLabel(dictType, value) { getDictLabel(dictType, value) {
const dict = this.dict.type[dictType] const dict = this.dict.type[dictType]
@ -843,43 +747,16 @@ export default {
margin: 2px; margin: 2px;
} }
::v-deep .pagestyle .el-input{
width: auto !important;
}
::v-deep .pageway .el-input{
::v-deep .pagestyle .el-input {
width: auto !important; width: auto !important;
} }
::v-deep .pageway .pagination-container{
background-color: #f8fafc;
}
/* 实名信息卡片样式 */
.auth-info-card {
border-radius: 8px;
border-left: 4px solid #67C23A;
}
.auth-info-card .el-card__header {
background-color: #f0f9eb;
border-bottom: 1px solid #e1f3d8;
padding: 12px 20px;
font-weight: 600;
color: #67C23A;
}
.auth-info-content {
padding: 12px 0;
}
.auth-label {
color: #606266;
font-size: 14px;
::v-deep .pageway .el-input {
width: auto !important;
} }
.auth-value {
color: #303133;
font-weight: 500;
font-size: 14px;
::v-deep .pageway .pagination-container {
background-color: #f8fafc;
} }
/* 详情对话框样式 */ /* 详情对话框样式 */
@ -911,7 +788,7 @@ export default {
transform: translateY(-1px); transform: translateY(-1px);
} }
.alter-btn:hover{
.alter-btn:hover {
background-color: rgb(230, 255, 238); background-color: rgb(230, 255, 238);
transform: translateY(-1px); transform: translateY(-1px);
} }

4
chenhai-ui/vue.config.js

@ -10,9 +10,9 @@ const CompressionPlugin = require('compression-webpack-plugin')
const name = process.env.VUE_APP_TITLE || '"与牧同行"' // 网页标题 const name = process.env.VUE_APP_TITLE || '"与牧同行"' // 网页标题
const baseUrl = // 后端接口 const baseUrl = // 后端接口
'http://localhost:8081'
// 'http://localhost:8081'
// 'http://192.168.101.105:8082' // 'http://192.168.101.105:8082'
// 'http://192.168.101.109:8080'
'http://192.168.101.109:8080'
// 'http://192.168.101.111:8081' // 'http://192.168.101.111:8081'

Loading…
Cancel
Save