Browse Source

消息提交修改,兽医资质提交

master
ZhaoYang 3 weeks ago
parent
commit
ab3bc98b58
  1. 13
      chenhai-ui/src/api/vet/qualification.js
  2. 507
      chenhai-ui/src/views/system/vet/aduit/index.vue
  3. 16
      chenhai-ui/src/views/vet/comments/index.vue
  4. 41
      chenhai-ui/src/views/vet/info/index.vue
  5. 351
      chenhai-ui/src/views/vet/notification/index.vue
  6. 54
      chenhai-ui/src/views/vet/qualification/index.vue
  7. 703
      chenhai-ui/src/views/vet/syQualification/index.vue

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

@ -48,13 +48,24 @@ export function auditQualification(data) {
}
// 获取证书列表
export function getQualificationCertificates() {
export function getQualificationCertificates(query) {
return request({
url: '/vet/qualification/certificate/list',
method: 'get',
params: query
})
}
// 证书详情
export function getQualificationCertificatesDetail(id) {
return request({
url: '/vet/qualification/certificate/' + id,
method: 'get',
})
}
// 获取资质类型列表
export function getQualificationTypeOptions() {
return request({

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

@ -55,8 +55,9 @@
<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="['sys:vetAudit:view']">详情</el-button>
<el-button v-if="scope.row.auditStatus!=1" size="mini" type="text" icon="el-icon-check" style="color: #072eed" class="info-btn audit-btn"
@click="handleAudit(scope.row)" v-hasPermi="['sys:vetAudit:auditVetPersonalInfo']">审核</el-button>
<el-button v-if="scope.row.auditStatus != 1" size="mini" type="text" icon="el-icon-check" style="color: #072eed"
class="info-btn audit-btn" @click="handleAudit(scope.row)"
v-hasPermi="['sys:vetAudit:auditVetPersonalInfo']">审核</el-button>
</template>
</el-table-column>
</el-table>
@ -68,7 +69,7 @@
<!-- 审核对话框 -->
<el-dialog :title="auditTitle" :visible.sync="auditVisible" width="80%" append-to-body :close-on-click-modal="false"
class="audit-dialog" @close="closeAuditDialog">
class="audit-dialog" @close="closeAuditDialog" :destroy-on-close="true">
<el-tabs v-model="activeAuditTab" type="border-card">
<!-- 基本信息审核标签页 -->
<el-tab-pane label="基本信息审核" name="basic">
@ -125,7 +126,7 @@
</div>
</el-tab-pane>
<!-- 资质证书审核标签页 -->
<!-- 资质证书审核标签页 - 所有证书统一审核 -->
<el-tab-pane label="资质证书审核" name="certificate">
<div v-if="loadingCertData" class="tab-loading">
<i class="el-icon-loading"></i>
@ -138,14 +139,15 @@
</div>
<div v-else>
<div class="cert-summary" v-if="certificateList.length > 0">
<el-alert :title="getCertSummaryText()" type="info" :closable="false" show-icon />
<div class="cert-summary">
<el-alert :title="`共 ${certificateList.length} 个资质证书待审核`" type="info" :closable="false" show-icon />
</div>
<el-tabs v-model="activeCertTab" type="card" class="cert-tabs">
<el-tab-pane v-for="(cert, index) in certificateList" :key="cert.qualificationId"
:label="cert.certName || cert.qualificationType || `证书${index + 1}`"
:name="'cert' + cert.qualificationId">
<!-- 证书列表展示 -->
<div class="cert-list-section">
<h3>证书列表</h3>
<div v-for="(cert, index) in certificateList" :key="cert.qualificationId + '_' + index"
class="certificate-item-wrapper">
<div class="certificate-item" :class="{ 'cert-audited': cert.auditStatus && cert.auditStatus !== '0' }">
<div class="cert-header">
<div class="cert-title">
@ -199,37 +201,35 @@
</div>
</div>
</div>
<div class="cert-audit-form">
<el-form :ref="'certForm' + cert.qualificationId" :model="certAuditForms[cert.qualificationId]"
:rules="certAuditRules" label-width="100px">
<el-form-item label="审核结果" prop="auditStatus">
<el-radio-group v-model="certAuditForms[cert.qualificationId].auditStatus"
@change="handleCertAuditChange(cert.qualificationId)">
<el-radio label="1">审核通过</el-radio>
<el-radio label="2">审核不通过</el-radio>
</el-radio-group>
<span v-if="cert.auditStatus && cert.auditStatus !== '0'" class="audit-status-tag">
<dict-tag :options="dict.type.audit_status" :value="cert.auditStatus" />
</span>
</el-form-item>
<el-form-item label="审核意见" prop="auditOpinion"
v-if="certAuditForms[cert.qualificationId].auditStatus === '2'">
<el-input v-model="certAuditForms[cert.qualificationId].auditOpinion" type="textarea" :rows="4"
placeholder="请输入审核意见" :maxlength="200" show-word-limit />
</el-form-item>
</el-form>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
<!-- 统一审核表单 -->
<div class="cert-unified-audit-section">
<div class="audit-form-section">
<h3>资质证书统一审核</h3>
<el-form ref="certAuditForm" :model="certAuditForm" :rules="certAuditRules" label-width="100px">
<el-form-item label="审核结果" prop="auditStatus">
<el-radio-group v-model="certAuditForm.auditStatus" @change="handleCertAuditChange">
<el-radio label="1">全部审核通过</el-radio>
<el-radio label="2">审核不通过</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="审核意见" prop="auditOpinion" v-if="certAuditForm.auditStatus === '2'">
<el-input v-model="certAuditForm.auditOpinion" type="textarea" :rows="4"
placeholder="请输入审核意见(将应用于所有证书)" :maxlength="500" show-word-limit />
</el-form-item>
</el-form>
</div>
</div>
</div>
</div>
</el-tab-pane>
</el-tabs>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitAllAudit" :loading="submittingAll" :disabled="!isAllAuditSelected">
<el-button type="primary" @click="submitAllAudit" :loading="submittingAll" :disabled="!isAllAuditSelected || submittingAll">
{{ submittingAll ? '提交中...' : '提交审核' }}
</el-button>
<el-button @click="auditVisible = false"> </el-button>
@ -237,7 +237,7 @@
</el-dialog>
<!-- 详情对话框 -->
<el-dialog :title="detailTitle" :visible.sync="detailVisible" width="80%" append-to-body>
<el-dialog :title="detailTitle" :visible.sync="detailVisible" width="80%" append-to-body :destroy-on-close="true">
<div v-if="loadingDetail" class="tab-loading">
<i class="el-icon-loading"></i>
<div>加载详情信息...</div>
@ -280,64 +280,61 @@
<div class="certificate-section">
<h3>资质证书列表 {{ detailCertificates.length }} 个证书</h3>
<el-tabs v-model="detailCertActiveTab" type="card" class="cert-tabs">
<el-tab-pane v-for="(cert, index) in detailCertificates" :key="cert.qualificationId"
:label="cert.certName || cert.qualificationType || `证书${index + 1}`"
:name="'detailCert' + cert.qualificationId">
<div class="certificate-item view-only">
<div class="cert-header">
<div class="cert-title">
<span>{{ cert.certName || cert.qualificationType || '未命名证书' }}</span>
<dict-tag :options="dict.type.audit_status" :value="cert.auditStatus" class="cert-status-tag" />
<div v-for="(cert, index) in detailCertificates" :key="cert.qualificationId + '_detail_' + index"
class="certificate-item-wrapper">
<div class="certificate-item view-only">
<div class="cert-header">
<div class="cert-title">
<span>{{ cert.certName || cert.qualificationType || `证书${index + 1}` }}</span>
<dict-tag :options="dict.type.audit_status" :value="cert.auditStatus" class="cert-status-tag" />
</div>
<div class="cert-info">
<span><strong>证书编号</strong>{{ cert.certificateNo || '-' }}</span>
<span><strong>发证机构</strong>{{ cert.issueOrg || '-' }}</span>
<span><strong>资质类型</strong>
<dict-tag :options="dict.type.qualification_type" :value="cert.qualificationType" />
</span>
<span><strong>经营范围</strong>
<div class="jyfw">
<dict-tag style="display: grid;grid-template-columns: 1fr 1fr; row-gap: 5px;"
:options="dict.type.scope_names" :value="cert.scopeIds" />
</div>
</span>
<span><strong>颁发日期</strong>{{ parseTime(cert.issueDate, '{y}-{m}-{d}') || '-' }}</span>
<span><strong>到期日期</strong>{{ parseTime(cert.expireDate, '{y}-{m}-{d}') || '-' }}</span>
<span><strong>审核意见</strong>{{ cert.auditOpinion || '-' }}</span>
<span><strong>审核时间</strong>{{ parseTime(cert.auditTime) || '-' }}</span>
</div>
<div v-if="cert.certImage" class="cert-image-section">
<div class="image-title">
<strong>证书图片</strong>
</div>
<div class="cert-info">
<span><strong>证书编号</strong>{{ cert.certificateNo || '-' }}</span>
<span><strong>发证机构</strong>{{ cert.issueOrg || '-' }}</span>
<span><strong>资质类型</strong>
<dict-tag :options="dict.type.qualification_type" :value="cert.qualificationType" />
</span>
<span><strong>经营范围</strong>
<div class="jyfw">
<dict-tag style="display: grid;grid-template-columns: 1fr 1fr; row-gap: 5px;"
:options="dict.type.scope_names" :value="cert.scopeIds" />
<div class="image-preview">
<el-image style="width: 200px; height: 150px;" :src="baseUrl + cert.certImage"
:preview-src-list="[baseUrl + cert.certImage]" fit="contain">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
<div>图片加载失败</div>
</div>
</span>
<span><strong>颁发日期</strong>{{ parseTime(cert.issueDate, '{y}-{m}-{d}') || '-' }}</span>
<span><strong>到期日期</strong>{{ parseTime(cert.expireDate, '{y}-{m}-{d}') || '-' }}</span>
<span><strong>审核意见</strong>{{ cert.auditOpinion || '-' }}</span>
<span><strong>审核时间</strong>{{ parseTime(cert.auditTime) || '-' }}</span>
</el-image>
</div>
</div>
<div v-if="cert.certImage" class="cert-image-section">
<div class="image-title">
<strong>证书图片</strong>
</div>
<div class="image-preview">
<el-image style="width: 200px; height: 150px;" :src="baseUrl + cert.certImage"
:preview-src-list="[baseUrl + cert.certImage]" fit="contain">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
<div>图片加载失败</div>
</div>
</el-image>
</div>
<div v-if="cert.certificateFiles" class="cert-files-section">
<div class="files-title">
<strong>其他附件</strong>
</div>
<div v-if="cert.certificateFiles" class="cert-files-section">
<div class="files-title">
<strong>其他附件</strong>
</div>
<div class="files-list">
<el-button type="text" icon="el-icon-download" @click="downloadFile(cert.certificateFiles)"
class="download-btn">
{{ getFileName(cert.certificateFiles) }}
</el-button>
</div>
<div class="files-list">
<el-button type="text" icon="el-icon-download" @click="downloadFile(cert.certificateFiles)"
class="download-btn">
{{ getFileName(cert.certificateFiles) }}
</el-button>
</div>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
</div>
</el-tab-pane>
</el-tabs>
@ -374,13 +371,10 @@ export default {
loadingDetail: false,
detailActiveTab: "basicInfo",
detailCertificates: [],
loadingCertDetail: false,
detailCertActiveTab: null,
auditTitle: "",
auditVisible: false,
activeAuditTab: "basic",
activeCertTab: null,
currentVetId: null,
currentUserId: null,
@ -399,16 +393,17 @@ export default {
},
certificateList: [],
certAuditForms: {},
//
certAuditForm: {
auditStatus: "",
auditOpinion: ""
},
certAuditRules: {
auditStatus: [
{ required: true, message: "请选择审核结果", trigger: "change" }
{ required: true, message: "请选择证书审核结果", trigger: "change" }
]
},
imagePreviewVisible: false,
previewImageUrl: "",
queryParams: {
pageNum: 1,
pageSize: 10,
@ -444,41 +439,17 @@ export default {
return false
}
// 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
}
if (!this.certAuditForm.auditStatus ||
(this.certAuditForm.auditStatus !== '1' && this.certAuditForm.auditStatus !== '2')) {
return false
}
}
return true
}
},
watch: {
//
'basicAuditForm.auditStatus': {
handler() {
this.$nextTick(() => {
//
})
},
deep: true
},
//
certAuditForms: {
handler() {
this.$nextTick(() => {
//
})
},
deep: true
}
},
created() {
this.getList()
},
@ -495,6 +466,12 @@ export default {
},
handleAudit(row) {
//
if (this.submittingAll) {
this.$message.warning('正在提交审核,请稍后...')
return
}
this.resetAuditData()
const id = row.id || this.ids[0]
@ -549,32 +526,25 @@ export default {
if (certResponse.code === 200) {
this.certificateList = certResponse.rows || []
if (this.certificateList.length > 0) {
if (this.certificateList.length > 0) {
this.activeCertTab = 'cert' + this.certificateList[0].qualificationId
//
const allCertAudited = this.certificateList.every(cert =>
cert.auditStatus && cert.auditStatus !== '0'
)
const allCertSameStatus = this.certificateList.length > 0 &&
this.certificateList.every(cert => cert.auditStatus === this.certificateList[0].auditStatus)
//
if (allCertAudited && allCertSameStatus && this.certificateList.length > 0) {
this.certAuditForm = {
auditStatus: this.certificateList[0].auditStatus,
auditOpinion: this.certificateList[0].auditOpinion || ""
}
}
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
}
} else {
this.certAuditForm = {
auditStatus: "",
auditOpinion: ""
}
})
this.certAuditForms = forms
}
} else {
this.$message.error(certResponse.msg || '加载证书列表失败')
}
@ -596,16 +566,22 @@ export default {
}
},
handleCertAuditChange(qualificationId) {
handleCertAuditChange(e) {
console.log(e);
//
if (this.certAuditForms[qualificationId].auditStatus === '1') {
this.certAuditForms[qualificationId].auditOpinion = ''
if (this.certAuditForm.auditStatus === '1') {
this.certAuditForm.auditOpinion = ''
}
//
this.certAuditForms[qualificationId].audited = true
},
submitAllAudit() {
//
async submitAllAudit() {
//
if (this.submittingAll) {
// this.$message.warning('')
return
}
//
if (!this.basicAuditForm.auditStatus ||
(this.basicAuditForm.auditStatus !== '1' && this.basicAuditForm.auditStatus !== '2')) {
@ -615,125 +591,76 @@ export default {
}
//
if (this.basicAuditForm.auditStatus === '2' && !this.basicAuditForm.auditDesc) {
if (this.basicAuditForm.auditStatus === '2' && (!this.basicAuditForm.auditDesc || this.basicAuditForm.auditDesc.trim() === '')) {
this.$message.warning('审核不通过时,请填写审核意见')
this.activeAuditTab = 'basic'
return
}
//
//
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)
}
}
//
if (unselectedCertNames.length > 0) {
const message = `请为以下证书选择审核结果:${unselectedCertNames.join('、')}`
this.$message.warning(message)
if (!this.certAuditForm.auditStatus ||
(this.certAuditForm.auditStatus !== '1' && this.certAuditForm.auditStatus !== '2')) {
this.$message.warning('请选择证书审核结果')
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
}
//
if (invalidOpinionCertNames.length > 0) {
const message = `以下证书审核不通过,请填写审核意见:${invalidOpinionCertNames.join('、')}`
this.$message.warning(message)
//
if (this.certAuditForm.auditStatus === '2' && (!this.certAuditForm.auditOpinion || this.certAuditForm.auditOpinion.trim() === '')) {
this.$message.warning('证书审核不通过时,请填写审核意见')
this.activeAuditTab = 'certificate'
//
const firstInvalidCert = this.certificateList.find(cert => {
const form = this.certAuditForms[cert.qualificationId]
return form && form.auditStatus === '2' && !form.auditOpinion
})
if (firstInvalidCert) {
this.activeCertTab = 'cert' + firstInvalidCert.qualificationId
}
return
}
}
this.submittingAll = true
//
const basicAuditData = {
id: this.currentVetId,
auditStatus: this.basicAuditForm.auditStatus,
auditDesc: this.basicAuditForm.auditDesc
}
try {
//
const basicAuditData = {
id: this.currentVetId,
auditStatus: this.basicAuditForm.auditStatus,
auditDesc: this.basicAuditForm.auditDesc || ''
}
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))
})
const basicResult = await auditBasicInfo(basicAuditData)
if (basicResult.code !== 200) {
throw new Error(basicResult.msg || '基本信息审核提交失败')
}
//
if (this.certificateList && this.certificateList.length > 0) {
// 使 Promise.all
const certPromises = this.certificateList.map(cert => {
const certAuditData = {
qualificationId: cert.qualificationId,
auditStatus: this.certAuditForm.auditStatus,
auditOpinion: this.certAuditForm.auditOpinion || ''
}
return auditCertificate(certAuditData)
})
return Promise.all(certPromises)
const certResults = await Promise.all(certPromises)
//
const failedCert = certResults.find(result => result.code !== 200)
if (failedCert) {
throw new Error(failedCert.msg || '部分证书审核提交失败')
}
return Promise.resolve()
} else {
throw new Error(response.msg || '基本信息审核提交失败')
}
}).then(results => {
this.$message.success('审核提交成功')
//
this.$modal.msgSuccess('审核提交成功')
this.auditVisible = false
this.getList()
}).catch(error => {
} catch (error) {
console.error('提交失败:', error)
this.$message.error(error.message || '提交失败')
}).finally(() => {
this.$modal.msgError(error.message || '提交失败')
} finally {
this.submittingAll = false
})
},
getCertSummaryText() {
if (!this.certificateList || this.certificateList.length === 0) {
return '暂无资质证书'
}
let selectedCount = 0
this.certificateList.forEach(cert => {
const form = this.certAuditForms[cert.qualificationId]
if (form && form.auditStatus &&
(form.auditStatus === '1' || form.auditStatus === '2')) {
selectedCount++
}
})
const totalCount = this.certificateList.length
if (selectedCount === totalCount) {
return `${totalCount} 个证书,所有证书均已选择审核结果`
} else {
return `${totalCount} 个证书,已选择审核结果 ${selectedCount} 个,还有 ${totalCount - selectedCount} 个证书未选择`
}
},
@ -744,26 +671,39 @@ export default {
auditDesc: ""
}
this.certificateList = []
this.certAuditForms = {}
this.certAuditForm = {
auditStatus: "",
auditOpinion: ""
}
this.currentVetId = null
this.currentUserId = null
this.activeCertTab = null
this.loadingBasicData = false
this.loadingCertData = false
},
closeAuditDialog() {
//
if (this.submittingAll) {
this.$message.warning('正在提交审核,请稍后...')
return
}
this.resetAuditData()
},
handleView(row) {
//
if (this.submittingAll) {
this.$message.warning('请等待当前操作完成')
return
}
this.detailVisible = true
this.detailTitle = "兽医详情信息"
this.loadingDetail = true
this.detailActiveTab = "basicInfo"
this.detailCertificates = []
const id = row.id || this.ids[0]
const id = row.id
getInfo(id).then(response => {
if (response.code === 200) {
this.detailData = response.data
@ -778,9 +718,6 @@ export default {
listQualification(queryParams).then(certResponse => {
if (certResponse.code === 200) {
this.detailCertificates = certResponse.rows || []
if (this.detailCertificates.length > 0) {
this.detailCertActiveTab = 'detailCert' + this.detailCertificates[0].qualificationId
}
}
}).catch(error => {
console.error('加载证书详情失败:', error)
@ -1000,23 +937,11 @@ export default {
}
}
.cert-tabs {
margin-top: 15px;
.certificate-item-wrapper {
margin-bottom: 20px;
:deep(.el-tabs__header) {
margin-bottom: 10px;
}
:deep(.el-tabs__item) {
font-weight: 500;
padding: 0 15px;
height: 36px;
line-height: 36px;
&.is-active {
background-color: #ecf5ff;
border-bottom-color: #ecf5ff;
}
&:last-child {
margin-bottom: 0;
}
}
@ -1068,6 +993,27 @@ export default {
}
}
.cert-list-section {
margin-top: 30px;
h3 {
margin-bottom: 15px;
color: #303133;
font-size: 16px;
font-weight: 600;
padding-bottom: 8px;
border-bottom: 2px solid #67C23A;
}
}
.cert-unified-audit-section {
margin-top: 20px;
padding: 20px;
background-color: #f8f9fa;
border-radius: 8px;
border: 1px solid #e4e7ed;
}
.certificate-section {
h3 {
margin-bottom: 15px;
@ -1082,7 +1028,6 @@ export default {
.certificate-item {
border: 1px solid #ebeef5;
border-radius: 6px;
margin-bottom: 15px;
padding: 20px;
background-color: #fff;
transition: all 0.3s ease;
@ -1228,28 +1173,12 @@ export default {
}
}
.cert-audit-form {
margin-top: 20px;
padding-top: 20px;
border-top: 1px dashed #ebeef5;
}
.audit-saved-tag {
margin-left: 15px;
.el-tag {
font-weight: 500;
background-color: rgba(103, 194, 58, 0.1);
border-color: rgba(103, 194, 58, 0.2);
}
}
.cert-summary {
margin-bottom: 20px;
padding: 15px;
background-color: #f8f9fa;
border-radius: 6px;
border-left: 4px solid #409EFF;
.el-alert {
border-radius: 6px;
}
}
.no-data {
@ -1436,4 +1365,4 @@ export default {
color: white;
}
}
</style>
</style>

16
chenhai-ui/src/views/vet/comments/index.vue

@ -26,27 +26,27 @@
<!-- 表格 -->
<el-table v-loading="loading" :data="commentsList" @selection-change="handleSelectionChange">
<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" >
<template slot-scope="scope">
<image-preview :src="scope.row.avatar" :width="50" :height="50" />
</template>
</el-table-column>
<el-table-column label="回复者" align="center" prop="replyName" width="150"/>
<el-table-column label="职称" align="center" prop="title" width="150"/>
<el-table-column label="从属医院" align="center" prop="hospital" width="150" :show-overflow-tooltip="true"/>
<el-table-column label="回复者" align="center" prop="replyName" />
<el-table-column label="职称" align="center" prop="title" />
<el-table-column label="从属医院" align="center" prop="hospital" :show-overflow-tooltip="true"/>
<el-table-column label="从业经验" align="center" prop="experience"/>
<el-table-column label="回复内容" align="center" prop="content" width="150" :show-overflow-tooltip="true"/>
<el-table-column label="回复图片" align="center" prop="images" width="100">
<el-table-column label="回复内容" align="center" prop="content" :show-overflow-tooltip="true"/>
<el-table-column label="回复图片" align="center" prop="images" >
<template slot-scope="scope">
<image-preview :src="scope.row.images" :width="50" :height="50" />
</template>
</el-table-column>
<el-table-column label="回复时间" align="center" prop="updatedAt" width="180">
<el-table-column label="回复时间" align="center" prop="updatedAt" >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</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">
<el-button
size="mini"

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

@ -117,9 +117,9 @@
<el-form-item label="职称" prop="title">
<el-input v-model="form.title" placeholder="请输入职称" />
</el-form-item>
<el-form-item label="手机号" prop="phone">
<el-input v-model="form.phone" placeholder="请输入手机号" />
</el-form-item>
<!-- <el-form-item label="手机号" prop="phonenumber">
<el-input v-model="form.phonenumber" placeholder="请输入手机号" />
</el-form-item> -->
<el-form-item label="电子邮箱" prop="email">
<el-input v-model="form.email" placeholder="请输入电子邮箱" />
</el-form-item>
@ -128,9 +128,9 @@
<el-option v-for="dict in dict.type.expert_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="身份证号" prop="idCard" minlength="18" maxlength="18">
<!-- <el-form-item label="身份证号" prop="idCard" minlength="18" maxlength="18">
<el-input v-model="form.idCard" placeholder="请输入身份证号" />
</el-form-item>
</el-form-item> -->
<el-form-item label="擅长领域" prop="specialty">
<el-input v-model="form.specialty" placeholder="请输入内容" />
</el-form-item>
@ -167,7 +167,7 @@
<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.phone || '-' }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ detailData.phonenumber || '-' }}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{ detailData.email || '-' }}</el-descriptions-item>
<el-descriptions-item label="专家类型">
<dict-tag :options="dict.type.expert_type" :value="detailData.expertType" />
@ -275,12 +275,12 @@ export default {
form: {},
//
rules: {
// avatar: [
// { required: true, message: "", trigger: "change" }
// ],
// nickName: [
// { required: true, message: "", trigger: "change" }
// ],
avatar: [
{ required: true, message: "头像不能为空", trigger: "change" }
],
nickName: [
{ required: true, message: "用户昵称不能为空", trigger: "change" }
],
realName: [
{ required: true, message: "真实姓名不能为空", trigger: "blur" },
{ min: 2, max: 10, message: "长度在2到10个字符", trigger: "blur" },
@ -288,20 +288,20 @@ export default {
specialty: [
{ required: true, message: "擅长领域不能为空", trigger: "blur" },
],
phone: [
{ required: true, message: "手机号不能为空", trigger: "blur" },
],
// phonenumber: [
// { required: true, message: "", trigger: "blur" },
// ],
workExperience: [
{ required: true, message: "工作经验不能为空", trigger: "blur" },
],
expertType: [
{ required: true, message: "专家类型不能为空", trigger: "change" }
],
idCard: [
{ 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" },
{ min: 1, max: 18, message: "长度在18个字符", trigger: "blur" },
]
// idCard: [
// { 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" },
// { min: 1, max: 18, message: "18", trigger: "blur" },
// ]
}
}
},
@ -531,6 +531,7 @@ export default {
const id = row.userId || this.ids
getInfo(id).then(response => {
this.form = response.data
console.log(66666,this.form);
this.open = true
this.title = "修改兽医个人信息"
})

351
chenhai-ui/src/views/vet/notification/index.vue

@ -2,118 +2,104 @@
<div class="app-container">
<!-- 搜索部分 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<!-- <el-form-item label="接收用户ID" prop="userId">-->
<!-- <el-input-->
<!-- v-model="queryParams.userId"-->
<!-- placeholder="请输入接收用户ID"-->
<!-- clearable-->
<!-- @keyup.enter.native="handleQuery"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="接收用户ID" prop="userId">-->
<!-- <el-input-->
<!-- v-model="queryParams.userId"-->
<!-- placeholder="请输入接收用户ID"-->
<!-- clearable-->
<!-- @keyup.enter.native="handleQuery"-->
<!-- />-->
<!-- </el-form-item>-->
<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 label="关联ID" prop="relatedId">-->
<!-- <el-input-->
<!-- v-model="queryParams.relatedId"-->
<!-- placeholder="请输入关联ID"-->
<!-- clearable-->
<!-- @keyup.enter.native="handleQuery"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="关联ID" prop="relatedId">-->
<!-- <el-input-->
<!-- v-model="queryParams.relatedId"-->
<!-- placeholder="请输入关联ID"-->
<!-- clearable-->
<!-- @keyup.enter.native="handleQuery"-->
<!-- />-->
<!-- </el-form-item>-->
<el-form-item label="是否已读" prop="isRead">
<el-select
v-model="queryParams.isRead"
placeholder="请选择是否已读"
clearable
style="width: 180px"
>
<el-select v-model="queryParams.isRead" placeholder="请选择是否已读" clearable style="width: 180px">
<el-option label="未读" value="0" />
<el-option label="已读" value="1" />
</el-select>
</el-form-item>
<el-form-item label="提醒级别" prop="remindLevel">
<el-select
v-model="queryParams.remindLevel"
placeholder="请选择提醒级别"
clearable
style="width: 180px"
>
<el-select v-model="queryParams.remindLevel" placeholder="请选择提醒级别" clearable style="width: 180px">
<el-option label="一般通知" value="1" />
<el-option label="重要通知" value="2" />
<el-option label="紧急通知" value="3" />
</el-select>
</el-form-item>
<!-- <el-form-item label="阅读时间" prop="readTime">-->
<!-- <el-date-picker clearable-->
<!-- v-model="queryParams.readTime"-->
<!-- type="date"-->
<!-- value-format="yyyy-MM-dd"-->
<!-- placeholder="请选择阅读时间">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="阅读时间" prop="readTime">-->
<!-- <el-date-picker clearable-->
<!-- v-model="queryParams.readTime"-->
<!-- type="date"-->
<!-- value-format="yyyy-MM-dd"-->
<!-- placeholder="请选择阅读时间">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- <el-row :gutter="10" class="mb8">-->
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="primary"-->
<!-- plain-->
<!-- icon="el-icon-plus"-->
<!-- size="mini"-->
<!-- @click="handleAdd"-->
<!-- v-hasPermi="['vet:notification: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:notification: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:notification:remove']"-->
<!-- >删除</el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="warning"-->
<!-- plain-->
<!-- icon="el-icon-download"-->
<!-- size="mini"-->
<!-- @click="handleExport"-->
<!-- v-hasPermi="['system:notification:export']"-->
<!-- >导出</el-button>-->
<!-- </el-col>-->
<!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>-->
<!-- </el-row>-->
<!-- <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:notification: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:notification: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:notification:remove']"-->
<!-- >删除</el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="warning"-->
<!-- plain-->
<!-- icon="el-icon-download"-->
<!-- size="mini"-->
<!-- @click="handleExport"-->
<!-- v-hasPermi="['system:notification:export']"-->
<!-- >导出</el-button>-->
<!-- </el-col>-->
<!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>-->
<!-- </el-row>-->
<!-- 消息轮播 -->
<div class="carousel-container" v-if="unreadCarouselList.length > 0">
<el-carousel height="100px" direction="vertical" autoplay :interval="3000" indicator-position="none" class="vertical-carousel">
<el-carousel height="100px" direction="vertical" autoplay :interval="3000" indicator-position="none"
class="vertical-carousel">
<el-carousel-item v-for="item in unreadCarouselList" :key="item.id">
<div class="carousel-item" :style="{'background-color': getCarouselBgColor(item.remindLevel)}">
<div class="carousel-item" :style="{ 'background-color': getCarouselBgColor(item.remindLevel) }">
<div class="carousel-wrap">
<img class="info-icon" :src="require('@/assets/images/xiaoxi.png')">
<div class="content-wrapper">
@ -135,23 +121,23 @@
<!-- 表格部分 -->
<el-table v-loading="loading" :data="notificationList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column type="index" width="55" align="center" label="序号"/>-->
<!-- <el-table-column label="主键ID" align="center" prop="id" />-->
<!-- <el-table-column label="接收用户ID" align="center" prop="userId" />-->
<el-table-column label="通知标题" align="center" prop="title" width="200"/>
<el-table-column label="通知内容" align="center" prop="content" width="300">
<!-- <el-table-column type="index" width="55" align="center" label="序号"/>-->
<!-- <el-table-column label="主键ID" align="center" prop="id" />-->
<!-- <el-table-column label="接收用户ID" align="center" prop="userId" />-->
<el-table-column label="通知标题" align="center" prop="title" />
<el-table-column label="通知内容" align="center" prop="content" >
<template #default="scope">
<div v-html="scope.row.content"></div>
</template>
</el-table-column>
<el-table-column label="通知类型" align="center" prop="type" width="150">
<el-table-column label="通知类型" align="center" prop="type" >
<template #default="scope">
<el-tag :type="scope.row.type === 'CERT_EXPIRE_REMIND' ? 'danger': 'primary'">
{{ scope.row.type === 'CERT_EXPIRE_REMIND' ? '证书过期提醒' : scope.row.type}}
<el-tag :type="scope.row.type === 'CERT_EXPIRE_REMIND' ? 'danger' : 'primary'">
{{ scope.row.type === 'CERT_EXPIRE_REMIND' ? '证书过期提醒' : scope.row.type }}
</el-tag>
</template>
</el-table-column>
<!-- <el-table-column label="关联ID" align="center" prop="relatedId" />-->
<!-- <el-table-column label="关联ID" align="center" prop="relatedId" />-->
<el-table-column label="是否已读" align="center" prop="isRead">
<template #default="scope">
<el-tag :type="scope.row.isRead === 1 ? 'success' : 'info'">
@ -159,98 +145,85 @@
</el-tag>
</template>
</el-table-column>
<el-table-column label="提醒级别" align="center" prop="remindLevel" width="100">
<el-table-column label="提醒级别" align="center" prop="remindLevel" >
<template #default="scope">
<el-tag
:type="scope.row.remindLevel === 3 ? 'danger' :
scope.row.remindLevel === 2 ? 'warning' : 'success'">
<el-tag :type="scope.row.remindLevel === 3 ? 'danger' :
scope.row.remindLevel === 2 ? 'warning' : 'success'">
{{ scope.row.remindLevel === 3 ? '紧急通知' :
scope.row.remindLevel === 2 ? '重要通知' : '一般通知' }}
scope.row.remindLevel === 2 ? '重要通知' : '一般通知' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="阅读时间" align="center" prop="readTime" width="100">
<!-- <el-table-column label="阅读时间" align="center" prop="readTime" >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.readTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="300">
</el-table-column> -->
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" >
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-circle-check"
style="color: #32a370"
class="info-btn read-btn"
@click="handleMarkRead(scope.row)"
v-hasPermi="['vet:certificate:edit']"
v-show="scope.row.isRead === 0"
>标记已读</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:certificate: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:certificate:remove']"-->
<!-- >删除</el-button>-->
<el-button size="mini" type="text" icon="el-icon-circle-check" style="color: #32a370" class="info-btn read-btn"
@click="handleMarkRead(scope.row)" v-hasPermi="['vet:certificate:edit']"
v-show="scope.row.isRead === 0">去更新</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:certificate: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:certificate:remove']"-->
<!-- >删除</el-button>-->
</template>
</el-table-column>
</el-table>
<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" />
<!-- 添加或修改兽医通知对话框 -->
<!-- <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>-->
<!-- <el-form ref="form" :model="form" :rules="rules" label-width="80px">-->
<!--&lt;!&ndash; <el-form-item label="接收用户ID" prop="userId">&ndash;&gt;-->
<!--&lt;!&ndash; <el-input v-model="form.userId" placeholder="请输入接收用户ID" />&ndash;&gt;-->
<!--&lt;!&ndash; </el-form-item>&ndash;&gt;-->
<!-- <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>-->
<!--&lt;!&ndash; <el-form-item label="关联ID" prop="relatedId">&ndash;&gt;-->
<!--&lt;!&ndash; <el-input v-model="form.relatedId" placeholder="请输入关联ID" />&ndash;&gt;-->
<!--&lt;!&ndash; </el-form-item>&ndash;&gt;-->
<!-- <el-form-item label="是否已读 0:未读 1:已读" prop="isRead">-->
<!-- <el-input v-model="form.isRead" placeholder="请输入是否已读 0:未读 1:已读" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="提醒级别 1:一般通知 2:重要通知 3:紧急通知" prop="remindLevel">-->
<!-- <el-input v-model="form.remindLevel" placeholder="请输入提醒级别 1:一般通知 2:重要通知 3:紧急通知" />-->
<!-- </el-form-item>-->
<!--&lt;!&ndash; <el-form-item label="阅读时间" prop="readTime">&ndash;&gt;-->
<!--&lt;!&ndash; <el-date-picker clearable&ndash;&gt;-->
<!--&lt;!&ndash; v-model="form.readTime"&ndash;&gt;-->
<!--&lt;!&ndash; type="date"&ndash;&gt;-->
<!--&lt;!&ndash; value-format="yyyy-MM-dd"&ndash;&gt;-->
<!--&lt;!&ndash; placeholder="请选择阅读时间">&ndash;&gt;-->
<!--&lt;!&ndash; </el-date-picker>&ndash;&gt;-->
<!--&lt;!&ndash; </el-form-item>&ndash;&gt;-->
<!-- </el-form>-->
<!-- <div slot="footer" class="dialog-footer">-->
<!-- <el-button type="primary" @click="submitForm"> </el-button>-->
<!-- <el-button @click="cancel"> </el-button>-->
<!-- </div>-->
<!-- </el-dialog>-->
<!-- <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>-->
<!-- <el-form ref="form" :model="form" :rules="rules" label-width="80px">-->
<!--&lt;!&ndash; <el-form-item label="接收用户ID" prop="userId">&ndash;&gt;-->
<!--&lt;!&ndash; <el-input v-model="form.userId" placeholder="请输入接收用户ID" />&ndash;&gt;-->
<!--&lt;!&ndash; </el-form-item>&ndash;&gt;-->
<!-- <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>-->
<!--&lt;!&ndash; <el-form-item label="关联ID" prop="relatedId">&ndash;&gt;-->
<!--&lt;!&ndash; <el-input v-model="form.relatedId" placeholder="请输入关联ID" />&ndash;&gt;-->
<!--&lt;!&ndash; </el-form-item>&ndash;&gt;-->
<!-- <el-form-item label="是否已读 0:未读 1:已读" prop="isRead">-->
<!-- <el-input v-model="form.isRead" placeholder="请输入是否已读 0:未读 1:已读" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="提醒级别 1:一般通知 2:重要通知 3:紧急通知" prop="remindLevel">-->
<!-- <el-input v-model="form.remindLevel" placeholder="请输入提醒级别 1:一般通知 2:重要通知 3:紧急通知" />-->
<!-- </el-form-item>-->
<!--&lt;!&ndash; <el-form-item label="阅读时间" prop="readTime">&ndash;&gt;-->
<!--&lt;!&ndash; <el-date-picker clearable&ndash;&gt;-->
<!--&lt;!&ndash; v-model="form.readTime"&ndash;&gt;-->
<!--&lt;!&ndash; type="date"&ndash;&gt;-->
<!--&lt;!&ndash; value-format="yyyy-MM-dd"&ndash;&gt;-->
<!--&lt;!&ndash; placeholder="请选择阅读时间">&ndash;&gt;-->
<!--&lt;!&ndash; </el-date-picker>&ndash;&gt;-->
<!--&lt;!&ndash; </el-form-item>&ndash;&gt;-->
<!-- </el-form>-->
<!-- <div slot="footer" class="dialog-footer">-->
<!-- <el-button type="primary" @click="submitForm"> </el-button>-->
<!-- <el-button @click="cancel"> </el-button>-->
<!-- </div>-->
<!-- </el-dialog>-->
</div>
</template>
@ -377,7 +350,7 @@ export default {
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.single = selection.length !== 1
this.multiple = !selection.length
},
@ -439,12 +412,12 @@ export default {
//
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除兽医通知编号为"' + ids + '"的数据项?').then(function() {
this.$modal.confirm('是否确认删除兽医通知编号为"' + ids + '"的数据项?').then(function () {
return delNotification(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
}).catch(() => { })
},
//
@ -454,13 +427,15 @@ export default {
}, `notification_${new Date().getTime()}.xlsx`)
},
//
//
handleMarkRead(row) {
const id = row.id
const id = row.certId
if (!id) return
markRead(id).then(() => {
this.$modal.msgSuccess("标记已读成功")
this.getList()
this.$router.push({ path: 'syQualification', query: { id: id } })
markRead(row.id).then(res => {
if (res.code = 200) {
this.getList()
}
})
},
}
@ -489,9 +464,9 @@ export default {
right: 0;
height: 2px;
background: linear-gradient(90deg,
transparent 0%,
#e2e8f0 50%,
transparent 100%);
transparent 0%,
#e2e8f0 50%,
transparent 100%);
z-index: 1;
}
@ -592,9 +567,11 @@ export default {
&[style*="background-color: #f0f9f0"] {
background: linear-gradient(180deg, #f0f9f0 0%, #f8fdf8 100%);
}
&[style*="background-color: #fffbeb"] {
background: linear-gradient(180deg, #fffbeb 0%, #fffdf0 100%);
}
&[style*="background-color: #fff2f2"] {
background: linear-gradient(180deg, #fff2f2 0%, #fef2f2 100%);
}
@ -641,7 +618,7 @@ export default {
}
.read-btn:hover{
.read-btn:hover {
background-color: rgb(230, 255, 238);
transform: translateY(-1px);
}

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

@ -47,10 +47,12 @@
</template>
</el-table-column>
<el-table-column label="经营范围" align="center" prop="scopeIds" width="200">
<el-table-column label="经营范围" align="center" prop="scopeIds">
<template slot-scope="scope">
<dict-tag style="display: grid; grid-template-columns: 1fr 1fr; row-gap: 10px;" :options="dict.type.scope_names"
:value="scope.row.scopeIds" />
<div class="jyfw">
<dict-tag style="display: grid; grid-template-columns: 1fr 1fr; row-gap: 10px;"
:options="dict.type.scope_names" :value="scope.row.scopeIds" />
</div>
</template>
</el-table-column>
@ -68,13 +70,13 @@
</el-table-column>
<el-table-column label="审核状态" align="center" prop="auditStatus">
<template slot-scope="scope">
<el-tag :type="getAuditStatusType(scope.row.auditStatus)" size="small">
<el-tag size="small">
{{ getDictLabel('qualification_shenhe', scope.row.auditStatus) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" :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" prop="remark" :show-overflow-tooltip="true" /> -->
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<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>
@ -120,17 +122,17 @@
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">
<el-table-column prop="certificateNo" label="证书编号" align="center" :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">
<el-table-column prop="certName" label="证书名称" align="center" :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">
<el-table-column label="发证机构" align="center" prop="issueOrg" :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>
@ -156,29 +158,27 @@
<span v-else style="color: #909399">-</span>
</template>
</el-table-column>
<el-table-column prop="issueDate" label="发证日期" align="center" width="150">
<el-table-column prop="issueDate" label="发证日期" align="center">
<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">
<el-table-column prop="expireDate" label="到期日期" align="center">
<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">
<el-table-column label="证书状态" align="center" prop="certStatus">
<template slot-scope="scope">
<el-tag :type="getCertStatusType(scope.row.certStatus)" size="small">
{{ getCertStatusLabel(scope.row.certStatus) }}
<dict-tag :options="dict.type.certificate_status" :value="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">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<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>
<el-button 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>
@ -277,7 +277,7 @@ import { getUserInfo } from "@/api/system/user"
export default {
name: "Qualification",
dicts: ['qualification_shenhe', 'expert_type', 'qualification_type', 'scope_names'],
dicts: ['qualification_shenhe', 'expert_type', 'qualification_type', 'scope_names','certificate_status'],
data() {
return {
baseUrl: process.env.VUE_APP_BASE_API,
@ -388,7 +388,7 @@ export default {
if (res.code === 200) {
const userInfo = res.data
console.log(1111,userInfo);
console.log(1111, userInfo);
//
if (userInfo.authStatus === '已认证') {
@ -416,7 +416,7 @@ export default {
// ========== ==========
fillAuthInfoToForm() {
if (this.authInfo) {
console.log(4444,this.authInfo);
console.log(4444, this.authInfo);
// 使 Vue.set
this.$set(this.form, 'realName', this.authInfo.realName)
this.$set(this.form, 'idCard', this.authInfo.idCard)
@ -725,10 +725,10 @@ export default {
async handleUpdate(row) {
this.reset()
this.isAddMode = false //
// 使 row
this.form = row
console.log(111,this.form);
this.form = row
console.log(111, this.form);
//
if (!this.authInfoFetched) {
@ -774,6 +774,10 @@ export default {
min-width: 50px;
}
::v-deep .jyfw .el-tag:nth-child(1){
margin-left: 10px;
}
/* 状态标签样式 */
.el-tag {
margin: 2px;

703
chenhai-ui/src/views/vet/syQualification/index.vue

@ -0,0 +1,703 @@
<template>
<div class="app-container">
<!-- 搜索表单 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="80px">
<el-form-item label="证书编号" prop="certificateNo">
<el-input v-model="queryParams.certificateNo" placeholder="请输入证书编号" clearable
@keyup.enter.native="handleQuery" style="width: 180px" />
</el-form-item>
<el-form-item label="证书名称" prop="certName">
<el-input v-model="queryParams.certName" placeholder="请输入证书名称" clearable @keyup.enter.native="handleQuery"
style="width: 200px" />
</el-form-item>
<el-form-item label="发证机构" prop="issueOrg">
<el-input v-model="queryParams.issueOrg" placeholder="请输入发证机构" clearable @keyup.enter.native="handleQuery"
style="width: 200px" />
</el-form-item>
<el-form-item label="证书状态" prop="certStatus">
<el-select v-model="queryParams.certStatus" placeholder="请选择证书状态" clearable style="width: 120px">
<el-option v-for="dict in dict.type.certificate_status" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 资质基本信息卡片 - 反显当前选中的资质信息 -->
<el-card class="qualification-info-card" shadow="hover" v-if="currentQualification" style="margin-bottom: 20px;">
<div slot="header" class="clearfix">
<span><i class="el-icon-document"></i> 资质基本信息</span>
</div>
<el-row :gutter="20">
<el-col :span="6">
<div class="info-item">
<div class="info-label">真实姓名</div>
<div class="info-value">{{ currentQualification.realName || '-' }}</div>
</div>
</el-col>
<el-col :span="6">
<div class="info-item">
<div class="info-label">身份证号</div>
<div class="info-value">{{ currentQualification.idCard || '-' }}</div>
</div>
</el-col>
<el-col :span="6">
<div class="info-item">
<div class="info-label">资质类型</div>
<div class="info-value">
<el-tag size="small" type="success">{{ getDictLabel('qualification_type',
currentQualification.qualificationType) }}</el-tag>
</div>
</div>
</el-col>
<el-col :span="6">
<div class="info-item">
<div class="info-label">审核状态</div>
<div class="info-value">
<el-tag size="small">
{{ getDictLabel('qualification_shenhe', currentQualification.auditStatus) }}
</el-tag>
</div>
</div>
</el-col>
</el-row>
<el-row :gutter="20" style="margin-top: 12px;">
<el-col :span="24">
<div class="info-item">
<div class="info-label">经营范围</div>
<div class="info-value">
<template>
<el-tag v-for="scopeId in currentQualification.scopeIds" :key="scopeId" size="small"
type="info" style="margin-right: 8px; margin-bottom: 4px;">
{{ getDictLabel('scope_names', scopeId) }}
</el-tag>
</template>
</div>
</div>
</el-col>
</el-row>
</el-card>
<!-- 操作按钮 -->
<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:qualification:add']">新增</el-button>
</el-col>
</el-row>
<!-- 证书列表 -->
<el-alert v-if="!certificateList || certificateList.length === 0" title="暂无资质证书" type="info" :closable="false"
style="margin-bottom: 20px;" />
<el-table v-else v-loading="loading" :data="certificateList" border style="width: 100%">
<el-table-column type="selection" width="55" align="center" />
<el-table-column prop="certificateNo" label="证书编号" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="certName" label="证书名称" align="center" :show-overflow-tooltip="true" />
<el-table-column label="发证机构" align="center" prop="issueOrg" :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>
</span>
<span v-else style="color: #909399">-</span>
</template>
</el-table-column>
<el-table-column prop="issueDate" label="发证日期" align="center">
<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">
<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">
<template slot-scope="scope">
<dict-tag :options="dict.type.certificate_status" :value="scope.row.certStatus" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" style="color: #42B983"
@click="handleUpdate(scope.row)"
class="info-btn alter-btn">修改</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagestyle" v-if="total > 0">
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" @pagination="getCertificateList" />
</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;" />
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="previewDialogVisible = false"> </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="submitForm">{{ isAddMode ? '提交审核' : '重新提交审核' }}</el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
listQualification,
getQualificationCertificates,
getQualificationCertificatesDetail,
addqualification,
updateAndSubmitQualification
} from "@/api/vet/qualification"
import { getUserInfo } from "@/api/system/user"
export default {
name: "Qualification",
dicts: ['qualification_shenhe', 'qualification_type', 'scope_names', 'certificate_status'],
data() {
return {
baseUrl: process.env.VUE_APP_BASE_API,
previewFileUrl: '',
loading: false,
currentQualification: null, //
certificateList: [],
total: 0,
title: "",
open: false,
previewDialogVisible: false,
showSearch: true,
//
authInfo: null,
realNameReadOnly: false,
idCardReadOnly: false,
authInfoFetched: false,
isAddMode: true,
queryParams: {
pageNum: 1,
pageSize: 10,
certificateNo: null,
certName: null,
issueOrg: null,
certStatus: null
},
form: {},
rules: {
certificateNo: [
{ required: true, message: "证书编号不能为空", trigger: "blur" }
],
certName: [
{ required: true, message: "证书名称不能为空", trigger: "blur" }
],
issueOrg: [
{ required: true, message: "发证机构不能为空", trigger: "blur" }
],
issueDate: [
{ required: true, message: "发证日期不能为空", trigger: "change" }
],
expireDate: [
{ required: true, message: "到期日期不能为空", trigger: "change" }
],
certificateFiles: [
{ required: true, message: "证书文件不能为空", trigger: "blur" }
]
}
}
},
created() {
this.getList()
this.getCertificateList()
this.getUserAuthInfo()
const codeId = this.$route.query.id
if(codeId){
this.handleUpdate(codeId)
}
},
watch: {
open(val) {
if (val) {
this.$nextTick(() => {
this.fillAuthInfoToForm()
})
}
}
},
methods: {
//
async getUserAuthInfo() {
if (this.authInfoFetched) return
try {
const res = await getUserInfo()
if (res.code === 200) {
const userInfo = res.data
if (userInfo.authStatus === '已认证') {
this.authInfo = userInfo
this.realNameReadOnly = true
this.idCardReadOnly = true
this.authInfoFetched = true
if (this.open) {
this.fillAuthInfoToForm()
}
} else if (userInfo.authStatus === '未认证') {
this.authInfoFetched = true
}
}
} catch (error) {
console.error('获取用户实名信息失败:', error)
}
},
//
fillAuthInfoToForm() {
if (this.authInfo) {
this.$set(this.form, 'realName', this.authInfo.realName)
this.$set(this.form, 'idCard', this.authInfo.idCard)
}
},
//
getList() {
this.loading = true
listQualification().then(response => {
if (response.code === 200 && response.rows && response.rows.length > 0) {
//
this.currentQualification = response.rows[0]
this.total = response.total
} else {
this.loading = false
this.currentQualification = null
this.certificateList = []
this.total = 0
}
}).catch(() => {
this.loading = false
})
},
//
getCertificateList() {
this.loading = true
getQualificationCertificates(this.queryParams).then(response => {
if (response.code === 200) {
this.certificateList = response.rows || []
} else {
this.certificateList = []
}
this.loading = false
}).catch(() => {
this.certificateList = []
this.loading = false
})
},
//
getDictLabel(dictType, value) {
const dict = this.dict.type[dictType]
if (dict && value) {
const item = dict.find(item => item.value === value)
return item ? item.label : value
}
return value || '-'
},
// URL
getImageUrl(filePath) {
return `${this.baseUrl}${filePath}`
},
//
isImageFile(filePath) {
if (!filePath) return false;
const imageExts = ['.png', '.jpg', '.jpeg'];
const ext = filePath.substring(filePath.lastIndexOf('.')).toLowerCase();
return imageExts.includes(ext);
},
// PDF
isPdfFile(filePath) {
if (!filePath) return false;
const ext = filePath.substring(filePath.lastIndexOf('.')).toLowerCase();
return ext === '.pdf';
},
//
previewCertificate(filePath) {
this.previewFileUrl = filePath;
this.previewDialogVisible = true;
},
//
downloadFile(filePath) {
const fullUrl = this.getImageUrl(filePath);
const link = document.createElement('a');
link.href = fullUrl;
const fileName = filePath.substring(filePath.lastIndexOf('/') + 1);
link.download = fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
this.$modal.msgSuccess('开始下载文件');
},
//
submitForm() {
if (this.isAddMode) {
this.handleAddSubmit()
} else {
this.handleResubmit()
}
},
//
handleAddSubmit() {
this.$refs["form"].validate(valid => {
if (valid) {
const submitData = {
realName: this.form.realName || (this.authInfo ? this.authInfo.realName : null),
idCard: this.form.idCard || (this.authInfo ? this.authInfo.idCard : null),
certificateNo: this.form.certificateNo,
certName: this.form.certName,
issueOrg: this.form.issueOrg,
issueDate: this.form.issueDate,
expireDate: this.form.expireDate,
certificateFiles: this.form.certificateFiles,
auditStatus: '0'
}
addqualification(submitData).then(response => {
if (response.code === 200) {
this.$modal.msgSuccess("提交审核成功")
this.open = false
this.getCertificateList()
this.reset()
} else {
this.$modal.msgError(response.msg || "提交审核失败")
}
}).catch(error => {
console.error('提交审核失败:', error)
this.$modal.msgError("提交审核失败,请稍后重试")
})
}
})
},
//
handleResubmit() {
this.$refs["form"].validate(valid => {
if (valid) {
const submitData = {
certId: this.form.certId,
qualificationId: this.currentQualification ? this.currentQualification.qualificationId : null,
realName: this.form.realName || (this.authInfo ? this.authInfo.realName : null),
idCard: this.form.idCard || (this.authInfo ? this.authInfo.idCard : null),
certificateNo: this.form.certificateNo,
certName: this.form.certName,
issueOrg: this.form.issueOrg,
issueDate: this.form.issueDate,
expireDate: this.form.expireDate,
certificateFiles: this.form.certificateFiles,
auditStatus: '0'
}
updateAndSubmitQualification(submitData).then(response => {
if (response.code === 200) {
this.$modal.msgSuccess("重新提交审核成功")
this.open = false
this.getCertificateList()
this.reset()
} else {
this.$modal.msgError(response.msg || "重新提交审核失败")
}
})
}
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.isAddMode = true
this.title = "添加资质信息"
if (!this.authInfoFetched) {
this.getUserAuthInfo()
}
this.fillAuthInfoToForm()
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
this.isAddMode = false
const id = row.certId || row
getQualificationCertificatesDetail(id).then(res => {
this.form = res.data
})
if (!this.authInfoFetched) {
this.getUserAuthInfo()
}
this.fillAuthInfoToForm()
this.open = true
this.title = "修改资质证书信息"
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
certificateNo: null,
certName: null,
issueOrg: null,
issueDate: null,
expireDate: null,
certificateFiles: null,
certId: null
}
this.resetForm("form")
if (this.authInfo) {
this.$nextTick(() => {
this.fillAuthInfoToForm()
})
}
},
//
handleQuery() {
this.queryParams.pageNum = 1
this.getCertificateList()
},
//
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
}
}
}
</script>
<style scoped>
/* 资质信息卡片样式 */
.qualification-info-card {
border-radius: 8px;
margin-bottom: 20px;
border-left: 4px solid #42B983;
}
.qualification-info-card ::v-deep .el-card__header {
background-color: #f8fafc;
border-bottom: 1px solid #eef2f7;
padding: 12px 20px;
font-weight: 600;
color: #2c7a4d;
}
.info-item {
display: flex;
align-items: baseline;
line-height: 32px;
}
.info-label {
min-width: 80px;
color: #909399;
font-size: 14px;
}
.info-value {
color: #303133;
font-size: 14px;
font-weight: 500;
flex: 1;
}
/* 操作按钮样式 */
.el-button--text {
padding: 6px 10px;
margin: 0 2px;
min-width: 50px;
}
/* 状态标签样式 */
.el-tag {
margin: 2px;
}
.pagestyle .el-input {
width: auto !important;
}
/* 操作按钮 */
.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);
}
/* 弹窗样式 */
::v-deep .el-dialog {
border-radius: 12px;
overflow: hidden;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.12);
}
::v-deep .el-dialog__header {
background: linear-gradient(135deg, #2c7a4d 0%, #42b983 100%);
padding: 18px 24px;
border-bottom: none;
}
::v-deep .el-dialog__title {
font-size: 17px;
font-weight: 600;
color: white;
}
::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;
}
::v-deep .el-form-item__label {
font-weight: 500;
color: #2d3748;
font-size: 14px;
}
::v-deep .el-input__inner,
::v-deep .el-textarea__inner {
border-radius: 8px;
border: 1px solid #dcdfe6;
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-dialog__footer {
padding: 20px 24px;
background-color: #f8fafc;
border-top: 1px solid #eef2f7;
border-radius: 0 0 12px 12px;
}
.mb8 {
margin-bottom: 8px;
}
</style>
Loading…
Cancel
Save